@nextsparkjs/core 0.1.0-beta.194 → 0.1.0-beta.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (481) hide show
  1. package/dist/components/app/guards/DeveloperGuard.d.ts +8 -1
  2. package/dist/components/app/guards/DeveloperGuard.d.ts.map +1 -1
  3. package/dist/components/app/guards/DeveloperGuard.js +2 -1
  4. package/dist/components/app/guards/SuperAdminGuard.d.ts +8 -1
  5. package/dist/components/app/guards/SuperAdminGuard.d.ts.map +1 -1
  6. package/dist/components/app/guards/SuperAdminGuard.js +2 -1
  7. package/dist/components/billing/InvoicesPagination.js +2 -2
  8. package/dist/components/dashboard/block-editor/block-picker.d.ts.map +1 -1
  9. package/dist/components/dashboard/block-editor/block-picker.js +2 -1
  10. package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
  11. package/dist/components/dashboard/block-editor/builder-editor-view.js +39 -23
  12. package/dist/components/dashboard/block-editor/pattern-reference-preview.d.ts.map +1 -1
  13. package/dist/components/dashboard/block-editor/pattern-reference-preview.js +2 -1
  14. package/dist/components/dashboard/layouts/AuthGuard.d.ts.map +1 -1
  15. package/dist/components/dashboard/layouts/AuthGuard.js +3 -4
  16. package/dist/components/dashboard/layouts/AuthenticatedDashboardLayout.d.ts.map +1 -1
  17. package/dist/components/dashboard/layouts/AuthenticatedDashboardLayout.js +9 -10
  18. package/dist/components/dashboard/layouts/DashboardAuthLayout.d.ts.map +1 -1
  19. package/dist/components/dashboard/layouts/DashboardAuthLayout.js +3 -4
  20. package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts +2 -2
  21. package/dist/components/dashboard/navigation/DynamicNavigation.js +2 -2
  22. package/dist/components/entities/wrappers/EntityDetailWrapper.d.ts.map +1 -1
  23. package/dist/components/entities/wrappers/EntityDetailWrapper.js +5 -2
  24. package/dist/components/entities/wrappers/EntityFormWrapper.d.ts.map +1 -1
  25. package/dist/components/entities/wrappers/EntityFormWrapper.js +5 -2
  26. package/dist/components/entities/wrappers/EntityListWrapper.d.ts.map +1 -1
  27. package/dist/components/entities/wrappers/EntityListWrapper.js +5 -2
  28. package/dist/components/settings/layouts/SettingsSidebar.d.ts.map +1 -1
  29. package/dist/components/settings/layouts/SettingsSidebar.js +0 -1
  30. package/dist/components/teams/CreateTeamButton.js +2 -2
  31. package/dist/components/teams/CreateTeamDialog.js +1 -1
  32. package/dist/components/teams/InviteMemberButton.js +3 -3
  33. package/dist/components/teams/InviteMemberDialog.js +1 -1
  34. package/dist/components/teams/TeamPendingInvitations.js +2 -2
  35. package/dist/components/ui/relation-display.d.ts.map +1 -1
  36. package/dist/components/ui/relation-display.js +2 -1
  37. package/dist/components/ui/user-display.d.ts.map +1 -1
  38. package/dist/components/ui/user-display.js +2 -1
  39. package/dist/emails/otp-verification.d.ts.map +1 -1
  40. package/dist/emails/otp-verification.js +5 -3
  41. package/dist/emails/reset-password.d.ts.map +1 -1
  42. package/dist/emails/reset-password.js +5 -3
  43. package/dist/emails/team-invitation.d.ts.map +1 -1
  44. package/dist/emails/team-invitation.js +3 -2
  45. package/dist/emails/verify-email.d.ts.map +1 -1
  46. package/dist/emails/verify-email.js +5 -3
  47. package/dist/hooks/useAuth.d.ts.map +1 -1
  48. package/dist/hooks/useAuth.js +21 -4
  49. package/dist/hooks/usePatternUsages.d.ts.map +1 -1
  50. package/dist/hooks/usePatternUsages.js +3 -2
  51. package/dist/lib/api/api-error.d.ts +2 -0
  52. package/dist/lib/api/api-error.d.ts.map +1 -1
  53. package/dist/lib/api/api-error.js +3 -1
  54. package/dist/lib/api/auth/dual-auth.d.ts +2 -1
  55. package/dist/lib/api/auth/dual-auth.d.ts.map +1 -1
  56. package/dist/lib/api/auth/dual-auth.js +22 -4
  57. package/dist/lib/api/auth/scope-policy.d.ts +6 -3
  58. package/dist/lib/api/auth/scope-policy.d.ts.map +1 -1
  59. package/dist/lib/api/auth.d.ts +2 -0
  60. package/dist/lib/api/auth.d.ts.map +1 -1
  61. package/dist/lib/api/auth.js +10 -10
  62. package/dist/lib/api/client-headers.d.ts +11 -0
  63. package/dist/lib/api/client-headers.d.ts.map +1 -0
  64. package/dist/lib/api/client-headers.js +12 -0
  65. package/dist/lib/api/client-ip.d.ts +59 -0
  66. package/dist/lib/api/client-ip.d.ts.map +1 -0
  67. package/dist/lib/api/client-ip.js +91 -0
  68. package/dist/lib/api/cors-response.d.ts +55 -0
  69. package/dist/lib/api/cors-response.d.ts.map +1 -0
  70. package/dist/lib/api/cors-response.js +90 -0
  71. package/dist/lib/api/entities.d.ts.map +1 -1
  72. package/dist/lib/api/entities.js +4 -3
  73. package/dist/lib/api/entity/audit-log.d.ts.map +1 -1
  74. package/dist/lib/api/entity/audit-log.js +2 -1
  75. package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
  76. package/dist/lib/api/entity/generic-handler.js +23 -8
  77. package/dist/lib/api/helpers.d.ts +8 -2
  78. package/dist/lib/api/helpers.d.ts.map +1 -1
  79. package/dist/lib/api/helpers.js +32 -103
  80. package/dist/lib/api/keys.d.ts +6 -0
  81. package/dist/lib/api/keys.d.ts.map +1 -1
  82. package/dist/lib/api/keys.js +7 -1
  83. package/dist/lib/api/permission-middleware.d.ts.map +1 -1
  84. package/dist/lib/api/permission-middleware.js +0 -2
  85. package/dist/lib/api/rate-limit.d.ts +12 -0
  86. package/dist/lib/api/rate-limit.d.ts.map +1 -1
  87. package/dist/lib/api/rate-limit.js +50 -43
  88. package/dist/lib/api/request-origin.d.ts +16 -7
  89. package/dist/lib/api/request-origin.d.ts.map +1 -1
  90. package/dist/lib/api/request-origin.js +43 -20
  91. package/dist/lib/auth/load-login-page.d.ts +10 -0
  92. package/dist/lib/auth/load-login-page.d.ts.map +1 -0
  93. package/dist/lib/auth/load-login-page.js +7 -0
  94. package/dist/lib/auth/runtime-readiness.d.ts.map +1 -1
  95. package/dist/lib/auth/runtime-readiness.js +4 -0
  96. package/dist/lib/auth/sample-accounts.d.ts +17 -0
  97. package/dist/lib/auth/sample-accounts.d.ts.map +1 -0
  98. package/dist/lib/auth/sample-accounts.js +22 -0
  99. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts +1 -8
  100. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts.map +1 -1
  101. package/dist/lib/auth/security-notifications/device-fingerprint.js +2 -12
  102. package/dist/lib/auth-email-callbacks.js +3 -3
  103. package/dist/lib/auth.d.ts.map +1 -1
  104. package/dist/lib/auth.js +13 -5
  105. package/dist/lib/cache/public-entity-cache.d.ts +21 -0
  106. package/dist/lib/cache/public-entity-cache.d.ts.map +1 -0
  107. package/dist/lib/cache/public-entity-cache.js +25 -0
  108. package/dist/lib/config/config-client.d.ts.map +1 -1
  109. package/dist/lib/config/config-client.js +1 -1
  110. package/dist/lib/config/config-sync.d.ts.map +1 -1
  111. package/dist/lib/config/config-sync.js +1 -1
  112. package/dist/lib/config/public-config-client.d.ts +1 -0
  113. package/dist/lib/config/public-config-client.d.ts.map +1 -1
  114. package/dist/lib/config/public-config-client.js +3 -1
  115. package/dist/lib/config/types.d.ts +2 -0
  116. package/dist/lib/config/types.d.ts.map +1 -1
  117. package/dist/lib/constants/reserved-slugs.d.ts +17 -8
  118. package/dist/lib/constants/reserved-slugs.d.ts.map +1 -1
  119. package/dist/lib/constants/reserved-slugs.js +16 -52
  120. package/dist/lib/db.d.ts.map +1 -1
  121. package/dist/lib/db.js +9 -3
  122. package/dist/lib/entities/entity-hooks.d.ts.map +1 -1
  123. package/dist/lib/entities/entity-hooks.js +4 -0
  124. package/dist/lib/entities/external-api-generator.d.ts.map +1 -1
  125. package/dist/lib/entities/external-api-generator.js +2 -4
  126. package/dist/lib/entities/public-slug.d.ts +46 -0
  127. package/dist/lib/entities/public-slug.d.ts.map +1 -0
  128. package/dist/lib/entities/public-slug.js +39 -0
  129. package/dist/lib/mcp/errors.d.ts +2 -0
  130. package/dist/lib/mcp/errors.d.ts.map +1 -1
  131. package/dist/lib/mcp/errors.js +3 -1
  132. package/dist/lib/mcp/index.d.ts +1 -1
  133. package/dist/lib/mcp/index.d.ts.map +1 -1
  134. package/dist/lib/mcp/index.js +2 -1
  135. package/dist/lib/services/generic-entity.service.d.ts.map +1 -1
  136. package/dist/lib/services/generic-entity.service.js +2 -0
  137. package/dist/lib/teams/actions.d.ts.map +1 -1
  138. package/dist/lib/teams/actions.js +0 -1
  139. package/dist/messages/de/billing.json +12 -1
  140. package/dist/messages/de/common.json +2 -0
  141. package/dist/messages/de/docs.json +1 -0
  142. package/dist/messages/de/features.json +16 -4
  143. package/dist/messages/de/home.json +5 -0
  144. package/dist/messages/de/index.d.ts +68 -25
  145. package/dist/messages/de/index.d.ts.map +1 -1
  146. package/dist/messages/de/index.js +2 -0
  147. package/dist/messages/de/index.ts +2 -0
  148. package/dist/messages/de/settings.json +1 -0
  149. package/dist/messages/de/teams.json +3 -18
  150. package/dist/messages/en/billing.json +1 -1
  151. package/dist/messages/en/common.json +2 -0
  152. package/dist/messages/en/docs.json +1 -0
  153. package/dist/messages/en/features.json +16 -4
  154. package/dist/messages/en/home.json +5 -0
  155. package/dist/messages/en/index.d.ts +58 -25
  156. package/dist/messages/en/index.d.ts.map +1 -1
  157. package/dist/messages/en/index.js +2 -0
  158. package/dist/messages/en/index.ts +2 -0
  159. package/dist/messages/en/settings.json +1 -0
  160. package/dist/messages/en/teams.json +3 -18
  161. package/dist/messages/es/billing.json +1 -1
  162. package/dist/messages/es/common.json +2 -0
  163. package/dist/messages/es/docs.json +1 -0
  164. package/dist/messages/es/features.json +16 -4
  165. package/dist/messages/es/home.json +5 -0
  166. package/dist/messages/es/index.d.ts +41 -8
  167. package/dist/messages/es/index.d.ts.map +1 -1
  168. package/dist/messages/es/index.js +2 -0
  169. package/dist/messages/es/index.ts +2 -0
  170. package/dist/messages/es/settings.json +1 -0
  171. package/dist/messages/es/teams.json +3 -0
  172. package/dist/messages/fr/billing.json +12 -1
  173. package/dist/messages/fr/common.json +2 -0
  174. package/dist/messages/fr/docs.json +1 -0
  175. package/dist/messages/fr/features.json +16 -4
  176. package/dist/messages/fr/home.json +5 -0
  177. package/dist/messages/fr/index.d.ts +68 -25
  178. package/dist/messages/fr/index.d.ts.map +1 -1
  179. package/dist/messages/fr/index.js +2 -0
  180. package/dist/messages/fr/index.ts +2 -0
  181. package/dist/messages/fr/settings.json +1 -0
  182. package/dist/messages/fr/teams.json +3 -18
  183. package/dist/messages/it/billing.json +12 -1
  184. package/dist/messages/it/common.json +2 -0
  185. package/dist/messages/it/docs.json +1 -0
  186. package/dist/messages/it/features.json +16 -4
  187. package/dist/messages/it/home.json +5 -0
  188. package/dist/messages/it/index.d.ts +68 -25
  189. package/dist/messages/it/index.d.ts.map +1 -1
  190. package/dist/messages/it/index.js +2 -0
  191. package/dist/messages/it/index.ts +2 -0
  192. package/dist/messages/it/settings.json +1 -0
  193. package/dist/messages/it/teams.json +3 -18
  194. package/dist/messages/pt/billing.json +12 -1
  195. package/dist/messages/pt/common.json +2 -0
  196. package/dist/messages/pt/docs.json +1 -0
  197. package/dist/messages/pt/features.json +16 -4
  198. package/dist/messages/pt/home.json +5 -0
  199. package/dist/messages/pt/index.d.ts +68 -25
  200. package/dist/messages/pt/index.d.ts.map +1 -1
  201. package/dist/messages/pt/index.js +2 -0
  202. package/dist/messages/pt/index.ts +2 -0
  203. package/dist/messages/pt/settings.json +1 -0
  204. package/dist/messages/pt/teams.json +3 -18
  205. package/dist/migrations/029_sample_accounts_outside_development.sql +55 -0
  206. package/dist/migrations/090_sample_data.sql +10 -0
  207. package/dist/routes/(auth)/signup/page.cc.d.ts +3 -8
  208. package/dist/routes/(auth)/signup/page.cc.d.ts.map +1 -1
  209. package/dist/routes/(auth)/signup/page.cc.js +7 -1
  210. package/dist/routes/(auth)/verify-email/page.d.ts.map +1 -1
  211. package/dist/routes/(auth)/verify-email/page.js +2 -1
  212. package/dist/routes/(public)/page.cc.d.ts +3 -0
  213. package/dist/routes/(public)/page.cc.d.ts.map +1 -0
  214. package/dist/routes/(public)/page.cc.js +3 -0
  215. package/dist/routes/_internal/area-access.cc.d.ts +21 -0
  216. package/dist/routes/_internal/area-access.cc.d.ts.map +1 -0
  217. package/dist/routes/_internal/area-access.cc.js +19 -0
  218. package/dist/routes/_internal/auth-layout.d.ts.map +1 -1
  219. package/dist/routes/_internal/auth-layout.js +3 -2
  220. package/dist/routes/_internal/dashboard-main-shared.d.ts +7 -0
  221. package/dist/routes/_internal/dashboard-main-shared.d.ts.map +1 -0
  222. package/dist/routes/_internal/dashboard-main-shared.js +49 -0
  223. package/dist/routes/_internal/default-auth-layout.d.ts.map +1 -1
  224. package/dist/routes/_internal/default-auth-layout.js +3 -2
  225. package/dist/routes/_internal/devtools-layout.cc.d.ts +3 -2
  226. package/dist/routes/_internal/devtools-layout.cc.d.ts.map +1 -1
  227. package/dist/routes/_internal/devtools-layout.cc.js +1 -1
  228. package/dist/routes/_internal/devtools-layout.d.ts +7 -2
  229. package/dist/routes/_internal/devtools-layout.d.ts.map +1 -1
  230. package/dist/routes/_internal/devtools-layout.js +4 -4
  231. package/dist/routes/_internal/entity-detail-route.cc.d.ts +8 -0
  232. package/dist/routes/_internal/entity-detail-route.cc.d.ts.map +1 -0
  233. package/dist/routes/_internal/entity-detail-route.cc.js +5 -0
  234. package/dist/routes/_internal/entity-edit-route.cc.d.ts +8 -0
  235. package/dist/routes/_internal/entity-edit-route.cc.d.ts.map +1 -0
  236. package/dist/routes/_internal/entity-edit-route.cc.js +5 -0
  237. package/dist/routes/_internal/entity-permission-layout.d.ts.map +1 -1
  238. package/dist/routes/_internal/entity-permission-layout.js +0 -7
  239. package/dist/routes/_internal/public-archive-route.d.ts +1 -1
  240. package/dist/routes/_internal/public-archive-route.d.ts.map +1 -1
  241. package/dist/routes/_internal/public-archive-route.js +8 -3
  242. package/dist/routes/_internal/public-item-route.cc.d.ts +5 -1
  243. package/dist/routes/_internal/public-item-route.cc.d.ts.map +1 -1
  244. package/dist/routes/_internal/public-item-route.cc.js +2 -1
  245. package/dist/routes/_internal/public-item-route.d.ts +7 -0
  246. package/dist/routes/_internal/public-item-route.d.ts.map +1 -1
  247. package/dist/routes/_internal/public-item-route.js +6 -1
  248. package/dist/routes/_internal/superadmin-layout.cc.d.ts +2 -1
  249. package/dist/routes/_internal/superadmin-layout.cc.d.ts.map +1 -1
  250. package/dist/routes/_internal/superadmin-layout.cc.js +1 -1
  251. package/dist/routes/_internal/superadmin-layout.d.ts +7 -2
  252. package/dist/routes/_internal/superadmin-layout.d.ts.map +1 -1
  253. package/dist/routes/_internal/superadmin-layout.js +6 -6
  254. package/dist/routes/_internal/suspended-route.d.ts +16 -0
  255. package/dist/routes/_internal/suspended-route.d.ts.map +1 -0
  256. package/dist/routes/_internal/suspended-route.js +7 -0
  257. package/dist/routes/api/auth/[...all]/route.d.ts.map +1 -1
  258. package/dist/routes/api/auth/[...all]/route.js +4 -12
  259. package/dist/routes/api/csp-report/route.d.ts.map +1 -1
  260. package/dist/routes/api/csp-report/route.js +2 -13
  261. package/dist/routes/api/devtools/config/entities/route.d.ts +2 -0
  262. package/dist/routes/api/devtools/config/entities/route.d.ts.map +1 -1
  263. package/dist/routes/api/devtools/config/entities/route.js +2 -0
  264. package/dist/routes/api/devtools/config/theme/route.d.ts +2 -0
  265. package/dist/routes/api/devtools/config/theme/route.d.ts.map +1 -1
  266. package/dist/routes/api/devtools/config/theme/route.js +2 -0
  267. package/dist/routes/api/devtools/tests/[...path]/route.d.ts +2 -0
  268. package/dist/routes/api/devtools/tests/[...path]/route.d.ts.map +1 -1
  269. package/dist/routes/api/devtools/tests/[...path]/route.js +2 -0
  270. package/dist/routes/api/devtools/tests/route.d.ts +2 -0
  271. package/dist/routes/api/devtools/tests/route.d.ts.map +1 -1
  272. package/dist/routes/api/devtools/tests/route.js +2 -0
  273. package/dist/routes/api/health/route.d.ts +2 -0
  274. package/dist/routes/api/health/route.d.ts.map +1 -1
  275. package/dist/routes/api/health/route.js +2 -0
  276. package/dist/routes/api/internal/user-metadata/route.d.ts +2 -0
  277. package/dist/routes/api/internal/user-metadata/route.d.ts.map +1 -1
  278. package/dist/routes/api/internal/user-metadata/route.js +2 -0
  279. package/dist/routes/api/mcp/route.d.ts +2 -0
  280. package/dist/routes/api/mcp/route.d.ts.map +1 -1
  281. package/dist/routes/api/mcp/route.js +9 -1
  282. package/dist/routes/api/superadmin/subscriptions/route.d.ts +2 -0
  283. package/dist/routes/api/superadmin/subscriptions/route.d.ts.map +1 -1
  284. package/dist/routes/api/superadmin/subscriptions/route.js +2 -0
  285. package/dist/routes/api/superadmin/teams/[teamId]/route.d.ts +2 -0
  286. package/dist/routes/api/superadmin/teams/[teamId]/route.d.ts.map +1 -1
  287. package/dist/routes/api/superadmin/teams/[teamId]/route.js +2 -0
  288. package/dist/routes/api/superadmin/teams/route.d.ts +2 -0
  289. package/dist/routes/api/superadmin/teams/route.d.ts.map +1 -1
  290. package/dist/routes/api/superadmin/teams/route.js +2 -0
  291. package/dist/routes/api/superadmin/users/[userId]/route.d.ts +2 -0
  292. package/dist/routes/api/superadmin/users/[userId]/route.d.ts.map +1 -1
  293. package/dist/routes/api/superadmin/users/[userId]/route.js +2 -0
  294. package/dist/routes/api/superadmin/users/route.d.ts +2 -0
  295. package/dist/routes/api/superadmin/users/route.d.ts.map +1 -1
  296. package/dist/routes/api/superadmin/users/route.js +2 -0
  297. package/dist/routes/api/user/delete-account/route.d.ts +2 -0
  298. package/dist/routes/api/user/delete-account/route.d.ts.map +1 -1
  299. package/dist/routes/api/user/delete-account/route.js +2 -0
  300. package/dist/routes/api/user/plan-flags/route.d.ts +2 -0
  301. package/dist/routes/api/user/plan-flags/route.d.ts.map +1 -1
  302. package/dist/routes/api/user/plan-flags/route.js +2 -0
  303. package/dist/routes/api/user/profile/route.d.ts +2 -0
  304. package/dist/routes/api/user/profile/route.d.ts.map +1 -1
  305. package/dist/routes/api/user/profile/route.js +4 -3
  306. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.d.ts +2 -0
  307. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.d.ts.map +1 -1
  308. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.js +2 -0
  309. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.d.ts +2 -0
  310. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.d.ts.map +1 -1
  311. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.js +2 -0
  312. package/dist/routes/api/v1/billing/cancel/route.d.ts +2 -0
  313. package/dist/routes/api/v1/billing/cancel/route.d.ts.map +1 -1
  314. package/dist/routes/api/v1/billing/cancel/route.js +2 -0
  315. package/dist/routes/api/v1/billing/change-plan/route.d.ts +2 -0
  316. package/dist/routes/api/v1/billing/change-plan/route.d.ts.map +1 -1
  317. package/dist/routes/api/v1/billing/change-plan/route.js +2 -0
  318. package/dist/routes/api/v1/billing/check-action/route.d.ts +2 -0
  319. package/dist/routes/api/v1/billing/check-action/route.d.ts.map +1 -1
  320. package/dist/routes/api/v1/billing/check-action/route.js +2 -0
  321. package/dist/routes/api/v1/billing/checkout/route.d.ts +2 -0
  322. package/dist/routes/api/v1/billing/checkout/route.d.ts.map +1 -1
  323. package/dist/routes/api/v1/billing/checkout/route.js +2 -0
  324. package/dist/routes/api/v1/billing/plans/route.d.ts +2 -0
  325. package/dist/routes/api/v1/billing/plans/route.d.ts.map +1 -1
  326. package/dist/routes/api/v1/billing/plans/route.js +2 -0
  327. package/dist/routes/api/v1/billing/portal/route.d.ts +2 -0
  328. package/dist/routes/api/v1/billing/portal/route.d.ts.map +1 -1
  329. package/dist/routes/api/v1/billing/portal/route.js +2 -0
  330. package/dist/routes/api/v1/blocks/[slug]/route.d.ts +2 -0
  331. package/dist/routes/api/v1/blocks/[slug]/route.d.ts.map +1 -1
  332. package/dist/routes/api/v1/blocks/[slug]/route.js +2 -0
  333. package/dist/routes/api/v1/blocks/route.d.ts +2 -0
  334. package/dist/routes/api/v1/blocks/route.d.ts.map +1 -1
  335. package/dist/routes/api/v1/blocks/route.js +2 -0
  336. package/dist/routes/api/v1/blocks/validate/route.d.ts +2 -0
  337. package/dist/routes/api/v1/blocks/validate/route.d.ts.map +1 -1
  338. package/dist/routes/api/v1/blocks/validate/route.js +2 -0
  339. package/dist/routes/api/v1/devtools/blocks/route.d.ts +2 -1
  340. package/dist/routes/api/v1/devtools/blocks/route.d.ts.map +1 -1
  341. package/dist/routes/api/v1/devtools/blocks/route.js +2 -9
  342. package/dist/routes/api/v1/devtools/docs/route.d.ts +2 -0
  343. package/dist/routes/api/v1/devtools/docs/route.d.ts.map +1 -1
  344. package/dist/routes/api/v1/devtools/docs/route.js +2 -0
  345. package/dist/routes/api/v1/devtools/features/route.d.ts +2 -1
  346. package/dist/routes/api/v1/devtools/features/route.d.ts.map +1 -1
  347. package/dist/routes/api/v1/devtools/features/route.js +2 -9
  348. package/dist/routes/api/v1/devtools/flows/route.d.ts +2 -1
  349. package/dist/routes/api/v1/devtools/flows/route.d.ts.map +1 -1
  350. package/dist/routes/api/v1/devtools/flows/route.js +2 -9
  351. package/dist/routes/api/v1/devtools/scheduled-actions/route.d.ts +2 -1
  352. package/dist/routes/api/v1/devtools/scheduled-actions/route.d.ts.map +1 -1
  353. package/dist/routes/api/v1/devtools/scheduled-actions/route.js +2 -9
  354. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.d.ts +2 -1
  355. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.d.ts.map +1 -1
  356. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.js +2 -9
  357. package/dist/routes/api/v1/devtools/testing/route.d.ts +2 -1
  358. package/dist/routes/api/v1/devtools/testing/route.d.ts.map +1 -1
  359. package/dist/routes/api/v1/devtools/testing/route.js +2 -9
  360. package/dist/routes/api/v1/media/[id]/route.d.ts +2 -0
  361. package/dist/routes/api/v1/media/[id]/route.d.ts.map +1 -1
  362. package/dist/routes/api/v1/media/[id]/route.js +2 -0
  363. package/dist/routes/api/v1/media/[id]/tags/route.d.ts +2 -0
  364. package/dist/routes/api/v1/media/[id]/tags/route.d.ts.map +1 -1
  365. package/dist/routes/api/v1/media/[id]/tags/route.js +2 -0
  366. package/dist/routes/api/v1/media/check-duplicates/route.d.ts +2 -0
  367. package/dist/routes/api/v1/media/check-duplicates/route.d.ts.map +1 -1
  368. package/dist/routes/api/v1/media/check-duplicates/route.js +2 -0
  369. package/dist/routes/api/v1/media/route.d.ts +2 -0
  370. package/dist/routes/api/v1/media/route.d.ts.map +1 -1
  371. package/dist/routes/api/v1/media/route.js +2 -0
  372. package/dist/routes/api/v1/media/upload/route.d.ts +4 -1
  373. package/dist/routes/api/v1/media/upload/route.d.ts.map +1 -1
  374. package/dist/routes/api/v1/media/upload/route.js +12 -2
  375. package/dist/routes/api/v1/media-tags/route.d.ts +2 -0
  376. package/dist/routes/api/v1/media-tags/route.d.ts.map +1 -1
  377. package/dist/routes/api/v1/media-tags/route.js +2 -0
  378. package/dist/routes/api/v1/post-categories/[id]/route.d.ts +2 -0
  379. package/dist/routes/api/v1/post-categories/[id]/route.d.ts.map +1 -1
  380. package/dist/routes/api/v1/post-categories/[id]/route.js +2 -0
  381. package/dist/routes/api/v1/post-categories/route.d.ts +2 -0
  382. package/dist/routes/api/v1/post-categories/route.d.ts.map +1 -1
  383. package/dist/routes/api/v1/post-categories/route.js +2 -0
  384. package/dist/routes/api/v1/teams/[teamId]/members/route.d.ts.map +1 -1
  385. package/dist/routes/api/v1/teams/[teamId]/members/route.js +14 -12
  386. package/dist/routes/api/v1/teams/[teamId]/subscription/route.d.ts +2 -0
  387. package/dist/routes/api/v1/teams/[teamId]/subscription/route.d.ts.map +1 -1
  388. package/dist/routes/api/v1/teams/[teamId]/subscription/route.js +2 -0
  389. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.d.ts +2 -0
  390. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.d.ts.map +1 -1
  391. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.js +2 -0
  392. package/dist/routes/api/v1/teams/switch/route.d.ts.map +1 -1
  393. package/dist/routes/api/v1/teams/switch/route.js +4 -1
  394. package/dist/routes/api/v1/users/[id]/route.d.ts.map +1 -1
  395. package/dist/routes/api/v1/users/[id]/route.js +3 -2
  396. package/dist/routes/api/v1/users/docs.md +34 -19
  397. package/dist/routes/api/v1/users/me/route.d.ts +6 -0
  398. package/dist/routes/api/v1/users/me/route.d.ts.map +1 -0
  399. package/dist/routes/api/v1/users/me/route.js +5 -0
  400. package/dist/routes/api/v1/users/presets.ts +2 -2
  401. package/dist/routes/dashboard/(main)/layout.cc.d.ts +4 -0
  402. package/dist/routes/dashboard/(main)/layout.cc.d.ts.map +1 -0
  403. package/dist/routes/dashboard/(main)/layout.cc.js +10 -0
  404. package/dist/routes/dashboard/(main)/layout.d.ts.map +1 -1
  405. package/dist/routes/dashboard/(main)/layout.js +3 -44
  406. package/dist/routes/dashboard/permission-denied/page.d.ts +1 -1
  407. package/dist/routes/dashboard/permission-denied/page.d.ts.map +1 -1
  408. package/dist/routes/dashboard/permission-denied/page.js +5 -1
  409. package/dist/routes/dashboard/settings/password/page.d.ts.map +1 -1
  410. package/dist/routes/dashboard/settings/password/page.js +10 -12
  411. package/dist/routes/devtools/config/page.js +1 -1
  412. package/dist/routes/devtools/layout.cc.d.ts.map +1 -1
  413. package/dist/routes/devtools/layout.cc.js +5 -1
  414. package/dist/routes/devtools/page.js +1 -1
  415. package/dist/routes/devtools/scheduled-actions/page.js +1 -1
  416. package/dist/routes/devtools/tests/[[...path]]/page.js +1 -1
  417. package/dist/routes/manifest.json +10 -0
  418. package/dist/routes/robots.d.ts +10 -0
  419. package/dist/routes/robots.d.ts.map +1 -0
  420. package/dist/routes/robots.js +10 -0
  421. package/dist/routes/superadmin/layout.cc.d.ts.map +1 -1
  422. package/dist/routes/superadmin/layout.cc.js +5 -1
  423. package/dist/routes/variants.json +12 -2
  424. package/dist/templates/ci-workflows/github/cypress-regression.yml +1 -1
  425. package/dist/templates/ci-workflows/github/cypress-smoke.yml +2 -1
  426. package/dist/templates/next.config.mjs +2 -29
  427. package/dist/templates/projects/blog/api/authors/[username]/route.ts +3 -0
  428. package/dist/templates/projects/blog/api/authors/route.ts +3 -0
  429. package/dist/templates/projects/blog/api/posts/public/route.ts +3 -0
  430. package/dist/templates/projects/starter/README.md +2 -0
  431. package/dist/templates/projects/starter/docs/public/01-overview/01-introduction.md +2 -0
  432. package/dist/templates/projects/starter/templates/dashboard/analytics/layout.tsx +14 -0
  433. package/dist/templates/proxy.ts +27 -9
  434. package/dist/templates/public/favicon.ico +0 -0
  435. package/dist/templates/public/uploads/README.md +5 -94
  436. package/migrations/029_sample_accounts_outside_development.sql +55 -0
  437. package/migrations/090_sample_data.sql +10 -0
  438. package/package.json +2 -2
  439. package/scripts/build/registry/__tests__/api-docs-colocated.test.mjs +3 -0
  440. package/scripts/build/registry/__tests__/billing-registry.test.mjs +50 -1
  441. package/scripts/build/registry/__tests__/block-registry.test.mjs +3 -0
  442. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +3 -0
  443. package/scripts/build/registry/__tests__/quiet-console.mjs +17 -0
  444. package/scripts/build/registry/__tests__/safe-fs.test.mjs +3 -0
  445. package/scripts/build/registry/__tests__/team-roles.test.mjs +3 -0
  446. package/scripts/build/registry/discovery/permissions.test.mjs +3 -0
  447. package/scripts/build/registry/discovery/plugin-capabilities.mjs +2 -2
  448. package/scripts/build/registry/generators/billing-registry.mjs +7 -3
  449. package/scripts/build/registry/host/README.md +25 -1
  450. package/scripts/build/registry/host/__tests__/host-area-access.test.mjs +32 -0
  451. package/scripts/build/registry/host/__tests__/host-entities.test.mjs +32 -1
  452. package/scripts/build/registry/host/__tests__/host-plan.test.mjs +12 -2
  453. package/scripts/build/registry/host/__tests__/host-proxy-areas.test.mjs +72 -1
  454. package/scripts/build/registry/host/entity-routes.mjs +9 -3
  455. package/scripts/build/registry/host/proxy-areas.mjs +65 -2
  456. package/scripts/build/registry/host/static-imports.mjs +4 -0
  457. package/scripts/build/routes-manifest.mjs +13 -1
  458. package/scripts/db/run-migrations.mjs +30 -10
  459. package/scripts/db/sample-data.mjs +44 -0
  460. package/scripts/db/ssl-config.mjs +12 -1
  461. package/scripts/db/verify-theme-migrations.mjs +6 -0
  462. package/templates/ci-workflows/github/cypress-regression.yml +1 -1
  463. package/templates/ci-workflows/github/cypress-smoke.yml +2 -1
  464. package/templates/next.config.mjs +2 -29
  465. package/templates/projects/blog/api/authors/[username]/route.ts +3 -0
  466. package/templates/projects/blog/api/authors/route.ts +3 -0
  467. package/templates/projects/blog/api/posts/public/route.ts +3 -0
  468. package/templates/projects/starter/README.md +2 -0
  469. package/templates/projects/starter/docs/public/01-overview/01-introduction.md +2 -0
  470. package/templates/projects/starter/templates/dashboard/analytics/layout.tsx +14 -0
  471. package/templates/proxy.ts +27 -9
  472. package/templates/public/favicon.ico +0 -0
  473. package/templates/public/uploads/README.md +5 -94
  474. package/tests/jest/__mocks__/@nextsparkjs/registries/api-presets-registry.ts +2 -0
  475. package/tests/jest/__mocks__/@nextsparkjs/registries/mcp-registry.ts +2 -0
  476. package/dist/templates/projects/starter/public/brand/.gitkeep +0 -0
  477. package/dist/templates/public/uploads/.gitignore +0 -6
  478. package/dist/templates/public/uploads/temp/.gitkeep +0 -1
  479. package/templates/projects/starter/public/brand/.gitkeep +0 -0
  480. package/templates/public/uploads/.gitignore +0 -6
  481. package/templates/public/uploads/temp/.gitkeep +0 -1
