@nextsparkjs/core 0.1.0-beta.193 → 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 (374) hide show
  1. package/README.md +2 -2
  2. package/dist/components/app/guards/DeveloperGuard.d.ts +8 -1
  3. package/dist/components/app/guards/DeveloperGuard.d.ts.map +1 -1
  4. package/dist/components/app/guards/DeveloperGuard.js +2 -1
  5. package/dist/components/app/guards/SuperAdminGuard.d.ts +8 -1
  6. package/dist/components/app/guards/SuperAdminGuard.d.ts.map +1 -1
  7. package/dist/components/app/guards/SuperAdminGuard.js +2 -1
  8. package/dist/components/dashboard/block-editor/block-picker.d.ts.map +1 -1
  9. package/dist/components/dashboard/block-editor/block-picker.js +2 -1
  10. package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
  11. package/dist/components/dashboard/block-editor/builder-editor-view.js +39 -23
  12. package/dist/components/dashboard/block-editor/pattern-reference-preview.d.ts.map +1 -1
  13. package/dist/components/dashboard/block-editor/pattern-reference-preview.js +2 -1
  14. package/dist/components/dashboard/layouts/AuthGuard.d.ts.map +1 -1
  15. package/dist/components/dashboard/layouts/AuthGuard.js +3 -4
  16. package/dist/components/dashboard/layouts/AuthenticatedDashboardLayout.d.ts.map +1 -1
  17. package/dist/components/dashboard/layouts/AuthenticatedDashboardLayout.js +9 -10
  18. package/dist/components/dashboard/layouts/DashboardAuthLayout.d.ts.map +1 -1
  19. package/dist/components/dashboard/layouts/DashboardAuthLayout.js +3 -4
  20. package/dist/components/dashboard/layouts/DashboardAuthSkeleton.d.ts +2 -2
  21. package/dist/components/entities/wrappers/EntityDetailWrapper.d.ts.map +1 -1
  22. package/dist/components/entities/wrappers/EntityDetailWrapper.js +5 -2
  23. package/dist/components/entities/wrappers/EntityFormWrapper.d.ts.map +1 -1
  24. package/dist/components/entities/wrappers/EntityFormWrapper.js +5 -2
  25. package/dist/components/entities/wrappers/EntityListWrapper.d.ts.map +1 -1
  26. package/dist/components/entities/wrappers/EntityListWrapper.js +5 -2
  27. package/dist/components/ui/relation-display.d.ts.map +1 -1
  28. package/dist/components/ui/relation-display.js +2 -1
  29. package/dist/components/ui/user-display.d.ts.map +1 -1
  30. package/dist/components/ui/user-display.js +2 -1
  31. package/dist/emails/otp-verification.d.ts.map +1 -1
  32. package/dist/emails/otp-verification.js +5 -3
  33. package/dist/emails/reset-password.d.ts.map +1 -1
  34. package/dist/emails/reset-password.js +5 -3
  35. package/dist/emails/team-invitation.d.ts.map +1 -1
  36. package/dist/emails/team-invitation.js +3 -2
  37. package/dist/emails/verify-email.d.ts.map +1 -1
  38. package/dist/emails/verify-email.js +5 -3
  39. package/dist/hooks/useAuth.d.ts.map +1 -1
  40. package/dist/hooks/useAuth.js +21 -4
  41. package/dist/hooks/usePatternUsages.d.ts.map +1 -1
  42. package/dist/hooks/usePatternUsages.js +3 -2
  43. package/dist/lib/api/auth/permissions.d.ts +10 -0
  44. package/dist/lib/api/auth/permissions.d.ts.map +1 -1
  45. package/dist/lib/api/auth/permissions.js +7 -0
  46. package/dist/lib/api/auth.d.ts +2 -0
  47. package/dist/lib/api/auth.d.ts.map +1 -1
  48. package/dist/lib/api/auth.js +10 -10
  49. package/dist/lib/api/client-headers.d.ts +11 -0
  50. package/dist/lib/api/client-headers.d.ts.map +1 -0
  51. package/dist/lib/api/client-headers.js +12 -0
  52. package/dist/lib/api/client-ip.d.ts +59 -0
  53. package/dist/lib/api/client-ip.d.ts.map +1 -0
  54. package/dist/lib/api/client-ip.js +91 -0
  55. package/dist/lib/api/cors-response.d.ts +54 -0
  56. package/dist/lib/api/cors-response.d.ts.map +1 -0
  57. package/dist/lib/api/cors-response.js +88 -0
  58. package/dist/lib/api/entities.d.ts.map +1 -1
  59. package/dist/lib/api/entities.js +4 -3
  60. package/dist/lib/api/entity/audit-log.d.ts.map +1 -1
  61. package/dist/lib/api/entity/audit-log.js +2 -1
  62. package/dist/lib/api/entity/generic-handler.d.ts.map +1 -1
  63. package/dist/lib/api/entity/generic-handler.js +23 -5
  64. package/dist/lib/api/helpers.d.ts +8 -2
  65. package/dist/lib/api/helpers.d.ts.map +1 -1
  66. package/dist/lib/api/helpers.js +27 -81
  67. package/dist/lib/api/keys.d.ts +6 -0
  68. package/dist/lib/api/keys.d.ts.map +1 -1
  69. package/dist/lib/api/keys.js +7 -1
  70. package/dist/lib/api/rate-limit.d.ts +4 -0
  71. package/dist/lib/api/rate-limit.d.ts.map +1 -1
  72. package/dist/lib/api/rate-limit.js +17 -38
  73. package/dist/lib/api/request-origin.d.ts +35 -0
  74. package/dist/lib/api/request-origin.d.ts.map +1 -0
  75. package/dist/lib/api/request-origin.js +69 -0
  76. package/dist/lib/auth/load-login-page.d.ts +10 -0
  77. package/dist/lib/auth/load-login-page.d.ts.map +1 -0
  78. package/dist/lib/auth/load-login-page.js +7 -0
  79. package/dist/lib/auth/runtime-readiness.d.ts.map +1 -1
  80. package/dist/lib/auth/runtime-readiness.js +2 -0
  81. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts +1 -8
  82. package/dist/lib/auth/security-notifications/device-fingerprint.d.ts.map +1 -1
  83. package/dist/lib/auth/security-notifications/device-fingerprint.js +2 -12
  84. package/dist/lib/auth-email-callbacks.js +3 -3
  85. package/dist/lib/auth.d.ts.map +1 -1
  86. package/dist/lib/auth.js +15 -14
  87. package/dist/lib/config/config-client.d.ts.map +1 -1
  88. package/dist/lib/config/config-client.js +1 -1
  89. package/dist/lib/config/config-sync.d.ts.map +1 -1
  90. package/dist/lib/config/config-sync.js +1 -1
  91. package/dist/lib/config/public-config-client.d.ts +1 -0
  92. package/dist/lib/config/public-config-client.d.ts.map +1 -1
  93. package/dist/lib/config/public-config-client.js +3 -1
  94. package/dist/lib/config/types.d.ts +2 -0
  95. package/dist/lib/config/types.d.ts.map +1 -1
  96. package/dist/lib/constants/reserved-slugs.d.ts +17 -8
  97. package/dist/lib/constants/reserved-slugs.d.ts.map +1 -1
  98. package/dist/lib/constants/reserved-slugs.js +16 -52
  99. package/dist/lib/db.d.ts.map +1 -1
  100. package/dist/lib/db.js +9 -3
  101. package/dist/lib/entities/external-api-generator.d.ts.map +1 -1
  102. package/dist/lib/entities/external-api-generator.js +5 -5
  103. package/dist/lib/entities/public-slug.d.ts +46 -0
  104. package/dist/lib/entities/public-slug.d.ts.map +1 -0
  105. package/dist/lib/entities/public-slug.js +39 -0
  106. package/dist/lib/services/subscription.service.d.ts.map +1 -1
  107. package/dist/lib/services/subscription.service.js +3 -0
  108. package/dist/lib/utils/cors.d.ts +7 -0
  109. package/dist/lib/utils/cors.d.ts.map +1 -1
  110. package/dist/lib/utils/cors.js +8 -0
  111. package/dist/routes/(auth)/signup/page.cc.d.ts +3 -8
  112. package/dist/routes/(auth)/signup/page.cc.d.ts.map +1 -1
  113. package/dist/routes/(auth)/signup/page.cc.js +7 -1
  114. package/dist/routes/(auth)/verify-email/page.d.ts.map +1 -1
  115. package/dist/routes/(auth)/verify-email/page.js +2 -1
  116. package/dist/routes/(public)/page.cc.d.ts +3 -0
  117. package/dist/routes/(public)/page.cc.d.ts.map +1 -0
  118. package/dist/routes/(public)/page.cc.js +3 -0
  119. package/dist/routes/_internal/area-access.cc.d.ts +21 -0
  120. package/dist/routes/_internal/area-access.cc.d.ts.map +1 -0
  121. package/dist/routes/_internal/area-access.cc.js +19 -0
  122. package/dist/routes/_internal/auth-layout.d.ts.map +1 -1
  123. package/dist/routes/_internal/auth-layout.js +3 -2
  124. package/dist/routes/_internal/dashboard-main-shared.d.ts +7 -0
  125. package/dist/routes/_internal/dashboard-main-shared.d.ts.map +1 -0
  126. package/dist/routes/_internal/dashboard-main-shared.js +49 -0
  127. package/dist/routes/_internal/default-auth-layout.d.ts.map +1 -1
  128. package/dist/routes/_internal/default-auth-layout.js +3 -2
  129. package/dist/routes/_internal/devtools-layout.cc.d.ts +3 -2
  130. package/dist/routes/_internal/devtools-layout.cc.d.ts.map +1 -1
  131. package/dist/routes/_internal/devtools-layout.cc.js +1 -1
  132. package/dist/routes/_internal/devtools-layout.d.ts +7 -2
  133. package/dist/routes/_internal/devtools-layout.d.ts.map +1 -1
  134. package/dist/routes/_internal/devtools-layout.js +4 -4
  135. package/dist/routes/_internal/entity-detail-route.cc.d.ts +8 -0
  136. package/dist/routes/_internal/entity-detail-route.cc.d.ts.map +1 -0
  137. package/dist/routes/_internal/entity-detail-route.cc.js +5 -0
  138. package/dist/routes/_internal/entity-edit-route.cc.d.ts +8 -0
  139. package/dist/routes/_internal/entity-edit-route.cc.d.ts.map +1 -0
  140. package/dist/routes/_internal/entity-edit-route.cc.js +5 -0
  141. package/dist/routes/_internal/public-archive-route.d.ts +1 -1
  142. package/dist/routes/_internal/public-archive-route.d.ts.map +1 -1
  143. package/dist/routes/_internal/public-archive-route.js +8 -3
  144. package/dist/routes/_internal/public-item-route.cc.d.ts +5 -1
  145. package/dist/routes/_internal/public-item-route.cc.d.ts.map +1 -1
  146. package/dist/routes/_internal/public-item-route.cc.js +2 -1
  147. package/dist/routes/_internal/public-item-route.d.ts +7 -0
  148. package/dist/routes/_internal/public-item-route.d.ts.map +1 -1
  149. package/dist/routes/_internal/public-item-route.js +6 -1
  150. package/dist/routes/_internal/superadmin-layout.cc.d.ts +2 -1
  151. package/dist/routes/_internal/superadmin-layout.cc.d.ts.map +1 -1
  152. package/dist/routes/_internal/superadmin-layout.cc.js +1 -1
  153. package/dist/routes/_internal/superadmin-layout.d.ts +7 -2
  154. package/dist/routes/_internal/superadmin-layout.d.ts.map +1 -1
  155. package/dist/routes/_internal/superadmin-layout.js +6 -6
  156. package/dist/routes/_internal/suspended-route.d.ts +16 -0
  157. package/dist/routes/_internal/suspended-route.d.ts.map +1 -0
  158. package/dist/routes/_internal/suspended-route.js +7 -0
  159. package/dist/routes/api/auth/[...all]/route.d.ts.map +1 -1
  160. package/dist/routes/api/auth/[...all]/route.js +4 -12
  161. package/dist/routes/api/csp-report/route.d.ts.map +1 -1
  162. package/dist/routes/api/csp-report/route.js +2 -13
  163. package/dist/routes/api/devtools/config/entities/route.d.ts +2 -0
  164. package/dist/routes/api/devtools/config/entities/route.d.ts.map +1 -1
  165. package/dist/routes/api/devtools/config/entities/route.js +2 -0
  166. package/dist/routes/api/devtools/config/theme/route.d.ts +2 -0
  167. package/dist/routes/api/devtools/config/theme/route.d.ts.map +1 -1
  168. package/dist/routes/api/devtools/config/theme/route.js +2 -0
  169. package/dist/routes/api/devtools/tests/[...path]/route.d.ts +2 -0
  170. package/dist/routes/api/devtools/tests/[...path]/route.d.ts.map +1 -1
  171. package/dist/routes/api/devtools/tests/[...path]/route.js +2 -0
  172. package/dist/routes/api/devtools/tests/route.d.ts +2 -0
  173. package/dist/routes/api/devtools/tests/route.d.ts.map +1 -1
  174. package/dist/routes/api/devtools/tests/route.js +2 -0
  175. package/dist/routes/api/health/route.d.ts +2 -0
  176. package/dist/routes/api/health/route.d.ts.map +1 -1
  177. package/dist/routes/api/health/route.js +2 -0
  178. package/dist/routes/api/internal/user-metadata/route.d.ts +2 -0
  179. package/dist/routes/api/internal/user-metadata/route.d.ts.map +1 -1
  180. package/dist/routes/api/internal/user-metadata/route.js +2 -0
  181. package/dist/routes/api/mcp/route.d.ts +2 -0
  182. package/dist/routes/api/mcp/route.d.ts.map +1 -1
  183. package/dist/routes/api/mcp/route.js +2 -0
  184. package/dist/routes/api/superadmin/subscriptions/route.d.ts +2 -0
  185. package/dist/routes/api/superadmin/subscriptions/route.d.ts.map +1 -1
  186. package/dist/routes/api/superadmin/subscriptions/route.js +2 -0
  187. package/dist/routes/api/superadmin/teams/[teamId]/route.d.ts +2 -0
  188. package/dist/routes/api/superadmin/teams/[teamId]/route.d.ts.map +1 -1
  189. package/dist/routes/api/superadmin/teams/[teamId]/route.js +2 -0
  190. package/dist/routes/api/superadmin/teams/route.d.ts +2 -0
  191. package/dist/routes/api/superadmin/teams/route.d.ts.map +1 -1
  192. package/dist/routes/api/superadmin/teams/route.js +2 -0
  193. package/dist/routes/api/superadmin/users/[userId]/route.d.ts +2 -0
  194. package/dist/routes/api/superadmin/users/[userId]/route.d.ts.map +1 -1
  195. package/dist/routes/api/superadmin/users/[userId]/route.js +2 -0
  196. package/dist/routes/api/superadmin/users/route.d.ts +2 -0
  197. package/dist/routes/api/superadmin/users/route.d.ts.map +1 -1
  198. package/dist/routes/api/superadmin/users/route.js +2 -0
  199. package/dist/routes/api/user/delete-account/route.d.ts +2 -0
  200. package/dist/routes/api/user/delete-account/route.d.ts.map +1 -1
  201. package/dist/routes/api/user/delete-account/route.js +2 -0
  202. package/dist/routes/api/user/plan-flags/route.d.ts +2 -0
  203. package/dist/routes/api/user/plan-flags/route.d.ts.map +1 -1
  204. package/dist/routes/api/user/plan-flags/route.js +2 -0
  205. package/dist/routes/api/user/profile/route.d.ts +2 -0
  206. package/dist/routes/api/user/profile/route.d.ts.map +1 -1
  207. package/dist/routes/api/user/profile/route.js +4 -3
  208. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.d.ts +2 -0
  209. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.d.ts.map +1 -1
  210. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/[childId]/route.js +2 -0
  211. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.d.ts +2 -0
  212. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.d.ts.map +1 -1
  213. package/dist/routes/api/v1/[entity]/[id]/child/[childType]/route.js +2 -0
  214. package/dist/routes/api/v1/billing/cancel/route.d.ts +2 -0
  215. package/dist/routes/api/v1/billing/cancel/route.d.ts.map +1 -1
  216. package/dist/routes/api/v1/billing/cancel/route.js +2 -0
  217. package/dist/routes/api/v1/billing/change-plan/route.d.ts +2 -0
  218. package/dist/routes/api/v1/billing/change-plan/route.d.ts.map +1 -1
  219. package/dist/routes/api/v1/billing/change-plan/route.js +2 -0
  220. package/dist/routes/api/v1/billing/check-action/route.d.ts +2 -0
  221. package/dist/routes/api/v1/billing/check-action/route.d.ts.map +1 -1
  222. package/dist/routes/api/v1/billing/check-action/route.js +2 -0
  223. package/dist/routes/api/v1/billing/checkout/route.d.ts +2 -0
  224. package/dist/routes/api/v1/billing/checkout/route.d.ts.map +1 -1
  225. package/dist/routes/api/v1/billing/checkout/route.js +2 -0
  226. package/dist/routes/api/v1/billing/plans/route.d.ts +2 -0
  227. package/dist/routes/api/v1/billing/plans/route.d.ts.map +1 -1
  228. package/dist/routes/api/v1/billing/plans/route.js +2 -0
  229. package/dist/routes/api/v1/billing/portal/route.d.ts +2 -0
  230. package/dist/routes/api/v1/billing/portal/route.d.ts.map +1 -1
  231. package/dist/routes/api/v1/billing/portal/route.js +2 -0
  232. package/dist/routes/api/v1/blocks/[slug]/route.d.ts +2 -0
  233. package/dist/routes/api/v1/blocks/[slug]/route.d.ts.map +1 -1
  234. package/dist/routes/api/v1/blocks/[slug]/route.js +2 -0
  235. package/dist/routes/api/v1/blocks/route.d.ts +2 -0
  236. package/dist/routes/api/v1/blocks/route.d.ts.map +1 -1
  237. package/dist/routes/api/v1/blocks/route.js +2 -0
  238. package/dist/routes/api/v1/blocks/validate/route.d.ts +2 -0
  239. package/dist/routes/api/v1/blocks/validate/route.d.ts.map +1 -1
  240. package/dist/routes/api/v1/blocks/validate/route.js +2 -0
  241. package/dist/routes/api/v1/devtools/blocks/route.d.ts +2 -1
  242. package/dist/routes/api/v1/devtools/blocks/route.d.ts.map +1 -1
  243. package/dist/routes/api/v1/devtools/blocks/route.js +2 -9
  244. package/dist/routes/api/v1/devtools/docs/route.d.ts +2 -0
  245. package/dist/routes/api/v1/devtools/docs/route.d.ts.map +1 -1
  246. package/dist/routes/api/v1/devtools/docs/route.js +2 -0
  247. package/dist/routes/api/v1/devtools/features/route.d.ts +2 -1
  248. package/dist/routes/api/v1/devtools/features/route.d.ts.map +1 -1
  249. package/dist/routes/api/v1/devtools/features/route.js +2 -9
  250. package/dist/routes/api/v1/devtools/flows/route.d.ts +2 -1
  251. package/dist/routes/api/v1/devtools/flows/route.d.ts.map +1 -1
  252. package/dist/routes/api/v1/devtools/flows/route.js +2 -9
  253. package/dist/routes/api/v1/devtools/scheduled-actions/route.d.ts +2 -1
  254. package/dist/routes/api/v1/devtools/scheduled-actions/route.d.ts.map +1 -1
  255. package/dist/routes/api/v1/devtools/scheduled-actions/route.js +2 -9
  256. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.d.ts +2 -1
  257. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.d.ts.map +1 -1
  258. package/dist/routes/api/v1/devtools/scheduled-actions/run/route.js +2 -9
  259. package/dist/routes/api/v1/devtools/testing/route.d.ts +2 -1
  260. package/dist/routes/api/v1/devtools/testing/route.d.ts.map +1 -1
  261. package/dist/routes/api/v1/devtools/testing/route.js +2 -9
  262. package/dist/routes/api/v1/media/[id]/route.d.ts +2 -0
  263. package/dist/routes/api/v1/media/[id]/route.d.ts.map +1 -1
  264. package/dist/routes/api/v1/media/[id]/route.js +2 -0
  265. package/dist/routes/api/v1/media/[id]/tags/route.d.ts +2 -0
  266. package/dist/routes/api/v1/media/[id]/tags/route.d.ts.map +1 -1
  267. package/dist/routes/api/v1/media/[id]/tags/route.js +2 -0
  268. package/dist/routes/api/v1/media/check-duplicates/route.d.ts +2 -0
  269. package/dist/routes/api/v1/media/check-duplicates/route.d.ts.map +1 -1
  270. package/dist/routes/api/v1/media/check-duplicates/route.js +2 -0
  271. package/dist/routes/api/v1/media/route.d.ts +2 -0
  272. package/dist/routes/api/v1/media/route.d.ts.map +1 -1
  273. package/dist/routes/api/v1/media/route.js +2 -0
  274. package/dist/routes/api/v1/media/upload/route.d.ts +2 -0
  275. package/dist/routes/api/v1/media/upload/route.d.ts.map +1 -1
  276. package/dist/routes/api/v1/media/upload/route.js +2 -0
  277. package/dist/routes/api/v1/media-tags/route.d.ts +2 -0
  278. package/dist/routes/api/v1/media-tags/route.d.ts.map +1 -1
  279. package/dist/routes/api/v1/media-tags/route.js +2 -0
  280. package/dist/routes/api/v1/post-categories/[id]/route.d.ts +2 -0
  281. package/dist/routes/api/v1/post-categories/[id]/route.d.ts.map +1 -1
  282. package/dist/routes/api/v1/post-categories/[id]/route.js +2 -0
  283. package/dist/routes/api/v1/post-categories/route.d.ts +2 -0
  284. package/dist/routes/api/v1/post-categories/route.d.ts.map +1 -1
  285. package/dist/routes/api/v1/post-categories/route.js +2 -0
  286. package/dist/routes/api/v1/teams/[teamId]/members/route.js +2 -2
  287. package/dist/routes/api/v1/teams/[teamId]/subscription/route.d.ts +2 -0
  288. package/dist/routes/api/v1/teams/[teamId]/subscription/route.d.ts.map +1 -1
  289. package/dist/routes/api/v1/teams/[teamId]/subscription/route.js +2 -0
  290. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.d.ts +2 -0
  291. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.d.ts.map +1 -1
  292. package/dist/routes/api/v1/teams/[teamId]/usage/[limitSlug]/route.js +2 -0
  293. package/dist/routes/api/v1/users/[id]/meta/[key]/route.d.ts.map +1 -1
  294. package/dist/routes/api/v1/users/[id]/meta/[key]/route.js +13 -0
  295. package/dist/routes/api/v1/users/[id]/route.d.ts.map +1 -1
  296. package/dist/routes/api/v1/users/[id]/route.js +20 -2
  297. package/dist/routes/api/v1/users/docs.md +34 -19
  298. package/dist/routes/api/v1/users/me/route.d.ts +6 -0
  299. package/dist/routes/api/v1/users/me/route.d.ts.map +1 -0
  300. package/dist/routes/api/v1/users/me/route.js +5 -0
  301. package/dist/routes/api/v1/users/presets.ts +2 -2
  302. package/dist/routes/dashboard/(main)/layout.cc.d.ts +4 -0
  303. package/dist/routes/dashboard/(main)/layout.cc.d.ts.map +1 -0
  304. package/dist/routes/dashboard/(main)/layout.cc.js +10 -0
  305. package/dist/routes/dashboard/(main)/layout.d.ts.map +1 -1
  306. package/dist/routes/dashboard/(main)/layout.js +3 -44
  307. package/dist/routes/dashboard/permission-denied/page.d.ts +1 -1
  308. package/dist/routes/dashboard/permission-denied/page.d.ts.map +1 -1
  309. package/dist/routes/dashboard/permission-denied/page.js +5 -1
  310. package/dist/routes/devtools/layout.cc.d.ts.map +1 -1
  311. package/dist/routes/devtools/layout.cc.js +5 -1
  312. package/dist/routes/manifest.json +10 -0
  313. package/dist/routes/robots.d.ts +10 -0
  314. package/dist/routes/robots.d.ts.map +1 -0
  315. package/dist/routes/robots.js +10 -0
  316. package/dist/routes/superadmin/layout.cc.d.ts.map +1 -1
  317. package/dist/routes/superadmin/layout.cc.js +5 -1
  318. package/dist/routes/variants.json +12 -2
  319. package/dist/templates/next.config.mjs +2 -29
  320. package/dist/templates/projects/blog/api/authors/[username]/route.ts +3 -0
  321. package/dist/templates/projects/blog/api/authors/route.ts +3 -0
  322. package/dist/templates/projects/blog/api/posts/public/route.ts +3 -0
  323. package/dist/templates/projects/blog/package.json +3 -3
  324. package/dist/templates/projects/crm/package.json +3 -3
  325. package/dist/templates/projects/productivity/package.json +3 -3
  326. package/dist/templates/proxy.ts +12 -1
  327. package/dist/templates/public/favicon.ico +0 -0
  328. package/package.json +8 -5
  329. package/scripts/build/auth-readiness.mjs +4 -0
  330. package/scripts/build/registry/__tests__/api-docs-colocated.test.mjs +3 -0
  331. package/scripts/build/registry/__tests__/billing-registry.test.mjs +50 -1
  332. package/scripts/build/registry/__tests__/block-registry.test.mjs +3 -0
  333. package/scripts/build/registry/__tests__/build-output.test.mjs +1 -1
  334. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +3 -0
  335. package/scripts/build/registry/__tests__/project-mode-root-first.test.mjs +6 -6
  336. package/scripts/build/registry/__tests__/quiet-console.mjs +17 -0
  337. package/scripts/build/registry/__tests__/safe-fs.test.mjs +3 -0
  338. package/scripts/build/registry/__tests__/team-roles.test.mjs +3 -0
  339. package/scripts/build/registry/__tests__/write-places.test.mjs +1 -1
  340. package/scripts/build/registry/contracts/__tests__/contracts-wire.test.mjs +1 -1
  341. package/scripts/build/registry/contracts/__tests__/contracts.test.mjs +1 -1
  342. package/scripts/build/registry/contracts/render.mjs +3 -3
  343. package/scripts/build/registry/discovery/permissions.test.mjs +3 -0
  344. package/scripts/build/registry/discovery/plugin-capabilities.mjs +2 -2
  345. package/scripts/build/registry/generators/billing-registry.mjs +7 -3
  346. package/scripts/build/registry/host/README.md +27 -3
  347. package/scripts/build/registry/host/__tests__/facade-emitter.test.mjs +9 -9
  348. package/scripts/build/registry/host/__tests__/host-area-access.test.mjs +32 -0
  349. package/scripts/build/registry/host/__tests__/host-entities.test.mjs +32 -1
  350. package/scripts/build/registry/host/__tests__/host-mode.test.mjs +1 -1
  351. package/scripts/build/registry/host/__tests__/host-plan.test.mjs +12 -2
  352. package/scripts/build/registry/host/__tests__/host-project-composition.test.mjs +1 -1
  353. package/scripts/build/registry/host/__tests__/host-project.test.mjs +2 -2
  354. package/scripts/build/registry/host/__tests__/host-robustness.test.mjs +65 -2
  355. package/scripts/build/registry/host/entity-routes.mjs +9 -3
  356. package/scripts/build/registry/host/facade-emitter.mjs +2 -2
  357. package/scripts/build/registry/host/generation.mjs +54 -0
  358. package/scripts/build/registry/host/next-route-exports.json +2 -2
  359. package/scripts/build/registry/host/prepare.mjs +3 -0
  360. package/scripts/build/registry/host/static-imports.mjs +4 -0
  361. package/scripts/build/routes-manifest.mjs +13 -1
  362. package/scripts/db/migration-time-limit.mjs +216 -34
  363. package/scripts/db/run-migrations.mjs +11 -179
  364. package/scripts/db/ssl-config.mjs +12 -1
  365. package/scripts/db/verify-theme-migrations.mjs +1 -1
  366. package/templates/next.config.mjs +2 -29
  367. package/templates/projects/blog/api/authors/[username]/route.ts +3 -0
  368. package/templates/projects/blog/api/authors/route.ts +3 -0
  369. package/templates/projects/blog/api/posts/public/route.ts +3 -0
  370. package/templates/projects/blog/package.json +3 -3
  371. package/templates/projects/crm/package.json +3 -3
  372. package/templates/projects/productivity/package.json +3 -3
  373. package/templates/proxy.ts +12 -1
  374. package/templates/public/favicon.ico +0 -0
