@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
@@ -3,6 +3,7 @@ import { generateEntityAPI } from "./api-generator.js";
3
3
  import { getEntityConfig } from "./registry.js";
4
4
  import { rateLimit } from "../rate-limit.js";
5
5
  import { validateAPIKey } from "../auth/api-keys.js";
6
+ import { getClientIp } from "../api/client-ip.js";
6
7
  function generateExternalAPI(entityName, options = {}) {
7
8
  const entityConfig = getEntityConfig(entityName);
8
9
  if (!entityConfig) {
@@ -168,10 +169,7 @@ function createErrorResponse(status, message, details) {
168
169
  }, { status });
169
170
  }
170
171
  function getClientIdentifier(request) {
171
- const apiKeyId = request.headers.get("x-api-key-id");
172
- const clientId = request.headers.get("x-client-id");
173
- const ip = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || "unknown";
174
- return apiKeyId || clientId || ip;
172
+ return getClientIp(request.headers);
175
173
  }
176
174
  function generateOpenAPISpec(entityName) {
177
175
  const entityConfig = getEntityConfig(entityName);
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Slugs of public entities (#215)
3
+ *
4
+ * A slug that ends up in a public URL is validated on write, with the one format the templates' pages and
5
+ * posts tables enforce (`validatePageSlug`): lowercase letters, digits and hyphens, no dot. Reserved words
6
+ * are refused only for an entity served at the site root (`access.basePath: '/'`), where they would shadow
7
+ * a route. Existing rows are not rewritten, and a slug that did not change is never judged (the callers check).
8
+ */
9
+ import type { EntityConfig } from './types';
10
+ /** What the slug rule reads of an entity: the server's config, or the client registry's lighter one. */
11
+ export interface SlugScope {
12
+ access?: {
13
+ basePath?: string;
14
+ allowNestedSlugs?: boolean;
15
+ };
16
+ builder?: {
17
+ public?: {
18
+ basePath?: string;
19
+ };
20
+ };
21
+ }
22
+ /** Whether the entity has a `slug` field that becomes part of a public URL. */
23
+ export declare function hasPublicSlug(entity: EntityConfig): boolean;
24
+ /**
25
+ * The first segments of the base paths the other entities are served under (`/blog/x` -> `blog`): a root page with
26
+ * that slug would be shadowed by their routes.
27
+ */
28
+ export declare function otherBasePathSegments(entity: SlugScope, entities: readonly (SlugScope & {
29
+ slug?: string;
30
+ })[]): string[];
31
+ /**
32
+ * The reason `slug` cannot be a public slug of `entity`, or null when it can. `taken` are the base path segments
33
+ * of the other entities (`otherBasePathSegments`), reserved for an entity at the site root.
34
+ */
35
+ export declare function validatePublicSlug(entity: SlugScope, slug: string, taken?: readonly string[]): string | null;
36
+ /**
37
+ * The validation issue (Zod's shape, so clients read it like any other field error) for the `slug` of a
38
+ * write body, or null: the entity has no public slug, the body does not carry one (an update that leaves it
39
+ * alone), or it is valid. Meant to run after the schema accepted the body, so a present slug is a string or null.
40
+ */
41
+ export declare function publicSlugIssue(entity: EntityConfig, data: Record<string, unknown>, taken?: readonly string[]): {
42
+ code: string;
43
+ path: string[];
44
+ message: string;
45
+ };
46
+ //# sourceMappingURL=public-slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-slug.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/public-slug.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAG3C,wGAAwG;AACxG,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,CAAA;IAC1D,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CAC7C;AAKD,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAKvH;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,GAAG,IAAI,CAWhH;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,GAAE,SAAS,MAAM,EAAO;;;;EAIjH"}
@@ -0,0 +1,39 @@
1
+ import { validatePageSlug } from "../constants/reserved-slugs.js";
2
+ const basePathOf = (entity) => {
3
+ var _a, _b, _c;
4
+ return ((_a = entity.access) == null ? void 0 : _a.basePath) ?? ((_c = (_b = entity.builder) == null ? void 0 : _b.public) == null ? void 0 : _c.basePath);
5
+ };
6
+ function hasPublicSlug(entity) {
7
+ var _a;
8
+ return entity.fields.some((field) => field.name === "slug") && (((_a = entity.access) == null ? void 0 : _a.public) === true || basePathOf(entity) !== void 0);
9
+ }
10
+ function otherBasePathSegments(entity, entities) {
11
+ return entities.filter((other) => other !== entity).map((other) => {
12
+ var _a;
13
+ return (_a = basePathOf(other)) == null ? void 0 : _a.split("/").filter(Boolean)[0];
14
+ }).filter((segment) => Boolean(segment));
15
+ }
16
+ function validatePublicSlug(entity, slug, taken = []) {
17
+ var _a;
18
+ const atRoot = basePathOf(entity) === "/";
19
+ const segments = slug.split("/");
20
+ if (segments.length > 1 && !(atRoot ? (_a = entity.access) == null ? void 0 : _a.allowNestedSlugs : basePathOf(entity))) {
21
+ return "Slug cannot contain slashes";
22
+ }
23
+ for (const [index, segment] of segments.entries()) {
24
+ const reason = validatePageSlug(segment, { checkReserved: atRoot && index === 0, reserved: taken });
25
+ if (reason) return reason;
26
+ }
27
+ return null;
28
+ }
29
+ function publicSlugIssue(entity, data, taken = []) {
30
+ if (!hasPublicSlug(entity) || typeof data.slug !== "string") return null;
31
+ const message = validatePublicSlug(entity, data.slug, taken);
32
+ return message ? { code: "custom", path: ["slug"], message } : null;
33
+ }
34
+ export {
35
+ hasPublicSlug,
36
+ otherBasePathSegments,
37
+ publicSlugIssue,
38
+ validatePublicSlug
39
+ };
@@ -1,9 +1,4 @@
1
- /**
2
- * Signup page for a host with `cacheComponents` on (variant of ./page).
3
- *
4
- * Same page and metadata; `dynamic = 'force-dynamic'` is left out because Next.js fails a build that
5
- * has it under Cache Components. The page reads the database and calls redirect(); under Cache Components
6
- * the group or root layout puts it behind Suspense, so the redirect streams per request, after the static shell.
7
- */
8
- export { default, metadata } from './page';
1
+ import { metadata } from './page';
2
+ export { metadata };
3
+ export default function SignupPageCc(): import("react/jsx-runtime").JSX.Element;
9
4
  //# sourceMappingURL=page.cc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"page.cc.d.ts","sourceRoot":"","sources":["../../../../src/routes/(auth)/signup/page.cc.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"page.cc.d.ts","sourceRoot":"","sources":["../../../../src/routes/(auth)/signup/page.cc.tsx"],"names":[],"mappings":"AAUA,OAAmB,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,CAAA;AAEnB,MAAM,CAAC,OAAO,UAAU,YAAY,4CAMnC"}
@@ -1 +1,7 @@
1
- export { default, metadata } from "./page.js";
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Suspense } from "react";
3
+ import SignupPage, { metadata } from "./page.js";
4
+ export { metadata };
5
+ export default function SignupPageCc() {
6
+ return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(SignupPage, {}) });
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../src/routes/(auth)/verify-email/page.tsx"],"names":[],"mappings":"AA+KA,iBAAS,eAAe,4CAUvB;AAGD,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../src/routes/(auth)/verify-email/page.tsx"],"names":[],"mappings":"AAgLA,iBAAS,eAAe,4CAUvB;AAGD,eAAe,eAAe,CAAA"}
@@ -7,6 +7,7 @@ import { Button } from "@nextsparkjs/core/components/ui/button";
7
7
  import { Alert, AlertDescription } from "@nextsparkjs/core/components/ui/alert";
