@nextsparkjs/core 0.1.0-beta.189 → 0.1.0-beta.190

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 (456) hide show
  1. package/dist/components/api/keys/CreateApiKeyDialog.d.ts.map +1 -1
  2. package/dist/components/api/keys/CreateApiKeyDialog.js +2 -1
  3. package/dist/components/app/layouts/PublicFooter.d.ts.map +1 -1
  4. package/dist/components/app/layouts/PublicFooter.js +2 -23
  5. package/dist/components/app/misc/ThemeToggle.d.ts.map +1 -1
  6. package/dist/components/app/misc/ThemeToggle.js +2 -1
  7. package/dist/components/auth/forms/LoginForm.js +1 -1
  8. package/dist/components/auth/forms/SignupForm.d.ts.map +1 -1
  9. package/dist/components/auth/forms/SignupForm.js +2 -1
  10. package/dist/components/auth/pages/AuthErrorPage.d.ts.map +1 -1
  11. package/dist/components/auth/pages/AuthErrorPage.js +2 -1
  12. package/dist/components/billing/ManageBillingButton.d.ts.map +1 -1
  13. package/dist/components/billing/ManageBillingButton.js +2 -1
  14. package/dist/components/dashboard/block-editor/array-field.d.ts.map +1 -1
  15. package/dist/components/dashboard/block-editor/array-field.js +2 -1
  16. package/dist/components/dashboard/block-editor/block-picker.d.ts.map +1 -1
  17. package/dist/components/dashboard/block-editor/block-picker.js +2 -1
  18. package/dist/components/dashboard/block-editor/builder-editor-view.d.ts.map +1 -1
  19. package/dist/components/dashboard/block-editor/builder-editor-view.js +3 -2
  20. package/dist/components/dashboard/block-editor/config-panel.d.ts.map +1 -1
  21. package/dist/components/dashboard/block-editor/config-panel.js +3 -2
  22. package/dist/components/dashboard/block-editor/dynamic-form.d.ts.map +1 -1
  23. package/dist/components/dashboard/block-editor/dynamic-form.js +2 -1
  24. package/dist/components/dashboard/block-editor/entity-fields-sidebar.d.ts.map +1 -1
  25. package/dist/components/dashboard/block-editor/entity-fields-sidebar.js +3 -2
  26. package/dist/components/dashboard/block-editor/pattern-reference-preview.d.ts.map +1 -1
  27. package/dist/components/dashboard/block-editor/pattern-reference-preview.js +2 -1
  28. package/dist/components/dashboard/layouts/TopNavbar.d.ts.map +1 -1
  29. package/dist/components/dashboard/layouts/TopNavbar.js +4 -3
  30. package/dist/components/dashboard/misc/SearchDropdown.d.ts.map +1 -1
  31. package/dist/components/dashboard/misc/SearchDropdown.js +2 -1
  32. package/dist/components/dashboard/mobile/MobileTopBar.d.ts.map +1 -1
  33. package/dist/components/dashboard/mobile/MobileTopBar.js +2 -1
  34. package/dist/components/devtools/BlockDetailViewer.d.ts.map +1 -1
  35. package/dist/components/devtools/BlockDetailViewer.js +2 -1
  36. package/dist/components/devtools/BlocksViewer.d.ts.map +1 -1
  37. package/dist/components/devtools/BlocksViewer.js +2 -1
  38. package/dist/components/devtools/ConfigViewer.d.ts.map +1 -1
  39. package/dist/components/devtools/ConfigViewer.js +3 -2
  40. package/dist/components/devtools/TestCasesViewer.d.ts.map +1 -1
  41. package/dist/components/devtools/TestCasesViewer.js +3 -2
  42. package/dist/components/devtools/TestCoverageDashboard.d.ts.map +1 -1
  43. package/dist/components/devtools/TestCoverageDashboard.js +2 -1
  44. package/dist/components/devtools/api-explorer/ApiDocsModal.d.ts.map +1 -1
  45. package/dist/components/devtools/api-explorer/ApiDocsModal.js +0 -0
  46. package/dist/components/devtools/api-explorer/ApiExplorer.d.ts.map +1 -1
  47. package/dist/components/devtools/api-explorer/ApiExplorer.js +2 -1
  48. package/dist/components/devtools/scheduled-actions/actions-table.d.ts.map +1 -1
  49. package/dist/components/devtools/scheduled-actions/actions-table.js +3 -2
  50. package/dist/components/docs/docs-sidebar.d.ts.map +1 -1
  51. package/dist/components/docs/docs-sidebar.js +3 -2
  52. package/dist/components/entities/EntityFieldRenderer.d.ts.map +1 -1
  53. package/dist/components/entities/EntityFieldRenderer.js +2 -1
  54. package/dist/components/entities/EntityList.d.ts.map +1 -1
  55. package/dist/components/entities/EntityList.js +2 -1
  56. package/dist/components/entities/EntityTable.d.ts.map +1 -1
  57. package/dist/components/entities/EntityTable.js +3 -2
  58. package/dist/components/entities/ErrorBoundary.d.ts.map +1 -1
  59. package/dist/components/entities/ErrorBoundary.js +2 -1
  60. package/dist/components/entities/wrappers/EntityDetailWrapper.d.ts.map +1 -1
  61. package/dist/components/entities/wrappers/EntityDetailWrapper.js +3 -2
  62. package/dist/components/media/MediaCard.d.ts.map +1 -1
  63. package/dist/components/media/MediaCard.js +2 -1
  64. package/dist/components/media/MediaDetailPanel.d.ts.map +1 -1
  65. package/dist/components/media/MediaDetailPanel.js +2 -1
  66. package/dist/components/media/MediaList.d.ts.map +1 -1
  67. package/dist/components/media/MediaList.js +2 -1
  68. package/dist/components/media/MediaSelector.d.ts.map +1 -1
  69. package/dist/components/media/MediaSelector.js +2 -1
  70. package/dist/components/media/MediaUploadZone.d.ts.map +1 -1
  71. package/dist/components/media/MediaUploadZone.js +2 -1
  72. package/dist/components/public/entities/PublicEntityDetail.d.ts.map +1 -1
  73. package/dist/components/public/entities/PublicEntityDetail.js +2 -1
  74. package/dist/components/teams/TeamPendingInvitations.d.ts.map +1 -1
  75. package/dist/components/teams/TeamPendingInvitations.js +3 -2
  76. package/dist/components/ui/accordion.js +1 -1
  77. package/dist/components/ui/audio-upload.d.ts.map +1 -1
  78. package/dist/components/ui/audio-upload.js +2 -1
  79. package/dist/components/ui/avatar.d.ts +17 -1
  80. package/dist/components/ui/avatar.d.ts.map +1 -1
  81. package/dist/components/ui/avatar.js +29 -2
  82. package/dist/components/ui/badge.js +1 -1
  83. package/dist/components/ui/breadcrumb.d.ts +13 -0
  84. package/dist/components/ui/breadcrumb.d.ts.map +1 -1
  85. package/dist/components/ui/breadcrumb.js +23 -10
  86. package/dist/components/ui/button.js +1 -1
  87. package/dist/components/ui/card.js +1 -1
  88. package/dist/components/ui/checkbox.js +1 -1
  89. package/dist/components/ui/file-upload.d.ts.map +1 -1
  90. package/dist/components/ui/file-upload.js +2 -1
  91. package/dist/components/ui/image-upload.d.ts.map +1 -1
  92. package/dist/components/ui/image-upload.js +4 -3
  93. package/dist/components/ui/input.js +1 -1
  94. package/dist/components/ui/label.js +1 -1
  95. package/dist/components/ui/optimized-image.d.ts.map +1 -1
  96. package/dist/components/ui/optimized-image.js +5 -0
  97. package/dist/components/ui/pagination.d.ts +1 -1
  98. package/dist/components/ui/pagination.d.ts.map +1 -1
  99. package/dist/components/ui/pagination.js +3 -0
  100. package/dist/components/ui/progress.js +1 -1
  101. package/dist/components/ui/relation-display.d.ts.map +1 -1
  102. package/dist/components/ui/relation-display.js +3 -2
  103. package/dist/components/ui/separator.js +1 -1
  104. package/dist/components/ui/simple-relation-select.d.ts.map +1 -1
  105. package/dist/components/ui/simple-relation-select.js +7 -6
  106. package/dist/components/ui/skeleton.js +1 -1
  107. package/dist/components/ui/slider.js +1 -1
  108. package/dist/components/ui/switch.js +1 -1
  109. package/dist/components/ui/tabs.js +1 -1
  110. package/dist/components/ui/textarea.js +1 -1
  111. package/dist/components/ui/user-display.d.ts.map +1 -1
  112. package/dist/components/ui/user-display.js +2 -1
  113. package/dist/components/ui/user-select.d.ts.map +1 -1
  114. package/dist/components/ui/user-select.js +2 -1
  115. package/dist/components/ui/video-upload.d.ts.map +1 -1
  116. package/dist/components/ui/video-upload.js +3 -2
  117. package/dist/components/users/tables/UsersTable.d.ts.map +1 -1
  118. package/dist/components/users/tables/UsersTable.js +3 -2
  119. package/dist/contexts/SubscriptionContext.d.ts.map +1 -1
  120. package/dist/contexts/SubscriptionContext.js +4 -3
  121. package/dist/contexts/TeamContext.d.ts.map +1 -1
  122. package/dist/contexts/TeamContext.js +3 -2
  123. package/dist/hooks/useAccountPreferencesSync.d.ts.map +1 -1
  124. package/dist/hooks/useAccountPreferencesSync.js +2 -1
  125. package/dist/hooks/useApiExplorerNavigation.d.ts.map +1 -1
  126. package/dist/hooks/useApiExplorerNavigation.js +2 -1
  127. package/dist/hooks/useAuth.d.ts.map +1 -1
  128. package/dist/hooks/useAuth.js +3 -2
  129. package/dist/hooks/useEnsureUserMetadata.d.ts.map +1 -1
  130. package/dist/hooks/useEnsureUserMetadata.js +3 -2
  131. package/dist/hooks/useEntityWithMeta.d.ts.map +1 -1
  132. package/dist/hooks/useEntityWithMeta.js +3 -2
  133. package/dist/hooks/useInvoice.d.ts.map +1 -1
  134. package/dist/hooks/useInvoice.js +2 -1
  135. package/dist/hooks/useInvoices.d.ts.map +1 -1
  136. package/dist/hooks/useInvoices.js +2 -1
  137. package/dist/hooks/useMedia.d.ts.map +1 -1
  138. package/dist/hooks/useMedia.js +10 -9
  139. package/dist/hooks/useMediaUpload.d.ts.map +1 -1
  140. package/dist/hooks/useMediaUpload.js +2 -1
  141. package/dist/hooks/useMembership.d.ts.map +1 -1
  142. package/dist/hooks/useMembership.js +3 -2
  143. package/dist/hooks/usePatternUsages.d.ts.map +1 -1
  144. package/dist/hooks/usePatternUsages.js +3 -2
  145. package/dist/hooks/usePrefetch.d.ts.map +1 -1
  146. package/dist/hooks/usePrefetch.js +3 -2
  147. package/dist/hooks/useQuota.d.ts.map +1 -1
  148. package/dist/hooks/useQuota.js +2 -1
  149. package/dist/hooks/useTeamInvitations.d.ts.map +1 -1
  150. package/dist/hooks/useTeamInvitations.js +4 -3
  151. package/dist/hooks/useTeamMembers.d.ts.map +1 -1
  152. package/dist/hooks/useTeamMembers.js +5 -4
  153. package/dist/hooks/useTeamUpdate.d.ts.map +1 -1
  154. package/dist/hooks/useTeamUpdate.js +2 -1
  155. package/dist/hooks/useUserProfile.d.ts.map +1 -1
  156. package/dist/hooks/useUserProfile.js +3 -2
  157. package/dist/hooks/useUserSettings.d.ts.map +1 -1
  158. package/dist/hooks/useUserSettings.js +3 -2
  159. package/dist/lib/actions/entity.actions.d.ts.map +1 -1
  160. package/dist/lib/actions/entity.actions.js +2 -1
  161. package/dist/lib/api/entities.d.ts.map +1 -1
  162. package/dist/lib/api/entities.js +4 -3
  163. package/dist/lib/auth/verify-email-link.d.ts +10 -0
  164. package/dist/lib/auth/verify-email-link.d.ts.map +1 -0
  165. package/dist/lib/auth/verify-email-link.js +14 -0
  166. package/dist/lib/auth-client.d.ts +2 -0
  167. package/dist/lib/auth-client.d.ts.map +1 -1
  168. package/dist/lib/auth-client.js +4 -0
  169. package/dist/lib/auth.d.ts.map +1 -1
  170. package/dist/lib/auth.js +10 -2
  171. package/dist/lib/base-path.d.ts +85 -0
  172. package/dist/lib/base-path.d.ts.map +1 -0
  173. package/dist/lib/base-path.js +79 -0
  174. package/dist/lib/billing/schema.d.ts +1 -1
  175. package/dist/lib/billing/schema.d.ts.map +1 -1
  176. package/dist/lib/billing/schema.js +1 -1
  177. package/dist/lib/blocks/sanitize-html.d.ts.map +1 -1
  178. package/dist/lib/blocks/sanitize-html.js +18 -2
  179. package/dist/lib/cache/revalidate-tag.d.ts +14 -0
  180. package/dist/lib/cache/revalidate-tag.d.ts.map +1 -0
  181. package/dist/lib/cache/revalidate-tag.js +8 -0
  182. package/dist/lib/config/dashboard-schema.d.ts +1 -1
  183. package/dist/lib/config/dashboard-schema.d.ts.map +1 -1
  184. package/dist/lib/config/dashboard-schema.js +1 -1
  185. package/dist/lib/config/types.d.ts +36 -16
  186. package/dist/lib/config/types.d.ts.map +1 -1
  187. package/dist/lib/docs/access.d.ts +28 -0
  188. package/dist/lib/docs/access.d.ts.map +1 -0
  189. package/dist/lib/docs/access.js +16 -0
  190. package/dist/lib/docs/parser.d.ts.map +1 -1
  191. package/dist/lib/docs/parser.js +2 -1
  192. package/dist/lib/docs/remark-doc-links.d.ts +14 -0
  193. package/dist/lib/docs/remark-doc-links.d.ts.map +1 -0
  194. package/dist/lib/docs/remark-doc-links.js +38 -0
  195. package/dist/lib/entities/api-generator.d.ts +1 -1
  196. package/dist/lib/entities/api-generator.d.ts.map +1 -1
  197. package/dist/lib/entities/api-generator.js +1 -1
  198. package/dist/lib/entities/schema-generator.d.ts +1 -1
  199. package/dist/lib/entities/schema-generator.d.ts.map +1 -1
  200. package/dist/lib/entities/schema-generator.js +1 -1
  201. package/dist/lib/mcp/engine.js +1 -1
  202. package/dist/lib/mcp/schema-builder.d.ts +1 -1
  203. package/dist/lib/mcp/schema-builder.d.ts.map +1 -1
  204. package/dist/lib/mcp/schema-builder.js +1 -1
  205. package/dist/lib/mcp/tool-generator.js +1 -1
  206. package/dist/lib/mcp/types.d.ts +1 -1
  207. package/dist/lib/mcp/types.d.ts.map +1 -1
  208. package/dist/lib/media/schemas.d.ts +1 -1
  209. package/dist/lib/media/schemas.d.ts.map +1 -1
  210. package/dist/lib/media/schemas.js +1 -1
  211. package/dist/lib/middleware/index.d.ts +5 -1
  212. package/dist/lib/middleware/index.d.ts.map +1 -1
  213. package/dist/lib/middleware/index.js +3 -2
  214. package/dist/lib/services/meta.service.d.ts +60 -0
  215. package/dist/lib/services/meta.service.d.ts.map +1 -1
  216. package/dist/lib/services/meta.service.js +132 -12
  217. package/dist/lib/services/middleware.service.d.ts.map +1 -1
  218. package/dist/lib/services/middleware.service.js +3 -2
  219. package/dist/lib/teams/schema.d.ts +1 -1
  220. package/dist/lib/teams/schema.d.ts.map +1 -1
  221. package/dist/lib/teams/schema.js +1 -1
  222. package/dist/lib/teams/teams.api.d.ts.map +1 -1
  223. package/dist/lib/teams/teams.api.js +4 -3
  224. package/dist/lib/user-data-client.d.ts.map +1 -1
  225. package/dist/lib/user-data-client.js +3 -2
  226. package/dist/lib/validation/invoices.d.ts +1 -1
  227. package/dist/lib/validation/invoices.d.ts.map +1 -1
  228. package/dist/lib/validation/invoices.js +1 -1
  229. package/dist/lib/validation-schemas.d.ts +1 -1
  230. package/dist/lib/validation-schemas.d.ts.map +1 -1
  231. package/dist/lib/validation-schemas.js +1 -1
  232. package/dist/lib/validation.d.ts +1 -1
  233. package/dist/lib/validation.d.ts.map +1 -1
  234. package/dist/lib/validation.js +1 -1
  235. package/dist/messages/de/footer.json +0 -1
  236. package/dist/messages/de/index.d.ts +0 -1
  237. package/dist/messages/de/index.d.ts.map +1 -1
  238. package/dist/messages/en/footer.json +0 -1
  239. package/dist/messages/en/index.d.ts +0 -1
  240. package/dist/messages/en/index.d.ts.map +1 -1
  241. package/dist/messages/es/footer.json +0 -1
  242. package/dist/messages/es/index.d.ts +0 -1
  243. package/dist/messages/es/index.d.ts.map +1 -1
  244. package/dist/messages/fr/footer.json +0 -1
  245. package/dist/messages/fr/index.d.ts +0 -1
  246. package/dist/messages/fr/index.d.ts.map +1 -1
  247. package/dist/messages/it/footer.json +0 -1
  248. package/dist/messages/it/index.d.ts +0 -1
  249. package/dist/messages/it/index.d.ts.map +1 -1
  250. package/dist/messages/pt/footer.json +0 -1
  251. package/dist/messages/pt/index.d.ts +0 -1
  252. package/dist/messages/pt/index.d.ts.map +1 -1
  253. package/dist/templates/app/(auth)/accept-invite/[token]/page.tsx +4 -3
  254. package/dist/templates/app/(auth)/verify-email/page.tsx +4 -3
  255. package/dist/templates/app/(public)/docs/[section]/[page]/page.tsx +11 -0
  256. package/dist/templates/app/api/auth/[...all]/route.ts +15 -14
  257. package/dist/templates/app/api/internal/user-metadata/route.ts +6 -8
  258. package/dist/templates/app/api/user/plan-flags/route.ts +1 -1
  259. package/dist/templates/app/api/user/profile/route.ts +12 -17
  260. package/dist/templates/app/api/v1/api-keys/route.ts +1 -1
  261. package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +2 -1
  262. package/dist/templates/app/api/v1/billing/cancel/route.ts +1 -1
  263. package/dist/templates/app/api/v1/billing/change-plan/route.ts +1 -1
  264. package/dist/templates/app/api/v1/billing/check-action/route.ts +1 -1
  265. package/dist/templates/app/api/v1/billing/checkout/route.ts +1 -1
  266. package/dist/templates/app/api/v1/blocks/validate/route.ts +1 -1
  267. package/dist/templates/app/api/v1/media/[id]/tags/route.ts +1 -1
  268. package/dist/templates/app/api/v1/post-categories/[id]/route.ts +1 -1
  269. package/dist/templates/app/api/v1/post-categories/route.ts +1 -1
  270. package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +2 -1
  271. package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +3 -5
  272. package/dist/templates/app/api/v1/teams/docs.md +4 -9
  273. package/dist/templates/app/api/v1/teams/switch/route.ts +1 -1
  274. package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +1 -1
  275. package/dist/templates/app/api/v1/users/[id]/route.ts +1 -1
  276. package/dist/templates/app/api/v1/users/route.ts +1 -1
  277. package/dist/templates/app/dashboard/(main)/media/page.tsx +3 -1
  278. package/dist/templates/app/dashboard/settings/api-keys/page.tsx +5 -4
  279. package/dist/templates/app/dashboard/settings/profile/page.tsx +3 -2
  280. package/dist/templates/app/devtools/scheduled-actions/page.tsx +2 -1
  281. package/dist/templates/app/superadmin/docs/[section]/[page]/page.tsx +16 -0
  282. package/dist/templates/app/superadmin/subscriptions/page.tsx +3 -2
  283. package/dist/templates/app/superadmin/teams/[teamId]/page.tsx +5 -4
  284. package/dist/templates/app/superadmin/users/[userId]/page.tsx +2 -1
  285. package/dist/templates/app/superadmin/users/page.tsx +2 -1
  286. package/dist/templates/blocks/cta-section/component.tsx +3 -2
  287. package/dist/templates/blocks/cta-section/schema.ts +1 -1
  288. package/dist/templates/blocks/features-grid/component.tsx +2 -1
  289. package/dist/templates/blocks/features-grid/schema.ts +1 -1
  290. package/dist/templates/blocks/hero/component.tsx +3 -2
  291. package/dist/templates/blocks/hero/schema.ts +1 -1
  292. package/dist/templates/blocks/testimonials/component.tsx +2 -1
  293. package/dist/templates/blocks/testimonials/schema.ts +1 -1
  294. package/dist/templates/blocks/text-content/component.tsx +2 -1
  295. package/dist/templates/blocks/text-content/schema.ts +1 -1
  296. package/dist/templates/ci-workflows/README.md +1 -1
  297. package/dist/templates/ci-workflows/github/cypress-regression.yml +1 -1
  298. package/dist/templates/ci-workflows/github/cypress-smoke.yml +1 -1
  299. package/dist/templates/contents/plugins/starter/plugin/api/example/route.ts.template +1 -1
  300. package/dist/templates/contents/themes/starter/blocks/cta-section/component.tsx +3 -2
  301. package/dist/templates/contents/themes/starter/blocks/cta-section/schema.ts +1 -1
  302. package/dist/templates/contents/themes/starter/blocks/features-grid/component.tsx +2 -1
  303. package/dist/templates/contents/themes/starter/blocks/features-grid/schema.ts +1 -1
  304. package/dist/templates/contents/themes/starter/blocks/hero/component.tsx +3 -2
  305. package/dist/templates/contents/themes/starter/blocks/hero/schema.ts +1 -1
  306. package/dist/templates/contents/themes/starter/blocks/testimonials/component.tsx +3 -2
  307. package/dist/templates/contents/themes/starter/blocks/testimonials/schema.ts +1 -1
  308. package/dist/templates/contents/themes/starter/blocks/text-content/component.tsx +2 -1
  309. package/dist/templates/contents/themes/starter/blocks/text-content/schema.ts +1 -1
  310. package/dist/templates/contents/themes/starter/entities/posts/components/post-header.tsx +2 -1
  311. package/dist/templates/contents/themes/starter/lib/hooks/useAnalyticsData.ts +2 -1
  312. package/dist/templates/contents/themes/starter/lib/hooks/useTaskStats.ts +2 -1
  313. package/dist/templates/eslint.config.mjs +133 -9
  314. package/dist/templates/features/blog/blocks/post-content/component.tsx +2 -1
  315. package/dist/templates/features/blog/blocks/post-content/schema.ts +1 -1
  316. package/dist/templates/features/blog/entities/posts/components/post-header.tsx +2 -1
  317. package/dist/templates/features/pages/blocks/hero/component.tsx +3 -2
  318. package/dist/templates/features/pages/blocks/hero/schema.ts +1 -1
  319. package/dist/templates/next.config.mjs +50 -29
  320. package/dist/templates/proxy.ts +100 -21
  321. package/dist/templates/public/sw.js +2 -2
  322. package/dist/templates/scripts/cy-run-prod.cjs +5 -5
  323. package/dist/types/blocks.d.ts +1 -1
  324. package/dist/types/blocks.d.ts.map +1 -1
  325. package/dist/types/blocks.js +1 -1
  326. package/package.json +9 -5
  327. package/scripts/build/docs-registry.mjs +7 -7
  328. package/scripts/build/registry/__tests__/billing-registry.test.mjs +43 -0
  329. package/scripts/build/registry/__tests__/build-output.test.mjs +209 -0
  330. package/scripts/build/registry/__tests__/copy-race-child.mjs +14 -0
  331. package/scripts/build/registry/__tests__/direct-fs-writes.mjs +203 -0
  332. package/scripts/build/registry/__tests__/globals-css-tag.test.mjs +66 -0
  333. package/scripts/build/registry/__tests__/icons-discovery.test.mjs +530 -29
  334. package/scripts/build/registry/__tests__/page-generator.test.mjs +211 -37
  335. package/scripts/build/registry/__tests__/published-signatures.test.mjs +239 -0
  336. package/scripts/build/registry/__tests__/route-file-rule.test.mjs +170 -0
  337. package/scripts/build/registry/__tests__/safe-fs.test.mjs +333 -0
  338. package/scripts/build/registry/__tests__/template-analysis.test.mjs +142 -0
  339. package/scripts/build/registry/__tests__/template-registry.test.mjs +279 -9
  340. package/scripts/build/registry/__tests__/templates-plan.test.mjs +128 -0
  341. package/scripts/build/registry/__tests__/templates-tree.test.mjs +367 -0
  342. package/scripts/build/registry/__tests__/write-places.test.mjs +425 -0
  343. package/scripts/build/registry/config.mjs +6 -65
  344. package/scripts/build/registry/discovery/icons.mjs +498 -43
  345. package/scripts/build/registry/discovery/templates.mjs +1 -1
  346. package/scripts/build/registry/generators/billing-registry.mjs +1 -1
  347. package/scripts/build/registry/generators/docs-registry.mjs +3 -4
  348. package/scripts/build/registry/generators/feature-registry.mjs +1 -1
  349. package/scripts/build/registry/generators/permissions-registry.mjs +2 -2
  350. package/scripts/build/registry/generators/template-registry.mjs +65 -49
  351. package/scripts/build/registry/index.mjs +1 -2
  352. package/scripts/build/registry/post-build/index.mjs +1 -1
  353. package/scripts/build/registry/post-build/own-gitignores.mjs +220 -0
  354. package/scripts/build/registry/post-build/page-generator.mjs +512 -268
  355. package/scripts/build/registry/post-build/route-cleanup.mjs +16 -13
  356. package/scripts/build/registry/post-build/test-fixtures.mjs +26 -8
  357. package/scripts/build/registry/project-mode.mjs +76 -0
  358. package/scripts/build/registry/shared/typescript-compiler.mjs +77 -0
  359. package/scripts/build/registry/validate-env.test.mjs +12 -8
  360. package/scripts/build/registry/watch.mjs +3 -53
  361. package/scripts/build/registry/write-places.mjs +228 -0
  362. package/scripts/build/registry.mjs +53 -30
  363. package/scripts/build/safe-fs.mjs +279 -0
  364. package/scripts/build/templates-plan.mjs +44 -0
  365. package/scripts/build/theme.mjs +46 -42
  366. package/scripts/build/update-tsconfig.mjs +16 -15
  367. package/scripts/db/cluster-changes.mjs +205 -0
  368. package/scripts/db/connection-time-limits.mjs +53 -0
  369. package/scripts/db/inspect-server.mjs +108 -0
  370. package/scripts/db/migration-time-limit.mjs +695 -0
  371. package/scripts/db/run-migrations.mjs +46 -41
  372. package/scripts/db/ssl-config.mjs +194 -0
  373. package/scripts/db/theme-location.mjs +69 -0
  374. package/scripts/db/verify-tables.mjs +3 -8
  375. package/scripts/db/verify-teams.mjs +2 -6
  376. package/scripts/db/verify-theme-migrations.mjs +169 -0
  377. package/scripts/maintenance/core-updater.mjs +1003 -0
  378. package/scripts/maintenance/step-guard.mjs +74 -0
  379. package/scripts/maintenance/update-core.mjs +14 -831
  380. package/scripts/utils/console-guard.mjs +13 -0
  381. package/scripts/utils/generated-tag.mjs +66 -0
  382. package/scripts/utils/index.mjs +9 -1
  383. package/scripts/utils/logging.mjs +140 -0
  384. package/templates/app/(auth)/accept-invite/[token]/page.tsx +4 -3
  385. package/templates/app/(auth)/verify-email/page.tsx +4 -3
  386. package/templates/app/(public)/docs/[section]/[page]/page.tsx +11 -0
  387. package/templates/app/api/auth/[...all]/route.ts +15 -14
  388. package/templates/app/api/internal/user-metadata/route.ts +6 -8
  389. package/templates/app/api/user/plan-flags/route.ts +1 -1
  390. package/templates/app/api/user/profile/route.ts +12 -17
  391. package/templates/app/api/v1/api-keys/route.ts +1 -1
  392. package/templates/app/api/v1/auth/signup-with-invite/route.ts +2 -1
  393. package/templates/app/api/v1/billing/cancel/route.ts +1 -1
  394. package/templates/app/api/v1/billing/change-plan/route.ts +1 -1
  395. package/templates/app/api/v1/billing/check-action/route.ts +1 -1
  396. package/templates/app/api/v1/billing/checkout/route.ts +1 -1
  397. package/templates/app/api/v1/blocks/validate/route.ts +1 -1
  398. package/templates/app/api/v1/media/[id]/tags/route.ts +1 -1
  399. package/templates/app/api/v1/post-categories/[id]/route.ts +1 -1
  400. package/templates/app/api/v1/post-categories/route.ts +1 -1
  401. package/templates/app/api/v1/teams/[teamId]/members/route.ts +2 -1
  402. package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +3 -5
  403. package/templates/app/api/v1/teams/docs.md +4 -9
  404. package/templates/app/api/v1/teams/switch/route.ts +1 -1
  405. package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +1 -1
  406. package/templates/app/api/v1/users/[id]/route.ts +1 -1
  407. package/templates/app/api/v1/users/route.ts +1 -1
  408. package/templates/app/dashboard/(main)/media/page.tsx +3 -1
  409. package/templates/app/dashboard/settings/api-keys/page.tsx +5 -4
  410. package/templates/app/dashboard/settings/profile/page.tsx +3 -2
  411. package/templates/app/devtools/scheduled-actions/page.tsx +2 -1
  412. package/templates/app/superadmin/docs/[section]/[page]/page.tsx +16 -0
  413. package/templates/app/superadmin/subscriptions/page.tsx +3 -2
  414. package/templates/app/superadmin/teams/[teamId]/page.tsx +5 -4
  415. package/templates/app/superadmin/users/[userId]/page.tsx +2 -1
  416. package/templates/app/superadmin/users/page.tsx +2 -1
  417. package/templates/blocks/cta-section/component.tsx +3 -2
  418. package/templates/blocks/cta-section/schema.ts +1 -1
  419. package/templates/blocks/features-grid/component.tsx +2 -1
  420. package/templates/blocks/features-grid/schema.ts +1 -1
  421. package/templates/blocks/hero/component.tsx +3 -2
  422. package/templates/blocks/hero/schema.ts +1 -1
  423. package/templates/blocks/testimonials/component.tsx +2 -1
  424. package/templates/blocks/testimonials/schema.ts +1 -1
  425. package/templates/blocks/text-content/component.tsx +2 -1
  426. package/templates/blocks/text-content/schema.ts +1 -1
  427. package/templates/ci-workflows/README.md +1 -1
  428. package/templates/ci-workflows/github/cypress-regression.yml +1 -1
  429. package/templates/ci-workflows/github/cypress-smoke.yml +1 -1
  430. package/templates/contents/plugins/starter/plugin/api/example/route.ts.template +1 -1
  431. package/templates/contents/themes/starter/blocks/cta-section/component.tsx +3 -2
  432. package/templates/contents/themes/starter/blocks/cta-section/schema.ts +1 -1
  433. package/templates/contents/themes/starter/blocks/features-grid/component.tsx +2 -1
  434. package/templates/contents/themes/starter/blocks/features-grid/schema.ts +1 -1
  435. package/templates/contents/themes/starter/blocks/hero/component.tsx +3 -2
  436. package/templates/contents/themes/starter/blocks/hero/schema.ts +1 -1
  437. package/templates/contents/themes/starter/blocks/testimonials/component.tsx +3 -2
  438. package/templates/contents/themes/starter/blocks/testimonials/schema.ts +1 -1
  439. package/templates/contents/themes/starter/blocks/text-content/component.tsx +2 -1
  440. package/templates/contents/themes/starter/blocks/text-content/schema.ts +1 -1
  441. package/templates/contents/themes/starter/entities/posts/components/post-header.tsx +2 -1
  442. package/templates/contents/themes/starter/lib/hooks/useAnalyticsData.ts +2 -1
  443. package/templates/contents/themes/starter/lib/hooks/useTaskStats.ts +2 -1
  444. package/templates/eslint.config.mjs +133 -9
  445. package/templates/features/blog/blocks/post-content/component.tsx +2 -1
  446. package/templates/features/blog/blocks/post-content/schema.ts +1 -1
  447. package/templates/features/blog/entities/posts/components/post-header.tsx +2 -1
  448. package/templates/features/pages/blocks/hero/component.tsx +3 -2
  449. package/templates/features/pages/blocks/hero/schema.ts +1 -1
  450. package/templates/next.config.mjs +50 -29
  451. package/templates/proxy.ts +100 -21
  452. package/templates/public/sw.js +2 -2
  453. package/templates/scripts/cy-run-prod.cjs +5 -5
  454. package/tests/jest/__mocks__/@nextsparkjs/registries/template-registry.client.ts +11 -0
  455. package/tests/jest/__mocks__/next-server.js +10 -0
  456. package/scripts/build/docs.mjs +0 -392