@@ -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,
@@ -10,7 +10,8 @@ export declare const withSuperadminAreaMessages: (Layout: ComponentType<Superadm
10
10
  /**
11
11
  * What a project's superadmin 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 `withSuperadminGuard` does in the ISR module. A module of its own so only the superadmin route group imports the
13
+ * as `withSuperadminGuard` 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 superadmin route group imports the
14
15
  * guard, the role check and their client components.
15
16
  */
16
17
  export declare const withSuperadminGuard: (ProjectLayout: ComponentType<SuperadminLayoutProps>) => ({ children }: {
@@ -1 +1 @@
1
- {"version":3,"file":"superadmin-layout.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/superadmin-layout.cc.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAGvF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,aAAa,CAAC,qBAAqB,CAAC;;6CAA+D,CAAA;AAEtJ;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,eAAe,aAAa,CAAC,qBAAqB,CAAC;;6CAAqE,CAAA"}
1
+ {"version":3,"file":"superadmin-layout.cc.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/superadmin-layout.cc.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAGvF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,aAAa,CAAC,qBAAqB,CAAC;;6CAA+D,CAAA;AAEtJ;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,eAAe,aAAa,CAAC,qBAAqB,CAAC;;6CAA2E,CAAA"}
@@ -2,4 +2,4 @@ import { withSuperadminMessages } from "./group-layouts.cc.js";
2
2
  import { guardSuperadminLayout } from "./superadmin-layout.js";
3
3
  import { withAreaGate } from "./area-access.js";
4
4
  export const withSuperadminAreaMessages = (Layout) => withSuperadminMessages(withAreaGate("superadmin", Layout));
5
- export const withSuperadminGuard = (ProjectLayout) => withSuperadminAreaMessages(guardSuperadminLayout(ProjectLayout));
5
+ export const withSuperadminGuard = (ProjectLayout) => withSuperadminAreaMessages(guardSuperadminLayout(ProjectLayout, true));
@@ -4,13 +4,17 @@ export declare const defaultMetadata: Metadata;
4
4
  export interface SuperadminLayoutProps {
5
5
  children: React.ReactNode;
6
6
  }
7
+ /** `serverChecked`: see SuperAdminGuard (only the Cache Components module passes it, after its role check). */
8
+ type GuardedProps = SuperadminLayoutProps & {
9
+ serverChecked?: boolean;
10
+ };
7
11
  /**
8
12
  * Superadmin Layout
9
13
  *
10
14
  * Protected layout for superadmin-only sections with dedicated sidebar navigation.
11
15
  * Owns the narrowly scoped client catalog for superadmin routes.
12
16
  */
13
- export declare function SuperadminLayout({ children }: SuperadminLayoutProps): import("react/jsx-runtime").JSX.Element;
17
+ export declare function SuperadminLayout({ children, serverChecked }: GuardedProps): import("react/jsx-runtime").JSX.Element;
14
18
  /**
15
19
  * Wraps a layout for this route group in the group's client messages, after the server-side role check
16
20
  * (area-access): it runs before anything is rendered or sent, so a page load without the role gets a 307. The
@@ -26,10 +30,11 @@ export declare function withSuperadminMessages(ResolvedSuperadminLayout: Compone
26
30
  * area-access). Shared by the message wrappers of both rendering modes (`withSuperadminGuard` here, and
27
31
  * in `group-layouts.cc`).
28
32
  */
29
- export declare function guardSuperadminLayout(ProjectLayout: ComponentType<SuperadminLayoutProps>): ({ children }: SuperadminLayoutProps) => import("react/jsx-runtime").JSX.Element;
33
+ export declare function guardSuperadminLayout(ProjectLayout: ComponentType<SuperadminLayoutProps>, serverChecked?: boolean): ({ children }: SuperadminLayoutProps) => import("react/jsx-runtime").JSX.Element;
30
34
  /**
31
35
  * The composition of a project's superadmin layout with core (the generated host): messages, then
32
36
  * `guardSuperadminLayout` around the project's layout.
33
37
  */
34
38
  export declare function withSuperadminGuard(ProjectLayout: ComponentType<SuperadminLayoutProps>): ({ children }: SuperadminLayoutProps) => Promise<import("react/jsx-runtime").JSX.Element>;
39
+ export {};
35
40
  //# sourceMappingURL=superadmin-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"superadmin-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/superadmin-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAU1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIhC,eAAO,MAAM,eAAe,EAAE,QAI7B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AA6CD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,2CAUnE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,wBAAwB,EAAE,aAAa,CAAC,qBAAqB,CAAC,IAChD,cAAc,qBAAqB,sDAUvF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,CAAC,qBAAqB,CAAC,IAC/C,cAAc,qBAAqB,6CAe5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,qBAAqB,CAAC,kBA1CpB,qBAAqB,sDA4CvF"}
1
+ {"version":3,"file":"superadmin-layout.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/superadmin-layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAU1C,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIhC,eAAO,MAAM,eAAe,EAAE,QAI7B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,+GAA+G;AAC/G,KAAK,YAAY,GAAG,qBAAqB,GAAG;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AA6CvE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,YAAY,2CAUzE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,wBAAwB,EAAE,aAAa,CAAC,qBAAqB,CAAC,IAChD,cAAc,qBAAqB,sDAUvF;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,aAAa,CAAC,qBAAqB,CAAC,EAAE,aAAa,UAAQ,IACtE,cAAc,qBAAqB,6CAe5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,qBAAqB,CAAC,kBA1CpB,qBAAqB,sDA4CvF"}
@@ -16,9 +16,9 @@ export const defaultMetadata = {
16
16
  robots: "noindex, nofollow"
17
17
  // Prevent search engine indexing
18
18
  };
19
- function SuperadminContent({ children }) {
19
+ function SuperadminContent({ children, serverChecked }) {
20
20
  const pluginNavItems = getAllPluginNavItems("superadmin");
21
- return /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(SuperAdminGuard, { children: /* @__PURE__ */ jsxs("div", { className: "flex h-screen bg-background", "data-cy": "superadmin-container", children: [
21
+ return /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(SuperAdminGuard, { serverChecked, children: /* @__PURE__ */ jsxs("div", { className: "flex h-screen bg-background", "data-cy": "superadmin-container", children: [
22
22
  /* @__PURE__ */ jsx("div", { className: "hidden lg:block", children: /* @__PURE__ */ jsx(SuperadminSidebar, { pluginItems: pluginNavItems }) }),
23
23
  /* @__PURE__ */ jsxs("div", { className: "flex-1 flex flex-col overflow-hidden", children: [
24
24
  /* @__PURE__ */ jsx("div", { className: "lg:hidden bg-card border-b border-border p-4", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
@@ -32,8 +32,8 @@ function SuperadminContent({ children }) {
32
32
  ] })
33
33
  ] }) }) });
34
34
  }
35
- export function SuperadminLayout({ children }) {
36
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { className: "min-h-screen flex items-center justify-center", children: /* @__PURE__ */ jsx(Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground" }) }), children: /* @__PURE__ */ jsx(SuperadminContent, { children }) });
35
+ export function SuperadminLayout({ children, serverChecked }) {
36
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { className: "min-h-screen flex items-center justify-center", children: /* @__PURE__ */ jsx(Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground" }) }), children: /* @__PURE__ */ jsx(SuperadminContent, { serverChecked, children }) });
37
37
  }
38
38
  export function withSuperadminMessages(ResolvedSuperadminLayout) {
39
39
  return async function SuperadminLayoutWithMessages({ children }) {
@@ -43,9 +43,9 @@ export function withSuperadminMessages(ResolvedSuperadminLayout) {
43
43
  return /* @__PURE__ */ jsx(NextIntlClientProvider, { messages: selectMessages(messages, "superadmin", configuredNamespaces.superadmin), children: /* @__PURE__ */ jsx(ResolvedSuperadminLayout, { children }) });
44
44
  };
45
45
  }
46
- export function guardSuperadminLayout(ProjectLayout) {
46
+ export function guardSuperadminLayout(ProjectLayout, serverChecked = false) {
47
47
  return function GuardedSuperadminLayout({ children }) {
48
- return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { className: "min-h-screen flex items-center justify-center", children: /* @__PURE__ */ jsx(Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground" }) }), children: /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(SuperAdminGuard, { children: /* @__PURE__ */ jsx(ProjectLayout, { children }) }) }) });
48
+ return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx("div", { className: "min-h-screen flex items-center justify-center", children: /* @__PURE__ */ jsx(Loader2, { className: "h-8 w-8 animate-spin text-muted-foreground" }) }), children: /* @__PURE__ */ jsx(DashboardProviders, { children: /* @__PURE__ */ jsx(SuperAdminGuard, { serverChecked, children: /* @__PURE__ */ jsx(ProjectLayout, { children }) }) }) });
49
49
  };
50
50
  }
51
51
  export function withSuperadminGuard(ProjectLayout) {
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from 'react';
2
+ /**
3
+ * A route component behind its own Suspense boundary, for a host with `cacheComponents` on.
4
+ *
5
+ * A page that awaits `params` (or `searchParams`), redirects or answers notFound() is request-time work. The
6
+ * layouts of the Cache Components host already stream the page after their shell, but Next.js's instant-navigation
7
+ * check (the dev server runs it on every page, and logs "Could not validate ..." when it fails) wants a boundary
8
+ * between the segment it validates and that work, so a navigation to the segment finishes at once and the page
9
+ * streams in. The status a visitor gets is the one the host already gives: a redirect or a 404 thrown after the
10
+ * shell is sent reaches the browser as a 200 with a redirect or a not-found page.
11
+ *
12
+ * Only the Cache Components modules (`*.cc`) use it. An ISR host's pages are rendered before anything is sent, and
13
+ * keep a real 307 and 404.
14
+ */
15
+ export declare function behindSuspense<Props extends object>(Route: (props: Props) => ReactNode | Promise<ReactNode>): (props: Props) => import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=suspended-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspended-route.d.ts","sourceRoot":"","sources":["../../../src/routes/_internal/suspended-route.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAEhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IACtE,OAAO,KAAK,6CAOjD"}
@@ -0,0 +1,7 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Suspense } from "react";
3
+ export function behindSuspense(Route) {
4
+ return function RouteBehindSuspense(props) {
5
+ return /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(Route, { ...props }) });
6
+ };
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/routes/api/auth/[...all]/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiBxD,wBAAsB,OAAO,CAAC,GAAG,EAAE,WAAW,kCAE7C;AAID,wBAAsB,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,qBA4C1F;AAGD,wBAAsB,IAAI,CAAC,GAAG,EAAE,WAAW,qBAwJ1C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/routes/api/auth/[...all]/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBxD,wBAAsB,OAAO,CAAC,GAAG,EAAE,WAAW,kCAE7C;AAID,wBAAsB,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CAAE,qBA4C1F;AAGD,wBAAsB,IAAI,CAAC,GAAG,EAAE,WAAW,qBAwI1C"}
@@ -6,6 +6,7 @@ import { isPublicSignupRestricted } from "@nextsparkjs/core/lib/teams/helpers";
6
6
  import { TeamService } from "@nextsparkjs/core/lib/services";
7
7
  import { wrapAuthHandlerWithCors, handleCorsPreflightRequest, addCorsHeaders } from "@nextsparkjs/core/lib/api/helpers";
8
8
  import { checkDistributedRateLimit } from "@nextsparkjs/core/lib/api/rate-limit";
9
+ import { getClientIp } from "@nextsparkjs/core/lib/api/client-ip";
9
10
  import { withSignupContext } from "@nextsparkjs/core/lib/auth-context";
10
11
  import { dispatchSecurityNotificationsForRequest } from "@nextsparkjs/core/lib/auth/security-notifications";
11
12
  import { verifyEmailPageUrl } from "@nextsparkjs/core/lib/auth/verify-email-link";
@@ -39,19 +40,10 @@ export async function GET(req, context) {
39
40
  }
40
41
  export async function POST(req) {
41
42
  var _a, _b, _c, _d, _e;
42
- const clientIp = (() => {
43
- const cfIp = req.headers.get("cf-connecting-ip");
44
- if (cfIp) return cfIp;
45
- const forwardedFor = req.headers.get("x-forwarded-for");
46
- if (forwardedFor) {
47
- const ips = forwardedFor.split(",").map((ip) => ip.trim()).filter(Boolean);
48
- if (ips.length > 0) return ips[ips.length - 1];
49
- }
50
- return req.headers.get("x-real-ip") || "unknown";
51
- })();
43
+ const clientIp = getClientIp(req.headers);
52
44
  const rateLimitResult = await checkDistributedRateLimit(`auth:ip:${clientIp}`, "auth");
53
45
  if (!rateLimitResult.allowed) {
54
- return new NextResponse(JSON.stringify({ error: "Too many requests" }), {
46
+ return wrapAuthHandlerWithCors(async () => new NextResponse(JSON.stringify({ error: "Too many requests" }), {
55
47
  status: 429,
56
48
  headers: {
57
49
  "Content-Type": "application/json",
@@ -60,7 +52,7 @@ export async function POST(req) {
60
52
  "X-RateLimit-Remaining": "0",
61
53
  "X-RateLimit-Reset": rateLimitResult.resetTime.toString()
62
54
  }
63
- });
55
+ }), req);
64
56
  }
65
57
  const readinessResponse = await getAuthReadinessResponse(req);
66
58
  if (readinessResponse) {
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/routes/api/csp-report/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AA2ExD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,qBAyF9C;AAID,wBAAsB,OAAO,sBAS5B"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/routes/api/csp-report/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AA2DxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,qBAyF9C;AAID,wBAAsB,OAAO,sBAS5B"}
@@ -1,4 +1,5 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ import { getClientIp } from "@nextsparkjs/core/lib/api/client-ip";
2
3
  let checkDistributedRateLimit = null;
3
4
  let createRateLimitErrorResponse = null;
4
5
  let rateLimitLoaded = false;
@@ -16,25 +17,13 @@ async function ensureRateLimitLoaded() {
16
17
  const getAllowedOrigin = () => {
17
18
  return process.env.NEXT_PUBLIC_APP_URL || "http://localhost:3000";
18
19
  };
19
- function getClientIp(request) {
20
- const forwardedFor = request.headers.get("x-forwarded-for");
21
- if (forwardedFor) {
22
- const ips = forwardedFor.split(",").map((ip) => ip.trim());
23
- if (ips[0]) return ips[0];
24
- }
25
- const realIp = request.headers.get("x-real-ip");
26
- if (realIp) return realIp;
27
- const cfIp = request.headers.get("cf-connecting-ip");
28
- if (cfIp) return cfIp;
29
- return "unknown";
30
- }
31
20
  export async function POST(request) {
32
21
  await ensureRateLimitLoaded();
33
22
  const requestId = randomUUID().slice(0, 8);
34
23
  let rateLimitHeaders = {};
35
24
  if (checkDistributedRateLimit && createRateLimitErrorResponse) {
36
25
  try {
37
- const clientIp = getClientIp(request);
26
+ const clientIp = getClientIp(request.headers);
38
27
  const rateLimitResult = await checkDistributedRateLimit(`csp-report:ip:${clientIp}`, "api");
39
28
  if (!rateLimitResult.allowed) {
40
29
  console.warn(`[CSP Report ${requestId}] Rate limit exceeded for IP: ${clientIp}`);
@@ -1,4 +1,5 @@
1
1
  import { NextResponse } from "next/server";
2
+ import { corsPreflight } from '@nextsparkjs/core/lib/api/cors-response';
2
3
  /**
3
4
  * GET /api/devtools/config/entities
4
5
  *
@@ -6,4 +7,5 @@ import { NextResponse } from "next/server";
6
7
  * Only accessible to developer role
7
8
  */
8
9
  export declare const GET: (request: import("next/server").NextRequest) => Promise<NextResponse>;
10
+ export declare const OPTIONS: typeof corsPreflight;
9
11
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/routes/api/devtools/config/entities/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmC3C;;;;;GAKG;AACH,eAAO,MAAM,GAAG,uEAwEN,CAAC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/routes/api/devtools/config/entities/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAgCxE;;;;;GAKG;AACH,eAAO,MAAM,GAAG,uEAwEN,CAAC;AAEX,eAAO,MAAM,OAAO,sBAAgB,CAAC"}
@@ -2,6 +2,7 @@ import { getTypedSession } from "@nextsparkjs/core/lib/auth";
2
2
  import { NextResponse } from "next/server";
3
3
  import { getEntityRegistry } from "@nextsparkjs/core/lib/entities/queries";
4
4
  import { withRateLimitTier } from "@nextsparkjs/core/lib/api/rate-limit";
5
+ import { corsPreflight } from "@nextsparkjs/core/lib/api/cors-response";
5
6
  function isEntityConfig(entity) {
6
7
  return "slug" in entity;
7
8
  }
@@ -61,3 +62,4 @@ export const GET = withRateLimitTier(async (request) => {
61
62
  );
62
63
  }
63
64
  }, "read");
65
+ export const OPTIONS = corsPreflight;
@@ -1,4 +1,5 @@
1
1
  import { NextResponse } from "next/server";
2
+ import { corsPreflight } from '@nextsparkjs/core/lib/api/cors-response';
2
3
  /**
3
4
  * GET /api/devtools/config/theme
4
5
  *
@@ -6,4 +7,5 @@ import { NextResponse } from "next/server";
6
7
  * Only accessible to developer role
7
8
  */
8
9
  export declare const GET: (request: import("next/server").NextRequest) => Promise<NextResponse>;
10
+ export declare const OPTIONS: typeof corsPreflight;
9
11
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/routes/api/devtools/config/theme/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C;;;;;GAKG;AACH,eAAO,MAAM,GAAG,uEAoDN,CAAC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/routes/api/devtools/config/theme/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,GAAG,uEAoDN,CAAC;AAEX,eAAO,MAAM,OAAO,sBAAgB,CAAC"}
@@ -2,6 +2,7 @@ import { getTypedSession } from "@nextsparkjs/core/lib/auth";
2
2
  import { NextResponse } from "next/server";
3
3
  import { ThemeService } from "@nextsparkjs/core/lib/services/theme.service";
4
4
  import { withRateLimitTier } from "@nextsparkjs/core/lib/api/rate-limit";
5
+ import { corsPreflight } from "@nextsparkjs/core/lib/api/cors-response";
5
6
  export const GET = withRateLimitTier(async (request) => {
6
7
  try {
7
8
  const session = await getTypedSession(request.headers);
@@ -46,3 +47,4 @@ export const GET = withRateLimitTier(async (request) => {
46
47
  );
47
48
  }
48
49
  }, "read");
50
+ export const OPTIONS = corsPreflight;
@@ -1,4 +1,5 @@
1
1
  import { NextResponse } from "next/server";
2
+ import { corsPreflight } from '@nextsparkjs/core/lib/api/cors-response';
2
3
  /**
3
4
  * GET /api/devtools/tests/[...path]
4
5
  *
@@ -12,4 +13,5 @@ export declare const GET: (request: import("next/server").NextRequest, args_0: {
12
13
  path: string[];
13
14
  }>;
14
15
  }) => Promise<NextResponse>;
16
+ export declare const OPTIONS: typeof corsPreflight;
15
17
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/routes/api/devtools/tests/[...path]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;YAEQ,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;2BA0GzC,CAAC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/routes/api/devtools/tests/[...path]/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAExE;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;YAEQ,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;2BA0GzC,CAAC;AAEX,eAAO,MAAM,OAAO,sBAAgB,CAAC"}
@@ -4,6 +4,7 @@ import { readFile, stat } from "fs/promises";
4
4
  import { join } from "path";
5
5
  import matter from "gray-matter";
6
6
  import { withRateLimitTier } from "@nextsparkjs/core/lib/api/rate-limit";
7
+ import { corsPreflight } from "@nextsparkjs/core/lib/api/cors-response";
7
8
  export const GET = withRateLimitTier(async (request, { params }) => {
8
9
  try {
9
10
  const session = await getTypedSession(request.headers);
@@ -91,3 +92,4 @@ export const GET = withRateLimitTier(async (request, { params }) => {
91
92
  );
92
93
  }
93
94
  }, "read");
95
+ export const OPTIONS = corsPreflight;
@@ -1,4 +1,5 @@
1
1
  import { NextResponse } from "next/server";
2
+ import { corsPreflight } from '@nextsparkjs/core/lib/api/cors-response';
2
3
  /**
3
4
  * GET /api/devtools/tests
4
5
  *
@@ -6,4 +7,5 @@ import { NextResponse } from "next/server";
6
7
  * Only accessible to developer role
7
8
  */
8
9
  export declare const GET: (request: import("next/server").NextRequest) => Promise<NextResponse>;
10
+ export declare const OPTIONS: typeof corsPreflight;
9
11
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/routes/api/devtools/tests/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAsD3C;;;;;GAKG;AACH,eAAO,MAAM,GAAG,uEAkEN,CAAC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/routes/api/devtools/tests/route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAmDxE;;;;;GAKG;AACH,eAAO,MAAM,GAAG,uEAkEN,CAAC;AAEX,eAAO,MAAM,OAAO,sBAAgB,CAAC"}
@@ -3,6 +3,7 @@ import { NextResponse } from "next/server";
3
3
  import { readdir, stat } from "fs/promises";
4
4
  import { join } from "path";
5
5
  import { withRateLimitTier } from "@nextsparkjs/core/lib/api/rate-limit";
6
+ import { corsPreflight } from "@nextsparkjs/core/lib/api/cors-response";
6
7
  async function buildFileTree(dirPath, basePath) {
7
8
  const entries = await readdir(dirPath, { withFileTypes: true });
8
9
  const tree = [];
@@ -87,3 +88,4 @@ export const GET = withRateLimitTier(async (request) => {
87
88
  );
88
89
  }
89
90
  }, "read");
91
+ export const OPTIONS = corsPreflight;
@@ -1,3 +1,5 @@
1
+ import { corsPreflight } from "@nextsparkjs/core/lib/api/cors-response";
1
2
  import { NextRequest, NextResponse } from "next/server";
2
3
  export declare const GET: (request: NextRequest) => Promise<NextResponse>;
4
+ export declare const OPTIONS: typeof corsPreflight;
3
5
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/routes/api/health/route.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,GAAG,iDA8CN,CAAC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/routes/api/health/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAGxE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,GAAG,iDA8CN,CAAC;AAEX,eAAO,MAAM,OAAO,sBAAgB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { queryWithRLS } from "@nextsparkjs/core/lib/db";
2
2
  import { withRateLimitTier } from "@nextsparkjs/core/lib/api/rate-limit";
3
+ import { corsPreflight } from "@nextsparkjs/core/lib/api/cors-response";
3
4
  import { isRedisConfigured } from "@nextsparkjs/core/lib/rate-limit-redis";
4
5
  import { authenticateRequest } from "@nextsparkjs/core/lib/api/auth/dual-auth";
5
6
  import { NextResponse } from "next/server";
@@ -37,3 +38,4 @@ export const GET = withRateLimitTier(async (request) => {
37
38
  ...dbError ? { error: dbError } : {}
38
39
  }, { status: healthy ? 200 : 503 });
39
40
  }, "read");
41
+ export const OPTIONS = corsPreflight;
@@ -1,3 +1,5 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
+ import { corsPreflight } from '@nextsparkjs/core/lib/api/cors-response';
2
3
  export declare const POST: (request: NextRequest) => Promise<NextResponse>;
4
+ export declare const OPTIONS: typeof corsPreflight;
3
5
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/routes/api/internal/user-metadata/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAMvD,eAAO,MAAM,IAAI,iDAwCN,CAAC"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/routes/api/internal/user-metadata/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGvD,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAA;AAIvE,eAAO,MAAM,IAAI,iDAwCN,CAAC;AAEZ,eAAO,MAAM,OAAO,sBAAgB,CAAA"}