@@ -1,6 +1,13 @@
1
1
  interface DeveloperGuardProps {
2
2
  children: React.ReactNode;
3
3
  fallback?: React.ReactNode;
4
+ /**
5
+ * The server already checked the role before rendering `children` (a Cache Components host: core's area layout
6
+ * renders the guard only after area-access passed). Then the children render while the session loads instead of
7
+ * the loading state, so the server render holds the area's segments (Next's dev check reports a route whose
8
+ * segments a client component hides as "dropped"). The checks below still run once the session has loaded.
9
+ */
10
+ serverChecked?: boolean;
4
11
  }
5
12
  /**
6
13
  * DeveloperGuard Component
@@ -12,7 +19,7 @@ interface DeveloperGuardProps {
12
19
  * @param children - Components to render if user is developer
13
20
  * @param fallback - Custom fallback component (optional)
14
21
  */
15
- export declare function DeveloperGuard({ children, fallback }: DeveloperGuardProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare function DeveloperGuard({ children, fallback, serverChecked }: DeveloperGuardProps): import("react/jsx-runtime").JSX.Element;
16
23
  /**
17
24
  * Hook to check if current user is developer
18
25
  * Useful for conditional rendering in components
@@ -1 +1 @@
1
- {"version":3,"file":"DeveloperGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/DeveloperGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAgHzE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC"}
1
+ {"version":3,"file":"DeveloperGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/DeveloperGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAqB,EAAE,EAAE,mBAAmB,2CAiHhG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAIxC"}
@@ -7,7 +7,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../..
7
7
  import { AlertTriangle, ArrowLeft } from "lucide-react";
8
8
  import { Button } from "../../ui/button.js";
9
9
  import { useTranslations } from "next-intl";
10
- function DeveloperGuard({ children, fallback }) {
10
+ function DeveloperGuard({ children, fallback, serverChecked = false }) {
11
11
  var _a;
12
12
  const { data: session, isPending } = useSession();
13
13
  const router = useRouter();
@@ -23,6 +23,7 @@ function DeveloperGuard({ children, fallback }) {
23
23
  }
24
24
  }, [mounted, session, isPending, router]);
25
25
  if (!mounted || isPending) {
26
+ if (serverChecked) return /* @__PURE__ */ jsx(Fragment, { children });
26
27
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
27
28
  /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-48 mb-4" }),
28
29
  /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-32" })
@@ -1,6 +1,13 @@
1
1
  interface SuperAdminGuardProps {
2
2
  children: React.ReactNode;
3
3
  fallback?: React.ReactNode;
4
+ /**
5
+ * The server already checked the role before rendering `children` (a Cache Components host: core's area layout
6
+ * renders the guard only after area-access passed). Then the children render while the session loads instead of
7
+ * the loading state, so the server render holds the area's segments (Next's dev check reports a route whose
8
+ * segments a client component hides as "dropped"). The checks below still run once the session has loaded.
9
+ */
10
+ serverChecked?: boolean;
4
11
  }
5
12
  /**
6
13
  * SuperAdminGuard Component
@@ -12,7 +19,7 @@ interface SuperAdminGuardProps {
12
19
  * @param children - Components to render if user is superadmin or developer
13
20
  * @param fallback - Custom fallback component (optional)
14
21
  */
15
- export declare function SuperAdminGuard({ children, fallback }: SuperAdminGuardProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare function SuperAdminGuard({ children, fallback, serverChecked }: SuperAdminGuardProps): import("react/jsx-runtime").JSX.Element;
16
23
  /**
17
24
  * Hook to check if current user is superadmin
18
25
  * Useful for conditional rendering in components
@@ -1 +1 @@
1
- {"version":3,"file":"SuperAdminGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/SuperAdminGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAyG3E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C"}
1
+ {"version":3,"file":"SuperAdminGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/app/guards/SuperAdminGuard.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAqB,EAAE,EAAE,oBAAoB,2CA0GlG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAIzC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C"}
@@ -7,7 +7,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../..
7
7
  import { AlertTriangle, ArrowLeft } from "lucide-react";
8
8
  import { Button } from "../../ui/button.js";
9
9
  import { useTranslations } from "next-intl";
10
- function SuperAdminGuard({ children, fallback }) {
10
+ function SuperAdminGuard({ children, fallback, serverChecked = false }) {
11
11
  var _a, _b;
12
12
  const { data: session, isPending } = useSession();
13
13
  const router = useRouter();
@@ -23,6 +23,7 @@ function SuperAdminGuard({ children, fallback }) {
23
23
  }
24
24
  }, [mounted, session, isPending, router]);
25
25
  if (!mounted || isPending) {
26
+ if (serverChecked) return /* @__PURE__ */ jsx(Fragment, { children });
26
27
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center min-h-screen", children: /* @__PURE__ */ jsxs("div", { className: "animate-pulse", children: [
27
28
  /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-48 mb-4" }),
28
29
  /* @__PURE__ */ jsx("div", { className: "h-4 bg-muted rounded w-32" })
@@ -32,9 +32,9 @@ function InvoicesPagination({
32
32
  {
33
33
  className: "flex items-center justify-between pt-4 border-t",
34
34
  "data-cy": "invoices-pagination",
35
- "aria-label": t("showing", { from: showingFrom, to: showingTo, total: totalInvoices }),
35
+ "aria-label": t("showing", { start: showingFrom, end: showingTo, total: totalInvoices }),
36
36
  children: [
37
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("showing", { from: showingFrom, to: showingTo, total: totalInvoices }) }),
37
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: t("showing", { start: showingFrom, end: showingTo, total: totalInvoices }) }),
38
38
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
39
39
  /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: t("page", { current: currentPage, total: totalPages }) }),