8
8
  import { sel } from "@nextsparkjs/core/selectors/auth";
9
9
  import { withBasePath } from "@nextsparkjs/core/lib/base-path";
10
+ import { VERIFY_FROM_UI_HEADER } from "@nextsparkjs/core/lib/api/client-headers";
10
11
  function VerifyEmailContent() {
11
12
  const searchParams = useSearchParams();
12
13
  const router = useRouter();
@@ -26,7 +27,7 @@ function VerifyEmailContent() {
26
27
  method: "GET",
27
28
  credentials: "include",
28
29
  headers: {
29
- "x-verify-from-ui": "true"
30
+ [VERIFY_FROM_UI_HEADER]: "true"
30
31
  }
31
32
  });
32
33
  if (!response.ok) {
@@ -0,0 +1,3 @@
1
+ declare const _default: (props: object) => import("react/jsx-runtime").JSX.Element;
2
+ export default _default;
3
+ //# sourceMappingURL=page.cc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/(public)/page.cc.tsx"],"names":[],"mappings":";AASA,wBAAgD"}
@@ -0,0 +1,3 @@
1
+ import { behindSuspense } from "../_internal/suspended-route.js";
2
+ import DefaultPublicHome from "./page.js";
3
+ export default behindSuspense(DefaultPublicHome);
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The per-segment role check of /superadmin and /devtools for a host with `cacheComponents` on (the `access` of the
3
+ * area layouts' variants in ../variants.json). Same rules and same check as `area-access`; only where it runs moves.
4
+ *
5
+ * `withSuperadminAccess(Page)` in `area-access` awaits the session before it returns the page, so the segment has no
6
+ * Suspense boundary between it and request-time work: a navigation into it would wait, and the dev server reports it
7
+ * ("Could not validate that a segment in your UI has instant navigation ... dropped segment"). Here the segment is a
8
+ * Suspense boundary (fallback: nothing) around the check, and the page or layout renders inside it only once the
9
+ * check has passed: no session -> /login, a session without the role -> /dashboard?error=access_denied, and the
10
+ * segment's content is never rendered for either. What the prerendered shell holds of the segment is the empty
11
+ * fallback.
12
+ *
13
+ * `generateMetadata` and Route Handlers keep the checks of `area-access` (nothing to prerender there).
14
+ */
15
+ import { type ComponentType } from 'react';
16
+ export { withSuperadminMetadata, withDevtoolsMetadata, withSuperadminRouteAccess, withDevtoolsRouteAccess } from './area-access';
17
+ /** A page or layout under /superadmin, rendered only for superadmin and developer sessions, inside its own boundary. */
18
+ export declare function withSuperadminAccess<P extends object>(Segment: ComponentType<P>): (props: P) => import("react/jsx-runtime").JSX.Element;
19
+ /** A page or layout under /devtools, rendered only for developer sessions, inside its own boundary. */
20
+ export declare function withDevtoolsAccess<P extends object>(Segment: ComponentType<P>): (props: P) => import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=area-access.cc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"area-access.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/area-access.cc.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,OAAO,CAAA;AAGpD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAA;AAgBhI,wHAAwH;AACxH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,yDAE/E;AAED,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,yDAE7E"}
@@ -0,0 +1,19 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Suspense } from "react";
3
+ import { requireAreaAccess } from "./area-access.js";
4
+ export { withSuperadminMetadata, withDevtoolsMetadata, withSuperadminRouteAccess, withDevtoolsRouteAccess } from "./area-access.js";
5
+ function withAreaAccess(area, Segment) {
6
+ async function AreaSegmentGate(props) {
7
+ await requireAreaAccess(area);
8
+ return /* @__PURE__ */ jsx(Segment, { ...props });
9
+ }
10
+ return function AreaSegment(props) {
11
+ return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(AreaSegmentGate, { ...props }) });
12
+ };
13
+ }
14
+ export function withSuperadminAccess(Segment) {
15
+ return withAreaAccess("superadmin", Segment);
16
+ }
17
+ export function withDevtoolsAccess(Segment) {
18
+ return withAreaAccess("devtools", Segment);
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"auth-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/auth-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAKpC,eAAO,MAAM,eAAe,EAAE,QAU7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,QAA0B,CAAA;AAEjD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,IAC1C,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,sDAQzF"}
1
+ {"version":3,"file":"auth-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/auth-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAMpC,eAAO,MAAM,eAAe,EAAE,QAU7B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,QAA0B,CAAA;AAEjD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,CAAC,IAC1C,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,sDAQzF"}
@@ -2,10 +2,11 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { NextIntlClientProvider } from "next-intl";
3
3
  import { getMessages } from "next-intl/server";