@@ -1,9 +1,8 @@
1
1
  /**
2
- * @nextspark-generated
3
- *
4
- * `nextspark sync:app` replaces this file while that tag is present, which is
5
- * how a release ships changes to it. Delete the tag line to own the file: from
6
- * then on sync reports it and leaves it alone.
2
+ * `nextspark sync:app` keeps this file up to date while its first line is the
3
+ * generated tag sync writes and the rest of the file is unchanged since then,
4
+ * which is how a release ships changes to it. Edit the file, or delete that
5
+ * line, to own it: from then on sync reports it and leaves it alone.
7
6
  *
8
7
  * NextSpark Proxy (Next.js 16+)
9
8
  *
@@ -12,9 +11,10 @@
12
11
  *
13
12
  * Key responsibilities:
14
13
  * 1. Theme middleware override support
15
- * 2. Documentation access control
16
- * 3. Protected route authentication, and the roles /superadmin and /devtools need
17
- * 4. User header injection for downstream use (x-user-id, x-pathname, x-active-team-id)
14
+ * 2. Redirecting historical 3-level docs URLs to their current route
15
+ * 3. Documentation access control
16
+ * 4. Protected route authentication, and the roles /superadmin and /devtools need
17
+ * 5. User header injection for downstream use (x-user-id, x-pathname, x-active-team-id)
18
18
  *
19
19
  * IMPORTANT: The EntityPermissionLayout depends on x-user-id and x-pathname
20
20
  * headers being set here for server-side permission validation.
@@ -28,6 +28,8 @@ import {
28
28
  } from '@nextsparkjs/core/lib/middleware'
29
29
  import { ACTIVE_TEAM_COOKIE, activeTeamIdForSession } from '@nextsparkjs/core/lib/teams/active-team-cookie'
30
30
  import { SESSION_HINT_COOKIE, SESSION_HINT_MAX_AGE, hasSessionCookie } from '@nextsparkjs/core/lib/auth/session-hint'
31
+ import { isDocsPublic, legacyDocsAccessMessage } from '@nextsparkjs/core/lib/docs/access'
32
+ import { DOCS_REGISTRY } from '@nextsparkjs/registries/docs-registry'
31
33
 
32
34
  /**
33
35
  * Session type for proxy (inline definition)
@@ -91,6 +93,45 @@ function appUrl(request: NextRequest, pathname: string): NextRequest['nextUrl']
91
93
  return url
92
94
  }
93
95
 
96
+ /**
97
+ * Whether `pathname` is a docs page route — `/docs/<section>/<page>` or
98
+ * `/superadmin/docs/<section>/<page>` — whose section and page the docs
99
+ * registry does not have together. Segments are compared decoded, the way the
100
+ * page reads its params.
101
+ */
102
+ function isMissingDocsPage(pathname: string): boolean {
103
+ const match = pathname.match(/^(\/superadmin)?\/docs\/([^/]+)\/([^/]+)$/)
104
+ if (!match) return false
105
+
106
+ let sectionSlug: string
107
+ let pageSlug: string
108
+ try {
109
+ sectionSlug = decodeURIComponent(match[2])
110
+ pageSlug = decodeURIComponent(match[3])
111
+ } catch {
112
+ return true
113
+ }
114
+
115
+ const sections = match[1] ? DOCS_REGISTRY.superadmin : DOCS_REGISTRY.public
116
+ return !sections.some(section => section.slug === sectionSlug && section.pages.some(page => page.slug === pageSlug))
117
+ }
118
+
119
+ /**
120
+ * Serve the app's not-found page with a 404 status for a docs page the
121
+ * registry does not have. The docs pages answer 404 on their own only where
122
+ * their `dynamicParams = false` has a list to check: in `next dev`, and for
123
+ * public docs prerendered by an app whose locale is fixed. Rendered on demand
124
+ * (superadmin docs always, public docs when the locale comes from the
125
+ * request), their notFound() runs inside the layouts' Suspense boundaries,
126
+ * after the response head has gone out with a 200. Deciding it here, before
127
+ * anything renders, gives those requests the 404.
128
+ */
129
+ function rewriteToNotFound(request: NextRequest, requestHeaders: Headers): NextResponse {
130
+ return syncSessionHint(request, NextResponse.rewrite(appUrl(request, '/_not-found'), {
131
+ request: { headers: requestHeaders },
132
+ }))
133
+ }
134
+
94
135
  /**
95
136
  * Send a visitor without a session to login. LoginForm reads `callbackUrl` and
96
137
  * returns them to the page they asked for, query included, once signed in.
@@ -178,6 +219,18 @@ function passThrough(request: NextRequest, requestHeaders: Headers): NextRespons
178
219
  }))
179
220
  }
180
221
 
222
+ let legacyDocsAccessWarned = false
223
+
224
+ /** Says once per server process what to change in an app config that still
225
+ * gates /docs with the older `docs.public` boolean. */
226
+ function warnLegacyDocsAccess(docsConfig: Parameters<typeof legacyDocsAccessMessage>[0]): void {
227
+ if (legacyDocsAccessWarned) return
228
+ const message = legacyDocsAccessMessage(docsConfig)
229
+ if (!message) return
230
+ legacyDocsAccessWarned = true
231
+ console.warn(`[NextSpark] ${message}`)
232
+ }
233
+
181
234
  export async function proxy(request: NextRequest) {
182
235
  const { pathname } = request.nextUrl
183
236
 
@@ -191,36 +244,58 @@ export async function proxy(request: NextRequest) {
191
244
  if (themeResponse) return themeResponse
192
245
  }
193
246
 
194
- // 2. Redirect old docs URLs to new structure (2-level -> 3-level)
195
- const oldDocsPattern = /^\/docs\/([^\/]+)\/([^\/]+)$/
196
- const oldDocsMatch = pathname.match(oldDocsPattern)
197
-
247
+ // 2. Redirect historical 3-level docs URLs (/docs/<core|theme>/<section>/<page>)
248
+ // to the current route. That split predates this app's history: `core` and
249
+ // `theme` were the only two categories ever generated (a third, `plugins`,
250
+ // was scaffolded but never activated), and both were collapsed into a single
251
+ // docs tree per source - `public` (served at /docs) and `superadmin` (served
252
+ // at /superadmin/docs) - without renaming any section that survived the
253
+ // collapse. A section from that era can therefore only be in one of the two
254
+ // registries today, or in neither if its docs were dropped rather than
255
+ // moved; the redirect follows the section, not the old category. The page
256
+ // has to survive too - a section can live on with a different set of pages -
257
+ // so both are checked against the registry rather than only the section,
258
+ // which is the one thing this route can actually confirm still resolves.
259
+ const oldDocsMatch = pathname.match(/^\/docs\/(?:core|theme)\/([^/]+)\/([^/]+)$/)
198
260
  if (oldDocsMatch) {
199
261
  const [, sectionSlug, pageSlug] = oldDocsMatch
200
- const themeSections = ['theme-overview', 'theme-features']
201
- const category = themeSections.includes(sectionSlug) ? 'theme' : 'core'
202
- const cleanSection = sectionSlug.replace(/^theme-/, '')
203
-
204
262
  const newUrl = request.nextUrl.clone()
205
- newUrl.pathname = `/docs/${category}/${cleanSection}/${pageSlug}`
263
+ const superadminSection = DOCS_REGISTRY.superadmin.find((section) => section.slug === sectionSlug)
264
+ const publicSection = DOCS_REGISTRY.public.find((section) => section.slug === sectionSlug)
265
+
266
+ if (superadminSection?.pages.some((page) => page.slug === pageSlug)) {
267
+ newUrl.pathname = `/superadmin/docs/${sectionSlug}/${pageSlug}`
268
+ } else if (publicSection?.pages.some((page) => page.slug === pageSlug)) {
269
+ newUrl.pathname = `/docs/${sectionSlug}/${pageSlug}`
270
+ } else {
271
+ // The section is gone, or survived without this exact page - either way
272
+ // there is no page left to send this to, so it goes to the docs home
273
+ // instead of a dead link.
274
+ newUrl.pathname = '/docs'
275
+ }
206
276
  return NextResponse.redirect(newUrl, 301)
207
277
  }
208
278
 
209
- // 3. Documentation access control
279
+ // 3. Documentation access control: docs.publicAccess, or the older
280
+ // docs.public boolean it replaced (see lib/docs/access)
210
281
  if (isUnder(pathname, '/docs')) {
211
- const appConfig = getThemeAppConfig(activeTheme as string)
282
+ const docsConfig = getThemeAppConfig(activeTheme as string)?.docs
283
+ warnLegacyDocsAccess(docsConfig)
212
284
 
213
- if (appConfig?.docs?.public === false) {
285
+ if (!isDocsPublic(docsConfig)) {
214
286
  try {
215
287
  const { data: session } = await getSession(request)
216
288
 
217
289
  if (!session) {
218
290
  return redirectToLogin(request)
219
291
  }
220
- } catch (error) {
292
+ } catch {
221
293
  return redirectToLogin(request)
222
294
  }
223
295
  }
296
+ if (isMissingDocsPage(pathname)) {
297
+ return rewriteToNotFound(request, requestHeaders)
298
+ }
224
299
  return passThrough(request, requestHeaders)
225
300
  }
226
301
 
@@ -290,6 +365,10 @@ export async function proxy(request: NextRequest) {
290
365
  requestHeaders.set('x-active-team-id', activeTeamId)
291
366
  }
292
367
 
368
+ if (isSuperadminRoute && isMissingDocsPage(pathname)) {
369
+ return rewriteToNotFound(request, requestHeaders)
370
+ }
371
+
293
372
  return passThrough(request, requestHeaders)
294
373
  } catch (error) {
295
374
  console.error('Proxy error:', error)
@@ -1,10 +1,10 @@
1
1
  // Empty service worker to prevent 404 errors
2
2
  // This file exists only to stop browsers from requesting a non-existent service worker
3
3
 
4
- self.addEventListener('install', function(event) {
4
+ self.addEventListener('install', function() {
5
5
  // No caching or special behavior
6
6
  });
7
7
 
8
- self.addEventListener('fetch', function(event) {
8
+ self.addEventListener('fetch', function() {
9
9
  // No fetch interception
10
10
  });
@@ -83,7 +83,7 @@ function killPort(port) {
83
83
  if (pid && /^\d+$/.test(pid)) {
84
84
  try {
85
85
  execSync(`taskkill /PID ${pid} /F`, { stdio: 'ignore' })
86
- } catch (e) {
86
+ } catch {
87
87
  // Process might already be dead
88
88
  }
89
89
  }
@@ -92,7 +92,7 @@ function killPort(port) {
92
92
  execSync(`lsof -ti:${port} | xargs kill -9 2>/dev/null || true`, { stdio: 'ignore' })
93
93
  }
94
94
  console.log(`[cy:run:prod] Port ${port} cleared`)
95
- } catch (e) {
95
+ } catch {
96
96
  // No process on port, that's fine
97
97
  console.log(`[cy:run:prod] Port ${port} was already free`)
98
98
  }
@@ -206,16 +206,16 @@ function cleanup(server) {
206
206
  // Kill process group
207
207
  try {
208
208
  process.kill(-server.pid, 'SIGKILL')
209
- } catch (e) {
209
+ } catch {
210
210
  // If process group kill fails, try direct kill
211
211
  try {
212
212
  server.kill('SIGKILL')
213
- } catch (e2) {
213
+ } catch {
214
214
  // Process might already be dead
215
215
  }
216
216
  }
217
217
  }
218
- } catch (e) {
218
+ } catch {
219
219
  // Process might already be dead
220
220
  }
221
221
  }
@@ -4,7 +4,7 @@
4
4
  * Type definitions for the dynamic block editor system.
5
5
  * Supports WordPress/Webflow-style page building with reusable blocks.
6
6
  */
7
- import { z } from 'zod';
7
+ import * as z from 'zod';
8
8
  /**
9
9
  * Media Reference Schema
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/types/blocks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/types/blocks.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { z } from "zod";
1
+ import * as z from "zod";
2
2
  const mediaRefObjectSchema = z.object({
3
3
  mediaId: z.string(),
4
4
  url: z.string()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextsparkjs/core",
3
- "version": "0.1.0-beta.189",
3
+ "version": "0.1.0-beta.190",
4
4
  "description": "NextSpark - The complete SaaS framework for Next.js",
5
5
  "license": "MIT",
6
6
  "author": "NextSpark <hello@nextspark.dev>",
@@ -31,6 +31,9 @@
31
31
  "main": "./dist/index.js",
32
32
  "module": "./dist/index.js",
33
33
  "types": "./dist/index.d.ts",
34
+ "bin": {
35
+ "update-core": "./scripts/maintenance/update-core.mjs"
36
+ },
34
37
  "exports": {
35
38
  ".": {
36
39
  "types": "./dist/index.d.ts",
@@ -381,11 +384,12 @@
381
384
  "scripts"
382
385
  ],
383
386
  "peerDependencies": {
384
- "next": ">=14.0.0",
387
+ "next": ">=15.0.0",
385
388
  "react": ">=18.0.0",
386
389
  "react-dom": ">=18.0.0"
387
390
  },
388
391
  "devDependencies": {
392
+ "@better-fetch/fetch": "1.3.1",
389
393
  "@cypress/grep": "^5.0.1",
390
394
  "@tailwindcss/cli": "^4",
391
395
  "@testing-library/jest-dom": "^6.6.3",
@@ -405,8 +409,7 @@
405
409
  "jest-environment-jsdom": "^29.7.0",
406
410
  "tailwindcss": "^4",
407
411
  "ts-jest": "^29.2.5",
408
- "tsup": "^8.5.1",
409
- "typescript": "^5"
412
+ "tsup": "^8.5.1"
410
413
  },
411
414
  "dependencies": {
412
415
  "@babel/runtime": "^7.0.0",
@@ -484,9 +487,10 @@
484
487
  "sonner": "^2.0.7",
485
488
  "stripe": "^18.5.0",
486
489
  "tailwind-merge": "^3.3.1",
490
+ "typescript": "^5 || ^6",
487
491
  "uuid": "^13.0.0",
488
492
  "zod": "^4.3.6",
489
- "@nextsparkjs/testing": "0.1.0-beta.189"
493
+ "@nextsparkjs/testing": "0.1.0-beta.190"
490
494
  },
491
495
  "scripts": {
492
496
  "postinstall": "node scripts/postinstall.mjs || true",
@@ -16,10 +16,10 @@
16
16
  * Part of the registry system
17
17
  */
18
18
 
19
- import fs from 'fs'
19
+ import { existsSync, readdirSync } from 'fs'
20
20
  import path from 'path'
21
21
  import { fileURLToPath } from 'url'
22
- import { existsSync, mkdirSync } from 'fs'
22
+ import { projectFiles } from './safe-fs.mjs'
23
23
 
24
24
  const __filename = fileURLToPath(import.meta.url)
25
25
  const __dirname = path.dirname(__filename)
@@ -107,13 +107,13 @@ const PATH_PREFIX = IS_NPM_MODE ? '' : '../..'
107
107
  * @returns {Array} Array of section metadata
108
108
  */
109
109
  function scanDocsDirectory(docsPath, source) {
110
- if (!fs.existsSync(docsPath)) {
110
+ if (!existsSync(docsPath)) {
111
111
  console.log(` No docs found at: ${docsPath}`)
112
112
  return []
113
113
  }
114
114
 
115
115
  const sections = []
116
- const items = fs.readdirSync(docsPath, { withFileTypes: true })
116
+ const items = readdirSync(docsPath, { withFileTypes: true })
117
117
 
118
118
  for (const item of items) {
119
119
  if (!item.isDirectory()) continue
@@ -124,7 +124,7 @@ function scanDocsDirectory(docsPath, source) {
124
124
  const title = slugToTitle(slug)
125
125
 
126
126
  const pages = []
127
- const files = fs.readdirSync(sectionPath)
127
+ const files = readdirSync(sectionPath)
128
128
 
129
129
  for (const file of files) {
130
130
  if (!file.endsWith('.md')) continue
@@ -301,12 +301,12 @@ export function findDocPage(sectionSlug: string, pageSlug: string): DocPageMeta
301
301
 
302
302
  // Ensure output directory exists
303
303
  if (!existsSync(OUTPUT_DIR)) {
304
- mkdirSync(OUTPUT_DIR, { recursive: true })
304
+ projectFiles(PROJECT_ROOT).mkdirSync(OUTPUT_DIR, { recursive: true })
305
305
  }
306
306
 
307
307
  // Write registry file
308
308
  const registryPath = path.join(OUTPUT_DIR, 'docs-registry.ts')
309
- fs.writeFileSync(registryPath, registryContent, 'utf-8')
309
+ projectFiles(PROJECT_ROOT).writeFileSync(registryPath, registryContent, 'utf-8')
310
310
 
311
311
  console.log('✅ Docs registry built successfully')
312
312
  console.log(` Output: .nextspark/registries/docs-registry.ts`)
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Tests that generateBillingRegistry's jiti instance keeps its module cache in
3
+ * memory instead of writing it to disk, since jiti's default cache directory
4
+ * falls outside the project whenever the nearest node_modules isn't writable.
5
+ *
6
+ * Run: node --test packages/core/scripts/build/registry/__tests__/billing-registry.test.mjs
7
+ */
8
+
9
+ import { test } from 'node:test'
10
+ import assert from 'node:assert/strict'
11
+ import { mkdtemp, readdir, rm } from 'node:fs/promises'
12
+ import { tmpdir } from 'node:os'
13
+ import { dirname, join } from 'node:path'
14
+ import { fileURLToPath } from 'node:url'
15
+
16
+ import { generateBillingRegistry } from '../generators/billing-registry.mjs'
17
+
18
+ const REPO_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..', '..', '..')
19
+
20
+ async function directory(prefix) {
21
+ const root = await mkdtemp(join(tmpdir(), prefix))
22
+ return { root, cleanup: () => rm(root, { recursive: true, force: true }) }
23
+ }
24
+
25
+ test("generateBillingRegistry's jiti import writes nothing under TMPDIR, even when it can't reach a writable node_modules", async () => {
26
+ const cacheRoot = await directory('nextspark-billing-registry-tmpdir-')
27
+ const originalTmpdir = process.env.TMPDIR
28
+ try {
29
+ process.env.TMPDIR = cacheRoot.root
30
+ const themesDir = join(REPO_ROOT, 'themes')
31
+ const config = { themesDir, outputDir: join(cacheRoot.root, 'lib/registries') }
32
+
33
+ const output = await generateBillingRegistry('default', join(REPO_ROOT, 'contents'), config)
34
+
35
+ assert.match(output, /Active theme: default/)
36
+ const strayEntries = await readdir(cacheRoot.root)
37
+ assert.deepEqual(strayEntries, [], `jiti must not write a module cache under TMPDIR, found: ${strayEntries.join(', ')}`)
38
+ } finally {
39
+ if (originalTmpdir === undefined) delete process.env.TMPDIR
40
+ else process.env.TMPDIR = originalTmpdir
41
+ await cacheRoot.cleanup()
42
+ }
43
+ })
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Tests for what the registry build and its plan print: every call to the
3
+ * console is escaped where it prints, once the console is guarded - as the
4
+ * scripts that run the build guard it before anything loads - so a name that
5
+ * holds a character that breaks or reorders a line, in a file of the project
6
+ * or in the project's own path, starts no line of its own.
7
+ *
8
+ * Run: node --test packages/core/scripts/build/registry/__tests__/build-output.test.mjs
9
+ */
10
+
11
+ import { test } from 'node:test'
12
+ import assert from 'node:assert/strict'
13
+ import { spawnSync } from 'node:child_process'
14
+ import { copyFile, chmod, mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises'
15
+ import { tmpdir } from 'node:os'
16
+ import { dirname, join } from 'node:path'
17
+ import { fileURLToPath } from 'node:url'
18
+
19
+ import { errorWithLines, guardConsole, logFailure, messageLines, shownLine, stackLines } from '../../../utils/index.mjs'
20
+
21
+ const CORE_DIR = join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..')
22
+
23
+ /** A name that, printed raw, starts lines of its own - one reading as the build succeeding - erases a line, returns the carriage and separates or reorders lines. */
24
+ const FORGED = 'forged\n✅ Registry System built successfully!\n\u001b[2K\r\u2028\u0085\u202e'
25
+ const SHOWN = 'forged\\n✅ Registry System built successfully!\\n\\u001b[2K\\r\\u2028\\u0085\\u202e'
26
+
27
+ const RAW_CONTROL = /[\u0000-\u0009\u000b-\u001f\u007f-\u009f\u061c\u200e\u200f\u2028\u2029\u202a-\u202e\u2066-\u2069]/
28
+
29
+ async function createProject(parent = tmpdir(), name = 'nextspark-build-output-test-') {
30
+ const root = await mkdtemp(join(parent, name))
31
+ await writeFile(join(root, '.env'), 'NEXT_PUBLIC_ACTIVE_THEME=acme\n')
32
+ await writeFile(join(root, 'package.json'), '{}')
33
+ await mkdir(join(root, 'app'))
34
+ return root
35
+ }
36
+
37
+ /** What a script of core's build printed for the project, stdout and stderr, as lines, and its exit code. */
38
+ function run(script, root, args = [], env = {}) {
39
+ const result = spawnSync('node', [join('scripts', 'build', script), ...args], {
40
+ cwd: CORE_DIR,
41
+ env: { ...process.env, NEXTSPARK_PROJECT_ROOT: root, ...env },
42
+ encoding: 'utf8',
43
+ input: '{}',
44
+ })
45
+ return { status: result.status, lines: `${result.stdout}${result.stderr}`.split('\n') }
46
+ }
47
+
48
+ /** What is wrong with the lines a script printed: a raw control, or more lines reading as the build succeeding than it printed itself. */
49
+ function wrongLines(label, lines, successes = 0) {
50
+ return [
51
+ ...lines.filter(line => RAW_CONTROL.test(line)).map(line => `${label}: ${JSON.stringify(line)} holds a raw control`),
52
+ ...(lines.filter(line => line.trim() === '✅ Registry System built successfully!').length > successes ? [`${label}: a line reads as the build succeeding that it did not print`] : []),
53
+ ]
54
+ }
55
+
56
+ /** Run `print` with the console captured and guarded, returning each line printed. */
57
+ function printedBy(print) {
58
+ const printed = []
59
+ const original = { log: console.log, error: console.error }
60
+ const capture = (...args) => { printed.push(args.join(' ')) }
61
+ console.log = capture
62
+ console.error = capture
63
+ guardConsole()
64
+ try {
65
+ print()
66
+ } finally {
67
+ Object.assign(console, original)
68
+ }
69
+ return printed.join('\n').split('\n')
70
+ }
71
+
72
+ test('a line the console prints is escaped whole, keeping the blank lines and the indent around it', () => {
73
+ assert.equal(shownLine(' plain line'), ' plain line')
74
+ assert.equal(shownLine('\n blank line before and after\n'), '\n blank line before and after\n')
75
+ assert.equal(shownLine(` named ${FORGED} here`), ` "named ${SHOWN} here"`)
76
+ assert.equal(shownLine(`\n✅ ${FORGED}\n`), `\n"✅ ${SHOWN}"\n`)
77
+
78
+ const lines = printedBy(() => {
79
+ console.log('📦 Output: %s', FORGED)
80
+ console.error(` ${FORGED}`)
81
+ console.log()
82
+ })
83
+ assert.deepEqual(lines, [`"📦 Output: ${SHOWN}"`, ` "${SHOWN}"`, ''])
84
+ })
85
+
86
+ test("an error's own lines are printed one by one, and a newline anywhere else in its message, or in a path its stack names, stays on its line", async () => {
87
+ const multiline = errorWithLines(['permissions.config.ts has keys no entity matches:', ' ❌ "tasks" - No entity found with this slug', '\u001b[2Kerased'])
88
+ assert.deepEqual(messageLines(multiline), multiline.lines)
89
+ assert.deepEqual(messageLines(new Error(`one line ${FORGED}`)), [`one line ${FORGED}`])
90
+ assert.deepEqual(printedBy(() => logFailure('Build failed', multiline)), [
91
+ '❌ Build failed: permissions.config.ts has keys no entity matches:',
92
+ ' ❌ "tasks" - No entity found with this slug',
93
+ '"\\u001b[2Kerased"',
94
+ ])
95
+
96
+ const root = await mkdtemp(join(tmpdir(), 'nextspark-build-output-test-'))
97
+ try {
98
+ const error = await copyFile(join(root, `missing${FORGED}`), join(root, `copy\n${FORGED}`)).then(() => null, error => error)
99
+ assert.ok(error, 'copying a missing file fails')
100
+ const stack = stackLines(error)
101
+ assert.equal(stack[0], `Error: ${error.message}`)
102
+ assert.ok(stack.slice(1).every(line => line.startsWith(' at ')), 'each other line is a frame')
103
+
104
+ const lines = printedBy(() => logFailure('Build failed', error, true))
105
+ assert.deepEqual(lines.filter(line => RAW_CONTROL.test(line)), [])
106
+ assert.deepEqual(lines.filter(line => line.trim() === '✅ Registry System built successfully!'), [])
107
+ assert.equal(lines[0], `"❌ Build failed: ENOENT: no such file or directory, copyfile '${root}/missing${SHOWN}' -> '${root}/copy\\n${SHOWN}'"`)
108
+ assert.equal(lines[1], `"Error: ENOENT: no such file or directory, copyfile '${root}/missing${SHOWN}' -> '${root}/copy\\n${SHOWN}'"`)
109
+ } finally {
110
+ await rm(root, { recursive: true, force: true })
111
+ }
112
+ })
113
+
114
+ test('a directory in app/(templates) the build cannot read is named escaped where the build stops before writing and where its plan fails', { skip: process.getuid?.() === 0 }, async () => {
115
+ const root = await createProject()
116
+ const unreadable = join(root, 'app', '(templates)', FORGED)
117
+ try {
118
+ await mkdir(join(root, 'contents/themes/acme/templates/pricing'), { recursive: true })
119
+ await writeFile(join(root, 'contents/themes/acme/templates/pricing/page.tsx'), 'export default function Page() { return null }\n')
120
+ await mkdir(unreadable, { recursive: true })
121
+ await chmod(unreadable, 0)
122
+
123
+ const build = run('registry.mjs', root, ['--verbose'])
124
+ const plan = run('templates-plan.mjs', root)
125
+
126
+ const wrong = [...wrongLines('build', build.lines), ...wrongLines('plan', plan.lines)]
127
+ if (!build.lines.includes(` "app/(templates)/${SHOWN} can't be read"`)) wrong.push('build: the check does not name the directory escaped')
128
+ if (!plan.lines.some(line => line.startsWith('"EACCES: permission denied, scandir ') && line.endsWith(`/app/(templates)/${SHOWN}'"`))) wrong.push('plan: the failure does not name the directory escaped')
129
+ assert.equal(build.status, 1)
130
+ assert.equal(plan.status, 1)
131
+ assert.deepEqual(wrong, [])
132
+ } finally {
133
+ await chmod(unreadable, 0o755).catch(() => {})
134
+ await rm(root, { recursive: true, force: true })
135
+ }
136
+ })
137
+
138
+ test('a theme template the build rejects is named escaped where it is discovered and where the build and its plan reject it', async () => {
139
+ const root = await createProject()
140
+ try {
141
+ await mkdir(join(root, 'contents/themes/acme/templates', FORGED), { recursive: true })
142
+ await writeFile(join(root, 'contents/themes/acme/templates', FORGED, 'page.tsx'), 'export const metadata = { title: "no default export" }\n')
143
+
144
+ const build = run('registry.mjs', root, ['--verbose'])
145
+ const plan = run('templates-plan.mjs', root)
146
+
147
+ const wrong = [...wrongLines('build', build.lines), ...wrongLines('plan', plan.lines)]
148
+ const rejected = `@/contents/themes/acme/templates/${SHOWN}/page.tsx has no default export, and the app has no existing route at \\"app/${SHOWN}/page.tsx\\"`
149
+ if (!build.lines.includes(` "Template: app/${SHOWN}/page.tsx → @/contents/themes/acme/templates/${SHOWN}/page.tsx"`)) wrong.push('build: discovery does not name the template escaped')
150
+ if (!build.lines.some(line => line.startsWith(`"❌ Build failed: ${rejected}`))) wrong.push('build: the failure does not name the template escaped')
151
+ if (!plan.lines.some(line => line.startsWith(`"${rejected}`))) wrong.push('plan: the failure does not name the template escaped')
152
+ assert.equal(build.status, 1)
153
+ assert.equal(plan.status, 1)
154
+ assert.deepEqual(wrong, [])
155
+ } finally {
156
+ await rm(root, { recursive: true, force: true })
157
+ }
158
+ })
159
+
160
+ test('a theme template whose route-level exports the build cannot read is named escaped where the build and its plan reject it', async () => {
161
+ const sources = [
162
+ ['segment config it would not read', 'export default function Page() { return null }\nconst revalidate = 60\nexport { revalidate }\n', ':3: segment config export \\"revalidate\\"'],
163
+ ['source that does not parse', 'export default function Page( { return null\n', ':1: the template does not parse'],
164
+ ]
165
+ const wrong = []
166
+ for (const [label, source, problem] of sources) {
167
+ const root = await createProject()
168
+ try {
169
+ await mkdir(join(root, 'contents/themes/acme/templates', FORGED), { recursive: true })
170
+ await writeFile(join(root, 'contents/themes/acme/templates', FORGED, 'page.tsx'), source)
171
+
172
+ const build = run('registry.mjs', root, ['--verbose'])
173
+ const plan = run('templates-plan.mjs', root)
174
+
175
+ wrong.push(...wrongLines(`${label}, build`, build.lines), ...wrongLines(`${label}, plan`, plan.lines))
176
+ const named = `${join(root, 'contents/themes/acme/templates')}/${SHOWN}/page.tsx${problem}`
177
+ if (!build.lines.some(line => line.startsWith(`"❌ Build failed: ${named}`))) wrong.push(`${label}, build: the failure does not name the template escaped`)
178
+ if (!plan.lines.some(line => line.startsWith(`"${named}`))) wrong.push(`${label}, plan: the failure does not name the template escaped`)
179
+ if (build.status !== 1 || plan.status !== 1) wrong.push(`${label}: build exited ${build.status} and plan ${plan.status}`)
180
+ } finally {
181
+ await rm(root, { recursive: true, force: true })
182
+ }
183
+ }
184
+ assert.deepEqual(wrong, [])
185
+ })
186
+
187
+ test("a project whose own path holds characters that break or reorder a line starts no line of its own in what the build prints, built or refused for its environment", async () => {
188
+ const parent = await mkdtemp(join(tmpdir(), 'nextspark-build-output-test-'))
189
+ try {
190
+ const root = await createProject(parent, `${FORGED}-`)
191
+ await mkdir(join(root, 'contents/themes/acme/templates/pricing'), { recursive: true })
192
+ await writeFile(join(root, 'contents/themes/acme/templates/pricing/page.tsx'), 'export default function Page() { return null }\n')
193
+
194
+ const built = run('registry.mjs', root, ['--verbose'])
195
+ const wrong = wrongLines('built', built.lines, 1)
196
+ if (built.status !== 0) wrong.push(`built: exited ${built.status}`)
197
+ if (!built.lines.some(line => line.startsWith('"[dotenv@') && line.includes(SHOWN))) wrong.push("built: dotenv's line does not name the project escaped")
198
+
199
+ const bare = await mkdtemp(join(parent, `${FORGED}-bare-`))
200
+ const refused = run('registry.mjs', bare, [], { NEXT_PUBLIC_ACTIVE_THEME: '' })
201
+ wrong.push(...wrongLines('refused', refused.lines))
202
+ if (refused.status !== 1) wrong.push(`refused: exited ${refused.status}`)
203
+ if (!refused.lines.some(line => line.includes('Create a .env file in your project root: ') && line.includes(SHOWN))) wrong.push('refused: the fix does not name the project escaped')
204
+
205
+ assert.deepEqual(wrong, [])
206
+ } finally {
207
+ await rm(parent, { recursive: true, force: true })
208
+ }
209
+ })