40
40
  /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
@@ -1 +1 @@
1
- {"version":3,"file":"block-picker.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/block-picker.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AAwBxF,UAAU,gBAAgB;IACxB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,aAAa,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,UAAU,EAAE,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,CAAA;IAChD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IACzG,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,KAAK,IAAI,CAAA;IACvE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,eAAuB,EAEvB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAkB,GACnB,EAAE,gBAAgB,2CAkVlB"}
1
+ {"version":3,"file":"block-picker.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/block-picker.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AAyBxF,UAAU,gBAAgB;IACxB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,YAAY,EAAE,kBAAkB,CAAA;IAChC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5D,aAAa,EAAE,OAAO,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,UAAU,EAAE,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,CAAA;IAChD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9B,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;IACzG,eAAe,EAAE,CAAC,MAAM,EAAE,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,KAAK,IAAI,CAAA;IACvE,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,eAAuB,EAEvB,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,cAAkB,GACnB,EAAE,gBAAgB,2CAkVlB"}
@@ -13,6 +13,7 @@ import { getCategoryConfig } from "./category-helpers.js";
13
13
  import { TreeView } from "./tree-view.js";
14
14
  import { PatternCard } from "./pattern-card.js";
15
15
  import { withBasePath } from "../../../lib/base-path.js";