4
4
  import { selectMessages } from "@nextsparkjs/core/lib/i18n/client-messages";
5
+ import { APP_NAME } from "@nextsparkjs/core/lib/config/public-config-client";
5
6
  export const defaultMetadata = {
6
7
  title: {
7
- default: "Authentication | Boilerplate",
8
- template: "%s | Boilerplate"
8
+ default: `Authentication | ${APP_NAME}`,
9
+ template: `%s | ${APP_NAME}`
9
10
  },
10
11
  description: "Sign in or create an account to access our platform",
11
12
  robots: {
@@ -0,0 +1,7 @@
1
+ /** The dashboard shell with the navigation of every entity the project registers. */
2
+ export declare function MainDashboardShell({ children }: {
3
+ children: React.ReactNode;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ /** Sends a request for an entity route the signed-in user may not use to the permission-denied page. */
6
+ export declare function enforceEntityPermission(): Promise<void>;
7
+ //# sourceMappingURL=dashboard-main-shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-main-shared.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/dashboard-main-shared.tsx"],"names":[],"mappings":"AA8CA,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAO7E;AAED,wGAAwG;AACxG,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB7D"}
@@ -0,0 +1,49 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { headers } from "next/headers";
3
+ import { redirect } from "next/navigation";
4
+ import { DashboardShell } from "@nextsparkjs/core/components/dashboard/layouts/DashboardShell";
5
+ import { serializeEntityConfig } from "@nextsparkjs/core/lib/entities/serialization";
6
+ import { setEntityRegistry } from "@nextsparkjs/core/lib/entities/queries";
7
+ import { checkPermission } from "@nextsparkjs/core/lib/permissions/check";
8
+ import { getDashboardPermissionContext } from "@nextsparkjs/core/lib/auth/request-session";
9
+ import { isValidPermission } from "@nextsparkjs/core/lib/permissions/init";
10
+ import { ENTITY_REGISTRY, ENTITY_METADATA } from "@nextsparkjs/registries/entity-registry";
11
+ setEntityRegistry(ENTITY_REGISTRY, ENTITY_METADATA);
12
+ function parseEntityFromPathname(pathname) {
13
+ const match = pathname.match(/^\/dashboard\/([^/]+)(?:\/(.*))?$/);
14
+ if (!match) return null;
15
+ const entity = match[1];
16
+ const rest = match[2] || "";
17
+ if (rest === "" || rest === "/") return { entity, action: "list" };
18
+ if (rest === "create") return { entity, action: "create" };
19
+ if (rest.match(/^[^/]+\/edit$/)) return { entity, action: "update" };
20
+ if (rest.match(/^[^/]+$/)) return { entity, action: "read" };
21
+ return { entity, action: "read" };
22
+ }
23
+ function isEntityConfig(entity) {
24
+ return "slug" in entity;
25
+ }
26
+ export function MainDashboardShell({ children }) {
27
+ const allEntities = Object.values(ENTITY_REGISTRY).map((entry) => entry.config);
28
+ const entities = allEntities.filter(isEntityConfig);
29
+ const serializedEntities = entities.map(serializeEntityConfig);
30
+ return /* @__PURE__ */ jsx(DashboardShell, { entities: serializedEntities, children });
31
+ }
32
+ export async function enforceEntityPermission() {
33
+ const headersList = await headers();
34
+ const pathname = headersList.get("x-pathname") || "";
35
+ const { userId, teamId } = await getDashboardPermissionContext();
36
+ if (userId && teamId && pathname) {
37
+ const parsed = parseEntityFromPathname(pathname);
38
+ if (parsed) {
39
+ const { entity, action } = parsed;
40
+ const permission = `${entity}.${action}`;
41
+ if (isValidPermission(`${entity}.list`)) {
42
+ const hasPermission = await checkPermission(userId, teamId, permission);
43
+ if (!hasPermission) {
44
+ redirect(`/dashboard/permission-denied?entity=${entity}&action=${action}`);
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"default-auth-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/default-auth-layout.tsx"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA6B5E"}
1
+ {"version":3,"file":"default-auth-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/default-auth-layout.tsx"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CA+B5E"}
@@ -1,12 +1,13 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Suspense } from "react";
3
3
  import { AuthWrapper } from "@nextsparkjs/core/components/auth/layouts/AuthWrapper";
4
+ import { APP_DESCRIPTION, APP_NAME } from "@nextsparkjs/core/lib/config/public-config-client";
4
5
  export function DefaultAuthLayout({ children }) {
5
6
  return /* @__PURE__ */ jsx("div", { className: "min-h-screen bg-gradient-to-b from-background to-muted/20 flex items-center justify-center p-4", children: /* @__PURE__ */ jsxs("div", { className: "w-full max-w-md", children: [
6
7
  /* @__PURE__ */ jsxs("div", { className: "bg-card rounded-lg shadow-lg border border-border p-8", children: [
7
8
  /* @__PURE__ */ jsxs("div", { className: "text-center mb-8", children: [
8
- /* @__PURE__ */ jsx("h1", { className: "text-3xl font-bold text-foreground mb-2", children: "Boilerplate" }),
9
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "Modern Full-Stack Application" })
9
+ /* @__PURE__ */ jsx("h1", { className: "text-3xl font-bold text-foreground mb-2", children: APP_NAME }),
10
+ APP_DESCRIPTION && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: APP_DESCRIPTION })
10
11
  ] }),
11
12
  /* @__PURE__ */ jsx(AuthWrapper, { children: /* @__PURE__ */ jsx(Suspense, { fallback: null, children }) })
12
13
  ] }),
@@ -10,8 +10,9 @@ export declare const withDevtoolsAreaMessages: (Layout: ComponentType<DevLayoutP
10
10
  /**
11
11
  * What a project's devtools layout is composed with in Cache Components mode (the manifest's `compose` of that
12
12
  * variant): the mode's messages and the server-side role check, then core's client guard around the project's layout,
13
- * as `withDevtoolsGuard` does in the ISR module. A module of its own so only the devtools route group imports the guard,
14
- * the role check and their client components.
13
+ * as `withDevtoolsGuard` does in the ISR module. The guard is told the server checked the role (`serverChecked`), so it
14
+ * renders the area while the client session loads. A module of its own so only the devtools route group imports the
15
+ * guard, the role check and their client components.
15
16
  */
16
17
  export declare const withDevtoolsGuard: (ProjectLayout: ComponentType<DevLayoutProps>) => ({ children }: {
17
18
  children: import("react").ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-layout.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/devtools-layout.cc.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAG5E;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAQ,aAAa,CAAC,cAAc,CAAC;;6CAA2D,CAAA;AAEzI;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,eAAe,aAAa,CAAC,cAAc,CAAC;;6CAAiE,CAAA"}
1
+ {"version":3,"file":"devtools-layout.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/devtools-layout.cc.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAG5E;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,QAAQ,aAAa,CAAC,cAAc,CAAC;;6CAA2D,CAAA;AAEzI;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAI,eAAe,aAAa,CAAC,cAAc,CAAC;;6CAAuE,CAAA"}
@@ -2,4 +2,4 @@ import { withDevtoolsMessages } from "./group-layouts.cc.js";
2
2
  import { guardDevtoolsLayout } from "./devtools-layout.js";
3
3
  import { withAreaGate } from "./area-access.js";
4
4
  export const withDevtoolsAreaMessages = (Layout) => withDevtoolsMessages(withAreaGate("devtools", Layout));
5
- export const withDevtoolsGuard = (ProjectLayout) => withDevtoolsAreaMessages(guardDevtoolsLayout(ProjectLayout));
5
+ export const withDevtoolsGuard = (ProjectLayout) => withDevtoolsAreaMessages(guardDevtoolsLayout(ProjectLayout, true));
@@ -4,6 +4,10 @@ export declare const defaultMetadata: Metadata;
4
4
  export interface DevLayoutProps {
5
5
  children: React.ReactNode;
6
6
  }
7
+ /** `serverChecked`: see DeveloperGuard (only the Cache Components module passes it, after its role check). */
8
+ type GuardedProps = DevLayoutProps & {
9
+ serverChecked?: boolean;
10
+ };
7
11
  /**
8
12
  * Developer Area Layout
9
13
  *
@@ -12,7 +16,7 @@ export interface DevLayoutProps {
12
16
  * Includes responsive design for mobile and desktop.
13
17
  * Uses purple/violet color scheme to differentiate from Admin Panel (red).
14
18
  */
15
- export declare function DevLayout({ children }: DevLayoutProps): import("react/jsx-runtime").JSX.Element;
19
+ export declare function DevLayout({ children, serverChecked }: GuardedProps): import("react/jsx-runtime").JSX.Element;
16
20
  /**
17
21
  * Wraps a layout for this route group in the group's client messages, after the server-side role check
18
22
  * (area-access): it runs before anything is rendered or sent, so a page load without the role gets a 307. The
@@ -27,10 +31,11 @@ export declare function withDevtoolsMessages(ResolvedDevLayout: ComponentType<De
27
31
  * /devtools checks again, see area-access). Shared by the message wrappers of both rendering modes
28
32
  * (`withDevtoolsGuard` here, and in `group-layouts.cc`).
29
33
  */
30
- export declare function guardDevtoolsLayout(ProjectLayout: ComponentType<DevLayoutProps>): ({ children }: DevLayoutProps) => import("react/jsx-runtime").JSX.Element;
34
+ export declare function guardDevtoolsLayout(ProjectLayout: ComponentType<DevLayoutProps>, serverChecked?: boolean): ({ children }: DevLayoutProps) => import("react/jsx-runtime").JSX.Element;
31
35
  /**
32
36
  * The composition of a project's devtools layout with core (the generated host): messages, then
33
37
  * `guardDevtoolsLayout` around the project's layout.
34
38
  */
35
39
  export declare function withDevtoolsGuard(ProjectLayout: ComponentType<DevLayoutProps>): ({ children }: DevLayoutProps) => Promise<import("react/jsx-runtime").JSX.Element>;
40
+ export {};
36
41
  //# sourceMappingURL=devtools-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"devtools-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/devtools-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAK1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAOhC,eAAO,MAAM,eAAe,EAAE,QAI7B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAgCrD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,aAAa,CAAC,cAAc,CAAC,IACvC,cAAc,cAAc,sDASzE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,IAC7C,cAAc,cAAc,6CAS9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,kBAlClB,cAAc,sDAoCzE"}
1
+ {"version":3,"file":"devtools-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/devtools-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAK1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAOhC,eAAO,MAAM,eAAe,EAAE,QAI7B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,8GAA8G;AAC9G,KAAK,YAAY,GAAG,cAAc,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEhE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,YAAY,2CAgClE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,iBAAiB,EAAE,aAAa,CAAC,cAAc,CAAC,IACvC,cAAc,cAAc,sDASzE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,EAAE,aAAa,UAAQ,IACpE,cAAc,cAAc,6CAS9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,aAAa,CAAC,cAAc,CAAC,kBAlClB,cAAc,sDAoCzE"}
@@ -14,9 +14,9 @@ export const defaultMetadata = {
14
14
  robots: "noindex, nofollow"
15
15
  // Prevent search engine indexing
16
16
  };
17
- export function DevLayout({ children }) {
17
+ export function DevLayout({ children, serverChecked }) {
18
18
  const pluginNavItems = getAllPluginNavItems("devtools");
19
- return /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(DeveloperGuard, { children: /* @__PURE__ */ jsxs("div", { className: "flex h-screen bg-background", children: [
19
+ return /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(DeveloperGuard, { serverChecked, children: /* @__PURE__ */ jsxs("div", { className: "flex h-screen bg-background", children: [
20
20
  /* @__PURE__ */ jsx("div", { className: "hidden lg:block", children: /* @__PURE__ */ jsx(DevtoolsSidebar, { pluginItems: pluginNavItems }) }),
21
21
  /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col overflow-hidden", children: [
22
22
  /* @__PURE__ */ jsx(DevtoolsMobileHeader, {}),
@@ -31,9 +31,9 @@ export function withDevtoolsMessages(ResolvedDevLayout) {
31
31
  return /* @__PURE__ */ jsx(NextIntlClientProvider, { messages: selectMessages(messages, "devtools"), children: /* @__PURE__ */ jsx(ResolvedDevLayout, { children }) });
32
32
  };
33
33
  }
34
- export function guardDevtoolsLayout(ProjectLayout) {
34
+ export function guardDevtoolsLayout(ProjectLayout, serverChecked = false) {
35
35
  return function GuardedDevLayout({ children }) {
36
- return /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(DeveloperGuard, { children: /* @__PURE__ */ jsx(ProjectLayout, { children }) }) });
36
+ return /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(DeveloperGuard, { serverChecked, children: /* @__PURE__ */ jsx(ProjectLayout, { children }) }) });
37
37
  };
38
38
  }
39
39
  export function withDevtoolsGuard(ProjectLayout) {
@@ -0,0 +1,8 @@
1
+ import { createEntityDetailRoute as createRoute } from './entity-detail-route';
2
+ export type { EntityDetailTemplateProps } from './entity-detail-route';
3
+ export declare function createEntityDetailRoute(...args: Parameters<typeof createRoute>): (props: {
4
+ params: Promise<{
5
+ id: string;
6
+ }>;
7
+ }) => import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=entity-detail-route.cc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-detail-route.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/entity-detail-route.cc.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,IAAI,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAE9E,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AAEtE,wBAAgB,uBAAuB,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC;;;;8CAE9E"}
@@ -0,0 +1,5 @@
1
+ import { behindSuspense } from "./suspended-route.js";
2
+ import { createEntityDetailRoute as createRoute } from "./entity-detail-route.js";
3
+ export function createEntityDetailRoute(...args) {
4
+ return behindSuspense(createRoute(...args));
5
+ }
@@ -0,0 +1,8 @@
1
+ import { createEntityEditRoute as createRoute } from './entity-edit-route';
2
+ export type { EntityEditTemplateProps } from './entity-edit-route';
3
+ export declare function createEntityEditRoute(...args: Parameters<typeof createRoute>): (props: {
4
+ params: Promise<{
5
+ id: string;
6
+ }>;
7
+ }) => import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=entity-edit-route.cc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-edit-route.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/entity-edit-route.cc.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAE1E,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAElE,wBAAgB,qBAAqB,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC;;;;8CAE5E"}
@@ -0,0 +1,5 @@
1
+ import { behindSuspense } from "./suspended-route.js";
2
+ import { createEntityEditRoute as createRoute } from "./entity-edit-route.js";
3
+ export function createEntityEditRoute(...args) {
4
+ return behindSuspense(createRoute(...args));
5
+ }
@@ -13,7 +13,7 @@ type SearchParams = Promise<{
13
13
  /** @param config - the entity's config (`ui.public.hasArchivePage` decides whether the archive is served) */
14
14
  export declare function createPublicArchiveRoute(config: EntityConfig): ({ searchParams }: {
15
15
  searchParams: SearchParams;
16
- }) => Promise<import("react/jsx-runtime").JSX.Element>;
16
+ }) => import("react/jsx-runtime").JSX.Element;
17
17
  /** `generateMetadata` of an entity's archive page. */
18
18
  export declare function createPublicArchiveMetadata(config: EntityConfig): () => Promise<Metadata>;
19
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"public-archive-route.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/public-archive-route.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAExE,KAAK,YAAY,GAAG,OAAO,CAAC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CAAA;AAE7E,6GAA6G;AAC7G,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,IAClB,kBAAkB;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,sDAgB1F;AAED,sDAAsD;AACtD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,SACP,OAAO,CAAC,QAAQ,CAAC,CAMzE"}
1
+ {"version":3,"file":"public-archive-route.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/public-archive-route.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAGxE,KAAK,YAAY,GAAG,OAAO,CAAC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CAAA;AAW7E,6GAA6G;AAC7G,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,IACxB,kBAAkB;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,6CAkBpF;AAED,sDAAsD;AACtD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,SACP,OAAO,CAAC,QAAQ,CAAC,CAMzE"}
@@ -1,8 +1,13 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Suspense } from "react";
2
3
  import { notFound } from "next/navigation";
3
4
  import { PublicEntityGrid } from "@nextsparkjs/core/components/public/entities/PublicEntityGrid";
5
+ import { APP_NAME } from "@nextsparkjs/core/lib/config/public-config-client";
6
+ async function ArchiveGrid({ config, searchParams }) {
7
+ return /* @__PURE__ */ jsx(PublicEntityGrid, { entityType: config.slug, entitySlug: config.slug, searchParams: await searchParams });
8
+ }
4
9
  export function createPublicArchiveRoute(config) {
5
- return async function PublicArchiveRoute({ searchParams }) {
10
+ return function PublicArchiveRoute({ searchParams }) {
6
11
  var _a, _b, _c, _d, _e, _f;
7
12
  if (!((_b = (_a = config.ui) == null ? void 0 : _a.public) == null ? void 0 : _b.hasArchivePage)) notFound();
8
13
  const hasBasePath = Boolean(((_c = config.access) == null ? void 0 : _c.basePath) ?? ((_e = (_d = config.builder) == null ? void 0 : _d.public) == null ? void 0 : _e.basePath));
@@ -15,14 +20,14 @@ export function createPublicArchiveRoute(config) {
15
20
  config.names.plural.toLowerCase()
16
21
  ] })
17
22
  ] }),
18
- /* @__PURE__ */ jsx(PublicEntityGrid, { entityType: config.slug, entitySlug: config.slug, searchParams: await searchParams })
23
+ /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(ArchiveGrid, { config, searchParams }) })
19
24
  ] });
20
25
  };
21
26
  }
22
27
  export function createPublicArchiveMetadata(config) {
23
28
  return async function generatePublicArchiveMetadata() {
24
29
  return {
25
- title: `${config.names.plural} | Boilerplate`,
30
+ title: `${config.names.plural} | ${APP_NAME}`,
26
31
  description: `Browse all ${config.names.plural.toLowerCase()}`
27
32
  };
28
33
  };
@@ -1,5 +1,9 @@
1
1
  import type { EntityConfig } from '@nextsparkjs/core/lib/entities/types';
2
- export declare const createPublicItemRoute: (config: EntityConfig, Template?: import("react").ComponentType<import("./public-item-route").PublicItemTemplateProps>) => ({ params, searchParams }: import("./public-item-route").ItemRouteProps) => Promise<import("react/jsx-runtime").JSX.Element>;
2
+ declare const cachedRoutes: {
3
+ createPublicItemRoute: (config: EntityConfig, Template?: import("react").ComponentType<import("./public-item-route").PublicItemTemplateProps>) => ({ params, searchParams }: import("./public-item-route").ItemRouteProps) => Promise<import("react/jsx-runtime").JSX.Element>;
4
+ createPublicItemMetadata: (config: EntityConfig) => ({ params }: Pick<import("./public-item-route").ItemRouteProps, "params">) => Promise<import("next").Metadata>;
5
+ };
6
+ export declare const createPublicItemRoute: (...args: Parameters<typeof cachedRoutes.createPublicItemRoute>) => (props: import("./public-item-route").ItemRouteProps) => import("react/jsx-runtime").JSX.Element;
3
7
  export declare const createPublicItemMetadata: (config: EntityConfig) => ({ params }: Pick<import("./public-item-route").ItemRouteProps, "params">) => Promise<import("next").Metadata>;
4
8
  export type { PublicItemTemplateProps } from './public-item-route';
5
9
  //# sourceMappingURL=public-item-route.cc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-item-route.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/public-item-route.cc.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAsCxE,eAAO,MAAM,qBAAqB,yPAAqC,CAAA;AACvE,eAAO,MAAM,wBAAwB,0IAAwC,CAAA;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"public-item-route.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/public-item-route.cc.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAsCxE,QAAA,MAAM,YAAY;;;CAAqC,CAAA;AAEvD,eAAO,MAAM,qBAAqB,GAAI,GAAG,MAAM,UAAU,CAAC,OAAO,YAAY,CAAC,qBAAqB,CAAC,qGAAgE,CAAA;AACpK,eAAO,MAAM,wBAAwB,0IAAwC,CAAA;AAC7E,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -3,6 +3,7 @@ import { query } from "@nextsparkjs/core/lib/db";
3
3
  import { PatternsResolverService } from "@nextsparkjs/core/lib/blocks/patterns-resolver.service";
4
4
  import { buildPublicSelectClause, getResolvedBlocks } from "./public-entity-shared.js";
5
5
  import { bindPublicItemRoutes } from "./public-item-route.js";
6
+ import { behindSuspense } from "./suspended-route.js";
6
7
  async function readPublishedItem(entitySlug, tableName, selectClause, slug) {
7
8
  "use cache";
8
9
  cacheLife({ stale: 300, revalidate: 3600, expire: 86400 });
@@ -28,5 +29,5 @@ const cachedSource = {
28
29
  resolveBlocks: (blocks) => getResolvedBlocks(blocks, readPatterns)
29
30
  };
30
31
  const cachedRoutes = bindPublicItemRoutes(cachedSource);
31
- export const createPublicItemRoute = cachedRoutes.createPublicItemRoute;
32
+ export const createPublicItemRoute = (...args) => behindSuspense(cachedRoutes.createPublicItemRoute(...args));
32
33
  export const createPublicItemMetadata = cachedRoutes.createPublicItemMetadata;
@@ -28,6 +28,13 @@ export interface ItemRouteProps {
28
28
  }>;
29
29
  searchParams: SearchParams;
30
30
  }
31
+ /**
32
+ * The extensions of the static files a browser or crawler asks a site for. A request for one that reaches an item route
33
+ * (`/favicon.ico`, `/robots.txt`, `/apple-touch-icon.png`) is not an item: it answers not found at once, without reading the
34
+ * database or rendering a template. A slug may contain a dot (`release-1.0`, `v2.5`), so only these extensions on the last
35
+ * segment count.
36
+ */
37
+ export declare const STATIC_FILE_EXTENSION: RegExp;
31
38
  /**
32
39
  * Where a public item comes from. The default reads the database on every render; `public-item-route.cc` (the
33
40
  * Cache Components host's module) supplies a cached one.
@@ -1 +1 @@
1
- {"version":3,"file":"public-item-route.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/public-item-route.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AACjF,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAElG,KAAK,YAAY,GAAG,OAAO,CAAC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CAAA;AAE7E,sGAAsG;AACtG,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjC,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC5C,YAAY,EAAE,YAAY,CAAA;CAC3B;AAKD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAC5E,oGAAoG;IACpG,aAAa,CAAC,MAAM,EAAE,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;CACtF;AAgED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB;oCAEzB,YAAY,aAAa,aAAa,CAAC,uBAAuB,CAAC,gCAlCjC,cAAc;uCAmCzC,YAAY,kBAvBY,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,KAAG,OAAO,CAAC,QAAQ,CAAC;EAyBhH;AAGD,eAAO,MAAM,qBAAqB,WANE,YAAY,aAAa,aAAa,CAAC,uBAAuB,CAAC,gCAlCjC,cAAc,qDAwCP,CAAA;AACzE,eAAO,MAAM,wBAAwB,WANE,YAAY,kBAvBY,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,KAAG,OAAO,CAAC,QAAQ,CA6BjC,CAAA"}
1
+ {"version":3,"file":"public-item-route.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/public-item-route.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAGpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAA;AACjF,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAGlG,KAAK,YAAY,GAAG,OAAO,CAAC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,CAAC,CAAA;AAE7E,sGAAsG;AACtG,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjC,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC5C,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,QAAuF,CAAA;AAOzH;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;IAC5E,oGAAoG;IACpG,aAAa,CAAC,MAAM,EAAE,CAAC,aAAa,GAAG,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;CACtF;AAkED,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB;oCAEzB,YAAY,aAAa,aAAa,CAAC,uBAAuB,CAAC,gCApCjC,cAAc;uCAqCzC,YAAY,kBAxBY,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,KAAG,OAAO,CAAC,QAAQ,CAAC;EA0BhH;AAGD,eAAO,MAAM,qBAAqB,WANE,YAAY,aAAa,aAAa,CAAC,uBAAuB,CAAC,gCApCjC,cAAc,qDA0CP,CAAA;AACzE,eAAO,MAAM,wBAAwB,WANE,YAAY,kBAxBY,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,KAAG,OAAO,CAAC,QAAQ,CA8BjC,CAAA"}
@@ -2,6 +2,9 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { notFound } from "next/navigation";
3
3
  import { PageRenderer } from "@nextsparkjs/core/components/public/pageBuilder";
4
4
  import { fetchPublishedItem, getResolvedBlocks } from "./public-entity-shared.js";
5
+ import { APP_NAME } from "@nextsparkjs/core/lib/config/public-config-client";
6
+ export const STATIC_FILE_EXTENSION = /\.(?:ico|png|jpe?g|gif|svg|webp|avif|txt|xml|json|webmanifest|map|js|css|woff2?)$/i;
7
+ const isFileRequest = (slug) => STATIC_FILE_EXTENSION.test(slug);
5
8
  const slugOf = (slug) => Array.isArray(slug) ? slug.join("/") : slug;
6
9
  const databaseSource = { fetchItem: fetchPublishedItem, resolveBlocks: getResolvedBlocks };
7
10
  async function renderDefaultPublicItem(source, entity, slug) {
@@ -24,6 +27,7 @@ async function renderDefaultPublicItem(source, entity, slug) {
24
27
  function itemRoute(source, config, Template) {
25
28
  return async function PublicItemRoute({ params, searchParams }) {
26
29
  const slug = slugOf((await params).slug);
30
+ if (isFileRequest(slug)) notFound();
27
31
  if (Template) return /* @__PURE__ */ jsx(Template, { params: Promise.resolve({ slug }), searchParams });
28
32
  const item = await renderDefaultPublicItem(source, config, slug);
29
33
  if (!item) notFound();
@@ -33,10 +37,11 @@ function itemRoute(source, config, Template) {
33
37
  function itemMetadata(source, config) {
34
38
  return async function generatePublicItemMetadata({ params }) {
35
39
  const slug = slugOf((await params).slug);
40
+ if (isFileRequest(slug)) return { title: "Not Found" };
36
41
  const item = await source.fetchItem(config, slug);
37
42
  if (item) {
38
43
  return {
39
- title: item.seoTitle || `${item.title} | Boilerplate`,
44
+ title: item.seoTitle || `${item.title} | ${APP_NAME}`,
40
45
  description: item.seoDescription || item.excerpt || void 0,
41
46
  openGraph: {
42
47
  title: item.seoTitle || item.title,