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

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 (338) 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/dashboard/block-editor/block-picker.d.ts.map +1 -1
  8. package/dist/components/dashboard/block-editor/block-picker.js +2 -1
  9. package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
  10. package/dist/components/dashboard/block-editor/builder-editor-view.js +39 -23
  11. package/dist/components/dashboard/block-editor/pattern-reference-preview.d.ts.map +1 -1
  12. package/dist/components/dashboard/block-editor/pattern-reference-preview.js +2 -1
  13. package/dist/components/dashboard/layouts/AuthGuard.d.ts.map +1 -1
  14. package/dist/components/dashboard/layouts/AuthGuard.js +3 -4
  15. package/dist/components/dashboard/layouts/AuthenticatedDashboardLayout.d.ts.map +1 -1
  16. package/dist/components/dashboard/layouts/AuthenticatedDashboardLayout.js +9 -10
  17. package/dist/components/dashboard/layouts/DashboardAuthLayout.d.ts.map +1 -1
  18. package/dist/components/dashboard/layouts/DashboardAuthLayout.js +3 -4
  19. package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts +2 -2
  20. package/dist/components/entities/wrappers/EntityDetailWrapper.d.ts.map +1 -1
  21. package/dist/components/entities/wrappers/EntityDetailWrapper.js +5 -2
  22. package/dist/components/entities/wrappers/EntityFormWrapper.d.ts.map +1 -1
  23. package/dist/components/entities/wrappers/EntityFormWrapper.js +5 -2
  24. package/dist/components/entities/wrappers/EntityListWrapper.d.ts.map +1 -1
  25. package/dist/components/entities/wrappers/EntityListWrapper.js +5 -2
  26. package/dist/components/ui/relation-display.d.ts.map +1 -1
  27. package/dist/components/ui/relation-display.js +2 -1
  28. package/dist/components/ui/user-display.d.ts.map +1 -1
  29. package/dist/components/ui/user-display.js +2 -1
  30. package/dist/emails/otp-verification.d.ts.map +1 -1
  31. package/dist/emails/otp-verification.js +5 -3
  32. package/dist/emails/reset-password.d.ts.map +1 -1
  33. package/dist/emails/reset-password.js +5 -3
  34. package/dist/emails/team-invitation.d.ts.map +1 -1
  35. package/dist/emails/team-invitation.js +3 -2
  36. package/dist/emails/verify-email.d.ts.map +1 -1
  37. package/dist/emails/verify-email.js +5 -3
  38. package/dist/hooks/useAuth.d.ts.map +1 -1
  39. package/dist/hooks/useAuth.js +21 -4
  40. package/dist/hooks/usePatternUsages.d.ts.map +1 -1
  41. package/dist/hooks/usePatternUsages.js +3 -2
  42. package/dist/lib/api/auth.d.ts +2 -0
  43. package/dist/lib/api/auth.d.ts.map +1 -1
  44. package/dist/lib/api/auth.js +10 -10
  45. package/dist/lib/api/client-headers.d.ts +11 -0
  46. package/dist/lib/api/client-headers.d.ts.map +1 -0
  47. package/dist/lib/api/client-headers.js +12 -0
  48. package/dist/lib/api/client-ip.d.ts +59 -0
  49. package/dist/lib/api/client-ip.d.ts.map +1 -0
  50. package/dist/lib/api/client-ip.js +91 -0
  51. package/dist/lib/api/cors-response.d.ts +54 -0
  52. package/dist/lib/api/cors-response.d.ts.map +1 -0
  53. package/dist/lib/api/cors-response.js +88 -0
  54. package/dist/lib/api/entities.d.ts.map +1 -1
  55. package/dist/lib/api/entities.js +4 -3
  56. package/dist/lib/api/entity/audit-log.d.ts.map +1 -1
  57. package/dist/lib/api/entity/audit-log.js +2 -1
  58. package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
  59. package/dist/lib/api/entity/generic-handler.js +23 -5
  60. package/dist/lib/api/helpers.d.ts +8 -2
  61. package/dist/lib/api/helpers.d.ts.map +1 -1
  62. package/dist/lib/api/helpers.js +27 -81
  63. package/dist/lib/api/keys.d.ts +6 -0
  64. package/dist/lib/api/keys.d.ts.map +1 -1
  65. package/dist/lib/api/keys.js +7 -1
  66. package/dist/lib/api/rate-limit.d.ts +4 -0
  67. package/dist/lib/api/rate-limit.d.ts.map +1 -1
  68. package/dist/lib/api/rate-limit.js +16 -40
  69. package/dist/lib/api/request-origin.d.ts +16 -7
  70. package/dist/lib/api/request-origin.d.ts.map +1 -1
  71. package/dist/lib/api/request-origin.js +43 -20
  72. package/dist/lib/auth/load-login-page.d.ts +10 -0
  73. package/dist/lib/auth/load-login-page.d.ts.map +1 -0
  74. package/dist/lib/auth/load-login-page.js +7 -0
  75. package/dist/lib/auth/runtime-readiness.d.ts.map +1 -1
  76. package/dist/lib/auth/runtime-readiness.js +2 -0
  77. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts +1 -8
  78. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts.map +1 -1
  79. package/dist/lib/auth/security-notifications/device-fingerprint.js +2 -12
  80. package/dist/lib/auth-email-callbacks.js +3 -3
  81. package/dist/lib/auth.d.ts.map +1 -1
  82. package/dist/lib/auth.js +7 -2
  83. package/dist/lib/config/config-client.d.ts.map +1 -1
  84. package/dist/lib/config/config-client.js +1 -1
  85. package/dist/lib/config/config-sync.d.ts.map +1 -1
  86. package/dist/lib/config/config-sync.js +1 -1
  87. package/dist/lib/config/public-config-client.d.ts +1 -0
  88. package/dist/lib/config/public-config-client.d.ts.map +1 -1
  89. package/dist/lib/config/public-config-client.js +3 -1
  90. package/dist/lib/config/types.d.ts +2 -0
  91. package/dist/lib/config/types.d.ts.map +1 -1
  92. package/dist/lib/constants/reserved-slugs.d.ts +17 -8
  93. package/dist/lib/constants/reserved-slugs.d.ts.map +1 -1
  94. package/dist/lib/constants/reserved-slugs.js +16 -52
  95. package/dist/lib/db.d.ts.map +1 -1
  96. package/dist/lib/db.js +9 -3
  97. package/dist/lib/entities/external-api-generator.d.ts.map +1 -1
  98. package/dist/lib/entities/external-api-generator.js +2 -4
  99. package/dist/lib/entities/public-slug.d.ts +46 -0
  100. package/dist/lib/entities/public-slug.d.ts.map +1 -0
  101. package/dist/lib/entities/public-slug.js +39 -0
  102. package/dist/routes/(auth)/signup/page.cc.d.ts +3 -8
  103. package/dist/routes/(auth)/signup/page.cc.d.ts.map +1 -1
  104. package/dist/routes/(auth)/signup/page.cc.js +7 -1
  105. package/dist/routes/(auth)/verify-email/page.d.ts.map +1 -1
  106. package/dist/routes/(auth)/verify-email/page.js +2 -1
  107. package/dist/routes/(public)/page.cc.d.ts +3 -0
  108. package/dist/routes/(public)/page.cc.d.ts.map +1 -0
  109. package/dist/routes/(public)/page.cc.js +3 -0
  110. package/dist/routes/_internal/area-access.cc.d.ts +21 -0
  111. package/dist/routes/_internal/area-access.cc.d.ts.map +1 -0
  112. package/dist/routes/_internal/area-access.cc.js +19 -0
  113. package/dist/routes/_internal/auth-layout.d.ts.map +1 -1
  114. package/dist/routes/_internal/auth-layout.js +3 -2
  115. package/dist/routes/_internal/dashboard-main-shared.d.ts +7 -0
  116. package/dist/routes/_internal/dashboard-main-shared.d.ts.map +1 -0
  117. package/dist/routes/_internal/dashboard-main-shared.js +49 -0
  118. package/dist/routes/_internal/default-auth-layout.d.ts.map +1 -1
  119. package/dist/routes/_internal/default-auth-layout.js +3 -2
  120. package/dist/routes/_internal/devtools-layout.cc.d.ts +3 -2
  121. package/dist/routes/_internal/devtools-layout.cc.d.ts.map +1 -1
  122. package/dist/routes/_internal/devtools-layout.cc.js +1 -1
  123. package/dist/routes/_internal/devtools-layout.d.ts +7 -2
  124. package/dist/routes/_internal/devtools-layout.d.ts.map +1 -1
  125. package/dist/routes/_internal/devtools-layout.js +4 -4
  126. package/dist/routes/_internal/entity-detail-route.cc.d.ts +8 -0
  127. package/dist/routes/_internal/entity-detail-route.cc.d.ts.map +1 -0
  128. package/dist/routes/_internal/entity-detail-route.cc.js +5 -0
  129. package/dist/routes/_internal/entity-edit-route.cc.d.ts +8 -0
  130. package/dist/routes/_internal/entity-edit-route.cc.d.ts.map +1 -0
  131. package/dist/routes/_internal/entity-edit-route.cc.js +5 -0
  132. package/dist/routes/_internal/public-archive-route.d.ts +1 -1
  133. package/dist/routes/_internal/public-archive-route.d.ts.map +1 -1
  134. package/dist/routes/_internal/public-archive-route.js +8 -3
  135. package/dist/routes/_internal/public-item-route.cc.d.ts +5 -1
  136. package/dist/routes/_internal/public-item-route.cc.d.ts.map +1 -1
  137. package/dist/routes/_internal/public-item-route.cc.js +2 -1
  138. package/dist/routes/_internal/public-item-route.d.ts +7 -0
  139. package/dist/routes/_internal/public-item-route.d.ts.map +1 -1
  140. package/dist/routes/_internal/public-item-route.js +6 -1
  141. package/dist/routes/_internal/superadmin-layout.cc.d.ts +2 -1
  142. package/dist/routes/_internal/superadmin-layout.cc.d.ts.map +1 -1
  143. package/dist/routes/_internal/superadmin-layout.cc.js +1 -1
  144. package/dist/routes/_internal/superadmin-layout.d.ts +7 -2
  145. package/dist/routes/_internal/superadmin-layout.d.ts.map +1 -1
  146. package/dist/routes/_internal/superadmin-layout.js +6 -6
  147. package/dist/routes/_internal/suspended-route.d.ts +16 -0
  148. package/dist/routes/_internal/suspended-route.d.ts.map +1 -0
  149. package/dist/routes/_internal/suspended-route.js +7 -0
  150. package/dist/routes/api/auth/[...all]/route.d.ts.map +1 -1
  151. package/dist/routes/api/auth/[...all]/route.js +4 -12
  152. package/dist/routes/api/csp-report/route.d.ts.map +1 -1
  153. package/dist/routes/api/csp-report/route.js +2 -13
  154. package/dist/routes/api/devtools/config/entities/route.d.ts +2 -0
  155. package/dist/routes/api/devtools/config/entities/route.d.ts.map +1 -1
  156. package/dist/routes/api/devtools/config/entities/route.js +2 -0
  157. package/dist/routes/api/devtools/config/theme/route.d.ts +2 -0
  158. package/dist/routes/api/devtools/config/theme/route.d.ts.map +1 -1
  159. package/dist/routes/api/devtools/config/theme/route.js +2 -0
  160. package/dist/routes/api/devtools/tests/[...path]/route.d.ts +2 -0
  161. package/dist/routes/api/devtools/tests/[...path]/route.d.ts.map +1 -1
  162. package/dist/routes/api/devtools/tests/[...path]/route.js +2 -0
  163. package/dist/routes/api/devtools/tests/route.d.ts +2 -0
  164. package/dist/routes/api/devtools/tests/route.d.ts.map +1 -1
  165. package/dist/routes/api/devtools/tests/route.js +2 -0
  166. package/dist/routes/api/health/route.d.ts +2 -0
  167. package/dist/routes/api/health/route.d.ts.map +1 -1
  168. package/dist/routes/api/health/route.js +2 -0
  169. package/dist/routes/api/internal/user-metadata/route.d.ts +2 -0
  170. package/dist/routes/api/internal/user-metadata/route.d.ts.map +1 -1
  171. package/dist/routes/api/internal/user-metadata/route.js +2 -0
  172. package/dist/routes/api/mcp/route.d.ts +2 -0
  173. package/dist/routes/api/mcp/route.d.ts.map +1 -1
  174. package/dist/routes/api/mcp/route.js +2 -0
  175. package/dist/routes/api/superadmin/subscriptions/route.d.ts +2 -0
  176. package/dist/routes/api/superadmin/subscriptions/route.d.ts.map +1 -1
  177. package/dist/routes/api/superadmin/subscriptions/route.js +2 -0
  178. package/dist/routes/api/superadmin/teams/[teamId]/route.d.ts +2 -0
  179. package/dist/routes/api/superadmin/teams/[teamId]/route.d.ts.map +1 -1
  180. package/dist/routes/api/superadmin/teams/[teamId]/route.js +2 -0
  181. package/dist/routes/api/superadmin/teams/route.d.ts +2 -0
  182. package/dist/routes/api/superadmin/teams/route.d.ts.map +1 -1
  183. package/dist/routes/api/superadmin/teams/route.js +2 -0
  184. package/dist/routes/api/superadmin/users/[userId]/route.d.ts +2 -0
  185. package/dist/routes/api/superadmin/users/[userId]/route.d.ts.map +1 -1
  186. package/dist/routes/api/superadmin/users/[userId]/route.js +2 -0
  187. package/dist/routes/api/superadmin/users/route.d.ts +2 -0
  188. package/dist/routes/api/superadmin/users/route.d.ts.map +1 -1
  189. package/dist/routes/api/superadmin/users/route.js +2 -0
  190. package/dist/routes/api/user/delete-account/route.d.ts +2 -0
  191. package/dist/routes/api/user/delete-account/route.d.ts.map +1 -1
  192. package/dist/routes/api/user/delete-account/route.js +2 -0
  193. package/dist/routes/api/user/plan-flags/route.d.ts +2 -0
  194. package/dist/routes/api/user/plan-flags/route.d.ts.map +1 -1
  195. package/dist/routes/api/user/plan-flags/route.js +2 -0
  196. package/dist/routes/api/user/profile/route.d.ts +2 -0
  197. package/dist/routes/api/user/profile/route.d.ts.map +1 -1
  198. package/dist/routes/api/user/profile/route.js +4 -3
  199. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.d.ts +2 -0
  200. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.d.ts.map +1 -1
  201. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.js +2 -0
  202. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.d.ts +2 -0
  203. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.d.ts.map +1 -1
  204. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.js +2 -0
  205. package/dist/routes/api/v1/billing/cancel/route.d.ts +2 -0
  206. package/dist/routes/api/v1/billing/cancel/route.d.ts.map +1 -1
  207. package/dist/routes/api/v1/billing/cancel/route.js +2 -0
  208. package/dist/routes/api/v1/billing/change-plan/route.d.ts +2 -0
  209. package/dist/routes/api/v1/billing/change-plan/route.d.ts.map +1 -1
  210. package/dist/routes/api/v1/billing/change-plan/route.js +2 -0
  211. package/dist/routes/api/v1/billing/check-action/route.d.ts +2 -0
  212. package/dist/routes/api/v1/billing/check-action/route.d.ts.map +1 -1
  213. package/dist/routes/api/v1/billing/check-action/route.js +2 -0
  214. package/dist/routes/api/v1/billing/checkout/route.d.ts +2 -0
  215. package/dist/routes/api/v1/billing/checkout/route.d.ts.map +1 -1
  216. package/dist/routes/api/v1/billing/checkout/route.js +2 -0
  217. package/dist/routes/api/v1/billing/plans/route.d.ts +2 -0
  218. package/dist/routes/api/v1/billing/plans/route.d.ts.map +1 -1
  219. package/dist/routes/api/v1/billing/plans/route.js +2 -0
  220. package/dist/routes/api/v1/billing/portal/route.d.ts +2 -0
  221. package/dist/routes/api/v1/billing/portal/route.d.ts.map +1 -1
  222. package/dist/routes/api/v1/billing/portal/route.js +2 -0
  223. package/dist/routes/api/v1/blocks/[slug]/route.d.ts +2 -0
  224. package/dist/routes/api/v1/blocks/[slug]/route.d.ts.map +1 -1
  225. package/dist/routes/api/v1/blocks/[slug]/route.js +2 -0
  226. package/dist/routes/api/v1/blocks/route.d.ts +2 -0
  227. package/dist/routes/api/v1/blocks/route.d.ts.map +1 -1
  228. package/dist/routes/api/v1/blocks/route.js +2 -0
  229. package/dist/routes/api/v1/blocks/validate/route.d.ts +2 -0
  230. package/dist/routes/api/v1/blocks/validate/route.d.ts.map +1 -1
  231. package/dist/routes/api/v1/blocks/validate/route.js +2 -0
  232. package/dist/routes/api/v1/devtools/blocks/route.d.ts +2 -1
  233. package/dist/routes/api/v1/devtools/blocks/route.d.ts.map +1 -1
  234. package/dist/routes/api/v1/devtools/blocks/route.js +2 -9
  235. package/dist/routes/api/v1/devtools/docs/route.d.ts +2 -0
  236. package/dist/routes/api/v1/devtools/docs/route.d.ts.map +1 -1
  237. package/dist/routes/api/v1/devtools/docs/route.js +2 -0
  238. package/dist/routes/api/v1/devtools/features/route.d.ts +2 -1
  239. package/dist/routes/api/v1/devtools/features/route.d.ts.map +1 -1
  240. package/dist/routes/api/v1/devtools/features/route.js +2 -9
  241. package/dist/routes/api/v1/devtools/flows/route.d.ts +2 -1
  242. package/dist/routes/api/v1/devtools/flows/route.d.ts.map +1 -1
  243. package/dist/routes/api/v1/devtools/flows/route.js +2 -9
  244. package/dist/routes/api/v1/devtools/scheduled-actions/route.d.ts +2 -1
  245. package/dist/routes/api/v1/devtools/scheduled-actions/route.d.ts.map +1 -1
  246. package/dist/routes/api/v1/devtools/scheduled-actions/route.js +2 -9
  247. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.d.ts +2 -1
  248. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.d.ts.map +1 -1
  249. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.js +2 -9
  250. package/dist/routes/api/v1/devtools/testing/route.d.ts +2 -1
  251. package/dist/routes/api/v1/devtools/testing/route.d.ts.map +1 -1
  252. package/dist/routes/api/v1/devtools/testing/route.js +2 -9
  253. package/dist/routes/api/v1/media/[id]/route.d.ts +2 -0
  254. package/dist/routes/api/v1/media/[id]/route.d.ts.map +1 -1
  255. package/dist/routes/api/v1/media/[id]/route.js +2 -0
  256. package/dist/routes/api/v1/media/[id]/tags/route.d.ts +2 -0
  257. package/dist/routes/api/v1/media/[id]/tags/route.d.ts.map +1 -1
  258. package/dist/routes/api/v1/media/[id]/tags/route.js +2 -0
  259. package/dist/routes/api/v1/media/check-duplicates/route.d.ts +2 -0
  260. package/dist/routes/api/v1/media/check-duplicates/route.d.ts.map +1 -1
  261. package/dist/routes/api/v1/media/check-duplicates/route.js +2 -0
  262. package/dist/routes/api/v1/media/route.d.ts +2 -0
  263. package/dist/routes/api/v1/media/route.d.ts.map +1 -1
  264. package/dist/routes/api/v1/media/route.js +2 -0
  265. package/dist/routes/api/v1/media/upload/route.d.ts +2 -0
  266. package/dist/routes/api/v1/media/upload/route.d.ts.map +1 -1
  267. package/dist/routes/api/v1/media/upload/route.js +2 -0
  268. package/dist/routes/api/v1/media-tags/route.d.ts +2 -0
  269. package/dist/routes/api/v1/media-tags/route.d.ts.map +1 -1
  270. package/dist/routes/api/v1/media-tags/route.js +2 -0
  271. package/dist/routes/api/v1/post-categories/[id]/route.d.ts +2 -0
  272. package/dist/routes/api/v1/post-categories/[id]/route.d.ts.map +1 -1
  273. package/dist/routes/api/v1/post-categories/[id]/route.js +2 -0
  274. package/dist/routes/api/v1/post-categories/route.d.ts +2 -0
  275. package/dist/routes/api/v1/post-categories/route.d.ts.map +1 -1
  276. package/dist/routes/api/v1/post-categories/route.js +2 -0
  277. package/dist/routes/api/v1/teams/[teamId]/members/route.js +2 -2
  278. package/dist/routes/api/v1/teams/[teamId]/subscription/route.d.ts +2 -0
  279. package/dist/routes/api/v1/teams/[teamId]/subscription/route.d.ts.map +1 -1
  280. package/dist/routes/api/v1/teams/[teamId]/subscription/route.js +2 -0
  281. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.d.ts +2 -0
  282. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.d.ts.map +1 -1
  283. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.js +2 -0
  284. package/dist/routes/api/v1/users/[id]/route.d.ts.map +1 -1
  285. package/dist/routes/api/v1/users/[id]/route.js +3 -2
  286. package/dist/routes/api/v1/users/docs.md +34 -19
  287. package/dist/routes/api/v1/users/me/route.d.ts +6 -0
  288. package/dist/routes/api/v1/users/me/route.d.ts.map +1 -0
  289. package/dist/routes/api/v1/users/me/route.js +5 -0
  290. package/dist/routes/api/v1/users/presets.ts +2 -2
  291. package/dist/routes/dashboard/(main)/layout.cc.d.ts +4 -0
  292. package/dist/routes/dashboard/(main)/layout.cc.d.ts.map +1 -0
  293. package/dist/routes/dashboard/(main)/layout.cc.js +10 -0
  294. package/dist/routes/dashboard/(main)/layout.d.ts.map +1 -1
  295. package/dist/routes/dashboard/(main)/layout.js +3 -44
  296. package/dist/routes/dashboard/permission-denied/page.d.ts +1 -1
  297. package/dist/routes/dashboard/permission-denied/page.d.ts.map +1 -1
  298. package/dist/routes/dashboard/permission-denied/page.js +5 -1
  299. package/dist/routes/devtools/layout.cc.d.ts.map +1 -1
  300. package/dist/routes/devtools/layout.cc.js +5 -1
  301. package/dist/routes/manifest.json +10 -0
  302. package/dist/routes/robots.d.ts +10 -0
  303. package/dist/routes/robots.d.ts.map +1 -0
  304. package/dist/routes/robots.js +10 -0
  305. package/dist/routes/superadmin/layout.cc.d.ts.map +1 -1
  306. package/dist/routes/superadmin/layout.cc.js +5 -1
  307. package/dist/routes/variants.json +12 -2
  308. package/dist/templates/next.config.mjs +2 -29
  309. package/dist/templates/projects/blog/api/authors/[username]/route.ts +3 -0
  310. package/dist/templates/projects/blog/api/authors/route.ts +3 -0
  311. package/dist/templates/projects/blog/api/posts/public/route.ts +3 -0
  312. package/dist/templates/proxy.ts +12 -1
  313. package/dist/templates/public/favicon.ico +0 -0
  314. package/package.json +2 -2
  315. package/scripts/build/registry/__tests__/api-docs-colocated.test.mjs +3 -0
  316. package/scripts/build/registry/__tests__/billing-registry.test.mjs +50 -1
  317. package/scripts/build/registry/__tests__/block-registry.test.mjs +3 -0
  318. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +3 -0
  319. package/scripts/build/registry/__tests__/quiet-console.mjs +17 -0
  320. package/scripts/build/registry/__tests__/safe-fs.test.mjs +3 -0
  321. package/scripts/build/registry/__tests__/team-roles.test.mjs +3 -0
  322. package/scripts/build/registry/discovery/permissions.test.mjs +3 -0
  323. package/scripts/build/registry/discovery/plugin-capabilities.mjs +2 -2
  324. package/scripts/build/registry/generators/billing-registry.mjs +7 -3
  325. package/scripts/build/registry/host/README.md +25 -1
  326. package/scripts/build/registry/host/__tests__/host-area-access.test.mjs +32 -0
  327. package/scripts/build/registry/host/__tests__/host-entities.test.mjs +32 -1
  328. package/scripts/build/registry/host/__tests__/host-plan.test.mjs +12 -2
  329. package/scripts/build/registry/host/entity-routes.mjs +9 -3
  330. package/scripts/build/registry/host/static-imports.mjs +4 -0
  331. package/scripts/build/routes-manifest.mjs +13 -1
  332. package/scripts/db/ssl-config.mjs +12 -1
  333. package/templates/next.config.mjs +2 -29
  334. package/templates/projects/blog/api/authors/[username]/route.ts +3 -0
  335. package/templates/projects/blog/api/authors/route.ts +3 -0
  336. package/templates/projects/blog/api/posts/public/route.ts +3 -0
  337. package/templates/proxy.ts +12 -1
  338. package/templates/public/favicon.ico +0 -0