16
+ import { TEAM_ID_HEADER } from "../../../lib/api/client-headers.js";
16
17
  function getTeamId() {
17
18
  if (typeof window !== "undefined") {
18
19
  return localStorage.getItem("activeTeamId");
@@ -23,7 +24,7 @@ function buildApiHeaders() {
23
24
  const headers = {};
24
25
  const teamId = getTeamId();
25
26
  if (teamId) {
26
- headers["x-team-id"] = teamId;
27
+ headers[TEAM_ID_HEADER] = teamId;
27
28
  }
28
29
  return headers;
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"builder-editor-view.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/builder-editor-view.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AAyCxF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,kBAAkB,CAAA;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,EAAE,sBAAsB,2CA85B7I"}
1
+ {"version":3,"file":"builder-editor-view.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/builder-editor-view.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gDAAgD,CAAA;AA4CxF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,kBAAkB,CAAA;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9D;AAED,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,EAAE,sBAAsB,2CAo7B7I"}
@@ -30,6 +30,8 @@ import { useSidebar } from "../../../contexts/sidebar-context.js";
30
30
  import { cn } from "../../../lib/utils/index.js";
31
31
  import { isPatternReference } from "../../../types/pattern-reference.js";
32
32
  import { withBasePath } from "../../../lib/base-path.js";
33
+ import { validatePublicSlug } from "../../../lib/entities/public-slug.js";
34
+ import { BUILDER_SOURCE_HEADER, TEAM_ID_HEADER } from "../../../lib/api/client-headers.js";
33
35
  function getTeamId() {
34
36
  if (typeof window !== "undefined") {
35
37
  return localStorage.getItem("activeTeamId");
@@ -43,16 +45,16 @@ function buildApiHeaders(includeContentType = false) {
43
45
  }
44
46
  const teamId = getTeamId();
45
47
  if (teamId) {
46
- headers["x-team-id"] = teamId;
48
+ headers[TEAM_ID_HEADER] = teamId;
47
49
  }
48
- headers["x-builder-source"] = "true";
50
+ headers[BUILDER_SOURCE_HEADER] = "true";
49
51
  return headers;
50
52
  }
51
53
  function slugify(text) {
52
- return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-");
54
+ return text.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9\s-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
53
55
  }
54
56
  function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldChange: onEntityFieldChangeProp }) {
55
- var _a;
57
+ var _a, _b;
56
58
  const router = useRouter();
57
59
  const t = useTranslations("admin.builder");
58
60
  const queryClient = useQueryClient();
@@ -74,10 +76,11 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
74
76
  });
75
77
  const [entityFields, setEntityFields] = useState({});
76
78
  const [validationErrors, setValidationErrors] = useState({});
79
+ const [slugError, setSlugError] = useState(null);
77
80
  const titleInputRef = useRef(null);
78
81
  const showFieldsOption = useMemo(() => {
79
- var _a2, _b, _c;
80
- return (((_b = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b.length) ?? 0) > 0 || ((_c = entityConfig.taxonomies) == null ? void 0 : _c.enabled);
82
+ var _a2, _b2, _c;
83
+ return (((_b2 = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b2.length) ?? 0) > 0 || ((_c = entityConfig.taxonomies) == null ? void 0 : _c.enabled);
81
84
  }, [entityConfig]);
82
85
  const showPatternsTab = useMemo(() => {
83
86
  return entitySlug !== "patterns";
@@ -106,7 +109,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
106
109
  enabled: mode === "edit" && !!id
107
110
  });
108
111
  useEffect(() => {
109
- var _a2, _b;
112
+ var _a2, _b2;
110
113
  if (mode === "edit" && (entityData == null ? void 0 : entityData.data)) {
111
114
  const entity = entityData.data;
112
115
  setTitle(entity.title ?? "");
@@ -116,7 +119,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
116
119
  setBlocks(entity.blocks || []);
117
120
  setPageSettings(entity.settings || { seo: {}, customFields: [] });
118
121
  const fields = {};
119
- (_b = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b.forEach((field) => {
122
+ (_b2 = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b2.forEach((field) => {
120
123
  if (entity[field] !== void 0) {
121
124
  fields[field] = entity[field];
122
125
  }
@@ -125,7 +128,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
125
128
  }
126
129
  }, [entityData, entityConfig, mode]);
127
130
  useEffect(() => {
128
- var _a2, _b;
131
+ var _a2, _b2;
129
132
  if (mode === "create") {
130
133
  setHasUnsavedChanges(title.length > 0 || blocks.length > 0 || status !== "draft");
131
134
  return;
@@ -133,7 +136,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
133
136
  if (!(entityData == null ? void 0 : entityData.data)) return;
134
137
  const entity = entityData.data;
135
138
  const hasChanges = title !== entity.title || slug !== entity.slug || status !== (entity.status || "draft") || JSON.stringify(blocks) !== JSON.stringify(entity.blocks || []) || JSON.stringify(pageSettings) !== JSON.stringify(entity.settings || { seo: {}, customFields: [] }) || JSON.stringify(entityFields) !== JSON.stringify(
136
- ((_b = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b.reduce((acc, field) => {
139
+ ((_b2 = (_a2 = entityConfig.builder) == null ? void 0 : _a2.sidebarFields) == null ? void 0 : _b2.reduce((acc, field) => {
137
140
  if (entity[field] !== void 0) acc[field] = entity[field];
138
141
  return acc;
139
142
  }, {})) || {}
@@ -167,7 +170,11 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
167
170
  });
168
171
  if (!response.ok) {
169
172
  const error = await response.json();
170
- throw new Error(error.error || `Failed to save ${entitySlug}`);
173
+ const slugIssue = Array.isArray(error.details) ? error.details.find((issue) => {
174
+ var _a2;
175
+ return ((_a2 = issue.path) == null ? void 0 : _a2[0]) === "slug";
176
+ }) : void 0;
177
+ throw Object.assign(new Error((slugIssue == null ? void 0 : slugIssue.message) || error.error || `Failed to save ${entitySlug}`), { slugIssue: Boolean(slugIssue) });
171
178
  }
172
179
  return response.json();
173
180
  },
@@ -187,9 +194,11 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
187
194
  }
188
195
  },
189
196
  onError: (error) => {
197
+ if (error.slugIssue) setSlugError(error.message);
190
198
  toast.error(error.message);
191
199
  }
192
200
  });
201
+ const slugChanged = mode === "create" || slug !== ((_a = entityData == null ? void 0 : entityData.data) == null ? void 0 : _a.slug);
193
202
  const validateFields = useCallback(() => {
194
203
  var _a2;
195
204
  const errors = {};
@@ -199,7 +208,11 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
199
208
  if (showSlug && !slug.trim()) {
200
209
  errors.slug = true;
201
210
  }
211
+ const slugReason = showSlug && slugChanged && slug.trim() && !slug.includes("/") ? validatePublicSlug(entityConfig, slug.trim()) : null;
212
+ setSlugError(slugReason);
213
+ if (slugReason) toast.error(slugReason);
202
214
  setValidationErrors(errors);
215
+ if (slugReason) return false;
203
216
  if (errors.title || errors.slug) {
204
217
  if (errors.title) {
205
218
  (_a2 = titleInputRef.current) == null ? void 0 : _a2.focus();
@@ -207,43 +220,43 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
207
220
  return false;
208
221
  }
209
222
  return true;
210
- }, [title, slug, showSlug]);
223
+ }, [title, slug, slugChanged, showSlug, entityConfig]);
211
224
  const handleSave = useCallback(() => {
212
225
  if (!validateFields()) return;
213
226
  const data = {
214
227
  title,
215
- slug,
228
+ ...slugChanged ? { slug } : {},
216
229
  blocks,
217
230
  status,
218
231
  settings: pageSettings,
219
232
  ...entityFields
220
233
  };
221
234
  saveMutation.mutate(data);
222
- }, [title, slug, blocks, status, pageSettings, entityFields, saveMutation, validateFields]);
235
+ }, [title, slug, blocks, status, pageSettings, entityFields, saveMutation, validateFields, slugChanged]);
223
236
  const handleSaveDraft = useCallback(() => {
224
237
  if (!validateFields()) return;
225
238
  const data = {
226
239
  title,
227
- slug,
240
+ ...slugChanged ? { slug } : {},
228
241
  blocks,
229
242
  status: "draft",
230
243
  settings: pageSettings,
231
244
  ...entityFields
232
245
  };
233
246
  saveMutation.mutate(data);
234
- }, [title, slug, blocks, pageSettings, entityFields, saveMutation, validateFields]);
247
+ }, [title, slug, blocks, pageSettings, entityFields, saveMutation, validateFields, slugChanged]);
235
248
  const handlePublish = useCallback(() => {
236
249
  if (!validateFields()) return;
237
250
  const data = {
238
251
  title,
239
- slug,
252
+ ...slugChanged ? { slug } : {},
240
253
  blocks,
241
254
  status: "published",
242
255
  settings: pageSettings,
243
256
  ...entityFields
244
257
  };
245
258
  saveMutation.mutate(data);
246
- }, [title, slug, blocks, pageSettings, entityFields, saveMutation, validateFields]);
259
+ }, [title, slug, blocks, pageSettings, entityFields, saveMutation, validateFields, slugChanged]);
247
260
  const selectedBlockId = useMemo(() => {
248
261
  if (selectedBlockIds.size === 1) return Array.from(selectedBlockIds)[0];
249
262
  return null;
@@ -512,9 +525,9 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
512
525
  }, [handleClearSelection]);
513
526
  const selectedBlock = selectedBlockId ? blocks.find((b) => b.id === selectedBlockId) : void 0;
514
527
  const publicUrl = useMemo(() => {
515
- var _a2, _b, _c;
528
+ var _a2, _b2, _c;
516
529
  if (status !== "published" || !slug) return null;
517
- const basePath = ((_a2 = entityConfig.access) == null ? void 0 : _a2.basePath) ?? ((_c = (_b = entityConfig.builder) == null ? void 0 : _b.public) == null ? void 0 : _c.basePath) ?? "";
530
+ const basePath = ((_a2 = entityConfig.access) == null ? void 0 : _a2.basePath) ?? ((_c = (_b2 = entityConfig.builder) == null ? void 0 : _b2.public) == null ? void 0 : _c.basePath) ?? "";
518
531
  return basePath === "/" ? `/${slug}` : `${basePath}/${slug}`;
519
532
  }, [status, slug, entityConfig]);
520
533
  const leftSidebarOptions = useMemo(() => {
@@ -596,7 +609,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
596
609
  {
597
610
  className: cn(
598
611
  "flex items-center gap-0.5 text-sm text-muted-foreground",
599
- validationErrors.slug && "text-destructive"
612
+ (validationErrors.slug || slugError) && "text-destructive"
600
613
  ),
601
614
  "data-cy": sel("blockEditor.header.slugWrapper"),
602
615
  children: [
@@ -610,6 +623,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
610
623
  onChange: (e) => {
611
624
  const newSlug = e.target.value;
612
625
  setSlug(newSlug);
626
+ setSlugError(null);
613
627
  if (newSlug !== slugify(title)) {
614
628
  setSlugManuallyEdited(true);
615
629
  }
@@ -625,9 +639,11 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
625
639
  ),
626
640
  placeholder: t("placeholders.slug"),
627
641
  "data-cy": sel("blockEditor.header.slugInput"),
628
- style: { width: slug ? `${Math.max(slug.length, 4)}ch` : "60px" }
642
+ style: { width: slug ? `${Math.max(slug.length, 4)}ch` : "60px" },
643
+ "aria-invalid": Boolean(slugError)
629
644
  }
630
645
  ),
646
+ slugError && /* @__PURE__ */ jsx("span", { role: "alert", className: "ml-2 text-xs", "data-cy": "builder-slug-error", children: slugError }),
631
647
  isPublicEntity && publicUrl && /* @__PURE__ */ jsx(
632
648
  Button,
633
649
  {
@@ -716,7 +732,7 @@ function BuilderEditorView({ entitySlug, entityConfig, id, mode, onEntityFieldCh
716
732
  {
717
733
  className: "text-xs font-medium text-muted-foreground uppercase tracking-wide",
718
734
  "data-cy": sel("blockEditor.header.statusLabel"),
719
- children: ((_a = statusOptions.find((o) => o.value === status)) == null ? void 0 : _a.label) || status
735
+ children: ((_b = statusOptions.find((o) => o.value === status)) == null ? void 0 : _b.label) || status
720
736
  }
721
737
  )
722
738
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"pattern-reference-preview.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/pattern-reference-preview.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAKxE,UAAU,4BAA4B;IACpC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AA8CD,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,GACT,EAAE,4BAA4B,2CAoJ9B"}
1
+ {"version":3,"file":"pattern-reference-preview.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/block-editor/pattern-reference-preview.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAMxE,UAAU,4BAA4B;IACpC,UAAU,EAAE,gBAAgB,CAAA;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB;AA8CD,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,GACT,EAAE,4BAA4B,2CAoJ9B"}
@@ -10,6 +10,7 @@ import { cn } from "../../../lib/utils/index.js";
10
10
  import { sel } from "../../../lib/test/index.js";
11
11
  import { getBlockComponent, normalizeBlockProps } from "../../../lib/blocks/loader.js";
12
12
  import { withBasePath } from "../../../lib/base-path.js";
13
+ import { TEAM_ID_HEADER } from "../../../lib/api/client-headers.js";
13
14
  function PatternLoadingSkeleton() {
14
15
  return /* @__PURE__ */ jsx("div", { className: "w-full py-12 px-4 animate-pulse bg-muted/20 border-2 border-dashed border-muted-foreground/30 rounded-lg", children: /* @__PURE__ */ jsxs("div", { className: "max-w-7xl mx-auto", children: [
15
16
  /* @__PURE__ */ jsx("div", { className: "h-8 bg-muted rounded w-3/4 mb-4" }),
@@ -34,7 +35,7 @@ function buildApiHeaders() {
34
35
  const headers = {};
35
36
  const teamId = getTeamId();
36
37
  if (teamId) {
37
- headers["x-team-id"] = teamId;
38
+ headers[TEAM_ID_HEADER] = teamId;
38
39
  }
39
40
  return headers;
40
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AuthGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/AuthGuard.tsx"],"names":[],"mappings":"AASA,UAAU,cAAc;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAOD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA0BrD"}
1
+ {"version":3,"file":"AuthGuard.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/AuthGuard.tsx"],"names":[],"mappings":"AASA,UAAU,cAAc;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAOD,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAyBrD"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useAuth } from "../../../hooks/useAuth.js";
4
- import { useRouter } from "next/navigation";
4
+ import { loadLoginPage } from "../../../lib/auth/load-login-page.js";
5
5
  import { useEffect } from "react";
6
6
  import { DashboardAuthSkeleton } from "./DashboardAuthSkeleton.js";
7
7
  import { useEnsureUserMetadata } from "../../../hooks/useEnsureUserMetadata.js";
@@ -12,13 +12,12 @@ function EnsureUserMetadata() {
12
12
  }
13
13
  function AuthGuard({ children }) {
14
14
  const { user, isLoading } = useAuth();
15
- const router = useRouter();
16
15
  useAuthMethodDetector();
17
16
  useEffect(() => {
18
17
  if (!isLoading && !user) {
19
- router.push("/login");
18
+ loadLoginPage();
20
19
  }
21
- }, [user, isLoading, router]);
20
+ }, [user, isLoading]);
22
21
  if (isLoading) {
23
22
  return /* @__PURE__ */ jsx(DashboardAuthSkeleton, {});
24
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticatedDashboardLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/AuthenticatedDashboardLayout.tsx"],"names":[],"mappings":"AA4CA,iFAAiF;AACjF,wBAAgB,4BAA4B,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAMvF"}
1
+ {"version":3,"file":"AuthenticatedDashboardLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/AuthenticatedDashboardLayout.tsx"],"names":[],"mappings":"AAiDA,iFAAiF;AACjF,wBAAgB,4BAA4B,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAMvF"}
@@ -1,9 +1,8 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { Suspense, useEffect } from "react";
4
- import { useRouter } from "next/navigation";
4
+ import { loadLoginPage } from "../../../lib/auth/load-login-page.js";
5
5
  import { useAuth } from "../../../hooks/useAuth.js";
6
- import { DashboardAuthSkeleton } from "./DashboardAuthSkeleton.js";
7
6
  import { DashboardProviders } from "../../../providers/DashboardProviders.js";
8
7
  import { DashboardTranslationPreloader } from "../../../lib/i18n/DashboardTranslationPreloader.js";
9
8
  import { TranslationDebugger } from "../../../utils/dev/TranslationDebugger.js";
@@ -15,17 +14,17 @@ function AuthMethodDetectorWrapper() {
15
14
  }
16
15
  function DashboardLayoutContent({ children }) {
17
16
  const { user, isLoading } = useAuth();
18
- const router = useRouter();
19
17
  useEnsureUserMetadata();
20
18
  useEffect(() => {
21
- if (!isLoading && !user) router.push("/login");
22
- }, [user, isLoading, router]);
23
- if (isLoading) return /* @__PURE__ */ jsx(DashboardAuthSkeleton, {});
24
- if (!user) return null;
19
+ if (!isLoading && !user) loadLoginPage();
20
+ }, [user, isLoading]);
21
+ if (!isLoading && !user) return null;
25
22
  return /* @__PURE__ */ jsxs(Fragment, { children: [
26
- /* @__PURE__ */ jsx(DashboardTranslationPreloader, {}),
27
- /* @__PURE__ */ jsx(TranslationDebugger, {}),
28
- /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AuthMethodDetectorWrapper, {}) }),
23
+ user && /* @__PURE__ */ jsxs(Fragment, { children: [
24
+ /* @__PURE__ */ jsx(DashboardTranslationPreloader, {}),
25
+ /* @__PURE__ */ jsx(TranslationDebugger, {}),
26
+ /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AuthMethodDetectorWrapper, {}) })
27
+ ] }),
29
28
  /* @__PURE__ */ jsx("div", { id: "dashboard-container", "data-cy": "dashboard-container", "data-testid": "dashboard-container", children })
30
29
  ] });
31
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardAuthLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/DashboardAuthLayout.tsx"],"names":[],"mappings":"AAuEA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,2CAEA"}
1
+ {"version":3,"file":"DashboardAuthLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/dashboard/layouts/DashboardAuthLayout.tsx"],"names":[],"mappings":"AAsEA;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACT,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,2CAEA"}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import { useAuth } from "../../../hooks/useAuth.js";
4
- import { useRouter } from "next/navigation";
4
+ import { loadLoginPage } from "../../../lib/auth/load-login-page.js";
5
5
  import { useEffect, Suspense } from "react";
6
6
  import { DashboardAuthSkeleton } from "./DashboardAuthSkeleton.js";
7
7
  import { DashboardTranslationPreloader } from "../../../lib/i18n/DashboardTranslationPreloader.js";
@@ -14,13 +14,12 @@ function AuthMethodDetectorWrapper() {
14
14
  }
15
15
  function DashboardLayoutContent({ children }) {
16
16
  const { user, isLoading } = useAuth();
17
- const router = useRouter();
18
17
  useEnsureUserMetadata();
19
18
  useEffect(() => {
20
19
  if (!isLoading && !user) {
21
- router.push("/login");
20
+ loadLoginPage();
22
21
  }
23
- }, [user, isLoading, router]);
22
+ }, [user, isLoading]);
24
23
  if (isLoading) {
25
24
  return /* @__PURE__ */ jsx(DashboardAuthSkeleton, {});
26
25
  }
@@ -10,8 +10,8 @@
10
10
  * The sidebar rail collapses below the `md:` breakpoint, matching the real
11
11
  * dashboard sidebar, so mobile never shows a phantom sidebar block.
12
12
  *
13
- * Shared by AuthGuard, DashboardAuthLayout and the generated
14
- * app/dashboard/layout.tsx so the public API and the template cannot drift.
13
+ * Shared by AuthGuard and DashboardAuthLayout so the public API and the template cannot drift. The
14
+ * dashboard layout itself (AuthenticatedDashboardLayout) does not use it: it renders the page while the session loads.
15
15
  */
16
16
  export declare function DashboardAuthSkeleton(): import("react/jsx-runtime").JSX.Element;
17
17
  //# sourceMappingURL=DashboardAuthSkeleton.d.ts.map
@@ -167,11 +167,11 @@ function DynamicNavigation({
167
167
  isMobile && "w-full"
168
168
  ),
169
169
  "aria-current": pathname === "/dashboard" ? "page" : void 0,
170
- title: isCollapsed ? t("navigation.dashboard") : void 0,
170
+ title: isCollapsed ? t("dashboard") : void 0,
171
171
  "data-cy": sel("dashboard.navigation.dashboardLink"),
172
172
  children: [
173
173
  /* @__PURE__ */ jsx(Home, { className: "h-4 w-4 shrink-0", "aria-hidden": "true" }),
174
- !isCollapsed && /* @__PURE__ */ jsx("span", { className: "truncate", children: t("navigation.dashboard") })
174
+ !isCollapsed && /* @__PURE__ */ jsx("span", { className: "truncate", children: t("dashboard") })
175
175
  ]
176
176
  }
177
177
  ),
@@ -1 +1 @@
1
- {"version":3,"file":"EntityDetailWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityDetailWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAoD,MAAM,OAAO,CAAA;AAaxE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;CAChE;AAED,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,EAAE,EACF,gBAAqB,EACrB,OAAO,EACP,SAAS,EACT,oBAAyB,GAC1B,EAAE,wBAAwB,2CAoZ1B"}
1
+ {"version":3,"file":"EntityDetailWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityDetailWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAoD,MAAM,OAAO,CAAA;AAcxE,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAA;CAChE;AAED,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,EAAE,EACF,gBAAqB,EACrB,OAAO,EACP,SAAS,EACT,oBAAyB,GAC1B,EAAE,wBAAwB,2CAyZ1B"}
@@ -5,6 +5,7 @@ import { EntityDetail } from "../EntityDetail.js";
5
5
  import { Alert, AlertDescription } from "../../ui/alert.js";
6
6
  import { SkeletonEntityDetail } from "../../ui/skeleton-detail.js";
7
7
  import { useEntityConfig } from "../../../hooks/useEntityConfig.js";
8
+ import { useAuth } from "../../../hooks/useAuth.js";
8
9
  import { useRouter } from "next/navigation";
9
10
  import { getEntityData, deleteEntityData, fetchWithTeam } from "../../../lib/api/entities.js";
10
11
  import { TeamDetailSection } from "../../teams/TeamDetailSection.js";
@@ -18,6 +19,8 @@ function EntityDetailWrapper({
18
19
  customFormComponents = {}
19
20
  }) {
20
21
  const { config: entityConfig, isLoading: isLoadingConfig, error: configError, isOverride } = useEntityConfig(entityType);
22
+ const { user } = useAuth();
23
+ const signedIn = Boolean(user);
21
24
  const router = useRouter();
22
25
  const [data, setData] = useState(null);
23
26
  const [childData, setChildData] = useState({});
@@ -77,7 +80,7 @@ function EntityDetailWrapper({
77
80
  dataLoadedRef.current = false;
78
81
  prevIdRef.current = id;
79
82
  }
80
- if (!entityConfig || !id) return;
83
+ if (!entityConfig || !id || !signedIn) return;
81
84
  if (dataLoadedRef.current) return;
82
85
  if (!entityConfig.enabled) {
83
86
  const error = new Error(`Entity "${entityType}" is disabled`);
@@ -136,7 +139,7 @@ function EntityDetailWrapper({
136
139
  }
137
140
  };
138
141
  loadEntityData();
139
- }, [entityConfig == null ? void 0 : entityConfig.slug, entityType, id]);
142
+ }, [entityConfig == null ? void 0 : entityConfig.slug, entityType, id, signedIn]);
140
143
  const handleEdit = useCallback(() => {
141
144
  router.push(`/dashboard/${entityConfig == null ? void 0 : entityConfig.slug}/${id}/edit`);
142
145
  }, [router, entityConfig, id]);