@@ -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" })
@@ -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
@@ -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"}
@@ -12,6 +12,7 @@ import { SkeletonEntityList } from "../../ui/skeleton-list.js";
12
12
  import { SearchInput } from "../../shared/SearchInput.js";
13
13
  import { MultiSelectFilter } from "../../shared/MultiSelectFilter.js";
14
14
  import { useEntityConfig } from "../../../hooks/useEntityConfig.js";
15
+ import { useAuth } from "../../../hooks/useAuth.js";
15
16
  import { useUrlFilters } from "../../../hooks/useUrlFilters.js";
16
17
  import { listEntityData, deleteEntityData, duplicateEntityData } from "../../../lib/api/entities.js";
17
18
  import { useTeam } from "../../../hooks/useTeam.js";
@@ -24,6 +25,8 @@ function EntityListWrapper({
24
25
  headerActions
25
26
  }) {
26
27
  var _a, _b;
28
+ const { user } = useAuth();
29
+ const signedIn = Boolean(user);
27
30
  const router = useRouter();
28
31
  const { config: entityConfig, isLoading, error: configError, isOverride } = useEntityConfig(entityType);
29
32
  const { teamId } = useTeam();
@@ -122,7 +125,7 @@ function EntityListWrapper({
122
125
  return true;
123
126
  }, [filters, entityConfig == null ? void 0 : entityConfig.ui.dashboard.filters, schemaKeysForSync]);
124
127
  useEffect(() => {
125
- if (!(entityConfig == null ? void 0 : entityConfig.slug)) return;
128
+ if (!(entityConfig == null ? void 0 : entityConfig.slug) || !signedIn) return;
126
129
  if (!filtersMatchUrl) return;
127
130
  const isInitial = !hasLoadedRef.current;
128
131
  const filtersChanged = prevFiltersKeyRef.current !== filtersKey;
@@ -131,7 +134,7 @@ function EntityListWrapper({
131
134
  hasLoadedRef.current = true;
132
135
  loadData(isInitial);
133
136
  }
134
- }, [entityConfig == null ? void 0 : entityConfig.slug, filtersKey, filtersMatchUrl, loadData]);
137
+ }, [entityConfig == null ? void 0 : entityConfig.slug, filtersKey, filtersMatchUrl, loadData, signedIn]);
135
138
  const handleSearch = useCallback((query) => {
136
139
  setFilter("search", query);
137
140
  }, [setFilter]);
@@ -1 +1 @@
1
- {"version":3,"file":"relation-display.d.ts","sourceRoot":"","sources":["../../../src/components/ui/relation-display.tsx"],"names":[],"mappings":"AAMA,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAGD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAgB,EAChB,MAAM,EACP,EAAE,oBAAoB,2CAgJtB"}
1
+ {"version":3,"file":"relation-display.d.ts","sourceRoot":"","sources":["../../../src/components/ui/relation-display.tsx"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAGD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAgB,EAChB,MAAM,EACP,EAAE,oBAAoB,2CAgJtB"}