@@ -1 +1 @@
1
- {"version":3,"file":"EntityFormWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityFormWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAA2C,MAAM,OAAO,CAAA;AAU/D,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,IAAI,EACJ,EAAE,EACF,WAAW,EAAE,gBAAgB,EAC7B,SAAS,EACT,OAAO,EACP,SAAS,EACT,aAAa,EAAE,uBAAuB,EACvC,EAAE,sBAAsB,2CAoIxB"}
1
+ {"version":3,"file":"EntityFormWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityFormWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAA2C,MAAM,OAAO,CAAA;AAW/D,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAA;IACvB,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,IAAI,EACJ,EAAE,EACF,WAAW,EAAE,gBAAgB,EAC7B,SAAS,EACT,OAAO,EACP,SAAS,EACT,aAAa,EAAE,uBAAuB,EACvC,EAAE,sBAAsB,2CAyIxB"}
@@ -6,6 +6,7 @@ import { EntityForm } from "../EntityForm.js";
6
6
  import { EntityDetailHeader } from "../EntityDetailHeader.js";
7
7
  import { Alert, AlertDescription } from "../../ui/alert.js";
8
8
  import { SkeletonEntityForm } from "../../ui/skeleton-form.js";
9
+ import { useAuth } from "../../../hooks/useAuth.js";
9
10
  import { useEntityConfig } from "../../../hooks/useEntityConfig.js";
10
11
  import { useTeam } from "../../../hooks/useTeam.js";
11
12
  import { getEntityData, createEntityData, updateEntityData } from "../../../lib/api/entities.js";
@@ -20,6 +21,8 @@ function EntityFormWrapper({
20
21
  headerActions: additionalHeaderActions
21
22
  }) {
22
23
  var _a, _b;
24
+ const { user } = useAuth();
25
+ const signedIn = Boolean(user);
23
26
  const router = useRouter();
24
27
  const { config: entityConfig, isLoading: isLoadingConfig, error: configError, isOverride } = useEntityConfig(entityType);
25
28
  const { teamId } = useTeam();
@@ -32,7 +35,7 @@ function EntityFormWrapper({
32
35
  return;
33
36
  }
34
37
  const loadInitialData = async () => {
35
- if (mode === "edit" && id && entityConfig) {
38
+ if (mode === "edit" && id && entityConfig && signedIn) {
36
39
  if (!entityConfig.enabled) {
37
40
  onError == null ? void 0 : onError(new Error(`Entity "${entityType}" is disabled`));
38
41
  return;
@@ -52,7 +55,7 @@ function EntityFormWrapper({
52
55
  }
53
56
  };
54
57
  loadInitialData();
55
- }, [mode, id, entityType, entityConfig, onError, isOverride, propsInitialData]);
58
+ }, [mode, id, entityType, entityConfig, onError, isOverride, propsInitialData, signedIn]);
56
59
  const handleSubmit = useCallback(async (data) => {
57
60
  setSubmitError(null);
58
61
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"EntityListWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityListWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAA4D,MAAM,OAAO,CAAA;AAoBhF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,SAAS,EACT,aAAa,EACd,EAAE,sBAAsB,2CA+XxB"}
1
+ {"version":3,"file":"EntityListWrapper.d.ts","sourceRoot":"","sources":["../../../../src/components/entities/wrappers/EntityListWrapper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAA4D,MAAM,OAAO,CAAA;AAqBhF,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,SAAS,EACT,aAAa,EACd,EAAE,sBAAsB,2CAmYxB"}