betterstart-cli 0.0.1

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 (369) hide show
  1. package/README.md +5 -0
  2. package/dist/assets/adapters/next/integrations/mailchimp/actions/mailchimp.ts +38 -0
  3. package/dist/assets/adapters/next/integrations/mailchimp/integration.ts +33 -0
  4. package/dist/assets/adapters/next/integrations/r2/actions/r2.ts +77 -0
  5. package/dist/assets/adapters/next/integrations/r2/integration.ts +39 -0
  6. package/dist/assets/adapters/next/integrations/resend/actions/resend.ts +138 -0
  7. package/dist/assets/adapters/next/integrations/resend/integration.ts +36 -0
  8. package/dist/assets/adapters/next/plugins/blog/plugin.ts +17 -0
  9. package/dist/assets/adapters/next/plugins/blog/schemas/posts.json +169 -0
  10. package/dist/assets/adapters/next/templates/init/admin-globals.css +677 -0
  11. package/dist/assets/adapters/next/templates/init/api/auth-route.ts +3 -0
  12. package/dist/assets/adapters/next/templates/init/api/upload-route.ts +132 -0
  13. package/dist/assets/adapters/next/templates/init/components/layouts/admin-header.tsx +32 -0
  14. package/dist/assets/adapters/next/templates/init/components/layouts/admin-nav-link.tsx +23 -0
  15. package/dist/assets/adapters/next/templates/init/components/layouts/admin-providers.tsx +33 -0
  16. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-rsc.tsx +8 -0
  17. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-branding-skeleton.tsx +10 -0
  18. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link-skeleton.tsx +11 -0
  19. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-nav-link.tsx +12 -0
  20. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu-skeleton.tsx +15 -0
  21. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar-user-menu.tsx +90 -0
  22. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sidebar.tsx +78 -0
  23. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +44 -0
  24. package/dist/assets/adapters/next/templates/init/components/layouts/content-skeleton.tsx +44 -0
  25. package/dist/assets/adapters/next/templates/init/components/layouts/sidebar-branding.tsx +41 -0
  26. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table-pagination.tsx +139 -0
  27. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table.tsx +236 -0
  28. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +67 -0
  29. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/copyable-code-block.tsx +104 -0
  30. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-code-mirror.tsx +68 -0
  31. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/dev-mode-types.ts +75 -0
  32. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/lifecycle-hooks-tab.tsx +111 -0
  33. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/plain-code-fallback.tsx +11 -0
  34. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode/snippets-tab.tsx +125 -0
  35. package/dist/assets/adapters/next/templates/init/components/shared/dev-mode-integrate.tsx +108 -0
  36. package/dist/assets/adapters/next/templates/init/components/shared/entity-filters-bar.tsx +184 -0
  37. package/dist/assets/adapters/next/templates/init/components/shared/entity-metadata.tsx +93 -0
  38. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +55 -0
  39. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +80 -0
  40. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-button.tsx +74 -0
  41. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +48 -0
  42. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-drawer.tsx +79 -0
  43. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +222 -0
  44. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog.tsx +56 -0
  45. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +83 -0
  46. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +148 -0
  47. package/dist/assets/adapters/next/templates/init/components/shared/media/media-empty-state.tsx +45 -0
  48. package/dist/assets/adapters/next/templates/init/components/shared/media/media-filters-bar.tsx +129 -0
  49. package/dist/assets/adapters/next/templates/init/components/shared/media/media-gallery-dialog.tsx +182 -0
  50. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-item.tsx +56 -0
  51. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +114 -0
  52. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid.tsx +44 -0
  53. package/dist/assets/adapters/next/templates/init/components/shared/media/media-preview.tsx +69 -0
  54. package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +139 -0
  55. package/dist/assets/adapters/next/templates/init/components/shared/page-header.tsx +46 -0
  56. package/dist/assets/adapters/next/templates/init/components/shared/search-input.tsx +88 -0
  57. package/dist/assets/adapters/next/templates/init/components/shared/sort-indicator.tsx +24 -0
  58. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +242 -0
  59. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-drag-overlay-item.tsx +15 -0
  60. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-item.tsx +32 -0
  61. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-types.ts +9 -0
  62. package/dist/assets/adapters/next/templates/init/data/navigation.ts +43 -0
  63. package/dist/assets/adapters/next/templates/init/drizzle.config.ts +36 -0
  64. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-blockquote.ts +251 -0
  65. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-code-block.ts +258 -0
  66. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-color-highlight.ts +347 -0
  67. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-media-insertion.ts +59 -0
  68. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-mobile-toolbar.ts +17 -0
  69. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-slash-menu.ts +116 -0
  70. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +638 -0
  71. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-table-add-controls.ts +174 -0
  72. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +288 -0
  73. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading-dropdown-menu.ts +127 -0
  74. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading.ts +269 -0
  75. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-is-breakpoint.ts +32 -0
  76. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-link-popover.ts +278 -0
  77. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list-dropdown-menu.ts +199 -0
  78. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list.ts +290 -0
  79. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-mark.ts +199 -0
  80. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-menu-navigation.ts +221 -0
  81. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-tiptap-editor.ts +46 -0
  82. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-undo-redo.ts +169 -0
  83. package/dist/assets/adapters/next/templates/init/hooks/use-admin-theme.tsx +74 -0
  84. package/dist/assets/adapters/next/templates/init/hooks/use-copy-to-clipboard.ts +48 -0
  85. package/dist/assets/adapters/next/templates/init/hooks/use-dev-mode-integration.ts +43 -0
  86. package/dist/assets/adapters/next/templates/init/hooks/use-entity-versions.ts +32 -0
  87. package/dist/assets/adapters/next/templates/init/hooks/use-failed-image-url.ts +21 -0
  88. package/dist/assets/adapters/next/templates/init/hooks/use-local-storage.ts +46 -0
  89. package/dist/assets/adapters/next/templates/init/hooks/use-media-filters-bar.ts +72 -0
  90. package/dist/assets/adapters/next/templates/init/hooks/use-media.ts +102 -0
  91. package/dist/assets/adapters/next/templates/init/hooks/use-mobile.ts +19 -0
  92. package/dist/assets/adapters/next/templates/init/hooks/use-page-boundary-blur-visibility.ts +59 -0
  93. package/dist/assets/adapters/next/templates/init/hooks/use-page-scroll-threshold.ts +27 -0
  94. package/dist/assets/adapters/next/templates/init/hooks/use-table-utils.ts +315 -0
  95. package/dist/assets/adapters/next/templates/init/hooks/use-upload.ts +321 -0
  96. package/dist/assets/adapters/next/templates/init/hooks/use-users.ts +12 -0
  97. package/dist/assets/adapters/next/templates/init/lib/actions/auth/auth.ts +58 -0
  98. package/dist/assets/adapters/next/templates/init/lib/actions/auth/client.ts +12 -0
  99. package/dist/assets/adapters/next/templates/init/lib/actions/auth/middleware.ts +46 -0
  100. package/dist/assets/adapters/next/templates/init/lib/actions/email/form-delivery.ts +72 -0
  101. package/dist/assets/adapters/next/templates/init/lib/actions/email/index.ts +4 -0
  102. package/dist/assets/adapters/next/templates/init/lib/actions/email/is-email-delivery-configured.ts +5 -0
  103. package/dist/assets/adapters/next/templates/init/lib/actions/email/none.ts +24 -0
  104. package/dist/assets/adapters/next/templates/init/lib/actions/email/provider.ts +6 -0
  105. package/dist/assets/adapters/next/templates/init/lib/actions/email/send-email.ts +6 -0
  106. package/dist/assets/adapters/next/templates/init/lib/actions/email/send-password-reset-email.ts +10 -0
  107. package/dist/assets/adapters/next/templates/init/lib/actions/email/types.ts +25 -0
  108. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/get-entity-versions.ts +48 -0
  109. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/index.ts +10 -0
  110. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/internal-create-entity-version.ts +43 -0
  111. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/internal-delete-entity-versions.ts +19 -0
  112. package/dist/assets/adapters/next/templates/init/lib/actions/entity-versions/types.ts +26 -0
  113. package/dist/assets/adapters/next/templates/init/lib/actions/forms/get-all-form-settings.ts +21 -0
  114. package/dist/assets/adapters/next/templates/init/lib/actions/forms/get-form-settings.ts +27 -0
  115. package/dist/assets/adapters/next/templates/init/lib/actions/forms/index.ts +9 -0
  116. package/dist/assets/adapters/next/templates/init/lib/actions/forms/test-form-webhook.ts +40 -0
  117. package/dist/assets/adapters/next/templates/init/lib/actions/forms/types.ts +26 -0
  118. package/dist/assets/adapters/next/templates/init/lib/actions/forms/upsert-form-settings.ts +40 -0
  119. package/dist/assets/adapters/next/templates/init/lib/actions/media/create-media.ts +39 -0
  120. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media-bulk.ts +29 -0
  121. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media.ts +22 -0
  122. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-id.ts +18 -0
  123. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-ids.ts +25 -0
  124. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media.ts +71 -0
  125. package/dist/assets/adapters/next/templates/init/lib/actions/media/index.ts +14 -0
  126. package/dist/assets/adapters/next/templates/init/lib/actions/media/types.ts +31 -0
  127. package/dist/assets/adapters/next/templates/init/lib/actions/media/update-media.ts +35 -0
  128. package/dist/assets/adapters/next/templates/init/lib/actions/profile/index.ts +4 -0
  129. package/dist/assets/adapters/next/templates/init/lib/actions/profile/invalidate-users-cache.ts +14 -0
  130. package/dist/assets/adapters/next/templates/init/lib/actions/profile/is-email-configured.ts +7 -0
  131. package/dist/assets/adapters/next/templates/init/lib/actions/profile/types.ts +4 -0
  132. package/dist/assets/adapters/next/templates/init/lib/actions/profile/update-email.ts +57 -0
  133. package/dist/assets/adapters/next/templates/init/lib/actions/storage/index.ts +2 -0
  134. package/dist/assets/adapters/next/templates/init/lib/actions/storage/local.ts +31 -0
  135. package/dist/assets/adapters/next/templates/init/lib/actions/storage/provider.ts +6 -0
  136. package/dist/assets/adapters/next/templates/init/lib/actions/storage/save-upload.ts +11 -0
  137. package/dist/assets/adapters/next/templates/init/lib/actions/storage/types.ts +18 -0
  138. package/dist/assets/adapters/next/templates/init/lib/actions/upload/index.ts +9 -0
  139. package/dist/assets/adapters/next/templates/init/lib/actions/upload/types.ts +17 -0
  140. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-file.ts +11 -0
  141. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-files.ts +92 -0
  142. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-image-from-url.ts +22 -0
  143. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-media-from-url.ts +133 -0
  144. package/dist/assets/adapters/next/templates/init/lib/actions/users/create-user.ts +55 -0
  145. package/dist/assets/adapters/next/templates/init/lib/actions/users/delete-user.ts +24 -0
  146. package/dist/assets/adapters/next/templates/init/lib/actions/users/get-users.ts +49 -0
  147. package/dist/assets/adapters/next/templates/init/lib/actions/users/index.ts +12 -0
  148. package/dist/assets/adapters/next/templates/init/lib/actions/users/types.ts +43 -0
  149. package/dist/assets/adapters/next/templates/init/lib/actions/users/update-user-role.ts +28 -0
  150. package/dist/assets/adapters/next/templates/init/lib/db/client.ts +13 -0
  151. package/dist/assets/adapters/next/templates/init/lib/db/core/schema.ts +160 -0
  152. package/dist/assets/adapters/next/templates/init/lib/db/schema.ts +1 -0
  153. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/index.ts +19 -0
  154. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.local.ts +2 -0
  155. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.ts +9 -0
  156. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/registry.ts +55 -0
  157. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/runner.ts +51 -0
  158. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/types.ts +39 -0
  159. package/dist/assets/adapters/next/templates/init/pages/account-layout.tsx +11 -0
  160. package/dist/assets/adapters/next/templates/init/pages/account-shell-rsc.tsx +30 -0
  161. package/dist/assets/adapters/next/templates/init/pages/admin-layout.tsx +24 -0
  162. package/dist/assets/adapters/next/templates/init/pages/auth-gate-rsc.tsx +6 -0
  163. package/dist/assets/adapters/next/templates/init/pages/authenticated-layout.tsx +18 -0
  164. package/dist/assets/adapters/next/templates/init/pages/dashboard-page.tsx +121 -0
  165. package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +124 -0
  166. package/dist/assets/adapters/next/templates/init/pages/forgot-password-page-skeleton.tsx +24 -0
  167. package/dist/assets/adapters/next/templates/init/pages/forgot-password-page.tsx +21 -0
  168. package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +131 -0
  169. package/dist/assets/adapters/next/templates/init/pages/login-page-rsc.tsx +14 -0
  170. package/dist/assets/adapters/next/templates/init/pages/login-page-skeleton.tsx +26 -0
  171. package/dist/assets/adapters/next/templates/init/pages/login-page.tsx +21 -0
  172. package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +273 -0
  173. package/dist/assets/adapters/next/templates/init/pages/media/media-page-skeleton.tsx +7 -0
  174. package/dist/assets/adapters/next/templates/init/pages/media/media-page.tsx +11 -0
  175. package/dist/assets/adapters/next/templates/init/pages/minimal-account-shell.tsx +25 -0
  176. package/dist/assets/adapters/next/templates/init/pages/profile/profile-form.tsx +281 -0
  177. package/dist/assets/adapters/next/templates/init/pages/profile/profile-page.tsx +31 -0
  178. package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +161 -0
  179. package/dist/assets/adapters/next/templates/init/pages/reset-password-page-skeleton.tsx +26 -0
  180. package/dist/assets/adapters/next/templates/init/pages/reset-password-page.tsx +21 -0
  181. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +170 -0
  182. package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +221 -0
  183. package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +172 -0
  184. package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +91 -0
  185. package/dist/assets/adapters/next/templates/init/pages/users/users-page-content.tsx +25 -0
  186. package/dist/assets/adapters/next/templates/init/pages/users/users-page-skeleton.tsx +7 -0
  187. package/dist/assets/adapters/next/templates/init/pages/users/users-page.tsx +11 -0
  188. package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +221 -0
  189. package/dist/assets/adapters/next/templates/init/types/auth.ts +71 -0
  190. package/dist/assets/adapters/next/templates/init/types/index.ts +108 -0
  191. package/dist/assets/adapters/next/templates/init/types/navigation.ts +11 -0
  192. package/dist/assets/adapters/next/templates/init/types/table-meta.ts +14 -0
  193. package/dist/assets/adapters/next/templates/init/utils/auth/roles.ts +17 -0
  194. package/dist/assets/adapters/next/templates/init/utils/date/date.ts +90 -0
  195. package/dist/assets/adapters/next/templates/init/utils/dev-mode/code-block-height.ts +9 -0
  196. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-rich-extensions.ts +824 -0
  197. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor.ts +316 -0
  198. package/dist/assets/adapters/next/templates/init/utils/editor/editor-view.ts +19 -0
  199. package/dist/assets/adapters/next/templates/init/utils/editor/markdown.ts +542 -0
  200. package/dist/assets/adapters/next/templates/init/utils/editor/node-attrs.ts +25 -0
  201. package/dist/assets/adapters/next/templates/init/utils/editor/slash-commands.ts +148 -0
  202. package/dist/assets/adapters/next/templates/init/utils/editor/source-media.ts +11 -0
  203. package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls.ts +91 -0
  204. package/dist/assets/adapters/next/templates/init/utils/editor/table-bubble.ts +172 -0
  205. package/dist/assets/adapters/next/templates/init/utils/editor/table-input.ts +5 -0
  206. package/dist/assets/adapters/next/templates/init/utils/editor/task-item.ts +19 -0
  207. package/dist/assets/adapters/next/templates/init/utils/editor/tiptap.ts +991 -0
  208. package/dist/assets/adapters/next/templates/init/utils/email/form-delivery.ts +104 -0
  209. package/dist/assets/adapters/next/templates/init/utils/media/fallback.ts +37 -0
  210. package/dist/assets/adapters/next/templates/init/utils/media/media.ts +91 -0
  211. package/dist/assets/adapters/next/templates/init/utils/media/query.ts +96 -0
  212. package/dist/assets/adapters/next/templates/init/utils/navigation/order.ts +6 -0
  213. package/dist/assets/adapters/next/templates/init/utils/navigation/sidebar.ts +26 -0
  214. package/dist/assets/adapters/next/templates/init/utils/page/boundary.ts +32 -0
  215. package/dist/assets/adapters/next/templates/init/utils/seo/seo.ts +90 -0
  216. package/dist/assets/adapters/next/templates/init/utils/shared/cn.ts +6 -0
  217. package/dist/assets/adapters/next/templates/init/utils/storage/local.ts +9 -0
  218. package/dist/assets/adapters/next/templates/init/utils/table/table.ts +10 -0
  219. package/dist/assets/adapters/next/templates/init/utils/text/text.ts +4 -0
  220. package/dist/assets/adapters/next/templates/init/utils/theme/system.ts +6 -0
  221. package/dist/assets/adapters/next/templates/init/utils/upload/remote.ts +55 -0
  222. package/dist/assets/adapters/next/templates/init/utils/upload/upload.ts +26 -0
  223. package/dist/assets/adapters/next/templates/init/utils/user/user.ts +11 -0
  224. package/dist/assets/adapters/next/templates/init/utils/validation/validation.ts +114 -0
  225. package/dist/assets/adapters/next/templates/init/utils/webhook/webhook.ts +28 -0
  226. package/dist/assets/shared-assets/react-admin/custom/content-editor/editor-toolbar.tsx +25 -0
  227. package/dist/assets/shared-assets/react-admin/custom/content-editor/horizontal-rule-button.tsx +22 -0
  228. package/dist/assets/shared-assets/react-admin/custom/content-editor/index.tsx +142 -0
  229. package/dist/assets/shared-assets/react-admin/custom/content-editor/main-toolbar-content.tsx +118 -0
  230. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-bubble-menu.tsx +80 -0
  231. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-button.tsx +22 -0
  232. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-editor-controls.tsx +117 -0
  233. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +59 -0
  234. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover.tsx +6 -0
  235. package/dist/assets/shared-assets/react-admin/custom/content-editor/media-gallery-block.tsx +31 -0
  236. package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +56 -0
  237. package/dist/assets/shared-assets/react-admin/custom/content-editor/mode-toggle-button.tsx +29 -0
  238. package/dist/assets/shared-assets/react-admin/custom/content-editor/remove-table-part-icon.tsx +17 -0
  239. package/dist/assets/shared-assets/react-admin/custom/content-editor/selection-bubble-menu.tsx +105 -0
  240. package/dist/assets/shared-assets/react-admin/custom/content-editor/slash-command-menu.tsx +65 -0
  241. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode-dropdown-button.tsx +52 -0
  242. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +360 -0
  243. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-add-controls.tsx +46 -0
  244. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +290 -0
  245. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-button.tsx +116 -0
  246. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-extension/node-background-extension.ts +138 -0
  247. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/horizontal-rule-node/horizontal-rule-node-extension.ts +10 -0
  248. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/index.tsx +1 -0
  249. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node-extension.ts +117 -0
  250. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node.tsx +63 -0
  251. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/index.tsx +1 -0
  252. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node-extension.ts +11 -0
  253. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node.tsx +168 -0
  254. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/task-item-node/task-item-node-extension.tsx +142 -0
  255. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +114 -0
  256. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/index.tsx +1 -0
  257. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +112 -0
  258. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/index.tsx +1 -0
  259. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +185 -0
  260. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/index.tsx +1 -0
  261. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-button.tsx +40 -0
  262. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content.tsx +130 -0
  263. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover.tsx +98 -0
  264. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/highlight-color-button.tsx +75 -0
  265. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/highlight-colors.ts +24 -0
  266. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/index.tsx +1 -0
  267. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover.tsx +65 -0
  268. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/control-options.ts +27 -0
  269. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item.tsx +35 -0
  270. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu.tsx +119 -0
  271. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/heading-dropdown-menu/index.tsx +1 -0
  272. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/index.tsx +1 -0
  273. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-button.tsx +39 -0
  274. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-content.tsx +13 -0
  275. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-control-popover.tsx +90 -0
  276. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-main.tsx +96 -0
  277. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/link-popover/link-popover.tsx +121 -0
  278. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/index.tsx +1 -0
  279. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item.tsx +44 -0
  280. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu.tsx +115 -0
  281. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/index.tsx +1 -0
  282. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +117 -0
  283. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/index.tsx +1 -0
  284. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +115 -0
  285. package/dist/assets/shared-assets/react-admin/custom/date-picker.tsx +70 -0
  286. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +216 -0
  287. package/dist/assets/shared-assets/react-admin/custom/dynamic-list-field.tsx +111 -0
  288. package/dist/assets/shared-assets/react-admin/custom/gallery-field.tsx +124 -0
  289. package/dist/assets/shared-assets/react-admin/custom/gallery-thumbnail.tsx +39 -0
  290. package/dist/assets/shared-assets/react-admin/custom/icon-picker.tsx +377 -0
  291. package/dist/assets/shared-assets/react-admin/custom/icons-column-skeleton.tsx +16 -0
  292. package/dist/assets/shared-assets/react-admin/custom/icons-data.ts +8 -0
  293. package/dist/assets/shared-assets/react-admin/custom/logo.tsx +115 -0
  294. package/dist/assets/shared-assets/react-admin/custom/media-gallery-field.tsx +182 -0
  295. package/dist/assets/shared-assets/react-admin/custom/page-skeleton.tsx +11 -0
  296. package/dist/assets/shared-assets/react-admin/custom/placeholder-card.tsx +34 -0
  297. package/dist/assets/shared-assets/react-admin/custom/placeholder.tsx +25 -0
  298. package/dist/assets/shared-assets/react-admin/custom/progressive-blur.tsx +62 -0
  299. package/dist/assets/shared-assets/react-admin/custom/sortable-gallery-item.tsx +68 -0
  300. package/dist/assets/shared-assets/react-admin/custom/upload-dropzone.tsx +107 -0
  301. package/dist/assets/shared-assets/react-admin/dependencies.ts +73 -0
  302. package/dist/assets/shared-assets/react-admin/schema.json +1670 -0
  303. package/dist/assets/shared-assets/react-admin/ui/accordion.tsx +86 -0
  304. package/dist/assets/shared-assets/react-admin/ui/alert-dialog.tsx +178 -0
  305. package/dist/assets/shared-assets/react-admin/ui/alert.tsx +72 -0
  306. package/dist/assets/shared-assets/react-admin/ui/aspect-ratio.tsx +9 -0
  307. package/dist/assets/shared-assets/react-admin/ui/avatar.tsx +95 -0
  308. package/dist/assets/shared-assets/react-admin/ui/badge.tsx +48 -0
  309. package/dist/assets/shared-assets/react-admin/ui/breadcrumb.tsx +99 -0
  310. package/dist/assets/shared-assets/react-admin/ui/button-group.tsx +76 -0
  311. package/dist/assets/shared-assets/react-admin/ui/button.tsx +66 -0
  312. package/dist/assets/shared-assets/react-admin/ui/calendar.tsx +184 -0
  313. package/dist/assets/shared-assets/react-admin/ui/card.tsx +94 -0
  314. package/dist/assets/shared-assets/react-admin/ui/carousel.tsx +239 -0
  315. package/dist/assets/shared-assets/react-admin/ui/chart.tsx +336 -0
  316. package/dist/assets/shared-assets/react-admin/ui/checkbox.tsx +28 -0
  317. package/dist/assets/shared-assets/react-admin/ui/collapsible.tsx +21 -0
  318. package/dist/assets/shared-assets/react-admin/ui/combobox.tsx +272 -0
  319. package/dist/assets/shared-assets/react-admin/ui/command.tsx +180 -0
  320. package/dist/assets/shared-assets/react-admin/ui/context-menu.tsx +243 -0
  321. package/dist/assets/shared-assets/react-admin/ui/dialog.tsx +141 -0
  322. package/dist/assets/shared-assets/react-admin/ui/direction.tsx +20 -0
  323. package/dist/assets/shared-assets/react-admin/ui/drawer.tsx +119 -0
  324. package/dist/assets/shared-assets/react-admin/ui/dropdown-menu.tsx +253 -0
  325. package/dist/assets/shared-assets/react-admin/ui/empty.tsx +93 -0
  326. package/dist/assets/shared-assets/react-admin/ui/field.tsx +234 -0
  327. package/dist/assets/shared-assets/react-admin/ui/form.tsx +172 -0
  328. package/dist/assets/shared-assets/react-admin/ui/hover-card.tsx +37 -0
  329. package/dist/assets/shared-assets/react-admin/ui/input-group.tsx +134 -0
  330. package/dist/assets/shared-assets/react-admin/ui/input-otp.tsx +85 -0
  331. package/dist/assets/shared-assets/react-admin/ui/input.tsx +18 -0
  332. package/dist/assets/shared-assets/react-admin/ui/item.tsx +180 -0
  333. package/dist/assets/shared-assets/react-admin/ui/kbd.tsx +26 -0
  334. package/dist/assets/shared-assets/react-admin/ui/label.tsx +20 -0
  335. package/dist/assets/shared-assets/react-admin/ui/menubar.tsx +259 -0
  336. package/dist/assets/shared-assets/react-admin/ui/native-select.tsx +54 -0
  337. package/dist/assets/shared-assets/react-admin/ui/navigation-menu.tsx +159 -0
  338. package/dist/assets/shared-assets/react-admin/ui/pagination.tsx +111 -0
  339. package/dist/assets/shared-assets/react-admin/ui/popover.tsx +75 -0
  340. package/dist/assets/shared-assets/react-admin/ui/progress.tsx +30 -0
  341. package/dist/assets/shared-assets/react-admin/ui/radio-group.tsx +43 -0
  342. package/dist/assets/shared-assets/react-admin/ui/resizable.tsx +41 -0
  343. package/dist/assets/shared-assets/react-admin/ui/scroll-area.tsx +54 -0
  344. package/dist/assets/shared-assets/react-admin/ui/select.tsx +183 -0
  345. package/dist/assets/shared-assets/react-admin/ui/separator.tsx +27 -0
  346. package/dist/assets/shared-assets/react-admin/ui/sheet.tsx +129 -0
  347. package/dist/assets/shared-assets/react-admin/ui/sidebar.tsx +688 -0
  348. package/dist/assets/shared-assets/react-admin/ui/skeleton.tsx +13 -0
  349. package/dist/assets/shared-assets/react-admin/ui/slider.tsx +53 -0
  350. package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +45 -0
  351. package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +15 -0
  352. package/dist/assets/shared-assets/react-admin/ui/switch.tsx +32 -0
  353. package/dist/assets/shared-assets/react-admin/ui/table.tsx +101 -0
  354. package/dist/assets/shared-assets/react-admin/ui/tabs.tsx +79 -0
  355. package/dist/assets/shared-assets/react-admin/ui/textarea.tsx +17 -0
  356. package/dist/assets/shared-assets/react-admin/ui/toggle-group.tsx +85 -0
  357. package/dist/assets/shared-assets/react-admin/ui/toggle.tsx +45 -0
  358. package/dist/assets/shared-assets/react-admin/ui/tooltip.tsx +51 -0
  359. package/dist/chunk-MUZQCVQA.js +306 -0
  360. package/dist/chunk-MUZQCVQA.js.map +1 -0
  361. package/dist/cli.d.ts +2 -0
  362. package/dist/cli.js +23437 -0
  363. package/dist/cli.js.map +1 -0
  364. package/dist/index.d.ts +90 -0
  365. package/dist/index.js +8 -0
  366. package/dist/index.js.map +1 -0
  367. package/dist/template-reader-YKWE2C7O.js +13 -0
  368. package/dist/template-reader-YKWE2C7O.js.map +1 -0
  369. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../cli.ts","../core-engine/commands/require-init.ts","../core-engine/config/resolver.ts","../core-engine/commands/runtime.ts","../adapters/next/commands/add.ts","../core-engine/config/serialize.ts","../core-engine/utils/package-manager.ts","../adapters/next/config.ts","../adapters/next/config/detect.ts","../adapters/next/generators/post-generate.ts","../core-engine/snapshots/store.ts","../core-engine/utils/json-format.ts","../adapters/next/init/scaffolders/dependencies.ts","../adapters/next/dependencies.ts","../adapters/next/integrations/mailchimp/integration.ts","../adapters/next/integrations/r2/integration.ts","../adapters/next/integrations/resend/integration.ts","../adapters/next/integration-registry.ts","../adapters/next/plugins/blog/plugin.ts","../adapters/next/plugin-registry.ts","../shared-assets/react-admin/dependencies.ts","../adapters/next/utils/drizzle-push.ts","../adapters/next/integration-runtime.ts","../core-engine/schema/schema-reader.ts","../core-engine/schema/constants.ts","../core-engine/schema/field-helpers/walking.ts","../core-engine/schema/field-helpers/flattening.ts","../core-engine/schema/field-helpers/form-fields.ts","../core-engine/utils/env.ts","../integration-engine/manifests.ts","../adapters/next/config/paths.ts","../adapters/next/integration-template-reader.ts","../plugin-engine/ownership.ts","../adapters/next/plugin-runtime.ts","../core-engine/snapshots/gitignore.ts","../core-engine/utils/generated-files.ts","../core-engine/schema/type-mappers/drizzle.ts","../core-engine/schema/type-mappers/typescript.ts","../core-engine/schema/type-mappers/zod.ts","../adapters/next/generators/actions/action-helpers.ts","../adapters/next/generators/entity-filters.ts","../adapters/next/generators/dev-mode-integration.ts","../adapters/next/generators/table-column-size.ts","../adapters/next/generators/form-admin/admin-columns.ts","../adapters/next/generators/form-admin/admin-delete-action.ts","../adapters/next/generators/form-admin/admin-page.ts","../adapters/next/generators/form-admin/admin-page-content.ts","../adapters/next/generators/form-admin/admin-settings-page.ts","../adapters/next/generators/form-admin/admin-table.ts","../adapters/next/generators/form-admin/admin-view-page.ts","../adapters/next/generators/form-admin/orchestrator.ts","../adapters/next/generators/form-navigation.ts","../adapters/next/generators/form-pipeline/form-actions.ts","../adapters/next/generators/form-pipeline/form-component-shared.ts","../adapters/next/generators/form-pipeline/form-component-multistep.ts","../adapters/next/generators/form-pipeline/form-component-single.ts","../adapters/next/generators/form-pipeline/form-component.ts","../adapters/next/generators/form-pipeline/form-database.ts","../adapters/next/generators/form-pipeline/form-hook.ts","../adapters/next/generators/namespace-output.ts","../adapters/next/generators/form-pipeline/pipeline.ts","../adapters/next/generators/actions/lifecycle-hook-emissions.ts","../adapters/next/generators/actions/entity-file-contents.ts","../adapters/next/generators/actions/markdown-renderer.ts","../adapters/next/generators/actions/entity-actions.ts","../adapters/next/generators/actions/single-actions.ts","../adapters/next/generators/columns/column-actions.ts","../adapters/next/generators/columns/column-defs.ts","../adapters/next/generators/columns/custom-cell.ts","../adapters/next/generators/columns/generate-columns.ts","../adapters/next/generators/create-page.ts","../adapters/next/generators/database.ts","../adapters/next/generators/edit-page.ts","../adapters/next/generators/form/zod-schema.ts","../adapters/next/generators/form/form-shared.ts","../adapters/next/generators/form/field-jsx-nested.ts","../adapters/next/generators/form/field-jsx.ts","../adapters/next/generators/form/form-entity.ts","../adapters/next/generators/form/form-single.ts","../adapters/next/generators/hook.ts","../adapters/next/generators/navigation.ts","../adapters/next/generators/page.ts","../adapters/next/generators/page-content.ts","../adapters/next/generators/single-page.ts","../adapters/next/generators/table.ts","../adapters/next/generators/index.ts","../adapters/next/plugin-template-reader.ts","../adapters/next/snapshots/apply.ts","../core-engine/snapshots/ast-substitution.ts","../core-engine/snapshots/merge.ts","../adapters/next/snapshots/barrels.ts","../adapters/next/snapshots/reconstruct.ts","../plugin-engine/manifests.ts","../adapters/next/commands/generate.ts","../core-engine/snapshots/rename-detector.ts","../core-engine/snapshots/schema-diff.ts","../adapters/next/commands/init.ts","../adapters/next/init/prompts/database.ts","../adapters/next/init/prompts/plugins.ts","../adapters/next/init/prompts/project.ts","../adapters/next/init/scaffolders/api-routes.ts","../core-engine/utils/fs.ts","../adapters/next/init/scaffolders/auth.ts","../adapters/next/init/scaffolders/base.ts","../adapters/next/init/scaffolders/biome.ts","../adapters/next/init/scaffolders/components.ts","../adapters/next/init/templates/app/admin.ts","../adapters/next/init/scaffolders/core-schemas.ts","../adapters/next/init/templates/core/default-settings.ts","../adapters/next/init/scaffolders/database.ts","../adapters/next/init/scaffolders/dev-server.ts","../adapters/next/init/scaffolders/env.ts","../adapters/next/init/scaffolders/layout.ts","../adapters/next/init/scaffolders/next-config.ts","../adapters/next/init/scaffolders/tailwind.ts","../adapters/next/init/scaffolders/tsconfig.ts","../adapters/next/commands/seed.ts","../adapters/next/commands/list-integrations.ts","../adapters/next/commands/list-plugins.ts","../adapters/next/commands/remove.ts","../adapters/next/commands/remove-schema.ts","../adapters/next/commands/uninstall.ts","../adapters/next/commands/uninstall-cleaners.ts","../adapters/next/commands/update-component.ts","../adapters/next/commands/update-deps.ts","../adapters/next/commands/update-styles.ts","../adapters/next/commands-runtime.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport { requireInitializedProject } from '@core-engine/commands/require-init.js'\nimport {\n createAddCommand,\n createGenerateCommand,\n createInitCommand,\n createListIntegrationsCommand,\n createListPluginsCommand,\n createRemoveCommand,\n createRemoveSchemaCommand,\n createSeedCommand,\n createUninstallCommand,\n createUpdateCommand,\n createUpdateDepsCommand,\n createUpdateStylesCommand\n} from '@core-engine/commands/runtime.js'\nimport { nextCommandRuntime } from '@next-adapter/commands-runtime.js'\nimport { Command } from 'commander'\n\nconst { version } = JSON.parse(\n readFileSync(new URL('../package.json', import.meta.url), 'utf-8')\n) as { version: string }\n\nconst program = new Command()\n\nprogram\n .name('betterstart')\n .description('Scaffold a plugin and integration based Admin into any Next.js 16 application')\n .version(version)\n\nprogram.hook('preAction', (_command, actionCommand) => {\n requireInitializedProject(actionCommand)\n})\n\nprogram.addCommand(createAddCommand(nextCommandRuntime))\nprogram.addCommand(createInitCommand(nextCommandRuntime))\nprogram.addCommand(createListIntegrationsCommand(nextCommandRuntime))\nprogram.addCommand(createListPluginsCommand(nextCommandRuntime))\nprogram.addCommand(createGenerateCommand(nextCommandRuntime))\nprogram.addCommand(createRemoveCommand(nextCommandRuntime))\nprogram.addCommand(createRemoveSchemaCommand(nextCommandRuntime))\nprogram.addCommand(createSeedCommand(nextCommandRuntime))\nprogram.addCommand(createUninstallCommand(nextCommandRuntime))\nprogram.addCommand(createUpdateCommand(nextCommandRuntime))\nprogram.addCommand(createUpdateDepsCommand(nextCommandRuntime))\nprogram.addCommand(createUpdateStylesCommand(nextCommandRuntime))\n\nprogram.parse()\n","import path from 'node:path'\nimport * as p from '@clack/prompts'\nimport { findConfigFile } from '@core-engine/config/resolver.js'\nimport type { Command } from 'commander'\n\nconst INIT_COMMAND = 'init'\n\ninterface CommandOptions {\n cwd?: unknown\n}\n\nfunction resolveCommandCwd(command: Command): string {\n const options = command.opts<CommandOptions>()\n return typeof options.cwd === 'string' ? path.resolve(options.cwd) : process.cwd()\n}\n\nexport function requireInitializedProject(command: Command): void {\n if (command.name() === INIT_COMMAND) {\n return\n }\n\n const cwd = resolveCommandCwd(command)\n if (findConfigFile(cwd)) {\n return\n }\n\n p.log.error(\"Couldn't find betterstart project. Please run `betterstart init` first.\")\n process.exit(1)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { BetterstartConfigFile } from './types.js'\n\nconst CONFIG_FILE_NAME = 'admin.config.ts'\n\nexport function findConfigFile(cwd: string): string | undefined {\n const filePath = path.join(cwd, CONFIG_FILE_NAME)\n return fs.existsSync(filePath) ? filePath : undefined\n}\n\nexport async function loadConfigFile(configPath: string): Promise<BetterstartConfigFile> {\n const { createJiti } = await import('jiti')\n\n const alias: Record<string, string> = {}\n try {\n alias['@betterstart/cli'] = fileURLToPath(import.meta.resolve('@betterstart/cli'))\n } catch {\n // Config files may not import from this package.\n }\n\n const jiti = createJiti(import.meta.url, { alias })\n const mod = await jiti.import(configPath)\n return ((mod as Record<string, unknown>).default || mod) as BetterstartConfigFile\n}\n","import { Command } from 'commander'\n\ntype MaybePromise<T> = T | Promise<T>\n\nexport interface AddCommandOptions {\n yes?: boolean\n skipMigration?: boolean\n integration?: boolean\n cwd?: string\n}\n\nexport interface GenerateCommandOptions {\n force: boolean\n all: boolean\n interactive: boolean\n skipMigration: boolean\n cwd?: string\n}\n\nexport interface InitCommandOptions {\n plugins?: string\n integrations?: string\n namespace?: string\n yes?: boolean\n skipMigration?: boolean\n skipAdminCreation?: boolean\n skipDevServerStart?: boolean\n databaseUrl?: string\n force?: boolean\n}\n\nexport interface ListPluginsCommandOptions {\n cwd?: string\n}\n\nexport interface ListIntegrationsCommandOptions {\n cwd?: string\n}\n\nexport interface RemoveCommandOptions {\n force?: boolean\n integration?: boolean\n cwd?: string\n}\n\nexport interface RemoveSchemaCommandOptions {\n force: boolean\n cwd?: string\n}\n\nexport interface SeedCommandOptions {\n cwd?: string\n}\n\nexport interface UninstallCommandOptions {\n force: boolean\n cwd?: string\n}\n\nexport interface UpdateCommandOptions {\n list?: boolean\n all?: boolean\n shadcnPreset?: string\n only?: string\n cwd?: string\n}\n\nexport interface UpdateDepsCommandOptions {\n cwd?: string\n}\n\nexport interface UpdateStylesCommandOptions {\n cwd?: string\n}\n\nexport interface BetterstartCommandRuntime {\n runAdd(plugins: string[], options: AddCommandOptions): MaybePromise<void>\n runGenerate(schemaName: string | undefined, options: GenerateCommandOptions): MaybePromise<void>\n runInit(name: string | undefined, options: InitCommandOptions): MaybePromise<void>\n runListIntegrations(options: ListIntegrationsCommandOptions): MaybePromise<void>\n runListPlugins(options: ListPluginsCommandOptions): MaybePromise<void>\n runRemove(plugins: string[], options: RemoveCommandOptions): MaybePromise<void>\n runRemoveSchema(schemaName: string, options: RemoveSchemaCommandOptions): MaybePromise<void>\n runSeed(options: SeedCommandOptions): MaybePromise<void>\n runUninstall(options: UninstallCommandOptions): MaybePromise<void>\n runUpdate(components: string[], options: UpdateCommandOptions): MaybePromise<void>\n runUpdateDeps(options: UpdateDepsCommandOptions): MaybePromise<void>\n runUpdateStyles(options: UpdateStylesCommandOptions): MaybePromise<void>\n}\n\nexport function createAddCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('add')\n .description('Install BetterStart plugins or integrations into an existing Admin')\n .argument('<items...>', 'Plugin or integration IDs to install (e.g. blog, r2)')\n .option('-y, --yes', 'Skip interactive configuration prompts', false)\n .option('--integration', 'Install integration IDs instead of content plugin IDs', false)\n .option(\n '--skip-migration',\n 'Skip running db:push after installing schema-backed plugins',\n false\n )\n .option('--cwd <path>', 'Project root path')\n .action((items: string[], options: AddCommandOptions) => runtime.runAdd(items, options))\n}\n\nexport function createGenerateCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('generate')\n .alias('g')\n .description('Generate entity or form from a JSON schema')\n .argument('[schema]', 'Schema name (e.g. posts, categories, contact)')\n .option('-f, --force', 'Overwrite existing generated files', false)\n .option('-a, --all', 'Regenerate all schemas', false)\n .option('--interactive', 'Prompt during generate --all', false)\n .option('--skip-migration', 'Skip running db:push after generation', false)\n .option('--cwd <path>', 'Project root path')\n .action((schemaName: string | undefined, options: GenerateCommandOptions) =>\n runtime.runGenerate(schemaName, options)\n )\n}\n\nexport function createInitCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('init')\n .description('Scaffold Admin into a new or existing Next.js app')\n .argument('[name]', 'Project name (creates new directory if fresh project)')\n .option('--plugins <plugins>', 'Comma-separated content plugin IDs (e.g. blog)')\n .option('--integrations <integrations>', 'Comma-separated integration IDs (e.g. r2,resend)')\n .option('--namespace <name>', 'Generated admin namespace (e.g. admin, dashboard)')\n .option('-y, --yes', 'Skip all prompts (accept defaults)')\n .option('--skip-migration', 'Skip running drizzle-kit push after scaffolding')\n .option('--skip-admin-creation', 'Skip prompting to create the initial admin user')\n .option('--skip-dev-server-start', 'Skip prompting to start the development server')\n .option(\n '--database-url <url>',\n 'PostgreSQL database connection string (postgres:// or postgresql://)'\n )\n .option('--force', 'Overwrite all existing Admin files (nuclear option)')\n .action((name: string | undefined, options: InitCommandOptions) =>\n runtime.runInit(name, options)\n )\n}\n\nexport function createListPluginsCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('list-plugins')\n .description('List available BetterStart plugins')\n .option('--cwd <path>', 'Project root path')\n .action((options: ListPluginsCommandOptions) => runtime.runListPlugins(options))\n}\n\nexport function createListIntegrationsCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('list-integrations')\n .description('List available BetterStart integrations')\n .option('--cwd <path>', 'Project root path')\n .action((options: ListIntegrationsCommandOptions) => runtime.runListIntegrations(options))\n}\n\nexport function createRemoveCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('remove')\n .description('Remove installed BetterStart plugins or integrations')\n .argument('<items...>', 'Plugin or integration IDs to remove (e.g. blog r2)')\n .option('-f, --force', 'Skip confirmation prompt', false)\n .option('--integration', 'Remove integration IDs instead of content plugin IDs', false)\n .option('--cwd <path>', 'Project root path')\n .action((items: string[], options: RemoveCommandOptions) => runtime.runRemove(items, options))\n}\n\nexport function createRemoveSchemaCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('remove-schema')\n .description('Remove generated files for a user-authored schema')\n .argument('<schema>', 'Schema name to remove (e.g. posts, categories, contact)')\n .option('-f, --force', 'Skip confirmation prompt', false)\n .option('--cwd <path>', 'Project root path')\n .action((schemaName: string, options: RemoveSchemaCommandOptions) =>\n runtime.runRemoveSchema(schemaName, options)\n )\n}\n\nexport function createSeedCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('seed')\n .description('Create the initial admin user')\n .option('--cwd <path>', 'Project root path')\n .action((options: SeedCommandOptions) => runtime.runSeed(options))\n}\n\nexport function createUninstallCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('uninstall')\n .description('Remove all Admin files and undo modifications made by betterstart init')\n .option('-f, --force', 'Skip all confirmation prompts', false)\n .option('--cwd <path>', 'Project root path')\n .action((options: UninstallCommandOptions) => runtime.runUninstall(options))\n}\n\nexport function createUpdateCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('update')\n .alias('update-component')\n .description('Update Admin components from the latest CLI templates')\n .argument('[components...]', 'Component names to update (e.g., media-gallery-field button)')\n .option('--list', 'List all available components')\n .option('--all', 'Update all components')\n .option('--shadcn-preset <preset>', 'Apply a shadcn preset to Admin UI components')\n .option('--only <parts>', 'Apply only supported shadcn preset parts: theme')\n .option('--cwd <path>', 'Project root path')\n .action((components: string[], options: UpdateCommandOptions) =>\n runtime.runUpdate(components, options)\n )\n}\n\nexport function createUpdateDepsCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('update-deps')\n .description('Install or update all Admin dependencies')\n .option('--cwd <path>', 'Project root path')\n .action((options: UpdateDepsCommandOptions) => runtime.runUpdateDeps(options))\n}\n\nexport function createUpdateStylesCommand(runtime: BetterstartCommandRuntime): Command {\n return new Command('update-styles')\n .description('Replace admin-globals.css with the latest version from the CLI')\n .option('--cwd <path>', 'Project root path')\n .action((options: UpdateStylesCommandOptions) => runtime.runUpdateStyles(options))\n}\n","import path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { AddCommandOptions } from '@core-engine/commands/runtime.js'\nimport { writeConfigFile } from '@core-engine/config/serialize.js'\nimport { detectPackageManager } from '@core-engine/utils/package-manager.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport {\n type PostGenerateResult,\n runPostGenerate,\n scanConflictPaths\n} from '@next-adapter/generators/post-generate.js'\nimport { syncProjectCliDependency } from '@next-adapter/init/scaffolders/dependencies.js'\nimport {\n formatUnknownIntegrationMessage,\n isIntegrationId\n} from '@next-adapter/integration-registry.js'\nimport { installIntegrations } from '@next-adapter/integration-runtime.js'\nimport {\n formatUnknownPluginMessage,\n getPluginDefinition,\n isPluginId\n} from '@next-adapter/plugin-registry.js'\nimport { installPlugins } from '@next-adapter/plugin-runtime.js'\n\nfunction printAddNextSteps(\n installKind: 'plugin' | 'integration',\n hasSchemaChanges: boolean,\n result: PostGenerateResult,\n adminRoutePath: string\n): void {\n console.log('\\n Next steps:')\n console.log(` 1. Review the installed ${installKind} files`)\n if (hasSchemaChanges && result.dbPush !== 'success') {\n console.log(' 2. Run database migration: db:push')\n console.log(` 3. Start the dev server and review ${adminRoutePath}`)\n return\n }\n\n console.log(` 2. Start the dev server and review ${adminRoutePath}`)\n}\n\nexport async function runAddCommand(items: string[], options: AddCommandOptions): Promise<void> {\n const installIntegrationsMode = Boolean(options.integration)\n const pluginIds = items.filter(isPluginId)\n const integrationIds = items.filter(isIntegrationId)\n\n if (!installIntegrationsMode && integrationIds.length > 0) {\n p.log.error(\n `Integration IDs require --integration. Run \\`betterstart add --integration ${integrationIds.join(' ')}\\`.`\n )\n process.exit(1)\n }\n\n if (installIntegrationsMode && pluginIds.length > 0) {\n p.log.error(`Plugin IDs cannot be installed with --integration: ${pluginIds.join(', ')}`)\n process.exit(1)\n }\n\n const invalidItems = installIntegrationsMode\n ? items.filter((integrationId) => !isIntegrationId(integrationId))\n : items.filter((pluginId) => !isPluginId(pluginId))\n if (invalidItems.length > 0) {\n p.log.error(\n installIntegrationsMode\n ? formatUnknownIntegrationMessage(invalidItems)\n : formatUnknownPluginMessage(invalidItems)\n )\n process.exit(1)\n }\n\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const config = await resolveConfig(cwd)\n const adminRoutePath = resolveAdminNamespace(config.frameworkConfig.next.namespace).routePath\n const pm = detectPackageManager(cwd)\n const cliSyncResult = await syncProjectCliDependency(cwd, pm)\n\n if (cliSyncResult && !cliSyncResult.success) {\n p.log.error(cliSyncResult.error ?? 'Failed to sync @betterstart/cli')\n process.exit(1)\n }\n\n if (installIntegrationsMode) {\n const result = await installIntegrations({\n cwd,\n config,\n pm,\n integrationIds,\n interactive: !options.yes,\n includeBiome: false\n })\n\n writeConfigFile(cwd, result.config)\n\n if (result.warnings.length > 0) {\n p.note(result.warnings.join('\\n'), 'Warnings')\n }\n\n if (\n result.installed.length === 0 &&\n result.activated.length === 0 &&\n result.skipped.length > 0\n ) {\n p.outro(`No changes made. Already installed: ${result.skipped.join(', ')}`)\n return\n }\n\n const conflictPaths = scanConflictPaths(cwd)\n const postGenerateResult = await runPostGenerate(\n cwd,\n result.installed[0] ?? result.activated[0] ?? 'admin',\n {\n skipMigration: true,\n skipMigrationMessage: 'no schema changes',\n hasConflicts: conflictPaths.length > 0,\n conflictPaths,\n showNextSteps: false\n }\n )\n\n if (conflictPaths.length === 0) {\n printAddNextSteps('integration', false, postGenerateResult, adminRoutePath)\n }\n\n const messages = [\n result.installed.length > 0\n ? `Installed integration${result.installed.length === 1 ? '' : 's'}: ${result.installed.join(', ')}`\n : null,\n result.activated.length > 0\n ? `Activated integration${result.activated.length === 1 ? '' : 's'}: ${result.activated.join(', ')}`\n : null\n ].filter(Boolean)\n\n p.outro(messages.join('\\n'))\n return\n }\n\n const invalidPlugins = items.filter((pluginId) => !isPluginId(pluginId))\n if (invalidPlugins.length > 0) {\n p.log.error(formatUnknownPluginMessage(invalidPlugins))\n process.exit(1)\n }\n\n const result = await installPlugins({\n cwd,\n config,\n pm,\n pluginIds,\n interactive: !options.yes,\n includeBiome: false\n })\n\n writeConfigFile(cwd, result.config)\n\n if (result.installed.length === 0 && result.skipped.length > 0) {\n p.outro(`No changes made. Already installed: ${result.skipped.join(', ')}`)\n return\n }\n\n if (result.warnings.length > 0) {\n p.note(result.warnings.join('\\n'), 'Warnings')\n }\n\n const installedSchemaNames = result.installed.flatMap((pluginId) =>\n getPluginDefinition(pluginId).schemaFiles.map((schemaFile) => schemaFile.replace(/\\.json$/, ''))\n )\n const hasSchemaChanges = installedSchemaNames.length > 0\n const conflictPaths = scanConflictPaths(cwd)\n const postGenerateResult = await runPostGenerate(cwd, installedSchemaNames[0] ?? 'admin', {\n skipMigration: !hasSchemaChanges || Boolean(options.skipMigration),\n skipMigrationMessage: hasSchemaChanges ? '--skip-migration' : 'no schema changes',\n hasConflicts: conflictPaths.length > 0,\n conflictPaths,\n showNextSteps: false\n })\n\n if (conflictPaths.length === 0) {\n printAddNextSteps('plugin', hasSchemaChanges, postGenerateResult, adminRoutePath)\n }\n\n p.outro(\n `Installed plugin${result.installed.length === 1 ? '' : 's'}: ${result.installed.join(', ')}`\n )\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { BetterstartConfig } from '@core-engine/config/types.js'\n\nfunction quote(value: string): string {\n return `'${value.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\nfunction formatArray(values: string[]): string {\n if (values.length === 0) {\n return '[]'\n }\n\n return `[${values.map((value) => quote(value)).join(', ')}]`\n}\n\nexport function serializeConfig(config: BetterstartConfig): string {\n const nextConfig = config.frameworkConfig.next\n\n return `import { defineConfig } from '@betterstart/cli'\n\nexport default defineConfig({\n framework: 'next',\n\n frameworkConfig: {\n next: {\n namespace: ${quote(nextConfig.namespace)},\n srcDir: ${String(nextConfig.srcDir)},\n version: ${String(nextConfig.version)},\n paths: {\n admin: ${quote(nextConfig.paths.admin)},\n schemas: ${quote(nextConfig.paths.schemas)},\n pages: ${quote(nextConfig.paths.pages)},\n login: ${quote(nextConfig.paths.login)},\n api: ${quote(nextConfig.paths.api)},\n },\n },\n },\n\n database: {\n provider: ${quote(config.database.provider)},\n migrationsDir: ${quote(config.database.migrationsDir)},\n },\n\n plugins: {\n installed: ${formatArray(config.plugins.installed)},\n },\n\n integrations: {\n installed: ${formatArray(config.integrations.installed)},\n },\n\n email: {\n provider: ${quote(config.email.provider)},\n },\n\n storage: {\n provider: ${quote(config.storage.provider)},\n },\n\n linter: ${quote(config.linter)},\n\n generated: {\n entities: ${formatArray(config.generated.entities)},\n singles: ${formatArray(config.generated.singles)},\n forms: ${formatArray(config.generated.forms)},\n },\n})\n`\n}\n\nexport function writeConfigFile(cwd: string, config: BetterstartConfig): void {\n fs.writeFileSync(path.join(cwd, 'admin.config.ts'), serializeConfig(config), 'utf-8')\n}\n","import { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun'\n\nconst LOCKFILE_MAP: Record<string, PackageManager> = {\n 'pnpm-lock.yaml': 'pnpm',\n 'package-lock.json': 'npm',\n 'yarn.lock': 'yarn',\n 'bun.lockb': 'bun',\n 'bun.lock': 'bun'\n}\n\nexport function detectPackageManager(cwd: string): PackageManager {\n // Walk up the directory tree to find lockfiles (handles monorepos)\n let dir = path.resolve(cwd)\n const root = path.parse(dir).root\n while (dir !== root) {\n for (const [lockfile, pm] of Object.entries(LOCKFILE_MAP)) {\n if (fs.existsSync(path.join(dir, lockfile))) {\n return pm\n }\n }\n // Check packageManager field in package.json at this level\n const pkgPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as Record<string, unknown>\n if (typeof pkg.packageManager === 'string') {\n const name = pkg.packageManager.split('@')[0]\n if (name === 'pnpm' || name === 'npm' || name === 'yarn' || name === 'bun') {\n return name\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n dir = path.dirname(dir)\n }\n\n return 'npm'\n}\n\nexport function installCommand(pm: PackageManager): string {\n return pm === 'yarn' ? 'yarn' : `${pm} install`\n}\n\nexport function addCommand(pm: PackageManager, deps: string[], dev = false): string {\n const devFlag = dev ? (pm === 'yarn' ? '--dev' : '-D') : ''\n\n switch (pm) {\n case 'pnpm':\n return `pnpm add ${devFlag} ${deps.join(' ')}`.trim()\n case 'yarn':\n return `yarn add ${devFlag} ${deps.join(' ')}`.trim()\n case 'bun':\n return `bun add ${devFlag} ${deps.join(' ')}`.trim()\n default:\n return `npm install ${devFlag} ${deps.join(' ')}`.trim()\n }\n}\n\nexport function runCommand(pm: PackageManager, script: string): string {\n switch (pm) {\n case 'pnpm':\n return `pnpm ${script}`\n case 'yarn':\n return `yarn ${script}`\n case 'bun':\n return `bun run ${script}`\n default:\n return `npm run ${script}`\n }\n}\n\nexport function execPm(pm: PackageManager, args: string[], cwd: string): void {\n execFileSync(pm, args, { cwd, stdio: 'inherit' })\n}\n\n/**\n * Returns the binary + leading args to run `create-next-app` via the given package manager.\n * Using the native PM avoids nested-npx issues when BetterStart shells out to CNA.\n */\nexport function createNextAppCommand(pm: PackageManager): { bin: string; prefix: string[] } {\n switch (pm) {\n case 'pnpm':\n return { bin: 'pnpm', prefix: ['create', 'next-app@latest'] }\n case 'yarn':\n return { bin: 'yarn', prefix: ['create', 'next-app@latest'] }\n case 'bun':\n return { bin: 'bunx', prefix: ['create-next-app@latest'] }\n default:\n return { bin: 'npx', prefix: ['create-next-app@latest'] }\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { findConfigFile, loadConfigFile } from '@core-engine/config/resolver.js'\nimport type { BetterstartConfigFile, ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { detectNextMajorVersion } from '@next-adapter/config/detect.js'\nimport {\n DEFAULT_ADMIN_NAMESPACE,\n deriveMigrationsDir,\n deriveNamespacePaths,\n validateAdminNamespace\n} from '@next-adapter/config/namespace.js'\n\nconst unsupportedStateMessage =\n 'admin.config.ts must use the current BetterStart config shape with framework: \"next\" and frameworkConfig.next. Old top-level srcDir, nextMajorVersion, and paths config is no longer supported.'\n\nexport function getDefaultConfig(\n srcDir: boolean,\n nextMajorVersion = 16\n): ResolvedBetterstartConfig {\n const namespace = DEFAULT_ADMIN_NAMESPACE\n const paths = deriveNamespacePaths(namespace, srcDir)\n\n return {\n framework: 'next',\n frameworkConfig: {\n next: {\n namespace,\n srcDir,\n version: nextMajorVersion,\n paths\n }\n },\n srcDir,\n nextMajorVersion,\n paths,\n database: {\n provider: 'postgres',\n migrationsDir: deriveMigrationsDir(namespace)\n },\n plugins: {\n installed: []\n },\n integrations: {\n installed: []\n },\n email: {\n provider: 'none'\n },\n storage: {\n provider: 'local'\n },\n linter: 'biome',\n generated: {\n entities: [],\n singles: [],\n forms: []\n }\n }\n}\n\nfunction assertNextConfigShape(config: BetterstartConfigFile): void {\n const candidate = config as BetterstartConfigFile & {\n srcDir?: unknown\n nextMajorVersion?: unknown\n paths?: unknown\n }\n\n if (\n candidate.srcDir !== undefined ||\n candidate.nextMajorVersion !== undefined ||\n candidate.paths !== undefined ||\n config.framework !== 'next' ||\n !config.frameworkConfig?.next\n ) {\n throw new Error(unsupportedStateMessage)\n }\n}\n\nexport async function resolveConfig(cwd?: string): Promise<ResolvedBetterstartConfig> {\n const workingDir = cwd ?? process.cwd()\n const configPath = findConfigFile(workingDir)\n const nextMajorVersion = detectNextMajorVersion(workingDir)\n const hasSrc = fs.existsSync(path.join(workingDir, 'src'))\n const defaultConfig = getDefaultConfig(hasSrc, nextMajorVersion)\n\n if (!configPath) {\n return defaultConfig\n }\n\n const loadedConfig = await loadConfigFile(configPath)\n assertNextConfigShape(loadedConfig)\n const loadedNextConfig = loadedConfig.frameworkConfig.next\n const loadedDatabase = loadedConfig.database\n const namespace = validateAdminNamespace(loadedNextConfig.namespace ?? DEFAULT_ADMIN_NAMESPACE)\n const nextPaths = {\n ...deriveNamespacePaths(namespace, loadedNextConfig.srcDir ?? defaultConfig.srcDir),\n ...loadedNextConfig.paths\n }\n const nextConfig = {\n ...defaultConfig.frameworkConfig.next,\n ...loadedNextConfig,\n namespace,\n version: nextMajorVersion,\n paths: nextPaths\n }\n const config: ResolvedBetterstartConfig = {\n ...defaultConfig,\n ...loadedConfig,\n framework: 'next',\n frameworkConfig: {\n next: nextConfig\n },\n srcDir: nextConfig.srcDir,\n nextMajorVersion,\n paths: nextPaths,\n database: {\n provider: 'postgres',\n migrationsDir: loadedDatabase.migrationsDir\n },\n plugins: loadedConfig.plugins ?? defaultConfig.plugins,\n integrations: loadedConfig.integrations ?? defaultConfig.integrations,\n email: loadedConfig.email ?? defaultConfig.email,\n storage: loadedConfig.storage ?? defaultConfig.storage,\n generated: {\n ...defaultConfig.generated,\n ...loadedConfig.generated\n }\n }\n return config\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { DEFAULT_ADMIN_NAMESPACE, validateAdminNamespace } from '@next-adapter/config/namespace.js'\n\nexport type LinterType = 'eslint' | 'biome' | 'none'\n\nexport interface LinterInfo {\n /** Detected linter type */\n type: LinterType\n /** Config file found (if any) */\n configFile: string | null\n}\n\nexport interface ProjectInfo {\n /** Whether this is an existing Next.js project */\n isExisting: boolean\n /** Whether the project uses a src/ directory */\n hasSrcDir: boolean\n /** Whether TypeScript is configured */\n hasTypeScript: boolean\n /** Whether Tailwind CSS is configured */\n hasTailwind: boolean\n /** Detected linter info */\n linter: LinterInfo\n /** Conflicts found that would block init */\n conflicts: string[]\n}\n\nconst NEXT_CONFIG_FILES = ['next.config.ts', 'next.config.js', 'next.config.mjs']\n\nexport function detectProjectName(cwd: string): string {\n const pkgPath = path.join(cwd, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n if (typeof pkg.name === 'string' && pkg.name.length > 0) {\n return formatProjectName(pkg.name)\n }\n } catch {\n /* ignore */\n }\n }\n return formatProjectName(path.basename(cwd))\n}\n\nfunction formatProjectName(name: string): string {\n const base = name.includes('/') ? name.split('/').pop()! : name\n return base\n .replace(/[-_]+/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n .trim()\n}\n\nexport function detectProject(cwd: string, namespaceValue = DEFAULT_ADMIN_NAMESPACE): ProjectInfo {\n const namespace = validateAdminNamespace(namespaceValue)\n const isExisting = NEXT_CONFIG_FILES.some((f) => fs.existsSync(path.join(cwd, f)))\n\n const hasSrcDir = fs.existsSync(path.join(cwd, 'src'))\n\n const hasTypeScript =\n fs.existsSync(path.join(cwd, 'tsconfig.json')) ||\n fs.existsSync(path.join(cwd, 'tsconfig.app.json'))\n\n const hasTailwind = detectTailwind(cwd)\n const linter = detectLinter(cwd)\n\n const conflicts: string[] = []\n if (isExisting) {\n if (fs.existsSync(path.join(cwd, namespace))) {\n conflicts.push(`${namespace}/ directory already exists`)\n }\n if (fs.existsSync(path.join(cwd, 'admin.config.ts'))) {\n conflicts.push('admin.config.ts already exists')\n }\n\n const appBase = hasSrcDir ? 'src/app' : 'app'\n if (fs.existsSync(path.join(cwd, appBase, `(${namespace})`))) {\n conflicts.push(`${appBase}/(${namespace})/ route group already exists`)\n }\n\n if (hasTsconfigAdminAliases(cwd, namespace)) {\n conflicts.push(`@${namespace}/* path aliases already exist in tsconfig.json`)\n }\n }\n\n return { isExisting, hasSrcDir, hasTypeScript, hasTailwind, linter, conflicts }\n}\n\n// ============================================================================\n// Linter Detection\n// ============================================================================\n\nconst BIOME_CONFIG_FILES = ['biome.json', 'biome.jsonc']\n\nconst ESLINT_CONFIG_FILES = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n '.eslintrc.json',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n '.eslintrc'\n]\n\nexport function detectLinter(cwd: string): LinterInfo {\n // Check for Biome first (preferred)\n for (const f of BIOME_CONFIG_FILES) {\n if (fs.existsSync(path.join(cwd, f))) {\n return { type: 'biome', configFile: f }\n }\n }\n\n // Check for ESLint config files\n for (const f of ESLINT_CONFIG_FILES) {\n if (fs.existsSync(path.join(cwd, f))) {\n return { type: 'eslint', configFile: f }\n }\n }\n\n // Check package.json for eslintConfig field\n const pkgPath = path.join(cwd, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n if (pkg.eslintConfig) {\n return { type: 'eslint', configFile: 'package.json (eslintConfig)' }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n return { type: 'none', configFile: null }\n}\n\n// ============================================================================\n// Tailwind Detection\n// ============================================================================\n\nfunction detectTailwind(cwd: string): boolean {\n // Tailwind v4: check for CSS files with @import \"tailwindcss\" or @theme\n const cssFiles = ['globals.css', 'app.css', 'index.css'].flatMap((f) => [\n path.join(cwd, 'src', 'app', f),\n path.join(cwd, 'app', f),\n path.join(cwd, 'src', f),\n path.join(cwd, f)\n ])\n\n for (const cssFile of cssFiles) {\n if (fs.existsSync(cssFile)) {\n const content = fs.readFileSync(cssFile, 'utf-8')\n if (\n content.includes('@import \"tailwindcss\"') ||\n content.includes(\"@import 'tailwindcss'\") ||\n content.includes('@theme')\n ) {\n return true\n }\n }\n }\n\n // Also check postcss.config for tailwindcss plugin (v3 style)\n const postcssFiles = ['postcss.config.js', 'postcss.config.mjs', 'postcss.config.cjs']\n for (const f of postcssFiles) {\n if (fs.existsSync(path.join(cwd, f))) {\n const content = fs.readFileSync(path.join(cwd, f), 'utf-8')\n if (content.includes('tailwindcss') || content.includes('@tailwindcss')) {\n return true\n }\n }\n }\n\n return false\n}\n\nfunction hasTsconfigAdminAliases(cwd: string, namespace: string): boolean {\n const tsconfigPath = path.join(cwd, 'tsconfig.json')\n if (!fs.existsSync(tsconfigPath)) return false\n\n try {\n const content = fs.readFileSync(tsconfigPath, 'utf-8')\n return content.includes(`@${namespace}/`)\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Next.js Version Detection\n// ============================================================================\n\n/**\n * Detect the Next.js major version from the project's package.json.\n * Checks dependencies and devDependencies for the `next` package.\n * Returns the major version number (e.g. 15, 16), or 16 as default.\n */\nexport function detectNextMajorVersion(cwd: string): number {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) return 16\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n const version = pkg.dependencies?.next ?? pkg.devDependencies?.next\n if (typeof version !== 'string') return 16\n\n // Strip range prefixes (^, ~, >=, etc.) and extract major version\n const match = version.match(/(\\d+)/)\n if (!match) return 16\n\n return Number.parseInt(match[1], 10)\n } catch {\n return 16\n }\n}\n","/**\n * Post-generation tasks: auto db:push + lint:fix\n */\n\nimport { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { getAllTrackedFilePaths } from '@core-engine/snapshots/store.js'\nimport type { PackageManager } from '@core-engine/utils/package-manager.js'\nimport { detectPackageManager } from '@core-engine/utils/package-manager.js'\nimport {\n DRIZZLE_KIT_POSTGRES_DRIVER_DEP,\n hasDrizzleKitPostgresDriverDependency,\n hasPostgresRuntimeDependency,\n POSTGRES_RUNTIME_DEP\n} from '@next-adapter/init/scaffolders/dependencies.js'\nimport { runDrizzlePush } from '@next-adapter/utils/drizzle-push.js'\n\nconst BIOME_FORMAT_TIMEOUT_MS = 30_000\n\n/**\n * Load .env.local and set variables on process.env (if not already set)\n */\nfunction loadEnvFile(cwd: string): void {\n const envPath = path.join(cwd, '.env.local')\n if (!fs.existsSync(envPath)) return\n\n const content = fs.readFileSync(envPath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n\n // Strip inline comments\n const commentIdx = value.indexOf(' #')\n if (commentIdx !== -1) {\n value = value.slice(0, commentIdx).trim()\n }\n\n if (!process.env[key]) {\n process.env[key] = value\n }\n }\n}\n\nfunction runPmScript(pm: PackageManager, script: string, cwd: string, timeout?: number): boolean {\n const args = pm === 'bun' ? ['run', script] : [script]\n try {\n execFileSync(pm, args, { cwd, stdio: 'pipe', timeout })\n return true\n } catch {\n return false\n }\n}\n\nfunction getExistingTrackedFilePaths(cwd: string): string[] {\n return getAllTrackedFilePaths(cwd).filter((filePath) =>\n fs.existsSync(path.join(cwd, ...filePath.split('/')))\n )\n}\n\nfunction runBiomeCheckWrite(cwd: string): boolean {\n const biomeBin = path.join(cwd, 'node_modules', '.bin', 'biome')\n if (!fs.existsSync(biomeBin)) {\n return false\n }\n\n const filePaths = getExistingTrackedFilePaths(cwd)\n if (filePaths.length === 0) {\n return true\n }\n\n const chunkSize = 80\n const configPath = fs.existsSync(path.join(cwd, 'biome.json')) ? 'biome.json' : null\n for (let index = 0; index < filePaths.length; index += chunkSize) {\n const chunk = filePaths.slice(index, index + chunkSize)\n const args = [\n 'check',\n '--write',\n ...(configPath ? ['--config-path', configPath] : []),\n ...chunk\n ]\n execFileSync(biomeBin, args, {\n cwd,\n stdio: 'pipe',\n timeout: BIOME_FORMAT_TIMEOUT_MS\n })\n }\n\n return true\n}\n\nfunction buildAddDependencyArgs(pm: PackageManager, dependency: string, dev: boolean): string[] {\n const devFlag = dev ? (pm === 'yarn' ? '--dev' : '-D') : ''\n\n switch (pm) {\n case 'pnpm':\n case 'yarn':\n case 'bun':\n return ['add', ...(devFlag ? [devFlag] : []), dependency]\n default:\n return ['install', ...(devFlag ? [devFlag] : []), dependency]\n }\n}\n\nfunction installDependency(\n cwd: string,\n pm: PackageManager,\n dependency: string,\n dev = false\n): boolean {\n try {\n execFileSync(pm, buildAddDependencyArgs(pm, dependency, dev), {\n cwd,\n stdio: 'pipe'\n })\n return true\n } catch {\n return false\n }\n}\n\nfunction ensureDatabasePushDependencies(cwd: string, pm: PackageManager): boolean {\n const missing: Array<{ name: string; dev: boolean }> = []\n\n if (!hasPostgresRuntimeDependency(cwd)) {\n missing.push({ name: POSTGRES_RUNTIME_DEP, dev: false })\n }\n\n if (!hasDrizzleKitPostgresDriverDependency(cwd)) {\n missing.push({ name: DRIZZLE_KIT_POSTGRES_DRIVER_DEP, dev: true })\n }\n\n if (missing.length === 0) {\n return true\n }\n\n console.log(\n `\\n Installing database push dependencies (${missing.map((dependency) => dependency.name).join(', ')})...`\n )\n\n for (const dependency of missing) {\n const installed = installDependency(cwd, pm, dependency.name, dependency.dev)\n if (!installed) {\n console.log(` Failed to install ${dependency.name}`)\n return false\n }\n }\n\n const ready = hasPostgresRuntimeDependency(cwd) && hasDrizzleKitPostgresDriverDependency(cwd)\n\n if (ready) {\n console.log(' Database push dependencies installed')\n } else {\n const unresolved = [\n !hasPostgresRuntimeDependency(cwd) ? POSTGRES_RUNTIME_DEP : null,\n !hasDrizzleKitPostgresDriverDependency(cwd) ? DRIZZLE_KIT_POSTGRES_DRIVER_DEP : null\n ].filter((dependency): dependency is string => Boolean(dependency))\n console.log(` Installed dependencies but could not resolve ${unresolved.join(', ')}`)\n }\n\n return ready\n}\n\nfunction hasPkgScript(cwd: string, script: string): boolean {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) return false\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as Record<string, unknown>\n const scripts = pkg.scripts as Record<string, unknown> | undefined\n return !!scripts?.[script]\n } catch {\n return false\n }\n}\n\nexport interface PostGenerateOptions {\n skipMigration?: boolean\n skipMigrationMessage?: string\n hasConflicts?: boolean\n conflictPaths?: string[]\n showNextSteps?: boolean\n adminRoutePath?: string\n schemaRoutePath?: string\n}\n\nexport interface PostGenerateResult {\n dbPush: 'success' | 'skipped' | 'no-db-url' | 'failed'\n lintFix: 'success' | 'skipped' | 'failed'\n}\n\nexport function scanConflictPaths(cwd: string): string[] {\n const conflictPaths: string[] = []\n\n for (const filePath of getAllTrackedFilePaths(cwd)) {\n const fullPath = path.join(cwd, ...filePath.split('/'))\n if (!fs.existsSync(fullPath)) {\n continue\n }\n\n const content = fs.readFileSync(fullPath, 'utf-8')\n if (/^(<{7}|={7}|>{7})( |$)/m.test(content)) {\n conflictPaths.push(filePath)\n }\n }\n\n return conflictPaths.sort()\n}\n\n/**\n * Run post-generation tasks: db:push and lint:fix\n */\nexport async function runPostGenerate(\n cwd: string,\n schemaName: string,\n options: PostGenerateOptions = {}\n): Promise<PostGenerateResult> {\n const pm = detectPackageManager(cwd)\n const result: PostGenerateResult = {\n dbPush: 'skipped',\n lintFix: 'skipped'\n }\n\n if (options.hasConflicts) {\n result.dbPush = 'skipped'\n result.lintFix = 'skipped'\n\n console.log(\n `\\n Database: skipped (resolve conflict markers in ${options.conflictPaths?.length ?? 0} file(s), then re-run)`\n )\n console.log(' Formatting: skipped (biome refuses files with conflict markers)')\n for (const conflictPath of options.conflictPaths ?? []) {\n console.log(` - ${conflictPath}`)\n }\n console.log(\n '\\n Resolve markers in the files above and re-run the BetterStart command that wrote them. Post-write tasks run automatically once every file is clean.'\n )\n\n return result\n }\n\n // 1. Database push\n if (!options.skipMigration) {\n loadEnvFile(cwd)\n\n const dbUrl = process.env.DATABASE_URL\n\n if (!dbUrl) {\n result.dbPush = 'no-db-url'\n console.log('\\n Database: skipped (no DATABASE_URL configured)')\n console.log(' To sync later: run db:push after setting DATABASE_URL')\n } else if (!ensureDatabasePushDependencies(cwd, pm)) {\n result.dbPush = 'failed'\n console.log(\n ' Database push failed (install database dependencies and run drizzle-kit push manually)'\n )\n } else if (hasPkgScript(cwd, 'db:push')) {\n console.log('\\n Running db:push...')\n const ok = runPmScript(pm, 'db:push', cwd)\n result.dbPush = ok ? 'success' : 'failed'\n console.log(ok ? ' Database schema synced' : ' Database push failed (run db:push manually)')\n } else {\n // Try running drizzle-kit push directly using project-local binary\n console.log('\\n Running drizzle-kit push...')\n try {\n const pushResult = await runDrizzlePush(cwd, { inheritStdio: true })\n if (!pushResult.success) {\n throw new Error(pushResult.error ?? 'drizzle-kit push failed')\n }\n result.dbPush = 'success'\n console.log(' Database schema synced')\n } catch {\n result.dbPush = 'failed'\n console.log(' Database push failed (run drizzle-kit push manually)')\n }\n }\n } else {\n console.log(`\\n Database: skipped (${options.skipMigrationMessage ?? '--skip-migration'})`)\n }\n\n // 2. Lint fix\n if (hasPkgScript(cwd, 'lint:fix')) {\n console.log(' Running lint:fix...')\n const ok = runPmScript(pm, 'lint:fix', cwd, BIOME_FORMAT_TIMEOUT_MS)\n result.lintFix = ok ? 'success' : 'failed'\n console.log(ok ? ' Code formatted' : ' Lint fix had issues (run lint:fix manually)')\n } else {\n // Try biome directly using project-local binary\n try {\n if (!runBiomeCheckWrite(cwd)) {\n throw new Error('Biome binary not found')\n }\n result.lintFix = 'success'\n console.log(' Code formatted with Biome')\n } catch {\n result.lintFix = 'failed'\n console.log(' Biome formatting had issues (run biome check --write manually)')\n }\n }\n\n if (options.showNextSteps !== false) {\n const schemaRoute =\n options.schemaRoutePath ?? `${options.adminRoutePath ?? '/admin'}/${schemaName}`\n console.log('\\n Next steps:')\n console.log(' 1. Review the generated files')\n if (options.skipMigration || result.dbPush !== 'success') {\n console.log(' 2. Run database migration: db:push')\n console.log(` 3. Start the dev server and visit ${schemaRoute}`)\n } else {\n console.log(` 2. Start the dev server and visit ${schemaRoute}`)\n }\n }\n\n return result\n}\n","import crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport type { FormSchema, GeneratedFile, Schema } from '@core-engine/schema/types.js'\nimport { stringifyProjectJson } from '@core-engine/utils/json-format.js'\n\nexport interface SnapshotManifestFile {\n path: string\n hash: string\n}\n\nexport interface SnapshotManifest {\n schemaName: string\n schemaHash: string\n schemaJson: Schema | FormSchema | { name: string }\n cliVersion: string\n generatedAt: string\n files: SnapshotManifestFile[]\n skipped: string[]\n}\n\nexport const SNAPSHOTS_DIR = '.betterstart/snapshots'\nexport const BARREL_SCOPE = '_barrels'\nexport const REMOVED_SCOPE = '_removed'\n\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n/g, '\\n')\n}\n\nexport function hashContent(content: string): string {\n return `sha256-${crypto.createHash('sha256').update(normalizeLineEndings(content)).digest('hex')}`\n}\n\nfunction snapshotRoot(cwd: string): string {\n return path.join(cwd, '.betterstart', 'snapshots')\n}\n\nexport function scopeDir(cwd: string, scope: string): string {\n return path.join(snapshotRoot(cwd), scope)\n}\n\nexport function manifestPath(cwd: string, scope: string): string {\n return path.join(scopeDir(cwd, scope), 'manifest.json')\n}\n\nexport function filesDir(cwd: string, scope: string): string {\n return path.join(scopeDir(cwd, scope), 'files')\n}\n\nfunction snapshotFilePath(cwd: string, scope: string, filePath: string): string {\n return path.join(filesDir(cwd, scope), ...filePath.split('/'))\n}\n\nexport function removedDir(cwd: string): string {\n return path.join(snapshotRoot(cwd), REMOVED_SCOPE)\n}\n\nexport function tombstonePath(cwd: string, scope: string): string {\n return path.join(removedDir(cwd), scope)\n}\n\nexport function loadManifest(cwd: string, scope: string): SnapshotManifest | null {\n const filePath = manifestPath(cwd, scope)\n if (!fs.existsSync(filePath)) {\n return null\n }\n\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as SnapshotManifest\n}\n\nexport function saveManifest(cwd: string, scope: string, manifest: SnapshotManifest): void {\n fs.mkdirSync(scopeDir(cwd, scope), { recursive: true })\n fs.writeFileSync(manifestPath(cwd, scope), stringifyProjectJson(manifest), 'utf-8')\n}\n\nexport function writeSnapshotFiles(\n cwd: string,\n scope: string,\n files: GeneratedFile[]\n): SnapshotManifestFile[] {\n const dir = filesDir(cwd, scope)\n fs.rmSync(dir, { recursive: true, force: true })\n fs.mkdirSync(dir, { recursive: true })\n\n return files.map((file) => {\n const outputPath = snapshotFilePath(cwd, scope, file.path)\n fs.mkdirSync(path.dirname(outputPath), { recursive: true })\n fs.writeFileSync(outputPath, file.content, 'utf-8')\n return {\n path: file.path,\n hash: hashContent(file.content)\n }\n })\n}\n\nexport function readSnapshotFiles(\n cwd: string,\n scope: string,\n manifest: SnapshotManifest\n): GeneratedFile[] {\n return manifest.files\n .filter((entry) => fs.existsSync(snapshotFilePath(cwd, scope, entry.path)))\n .map((entry) => ({\n path: entry.path,\n content: fs.readFileSync(snapshotFilePath(cwd, scope, entry.path), 'utf-8')\n }))\n}\n\nexport function deleteSnapshot(cwd: string, scope: string): void {\n fs.rmSync(scopeDir(cwd, scope), { recursive: true, force: true })\n}\n\nexport function hasSnapshotFiles(cwd: string, scope: string): boolean {\n return fs.existsSync(filesDir(cwd, scope))\n}\n\nexport function writeTombstone(cwd: string, scope: string): void {\n fs.mkdirSync(removedDir(cwd), { recursive: true })\n fs.writeFileSync(tombstonePath(cwd, scope), '', 'utf-8')\n}\n\nexport function hasTombstone(cwd: string, scope: string): boolean {\n return fs.existsSync(tombstonePath(cwd, scope))\n}\n\nexport function clearTombstone(cwd: string, scope: string): void {\n fs.rmSync(tombstonePath(cwd, scope), { force: true })\n}\n\nexport function listTombstones(cwd: string): string[] {\n const dir = removedDir(cwd)\n if (!fs.existsSync(dir)) {\n return []\n }\n\n return fs.readdirSync(dir).sort()\n}\n\nexport function listSnapshotScopes(cwd: string): string[] {\n const dir = snapshotRoot(cwd)\n if (!fs.existsSync(dir)) {\n return []\n }\n\n return fs\n .readdirSync(dir, { withFileTypes: true })\n .filter((entry) => entry.isDirectory())\n .map((entry) => entry.name)\n .filter((name) => name !== REMOVED_SCOPE)\n .sort()\n}\n\nexport function createManifest(\n scope: string,\n schemaJson: Schema | FormSchema | { name: string },\n cliVersion: string,\n files: GeneratedFile[],\n skipped: string[]\n): SnapshotManifest {\n return {\n schemaName: scope,\n schemaHash: hashContent(JSON.stringify(schemaJson)),\n schemaJson,\n cliVersion,\n generatedAt: new Date().toISOString(),\n files: files.map((file) => ({\n path: file.path,\n hash: hashContent(file.content)\n })),\n skipped: [...skipped].sort()\n }\n}\n\nexport function scopeFromSchema(schema: Schema | FormSchema): string {\n return schema.name\n}\n\nexport function snapshotRootExists(cwd: string): boolean {\n return fs.existsSync(snapshotRoot(cwd))\n}\n\nexport function manifestFilesByPath(manifest: SnapshotManifest): Map<string, SnapshotManifestFile> {\n return new Map(manifest.files.map((file) => [file.path, file]))\n}\n\nexport function loadAllManifests(\n cwd: string\n): Array<{ scope: string; manifest: SnapshotManifest }> {\n return listSnapshotScopes(cwd)\n .filter((scope) => scope !== BARREL_SCOPE)\n .map((scope) => ({ scope, manifest: loadManifest(cwd, scope) }))\n .filter(\n (entry): entry is { scope: string; manifest: SnapshotManifest } => entry.manifest !== null\n )\n}\n\nexport function snapshotTargetPath(cwd: string, filePath: string): string {\n return path.join(cwd, ...filePath.split('/'))\n}\n\nexport function getCurrentCliVersion(): string {\n let currentDir = path.dirname(new URL(import.meta.url).pathname)\n\n for (let depth = 0; depth < 6; depth++) {\n const packagePath = path.join(currentDir, 'package.json')\n if (fs.existsSync(packagePath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packagePath, 'utf-8')) as {\n name?: string\n version?: string\n }\n\n if (pkg.name === '@betterstart/cli' && pkg.version) {\n return pkg.version\n }\n } catch {\n // Keep walking upward.\n }\n }\n\n const parentDir = path.dirname(currentDir)\n if (parentDir === currentDir) {\n break\n }\n currentDir = parentDir\n }\n\n return '0.0.0'\n}\n\nexport function getAllTrackedFilePaths(cwd: string): string[] {\n const paths = new Set<string>()\n\n for (const { manifest } of loadAllManifests(cwd)) {\n for (const file of manifest.files) {\n paths.add(file.path)\n }\n }\n\n const barrelManifest = loadManifest(cwd, BARREL_SCOPE)\n if (barrelManifest) {\n for (const file of barrelManifest.files) {\n paths.add(file.path)\n }\n }\n\n return Array.from(paths).sort()\n}\n","export function stringifyProjectJson(value: unknown): string {\n return `${compactShortStringArrays(JSON.stringify(value, null, 2))}\\n`\n}\n\nfunction compactShortStringArrays(json: string): string {\n return json.replace(\n /\\[\\n((?:[ \\t]+\"(?:[^\"\\\\]|\\\\.)*\",?\\n)+)([ \\t]*)\\]/g,\n (match: string, entries: string) => {\n const values = entries\n .trim()\n .split('\\n')\n .map((line) => line.trim())\n\n if (!values.every(isStringArrayEntry)) {\n return match\n }\n\n const inline = `[${values.map((entry) => entry.replace(/,$/, '')).join(', ')}]`\n return inline.length <= 70 ? inline : match\n }\n )\n}\n\nfunction isStringArrayEntry(value: string): boolean {\n return /^\"(?:[^\"\\\\]|\\\\.)*\",$/.test(value) || /^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(value)\n}\n","/**\n * Dependency installer: auto-install all required deps via detected package manager.\n * Splits into core (production) and dev dependencies.\n * Plugin and integration deps are layered on top of the core dependency plan.\n * Uses async spawn so the clack spinner can animate during install.\n */\n\nimport { spawn } from 'node:child_process'\nimport fs from 'node:fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { getCurrentCliVersion } from '@core-engine/snapshots/store.js'\nimport type { PackageManager } from '@core-engine/utils/package-manager.js'\nimport type { BetterstartIntegrationId } from '@integration-engine/types.js'\nimport { NEXT_ADAPTER_DEPS, NEXT_ADAPTER_DEV_DEPS } from '@next-adapter/dependencies.js'\nimport { getIntegrationDefinition } from '@next-adapter/integration-registry.js'\nimport { getPluginDefinition } from '@next-adapter/plugin-registry.js'\nimport type { BetterstartPluginId } from '@plugin-engine/types.js'\nimport { REACT_ADMIN_DEPS, REACT_ADMIN_DEV_DEPS } from '@shared-assets/react-admin/dependencies.js'\n\nexport interface InstallDepsOptions {\n cwd: string\n pm: PackageManager\n dependencies: string[]\n devDependencies: string[]\n}\n\nexport interface InstallDepsResult {\n dependencies: string[]\n devDeps: string[]\n success: boolean\n error: string | null\n}\n\nexport interface DependencyPlan {\n dependencies: string[]\n devDependencies: string[]\n}\n\ninterface ProjectPackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n pnpm?: {\n packageExtensions?: Record<string, PnpmPackageExtension>\n }\n}\n\ntype DependencySection = 'dependencies' | 'devDependencies'\ntype PnpmPackageExtension = {\n dependencies?: Record<string, string>\n peerDependencies?: Record<string, string>\n}\n\nconst CLI_PACKAGE_NAME = '@betterstart/cli'\nconst LOCAL_PACKAGE_PREFIXES = ['workspace:', 'link:', 'file:', 'portal:']\nconst requireFromCli = createRequire(import.meta.url)\ninterface PnpmPackageExtensionDefinition {\n packageName: string\n selector: string\n extension: PnpmPackageExtension & {\n dependencies: Record<string, string>\n }\n}\n\nconst PNPM_PACKAGE_EXTENSION_DEFINITIONS: PnpmPackageExtensionDefinition[] = [\n {\n packageName: '@uiw/codemirror-theme-github',\n selector: '@uiw/codemirror-theme-github@*',\n extension: {\n dependencies: {\n '@babel/runtime': '>=7.11.0',\n '@lezer/highlight': '*'\n }\n }\n }\n]\n\n// ============================================================================\n// Dependency Lists\n// ============================================================================\n\n/** Core runtime deps — always installed */\nexport const CORE_DEPS = Array.from(new Set([...NEXT_ADAPTER_DEPS, ...REACT_ADMIN_DEPS]))\n\n/** Dev deps — always installed */\nexport const DEV_DEPS = Array.from(new Set([...NEXT_ADAPTER_DEV_DEPS, ...REACT_ADMIN_DEV_DEPS]))\n\n/** Biome dev dep — only when no existing linter */\nexport const BIOME_DEV_DEPS = ['@biomejs/biome']\n\nexport const POSTGRES_RUNTIME_DEP = 'postgres'\nexport const DRIZZLE_KIT_POSTGRES_DRIVER_DEP = 'pg'\n\nfunction readProjectPackageJson(cwd: string): ProjectPackageJson | null {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) {\n return null\n }\n\n try {\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as ProjectPackageJson\n } catch {\n return null\n }\n}\n\nfunction dependencySpecMatches(spec: string, name: string): boolean {\n return spec === name || spec.startsWith(`${name}@`)\n}\n\nfunction packageNameFromSpec(spec: string): string {\n if (spec.startsWith('@')) {\n const versionSeparator = spec.indexOf('@', 1)\n return versionSeparator === -1 ? spec : spec.slice(0, versionSeparator)\n }\n\n const versionSeparator = spec.indexOf('@')\n return versionSeparator === -1 ? spec : spec.slice(0, versionSeparator)\n}\n\nfunction getPnpmPackageExtensionsToEnsure(\n pkg: ProjectPackageJson | null,\n dependencies: string[]\n): Record<string, PnpmPackageExtension> {\n const extensions: Record<string, PnpmPackageExtension> = {}\n\n for (const definition of PNPM_PACKAGE_EXTENSION_DEFINITIONS) {\n const shouldEnsure =\n dependencies.some((dependency) =>\n dependencySpecMatches(dependency, definition.packageName)\n ) || hasDeclaredPackage(pkg, definition.packageName)\n\n if (shouldEnsure) {\n extensions[definition.selector] = definition.extension\n }\n }\n\n return extensions\n}\n\nfunction ensurePnpmPackageExtensions(cwd: string, dependencies: string[]): void {\n const pkgPath = path.join(cwd, 'package.json')\n const pkg = readProjectPackageJson(cwd)\n if (!pkg) {\n return\n }\n\n const extensionsToEnsure = getPnpmPackageExtensionsToEnsure(pkg, dependencies)\n if (Object.keys(extensionsToEnsure).length === 0) {\n return\n }\n\n let changed = false\n const pnpmConfig = pkg.pnpm ?? {}\n const packageExtensions = pnpmConfig.packageExtensions ?? {}\n\n for (const [selector, extension] of Object.entries(extensionsToEnsure)) {\n const currentExtension = packageExtensions[selector] ?? {}\n const currentDependencies = currentExtension.dependencies ?? {}\n const nextDependencies = { ...currentDependencies }\n\n for (const [name, version] of Object.entries(extension.dependencies ?? {})) {\n if (nextDependencies[name] !== version) {\n nextDependencies[name] = version\n changed = true\n }\n }\n\n packageExtensions[selector] = {\n ...currentExtension,\n dependencies: nextDependencies\n }\n }\n\n if (!changed && pkg.pnpm?.packageExtensions) {\n return\n }\n\n pkg.pnpm = {\n ...pnpmConfig,\n packageExtensions\n }\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf-8')\n}\n\nfunction hasDeclaredPackage(pkg: ProjectPackageJson | null, name: string): boolean {\n if (!pkg) return false\n return (\n Object.hasOwn(pkg.dependencies ?? {}, name) ||\n Object.hasOwn(pkg.devDependencies ?? {}, name) ||\n Object.hasOwn(pkg.optionalDependencies ?? {}, name)\n )\n}\n\nfunction canResolveFromProject(cwd: string, name: string): boolean {\n try {\n requireFromCli.resolve(name, { paths: [cwd] })\n return true\n } catch {\n return false\n }\n}\n\nexport function hasProjectDependency(cwd: string, dependency: string): boolean {\n const pkg = readProjectPackageJson(cwd)\n return hasDeclaredPackage(pkg, dependency) && canResolveFromProject(cwd, dependency)\n}\n\nexport function hasPostgresRuntimeDependency(cwd: string): boolean {\n return hasProjectDependency(cwd, POSTGRES_RUNTIME_DEP)\n}\n\nexport function hasDrizzleKitPostgresDriverDependency(cwd: string): boolean {\n return hasProjectDependency(cwd, DRIZZLE_KIT_POSTGRES_DRIVER_DEP)\n}\n\nfunction getDeclaredCliDependency(\n pkg: ProjectPackageJson\n): { section: DependencySection; spec: string } | null {\n const devDependency = pkg.devDependencies?.[CLI_PACKAGE_NAME]\n if (typeof devDependency === 'string' && devDependency.length > 0) {\n return { section: 'devDependencies', spec: devDependency }\n }\n\n const dependency = pkg.dependencies?.[CLI_PACKAGE_NAME]\n if (typeof dependency === 'string' && dependency.length > 0) {\n return { section: 'dependencies', spec: dependency }\n }\n\n return null\n}\n\nfunction isLocalPackageSpec(spec: string): boolean {\n return LOCAL_PACKAGE_PREFIXES.some((prefix) => spec.startsWith(prefix))\n}\n\nfunction matchesCurrentCliVersion(spec: string, currentVersion: string): boolean {\n return (\n spec === currentVersion ||\n spec === `^${currentVersion}` ||\n spec === `~${currentVersion}` ||\n spec === `=${currentVersion}`\n )\n}\n\nexport function getCliDependencySyncPlan(cwd: string): DependencyPlan | null {\n const currentVersion = getCurrentCliVersion()\n if (!currentVersion || currentVersion === '0.0.0') {\n return null\n }\n\n const desiredDependency = `${CLI_PACKAGE_NAME}@${currentVersion}`\n const pkg = readProjectPackageJson(cwd)\n if (!pkg) {\n return {\n dependencies: [],\n devDependencies: [desiredDependency]\n }\n }\n\n const declaredDependency = getDeclaredCliDependency(pkg)\n if (!declaredDependency) {\n return {\n dependencies: [],\n devDependencies: [desiredDependency]\n }\n }\n\n if (\n isLocalPackageSpec(declaredDependency.spec) ||\n matchesCurrentCliVersion(declaredDependency.spec, currentVersion)\n ) {\n return null\n }\n\n return declaredDependency.section === 'dependencies'\n ? {\n dependencies: [desiredDependency],\n devDependencies: []\n }\n : {\n dependencies: [],\n devDependencies: [desiredDependency]\n }\n}\n\n// ============================================================================\n// Installer\n// ============================================================================\n\nfunction buildAddArgs(pm: PackageManager, deps: string[], dev: boolean): string[] {\n const devFlag = dev ? (pm === 'yarn' ? '--dev' : '-D') : ''\n\n switch (pm) {\n case 'pnpm':\n return ['add', ...(devFlag ? [devFlag] : []), ...deps]\n case 'yarn':\n return ['add', ...(devFlag ? [devFlag] : []), ...deps]\n case 'bun':\n return ['add', ...(devFlag ? [devFlag] : []), ...deps]\n default:\n return ['install', ...(devFlag ? [devFlag] : []), ...deps]\n }\n}\n\nfunction buildRemoveArgs(pm: PackageManager, deps: string[], dev: boolean): string[] {\n const devFlag = dev ? (pm === 'yarn' ? '--dev' : '-D') : ''\n const packageNames = deps.map(packageNameFromSpec)\n\n switch (pm) {\n case 'pnpm':\n return ['remove', ...(devFlag ? [devFlag] : []), ...packageNames]\n case 'yarn':\n return ['remove', ...(devFlag ? [devFlag] : []), ...packageNames]\n case 'bun':\n return ['remove', ...(devFlag ? [devFlag] : []), ...packageNames]\n default:\n return ['uninstall', ...(devFlag ? [devFlag] : []), ...packageNames]\n }\n}\n\nfunction spawnAsync(cmd: string, args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cmd, args, { cwd, stdio: 'pipe' })\n let stderr = ''\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString()\n })\n child.on('close', (code) => {\n if (code === 0) resolve()\n else reject(new Error(stderr || `${cmd} exited with code ${code}`))\n })\n child.on('error', reject)\n })\n}\n\nfunction unique(values: string[]): string[] {\n return Array.from(new Set(values))\n}\n\nexport function getDependencyPlan(\n pluginIds: BetterstartPluginId[],\n integrationIds: BetterstartIntegrationId[],\n includeBiome: boolean\n): DependencyPlan {\n const pluginDependencies = pluginIds.flatMap(\n (pluginId) => getPluginDefinition(pluginId).packageDependencies\n )\n const pluginDevDependencies = pluginIds.flatMap(\n (pluginId) => getPluginDefinition(pluginId).devDependencies\n )\n const integrationDependencies = integrationIds.flatMap(\n (integrationId) => getIntegrationDefinition(integrationId).packageDependencies\n )\n const integrationDevDependencies = integrationIds.flatMap(\n (integrationId) => getIntegrationDefinition(integrationId).devDependencies\n )\n\n return {\n dependencies: unique([...CORE_DEPS, ...pluginDependencies, ...integrationDependencies]),\n devDependencies: unique([\n ...DEV_DEPS,\n ...pluginDevDependencies,\n ...integrationDevDependencies,\n ...(includeBiome ? BIOME_DEV_DEPS : [])\n ])\n }\n}\n\nexport async function installDependenciesAsync({\n cwd,\n pm,\n dependencies,\n devDependencies\n}: InstallDepsOptions): Promise<InstallDepsResult> {\n try {\n if (pm === 'pnpm') {\n ensurePnpmPackageExtensions(cwd, dependencies)\n }\n\n // Install core deps\n if (dependencies.length > 0) {\n await spawnAsync(pm, buildAddArgs(pm, dependencies, false), cwd)\n }\n\n // Install dev deps\n if (devDependencies.length > 0) {\n await spawnAsync(pm, buildAddArgs(pm, devDependencies, true), cwd)\n }\n\n return { dependencies, devDeps: devDependencies, success: true, error: null }\n } catch (err) {\n return {\n dependencies,\n devDeps: devDependencies,\n success: false,\n error: err instanceof Error ? err.message : 'Install failed'\n }\n }\n}\n\nexport async function removeDependenciesAsync({\n cwd,\n pm,\n dependencies,\n devDependencies\n}: InstallDepsOptions): Promise<InstallDepsResult> {\n try {\n if (dependencies.length > 0) {\n await spawnAsync(pm, buildRemoveArgs(pm, dependencies, false), cwd)\n }\n\n if (devDependencies.length > 0) {\n await spawnAsync(pm, buildRemoveArgs(pm, devDependencies, true), cwd)\n }\n\n return { dependencies, devDeps: devDependencies, success: true, error: null }\n } catch (err) {\n return {\n dependencies,\n devDeps: devDependencies,\n success: false,\n error: err instanceof Error ? err.message : 'Remove failed'\n }\n }\n}\n\nexport async function syncProjectCliDependency(\n cwd: string,\n pm: PackageManager\n): Promise<InstallDepsResult | null> {\n const dependencyPlan = getCliDependencySyncPlan(cwd)\n if (!dependencyPlan) {\n return null\n }\n\n return installDependenciesAsync({\n cwd,\n pm,\n dependencies: dependencyPlan.dependencies,\n devDependencies: dependencyPlan.devDependencies\n })\n}\n","export const NEXT_ADAPTER_DEPS = [\n '@hookform/resolvers',\n '@tanstack/react-query',\n '@tanstack/react-table',\n '@tanstack/react-virtual',\n 'better-auth',\n 'class-variance-authority',\n 'clsx',\n 'date-fns',\n 'drizzle-orm',\n 'fuse.js',\n 'geist',\n 'lucide-react@1.7.0',\n 'nuqs',\n 'postgres',\n 'react-dropzone',\n 'react-hook-form',\n 'shadcn',\n 'sonner',\n 'tailwind-merge',\n 'tw-animate-css',\n 'usehooks-ts',\n 'zod'\n]\n\nexport const NEXT_ADAPTER_DEV_DEPS = ['drizzle-kit', 'pg', 'tsx']\n","import type { BetterstartIntegrationDefinition } from '@integration-engine/types.js'\n\nexport const mailchimpIntegration: BetterstartIntegrationDefinition = {\n id: 'mailchimp',\n title: 'Mailchimp',\n description: 'Mailchimp audience sync for form submissions',\n kind: 'form',\n version: '1.0.0',\n dependencies: [],\n conflicts: [],\n files: [\n {\n outputPath: 'lib/actions/mailchimp/add-to-mailchimp-audience.ts',\n templatePath: 'actions/mailchimp.ts'\n }\n ],\n packageDependencies: ['@mailchimp/mailchimp_marketing'],\n devDependencies: ['@types/mailchimp__mailchimp_marketing'],\n capabilities: {\n formFeatures: ['mailchimp']\n },\n envSections: [\n {\n header: 'Mailchimp',\n vars: [\n { key: 'BETTERSTART_MAILCHIMP_API_KEY', value: '' },\n { key: 'BETTERSTART_MAILCHIMP_SERVER_PREFIX', value: '' },\n { key: 'BETTERSTART_MAILCHIMP_AUDIENCE_ID', value: '' }\n ]\n }\n ],\n configure: 'none'\n}\n","import type { BetterstartIntegrationDefinition } from '@integration-engine/types.js'\n\nexport const r2Integration: BetterstartIntegrationDefinition = {\n id: 'r2',\n title: 'Cloudflare R2',\n description: 'Remote media storage for hosted deployments',\n kind: 'storage',\n version: '1.0.0',\n dependencies: [],\n conflicts: [],\n files: [\n {\n outputPath: 'lib/actions/r2/provider.ts',\n templatePath: 'actions/r2.ts'\n }\n ],\n packageDependencies: ['@aws-sdk/client-s3'],\n devDependencies: [],\n capabilities: {\n storageProvider: {\n provider: 'r2',\n importPath: '@admin/actions/r2/provider',\n exportName: 'r2StorageProvider'\n }\n },\n envSections: [\n {\n header: 'Storage (Cloudflare R2)',\n vars: [\n { key: 'BETTERSTART_R2_ACCOUNT_ID', value: '' },\n { key: 'BETTERSTART_R2_ACCESS_KEY_ID', value: '' },\n { key: 'BETTERSTART_R2_SECRET_ACCESS_KEY', value: '' },\n { key: 'BETTERSTART_R2_BUCKET_NAME', value: '' },\n { key: 'BETTERSTART_R2_PUBLIC_URL', value: '' }\n ]\n }\n ],\n configure: 'r2'\n}\n","import type { BetterstartIntegrationDefinition } from '@integration-engine/types.js'\n\nexport const resendIntegration: BetterstartIntegrationDefinition = {\n id: 'resend',\n title: 'Resend',\n description: 'Email delivery for auth and form notifications',\n kind: 'email',\n version: '1.0.1',\n dependencies: [],\n conflicts: [],\n files: [\n {\n outputPath: 'lib/actions/resend/provider.ts',\n templatePath: 'actions/resend.ts'\n }\n ],\n packageDependencies: ['resend'],\n devDependencies: [],\n capabilities: {\n emailProvider: {\n provider: 'resend',\n importPath: '@admin/actions/resend/provider',\n exportName: 'resendEmailProvider'\n }\n },\n envSections: [\n {\n header: 'Email (Resend)',\n vars: [\n { key: 'BETTERSTART_RESEND_API_KEY', value: '' },\n { key: 'BETTERSTART_EMAIL_FROM', value: 'noreply@yourdomain.com' }\n ]\n }\n ],\n configure: 'resend'\n}\n","import type {\n BetterstartIntegrationDefinition,\n BetterstartIntegrationId\n} from '@integration-engine/types.js'\nimport { mailchimpIntegration } from '@next-adapter/integrations/mailchimp/integration.js'\nimport { r2Integration } from '@next-adapter/integrations/r2/integration.js'\nimport { resendIntegration } from '@next-adapter/integrations/resend/integration.js'\n\nexport const integrationRegistry: Record<string, BetterstartIntegrationDefinition> = {\n mailchimp: mailchimpIntegration,\n resend: resendIntegration,\n r2: r2Integration\n}\n\nexport function listIntegrationDefinitions(): BetterstartIntegrationDefinition[] {\n return Object.values(integrationRegistry)\n}\n\nexport function getIntegrationDefinition(\n integrationId: BetterstartIntegrationId\n): BetterstartIntegrationDefinition {\n const definition = integrationRegistry[integrationId]\n if (!definition) {\n throw new Error(formatUnknownIntegrationMessage([integrationId]))\n }\n return definition\n}\n\nexport function isIntegrationId(value: string): value is BetterstartIntegrationId {\n return value in integrationRegistry\n}\n\nexport function isEmailProviderIntegration(integrationId: BetterstartIntegrationId): boolean {\n return Boolean(getIntegrationDefinition(integrationId).capabilities?.emailProvider)\n}\n\nexport function formatUnknownIntegrationMessage(integrationIds: string[]): string {\n return `Unknown integration(s): ${integrationIds.join(', ')}. Available for next: ${Object.keys(integrationRegistry).join(', ')}`\n}\n","import type { BetterstartPluginDefinition } from '@plugin-engine/types.js'\n\nexport const blogPlugin: BetterstartPluginDefinition = {\n id: 'blog',\n title: 'Blog',\n description: 'Posts content module',\n kind: 'content',\n version: '1.0.0',\n dependencies: [],\n conflicts: [],\n schemaFiles: ['posts.json'],\n files: [],\n packageDependencies: ['katex', 'markdown-it@^13.0.2', 'markdown-it-dollarmath', 'sanitize-html'],\n devDependencies: ['@types/markdown-it@13', '@types/sanitize-html'],\n envSections: [],\n configure: 'none'\n}\n","import { blogPlugin } from '@next-adapter/plugins/blog/plugin.js'\nimport type { BetterstartPluginDefinition, BetterstartPluginId } from '@plugin-engine/types.js'\n\nexport const pluginRegistry: Record<string, BetterstartPluginDefinition> = {\n blog: blogPlugin\n}\n\nexport function listPluginDefinitions(): BetterstartPluginDefinition[] {\n return Object.values(pluginRegistry)\n}\n\nexport function getPluginDefinition(pluginId: BetterstartPluginId): BetterstartPluginDefinition {\n const definition = pluginRegistry[pluginId]\n if (!definition) {\n throw new Error(formatUnknownPluginMessage([pluginId]))\n }\n return definition\n}\n\nexport function isPluginId(value: string): value is BetterstartPluginId {\n return value in pluginRegistry\n}\n\nexport function formatUnknownPluginMessage(pluginIds: string[]): string {\n return `Unknown plugin(s): ${pluginIds.join(', ')}. Available for next: ${Object.keys(pluginRegistry).join(', ')}`\n}\n","export const REACT_ADMIN_DEPS = [\n '@base-ui/react',\n '@codemirror/commands',\n '@codemirror/lang-javascript',\n '@codemirror/lang-json',\n '@codemirror/lang-markdown',\n '@codemirror/view',\n '@dnd-kit/core',\n '@dnd-kit/sortable',\n '@dnd-kit/utilities',\n '@floating-ui/react',\n '@radix-ui/react-accordion',\n '@radix-ui/react-alert-dialog',\n '@radix-ui/react-aspect-ratio',\n '@radix-ui/react-avatar',\n '@radix-ui/react-checkbox',\n '@radix-ui/react-collapsible',\n '@radix-ui/react-context-menu',\n '@radix-ui/react-dialog',\n '@radix-ui/react-dropdown-menu',\n '@radix-ui/react-hover-card',\n '@radix-ui/react-label',\n '@radix-ui/react-menubar',\n '@radix-ui/react-navigation-menu',\n '@radix-ui/react-popover',\n '@radix-ui/react-progress',\n '@radix-ui/react-radio-group',\n '@radix-ui/react-scroll-area',\n '@radix-ui/react-select',\n '@radix-ui/react-separator',\n '@radix-ui/react-slider',\n '@radix-ui/react-slot',\n '@radix-ui/react-switch',\n '@radix-ui/react-tabs',\n '@radix-ui/react-toast',\n '@radix-ui/react-toggle',\n '@radix-ui/react-toggle-group',\n '@radix-ui/react-tooltip',\n '@tiptap/core',\n '@tiptap/extension-underline',\n '@tiptap/extension-highlight',\n '@tiptap/extension-horizontal-rule',\n '@tiptap/extension-image',\n '@tiptap/extension-list',\n '@tiptap/extension-placeholder',\n '@tiptap/extension-table',\n '@tiptap/extension-table-cell',\n '@tiptap/extension-table-header',\n '@tiptap/extension-table-row',\n '@tiptap/extension-typography',\n '@tiptap/extensions',\n '@tiptap/markdown',\n '@tiptap/pm',\n '@tiptap/react',\n '@tiptap/starter-kit',\n '@uiw/codemirror-theme-github',\n '@uiw/react-codemirror',\n 'cmdk',\n 'embla-carousel-react',\n 'input-otp',\n 'katex',\n 'lodash.throttle',\n 'motion',\n 'next-themes',\n 'radix-ui',\n 'react-day-picker',\n 'react-hotkeys-hook',\n 'react-resizable-panels',\n 'recharts',\n 'vaul'\n]\n\nexport const REACT_ADMIN_DEV_DEPS = ['@tailwindcss/typography']\n","import { spawn } from 'node:child_process'\nimport path from 'node:path'\n\nconst PG_SSL_WARNING_START =\n \"Warning: SECURITY WARNING: The SSL modes 'prefer', 'require', and 'verify-ca' are treated as aliases for 'verify-full'.\"\nconst PG_SSL_WARNING_END =\n 'See https://www.postgresql.org/docs/current/libpq-ssl.html for libpq SSL mode definitions.'\nconst NODE_TRACE_WARNING_HINT = '(Use `node --trace-warnings'\nconst DRIZZLE_CONFIG_BANNER_PATTERNS = [\n /^No config path provided, using default 'drizzle\\.config\\.ts'$/,\n /^Reading config file '.+drizzle\\.config\\.ts'$/,\n /^Using 'pg' driver for database querying$/\n]\n\ninterface WarningFilterState {\n suppressingPgSslWarning: boolean\n suppressNextTraceHint: boolean\n}\n\ninterface DrizzlePushOptions {\n inheritStdio?: boolean\n}\n\nexport interface DrizzlePushResult {\n success: boolean\n error: string | null\n}\n\nfunction shouldSuppressWarningLine(line: string, state: WarningFilterState): boolean {\n const text = line.trimEnd()\n\n if (state.suppressNextTraceHint) {\n state.suppressNextTraceHint = false\n if (text.startsWith(NODE_TRACE_WARNING_HINT)) {\n return true\n }\n }\n\n if (text.includes(PG_SSL_WARNING_START)) {\n state.suppressingPgSslWarning = true\n return true\n }\n\n if (state.suppressingPgSslWarning) {\n if (text.includes(PG_SSL_WARNING_END)) {\n state.suppressingPgSslWarning = false\n state.suppressNextTraceHint = true\n }\n return true\n }\n\n return false\n}\n\nfunction shouldSuppressDrizzleConfigBannerLine(line: string): boolean {\n const text = line.trim()\n return DRIZZLE_CONFIG_BANNER_PATTERNS.some((pattern) => pattern.test(text))\n}\n\nfunction shouldSuppressOutputLine(line: string, state: WarningFilterState): boolean {\n return shouldSuppressWarningLine(line, state) || shouldSuppressDrizzleConfigBannerLine(line)\n}\n\nfunction filterWarningLines(output: string, state: WarningFilterState): string {\n const lines = output.match(/[^\\n]*\\n|[^\\n]+/g) ?? []\n return lines.filter((line) => !shouldSuppressOutputLine(line, state)).join('')\n}\n\nexport function filterPgConnectionStringSslWarning(output: string): string {\n return filterWarningLines(output, {\n suppressingPgSslWarning: false,\n suppressNextTraceHint: false\n })\n}\n\nfunction createPgConnectionStringSslWarningFilter(write: (chunk: string) => void): {\n write: (chunk: string) => void\n end: () => void\n} {\n const state: WarningFilterState = {\n suppressingPgSslWarning: false,\n suppressNextTraceHint: false\n }\n let buffer = ''\n\n return {\n write(chunk: string) {\n buffer += chunk\n const lastNewlineIndex = buffer.lastIndexOf('\\n')\n if (lastNewlineIndex === -1) {\n return\n }\n\n const complete = buffer.slice(0, lastNewlineIndex + 1)\n buffer = buffer.slice(lastNewlineIndex + 1)\n const filtered = filterWarningLines(complete, state)\n if (filtered) {\n write(filtered)\n }\n },\n end() {\n if (!buffer) {\n return\n }\n\n const filtered = filterWarningLines(buffer, state)\n buffer = ''\n if (filtered) {\n write(filtered)\n }\n }\n }\n}\n\n/** Run drizzle-kit push while suppressing pg-connection-string's sslmode advisory. */\nexport function runDrizzlePush(\n cwd: string,\n options: DrizzlePushOptions = {}\n): Promise<DrizzlePushResult> {\n return new Promise((resolve) => {\n const drizzleBin = path.join(cwd, 'node_modules', '.bin', 'drizzle-kit')\n const child = spawn(drizzleBin, ['push', '--force'], {\n cwd,\n stdio: options.inheritStdio ? ['inherit', 'pipe', 'pipe'] : 'pipe',\n env: { ...process.env }\n })\n let stdout = ''\n let stderr = ''\n const stderrFilter = createPgConnectionStringSslWarningFilter((chunk) => {\n if (options.inheritStdio) {\n process.stderr.write(chunk)\n return\n }\n\n stderr += chunk\n })\n const stdoutFilter = createPgConnectionStringSslWarningFilter((chunk) => {\n if (options.inheritStdio) {\n process.stdout.write(chunk)\n return\n }\n\n stdout += chunk\n })\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdoutFilter.write(chunk.toString())\n })\n child.stderr?.on('data', (chunk: Buffer) => {\n stderrFilter.write(chunk.toString())\n })\n child.on('close', (code, signal) => {\n stdoutFilter.end()\n stderrFilter.end()\n\n if (options.inheritStdio) {\n if (code === 0) {\n resolve({ success: true, error: null })\n return\n }\n\n resolve({\n success: false,\n error: signal\n ? `drizzle-kit push exited with signal ${signal}`\n : `drizzle-kit push exited with code ${code}`\n })\n return\n }\n\n const output = `${stdout}\\n${stderr}`.trim()\n const reportedError = output.match(/(?:^|\\n)Error: [\\s\\S]*$/)?.[0]\n\n if (code === 0 && !reportedError) {\n resolve({ success: true, error: null })\n return\n }\n\n resolve({\n success: false,\n error: reportedError ?? (stderr || stdout || `drizzle-kit push exited with code ${code}`)\n })\n })\n child.on('error', (err) => {\n resolve({ success: false, error: err.message })\n })\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport * as p from '@clack/prompts'\nimport { writeConfigFile } from '@core-engine/config/serialize.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport {\n type LoadedSchema,\n listSchemaNames,\n loadSchema\n} from '@core-engine/schema/schema-reader.js'\nimport { loadManifest } from '@core-engine/snapshots/store.js'\nimport { appendEnvVars, readEnvVar, removeEnvVars } from '@core-engine/utils/env.js'\nimport type { PackageManager } from '@core-engine/utils/package-manager.js'\nimport {\n deleteInstalledIntegrationManifest,\n loadInstalledIntegrationManifest,\n saveInstalledIntegrationManifest\n} from '@integration-engine/manifests.js'\nimport type {\n BetterstartIntegrationDefinition,\n BetterstartIntegrationId,\n InstalledIntegrationManifest\n} from '@integration-engine/types.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\nimport { resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport {\n getDependencyPlan,\n installDependenciesAsync,\n removeDependenciesAsync\n} from '@next-adapter/init/scaffolders/dependencies.js'\nimport {\n formatUnknownIntegrationMessage,\n getIntegrationDefinition,\n isIntegrationId,\n listIntegrationDefinitions\n} from '@next-adapter/integration-registry.js'\nimport { readIntegrationTemplate } from '@next-adapter/integration-template-reader.js'\nimport { getPluginDefinition } from '@next-adapter/plugin-registry.js'\nimport { readTemplate } from '@next-adapter/template-reader.js'\nimport { loadSchemaOwnershipIndex } from '@plugin-engine/ownership.js'\n\ninterface ConfigureIntegrationResult {\n configured: boolean\n addedEnvKeys: string[]\n updatedEnvKeys: string[]\n}\n\nexport interface InstallIntegrationsOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n pm: PackageManager\n integrationIds: BetterstartIntegrationId[]\n interactive: boolean\n includeBiome: boolean\n}\n\nexport interface InstallIntegrationsResult {\n installed: BetterstartIntegrationId[]\n activated: BetterstartIntegrationId[]\n skipped: BetterstartIntegrationId[]\n warnings: string[]\n config: ResolvedBetterstartConfig\n}\n\nexport interface RemoveIntegrationsOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n pm: PackageManager\n integrationIds: BetterstartIntegrationId[]\n}\n\nexport interface RemoveIntegrationsResult {\n removed: BetterstartIntegrationId[]\n warnings: string[]\n config: ResolvedBetterstartConfig\n}\n\nfunction unique<T>(values: T[]): T[] {\n return Array.from(new Set(values))\n}\n\nfunction normalizeInstalledIntegrations(\n config: ResolvedBetterstartConfig\n): BetterstartIntegrationId[] {\n return unique((config.integrations.installed ?? []).filter(isIntegrationId)).sort()\n}\n\nfunction resolveIntegrationInstallOrder(\n integrationIds: BetterstartIntegrationId[]\n): BetterstartIntegrationId[] {\n const ordered: BetterstartIntegrationId[] = []\n const visiting = new Set<BetterstartIntegrationId>()\n const visited = new Set<BetterstartIntegrationId>()\n\n function visit(integrationId: BetterstartIntegrationId): void {\n if (visited.has(integrationId)) return\n if (visiting.has(integrationId)) {\n throw new Error(`Circular integration dependency detected at \"${integrationId}\".`)\n }\n\n visiting.add(integrationId)\n for (const dependency of getIntegrationDefinition(integrationId).dependencies) {\n visit(dependency)\n }\n visiting.delete(integrationId)\n visited.add(integrationId)\n ordered.push(integrationId)\n }\n\n for (const integrationId of integrationIds) {\n visit(integrationId)\n }\n\n return ordered\n}\n\nfunction resolveIntegrationProjectPath(\n config: ResolvedBetterstartConfig,\n outputPath: string\n): string {\n const namespacedOutputPath = applyAdminNamespaceToPath(\n outputPath,\n config.frameworkConfig.next.namespace\n )\n return path.posix.join(config.paths.admin.replace(/^\\.\\//, ''), namespacedOutputPath)\n}\n\nfunction namespaceIntegrationContent(config: ResolvedBetterstartConfig, content: string): string {\n return applyAdminNamespaceToContent(content, config.frameworkConfig.next.namespace)\n}\n\nfunction flattenEnvKeys(definition: BetterstartIntegrationDefinition): string[] {\n return definition.envSections.flatMap((section) => section.vars.map((entry) => entry.key))\n}\n\nfunction normalizeManagedFileContent(content: string): string {\n return content.replace(/\\r\\n/g, '\\n')\n}\n\nfunction getEmailTemplatesDir(cwd: string, config: ResolvedBetterstartConfig): string {\n const paths = resolveProjectPaths(config)\n return path.join(cwd, ...paths.adminEmailTemplatesDir.split('/'))\n}\n\nfunction ensureEmailTemplatesDir(cwd: string, config: ResolvedBetterstartConfig): void {\n fs.mkdirSync(getEmailTemplatesDir(cwd, config), { recursive: true })\n}\n\nfunction removeEmailTemplatesDirIfEmpty(cwd: string, config: ResolvedBetterstartConfig): void {\n const dir = getEmailTemplatesDir(cwd, config)\n if (!fs.existsSync(dir)) return\n\n if (fs.readdirSync(dir).length === 0) {\n fs.rmdirSync(dir)\n }\n}\n\nfunction getActiveEmailProvider(config: ResolvedBetterstartConfig) {\n return normalizeInstalledIntegrations(config)\n .map((integrationId) => getIntegrationDefinition(integrationId))\n .map((definition) => definition.capabilities?.emailProvider)\n .find((provider) => provider?.provider === config.email.provider)\n}\n\nfunction getActiveStorageProvider(config: ResolvedBetterstartConfig) {\n return normalizeInstalledIntegrations(config)\n .map((integrationId) => getIntegrationDefinition(integrationId))\n .map((definition) => definition.capabilities?.storageProvider)\n .find((provider) => provider?.provider === config.storage.provider)\n}\n\nexport function renderCoreEmailProvider(config: ResolvedBetterstartConfig): string {\n const activeProvider = getActiveEmailProvider(config)\n const providerImport = activeProvider\n ? `import { ${activeProvider.exportName} } from '${activeProvider.importPath}'\\n`\n : ''\n const providerBranch = activeProvider\n ? ` if (${activeProvider.exportName}.isConfigured()) {\n return ${activeProvider.exportName}\n }\n\n`\n : ''\n\n return namespaceIntegrationContent(\n config,\n `import { noneEmailProvider } from '@admin/actions/email/none'\n${providerImport}import type { AdminEmailProvider } from '@admin/actions/email/types'\n\nexport function getEmailProvider(): AdminEmailProvider {\n${providerBranch} return noneEmailProvider\n}\n`\n )\n}\n\nexport function renderCoreEmailProviderIndex(config: ResolvedBetterstartConfig): string {\n return namespaceIntegrationContent(config, readTemplate('lib/actions/email/index.ts'))\n}\n\nexport function renderCoreStorageProvider(config: ResolvedBetterstartConfig): string {\n const activeProvider = getActiveStorageProvider(config)\n const providerImport = activeProvider\n ? `import { ${activeProvider.exportName} } from '${activeProvider.importPath}'\\n`\n : ''\n const providerBranch = activeProvider\n ? ` if (${activeProvider.exportName}.isConfigured()) {\n return ${activeProvider.exportName}\n }\n\n`\n : ''\n\n return namespaceIntegrationContent(\n config,\n `import { localStorageProvider } from '@admin/actions/storage/local'\n${providerImport}import type { AdminStorageProvider } from '@admin/actions/storage/types'\n\nexport function getStorageProvider(): AdminStorageProvider {\n${providerBranch} return localStorageProvider\n}\n`\n )\n}\n\nexport function renderCoreStorageProviderIndex(config: ResolvedBetterstartConfig): string {\n return namespaceIntegrationContent(config, readTemplate('lib/actions/storage/index.ts'))\n}\n\nfunction writeCoreProviderIndexes(cwd: string, config: ResolvedBetterstartConfig): void {\n const paths = resolveProjectPaths(config)\n const emailPath = path.join(cwd, ...paths.adminActionsDir.split('/'), 'email', 'index.ts')\n const emailProviderPath = path.join(\n cwd,\n ...paths.adminActionsDir.split('/'),\n 'email',\n 'provider.ts'\n )\n const storagePath = path.join(cwd, ...paths.adminActionsDir.split('/'), 'storage', 'index.ts')\n const storageProviderPath = path.join(\n cwd,\n ...paths.adminActionsDir.split('/'),\n 'storage',\n 'provider.ts'\n )\n\n fs.mkdirSync(path.dirname(emailPath), { recursive: true })\n fs.writeFileSync(emailPath, renderCoreEmailProviderIndex(config), 'utf-8')\n fs.writeFileSync(emailProviderPath, renderCoreEmailProvider(config), 'utf-8')\n\n fs.mkdirSync(path.dirname(storagePath), { recursive: true })\n fs.writeFileSync(storagePath, renderCoreStorageProviderIndex(config), 'utf-8')\n fs.writeFileSync(storageProviderPath, renderCoreStorageProvider(config), 'utf-8')\n}\n\nfunction tryReadCoreManagedTemplate(relativeOutputPath: string): string | null {\n try {\n return readTemplate(relativeOutputPath)\n } catch {\n return null\n }\n}\n\nfunction hasRequiredIntegrationEnv(\n definition: BetterstartIntegrationDefinition,\n cwd: string\n): boolean {\n const requiredKeys = definition.envSections.flatMap((section) =>\n section.vars.filter((entry) => entry.value === '').map((entry) => entry.key)\n )\n return requiredKeys.every((key) => Boolean(readEnvVar(cwd, key)))\n}\n\nfunction readNonEmptyEnvVar(cwd: string, key: string): string | undefined {\n const value = readEnvVar(cwd, key)?.trim()\n return value ? value : undefined\n}\n\ninterface EnvPromptOptions {\n cwd: string\n key: string\n message: string\n cancelMessage: string\n overwriteEnvKeys: Set<string>\n validate: (value: string | undefined) => string | Error | undefined\n}\n\ninterface EnvTextPromptOptions extends EnvPromptOptions {\n defaultValue?: string\n}\n\nasync function resolveTextEnvValue(options: EnvTextPromptOptions): Promise<string> {\n const existingValue = readNonEmptyEnvVar(options.cwd, options.key)\n if (existingValue) {\n return existingValue\n }\n\n const result = await p.text({\n message: options.message,\n defaultValue: options.defaultValue,\n validate: options.validate\n })\n\n if (p.isCancel(result)) {\n throw new Error(options.cancelMessage)\n }\n\n options.overwriteEnvKeys.add(options.key)\n return result.trim()\n}\n\nasync function resolvePasswordEnvValue(options: EnvPromptOptions): Promise<string> {\n const existingValue = readNonEmptyEnvVar(options.cwd, options.key)\n if (existingValue) {\n return existingValue\n }\n\n const result = await p.password({\n message: options.message,\n validate: options.validate\n })\n\n if (p.isCancel(result)) {\n throw new Error(options.cancelMessage)\n }\n\n options.overwriteEnvKeys.add(options.key)\n return result.trim()\n}\n\nasync function promptResendConfig(cwd: string): Promise<ConfigureIntegrationResult> {\n const overwriteEnvKeys = new Set<string>()\n const apiKey = await resolvePasswordEnvValue({\n cwd,\n key: 'BETTERSTART_RESEND_API_KEY',\n message: 'Resend API key',\n cancelMessage: 'Resend configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim()) {\n return 'Enter a Resend API key.'\n }\n }\n })\n const fromAddress = await resolveTextEnvValue({\n cwd,\n key: 'BETTERSTART_EMAIL_FROM',\n message: 'From email address',\n defaultValue: 'noreply@yourdomain.com',\n cancelMessage: 'Resend configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim() || !value.includes('@')) {\n return 'Enter a valid sender email address.'\n }\n }\n })\n\n const envResult = appendEnvVars(\n cwd,\n [\n {\n header: 'Email (Resend)',\n vars: [\n { key: 'BETTERSTART_RESEND_API_KEY', value: apiKey.trim() },\n { key: 'BETTERSTART_EMAIL_FROM', value: fromAddress.trim() }\n ]\n }\n ],\n overwriteEnvKeys\n )\n\n return {\n configured: true,\n addedEnvKeys: envResult.added,\n updatedEnvKeys: envResult.updated\n }\n}\n\nasync function promptR2Config(cwd: string): Promise<ConfigureIntegrationResult> {\n const overwriteEnvKeys = new Set<string>()\n const accountId = await resolveTextEnvValue({\n cwd,\n key: 'BETTERSTART_R2_ACCOUNT_ID',\n message: 'Cloudflare account ID',\n cancelMessage: 'R2 configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim()) return 'Enter your Cloudflare account ID.'\n }\n })\n const accessKeyId = await resolveTextEnvValue({\n cwd,\n key: 'BETTERSTART_R2_ACCESS_KEY_ID',\n message: 'R2 access key ID',\n cancelMessage: 'R2 configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim()) return 'Enter your R2 access key ID.'\n }\n })\n const secretAccessKey = await resolvePasswordEnvValue({\n cwd,\n key: 'BETTERSTART_R2_SECRET_ACCESS_KEY',\n message: 'R2 secret access key',\n cancelMessage: 'R2 configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim()) return 'Enter your R2 secret access key.'\n }\n })\n const bucketName = await resolveTextEnvValue({\n cwd,\n key: 'BETTERSTART_R2_BUCKET_NAME',\n message: 'R2 bucket name',\n defaultValue: 'betterstart-uploads',\n cancelMessage: 'R2 configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim()) return 'Enter your R2 bucket name.'\n }\n })\n const publicUrl = await resolveTextEnvValue({\n cwd,\n key: 'BETTERSTART_R2_PUBLIC_URL',\n message: 'R2 public URL',\n cancelMessage: 'R2 configuration cancelled.',\n overwriteEnvKeys,\n validate(value) {\n if (!value?.trim() || !value.startsWith('http')) {\n return 'Enter a valid public URL.'\n }\n }\n })\n\n const envResult = appendEnvVars(\n cwd,\n [\n {\n header: 'Storage (Cloudflare R2)',\n vars: [\n { key: 'BETTERSTART_R2_ACCOUNT_ID', value: accountId.trim() },\n { key: 'BETTERSTART_R2_ACCESS_KEY_ID', value: accessKeyId.trim() },\n { key: 'BETTERSTART_R2_SECRET_ACCESS_KEY', value: secretAccessKey.trim() },\n { key: 'BETTERSTART_R2_BUCKET_NAME', value: bucketName.trim() },\n { key: 'BETTERSTART_R2_PUBLIC_URL', value: publicUrl.trim() }\n ]\n }\n ],\n overwriteEnvKeys\n )\n\n return {\n configured: true,\n addedEnvKeys: envResult.added,\n updatedEnvKeys: envResult.updated\n }\n}\n\nasync function configureIntegration(\n definition: BetterstartIntegrationDefinition,\n cwd: string,\n interactive: boolean\n): Promise<ConfigureIntegrationResult> {\n if (definition.configure === 'resend') {\n if (interactive) {\n return promptResendConfig(cwd)\n }\n\n const envResult = appendEnvVars(cwd, definition.envSections)\n return {\n configured: hasRequiredIntegrationEnv(definition, cwd),\n addedEnvKeys: envResult.added,\n updatedEnvKeys: envResult.updated\n }\n }\n\n if (definition.configure === 'r2') {\n if (interactive) {\n return promptR2Config(cwd)\n }\n\n const envResult = appendEnvVars(cwd, definition.envSections)\n return {\n configured: hasRequiredIntegrationEnv(definition, cwd),\n addedEnvKeys: envResult.added,\n updatedEnvKeys: envResult.updated\n }\n }\n\n const envResult = appendEnvVars(cwd, definition.envSections)\n return {\n configured: true,\n addedEnvKeys: envResult.added,\n updatedEnvKeys: envResult.updated\n }\n}\n\nfunction ensureIntegrationDirectFileTargetsAvailable(\n cwd: string,\n config: ResolvedBetterstartConfig,\n definition: BetterstartIntegrationDefinition\n): void {\n for (const file of definition.files) {\n const projectRelativePath = resolveIntegrationProjectPath(config, file.outputPath)\n const fullPath = path.join(cwd, ...projectRelativePath.split('/'))\n\n if (!fs.existsSync(fullPath)) {\n continue\n }\n\n const stats = fs.statSync(fullPath)\n if (!stats.isFile()) {\n throw new Error(\n `Installing ${definition.id} would overwrite \"${projectRelativePath}\", but it is not a file. Remove or rename it before continuing.`\n )\n }\n\n const existingContent = normalizeManagedFileContent(fs.readFileSync(fullPath, 'utf-8'))\n const integrationTemplate = normalizeManagedFileContent(\n namespaceIntegrationContent(config, readIntegrationTemplate(definition.id, file.templatePath))\n )\n\n if (existingContent === integrationTemplate) {\n continue\n }\n\n const coreTemplate = tryReadCoreManagedTemplate(file.outputPath)\n if (\n coreTemplate &&\n existingContent ===\n normalizeManagedFileContent(namespaceIntegrationContent(config, coreTemplate))\n ) {\n continue\n }\n\n throw new Error(\n `Installing ${definition.id} would overwrite existing file \"${projectRelativePath}\". Rename, remove, or reset it to the managed template before installing ${definition.id}.`\n )\n }\n}\n\nfunction writeIntegrationDirectFiles(\n cwd: string,\n config: ResolvedBetterstartConfig,\n definition: BetterstartIntegrationDefinition\n): string[] {\n const writtenFiles: string[] = []\n\n for (const file of definition.files) {\n const projectRelativePath = resolveIntegrationProjectPath(config, file.outputPath)\n const fullPath = path.join(cwd, ...projectRelativePath.split('/'))\n fs.mkdirSync(path.dirname(fullPath), { recursive: true })\n fs.writeFileSync(\n fullPath,\n namespaceIntegrationContent(\n config,\n readIntegrationTemplate(definition.id, file.templatePath)\n ),\n 'utf-8'\n )\n writtenFiles.push(projectRelativePath)\n }\n\n return writtenFiles\n}\n\nfunction toProjectAbsolutePath(cwd: string, filePath: string): string {\n return path.isAbsolute(filePath) ? filePath : path.join(cwd, ...filePath.split('/'))\n}\n\nfunction isInsideDir(child: string, parent: string): boolean {\n const relative = path.relative(parent, child)\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))\n}\n\nfunction cleanupEmptyDirs(\n cwd: string,\n deletedPaths: string[],\n config: ResolvedBetterstartConfig\n): void {\n const paths = resolveProjectPaths(config)\n const projectRoot = path.resolve(cwd)\n const stopRoots = new Set([\n projectRoot,\n toProjectAbsolutePath(cwd, paths.adminDir),\n toProjectAbsolutePath(cwd, paths.pagesDir),\n toProjectAbsolutePath(cwd, paths.schemasDir),\n path.join(projectRoot, '.betterstart'),\n path.join(projectRoot, '.betterstart', 'integrations'),\n path.join(projectRoot, '.betterstart', 'snapshots')\n ])\n\n for (const deletedPath of deletedPaths) {\n let currentDir = path.dirname(toProjectAbsolutePath(cwd, deletedPath))\n\n while (isInsideDir(currentDir, projectRoot) && !stopRoots.has(currentDir)) {\n if (!fs.existsSync(currentDir)) {\n currentDir = path.dirname(currentDir)\n continue\n }\n\n if (fs.readdirSync(currentDir).length > 0) {\n break\n }\n\n fs.rmdirSync(currentDir)\n currentDir = path.dirname(currentDir)\n }\n }\n}\n\nfunction restoreOrDeleteIntegrationFile(\n cwd: string,\n config: ResolvedBetterstartConfig,\n relativeOutputPath: string\n): string | null {\n const projectRelativePath = resolveIntegrationProjectPath(config, relativeOutputPath)\n const fullPath = toProjectAbsolutePath(cwd, projectRelativePath)\n\n try {\n const coreTemplate = readTemplate(relativeOutputPath)\n fs.mkdirSync(path.dirname(fullPath), { recursive: true })\n fs.writeFileSync(fullPath, namespaceIntegrationContent(config, coreTemplate), 'utf-8')\n return null\n } catch {\n const existed = fs.existsSync(fullPath)\n fs.rmSync(fullPath, { force: true })\n return existed ? projectRelativePath : null\n }\n}\n\nfunction schemaManifestContainsMailchimpImports(\n cwd: string,\n config: ResolvedBetterstartConfig,\n schemaName: string\n): boolean {\n const manifest = loadManifest(cwd, schemaName)\n if (!manifest) {\n return false\n }\n\n const namespace = config.frameworkConfig.next.namespace\n const markers = [\n applyAdminNamespaceToContent('@admin/actions/mailchimp/add-to-mailchimp-audience', namespace),\n applyAdminNamespaceToContent('@admin/actions/mailchimp/mailchimp', namespace),\n 'addToMailchimpAudience('\n ]\n const liveManifestPaths = unique([\n ...manifest.files.map((file) => file.path),\n ...manifest.skipped\n ])\n\n return liveManifestPaths.some((filePath) => {\n const fullPath = path.join(cwd, ...filePath.split('/'))\n if (!fs.existsSync(fullPath) || !fs.statSync(fullPath).isFile()) {\n return false\n }\n\n const content = fs.readFileSync(fullPath, 'utf-8')\n return markers.some((marker) => content.includes(marker))\n })\n}\n\nfunction findBlockingIntegrationDependencies(\n cwd: string,\n config: ResolvedBetterstartConfig,\n integrationId: BetterstartIntegrationId\n): string[] {\n const blockers: string[] = []\n const paths = resolveProjectPaths(config)\n const schemasDir = path.join(cwd, ...paths.schemasDir.split('/'))\n const ownership = loadSchemaOwnershipIndex(cwd)\n\n for (const schemaName of listSchemaNames(schemasDir)) {\n if (ownership.schemas[schemaName] !== 'user') {\n continue\n }\n\n const loaded: LoadedSchema = loadSchema(schemasDir, schemaName)\n if (integrationId === 'mailchimp' && loaded.type === 'form') {\n if (loaded.schema.mailchimp) {\n blockers.push(`${schemaName} still sets \"mailchimp\" in its form schema`)\n continue\n }\n\n if (schemaManifestContainsMailchimpImports(cwd, config, schemaName)) {\n blockers.push(\n `${schemaName} still has generated Mailchimp wiring. Run \\`betterstart generate ${schemaName}\\` before removing the mailchimp integration`\n )\n }\n }\n }\n\n return blockers\n}\n\nfunction getUnusedIntegrationDependencies(\n config: ResolvedBetterstartConfig,\n remainingIntegrations: BetterstartIntegrationId[],\n removedIntegrationId: BetterstartIntegrationId\n): { dependencies: string[]; devDependencies: string[] } {\n const remainingIntegrationDefinitions = remainingIntegrations.map((integrationId) =>\n getIntegrationDefinition(integrationId)\n )\n const remainingPluginDefinitions = config.plugins.installed.map((pluginId) =>\n getPluginDefinition(pluginId)\n )\n const remainingDependencies = new Set([\n ...remainingIntegrationDefinitions.flatMap((definition) => definition.packageDependencies),\n ...remainingPluginDefinitions.flatMap((definition) => definition.packageDependencies)\n ])\n const remainingDevDependencies = new Set([\n ...remainingIntegrationDefinitions.flatMap((definition) => definition.devDependencies),\n ...remainingPluginDefinitions.flatMap((definition) => definition.devDependencies)\n ])\n\n const corePlan = getDependencyPlan([], [], false)\n const removedDefinition = getIntegrationDefinition(removedIntegrationId)\n\n return {\n dependencies: removedDefinition.packageDependencies.filter(\n (dependency) =>\n !remainingDependencies.has(dependency) && !corePlan.dependencies.includes(dependency)\n ),\n devDependencies: removedDefinition.devDependencies.filter(\n (dependency) =>\n !remainingDevDependencies.has(dependency) && !corePlan.devDependencies.includes(dependency)\n )\n }\n}\n\nexport function parseIntegrationList(value: string | undefined): BetterstartIntegrationId[] {\n if (!value) {\n return []\n }\n\n const integrationIds = value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n\n const invalid = integrationIds.filter((integrationId) => !isIntegrationId(integrationId))\n if (invalid.length > 0) {\n throw new Error(formatUnknownIntegrationMessage(invalid))\n }\n\n return unique(integrationIds as BetterstartIntegrationId[])\n}\n\nexport function getInstalledIntegrations(\n config: ResolvedBetterstartConfig\n): BetterstartIntegrationId[] {\n return normalizeInstalledIntegrations(config)\n}\n\nexport function hasInstalledIntegrationFeature(\n config: ResolvedBetterstartConfig,\n feature: string\n): boolean {\n return normalizeInstalledIntegrations(config).some((integrationId) =>\n getIntegrationDefinition(integrationId).capabilities?.formFeatures?.includes(feature)\n )\n}\n\nexport function syncInstalledIntegrationManifests(\n cwd: string,\n config: ResolvedBetterstartConfig\n): void {\n for (const integrationId of normalizeInstalledIntegrations(config)) {\n const manifest = loadInstalledIntegrationManifest(cwd, integrationId)\n if (!manifest) {\n continue\n }\n\n const definition = getIntegrationDefinition(integrationId)\n const nextManifest: InstalledIntegrationManifest = {\n ...manifest,\n version: definition.version,\n kind: definition.kind,\n ownedFiles: definition.files.map((file) =>\n resolveIntegrationProjectPath(config, file.outputPath)\n ),\n packageDependencies: definition.packageDependencies,\n devDependencies: definition.devDependencies,\n dependencies: definition.dependencies,\n conflicts: definition.conflicts\n }\n\n if (JSON.stringify(nextManifest) !== JSON.stringify(manifest)) {\n saveInstalledIntegrationManifest(cwd, nextManifest)\n }\n }\n}\n\nfunction isProviderIntegration(definition: BetterstartIntegrationDefinition): boolean {\n return Boolean(definition.capabilities?.emailProvider || definition.capabilities?.storageProvider)\n}\n\nfunction activateConfiguredProviderIntegration(\n definition: BetterstartIntegrationDefinition,\n config: ResolvedBetterstartConfig\n): boolean {\n let changed = false\n const emailProvider = definition.capabilities?.emailProvider\n const storageProvider = definition.capabilities?.storageProvider\n\n if (emailProvider && config.email.provider !== emailProvider.provider) {\n config.email.provider = emailProvider.provider\n changed = true\n }\n\n if (storageProvider && config.storage.provider !== storageProvider.provider) {\n config.storage.provider = storageProvider.provider\n changed = true\n }\n\n return changed\n}\n\nfunction buildInstalledIntegrationManifest({\n config,\n definition,\n writtenFiles,\n configured,\n previousManifest\n}: {\n config: ResolvedBetterstartConfig\n definition: BetterstartIntegrationDefinition\n writtenFiles?: string[]\n configured: boolean\n previousManifest?: InstalledIntegrationManifest | null\n}): InstalledIntegrationManifest {\n return {\n id: definition.id,\n version: definition.version,\n kind: definition.kind,\n ownedFiles:\n writtenFiles ??\n previousManifest?.ownedFiles ??\n definition.files.map((file) => resolveIntegrationProjectPath(config, file.outputPath)),\n envKeys: flattenEnvKeys(definition),\n packageDependencies: definition.packageDependencies,\n devDependencies: definition.devDependencies,\n configured,\n dependencies: definition.dependencies,\n conflicts: definition.conflicts,\n installedAt: previousManifest?.installedAt ?? new Date().toISOString()\n }\n}\n\nexport async function installIntegrations({\n cwd,\n config,\n pm,\n integrationIds,\n interactive,\n includeBiome\n}: InstallIntegrationsOptions): Promise<InstallIntegrationsResult> {\n const orderedIntegrationIds = resolveIntegrationInstallOrder(integrationIds)\n const installedIntegrationIds = normalizeInstalledIntegrations(config)\n const skipped: BetterstartIntegrationId[] = []\n const installed: BetterstartIntegrationId[] = []\n const activated: BetterstartIntegrationId[] = []\n const warnings: string[] = []\n\n for (const integrationId of orderedIntegrationIds) {\n const definition = getIntegrationDefinition(integrationId)\n\n if (installedIntegrationIds.includes(integrationId)) {\n if (!isProviderIntegration(definition)) {\n skipped.push(integrationId)\n continue\n }\n\n const previousManifest = loadInstalledIntegrationManifest(cwd, integrationId)\n const configureResult = await configureIntegration(definition, cwd, interactive)\n\n if (!configureResult.configured) {\n saveInstalledIntegrationManifest(\n cwd,\n buildInstalledIntegrationManifest({\n config,\n definition,\n configured: false,\n previousManifest\n })\n )\n skipped.push(integrationId)\n warnings.push(\n `${integrationId} is installed but was not activated because its required environment variables are still missing.`\n )\n continue\n }\n\n const providerChanged = activateConfiguredProviderIntegration(definition, config)\n\n if (definition.capabilities?.emailProvider) {\n ensureEmailTemplatesDir(cwd, config)\n }\n writeCoreProviderIndexes(cwd, config)\n saveInstalledIntegrationManifest(\n cwd,\n buildInstalledIntegrationManifest({\n config,\n definition,\n configured: true,\n previousManifest\n })\n )\n writeConfigFile(cwd, config)\n\n if (providerChanged || previousManifest?.configured !== true) {\n activated.push(integrationId)\n } else {\n skipped.push(integrationId)\n }\n continue\n }\n\n ensureIntegrationDirectFileTargetsAvailable(cwd, config, definition)\n\n const configureResult = await configureIntegration(definition, cwd, interactive)\n const dependencyPlan = getDependencyPlan(\n config.plugins.installed,\n [...installedIntegrationIds, integrationId],\n includeBiome\n )\n const currentPlan = getDependencyPlan(\n config.plugins.installed,\n installedIntegrationIds,\n includeBiome\n )\n\n const dependencyDiff = {\n dependencies: dependencyPlan.dependencies.filter(\n (dependency) => !currentPlan.dependencies.includes(dependency)\n ),\n devDependencies: dependencyPlan.devDependencies.filter(\n (dependency) => !currentPlan.devDependencies.includes(dependency)\n )\n }\n\n if (dependencyDiff.dependencies.length > 0 || dependencyDiff.devDependencies.length > 0) {\n const result = await installDependenciesAsync({\n cwd,\n pm,\n dependencies: dependencyDiff.dependencies,\n devDependencies: dependencyDiff.devDependencies\n })\n\n if (!result.success) {\n throw new Error(result.error ?? `Failed to install dependencies for ${integrationId}.`)\n }\n }\n\n const writtenFiles = writeIntegrationDirectFiles(cwd, config, definition)\n\n installedIntegrationIds.push(integrationId)\n config.integrations.installed = unique(installedIntegrationIds).sort()\n\n if (configureResult.configured) {\n activateConfiguredProviderIntegration(definition, config)\n }\n\n if (definition.capabilities?.emailProvider) {\n ensureEmailTemplatesDir(cwd, config)\n }\n writeCoreProviderIndexes(cwd, config)\n\n const manifest = buildInstalledIntegrationManifest({\n config,\n definition,\n writtenFiles,\n configured: configureResult.configured\n })\n\n saveInstalledIntegrationManifest(cwd, manifest)\n writeConfigFile(cwd, config)\n installed.push(integrationId)\n\n if (!configureResult.configured && isProviderIntegration(definition)) {\n warnings.push(\n `${integrationId} was installed but not activated because its required environment variables are still missing.`\n )\n }\n }\n\n return {\n installed,\n activated,\n skipped,\n warnings,\n config\n }\n}\n\nexport async function removeIntegrations({\n cwd,\n config,\n pm,\n integrationIds\n}: RemoveIntegrationsOptions): Promise<RemoveIntegrationsResult> {\n const installedIntegrations = normalizeInstalledIntegrations(config)\n const removed: BetterstartIntegrationId[] = []\n const warnings: string[] = []\n\n for (const integrationId of integrationIds) {\n if (!installedIntegrations.includes(integrationId)) {\n warnings.push(`${integrationId} is not installed.`)\n continue\n }\n\n const manifest = loadInstalledIntegrationManifest(cwd, integrationId)\n if (!manifest) {\n throw new Error(`Missing manifest for installed integration \"${integrationId}\".`)\n }\n\n const dependents = installedIntegrations.filter((installedIntegrationId) => {\n if (installedIntegrationId === integrationId) {\n return false\n }\n\n return getIntegrationDefinition(installedIntegrationId).dependencies.includes(integrationId)\n })\n\n if (dependents.length > 0) {\n throw new Error(\n `Cannot remove ${integrationId}. The following integrations depend on it: ${dependents.join(', ')}`\n )\n }\n\n const blockers = findBlockingIntegrationDependencies(cwd, config, integrationId)\n if (blockers.length > 0) {\n throw new Error(`Cannot remove ${integrationId}:\\n- ${blockers.join('\\n- ')}`)\n }\n\n const deletedPaths: string[] = []\n\n for (const filePath of manifest.ownedFiles) {\n const relativeOutputPath = filePath.replace(`${config.paths.admin.replace(/^\\.\\//, '')}/`, '')\n const deletedPath = restoreOrDeleteIntegrationFile(cwd, config, relativeOutputPath)\n if (deletedPath) {\n deletedPaths.push(deletedPath)\n }\n }\n\n deleteInstalledIntegrationManifest(cwd, integrationId)\n const nextInstalledIntegrations = installedIntegrations.filter(\n (installedIntegrationId) => installedIntegrationId !== integrationId\n )\n installedIntegrations.splice(0, installedIntegrations.length, ...nextInstalledIntegrations)\n config.integrations.installed = [...nextInstalledIntegrations].sort()\n\n const definition = getIntegrationDefinition(integrationId)\n if (definition.capabilities?.emailProvider?.provider === config.email.provider) {\n config.email.provider = 'none'\n }\n if (definition.capabilities?.storageProvider?.provider === config.storage.provider) {\n config.storage.provider = 'local'\n }\n writeCoreProviderIndexes(cwd, config)\n\n const remainingIntegrations = normalizeInstalledIntegrations(config)\n const hasRemainingEmailProvider = remainingIntegrations.some((remainingIntegrationId) =>\n Boolean(getIntegrationDefinition(remainingIntegrationId).capabilities?.emailProvider)\n )\n if (definition.capabilities?.emailProvider && !hasRemainingEmailProvider) {\n removeEmailTemplatesDirIfEmpty(cwd, config)\n }\n\n const dependencyDiff = getUnusedIntegrationDependencies(\n config,\n remainingIntegrations,\n integrationId\n )\n\n if (dependencyDiff.dependencies.length > 0 || dependencyDiff.devDependencies.length > 0) {\n const result = await removeDependenciesAsync({\n cwd,\n pm,\n dependencies: dependencyDiff.dependencies,\n devDependencies: dependencyDiff.devDependencies\n })\n\n if (!result.success) {\n warnings.push(result.error ?? `Failed to remove dependencies for ${integrationId}.`)\n }\n }\n\n const usedEnvKeys = new Set(\n remainingIntegrations.flatMap((remainingIntegrationId) =>\n flattenEnvKeys(getIntegrationDefinition(remainingIntegrationId))\n )\n )\n const removableEnvKeys = manifest.envKeys.filter((envKey) => !usedEnvKeys.has(envKey))\n if (removableEnvKeys.length > 0) {\n removeEnvVars(cwd, removableEnvKeys)\n }\n\n cleanupEmptyDirs(cwd, deletedPaths, config)\n\n writeConfigFile(cwd, config)\n removed.push(integrationId)\n }\n\n return {\n removed,\n warnings,\n config\n }\n}\n\nexport function listAvailableIntegrations() {\n return listIntegrationDefinitions()\n}\n","/**\n * Schema reader: load + validate JSON schemas from admin/schemas/\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { isColumnType, isFieldType, isFormFieldType } from '@core-engine/schema/constants.js'\nimport { flattenFields } from '@core-engine/schema/field-helpers/index.js'\nimport type {\n FormField,\n FormSchema,\n Schema,\n SchemaField,\n SchemaSlotLayout\n} from '@core-engine/schema/types.js'\n\n// ============================================================================\n// Schema Types\n// ============================================================================\n\nexport interface LoadedEntitySchema {\n type: 'entity'\n schema: Schema\n filePath: string\n}\n\nexport interface LoadedSingleSchema {\n type: 'single'\n schema: Schema\n filePath: string\n}\n\nexport interface LoadedFormSchema {\n type: 'form'\n schema: FormSchema\n filePath: string\n}\n\nexport type LoadedSchema = LoadedEntitySchema | LoadedSingleSchema | LoadedFormSchema\n\n// ============================================================================\n// Schema Loading\n// ============================================================================\n\n/**\n * Load a schema by name from the schemas directory\n * Detects schema type from the explicit top-level `type` field\n */\nexport function loadSchema(schemasDir: string, name: string): LoadedSchema {\n const filePaths = [\n path.join(schemasDir, `${name}.json`),\n path.join(schemasDir, 'forms', `${name}.json`)\n ].filter((filePath) => fs.existsSync(filePath))\n\n if (filePaths.length === 0) {\n throw new SchemaNotFoundError(name, schemasDir)\n }\n\n if (filePaths.length > 1) {\n throw new Error(\n `Found multiple schemas named \"${name}\". Keep only one file: ${filePaths.join(', ')}`\n )\n }\n\n const filePath = filePaths[0]!\n const content = fs.readFileSync(filePath, 'utf-8')\n const parsed = parseJson(content, filePath)\n\n const obj = parsed as Record<string, unknown>\n const type = obj.type\n\n if (type === 'form') {\n return { type: 'form', schema: parsed as FormSchema, filePath }\n }\n\n if (type === 'single') {\n return { type: 'single', schema: normalizeLoadedSchema(parsed), filePath }\n }\n\n if (type !== undefined && type !== 'entity') {\n throw new Error(\n `Schema \"${name}\" has unsupported type \"${String(type)}\". Expected \"entity\", \"single\", or \"form\".`\n )\n }\n\n return { type: 'entity', schema: normalizeLoadedSchema(parsed), filePath }\n}\n\n/**\n * List all available schema names in the schemas directory\n */\nexport function listSchemaNames(schemasDir: string): string[] {\n if (!fs.existsSync(schemasDir)) return []\n\n const names = new Set<string>()\n const rootFiles = fs\n .readdirSync(schemasDir)\n .filter((f) => f.endsWith('.json') && f !== 'schema.json')\n .map((f) => f.replace('.json', ''))\n\n for (const name of rootFiles) {\n names.add(name)\n }\n\n const formsDir = path.join(schemasDir, 'forms')\n if (fs.existsSync(formsDir)) {\n for (const name of fs\n .readdirSync(formsDir)\n .filter((f) => f.endsWith('.json'))\n .map((f) => f.replace('.json', ''))) {\n names.add(name)\n }\n }\n\n return Array.from(names).sort()\n}\n\n// ============================================================================\n// Schema Validation\n// ============================================================================\n\nconst RESERVED_AUTHORSHIP_FIELD_NAMES = new Set([\n 'createdBy',\n 'updatedBy',\n 'createdByUser',\n 'updatedByUser'\n])\nconst FORM_COLUMN_TYPES = new Set(['text', 'date', 'email', 'number', 'badge'])\n\nfunction collectReservedAuthorshipFieldErrors(\n schema: Schema,\n schemaKind: 'entity' | 'single',\n errors: string[]\n): void {\n for (const field of flattenFields(schema.fields || [])) {\n if (RESERVED_AUTHORSHIP_FIELD_NAMES.has(field.name)) {\n errors.push(\n `${schemaKind} schema \"${schema.name}\" declares reserved field \"${field.name}\". BetterStart generates \"${field.name}\" as authorship metadata or companion data.`\n )\n }\n }\n}\n\nfunction collectInvalidDefaultValueFromErrors(schema: Schema, errors: string[]): void {\n const flatFields = flattenFields(schema.fields || [])\n const fieldMap = new Map(flatFields.map((field) => [field.name, field]))\n\n for (const field of flatFields) {\n if (field.defaultValueFrom === undefined) continue\n if (typeof field.defaultValueFrom !== 'string' || field.defaultValueFrom.trim().length === 0) {\n errors.push(\n `Field \"${field.name}\" has invalid defaultValueFrom=\"${String(field.defaultValueFrom)}\". Expected the name of another field in the same schema.`\n )\n continue\n }\n\n const sourceField = field.defaultValueFrom.trim()\n if (field.primaryKey || field.name === 'id') {\n errors.push(\n `Field \"${field.name}\" cannot use defaultValueFrom because generated ID and primary key fields are owned by BetterStart.`\n )\n } else if (sourceField === field.name) {\n errors.push(`Field \"${field.name}\" cannot use itself as defaultValueFrom.`)\n } else {\n const source = fieldMap.get(sourceField)\n if (!source) {\n errors.push(\n `Field \"${field.name}\" has defaultValueFrom=\"${sourceField}\", but no field named \"${sourceField}\" exists in schema \"${schema.name}\".`\n )\n } else if (source.primaryKey || sourceField === 'id') {\n errors.push(\n `Field \"${field.name}\" has defaultValueFrom=\"${sourceField}\", but generated ID and primary key fields cannot be used as defaultValueFrom sources.`\n )\n }\n }\n }\n}\n\nfunction collectInvalidSchemaFieldTypeErrors(fields: SchemaField[], errors: string[]): void {\n for (const field of fields) {\n if (field.type !== undefined && (typeof field.type !== 'string' || !isFieldType(field.type))) {\n errors.push(\n `Field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n }\n\n if (field.fields) {\n collectInvalidSchemaFieldTypeErrors(field.fields, errors)\n }\n if (field.items) {\n collectInvalidSchemaFieldTypeErrors([field.items as SchemaField], errors)\n }\n if (field.tabs) {\n for (const tab of field.tabs) {\n collectInvalidSchemaFieldTypeErrors(tab.fields || [], errors)\n collectInvalidSchemaSlotFieldTypeErrors(tab.slot, errors)\n }\n }\n }\n}\n\nfunction collectInvalidSchemaSlotFieldTypeErrors(slot: unknown, errors: string[]): void {\n if (!isSchemaSlotLayout(slot)) return\n collectInvalidSchemaFieldTypeErrors(getSlotAreaFields(slot.main), errors)\n collectInvalidSchemaFieldTypeErrors(getSlotAreaFields(slot.sidebar), errors)\n}\n\nfunction collectInvalidColumnTypeErrors(schema: Schema, errors: string[]): void {\n for (const column of schema.columns || []) {\n if (\n column.type !== undefined &&\n (typeof column.type !== 'string' || !isColumnType(column.type))\n ) {\n errors.push(\n `Column \"${column.accessorKey || 'unnamed'}\" has unsupported type \"${String(column.type)}\".`\n )\n }\n }\n}\n\nfunction collectInvalidFormFieldTypeErrors(fields: FormField[], errors: string[]): void {\n for (const field of fields) {\n if (\n field.type !== undefined &&\n (typeof field.type !== 'string' || !isFormFieldType(field.type))\n ) {\n errors.push(\n `Form field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n }\n\n if (field.fields) {\n collectInvalidFormFieldTypeErrors(field.fields, errors)\n }\n }\n}\n\nfunction collectInvalidFormColumnTypeErrors(schema: FormSchema, errors: string[]): void {\n for (const column of schema.columns || []) {\n if (\n column.type !== undefined &&\n (typeof column.type !== 'string' || !FORM_COLUMN_TYPES.has(column.type))\n ) {\n errors.push(\n `Form column \"${column.accessorKey || 'unnamed'}\" has unsupported type \"${String(column.type)}\".`\n )\n }\n }\n}\n\n/**\n * Validate an entity schema structure\n * Returns an array of error messages (empty = valid)\n */\nexport function validateEntitySchema(schema: Schema): string[] {\n const errors: string[] = []\n collectSchemaSlotLayoutErrors(schema, errors)\n const normalizedSchema = normalizeSchemaSlotLayout(schema)\n\n if (!normalizedSchema.name || typeof normalizedSchema.name !== 'string') {\n errors.push('Schema must have a valid \"name\" field')\n }\n if (!normalizedSchema.label || typeof normalizedSchema.label !== 'string') {\n errors.push('Schema must have a valid \"label\" field')\n }\n if (!normalizedSchema.description || typeof normalizedSchema.description !== 'string') {\n errors.push('Schema must have a valid \"description\" field')\n }\n if (!normalizedSchema.icon || typeof normalizedSchema.icon !== 'string') {\n errors.push('Schema must have a valid \"icon\" field')\n }\n if (!Array.isArray(normalizedSchema.fields) || normalizedSchema.fields.length === 0) {\n errors.push('Schema must have at least one field via \"fields\" or \"slot\"')\n }\n if (!Array.isArray(normalizedSchema.columns) || normalizedSchema.columns.length === 0) {\n errors.push('Schema must have at least one column')\n }\n\n // Validate fields\n for (const field of normalizedSchema.fields || []) {\n if (field.type === 'separator') continue\n if (!field.name || !field.type) {\n errors.push(`Field is missing required properties: ${JSON.stringify(field)}`)\n }\n }\n\n collectInvalidSchemaFieldTypeErrors(normalizedSchema.fields || [], errors)\n collectInvalidSlotErrors(normalizedSchema.fields || [], '', errors)\n collectInvalidHeightErrors(normalizedSchema.fields || [], '', errors)\n collectInvalidDefaultValueFromErrors(normalizedSchema, errors)\n collectReservedAuthorshipFieldErrors(normalizedSchema, 'entity', errors)\n collectInvalidColumnTypeErrors(normalizedSchema, errors)\n\n // Validate columns reference real fields\n const flatFields = flattenFields(normalizedSchema.fields || [])\n const fieldNames = new Set(flatFields.map((f) => f.name))\n // Auto fields are always available\n for (const auto of [\n 'id',\n 'createdAt',\n 'updatedAt',\n 'published',\n 'submittedAt',\n 'ipAddress',\n 'userAgent',\n 'createdBy',\n 'updatedBy'\n ]) {\n fieldNames.add(auto)\n }\n\n for (const column of normalizedSchema.columns || []) {\n if (!column.accessorKey || !column.header || !column.type) {\n errors.push(`Column is missing required properties: ${JSON.stringify(column)}`)\n } else if (!fieldNames.has(column.accessorKey)) {\n errors.push(\n `Column accessorKey \"${column.accessorKey}\" does not match any field. Available: ${Array.from(fieldNames).join(', ')}`\n )\n }\n }\n\n return errors\n}\n\n/**\n * Validate a single schema structure\n * Like entity validation but skips columns requirement (no list view)\n */\nexport function validateSingleSchema(schema: Schema): string[] {\n const errors: string[] = []\n collectSchemaSlotLayoutErrors(schema, errors)\n const normalizedSchema = normalizeSchemaSlotLayout(schema)\n\n if (!normalizedSchema.name || typeof normalizedSchema.name !== 'string') {\n errors.push('Schema must have a valid \"name\" field')\n }\n if (!normalizedSchema.label || typeof normalizedSchema.label !== 'string') {\n errors.push('Schema must have a valid \"label\" field')\n }\n if (!normalizedSchema.description || typeof normalizedSchema.description !== 'string') {\n errors.push('Schema must have a valid \"description\" field')\n }\n if (!normalizedSchema.icon || typeof normalizedSchema.icon !== 'string') {\n errors.push('Schema must have a valid \"icon\" field')\n }\n if (!Array.isArray(normalizedSchema.fields) || normalizedSchema.fields.length === 0) {\n errors.push('Schema must have at least one field via \"fields\" or \"slot\"')\n }\n\n // Validate fields\n for (const field of normalizedSchema.fields || []) {\n if (field.type === 'separator') continue\n if (!field.name || !field.type) {\n errors.push(`Field is missing required properties: ${JSON.stringify(field)}`)\n }\n }\n\n collectInvalidSchemaFieldTypeErrors(normalizedSchema.fields || [], errors)\n collectInvalidSlotErrors(normalizedSchema.fields || [], '', errors)\n collectInvalidHeightErrors(normalizedSchema.fields || [], '', errors)\n collectInvalidDefaultValueFromErrors(normalizedSchema, errors)\n collectReservedAuthorshipFieldErrors(normalizedSchema, 'single', errors)\n\n // No columns validation — single schemas have no list view\n\n return errors\n}\n\n/**\n * Validate a form schema structure\n */\nexport function validateFormSchema(schema: FormSchema): string[] {\n const errors: string[] = []\n\n if (schema.type !== 'form') {\n errors.push('Form schema must have `type: \"form\"`')\n }\n if (!schema.name || typeof schema.name !== 'string') {\n errors.push('Form schema must have a valid \"name\" field')\n }\n if (!schema.label || typeof schema.label !== 'string') {\n errors.push('Form schema must have a valid \"label\" field')\n }\n if (!schema.description || typeof schema.description !== 'string') {\n errors.push('Form schema must have a valid \"description\" field')\n }\n if (!schema.icon || typeof schema.icon !== 'string') {\n errors.push('Form schema must have a valid \"icon\" field')\n }\n\n const hasFields = Array.isArray(schema.fields) && schema.fields.length > 0\n const hasSteps = Array.isArray(schema.steps) && schema.steps.length > 0\n\n if (!hasFields && !hasSteps) {\n errors.push('Form schema must have either \"fields\" or \"steps\"')\n }\n if (hasFields && hasSteps) {\n errors.push('Form schema cannot have both \"fields\" and \"steps\"')\n }\n\n if (hasSteps) {\n for (const step of schema.steps!) {\n if (!step.name || !step.label) {\n errors.push(`Form step is missing name or label: ${JSON.stringify(step)}`)\n }\n if (!Array.isArray(step.fields) || step.fields.length === 0) {\n errors.push(`Form step \"${step.name}\" must have at least one field`)\n } else {\n collectInvalidFormFieldTypeErrors(step.fields, errors)\n collectInvalidSlotErrors(step.fields, `steps.${step.name}`, errors)\n collectInvalidHeightErrors(step.fields, `steps.${step.name}`, errors)\n }\n }\n } else if (hasFields) {\n collectInvalidFormFieldTypeErrors(schema.fields || [], errors)\n collectInvalidSlotErrors(schema.fields || [], '', errors)\n collectInvalidHeightErrors(schema.fields || [], '', errors)\n }\n collectInvalidFormColumnTypeErrors(schema, errors)\n\n return errors\n}\n\n/**\n * Validate a loaded schema (auto-detects type)\n */\nexport function validateLoadedSchema(loaded: LoadedSchema): string[] {\n if (loaded.type === 'entity') {\n return validateEntitySchema(loaded.schema)\n }\n if (loaded.type === 'single') {\n return validateSingleSchema(loaded.schema)\n }\n return validateFormSchema(loaded.schema)\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nexport class SchemaNotFoundError extends Error {\n constructor(name: string, schemasDir: string) {\n super(\n `Schema \"${name}\" not found. Looked in:\\n - ${path.join(schemasDir, `${name}.json`)}\\n - ${path.join(schemasDir, 'forms', `${name}.json`)}`\n )\n this.name = 'SchemaNotFoundError'\n }\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\nfunction parseJson(content: string, filePath: string): unknown {\n try {\n return JSON.parse(content)\n } catch {\n throw new Error(`Failed to parse JSON schema: ${filePath}`)\n }\n}\n\nfunction normalizeLoadedSchema(parsed: unknown): Schema {\n const schema = parsed as Schema\n const slotLayoutErrors: string[] = []\n collectSchemaSlotLayoutErrors(schema, slotLayoutErrors)\n\n if (slotLayoutErrors.length > 0) {\n throw new Error(slotLayoutErrors.join('; '))\n }\n\n return normalizeSchemaSlotLayout(schema)\n}\n\ntype SchemaWithSlotLayout = Omit<Schema, 'fields' | 'slot'> & {\n fields?: SchemaField[]\n slot?: unknown\n}\n\ntype SchemaTabWithSlotLayout = {\n name: string\n label: string\n fields?: SchemaField[]\n slot?: unknown\n}\n\nexport function normalizeSchemaSlotLayout(schema: Schema): Schema {\n const input = schema as SchemaWithSlotLayout\n const { slot: _slot, ...rest } = input\n\n return {\n ...rest,\n fields: normalizeSchemaFields(input)\n } as Schema\n}\n\nfunction normalizeSchemaFields(input: SchemaWithSlotLayout): SchemaField[] {\n if (isSchemaSlotLayout(input.slot)) return normalizeSlotLayoutFields(input.slot)\n return normalizeFields(input.fields ?? [])\n}\n\nfunction normalizeSlotLayoutFields(slot: SchemaSlotLayout): SchemaField[] {\n return [\n ...normalizeFields(getSlotAreaFields(slot.main)),\n ...normalizeFields(getSlotAreaFields(slot.sidebar), 'sidebar')\n ]\n}\n\nfunction normalizeFields(fields: SchemaField[], inheritedSlot?: 'sidebar'): SchemaField[] {\n return fields.map((field) => {\n const tabs = field.tabs?.map(normalizeTabSlotLayout)\n const normalizedField = tabs ? { ...field, tabs } : { ...field }\n if (inheritedSlot) return { ...normalizedField, slot: inheritedSlot }\n return normalizedField\n })\n}\n\nfunction normalizeTabSlotLayout(\n tab: SchemaTabWithSlotLayout\n): NonNullable<SchemaField['tabs']>[number] {\n const { slot: _slot, ...rest } = tab\n\n if (isSchemaSlotLayout(tab.slot)) {\n return {\n ...rest,\n fields: normalizeSlotLayoutFields(tab.slot)\n }\n }\n\n return {\n ...rest,\n fields: normalizeFields(tab.fields ?? [])\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isSchemaSlotLayout(value: unknown): value is SchemaSlotLayout {\n return isRecord(value)\n}\n\nfunction isSlotArea(value: unknown): value is { fields: SchemaField[] } {\n return isRecord(value) && Array.isArray(value.fields)\n}\n\nfunction getSlotAreaFields(value: unknown): SchemaField[] {\n return isSlotArea(value) ? value.fields : []\n}\n\ntype SlotAwareField = {\n name?: string\n slot?: unknown\n height?: unknown\n fields?: SlotAwareField[]\n tabs?: Array<{ name?: string; fields?: SlotAwareField[]; slot?: unknown }>\n}\n\nfunction collectSchemaSlotLayoutErrors(schema: Schema, errors: string[]): void {\n const input = schema as SchemaWithSlotLayout\n const hasFields = input.fields !== undefined\n const hasSlot = input.slot !== undefined\n\n if (!hasSlot) return\n\n if (hasFields) {\n errors.push('Schema cannot define both top-level \"fields\" and \"slot\". Use one layout source.')\n }\n\n collectSlotLayoutErrors(input.slot, 'slot', errors)\n}\n\nfunction collectSlotLayoutErrors(value: unknown, path: string, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push(`${path} must be an object with \"main\" and/or \"sidebar\" field groups.`)\n return\n }\n\n const validKeys = new Set(['main', 'sidebar'])\n for (const key of Object.keys(value)) {\n if (!validKeys.has(key)) {\n errors.push(`${path} has unsupported key \"${key}\". Expected \"main\" or \"sidebar\".`)\n }\n }\n\n const areas = [\n ['main', value.main],\n ['sidebar', value.sidebar]\n ] as const\n let hasArea = false\n\n for (const [name, area] of areas) {\n if (area === undefined) continue\n hasArea = true\n collectSlotAreaErrors(area, `${path}.${name}`, errors)\n }\n\n if (!hasArea) {\n errors.push(`${path} must define at least one of \"main\" or \"sidebar\".`)\n }\n}\n\nfunction collectSlotAreaErrors(value: unknown, path: string, errors: string[]): void {\n if (!isRecord(value)) {\n errors.push(`${path} must be an object with a \"fields\" array.`)\n return\n }\n\n const fields = value.fields\n if (!Array.isArray(fields)) {\n errors.push(`${path}.fields must be an array.`)\n return\n }\n\n for (const field of fields as SlotAwareField[]) {\n walkSlot(field, `${path}.fields.${field.name ?? 'unnamed'}`, errors)\n }\n}\n\nfunction collectInvalidHeightErrors(\n topLevelFields: SlotAwareField[],\n rootPath: string,\n errors: string[]\n): void {\n const prefix = rootPath ? `${rootPath}.` : ''\n for (const field of topLevelFields) {\n walkHeight(field, `${prefix}${field.name ?? 'unnamed'}`, errors)\n }\n}\n\nfunction walkHeight(field: SlotAwareField, fieldPath: string, errors: string[]): void {\n if (field.height !== undefined && field.height !== 'auto' && field.height !== 'fill') {\n errors.push(\n `Field \"${fieldPath}\" has invalid height=\"${String(field.height)}\". Expected \"auto\" or \"fill\".`\n )\n }\n if (field.fields) {\n for (const child of field.fields) {\n walkHeight(child, `${fieldPath}.${child.name ?? 'unnamed'}`, errors)\n }\n }\n if (field.tabs) {\n for (const tab of field.tabs) {\n if (tab.fields) {\n for (const child of tab.fields) {\n walkHeight(child, `${fieldPath}.${tab.name}.${child.name ?? 'unnamed'}`, errors)\n }\n }\n }\n }\n}\n\nfunction collectInvalidSlotErrors(\n fields: SlotAwareField[],\n rootPath: string,\n errors: string[]\n): void {\n const prefix = rootPath ? `${rootPath}.` : ''\n for (const field of fields) {\n walkSlot(field, `${prefix}${field.name ?? 'unnamed'}`, errors)\n }\n}\n\nfunction walkSlot(field: SlotAwareField, fieldPath: string, errors: string[]): void {\n if (field.slot !== undefined && field.slot !== 'main' && field.slot !== 'sidebar') {\n errors.push(\n `Field \"${fieldPath}\" has invalid slot=\"${String(field.slot)}\". Expected \"main\" or \"sidebar\".`\n )\n }\n if (field.fields) {\n for (const child of field.fields) {\n walkSlot(child, `${fieldPath}.${child.name ?? 'unnamed'}`, errors)\n }\n }\n if (field.tabs) {\n for (const tab of field.tabs) {\n const tabPath = `${fieldPath}.${tab.name ?? 'unnamed'}`\n if (tab.fields && tab.slot !== undefined) {\n errors.push(`Tab \"${tabPath}\" cannot define both \"fields\" and \"slot\".`)\n }\n if (tab.slot !== undefined) {\n collectSlotLayoutErrors(tab.slot, `${tabPath}.slot`, errors)\n }\n if (tab.fields) {\n for (const child of tab.fields) {\n walkSlot(child, `${tabPath}.${child.name ?? 'unnamed'}`, errors)\n }\n }\n }\n }\n}\n","/**\n * Centralized constants for the codegen system\n * Replaces magic strings scattered throughout generators\n */\n\n// ============================================================================\n// Field Types\n// ============================================================================\n\nexport const FIELD_TYPES = {\n STRING: 'string',\n NUMBER: 'number',\n BOOLEAN: 'boolean',\n TEXT: 'text',\n DECIMAL: 'decimal',\n VARCHAR: 'varchar',\n UUID: 'uuid',\n SERIAL: 'serial',\n DATE: 'date',\n TIMESTAMP: 'timestamp',\n TIME: 'time',\n MARKDOWN: 'markdown',\n RICHTEXT: 'richtext',\n IMAGE: 'image',\n VIDEO: 'video',\n MEDIA: 'media',\n ICON: 'icon',\n GROUP: 'group',\n TABS: 'tabs',\n LIST: 'list',\n SEPARATOR: 'separator',\n SECTION: 'section',\n SELECT: 'select',\n RELATIONSHIP: 'relationship',\n GALLERY: 'gallery'\n} as const\n\nexport const LAYOUT_FIELD_TYPES = [FIELD_TYPES.SEPARATOR] as const\n\nexport const NESTED_FIELD_TYPES = [FIELD_TYPES.GROUP, FIELD_TYPES.TABS, FIELD_TYPES.LIST] as const\n\nexport const RICH_TEXT_FIELD_TYPES = [\n FIELD_TYPES.MARKDOWN,\n FIELD_TYPES.RICHTEXT,\n FIELD_TYPES.TEXT\n] as const\n\nexport const LONG_TEXT_FIELD_TYPES = [\n FIELD_TYPES.TEXT,\n FIELD_TYPES.MARKDOWN,\n FIELD_TYPES.RICHTEXT,\n FIELD_TYPES.LIST,\n FIELD_TYPES.MEDIA,\n FIELD_TYPES.VIDEO,\n FIELD_TYPES.GALLERY\n] as const\n\n// ============================================================================\n// Column Types\n// ============================================================================\n\nexport const COLUMN_TYPES = {\n TEXT: 'text',\n BADGE: 'badge',\n DATE: 'date',\n CUSTOM: 'custom',\n AVATAR: 'avatar',\n LINK: 'link',\n IMAGE: 'image',\n EMAIL: 'email',\n NUMBER: 'number',\n BOOLEAN: 'boolean'\n} as const\n\n// ============================================================================\n// Form Field Types\n// ============================================================================\n\nexport const FORM_FIELD_TYPES = {\n TEXT: 'text',\n TEXTAREA: 'textarea',\n EMAIL: 'email',\n PHONE: 'phone',\n NUMBER: 'number',\n URL: 'url',\n DATE: 'date',\n SELECT: 'select',\n RADIO: 'radio',\n CHECKBOX: 'checkbox',\n MULTISELECT: 'multiselect',\n FILE: 'file',\n UPLOAD: 'upload',\n GROUP: 'group',\n TIMEZONE: 'timezone',\n LIST: 'list',\n DYNAMIC_FIELDS: 'dynamicFields'\n} as const\n\n// ============================================================================\n// Auto-generated Fields\n// ============================================================================\n\nexport const AUTO_FIELDS = {\n ID: 'id',\n CREATED_AT: 'createdAt',\n UPDATED_AT: 'updatedAt',\n PUBLISHED: 'published',\n SLUG: 'slug'\n} as const\n\nexport const FORM_SUBMISSION_FIELDS = {\n SUBMITTED_AT: 'submittedAt',\n IP_ADDRESS: 'ipAddress',\n USER_AGENT: 'userAgent'\n} as const\n\n// ============================================================================\n// Database Constants\n// ============================================================================\n\nexport const DRIZZLE_DEFAULTS = {\n VARCHAR_LENGTH: 255,\n DECIMAL_PRECISION: 10,\n DECIMAL_SCALE: 2\n} as const\n\n// ============================================================================\n// Generator Names\n// ============================================================================\n\nexport const CORE_GENERATORS = [\n 'database',\n 'actions',\n 'hooks',\n 'columns',\n 'table',\n 'page',\n 'page-content',\n 'form',\n 'create-page',\n 'edit-page',\n 'navigation'\n] as const\n\n// ============================================================================\n// File Extensions\n// ============================================================================\n\nexport const FILE_EXTENSIONS = {\n TYPESCRIPT: '.ts',\n TSX: '.tsx',\n JSON: '.json',\n SQL: '.sql'\n} as const\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport type FieldTypeValue = (typeof FIELD_TYPES)[keyof typeof FIELD_TYPES]\nexport type ColumnTypeValue = (typeof COLUMN_TYPES)[keyof typeof COLUMN_TYPES]\nexport type FormFieldTypeValue = (typeof FORM_FIELD_TYPES)[keyof typeof FORM_FIELD_TYPES]\n\nexport function isFieldType(value: string): value is FieldTypeValue {\n return Object.values(FIELD_TYPES).includes(value as FieldTypeValue)\n}\n\nexport function isColumnType(value: string): value is ColumnTypeValue {\n return Object.values(COLUMN_TYPES).includes(value as ColumnTypeValue)\n}\n\nexport function isFormFieldType(value: string): value is FormFieldTypeValue {\n return Object.values(FORM_FIELD_TYPES).includes(value as FormFieldTypeValue)\n}\n\nexport function isLayoutField(type: string): boolean {\n return (LAYOUT_FIELD_TYPES as readonly string[]).includes(type)\n}\n\nexport function isNestedFieldType(type: string): boolean {\n return (NESTED_FIELD_TYPES as readonly string[]).includes(type)\n}\n\nexport function isLongTextFieldType(type: string): boolean {\n return (LONG_TEXT_FIELD_TYPES as readonly string[]).includes(type)\n}\n","/**\n * Field tree walking and type checking utilities\n */\n\nimport type { SchemaField } from '@core-engine/schema/types.js'\n\n// ============================================================================\n// Field Tree Walking\n// ============================================================================\n\nexport interface WalkFieldsOptions {\n includeLists?: boolean\n includeGroups?: boolean\n includeTabs?: boolean\n}\n\nconst DEFAULT_WALK_OPTIONS: WalkFieldsOptions = {\n includeLists: true,\n includeGroups: true,\n includeTabs: true\n}\n\n/**\n * Walk through all fields in a schema, including nested ones\n */\nexport function walkFields(\n fields: SchemaField[],\n callback: (field: SchemaField, depth: number, parent?: SchemaField) => void,\n options: WalkFieldsOptions = DEFAULT_WALK_OPTIONS\n): void {\n function walk(fieldsToWalk: SchemaField[], depth: number, parent?: SchemaField): void {\n for (const field of fieldsToWalk) {\n callback(field, depth, parent)\n\n if (\n options.includeGroups &&\n (field.type === 'group' || field.type === 'section') &&\n field.fields\n ) {\n walk(field.fields, depth + 1, field)\n }\n if (options.includeLists && field.type === 'list' && field.fields) {\n walk(field.fields, depth + 1, field)\n }\n if (options.includeTabs && field.type === 'tabs' && field.tabs) {\n for (const tab of field.tabs) {\n if (tab.fields) {\n walk(tab.fields, depth + 1, field)\n }\n }\n }\n }\n }\n\n walk(fields, 0)\n}\n\n// ============================================================================\n// Field Type Checking\n// ============================================================================\n\n/**\n * Check if any field in the tree matches a specific type\n */\nexport function hasFieldType(\n fields: SchemaField[],\n type: string,\n options?: WalkFieldsOptions\n): boolean {\n let found = false\n walkFields(\n fields,\n (field) => {\n if (field.type === type) found = true\n },\n options\n )\n return found\n}\n\n/**\n * Check if any field in the tree matches any of the given types\n */\nexport function hasAnyFieldType(\n fields: SchemaField[],\n types: string[],\n options?: WalkFieldsOptions\n): boolean {\n let found = false\n walkFields(\n fields,\n (field) => {\n if (types.includes(field.type)) found = true\n },\n options\n )\n return found\n}\n\n/**\n * Check if any field uses icons (either icon type or hasIcon property)\n */\nexport function hasIconUsage(fields: SchemaField[], options?: WalkFieldsOptions): boolean {\n let found = false\n walkFields(\n fields,\n (field) => {\n if (field.type === 'icon' || field.hasIcon) found = true\n },\n options\n )\n return found\n}\n\nexport function hasRelationshipField(fields: SchemaField[], options?: WalkFieldsOptions): boolean {\n return hasFieldType(fields, 'relationship', options)\n}\n\nexport function hasMarkdownField(fields: SchemaField[], options?: WalkFieldsOptions): boolean {\n return hasFieldType(fields, 'markdown', options)\n}\n\nexport function hasTextareaField(fields: SchemaField[], options?: WalkFieldsOptions): boolean {\n return hasFieldType(fields, 'text', options)\n}\n\n/**\n * Collect all fields of a specific type\n */\nexport function collectFieldsByType(\n fields: SchemaField[],\n type: string,\n options?: WalkFieldsOptions\n): SchemaField[] {\n const result: SchemaField[] = []\n walkFields(\n fields,\n (field) => {\n if (field.type === type) result.push(field)\n },\n options\n )\n return result\n}\n","/**\n * Field flattening and collection utilities\n */\n\nimport { collectFieldsByType } from '@core-engine/schema/field-helpers/walking.js'\nimport type { SchemaField } from '@core-engine/schema/types.js'\n\n// ============================================================================\n// Field Flattening\n// ============================================================================\n\nconst AUTO_ID_FIELD: SchemaField = {\n name: 'id',\n type: 'uuid',\n primaryKey: true\n}\n\n/**\n * Ensure fields have an ID field - automatically injects one if not present\n */\nexport function ensureIdField(fields: SchemaField[]): SchemaField[] {\n const hasId = fields.some((f) => f.primaryKey || f.name === 'id')\n return hasId ? fields : [AUTO_ID_FIELD, ...fields]\n}\n\n/**\n * Flatten group and tabs fields into individual fields for database operations\n * Automatically ensures an ID field exists\n */\nexport function flattenFields(fields: SchemaField[]): SchemaField[] {\n return flattenFieldsWithoutIdCheck(ensureIdField(fields))\n}\n\nfunction flattenFieldsWithoutIdCheck(fields: SchemaField[]): SchemaField[] {\n const flattened: SchemaField[] = []\n\n for (const field of fields) {\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n flattened.push(...flattenFieldsWithoutIdCheck(field.fields))\n } else if (field.type === 'tabs' && field.tabs) {\n for (const tab of field.tabs) {\n if (tab.fields) {\n flattened.push(...flattenFieldsWithoutIdCheck(tab.fields))\n }\n }\n } else {\n flattened.push(field)\n }\n }\n\n return flattened\n}\n\n// ============================================================================\n// Field Collection\n// ============================================================================\n\n/**\n * Get all many-to-many relationship fields\n */\nexport function getManyToManyFields(fields: SchemaField[]): SchemaField[] {\n const flat = flattenFields(fields)\n return flat.filter((f) => f.type === 'relationship' && f.multiple === true && f.relationship)\n}\n\n/**\n * Get all single relationship fields (excluding many-to-many)\n */\nexport function getNestedRelationshipFields(fields: SchemaField[]): SchemaField[] {\n const result: SchemaField[] = []\n\n function collect(fieldsToCheck: SchemaField[]): void {\n for (const f of fieldsToCheck) {\n if (f.type === 'relationship' && f.relationship && !f.multiple) {\n result.push(f)\n }\n if (f.type === 'group' && f.fields) collect(f.fields)\n if (f.type === 'list' && f.fields) collect(f.fields)\n if (f.type === 'tabs' && f.tabs) {\n for (const tab of f.tabs) {\n if (tab.fields) collect(tab.fields)\n }\n }\n }\n }\n\n collect(fields)\n return result\n}\n\n/**\n * Collect relationship fields from top-level and groups only (not lists)\n */\nexport function collectRelationshipFieldsTopLevel(fields: SchemaField[]): SchemaField[] {\n const result: SchemaField[] = []\n\n function collect(fieldsToCheck: SchemaField[]): void {\n for (const f of fieldsToCheck) {\n if (f.type === 'relationship' && f.relationship) {\n result.push(f)\n }\n if (f.type === 'group' && f.fields) {\n collect(f.fields)\n }\n }\n }\n\n collect(fields)\n return result\n}\n\n/**\n * Collect ALL relationship fields including those in lists\n */\nexport function collectAllRelationshipFields(fields: SchemaField[]): SchemaField[] {\n return collectFieldsByType(fields, 'relationship')\n}\n\n/**\n * Get list fields that have nested fields (not just items)\n */\nexport function getListFieldsWithNestedFields(fields: SchemaField[]): SchemaField[] {\n const result: SchemaField[] = []\n\n function collect(fieldsToCheck: SchemaField[]): void {\n for (const f of fieldsToCheck) {\n if (f.type === 'list' && f.fields && f.fields.length > 0) {\n result.push(f)\n }\n if (f.type === 'group' && f.fields) {\n collect(f.fields)\n }\n }\n }\n\n collect(fields)\n return result\n}\n\n/**\n * Get nested list fields (list fields inside list fields)\n */\nexport function getNestedListFields(\n fields: SchemaField[]\n): { parent: SchemaField; nested: SchemaField }[] {\n const result: { parent: SchemaField; nested: SchemaField }[] = []\n\n const listFields = getListFieldsWithNestedFields(fields)\n for (const parent of listFields) {\n if (parent.fields) {\n for (const nested of parent.fields) {\n if (nested.type === 'list' && nested.fields && nested.fields.length > 0) {\n result.push({ parent, nested })\n }\n }\n }\n }\n\n return result\n}\n","/**\n * Form schema field helpers (for FormSchema type)\n */\n\nimport type { FormField, FormSchema, FormStep } from '@core-engine/schema/types.js'\n\n/**\n * Get all fields from a form schema (including from steps), flattening groups\n */\nexport function getAllFormFields(schema: FormSchema): FormField[] {\n const allFields: FormField[] = []\n\n const sources = schema.steps ? schema.steps.flatMap((step) => step.fields) : schema.fields || []\n\n for (const field of sources) {\n if (field.type === 'group' && field.fields) {\n for (const nestedField of field.fields) {\n allFields.push({\n ...nestedField,\n condition: nestedField.condition || field.condition\n })\n }\n } else {\n allFields.push(field)\n }\n }\n\n return allFields\n}\n\n/**\n * Check if a form schema is multi-step\n */\nexport function isMultiStepForm(schema: FormSchema): boolean {\n return Array.isArray(schema.steps) && schema.steps.length > 0\n}\n\n/**\n * Get all concrete fields from a form schema, flattening groups and skipping dynamicFields.\n * Works with both flat schemas (schema.fields) and multi-step schemas (schema.steps).\n */\nexport function getAllFormSchemaFields(schema: FormSchema): FormField[] {\n const flatten = (fields: FormField[]): FormField[] => {\n return fields.flatMap((field) => {\n if (field.type === 'dynamicFields') return []\n if (field.type === 'group' && field.fields) return flatten(field.fields)\n return field.type === 'group' ? [] : [field]\n })\n }\n if (schema.fields) return flatten(schema.fields)\n if (schema.steps) return schema.steps.flatMap((step) => flatten(step.fields))\n return []\n}\n\n/**\n * Get flat array of field names for a form step (for RHF trigger validation).\n * Groups are flattened to child names, list fields use parent name,\n * hidden and dynamicFields are excluded, showWhen fields are included.\n */\nexport function getStepFieldNames(step: FormStep): string[] {\n const names: string[] = []\n const collect = (fields: FormField[]): void => {\n for (const field of fields) {\n if (field.hidden) continue\n if (field.type === 'dynamicFields') continue\n if (field.type === 'group' && field.fields) {\n collect(field.fields)\n } else if (field.name) {\n names.push(field.name)\n }\n }\n }\n collect(step.fields)\n return names\n}\n\n/**\n * Check if a form schema contains dynamicFields\n */\nexport function hasDynamicFields(schema: FormSchema): boolean {\n const check = (fields: FormField[]): boolean => {\n for (const f of fields) {\n if (f.type === 'dynamicFields') return true\n if (f.type === 'group' && f.fields && check(f.fields)) return true\n }\n return false\n }\n if (schema.fields && check(schema.fields)) return true\n if (schema.steps) {\n for (const step of schema.steps) {\n if (check(step.fields)) return true\n }\n }\n return false\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface EnvVar {\n key: string\n value: string\n comment?: string\n}\n\nexport interface EnvSection {\n header: string\n vars: EnvVar[]\n}\n\nexport function readEnvVar(cwd: string, key: string): string | undefined {\n const envPath = path.join(cwd, '.env.local')\n if (!fs.existsSync(envPath)) {\n return undefined\n }\n\n const content = fs.readFileSync(envPath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#') || !trimmed.includes('=')) {\n continue\n }\n\n const [lineKey, ...rest] = trimmed.split('=')\n if (lineKey?.trim() !== key) {\n continue\n }\n\n return rest\n .join('=')\n .replace(/^['\"]|['\"]$/g, '')\n .trim()\n }\n\n return undefined\n}\n\n/**\n * Safely append environment variables to .env.local.\n * Never overwrites existing values — only adds missing keys.\n * Keys listed in `overwrite` will be updated even if they already exist.\n */\nexport function appendEnvVars(\n cwd: string,\n sections: EnvSection[],\n overwrite?: Set<string>\n): { added: string[]; skipped: string[]; updated: string[] } {\n const envPath = path.join(cwd, '.env.local')\n let existing = fs.existsSync(envPath) ? fs.readFileSync(envPath, 'utf-8') : ''\n\n const existingKeys = new Set(\n existing\n .split('\\n')\n .filter((line) => line.trim() && !line.trim().startsWith('#'))\n .map((line) => line.split('=')[0]?.trim())\n .filter(Boolean)\n )\n\n const added: string[] = []\n const skipped: string[] = []\n const updated: string[] = []\n const lines: string[] = []\n\n // In-place update for overwrite keys that already exist\n if (overwrite) {\n for (const section of sections) {\n for (const v of section.vars) {\n if (overwrite.has(v.key) && existingKeys.has(v.key)) {\n const pattern = new RegExp(`^${v.key}=.*$`, 'm')\n const replacement = v.comment\n ? `${v.key}=\"${v.value}\" # ${v.comment}`\n : `${v.key}=\"${v.value}\"`\n existing = existing.replace(pattern, replacement)\n updated.push(v.key)\n }\n }\n }\n }\n\n if (existing.trim()) {\n lines.push('')\n }\n\n for (const section of sections) {\n const sectionVars = section.vars.filter((v) => {\n if (existingKeys.has(v.key)) {\n if (!updated.includes(v.key)) skipped.push(v.key)\n return false\n }\n added.push(v.key)\n return true\n })\n\n if (sectionVars.length === 0) continue\n\n lines.push(`# ${section.header}`)\n for (const v of sectionVars) {\n const line = v.comment ? `${v.key}=\"${v.value}\" # ${v.comment}` : `${v.key}=\"${v.value}\"`\n lines.push(line)\n }\n lines.push('')\n }\n\n if (added.length > 0 || updated.length > 0) {\n const header = existing.trim()\n ? ''\n : '# ============================================\\n# BetterStart Admin\\n# ============================================\\n'\n const content = existing.trim()\n ? `${existing.trimEnd()}\\n${lines.join('\\n')}`\n : header + lines.join('\\n')\n fs.writeFileSync(envPath, content)\n }\n\n return { added, skipped, updated }\n}\n\nexport function removeEnvVars(cwd: string, keys: string[]): string[] {\n const envPath = path.join(cwd, '.env.local')\n if (!fs.existsSync(envPath) || keys.length === 0) {\n return []\n }\n\n const keySet = new Set(keys)\n const removed: string[] = []\n const filteredLines = fs\n .readFileSync(envPath, 'utf-8')\n .split('\\n')\n .filter((line) => {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#') || !trimmed.includes('=')) {\n return true\n }\n\n const [key] = trimmed.split('=')\n const normalizedKey = key?.trim()\n if (normalizedKey && keySet.has(normalizedKey)) {\n removed.push(normalizedKey)\n return false\n }\n\n return true\n })\n\n fs.writeFileSync(envPath, `${filteredLines.join('\\n').trimEnd()}\\n`, 'utf-8')\n return removed\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { stringifyProjectJson } from '@core-engine/utils/json-format.js'\nimport type { InstalledIntegrationManifest } from '@integration-engine/types.js'\n\nfunction integrationsDir(cwd: string): string {\n return path.join(cwd, '.betterstart', 'integrations')\n}\n\nexport function integrationManifestPath(cwd: string, integrationId: string): string {\n return path.join(integrationsDir(cwd), integrationId, 'manifest.json')\n}\n\nexport function loadInstalledIntegrationManifest(\n cwd: string,\n integrationId: string\n): InstalledIntegrationManifest | null {\n const filePath = integrationManifestPath(cwd, integrationId)\n if (!fs.existsSync(filePath)) return null\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as InstalledIntegrationManifest\n}\n\nexport function saveInstalledIntegrationManifest(\n cwd: string,\n manifest: InstalledIntegrationManifest\n): void {\n const filePath = integrationManifestPath(cwd, manifest.id)\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, stringifyProjectJson(manifest), 'utf-8')\n}\n\nexport function deleteInstalledIntegrationManifest(cwd: string, integrationId: string): void {\n fs.rmSync(path.dirname(integrationManifestPath(cwd, integrationId)), {\n recursive: true,\n force: true\n })\n}\n","import path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\n\nfunction trimDotSlash(value: string): string {\n return value.replace(/^[.][/\\\\]/, '')\n}\n\nexport interface BetterstartProjectPaths {\n adminDir: string\n pagesDir: string\n schemasDir: string\n adminDbDir: string\n adminDbCoreDir: string\n adminDbCoreFile: string\n adminDbSchemaFile: string\n adminUtilsAppDir: string\n adminTypesDir: string\n adminDataFile: string\n adminDataNavigationFile: string\n adminTypesNavigationFile: string\n adminNavigationFile: string\n adminNavigationDir: string\n adminActionsDir: string\n adminEmailTemplatesDir: string\n adminHooksDir: string\n}\n\nexport function resolveExtensionNamespace(schemaName: string, outputNamespace?: string): string {\n return outputNamespace ?? (schemaName === 'settings' ? 'core' : schemaName)\n}\n\nexport function resolveSchemaActionDir(\n actionsDir: string,\n schemaName: string,\n outputNamespace?: string\n): string {\n const namespace = resolveExtensionNamespace(schemaName, outputNamespace)\n if (namespace === 'core') {\n return path.posix.join(actionsDir, schemaName)\n }\n\n return namespace === schemaName\n ? path.posix.join(actionsDir, schemaName)\n : path.posix.join(actionsDir, namespace, schemaName)\n}\n\nexport function resolveSchemaActionImportPath(\n schemaName: string,\n outputNamespace?: string\n): string {\n const namespace = resolveExtensionNamespace(schemaName, outputNamespace)\n if (namespace === 'core') {\n return schemaName\n }\n\n return namespace === schemaName ? schemaName : `${namespace}/${schemaName}`\n}\n\nexport function resolveProjectPaths(config: ResolvedBetterstartConfig): BetterstartProjectPaths {\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const adminDir = trimDotSlash(config.paths?.admin ?? './admin')\n const pagesDir = trimDotSlash(config.paths?.pages ?? './src/app/(admin)/admin/(authenticated)')\n const schemasDir = trimDotSlash(config.paths?.schemas ?? './admin/schemas')\n const adminDbDir = path.posix.join(adminDir, 'lib', 'db')\n const adminDbCoreDir = path.posix.join(adminDbDir, 'core')\n const adminUtilsAppDir = path.posix.join(adminDir, 'utils', 'app')\n const adminTypesDir = path.posix.join(adminDir, 'types')\n const adminNavigationFile = path.posix.join(adminDir, 'data', 'navigation.ts')\n const adminNavigationDir = path.posix.join(adminDir, 'data', 'navigation')\n const adminActionsDir = path.posix.join(adminDir, 'lib', 'actions')\n\n return {\n adminDir,\n pagesDir,\n schemasDir,\n adminDbDir,\n adminDbCoreDir,\n adminDbCoreFile: path.posix.join(adminDbCoreDir, 'schema.ts'),\n adminDbSchemaFile: path.posix.join(adminDbDir, 'schema.ts'),\n adminUtilsAppDir,\n adminTypesDir,\n adminDataFile: path.posix.join(adminUtilsAppDir, `${namespace.camel}.ts`),\n adminDataNavigationFile: adminNavigationFile,\n adminTypesNavigationFile: path.posix.join(adminTypesDir, 'navigation.ts'),\n adminNavigationFile,\n adminNavigationDir,\n adminActionsDir,\n adminEmailTemplatesDir: path.posix.join(adminDir, 'components', 'email-templates'),\n adminHooksDir: path.posix.join(adminDir, 'hooks')\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { resolveCliAssetPath } from '@core-engine/utils/cli-root.js'\nimport type { BetterstartIntegrationId } from '@integration-engine/types.js'\n\nexport function integrationTemplateRoot(integrationId: BetterstartIntegrationId): string {\n return resolveCliAssetPath('adapters', 'next', 'integrations', integrationId)\n}\n\nexport function readIntegrationTemplate(\n integrationId: BetterstartIntegrationId,\n relativePath: string\n): string {\n return fs.readFileSync(path.join(integrationTemplateRoot(integrationId), relativePath), 'utf-8')\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { stringifyProjectJson } from '@core-engine/utils/json-format.js'\nimport type { SchemaOwner, SchemaOwnershipIndex } from '@plugin-engine/types.js'\n\nfunction ownershipPath(cwd: string): string {\n return path.join(cwd, '.betterstart', 'schemas', 'ownership.json')\n}\n\nexport function loadSchemaOwnershipIndex(cwd: string): SchemaOwnershipIndex {\n const filePath = ownershipPath(cwd)\n if (!fs.existsSync(filePath)) {\n return {\n version: 1,\n schemas: {}\n }\n }\n\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as SchemaOwnershipIndex\n}\n\nexport function saveSchemaOwnershipIndex(cwd: string, index: SchemaOwnershipIndex): void {\n const filePath = ownershipPath(cwd)\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, stringifyProjectJson(index), 'utf-8')\n}\n\nexport function getSchemaOwner(cwd: string, schemaName: string): SchemaOwner | undefined {\n return loadSchemaOwnershipIndex(cwd).schemas[schemaName]\n}\n\nexport function setSchemaOwner(cwd: string, schemaName: string, owner: SchemaOwner): void {\n const index = loadSchemaOwnershipIndex(cwd)\n index.schemas[schemaName] = owner\n saveSchemaOwnershipIndex(cwd, index)\n}\n\nexport function removeSchemaOwner(cwd: string, schemaName: string): void {\n const index = loadSchemaOwnershipIndex(cwd)\n delete index.schemas[schemaName]\n saveSchemaOwnershipIndex(cwd, index)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { writeConfigFile } from '@core-engine/config/serialize.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport {\n type LoadedSchema,\n listSchemaNames,\n loadSchema,\n validateLoadedSchema\n} from '@core-engine/schema/schema-reader.js'\nimport { ensureSnapshotGitFiles } from '@core-engine/snapshots/gitignore.js'\nimport {\n BARREL_SCOPE,\n deleteSnapshot,\n hasTombstone,\n loadManifest\n} from '@core-engine/snapshots/store.js'\nimport { appendEnvVars, removeEnvVars } from '@core-engine/utils/env.js'\nimport type { PackageManager } from '@core-engine/utils/package-manager.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\nimport { resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport { runFormPipeline } from '@next-adapter/generators/form-pipeline/index.js'\nimport { runEntityPipeline, runSinglePipeline } from '@next-adapter/generators/index.js'\nimport {\n getDependencyPlan,\n installDependenciesAsync,\n removeDependenciesAsync\n} from '@next-adapter/init/scaffolders/dependencies.js'\nimport { getIntegrationDefinition } from '@next-adapter/integration-registry.js'\nimport {\n formatUnknownPluginMessage,\n getPluginDefinition,\n isPluginId,\n listPluginDefinitions\n} from '@next-adapter/plugin-registry.js'\nimport { readPluginTemplate } from '@next-adapter/plugin-template-reader.js'\nimport { applyGeneratedFiles } from '@next-adapter/snapshots/apply.js'\nimport { renderBarrelFiles } from '@next-adapter/snapshots/barrels.js'\nimport { readTemplate } from '@next-adapter/template-reader.js'\nimport {\n deleteInstalledPluginManifest,\n loadInstalledPluginManifest,\n saveInstalledPluginManifest\n} from '@plugin-engine/manifests.js'\nimport {\n getSchemaOwner,\n loadSchemaOwnershipIndex,\n removeSchemaOwner,\n setSchemaOwner\n} from '@plugin-engine/ownership.js'\nimport type {\n BetterstartPluginDefinition,\n BetterstartPluginId,\n InstalledPluginManifest\n} from '@plugin-engine/types.js'\n\ninterface ConfigurePluginResult {\n configured: boolean\n addedEnvKeys: string[]\n updatedEnvKeys: string[]\n}\n\nexport interface InstallPluginsOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n pm: PackageManager\n pluginIds: BetterstartPluginId[]\n interactive: boolean\n includeBiome: boolean\n}\n\nexport interface InstallPluginsResult {\n installed: BetterstartPluginId[]\n skipped: BetterstartPluginId[]\n warnings: string[]\n config: ResolvedBetterstartConfig\n}\n\nexport interface RemovePluginsOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n pm: PackageManager\n pluginIds: BetterstartPluginId[]\n}\n\nexport interface RemovePluginsResult {\n removed: BetterstartPluginId[]\n warnings: string[]\n config: ResolvedBetterstartConfig\n}\n\nfunction unique<T>(values: T[]): T[] {\n return Array.from(new Set(values))\n}\n\nfunction normalizeInstalledPlugins(config: ResolvedBetterstartConfig): BetterstartPluginId[] {\n return unique((config.plugins.installed ?? []).filter(isPluginId)).sort()\n}\n\nfunction resolvePluginInstallOrder(pluginIds: BetterstartPluginId[]): BetterstartPluginId[] {\n const ordered: BetterstartPluginId[] = []\n const visiting = new Set<BetterstartPluginId>()\n const visited = new Set<BetterstartPluginId>()\n\n function visit(pluginId: BetterstartPluginId): void {\n if (visited.has(pluginId)) {\n return\n }\n if (visiting.has(pluginId)) {\n throw new Error(`Circular plugin dependency detected at \"${pluginId}\".`)\n }\n\n visiting.add(pluginId)\n for (const dependency of getPluginDefinition(pluginId).dependencies) {\n visit(dependency)\n }\n visiting.delete(pluginId)\n visited.add(pluginId)\n ordered.push(pluginId)\n }\n\n for (const pluginId of pluginIds) {\n visit(pluginId)\n }\n\n return ordered\n}\n\nfunction getSchemasDir(cwd: string, config: ResolvedBetterstartConfig): string {\n const paths = resolveProjectPaths(config)\n return path.join(cwd, ...paths.schemasDir.split('/'))\n}\n\nfunction runLoadedPipeline(\n loaded: LoadedSchema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n outputNamespace?: string\n) {\n if (loaded.type === 'form') {\n return runFormPipeline(loaded.schema, cwd, config, {\n force: false,\n silent: true,\n outputNamespace\n })\n }\n\n if (loaded.type === 'single') {\n return runSinglePipeline(loaded.schema, cwd, config, {\n force: false,\n silent: true,\n outputNamespace\n })\n }\n\n return runEntityPipeline(loaded.schema, cwd, config, {\n force: false,\n silent: true,\n outputNamespace\n })\n}\n\nasync function applyGeneratedSchema(\n cwd: string,\n config: ResolvedBetterstartConfig,\n loaded: LoadedSchema,\n outputNamespace?: string\n): Promise<void> {\n const validationErrors = validateLoadedSchema(loaded)\n if (validationErrors.length > 0) {\n throw new Error(validationErrors.join('; '))\n }\n\n const pipelineResult = runLoadedPipeline(loaded, cwd, config, outputNamespace)\n if (!pipelineResult.success) {\n throw new Error(pipelineResult.errors.join('; '))\n }\n\n await applyGeneratedFiles({\n cwd,\n config,\n scope: loaded.schema.name,\n schemaJson: loaded.schema,\n generatedFiles: pipelineResult.files,\n force: false,\n interactive: false\n })\n}\n\nasync function regenerateBarrels(cwd: string, config: ResolvedBetterstartConfig): Promise<void> {\n await applyGeneratedFiles({\n cwd,\n config,\n scope: BARREL_SCOPE,\n schemaJson: { name: BARREL_SCOPE },\n generatedFiles: renderBarrelFiles(cwd, config),\n force: false,\n interactive: false\n })\n}\n\nfunction resolvePluginProjectPath(config: ResolvedBetterstartConfig, outputPath: string): string {\n const namespacedOutputPath = applyAdminNamespaceToPath(\n outputPath,\n config.frameworkConfig.next.namespace\n )\n return path.posix.join(config.paths.admin.replace(/^\\.\\//, ''), namespacedOutputPath)\n}\n\nfunction namespacePluginContent(config: ResolvedBetterstartConfig, content: string): string {\n return applyAdminNamespaceToContent(content, config.frameworkConfig.next.namespace)\n}\n\nfunction flattenEnvKeys(definition: BetterstartPluginDefinition): string[] {\n return definition.envSections.flatMap((section) => section.vars.map((entry) => entry.key))\n}\n\nfunction normalizeManagedFileContent(content: string): string {\n return content.replace(/\\r\\n/g, '\\n')\n}\n\nfunction tryReadCoreManagedTemplate(relativeOutputPath: string): string | null {\n try {\n return readTemplate(relativeOutputPath)\n } catch {\n return null\n }\n}\n\nfunction configurePlugin(\n definition: BetterstartPluginDefinition,\n cwd: string\n): ConfigurePluginResult {\n const envResult = appendEnvVars(cwd, definition.envSections)\n return {\n configured: true,\n addedEnvKeys: envResult.added,\n updatedEnvKeys: envResult.updated\n }\n}\n\nfunction ensurePluginSchemaTargetsAvailable(\n cwd: string,\n config: ResolvedBetterstartConfig,\n definition: BetterstartPluginDefinition\n): void {\n const schemasDir = getSchemasDir(cwd, config)\n\n for (const schemaFile of definition.schemaFiles) {\n const schemaName = schemaFile.replace(/\\.json$/, '')\n const destinationPath = path.join(schemasDir, schemaFile)\n if (!fs.existsSync(destinationPath)) {\n continue\n }\n\n const owner = getSchemaOwner(cwd, schemaName)\n if (owner && owner !== `plugin:${definition.id}`) {\n throw new Error(\n `Schema \"${schemaName}\" is already owned by \"${owner}\". Remove or rename it before installing ${definition.id}.`\n )\n }\n\n if (!owner) {\n throw new Error(\n `Schema \"${schemaName}\" already exists and is not plugin-owned. Remove or rename it before installing ${definition.id}.`\n )\n }\n }\n}\n\nfunction ensurePluginDirectFileTargetsAvailable(\n cwd: string,\n config: ResolvedBetterstartConfig,\n definition: BetterstartPluginDefinition\n): void {\n for (const file of definition.files) {\n const projectRelativePath = resolvePluginProjectPath(config, file.outputPath)\n const fullPath = path.join(cwd, ...projectRelativePath.split('/'))\n\n if (!fs.existsSync(fullPath)) {\n continue\n }\n\n const stats = fs.statSync(fullPath)\n if (!stats.isFile()) {\n throw new Error(\n `Installing ${definition.id} would overwrite \"${projectRelativePath}\", but it is not a file. Remove or rename it before continuing.`\n )\n }\n\n const existingContent = normalizeManagedFileContent(fs.readFileSync(fullPath, 'utf-8'))\n const pluginTemplate = normalizeManagedFileContent(\n namespacePluginContent(config, readPluginTemplate(definition.id, file.templatePath))\n )\n\n if (existingContent === pluginTemplate) {\n continue\n }\n\n const coreTemplate = tryReadCoreManagedTemplate(file.outputPath)\n if (\n coreTemplate &&\n existingContent === normalizeManagedFileContent(namespacePluginContent(config, coreTemplate))\n ) {\n continue\n }\n\n throw new Error(\n `Installing ${definition.id} would overwrite existing file \"${projectRelativePath}\". Rename, remove, or reset it to the managed template before installing ${definition.id}.`\n )\n }\n}\n\nfunction writePluginDirectFiles(\n cwd: string,\n config: ResolvedBetterstartConfig,\n definition: BetterstartPluginDefinition\n): string[] {\n const writtenFiles: string[] = []\n\n for (const file of definition.files) {\n const projectRelativePath = resolvePluginProjectPath(config, file.outputPath)\n const fullPath = path.join(cwd, ...projectRelativePath.split('/'))\n fs.mkdirSync(path.dirname(fullPath), { recursive: true })\n fs.writeFileSync(\n fullPath,\n namespacePluginContent(config, readPluginTemplate(definition.id, file.templatePath)),\n 'utf-8'\n )\n writtenFiles.push(projectRelativePath)\n }\n\n return writtenFiles\n}\n\nfunction toProjectAbsolutePath(cwd: string, filePath: string): string {\n return path.isAbsolute(filePath) ? filePath : path.join(cwd, ...filePath.split('/'))\n}\n\nfunction isInsideDir(child: string, parent: string): boolean {\n const relative = path.relative(parent, child)\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))\n}\n\nfunction cleanupEmptyDirs(\n cwd: string,\n deletedPaths: string[],\n config: ResolvedBetterstartConfig\n): void {\n const paths = resolveProjectPaths(config)\n const projectRoot = path.resolve(cwd)\n const stopRoots = new Set([\n projectRoot,\n toProjectAbsolutePath(cwd, paths.adminDir),\n toProjectAbsolutePath(cwd, paths.pagesDir),\n toProjectAbsolutePath(cwd, paths.schemasDir),\n path.join(projectRoot, '.betterstart'),\n path.join(projectRoot, '.betterstart', 'plugins'),\n path.join(projectRoot, '.betterstart', 'snapshots')\n ])\n\n for (const deletedPath of deletedPaths) {\n let currentDir = path.dirname(toProjectAbsolutePath(cwd, deletedPath))\n\n while (isInsideDir(currentDir, projectRoot) && !stopRoots.has(currentDir)) {\n if (!fs.existsSync(currentDir)) {\n currentDir = path.dirname(currentDir)\n continue\n }\n\n if (fs.readdirSync(currentDir).length > 0) {\n break\n }\n\n fs.rmdirSync(currentDir)\n currentDir = path.dirname(currentDir)\n }\n }\n}\n\nfunction restoreOrDeletePluginFile(\n cwd: string,\n config: ResolvedBetterstartConfig,\n relativeOutputPath: string\n): string | null {\n const projectRelativePath = resolvePluginProjectPath(config, relativeOutputPath)\n const fullPath = toProjectAbsolutePath(cwd, projectRelativePath)\n\n try {\n const coreTemplate = readTemplate(relativeOutputPath)\n fs.mkdirSync(path.dirname(fullPath), { recursive: true })\n fs.writeFileSync(fullPath, namespacePluginContent(config, coreTemplate), 'utf-8')\n return null\n } catch {\n const existed = fs.existsSync(fullPath)\n fs.rmSync(fullPath, { force: true })\n return existed ? projectRelativePath : null\n }\n}\n\nfunction writePluginSchemas(\n cwd: string,\n config: ResolvedBetterstartConfig,\n definition: BetterstartPluginDefinition\n): string[] {\n const schemasDir = getSchemasDir(cwd, config)\n const writtenSchemaNames: string[] = []\n\n for (const schemaFile of definition.schemaFiles) {\n const outputPath = path.join(schemasDir, schemaFile)\n fs.mkdirSync(path.dirname(outputPath), { recursive: true })\n fs.writeFileSync(\n outputPath,\n readPluginTemplate(definition.id, `schemas/${schemaFile}`),\n 'utf-8'\n )\n writtenSchemaNames.push(schemaFile.replace(/\\.json$/, ''))\n }\n\n return writtenSchemaNames\n}\n\nfunction removePath(cwd: string, filePath: string): boolean {\n const fullPath = toProjectAbsolutePath(cwd, filePath)\n const existed = fs.existsSync(fullPath)\n fs.rmSync(fullPath, { recursive: true, force: true })\n return existed\n}\n\nfunction removePluginSchemas(\n cwd: string,\n config: ResolvedBetterstartConfig,\n manifest: InstalledPluginManifest\n): string[] {\n const paths = resolveProjectPaths(config)\n const deletedPaths: string[] = []\n const manifestsBySchema = new Map<string, NonNullable<ReturnType<typeof loadManifest>>>()\n const missingManifests: string[] = []\n\n for (const schemaName of manifest.ownedSchemas) {\n const scopeManifest = loadManifest(cwd, schemaName)\n if (scopeManifest) {\n manifestsBySchema.set(schemaName, scopeManifest)\n } else {\n missingManifests.push(schemaName)\n }\n }\n\n if (missingManifests.length > 0) {\n throw new Error(\n `Cannot remove ${manifest.id}. Missing snapshot manifest${\n missingManifests.length === 1 ? '' : 's'\n } for plugin-owned schema${missingManifests.length === 1 ? '' : 's'}: ${missingManifests.join(\n ', '\n )}. Re-run \\`pnpm betterstart init --force\\` to restore snapshot state before removing the plugin.`\n )\n }\n\n for (const schemaName of manifest.ownedSchemas) {\n const scopeManifest = manifestsBySchema.get(schemaName)\n if (scopeManifest) {\n for (const filePath of [\n ...scopeManifest.files.map((entry) => entry.path),\n ...scopeManifest.skipped\n ]) {\n if (removePath(cwd, filePath)) {\n deletedPaths.push(filePath)\n }\n }\n deleteSnapshot(cwd, schemaName)\n }\n\n const schemaPath = path.posix.join(paths.schemasDir, `${schemaName}.json`)\n const formsSchemaPath = path.posix.join(paths.schemasDir, 'forms', `${schemaName}.json`)\n if (removePath(cwd, schemaPath)) {\n deletedPaths.push(schemaPath)\n }\n if (removePath(cwd, formsSchemaPath)) {\n deletedPaths.push(formsSchemaPath)\n }\n if (hasTombstone(cwd, schemaName)) {\n fs.rmSync(path.join(cwd, '.betterstart', 'snapshots', '_removed', schemaName), {\n force: true\n })\n }\n removeSchemaOwner(cwd, schemaName)\n }\n\n return deletedPaths\n}\n\nfunction collectSchemaRelationshipTargets(loaded: LoadedSchema): string[] {\n const targets = new Set<string>()\n\n function walkFields(fields: unknown): void {\n if (!Array.isArray(fields)) return\n\n for (const field of fields) {\n if (!field || typeof field !== 'object') {\n continue\n }\n\n const fieldRecord = field as Record<string, unknown>\n const relationship =\n typeof fieldRecord.relationship === 'string' ? fieldRecord.relationship : undefined\n if (relationship) {\n targets.add(relationship)\n }\n\n walkFields(fieldRecord.fields)\n\n if (Array.isArray(fieldRecord.tabs)) {\n for (const tab of fieldRecord.tabs) {\n if (!tab || typeof tab !== 'object') {\n continue\n }\n walkFields((tab as Record<string, unknown>).fields)\n }\n }\n }\n }\n\n if (loaded.type === 'form') {\n walkFields(loaded.schema.fields)\n if (Array.isArray(loaded.schema.steps)) {\n for (const step of loaded.schema.steps) {\n walkFields(step.fields)\n }\n }\n } else {\n walkFields(loaded.schema.fields)\n }\n\n return Array.from(targets)\n}\n\nfunction findBlockingSchemaDependencies(\n cwd: string,\n config: ResolvedBetterstartConfig,\n ownedSchemas: string[]\n): string[] {\n const blockers: string[] = []\n const schemasDir = getSchemasDir(cwd, config)\n const ownership = loadSchemaOwnershipIndex(cwd)\n\n for (const schemaName of listSchemaNames(schemasDir)) {\n if (ownership.schemas[schemaName] !== 'user') {\n continue\n }\n\n const loaded = loadSchema(schemasDir, schemaName)\n const relationshipTargets = collectSchemaRelationshipTargets(loaded).filter((target) =>\n ownedSchemas.includes(target)\n )\n\n if (relationshipTargets.length > 0) {\n blockers.push(\n `${schemaName} references plugin-owned schema(s): ${relationshipTargets.join(', ')}`\n )\n }\n }\n\n return blockers\n}\n\nfunction getUnusedPluginDependencies(\n remainingPlugins: BetterstartPluginId[],\n removedPluginId: BetterstartPluginId,\n installedIntegrations: string[]\n): { dependencies: string[]; devDependencies: string[] } {\n const remainingDefinitions = remainingPlugins.map((pluginId) => getPluginDefinition(pluginId))\n const integrationDefinitions = installedIntegrations.map((integrationId) =>\n getIntegrationDefinition(integrationId)\n )\n const remainingDependencies = new Set([\n ...remainingDefinitions.flatMap((definition) => definition.packageDependencies),\n ...integrationDefinitions.flatMap((definition) => definition.packageDependencies)\n ])\n const remainingDevDependencies = new Set([\n ...remainingDefinitions.flatMap((definition) => definition.devDependencies),\n ...integrationDefinitions.flatMap((definition) => definition.devDependencies)\n ])\n\n const corePlan = getDependencyPlan([], [], false)\n const removedDefinition = getPluginDefinition(removedPluginId)\n\n return {\n dependencies: removedDefinition.packageDependencies.filter(\n (dependency) =>\n !remainingDependencies.has(dependency) && !corePlan.dependencies.includes(dependency)\n ),\n devDependencies: removedDefinition.devDependencies.filter(\n (dependency) =>\n !remainingDevDependencies.has(dependency) && !corePlan.devDependencies.includes(dependency)\n )\n }\n}\n\nexport function parsePluginList(value: string | undefined): BetterstartPluginId[] {\n if (!value) {\n return []\n }\n\n const pluginIds = value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n\n const invalid = pluginIds.filter((pluginId) => !isPluginId(pluginId))\n if (invalid.length > 0) {\n throw new Error(formatUnknownPluginMessage(invalid))\n }\n\n return unique(pluginIds as BetterstartPluginId[])\n}\n\nexport function getInstalledPlugins(config: ResolvedBetterstartConfig): BetterstartPluginId[] {\n return normalizeInstalledPlugins(config)\n}\n\nexport function syncInstalledPluginManifests(cwd: string, config: ResolvedBetterstartConfig): void {\n for (const pluginId of normalizeInstalledPlugins(config)) {\n const manifest = loadInstalledPluginManifest(cwd, pluginId)\n if (!manifest) {\n continue\n }\n\n const definition = getPluginDefinition(pluginId)\n const nextManifest: InstalledPluginManifest = {\n ...manifest,\n version: definition.version,\n kind: definition.kind,\n ownedFiles: definition.files.map((file) => resolvePluginProjectPath(config, file.outputPath)),\n packageDependencies: definition.packageDependencies,\n devDependencies: definition.devDependencies,\n dependencies: definition.dependencies,\n conflicts: definition.conflicts\n }\n\n if (JSON.stringify(nextManifest) !== JSON.stringify(manifest)) {\n saveInstalledPluginManifest(cwd, nextManifest)\n }\n }\n}\n\nexport function ensureCoreSchemaOwnership(cwd: string, schemaName: string): void {\n setSchemaOwner(cwd, schemaName, 'core')\n}\n\nexport function ensureUserSchemaOwnership(cwd: string, schemaName: string): void {\n if (schemaName === 'settings') {\n setSchemaOwner(cwd, schemaName, 'core')\n return\n }\n\n const owner = getSchemaOwner(cwd, schemaName)\n if (!owner) {\n setSchemaOwner(cwd, schemaName, 'user')\n }\n}\n\nexport async function installPlugins({\n cwd,\n config,\n pm,\n pluginIds,\n includeBiome\n}: InstallPluginsOptions): Promise<InstallPluginsResult> {\n const orderedPluginIds = resolvePluginInstallOrder(pluginIds)\n const installedPluginIds = normalizeInstalledPlugins(config)\n const skipped: BetterstartPluginId[] = []\n const installed: BetterstartPluginId[] = []\n const warnings: string[] = []\n\n ensureSnapshotGitFiles(cwd)\n\n for (const pluginId of orderedPluginIds) {\n if (installedPluginIds.includes(pluginId)) {\n skipped.push(pluginId)\n continue\n }\n\n const definition = getPluginDefinition(pluginId)\n ensurePluginSchemaTargetsAvailable(cwd, config, definition)\n ensurePluginDirectFileTargetsAvailable(cwd, config, definition)\n\n const configureResult = configurePlugin(definition, cwd)\n const dependencyPlan = getDependencyPlan(\n [...installedPluginIds, pluginId],\n config.integrations.installed,\n includeBiome\n )\n const currentPlan = getDependencyPlan(\n installedPluginIds,\n config.integrations.installed,\n includeBiome\n )\n\n const dependencyDiff = {\n dependencies: dependencyPlan.dependencies.filter(\n (dependency) => !currentPlan.dependencies.includes(dependency)\n ),\n devDependencies: dependencyPlan.devDependencies.filter(\n (dependency) => !currentPlan.devDependencies.includes(dependency)\n )\n }\n\n if (dependencyDiff.dependencies.length > 0 || dependencyDiff.devDependencies.length > 0) {\n const result = await installDependenciesAsync({\n cwd,\n pm,\n dependencies: dependencyDiff.dependencies,\n devDependencies: dependencyDiff.devDependencies\n })\n\n if (!result.success) {\n throw new Error(result.error ?? `Failed to install dependencies for ${pluginId}.`)\n }\n }\n\n const writtenFiles = writePluginDirectFiles(cwd, config, definition)\n const writtenSchemas = writePluginSchemas(cwd, config, definition)\n\n for (const schemaName of writtenSchemas) {\n const loaded = loadSchema(getSchemasDir(cwd, config), schemaName)\n await applyGeneratedSchema(cwd, config, loaded, pluginId)\n setSchemaOwner(cwd, schemaName, `plugin:${pluginId}`)\n }\n\n if (writtenSchemas.length > 0) {\n await regenerateBarrels(cwd, config)\n }\n\n installedPluginIds.push(pluginId)\n config.plugins.installed = unique(installedPluginIds).sort()\n\n const manifest: InstalledPluginManifest = {\n id: pluginId,\n version: definition.version,\n kind: definition.kind,\n ownedSchemas: writtenSchemas,\n ownedFiles: writtenFiles,\n envKeys: flattenEnvKeys(definition),\n packageDependencies: definition.packageDependencies,\n devDependencies: definition.devDependencies,\n configured: configureResult.configured,\n dependencies: definition.dependencies,\n conflicts: definition.conflicts,\n installedAt: new Date().toISOString()\n }\n\n saveInstalledPluginManifest(cwd, manifest)\n writeConfigFile(cwd, config)\n installed.push(pluginId)\n }\n\n return {\n installed,\n skipped,\n warnings,\n config\n }\n}\n\nexport async function removePlugins({\n cwd,\n config,\n pm,\n pluginIds\n}: RemovePluginsOptions): Promise<RemovePluginsResult> {\n const installedPlugins = normalizeInstalledPlugins(config)\n const removed: BetterstartPluginId[] = []\n const warnings: string[] = []\n\n for (const pluginId of pluginIds) {\n if (!installedPlugins.includes(pluginId)) {\n warnings.push(`${pluginId} is not installed.`)\n continue\n }\n\n const manifest = loadInstalledPluginManifest(cwd, pluginId)\n if (!manifest) {\n throw new Error(`Missing manifest for installed plugin \"${pluginId}\".`)\n }\n\n const dependents = installedPlugins.filter((installedPluginId) => {\n if (installedPluginId === pluginId) {\n return false\n }\n\n return getPluginDefinition(installedPluginId).dependencies.includes(pluginId)\n })\n\n if (dependents.length > 0) {\n throw new Error(\n `Cannot remove ${pluginId}. The following plugins depend on it: ${dependents.join(', ')}`\n )\n }\n\n const blockers = findBlockingSchemaDependencies(cwd, config, manifest.ownedSchemas)\n if (blockers.length > 0) {\n throw new Error(`Cannot remove ${pluginId}:\\n- ${blockers.join('\\n- ')}`)\n }\n\n const deletedPaths = removePluginSchemas(cwd, config, manifest)\n\n for (const filePath of manifest.ownedFiles) {\n const relativeOutputPath = filePath.replace(`${config.paths.admin.replace(/^\\.\\//, '')}/`, '')\n const deletedPath = restoreOrDeletePluginFile(cwd, config, relativeOutputPath)\n if (deletedPath) {\n deletedPaths.push(deletedPath)\n }\n }\n\n deleteInstalledPluginManifest(cwd, pluginId)\n const nextInstalledPlugins = installedPlugins.filter(\n (installedPluginId) => installedPluginId !== pluginId\n )\n installedPlugins.splice(0, installedPlugins.length, ...nextInstalledPlugins)\n config.plugins.installed = [...nextInstalledPlugins].sort()\n\n const remainingPlugins = normalizeInstalledPlugins(config)\n const dependencyDiff = getUnusedPluginDependencies(\n remainingPlugins,\n pluginId,\n config.integrations.installed\n )\n\n if (dependencyDiff.dependencies.length > 0 || dependencyDiff.devDependencies.length > 0) {\n const result = await removeDependenciesAsync({\n cwd,\n pm,\n dependencies: dependencyDiff.dependencies,\n devDependencies: dependencyDiff.devDependencies\n })\n\n if (!result.success) {\n warnings.push(result.error ?? `Failed to remove dependencies for ${pluginId}.`)\n }\n }\n\n const usedEnvKeys = new Set(\n remainingPlugins.flatMap((installedPluginId) =>\n flattenEnvKeys(getPluginDefinition(installedPluginId))\n )\n )\n const removableEnvKeys = manifest.envKeys.filter((envKey) => !usedEnvKeys.has(envKey))\n if (removableEnvKeys.length > 0) {\n removeEnvVars(cwd, removableEnvKeys)\n }\n\n if (manifest.ownedSchemas.length > 0) {\n await regenerateBarrels(cwd, config)\n }\n\n cleanupEmptyDirs(cwd, deletedPaths, config)\n\n writeConfigFile(cwd, config)\n removed.push(pluginId)\n }\n\n return {\n removed,\n warnings,\n config\n }\n}\n\nexport function listAvailablePlugins() {\n return listPluginDefinitions()\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nconst SNAPSHOT_COMMENT = '# BetterStart: snapshot files are local-only; manifest is committed'\nconst SNAPSHOT_IGNORE = '.betterstart/snapshots/**/files/'\nconst SNAPSHOT_ATTRIBUTES = '.betterstart/** text eol=lf'\n\nfunction ensureLine(filePath: string, line: string, comment?: string): void {\n const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf-8') : ''\n const lines = existing === '' ? [] : existing.split('\\n')\n\n if (lines.includes(line)) {\n return\n }\n\n const nextLines = [...lines.filter(Boolean)]\n if (comment && !nextLines.includes(comment)) {\n nextLines.push(comment)\n }\n nextLines.push(line)\n fs.writeFileSync(filePath, `${nextLines.join('\\n')}\\n`, 'utf-8')\n}\n\nexport function ensureSnapshotGitignore(cwd: string): void {\n ensureLine(path.join(cwd, '.gitignore'), SNAPSHOT_IGNORE, SNAPSHOT_COMMENT)\n}\n\nexport function ensureSnapshotGitattributes(cwd: string): void {\n ensureLine(path.join(cwd, '.gitattributes'), SNAPSHOT_ATTRIBUTES)\n}\n\nexport function ensureSnapshotGitFiles(cwd: string): void {\n ensureSnapshotGitignore(cwd)\n ensureSnapshotGitattributes(cwd)\n}\n","import path from 'node:path'\nimport type { GeneratedFile } from '@core-engine/schema/types.js'\n\nexport function normalizeGeneratedPath(filePath: string): string {\n return filePath.split(path.sep).join('/')\n}\n\nexport function createGeneratedFile(filePath: string, content: string): GeneratedFile {\n return {\n path: normalizeGeneratedPath(filePath),\n content\n }\n}\n\nexport function getGeneratedFilePaths(files: GeneratedFile[]): string[] {\n return files.map((file) => file.path)\n}\n\nexport function sortGeneratedFiles(files: GeneratedFile[]): GeneratedFile[] {\n return [...files].sort((a, b) => a.path.localeCompare(b.path))\n}\n","/**\n * Drizzle ORM type mappings for schema fields and form fields\n */\n\nimport { isFieldType, isFormFieldType } from '@core-engine/schema/constants.js'\nimport type { FormField, SchemaField } from '@core-engine/schema/types.js'\nimport { quotePropertyName } from '@core-engine/utils/string.js'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport const DRIZZLE_DEFAULTS = {\n VARCHAR_LENGTH: 255,\n DECIMAL_PRECISION: 10,\n DECIMAL_SCALE: 2\n} as const\n\n// ============================================================================\n// Schema Field → Drizzle Type (for database generator)\n// ============================================================================\n\n/**\n * Map a schema field type to Drizzle ORM column type\n * @param field - The schema field\n * @param requiredImports - Set to track which Drizzle imports are needed\n * @returns The Drizzle column type expression\n */\nexport function toDrizzleType(field: SchemaField, requiredImports: Set<string>): string {\n assertSupportedSchemaFieldTree(field)\n\n switch (field.type) {\n case 'uuid':\n case 'serial':\n requiredImports.add('uuid')\n return 'uuid().defaultRandom()'\n case 'string':\n case 'varchar':\n requiredImports.add('varchar')\n return field.length\n ? `varchar({ length: ${field.length} })`\n : `varchar({ length: ${DRIZZLE_DEFAULTS.VARCHAR_LENGTH} })`\n case 'image':\n case 'video':\n case 'media':\n requiredImports.add('text')\n return 'text()'\n case 'text':\n case 'markdown':\n case 'richtext':\n requiredImports.add('text')\n return 'text()'\n case 'number':\n requiredImports.add('integer')\n return 'integer()'\n case 'decimal':\n requiredImports.add('decimal')\n if (field.precision !== undefined && field.scale !== undefined) {\n return `decimal({ precision: ${field.precision}, scale: ${field.scale}, mode: 'number' })`\n }\n return `decimal({ precision: ${DRIZZLE_DEFAULTS.DECIMAL_PRECISION}, scale: ${DRIZZLE_DEFAULTS.DECIMAL_SCALE}, mode: 'number' })`\n case 'boolean':\n requiredImports.add('boolean')\n return 'boolean()'\n case 'timestamp':\n requiredImports.add('timestamp')\n return \"timestamp({ precision: 3, mode: 'string' })\"\n case 'date':\n requiredImports.add('date')\n return \"date({ mode: 'string' })\"\n case 'time':\n case 'icon':\n requiredImports.add('varchar')\n return field.length\n ? `varchar({ length: ${field.length} })`\n : `varchar({ length: ${DRIZZLE_DEFAULTS.VARCHAR_LENGTH} })`\n case 'select':\n if (field.multiple) {\n requiredImports.add('jsonb')\n return 'jsonb().$type<string[]>()'\n }\n requiredImports.add('varchar')\n return field.length\n ? `varchar({ length: ${field.length} })`\n : `varchar({ length: ${DRIZZLE_DEFAULTS.VARCHAR_LENGTH} })`\n case 'gallery':\n requiredImports.add('jsonb')\n return 'jsonb().$type<string[]>()'\n case 'list':\n requiredImports.add('jsonb')\n if (field.fields && field.fields.length > 0) {\n const nestedType = buildNestedListType(field.fields)\n return `jsonb().$type<Array<{ ${nestedType} }>>()`\n }\n return 'jsonb().$type<string[]>()'\n case 'relationship':\n requiredImports.add('uuid')\n return 'uuid()'\n default:\n requiredImports.add('text')\n return 'text()'\n }\n}\n\nfunction assertSupportedSchemaFieldType(field: SchemaField): void {\n if (typeof field.type === 'string' && isFieldType(field.type)) return\n throw new Error(\n `Field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n}\n\n/**\n * Build nested type string for list fields with nested fields\n */\nfunction buildNestedListType(fields: SchemaField[]): string {\n return fields\n .flatMap((f) => {\n assertSupportedSchemaFieldType(f)\n\n let type: string\n if (f.type === 'list' && f.fields && f.fields.length > 0) {\n const innerType = f.fields\n .map((nf) => {\n assertSupportedSchemaFieldType(nf)\n\n let nfType: string\n if (nf.type === 'boolean') {\n nfType = 'boolean'\n } else if (nf.type === 'number' || nf.type === 'decimal') {\n nfType = 'number'\n } else {\n nfType = 'string'\n }\n return `${quotePropertyName(nf.name)}?: ${nfType}`\n })\n .join('; ')\n type = `Array<{ ${innerType} }>`\n } else if (f.type === 'list') {\n type = 'string[]'\n } else if (f.type === 'number' || f.type === 'decimal') {\n type = 'number'\n } else if (f.type === 'boolean') {\n type = 'boolean'\n } else {\n type = 'string'\n }\n const result = [`${quotePropertyName(f.name)}?: ${type}`]\n if (f.hasIcon) {\n result.push(`${quotePropertyName(`${f.name}Icon`)}?: string`)\n }\n return result\n })\n .join('; ')\n}\n\n// ============================================================================\n// Form Field → Drizzle Type (for form-pipeline)\n// ============================================================================\n\n/**\n * Map a form field type to Drizzle ORM column type\n * @param field - The form field\n * @param requiredImports - Set to track which Drizzle imports are needed\n * @returns The Drizzle column type expression\n */\nexport function formFieldToDrizzleType(field: FormField, requiredImports: Set<string>): string {\n assertSupportedFormFieldTree(field)\n\n switch (field.type) {\n case 'text':\n requiredImports.add('varchar')\n return field.maxLength\n ? `varchar({ length: ${field.maxLength} })`\n : `varchar({ length: ${DRIZZLE_DEFAULTS.VARCHAR_LENGTH} })`\n case 'textarea':\n requiredImports.add('text')\n return 'text()'\n case 'email':\n requiredImports.add('varchar')\n return `varchar({ length: ${DRIZZLE_DEFAULTS.VARCHAR_LENGTH} })`\n case 'phone':\n requiredImports.add('varchar')\n return 'varchar({ length: 50 })'\n case 'number':\n requiredImports.add('integer')\n return 'integer()'\n case 'url':\n requiredImports.add('varchar')\n return 'varchar({ length: 500 })'\n case 'date':\n requiredImports.add('date')\n return \"date({ mode: 'string' })\"\n case 'select':\n case 'radio':\n case 'timezone':\n requiredImports.add('varchar')\n return `varchar({ length: ${DRIZZLE_DEFAULTS.VARCHAR_LENGTH} })`\n case 'checkbox':\n requiredImports.add('boolean')\n return 'boolean()'\n case 'multiselect':\n requiredImports.add('jsonb')\n return 'jsonb().$type<string[]>()'\n case 'list':\n requiredImports.add('jsonb')\n if (field.fields && field.fields.length > 0) {\n for (const nestedField of field.fields) {\n assertSupportedFormFieldType(nestedField)\n }\n return 'jsonb().$type<Record<string, unknown>[]>()'\n }\n return 'jsonb().$type<string[]>()'\n case 'file':\n case 'upload':\n requiredImports.add('text')\n return 'text()'\n default:\n requiredImports.add('text')\n return 'text()'\n }\n}\n\nfunction assertSupportedFormFieldType(field: FormField): void {\n if (typeof field.type === 'string' && isFormFieldType(field.type)) return\n throw new Error(\n `Form field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n}\n\nfunction assertSupportedSchemaFieldTree(field: SchemaField): void {\n assertSupportedSchemaFieldType(field)\n if (field.fields) {\n for (const nestedField of field.fields) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n }\n if (field.items) {\n assertSupportedSchemaFieldTree(field.items as SchemaField)\n }\n if (field.tabs) {\n for (const tab of field.tabs) {\n for (const nestedField of tab.fields || []) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n for (const nestedField of getTabSlotFields(tab.slot)) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n }\n }\n}\n\nfunction getTabSlotFields(slot: unknown): SchemaField[] {\n if (!isRecord(slot)) return []\n const fields: SchemaField[] = []\n for (const area of [slot.main, slot.sidebar]) {\n if (isRecord(area) && Array.isArray(area.fields)) {\n fields.push(...(area.fields as SchemaField[]))\n }\n }\n return fields\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction assertSupportedFormFieldTree(field: FormField): void {\n assertSupportedFormFieldType(field)\n if (field.fields) {\n for (const nestedField of field.fields) {\n assertSupportedFormFieldTree(nestedField)\n }\n }\n}\n","/**\n * TypeScript, form field, and SQL type mappings for schema fields\n */\n\nimport { isFieldType } from '@core-engine/schema/constants.js'\nimport { DRIZZLE_DEFAULTS } from '@core-engine/schema/type-mappers/drizzle.js'\nimport type { SchemaField } from '@core-engine/schema/types.js'\nimport { quotePropertyName, singularize, toPascalCase } from '@core-engine/utils/string.js'\n\n// ============================================================================\n// Schema Field → TypeScript Type (for actions generator)\n// ============================================================================\n\n/**\n * Map a schema field type to TypeScript type\n * @param field - The schema field\n * @param mode - 'input' for form input types, 'output' for database output types\n * @returns The TypeScript type as a string\n */\nexport function toTypeScriptType(field: SchemaField, mode: 'input' | 'output' = 'output'): string {\n assertSupportedSchemaFieldTree(field)\n\n switch (field.type) {\n case 'uuid':\n case 'serial':\n return 'string'\n case 'number':\n case 'decimal':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'string':\n case 'varchar':\n case 'text':\n case 'markdown':\n case 'richtext':\n case 'date':\n case 'time':\n case 'timestamp':\n case 'image':\n case 'video':\n case 'media':\n case 'icon':\n return 'string'\n case 'select':\n return field.multiple ? 'string[]' : 'string'\n case 'relationship':\n if (mode === 'input') {\n return field.multiple ? 'string[]' : 'string'\n }\n if (field.relationship) {\n const relationshipSingular = singularize(field.relationship)\n const relationshipPascal = toPascalCase(relationshipSingular)\n return field.multiple ? `${relationshipPascal}Data[]` : `${relationshipPascal}Data | null`\n }\n return 'string'\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const groupType = field.fields\n .map((f) => {\n const type = toTypeScriptType(f, mode)\n return `${quotePropertyName(f.name)}?: ${type}`\n })\n .join('; ')\n return `{ ${groupType} }`\n }\n return 'Record<string, unknown>'\n case 'list':\n if (field.fields && field.fields.length > 0) {\n const nestedType = field.fields\n .flatMap((f) => {\n const type = toTypeScriptType(f, 'input')\n const fields = [`${quotePropertyName(f.name)}?: ${type}`]\n if (f.hasIcon) {\n fields.push(`${quotePropertyName(`${f.name}Icon`)}?: string`)\n }\n return fields\n })\n .join('; ')\n return `Array<{ ${nestedType} }>`\n }\n return 'string[]'\n case 'gallery':\n return 'string[]'\n default:\n return 'string'\n }\n}\n\nfunction assertSupportedSchemaFieldType(field: SchemaField): void {\n if (typeof field.type === 'string' && isFieldType(field.type)) return\n throw new Error(\n `Field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n}\n\nfunction assertSupportedSchemaFieldTree(field: SchemaField): void {\n assertSupportedSchemaFieldType(field)\n if (field.fields) {\n for (const nestedField of field.fields) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n }\n if (field.items) {\n assertSupportedSchemaFieldTree(field.items as SchemaField)\n }\n if (field.tabs) {\n for (const tab of field.tabs) {\n for (const nestedField of tab.fields || []) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n for (const nestedField of getTabSlotFields(tab.slot)) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n }\n }\n}\n\nfunction getTabSlotFields(slot: unknown): SchemaField[] {\n if (!isRecord(slot)) return []\n const fields: SchemaField[] = []\n for (const area of [slot.main, slot.sidebar]) {\n if (isRecord(area) && Array.isArray(area.fields)) {\n fields.push(...(area.fields as SchemaField[]))\n }\n }\n return fields\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\n// ============================================================================\n// Schema Field → Form Field Type (for form generator)\n// ============================================================================\n\n/**\n * Map a schema field type to HTML form input type\n * @param field - The schema field\n * @returns The form input type (checkbox, textarea, number, date, etc.)\n */\nexport function toFormFieldType(field: SchemaField): string {\n assertSupportedSchemaFieldTree(field)\n\n switch (field.type) {\n case 'boolean':\n return 'checkbox'\n case 'text':\n return 'textarea'\n case 'markdown':\n return 'markdown'\n case 'richtext':\n return 'richtext'\n case 'number':\n case 'decimal':\n return 'number'\n case 'date':\n return 'date'\n case 'time':\n return 'time'\n case 'timestamp':\n return 'datetime-local'\n default:\n return 'text'\n }\n}\n\n// ============================================================================\n// Schema Field → SQL Type (for raw SQL migrations)\n// ============================================================================\n\n/**\n * Map a schema field type to SQL column type\n * @param field - The schema field\n * @returns The SQL column type\n */\nexport function toSQLType(field: SchemaField): string {\n assertSupportedSchemaFieldTree(field)\n\n switch (field.type) {\n case 'uuid':\n case 'serial':\n return 'UUID'\n case 'string':\n case 'varchar':\n return field.length\n ? `VARCHAR(${field.length})`\n : `VARCHAR(${DRIZZLE_DEFAULTS.VARCHAR_LENGTH})`\n case 'text':\n case 'markdown':\n case 'richtext':\n case 'image':\n case 'video':\n case 'media':\n return 'TEXT'\n case 'number':\n return 'INTEGER'\n case 'decimal':\n return `DECIMAL(${field.precision || DRIZZLE_DEFAULTS.DECIMAL_PRECISION}, ${field.scale || DRIZZLE_DEFAULTS.DECIMAL_SCALE})`\n case 'boolean':\n return 'BOOLEAN'\n case 'timestamp':\n return 'TIMESTAMP(3)'\n case 'date':\n return 'DATE'\n case 'time':\n case 'icon':\n return `VARCHAR(${DRIZZLE_DEFAULTS.VARCHAR_LENGTH})`\n case 'select':\n return field.multiple ? 'JSONB' : `VARCHAR(${DRIZZLE_DEFAULTS.VARCHAR_LENGTH})`\n case 'list':\n case 'gallery':\n return 'JSONB'\n case 'relationship':\n return 'UUID'\n default:\n return 'TEXT'\n }\n}\n","/**\n * Zod validation type mappings for schema fields and form fields\n */\n\nimport { isFieldType, isFormFieldType } from '@core-engine/schema/constants.js'\nimport type { FormField, SchemaField } from '@core-engine/schema/types.js'\nimport { quotePropertyName } from '@core-engine/utils/string.js'\n\n// ============================================================================\n// Schema Field → Zod Type (for form validation)\n// ============================================================================\n\n/**\n * Map a schema field type to Zod validation schema\n * @param field - The schema field\n * @returns The Zod schema expression as a string\n */\nexport function toZodType(field: SchemaField): string {\n assertSupportedSchemaFieldTree(field)\n\n const label = field.label || field.name\n\n switch (field.type) {\n case 'uuid':\n case 'serial':\n return field.required\n ? `z.string().uuid('${label} must be a valid UUID')`\n : `z.string().uuid('${label} must be a valid UUID').optional()`\n case 'number':\n case 'decimal':\n return field.required\n ? `z.number({ message: '${label} is required' })`\n : 'z.number().optional()'\n case 'boolean':\n return 'z.boolean()'\n case 'string':\n case 'varchar':\n case 'text':\n case 'markdown':\n case 'richtext': {\n if (field.name.toLowerCase().includes('email')) {\n const base = field.required\n ? `z.string().min(1, '${label} is required').email('Please enter a valid email address')`\n : `z.string().email('Please enter a valid email address').optional()`\n return field.length ? `${base}.max(${field.length})` : base\n }\n const base = field.required ? `z.string().min(1, '${label} is required')` : 'z.string()'\n return field.length ? `${base}.max(${field.length})` : base\n }\n case 'date':\n if (!field.required) {\n return 'z.string().transform(val => val === \"\" ? undefined : val).optional()'\n }\n return `z.string().min(1, '${label} is required')`\n case 'timestamp':\n case 'time':\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'image':\n case 'video':\n case 'media': {\n if (!field.required) {\n return 'z.string().transform(val => val === \"\" ? undefined : val).optional()'\n }\n const mediaType =\n field.type === 'image' ? 'an image' : field.type === 'video' ? 'a video' : 'media'\n return `z.string().min(1, 'Please select ${mediaType} for ${label}')`\n }\n case 'gallery':\n return field.required\n ? `z.array(z.string()).min(1, '${label} must have at least one item')`\n : 'z.array(z.string()).optional()'\n case 'list':\n return buildZodListType(field, label)\n case 'select': {\n if (field.multiple) {\n if (field.creatable) {\n return field.required\n ? `z.array(z.string()).min(1, '${label} is required')`\n : 'z.array(z.string()).optional()'\n }\n if (field.options && field.options.length > 0) {\n const values = field.options.map((opt) => `'${opt.value}'`).join(', ')\n const valuesArray = `[${values}] as const`\n const arraySchema = `z.array(z.string()).refine((values) => values.every((value) => (${valuesArray} as readonly string[]).includes(value)), { message: 'Invalid ${label}' })`\n return field.required\n ? `${arraySchema}.min(1, '${label} is required')`\n : `${arraySchema}.optional()`\n }\n return field.required\n ? `z.array(z.string()).min(1, '${label} is required')`\n : 'z.array(z.string()).optional()'\n }\n if (field.options && field.options.length > 0) {\n const values = field.options.map((opt) => `'${opt.value}'`).join(', ')\n const valuesArray = `[${values}] as const`\n return field.required\n ? `z.string().min(1, '${label} is required').refine((val) => (${valuesArray} as readonly string[]).includes(val), { message: 'Invalid ${label}' })`\n : `z.string().refine((val) => !val || (${valuesArray} as readonly string[]).includes(val), { message: 'Invalid ${label}' }).optional()`\n }\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n }\n case 'icon':\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'relationship': {\n if (field.multiple) {\n return field.required\n ? `z.array(z.string().uuid()).min(1, '${label} is required')`\n : 'z.array(z.string().uuid()).optional()'\n }\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n }\n default:\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n }\n}\n\nfunction assertSupportedSchemaFieldType(field: SchemaField): void {\n if (typeof field.type === 'string' && isFieldType(field.type)) return\n throw new Error(\n `Field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n}\n\n/**\n * Build Zod type for list fields\n */\nfunction buildZodListType(field: SchemaField, label: string): string {\n if (field.items) {\n assertSupportedSchemaFieldType(field.items as SchemaField)\n }\n\n if (field.fields && field.fields.length > 0) {\n const nestedFields = field.fields\n .flatMap((nestedField) => {\n const defs: string[] = []\n const nestedZodType = toZodType(nestedField)\n const alreadyOptional = nestedZodType.includes('.optional()')\n let nestedDef = ` ${quotePropertyName(nestedField.name)}: ${nestedZodType}`\n if (!nestedField.required && !alreadyOptional) {\n nestedDef += '.optional()'\n }\n defs.push(nestedDef)\n if (nestedField.hasIcon) {\n defs.push(` ${quotePropertyName(`${nestedField.name}Icon`)}: z.string().optional()`)\n }\n return defs\n })\n .join(',\\n')\n const objectSchema = `z.object({\\n${nestedFields}\\n })`\n const arraySchema = field.maxItems\n ? `z.array(${objectSchema}).max(${field.maxItems}, '${label} cannot exceed ${field.maxItems} items')`\n : `z.array(${objectSchema})`\n return field.required\n ? `${arraySchema}.min(1, '${label} must have at least one item')`\n : `${arraySchema}.optional()`\n }\n if (field.items?.type === 'string' || field.items?.type === 'varchar') {\n const itemSchema = field.items.length ? `z.string().max(${field.items.length})` : 'z.string()'\n const arraySchema = field.maxItems\n ? `z.array(${itemSchema}).max(${field.maxItems}, '${label} cannot exceed ${field.maxItems} items')`\n : `z.array(${itemSchema})`\n return field.required\n ? `${arraySchema}.min(1, '${label} must have at least one item')`\n : `${arraySchema}.optional()`\n }\n return field.required\n ? `z.array(z.string()).min(1, '${label} must have at least one item')`\n : 'z.array(z.string()).optional()'\n}\n\n// ============================================================================\n// Form Field → Zod Type (for form-pipeline)\n// ============================================================================\n\nexport interface FormFieldZodOptions {\n treatAsOptional?: boolean\n}\n\n/**\n * Map a form field type to Zod validation schema\n * @param field - The form field\n * @param options - Options for generating the zod type\n * @returns The Zod schema expression as a string\n */\nexport function formFieldToZodType(field: FormField, options: FormFieldZodOptions = {}): string {\n assertSupportedFormFieldTree(field)\n\n const label = field.label || field.name || ''\n const isRequired = field.required && !options.treatAsOptional\n\n switch (field.type) {\n case 'text': {\n let zodType = isRequired ? `z.string().min(1, '${label} is required')` : 'z.string()'\n if (field.minLength) {\n zodType += `.min(${field.minLength}, '${label} must be at least ${field.minLength} characters')`\n }\n if (field.maxLength) {\n zodType += `.max(${field.maxLength}, '${label} must be at most ${field.maxLength} characters')`\n }\n if (field.pattern) {\n zodType += `.regex(new RegExp('${field.pattern}'), 'Invalid ${label} format')`\n }\n return isRequired ? zodType : `${zodType}.optional()`\n }\n case 'textarea': {\n let zodType = isRequired ? `z.string().min(1, '${label} is required')` : 'z.string()'\n if (field.minLength) {\n zodType += `.min(${field.minLength}, '${label} must be at least ${field.minLength} characters')`\n }\n if (field.maxLength) {\n zodType += `.max(${field.maxLength}, '${label} must be at most ${field.maxLength} characters')`\n }\n return isRequired ? zodType : `${zodType}.optional()`\n }\n case 'email':\n return isRequired\n ? `z.string().min(1, '${label} is required').email('Please enter a valid email address')`\n : `z.string().optional().refine((val) => !val || val.trim() === '' || z.string().email().safeParse(val).success, { message: 'Please enter a valid email address' })`\n case 'phone': {\n const pattern =\n field.pattern || '^[+]?[(]?[0-9]{1,4}[)]?[-\\\\s\\\\.]?[(]?[0-9]{1,4}[)]?[-\\\\s\\\\.]?[0-9]{1,9}$'\n return isRequired\n ? `z.string().min(1, '${label} is required').regex(new RegExp('${pattern}'), 'Please enter a valid phone number')`\n : `z.string().optional().refine((val) => !val || val.trim() === '' || new RegExp('${pattern}').test(val), { message: 'Please enter a valid phone number' })`\n }\n case 'number': {\n let zodType = isRequired ? `z.number({ message: '${label} is required' })` : 'z.number()'\n if (field.min !== undefined) {\n zodType += `.min(${field.min}, '${label} must be at least ${field.min}')`\n }\n if (field.max !== undefined) {\n zodType += `.max(${field.max}, '${label} must be at most ${field.max}')`\n }\n return isRequired ? zodType : `${zodType}.optional()`\n }\n case 'url':\n return isRequired\n ? `z.string().min(1, '${label} is required').url('Please enter a valid URL')`\n : `z.string().optional().refine((val) => !val || val.trim() === '' || z.string().url().safeParse(val).success, { message: 'Please enter a valid URL' })`\n case 'date':\n return isRequired\n ? `z.string().min(1, '${label} is required')`\n : 'z.string().transform(val => val === \"\" ? undefined : val).optional()'\n case 'select':\n case 'radio':\n if (field.options && field.options.length > 0) {\n const values = field.options.map((opt) => `'${opt.value}'`).join(', ')\n return isRequired\n ? `z.enum([${values}], { message: '${label} is required' })`\n : `z.enum([${values}]).optional()`\n }\n return isRequired ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'checkbox':\n return isRequired\n ? `z.boolean().refine(val => val === true, { message: '${label} is required' })`\n : 'z.boolean().optional()'\n case 'multiselect':\n return isRequired\n ? `z.array(z.string()).min(1, '${label} is required')`\n : 'z.array(z.string()).optional()'\n case 'timezone':\n return isRequired ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'list':\n if (field.fields && field.fields.length > 0) {\n const nestedFields = field.fields\n .map((f) => `${f.name}: ${formFieldToZodType(f, options)}`)\n .join(', ')\n return isRequired\n ? `z.array(z.object({ ${nestedFields} })).min(1, '${label} is required')`\n : `z.array(z.object({ ${nestedFields} })).optional()`\n }\n return isRequired\n ? `z.array(z.string()).min(1, '${label} is required')`\n : 'z.array(z.string()).optional()'\n case 'file':\n case 'upload':\n return isRequired ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n default:\n return isRequired ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n }\n}\n\nfunction assertSupportedFormFieldType(field: FormField): void {\n if (typeof field.type === 'string' && isFormFieldType(field.type)) return\n throw new Error(\n `Form field \"${field.name || 'unnamed'}\" has unsupported type \"${String(field.type)}\".`\n )\n}\n\nfunction assertSupportedSchemaFieldTree(field: SchemaField): void {\n assertSupportedSchemaFieldType(field)\n if (field.fields) {\n for (const nestedField of field.fields) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n }\n if (field.items) {\n assertSupportedSchemaFieldTree(field.items as SchemaField)\n }\n if (field.tabs) {\n for (const tab of field.tabs) {\n for (const nestedField of tab.fields || []) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n for (const nestedField of getTabSlotFields(tab.slot)) {\n assertSupportedSchemaFieldTree(nestedField)\n }\n }\n }\n}\n\nfunction getTabSlotFields(slot: unknown): SchemaField[] {\n if (!isRecord(slot)) return []\n const fields: SchemaField[] = []\n for (const area of [slot.main, slot.sidebar]) {\n if (isRecord(area) && Array.isArray(area.fields)) {\n fields.push(...(area.fields as SchemaField[]))\n }\n }\n return fields\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction assertSupportedFormFieldTree(field: FormField): void {\n assertSupportedFormFieldType(field)\n if (field.fields) {\n for (const nestedField of field.fields) {\n assertSupportedFormFieldTree(nestedField)\n }\n }\n}\n","/**\n * Shared helpers for entity and single action generators\n */\n\nimport { toTypeScriptType } from '@core-engine/schema/type-mappers/index.js'\nimport type { GeneratedFile, SchemaField } from '@core-engine/schema/types.js'\nimport { toCamelCase } from '@core-engine/utils/string.js'\n\n// ============================================================================\n// Authorship Metadata Helpers\n// ============================================================================\n\nexport const AUTHORSHIP_FIELD_NAMES = ['createdBy', 'updatedBy'] as const\n\nexport function isAuthorshipFieldName(name: string): boolean {\n return (AUTHORSHIP_FIELD_NAMES as readonly string[]).includes(name)\n}\n\nexport function createAuthorshipFields(): SchemaField[] {\n return AUTHORSHIP_FIELD_NAMES.map((name) => ({\n name,\n type: 'text' as const,\n required: false\n }))\n}\n\nexport function buildAuthorshipUserType(): string {\n return `import type { AdminUserSummary } from '@admin/types'`\n}\n\nexport function buildAuthorshipDataFields(): string {\n return ` createdByUser: AdminUserSummary | null\n updatedByUser: AdminUserSummary | null`\n}\n\nexport function buildAuthorshipSelects(indent = ' '): string[] {\n return [\n `${indent}createdByUser: { id: createdByUser.id, name: createdByUser.name, email: createdByUser.email }`,\n `${indent}updatedByUser: { id: updatedByUser.id, name: updatedByUser.name, email: updatedByUser.email }`\n ]\n}\n\nexport function buildAuthorshipJoins(tableVar: string): string {\n return `.leftJoin(createdByUser, eq(${tableVar}.createdBy, createdByUser.id)).leftJoin(updatedByUser, eq(${tableVar}.updatedBy, updatedByUser.id))`\n}\n\nexport function buildAuthorshipAliasBlock(): string {\n return `const createdByUser = alias(user, 'created_by_user')\nconst updatedByUser = alias(user, 'updated_by_user')`\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface ActionsGeneratorResult {\n files: GeneratedFile[]\n}\n\n// ============================================================================\n// Field Mapping Helpers\n// ============================================================================\n\nexport function generateFieldMapping(field: SchemaField, source = 'input'): string {\n if (field.type === 'list') return `${source}.${field.name} || []`\n if (field.type === 'select' && field.multiple) return `${source}.${field.name} ?? []`\n if (\n (field.type === 'date' || field.type === 'timestamp' || field.type === 'time') &&\n !field.required\n ) {\n return `${source}.${field.name} && ${source}.${field.name} !== '' ? ${source}.${field.name} : null`\n }\n if (!field.required && ['string', 'varchar', 'text', 'select'].includes(field.type)) {\n return `${source}.${field.name} && ${source}.${field.name} !== '' ? ${source}.${field.name} : null`\n }\n return `${source}.${field.name}`\n}\n\nexport function getFieldType(field: SchemaField, mode: 'input' | 'output' = 'output'): string {\n return toTypeScriptType(field, mode)\n}\n\n// ============================================================================\n// Helper builders for relationship queries\n// ============================================================================\n\nexport function buildRelationshipSelect(\n allDbFields: SchemaField[],\n relationshipFields: SchemaField[],\n tableVar: string,\n htmlFields: SchemaField[] = [],\n extraSelects: string[] = [],\n extraJoins = ''\n): string {\n const fieldSelects = allDbFields\n .filter((f) => f.type !== 'relationship')\n .map((f) => ` ${f.name}: ${tableVar}.${f.name}`)\n const htmlSelects = htmlFields.map((f) => ` ${f.name}Html: ${tableVar}.${f.name}Html`)\n const regularSelects = [...fieldSelects, ...htmlSelects].join(',\\n')\n\n const relSelects = relationshipFields\n .map((f) => {\n const relTable = toCamelCase(f.relationship!)\n return ` ${f.name}: { id: ${relTable}.id, name: ${relTable}.name, title: ${relTable}.title, slug: ${relTable}.slug, label: ${relTable}.label }`\n })\n .join(',\\n')\n\n const joins = relationshipFields\n .map((f) => {\n const relTable = toCamelCase(f.relationship!)\n return `.leftJoin(${relTable}, eq(${tableVar}.${f.name}, ${relTable}.id))`\n })\n .join('')\n\n return `db.select({\\n${[regularSelects, relSelects, ...extraSelects].filter(Boolean).join(',\\n')}\\n }).from(${tableVar})${joins}${extraJoins}`\n}\n\nexport function buildResultMapping(\n allDbFields: SchemaField[],\n relationshipFields: SchemaField[],\n Plural: string,\n camelPlural: string,\n Singular: string,\n hasListRels = false\n): string {\n const relationshipDeclarations = relationshipFields\n .map(\n (f) =>\n ` const ${f.name} = row.${f.name} as { id?: string | null; name?: string | null; title?: string | null; slug?: string | null; label?: string | null } | null | undefined`\n )\n .join('\\n')\n const rowDeclarations = [\n relationshipDeclarations,\n ` const createdByUser = row.createdByUser as { id?: string | null; name?: string | null; email?: string | null } | null | undefined`,\n ` const updatedByUser = row.updatedByUser as { id?: string | null; name?: string | null; email?: string | null } | null | undefined`\n ]\n .filter(Boolean)\n .join('\\n')\n\n const rowMappings = allDbFields\n .map((f) => {\n if (f.type === 'relationship' && !f.multiple) {\n return ` ${f.name}: ${f.name}?.id ? { id: ${f.name}.id, name: ${f.name}.name ?? undefined, title: ${f.name}.title ?? undefined, slug: ${f.name}.slug ?? undefined, label: ${f.name}.label ?? undefined } : null`\n }\n return ` ${f.name}: row.${f.name}`\n })\n .concat([\n ` createdByUser: createdByUser?.id ? { id: createdByUser.id, name: createdByUser.name ?? '', email: createdByUser.email ?? '' } : null`,\n ` updatedByUser: updatedByUser?.id ? { id: updatedByUser.id, name: updatedByUser.name ?? '', email: updatedByUser.email ?? '' } : null`\n ])\n .join(',\\n')\n\n const mapBlock = `\n\n const mapped${Plural} = results.map((rawRow) => {\n const row = rawRow as Record<string, unknown>\n${rowDeclarations}\n\n return {\n${rowMappings}\n }\n })`\n\n if (hasListRels) {\n return `${mapBlock}\n\n const populated${Plural} = await Promise.all(\n mapped${Plural}.map(record => populate${Singular}ListRelationships(record as ${Singular}))\n )\n\n return {\n ${camelPlural}: populated${Plural},\n total\n }`\n }\n\n return `${mapBlock}\n\n return {\n ${camelPlural}: mapped${Plural} as ${Singular}[],\n total\n }`\n}\n\nexport function buildSingleRowMapping(\n allDbFields: SchemaField[],\n _relationshipFields: SchemaField[],\n typeName: string,\n htmlFields: SchemaField[] = []\n): string {\n const fieldMappings = allDbFields.map((f) => {\n if (f.type === 'relationship' && !f.multiple) {\n return ` ${f.name}: row.${f.name}?.id ? { id: row.${f.name}.id, name: row.${f.name}.name ?? undefined, title: row.${f.name}.title ?? undefined, slug: row.${f.name}.slug ?? undefined, label: row.${f.name}.label ?? undefined } : null`\n }\n return ` ${f.name}: row.${f.name}`\n })\n const htmlMappings = htmlFields.map((f) => ` ${f.name}Html: row.${f.name}Html`)\n const mappings = [\n ...fieldMappings,\n ...htmlMappings,\n ` createdByUser: row.createdByUser?.id ? { id: row.createdByUser.id, name: row.createdByUser.name, email: row.createdByUser.email } : null`,\n ` updatedByUser: row.updatedByUser?.id ? { id: row.updatedByUser.id, name: row.updatedByUser.name, email: row.updatedByUser.email } : null`\n ].join(',\\n')\n\n return `{\\n${mappings}\\n } as ${typeName}`\n}\n\nexport function buildExplicitSelect(\n fields: SchemaField[],\n tableVar: string,\n htmlFields: SchemaField[] = [],\n extraSelects: string[] = [],\n extraJoins = ''\n): string {\n const fieldSelects = fields.map((f) => ` ${f.name}: ${tableVar}.${f.name}`)\n const htmlSelects = htmlFields.map((f) => ` ${f.name}Html: ${tableVar}.${f.name}Html`)\n const selects = [...fieldSelects, ...htmlSelects, ...extraSelects].join(',\\n')\n return `db.select({\\n${selects}\\n }).from(${tableVar})${extraJoins}`\n}\n\n// ============================================================================\n// List-relationship helpers\n// ============================================================================\n\nexport function findListFieldsWithRelationships(\n fields: SchemaField[]\n): Array<{ field: SchemaField; path: string[] }> {\n const result: Array<{ field: SchemaField; path: string[] }> = []\n for (const field of fields) {\n if (field.type === 'list' && field.fields) {\n const hasRels = field.fields.some((f) => f.type === 'relationship' && f.relationship)\n if (hasRels) {\n result.push({ field, path: [field.name] })\n }\n }\n }\n return result\n}\n\nexport function generatePopulateListRelsFunction(\n queries: Array<{\n fieldPath: string\n relField: SchemaField\n relTable: string\n listFieldName: string\n }>,\n Singular: string\n): string {\n const blocks = queries.map((q) => {\n const v = `${q.fieldPath}_${q.relField.name}`\n return ` // ${q.listFieldName} -> ${q.relField.name}\n const ${v}Ids = record.${q.listFieldName} && Array.isArray(record.${q.listFieldName})\n ? (record.${q.listFieldName} as Record<string, unknown>[])\n .map((item) => item.${q.relField.name})\n .filter((id) => id != null && id !== '')\n .map((id) => String(id))\n : []\n\n const ${v}Results = ${v}Ids.length > 0\n ? await db.select().from(${q.relTable}).where(inArray(${q.relTable}.id, ${v}Ids))\n : []\n\n const ${v}Map = new Map(${v}Results.map((r) => [r.id, r]))\n\n if (record.${q.listFieldName} && Array.isArray(record.${q.listFieldName})) {\n record.${q.listFieldName} = (record.${q.listFieldName} as Record<string, unknown>[]).map((item) => {\n const relId = item.${q.relField.name} ? String(item.${q.relField.name}) : null\n return {\n ...item,\n ${q.relField.name}: relId ? ${v}Map.get(relId) || null : null\n }\n })\n }`\n })\n\n return `\n/**\n * Populate relationship fields inside list (JSONB) fields\n */\nasync function populate${Singular}ListRelationships(record: ${Singular}): Promise<${Singular}> {\n${blocks.join('\\n\\n')}\n\n return record\n}\n`\n}\n","import { isLayoutField } from '@core-engine/schema/constants.js'\nimport { flattenFields } from '@core-engine/schema/field-helpers/index.js'\nimport type {\n FieldType,\n Schema,\n SchemaField,\n SchemaFilter,\n SchemaFilterOption\n} from '@core-engine/schema/types.js'\nimport { createAuthorshipFields } from '@next-adapter/generators/actions/action-helpers.js'\n\nexport interface EntityFieldContext {\n dbFields: SchemaField[]\n regularDbFields: SchemaField[]\n allDbFields: SchemaField[]\n}\n\nexport type ResolvedEntityFilterType = 'select' | 'boolean' | 'date-range'\nexport type ResolvedEntityFilterSource = 'builtin' | 'distinct' | 'static'\nexport type BuiltInEntityFilterKey = 'status' | 'createdAt'\n\nexport interface ResolvedEntityFilter {\n key: string\n field: string\n label: string\n type: ResolvedEntityFilterType\n source: ResolvedEntityFilterSource\n options: SchemaFilterOption[]\n fieldType: FieldType\n builtIn?: BuiltInEntityFilterKey\n}\n\nconst FILTERABLE_FIELD_TYPES = new Set<FieldType>([\n 'string',\n 'varchar',\n 'text',\n 'boolean',\n 'number',\n 'decimal',\n 'date',\n 'timestamp',\n 'time',\n 'select'\n])\n\nconst BUILT_IN_FILTER_KEYS = new Set<BuiltInEntityFilterKey>(['status', 'createdAt'])\n\nfunction createAutoField(name: string, type: FieldType): SchemaField {\n return {\n name,\n type,\n required: true\n }\n}\n\nfunction getSchemaFieldByName(fields: SchemaField[], name: string): SchemaField | undefined {\n return fields.find((field) => field.name === name)\n}\n\nfunction ensureFilterableField(\n field: SchemaField | undefined,\n filter: SchemaFilter,\n schemaName: string\n): SchemaField {\n if (!field) {\n throw new Error(\n `Schema \"${schemaName}\" defines a filter for \"${filter.field}\", but that field does not exist.`\n )\n }\n\n if (!FILTERABLE_FIELD_TYPES.has(field.type)) {\n throw new Error(\n `Schema \"${schemaName}\" defines a filter for \"${filter.field}\", but \"${field.type}\" fields are not filterable.`\n )\n }\n\n return field\n}\n\nexport function getEntityFieldContext(schema: Schema): EntityFieldContext {\n const dbFields = flattenFields(schema.fields).filter((field) => !isLayoutField(field.type))\n const regularDbFields = dbFields.filter(\n (field) => !(field.type === 'relationship' && field.multiple === true)\n )\n\n const allDbFields = [...regularDbFields]\n\n if (schema.actions?.draft === true && !getSchemaFieldByName(allDbFields, 'published')) {\n allDbFields.push(createAutoField('published', 'boolean'))\n }\n\n if (!getSchemaFieldByName(allDbFields, 'createdAt')) {\n allDbFields.push(createAutoField('createdAt', 'timestamp'))\n }\n\n if (!getSchemaFieldByName(allDbFields, 'updatedAt')) {\n allDbFields.push(createAutoField('updatedAt', 'timestamp'))\n }\n\n for (const field of createAuthorshipFields()) {\n if (!getSchemaFieldByName(allDbFields, field.name)) {\n allDbFields.push(field)\n }\n }\n\n if (!getSchemaFieldByName(allDbFields, 'sortOrder')) {\n allDbFields.push(createAutoField('sortOrder', 'number'))\n }\n\n return {\n dbFields,\n regularDbFields,\n allDbFields\n }\n}\n\nexport function getFilterableFields(fields: SchemaField[]): SchemaField[] {\n return fields.filter(\n (field) =>\n !field.primaryKey && field.name !== 'sortOrder' && FILTERABLE_FIELD_TYPES.has(field.type)\n )\n}\n\nexport function resolveEntityFilters(schema: Schema): ResolvedEntityFilter[] {\n const { allDbFields } = getEntityFieldContext(schema)\n const resolved: ResolvedEntityFilter[] = []\n const seenKeys = new Set<string>()\n const reservedFields = new Set<string>()\n\n const publishedField = getSchemaFieldByName(allDbFields, 'published')\n if (publishedField?.type === 'boolean') {\n resolved.push({\n key: 'status',\n field: 'published',\n label: 'Status',\n type: 'select',\n source: 'builtin',\n options: [\n { label: 'Published', value: 'published' },\n { label: 'Draft', value: 'draft' }\n ],\n fieldType: publishedField.type,\n builtIn: 'status'\n })\n seenKeys.add('status')\n reservedFields.add('published')\n }\n\n const createdAtField = getSchemaFieldByName(allDbFields, 'createdAt')\n if (createdAtField) {\n resolved.push({\n key: 'createdAt',\n field: 'createdAt',\n label: 'Created',\n type: 'date-range',\n source: 'builtin',\n options: [],\n fieldType: createdAtField.type,\n builtIn: 'createdAt'\n })\n seenKeys.add('createdAt')\n reservedFields.add('createdAt')\n }\n\n for (const filter of schema.filters || []) {\n const key = filter.key || filter.field\n\n if (BUILT_IN_FILTER_KEYS.has(key as BuiltInEntityFilterKey)) {\n throw new Error(\n `Schema \"${schema.name}\" defines a filter with reserved key \"${key}\". Choose a different filter key.`\n )\n }\n\n if (seenKeys.has(key)) {\n throw new Error(\n `Schema \"${schema.name}\" defines duplicate filter key \"${key}\". Filter keys must be unique.`\n )\n }\n\n if (reservedFields.has(filter.field)) {\n throw new Error(\n `Schema \"${schema.name}\" defines a filter for \"${filter.field}\", but that field already has a built-in filter.`\n )\n }\n\n const field = ensureFilterableField(\n getSchemaFieldByName(allDbFields, filter.field),\n filter,\n schema.name\n )\n\n const type = filter.type ?? 'select'\n if (type === 'boolean' && field.type !== 'boolean') {\n throw new Error(\n `Schema \"${schema.name}\" defines boolean filter \"${key}\", but \"${filter.field}\" is not a boolean field.`\n )\n }\n\n const source =\n type === 'boolean'\n ? 'static'\n : (filter.source ?? (filter.options && filter.options.length > 0 ? 'static' : 'distinct'))\n\n const options =\n type === 'boolean'\n ? [\n { label: 'Yes', value: 'true' },\n { label: 'No', value: 'false' }\n ]\n : source === 'static'\n ? (filter.options ?? [])\n : []\n\n if (type === 'select' && source === 'static' && options.length === 0) {\n throw new Error(`Schema \"${schema.name}\" defines static filter \"${key}\" without any options.`)\n }\n\n resolved.push({\n key,\n field: filter.field,\n label: filter.label,\n type,\n source,\n options,\n fieldType: field.type\n })\n seenKeys.add(key)\n }\n\n return resolved\n}\n","import { isLayoutField } from '@core-engine/schema/constants.js'\nimport {\n flattenFields,\n getAllFormSchemaFields,\n getManyToManyFields\n} from '@core-engine/schema/field-helpers/index.js'\nimport type {\n FormField,\n FormSchema,\n GeneratedFile,\n Schema,\n SchemaField\n} from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport {\n pluralize,\n singularize,\n singularizeLabel,\n toCamelCase,\n toPascalCase\n} from '@core-engine/utils/string.js'\nimport {\n createAuthorshipFields,\n isAuthorshipFieldName\n} from '@next-adapter/generators/actions/action-helpers.js'\nimport { getEntityFieldContext } from '@next-adapter/generators/entity-filters.js'\n\ntype DevModeSnippetLanguage = 'tsx' | 'ts' | 'json'\ntype DevModeSchemaType = 'entity' | 'single' | 'form'\ntype DevModeSnippetIcon =\n | 'eye'\n | 'file-code'\n | 'inbox'\n | 'list'\n | 'pencil'\n | 'plus'\n | 'save'\n | 'send'\n | 'trash'\ntype DevModeSnippetKind = 'query' | 'mutation'\ntype DevModeLifecycleHookPhase = 'before' | 'after'\ntype DevModeLifecycleHookEvent =\n | 'beforeCreate'\n | 'afterCreate'\n | 'beforeUpdate'\n | 'afterUpdate'\n | 'beforeDelete'\n | 'afterDelete'\n | 'beforePublish'\n | 'afterPublish'\n | 'beforeUnpublish'\n | 'afterUnpublish'\n\ninterface DevModeSnippet {\n id: string\n label: string\n kind: DevModeSnippetKind\n icon: DevModeSnippetIcon\n language: DevModeSnippetLanguage\n code: string\n codeTabs?: DevModeSnippetCodeTab[]\n payloadExample?: DevModeSnippetExample\n responseExample: DevModeSnippetExample\n}\n\ninterface DevModeSnippetCodeTab {\n id: string\n label: string\n language: DevModeSnippetLanguage\n code: string\n}\n\ninterface DevModeSnippetExample {\n label: string\n language: DevModeSnippetLanguage\n code: string\n}\n\ninterface DevModeLifecycleHookExample {\n id: string\n label: string\n event: DevModeLifecycleHookEvent\n phase: DevModeLifecycleHookPhase\n icon: DevModeSnippetIcon\n language: DevModeSnippetLanguage\n code: string\n contextExample: DevModeSnippetExample\n}\n\nexport interface DevModeIntegrationArtifact {\n exportName: string\n importPath: string\n buttonExportName: string\n buttonImportPath: string\n files: GeneratedFile[]\n}\n\nconst ENTITY_ACTION_FIELD_EXCLUSIONS = new Set(['id', 'createdAt', 'updatedAt', 'sortOrder'])\nconst SINGLE_ACTION_FIELD_EXCLUSIONS = new Set(['id', 'createdAt', 'updatedAt'])\nconst DEFAULT_ADMIN_IMPORT_ALIAS = '@admin'\nconst SAMPLE_UUID = '00000000-0000-4000-8000-000000000001'\nconst SINGLETON_ID = '00000000-0000-0000-0000-000000000001'\n\nfunction isActionField(field: SchemaField, exclusions: Set<string>): boolean {\n return (\n !field.primaryKey &&\n !exclusions.has(field.name) &&\n !isAuthorshipFieldName(field.name) &&\n !isLayoutField(field.type)\n )\n}\n\nfunction formatPropertyName(name: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(name) ? name : JSON.stringify(name)\n}\n\nfunction formatJsonValue(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`\n}\n\nfunction createExample(label: string, value: unknown): DevModeSnippetExample {\n return {\n label,\n language: 'json',\n code: formatJsonValue(value)\n }\n}\n\nfunction isScalarIdentifierPayload(value: unknown): boolean {\n return (\n typeof value === 'string' &&\n /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)\n )\n}\n\nfunction createPayloadExample(value: unknown): DevModeSnippetExample | undefined {\n if (isScalarIdentifierPayload(value)) {\n return undefined\n }\n\n return createExample('Payload', value)\n}\n\nfunction createResponseExample(value: unknown): DevModeSnippetExample {\n return createExample('Response', value)\n}\n\nfunction toSampleArrayValue(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [value]\n}\n\nfunction formatTsValue(value: unknown, indent = 0): string {\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]'\n if (value.every((item) => item === null || typeof item !== 'object')) {\n return `[${value.map((item) => formatTsValue(item, indent)).join(', ')}]`\n }\n\n const childIndent = ' '.repeat(indent + 2)\n const currentIndent = ' '.repeat(indent)\n return `[\\n${value\n .map((item) => `${childIndent}${formatTsValue(item, indent + 2)}`)\n .join(',\\n')}\\n${currentIndent}]`\n }\n\n if (value && typeof value === 'object') {\n return formatTsObject(value as Record<string, unknown>, indent)\n }\n\n return JSON.stringify(value)\n}\n\nfunction formatTsObject(value: Record<string, unknown>, indent = 0): string {\n const entries = Object.entries(value)\n if (entries.length === 0) return '{}'\n\n const childIndent = ' '.repeat(indent + 2)\n const currentIndent = ' '.repeat(indent)\n return `{\\n${entries\n .map(\n ([key, entryValue]) =>\n `${childIndent}${formatPropertyName(key)}: ${formatTsValue(entryValue, indent + 2)}`\n )\n .join(',\\n')}\\n${currentIndent}}`\n}\n\nfunction sampleSchemaFieldValue(field: SchemaField): unknown {\n if (field.type === 'select') {\n if (field.default !== undefined) {\n return field.multiple ? toSampleArrayValue(field.default) : field.default\n }\n\n if (field.options && field.options.length > 0) {\n const firstValue = field.options[0].value\n return field.multiple ? [firstValue] : firstValue\n }\n\n const exampleValue = `Example ${field.label ?? field.name}`\n return field.multiple ? [exampleValue] : exampleValue\n }\n\n if (field.default !== undefined) {\n return field.default\n }\n\n switch (field.type) {\n case 'boolean':\n return true\n case 'number':\n case 'decimal':\n return 1\n case 'uuid':\n case 'serial':\n return SAMPLE_UUID\n case 'date':\n return '2026-01-01'\n case 'timestamp':\n return '2026-01-01T00:00:00.000Z'\n case 'time':\n return '09:00'\n case 'image':\n case 'video':\n case 'media':\n return 'media-id'\n case 'gallery':\n return ['media-id']\n case 'icon':\n return 'FileText'\n case 'relationship':\n return field.multiple ? [SAMPLE_UUID] : SAMPLE_UUID\n case 'list':\n if (field.fields && field.fields.length > 0) {\n return [\n Object.fromEntries(\n field.fields\n .filter((nestedField) => nestedField.name && !isLayoutField(nestedField.type))\n .map((nestedField) => [nestedField.name, sampleSchemaFieldValue(nestedField)])\n )\n ]\n }\n return ['Example item']\n default:\n return `Example ${field.label ?? field.name}`\n }\n}\n\nfunction sampleFormFieldValue(field: FormField): unknown {\n if (field.defaultValue !== undefined) {\n return field.defaultValue\n }\n\n if (field.options && field.options.length > 0) {\n const firstValue = field.options[0].value\n return field.type === 'multiselect' ? [firstValue] : firstValue\n }\n\n switch (field.type) {\n case 'email':\n return 'developer@example.com'\n case 'phone':\n return '+14155552671'\n case 'number':\n return 1\n case 'url':\n return 'https://example.com'\n case 'date':\n return '2026-01-01'\n case 'checkbox':\n return true\n case 'multiselect':\n return ['example']\n case 'file':\n case 'upload':\n return 'https://example.com/file.pdf'\n case 'timezone':\n return 'America/New_York'\n case 'list':\n if (field.fields && field.fields.length > 0) {\n return [\n Object.fromEntries(\n field.fields\n .filter((nestedField): nestedField is FormField & { name: string } =>\n Boolean(nestedField.name)\n )\n .map((nestedField) => [nestedField.name, sampleFormFieldValue(nestedField)])\n )\n ]\n }\n return ['Example item']\n default:\n return `Example ${field.label ?? field.name ?? 'value'}`\n }\n}\n\nfunction createInputObject(fields: SchemaField[]): Record<string, unknown> {\n return Object.fromEntries(fields.map((field) => [field.name, sampleSchemaFieldValue(field)]))\n}\n\nfunction createFormInputObject(fields: FormField[]): Record<string, unknown> {\n return Object.fromEntries(\n fields\n .filter((field): field is FormField & { name: string } => Boolean(field.name))\n .map((field) => [field.name, sampleFormFieldValue(field)])\n )\n}\n\nfunction getHtmlOutputFields(fields: SchemaField[]): SchemaField[] {\n return fields.filter((field) => {\n return (field.type === 'richtext' || field.type === 'markdown') && field.output === 'html'\n })\n}\n\nfunction sampleAdminMedia(): Record<string, unknown> {\n return {\n id: 'media-id',\n url: 'https://example.com/media.jpg',\n filename: 'media.jpg',\n contentType: 'image/jpeg',\n size: 102400,\n width: 1200,\n height: 800,\n alt: 'Example media',\n tags: ['example'],\n createdAt: '2026-01-01T00:00:00.000Z',\n updatedAt: '2026-01-01T00:00:00.000Z',\n createdBy: 'user-id',\n updatedBy: 'user-id'\n }\n}\n\nfunction sampleAdminUserSummary(): Record<string, unknown> {\n return {\n id: 'user-id',\n name: 'Admin User',\n email: 'admin@example.com'\n }\n}\n\nfunction sampleSchemaOutputValue(field: SchemaField): unknown {\n if (field.name === 'id') return SAMPLE_UUID\n if (field.name === 'createdAt' || field.name === 'updatedAt') return '2026-01-01T00:00:00.000Z'\n if (field.name === 'createdBy' || field.name === 'updatedBy') return 'user-id'\n\n if (field.type === 'relationship' && field.relationship && !field.multiple) {\n return {\n id: SAMPLE_UUID,\n name: 'Example related record',\n title: 'Example related record',\n slug: 'example-related-record',\n label: 'Example related record'\n }\n }\n\n return sampleSchemaFieldValue(field)\n}\n\nfunction sampleSingleOutputValue(field: SchemaField): unknown {\n if (field.name === 'id') return SINGLETON_ID\n\n return sampleSchemaOutputValue(field)\n}\n\nfunction createEntityDataObject(schema: Schema): Record<string, unknown> {\n const { allDbFields, regularDbFields } = getEntityFieldContext(schema)\n const htmlOutputFields = getHtmlOutputFields(regularDbFields)\n const manyToManyFields = getManyToManyFields(schema.fields)\n const mediaFields = regularDbFields.filter((field) => {\n return field.type === 'image' || field.type === 'video' || field.type === 'media'\n })\n const galleryFields = regularDbFields.filter((field) => field.type === 'gallery')\n\n return {\n ...Object.fromEntries(allDbFields.map((field) => [field.name, sampleSchemaOutputValue(field)])),\n ...Object.fromEntries(\n htmlOutputFields.map((field) => [\n `${field.name}Html`,\n `<p>${sampleSchemaFieldValue(field)}</p>`\n ])\n ),\n ...Object.fromEntries(manyToManyFields.map((field) => [field.name, [SAMPLE_UUID]])),\n ...Object.fromEntries(mediaFields.map((field) => [`${field.name}Media`, sampleAdminMedia()])),\n ...Object.fromEntries(\n galleryFields.map((field) => [`${field.name}Media`, [sampleAdminMedia()]])\n ),\n createdByUser: sampleAdminUserSummary(),\n updatedByUser: sampleAdminUserSummary()\n }\n}\n\nfunction getSingleAllDbFields(schema: Schema): SchemaField[] {\n const dbFields = flattenFields(schema.fields).filter(\n (field) =>\n !(field.type === 'relationship' && field.multiple === true) && !isLayoutField(field.type)\n )\n const allDbFields = [...dbFields]\n\n if (!allDbFields.some((field) => field.name === 'createdAt')) {\n allDbFields.push({ name: 'createdAt', type: 'timestamp' as const, required: true })\n }\n if (!allDbFields.some((field) => field.name === 'updatedAt')) {\n allDbFields.push({ name: 'updatedAt', type: 'timestamp' as const, required: true })\n }\n for (const field of createAuthorshipFields()) {\n if (!allDbFields.some((dbField) => dbField.name === field.name)) {\n allDbFields.push(field)\n }\n }\n\n return allDbFields\n}\n\nfunction createSingleDataObject(schema: Schema): Record<string, unknown> {\n const dbFields = getSingleAllDbFields(schema)\n const htmlOutputFields = getHtmlOutputFields(dbFields)\n\n return {\n ...Object.fromEntries(dbFields.map((field) => [field.name, sampleSingleOutputValue(field)])),\n ...Object.fromEntries(\n htmlOutputFields.map((field) => [\n `${field.name}Html`,\n `<p>${sampleSchemaFieldValue(field)}</p>`\n ])\n ),\n createdByUser: sampleAdminUserSummary(),\n updatedByUser: sampleAdminUserSummary()\n }\n}\n\nfunction createFormSubmissionObject(fields: FormField[]): Record<string, unknown> {\n return {\n id: SAMPLE_UUID,\n ...createFormInputObject(fields),\n ipAddress: '127.0.0.1',\n userAgent: 'Mozilla/5.0',\n submittedAt: '2026-01-01T00:00:00.000Z',\n createdAt: '2026-01-01T00:00:00.000Z',\n updatedAt: '2026-01-01T00:00:00.000Z'\n }\n}\n\nfunction resolveActionModulePath(\n actionImportPath: string,\n adminImportAlias = DEFAULT_ADMIN_IMPORT_ALIAS\n): string {\n return `${adminImportAlias}/actions/${actionImportPath}`\n}\n\nfunction createSnippetImportName(snippetId: string): string {\n return `${toCamelCase(snippetId)}Snippet`\n}\n\nfunction createLifecycleHookImportName(hookId: string): string {\n return `${toCamelCase(hookId)}LifecycleHook`\n}\n\nfunction createDevModeIntegrationArtifact(\n schema: Schema | FormSchema,\n schemaType: DevModeSchemaType,\n adminDir: string,\n snippets: DevModeSnippet[],\n lifecycleHooks: DevModeLifecycleHookExample[] = [],\n adminImportAlias = DEFAULT_ADMIN_IMPORT_ALIAS\n): DevModeIntegrationArtifact {\n const exportName = `${toCamelCase(schema.name)}DevModeIntegration`\n const loadExportName = `load${toPascalCase(schema.name)}DevModeIntegration`\n const buttonExportName = `${toPascalCase(schema.name)}DevModeIntegrateButton`\n const integrationDir = `${adminDir}/utils/dev-mode/${schema.name}`\n const dynamicImportNames = [\n 'schemaModule',\n ...snippets.map((snippet) => `${createSnippetImportName(snippet.id)}Module`),\n ...lifecycleHooks.map((hook) => `${createLifecycleHookImportName(hook.id)}Module`)\n ]\n const dynamicImports = [\n ` import('${adminImportAlias}/schemas/${schema.name}.json')`,\n ...snippets.map((snippet) => ` import('./snippets/${snippet.id}.json')`),\n ...lifecycleHooks.map((hook) => ` import('./lifecycle-hooks/${hook.id}.json')`)\n ].join(',\\n')\n const snippetValues = snippets\n .map((snippet) => ` ${createSnippetImportName(snippet.id)}Module.default`)\n .join(',\\n')\n const lifecycleHookValues = lifecycleHooks\n .map((hook) => ` ${createLifecycleHookImportName(hook.id)}Module.default`)\n .join(',\\n')\n const integrationContent = `import type {\n DevModeIntegration,\n DevModeIntegrationMetadata,\n DevModeLifecycleHookExample,\n DevModeSnippet\n} from '${adminImportAlias}/components/shared/dev-mode/dev-mode-types'\n\nexport const ${exportName} = {\n schemaName: ${JSON.stringify(schema.name)},\n schemaLabel: ${JSON.stringify(schema.label)},\n schemaType: ${JSON.stringify(schemaType)}\n} satisfies DevModeIntegrationMetadata\n\nexport async function ${loadExportName}(): Promise<DevModeIntegration> {\n const [${dynamicImportNames.join(', ')}] = await Promise.all([\n${dynamicImports}\n ])\n const snippets = [\n${snippetValues}\n ] as DevModeSnippet[]\n const lifecycleHooks = [\n${lifecycleHookValues}\n ] as DevModeLifecycleHookExample[]\n\n return {\n ...${exportName},\n schemaJson: JSON.stringify(schemaModule.default, null, 2),\n snippets,\n lifecycleHooks\n }\n}\n`\n const buttonContent = `'use client'\n\nimport type { Setting } from '${adminImportAlias}/actions/settings'\nimport { DevModeIntegrateButton } from '${adminImportAlias}/components/shared/dev-mode-integrate'\nimport { ${exportName}, ${loadExportName} } from './integration'\n\ninterface ${buttonExportName}Props {\n initialSettings?: Setting | null\n}\n\nexport function ${buttonExportName}({ initialSettings }: ${buttonExportName}Props) {\n return (\n <DevModeIntegrateButton\n integration={${exportName}}\n loadIntegration={${loadExportName}}\n initialSettings={initialSettings}\n />\n )\n}\n`\n\n return {\n exportName,\n importPath: `${adminImportAlias}/utils/dev-mode/${schema.name}/integration`,\n buttonExportName,\n buttonImportPath: `${adminImportAlias}/utils/dev-mode/${schema.name}/integrate-button`,\n files: [\n createGeneratedFile(`${integrationDir}/integration.ts`, integrationContent),\n createGeneratedFile(`${integrationDir}/integrate-button.tsx`, buttonContent),\n ...snippets.map((snippet) =>\n createGeneratedFile(\n `${integrationDir}/snippets/${snippet.id}.json`,\n `${JSON.stringify(snippet, null, 2)}\\n`\n )\n ),\n ...lifecycleHooks.map((hook) =>\n createGeneratedFile(\n `${integrationDir}/lifecycle-hooks/${hook.id}.json`,\n `${JSON.stringify(hook, null, 2)}\\n`\n )\n )\n ]\n }\n}\n\nexport function buildEntityDevModeIntegration(\n schema: Schema,\n adminDir: string,\n actionImportPath: string,\n adminImportAlias?: string\n): DevModeIntegrationArtifact {\n return createDevModeIntegrationArtifact(\n schema,\n 'entity',\n adminDir,\n buildEntityDevModeSnippets(schema, actionImportPath, adminImportAlias),\n buildEntityDevModeLifecycleHooks(schema, adminImportAlias),\n adminImportAlias\n )\n}\n\nfunction buildEntityDevModeSnippets(\n schema: Schema,\n actionImportPath: string,\n adminImportAlias?: string\n): DevModeSnippet[] {\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const Plural = toPascalCase(plural)\n const camelSingular = toCamelCase(singular)\n const camelPlural = toCamelCase(plural)\n const entityLabel = singularizeLabel(schema.label)\n const { regularDbFields } = getEntityFieldContext(schema)\n const inputFields = regularDbFields.filter((field) =>\n isActionField(field, ENTITY_ACTION_FIELD_EXCLUSIONS)\n )\n const hasSlugField = regularDbFields.some((field) => field.name === 'slug')\n const createInput: Record<string, unknown> = createInputObject(inputFields)\n const updateInput: Record<string, unknown> = { id: SAMPLE_UUID, ...createInput }\n const actionModulePath = resolveActionModulePath(actionImportPath, adminImportAlias)\n const detailByIdCode = `import { get${Singular}ById } from '${actionModulePath}'\n\nexport default async function ${Singular}Detail({ id }: { id: string }) {\n const ${camelSingular} = await get${Singular}ById(id)\n\n if (!${camelSingular}) {\n return null\n }\n\n return <pre>{JSON.stringify(${camelSingular}, null, 2)}</pre>\n}\n`\n const detailBySlugCode = `import { get${Singular}BySlug } from '${actionModulePath}'\n\nexport default async function ${Singular}Detail({ slug }: { slug: string }) {\n const ${camelSingular} = await get${Singular}BySlug(slug)\n\n if (!${camelSingular}) {\n return null\n }\n\n return <pre>{JSON.stringify(${camelSingular}, null, 2)}</pre>\n}\n`\n const detailCodeTabs: DevModeSnippetCodeTab[] | undefined = hasSlugField\n ? [\n { id: 'by-id', label: 'By ID', language: 'tsx', code: detailByIdCode },\n { id: 'by-slug', label: 'By Slug', language: 'tsx', code: detailBySlugCode }\n ]\n : undefined\n\n if (schema.actions?.draft === true) {\n createInput.published = true\n updateInput.published = true\n }\n\n const entityData = createEntityDataObject(schema)\n const listResponse = { [camelPlural]: [entityData], total: 1 }\n const createResponse = { success: true, [camelSingular]: entityData }\n const deleteResponse = { success: true }\n\n return [\n {\n id: 'list',\n label: `${schema.label} List`,\n kind: 'query',\n icon: 'list',\n language: 'tsx',\n responseExample: createResponseExample(listResponse),\n code: `import { get${Plural} } from '${actionModulePath}'\n\nexport default async function ${Plural}List() {\n const { ${camelPlural}, total } = await get${Plural}({ limit: 10, offset: 0 })\n\n return (\n <section>\n <h2>{total} ${schema.label.toLowerCase()}</h2>\n <pre>{JSON.stringify(${camelPlural}, null, 2)}</pre>\n </section>\n )\n}\n`\n },\n {\n id: 'detail',\n label: `${entityLabel} Detail`,\n kind: 'query',\n icon: 'eye',\n language: 'tsx',\n responseExample: createResponseExample(entityData),\n code: detailByIdCode,\n codeTabs: detailCodeTabs\n },\n {\n id: 'create',\n label: `Create ${entityLabel}`,\n kind: 'mutation',\n icon: 'plus',\n language: 'tsx',\n payloadExample: createPayloadExample(createInput),\n responseExample: createResponseExample(createResponse),\n code: `'use client'\n\nimport * as React from 'react'\nimport { create${Singular}, type ${Singular}CreateInput } from '${actionModulePath}'\n\nconst input: ${Singular}CreateInput = ${formatTsObject(createInput)}\n\nexport function Create${Singular}Button() {\n const [isPending, startTransition] = React.useTransition()\n\n return (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => {\n startTransition(async () => {\n await create${Singular}(input)\n })\n }}\n >\n Create ${entityLabel.toLowerCase()}\n </button>\n )\n}\n`\n },\n {\n id: 'update',\n label: `Update ${entityLabel}`,\n kind: 'mutation',\n icon: 'pencil',\n language: 'tsx',\n payloadExample: createPayloadExample(updateInput),\n responseExample: createResponseExample(createResponse),\n code: `'use client'\n\nimport * as React from 'react'\nimport { update${Singular}, type ${Singular}UpdateInput } from '${actionModulePath}'\n\nexport function Update${Singular}Button({ id }: { id: string }) {\n const [isPending, startTransition] = React.useTransition()\n const input: ${Singular}UpdateInput = ${formatTsObject(updateInput).replace(`id: \"${SAMPLE_UUID}\"`, 'id')}\n\n return (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => {\n startTransition(async () => {\n await update${Singular}(input)\n })\n }}\n >\n Update ${entityLabel.toLowerCase()}\n </button>\n )\n}\n`\n },\n {\n id: 'delete',\n label: `Delete ${entityLabel}`,\n kind: 'mutation',\n icon: 'trash',\n language: 'tsx',\n payloadExample: createPayloadExample(SAMPLE_UUID),\n responseExample: createResponseExample(deleteResponse),\n code: `'use client'\n\nimport * as React from 'react'\nimport { delete${Singular} } from '${actionModulePath}'\n\nexport function Delete${Singular}Button({ id }: { id: string }) {\n const [isPending, startTransition] = React.useTransition()\n\n return (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => {\n startTransition(async () => {\n await delete${Singular}(id)\n })\n }}\n >\n Delete ${entityLabel.toLowerCase()}\n </button>\n )\n}\n`\n }\n ]\n}\n\nfunction lifecycleHookId(event: DevModeLifecycleHookEvent): string {\n return event.replace(/([A-Z])/g, '-$1').toLowerCase()\n}\n\nfunction lifecycleHookPhase(event: DevModeLifecycleHookEvent): DevModeLifecycleHookPhase {\n return event.startsWith('before') ? 'before' : 'after'\n}\n\nfunction lifecycleHookIcon(event: DevModeLifecycleHookEvent): DevModeSnippetIcon {\n if (event.endsWith('Create')) return 'plus'\n if (event.endsWith('Update')) return 'pencil'\n if (event.endsWith('Delete')) return 'trash'\n if (event.endsWith('Publish')) return 'send'\n return 'save'\n}\n\nfunction lifecycleHookActionLabel(event: DevModeLifecycleHookEvent): string {\n return event.replace(/([A-Z])/g, ' $1').toLowerCase()\n}\n\nfunction lifecycleHookCode(\n schemaName: string,\n event: DevModeLifecycleHookEvent,\n entityLabel: string,\n adminImportAlias = DEFAULT_ADMIN_IMPORT_ALIAS\n): string {\n const actionLabel = lifecycleHookActionLabel(event)\n\n if (lifecycleHookPhase(event) === 'before') {\n return `import { registerHook } from '${adminImportAlias}/lib/lifecycle-hooks'\n\nregisterHook('${schemaName}', '${event}', async (ctx) => {\n console.log('${entityLabel} ${actionLabel} requested', {\n actorId: ctx.user.id,\n entityId: ctx.entityId,\n input: ctx.input\n })\n\n // Return an abort result to stop this mutation.\n // return { abort: true, reason: '${entityLabel} is not ready for this change' }\n})\n`\n }\n\n return `import { registerHook } from '${adminImportAlias}/lib/lifecycle-hooks'\n\nregisterHook('${schemaName}', '${event}', async (ctx) => {\n await fetch('https://example.com/webhooks/${schemaName}/${lifecycleHookId(event)}', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n actorId: ctx.user.id,\n entityType: ctx.entityType,\n entityId: ctx.entityId,\n data: ctx.data\n })\n })\n})\n`\n}\n\nfunction lifecycleHookContextExample(\n event: DevModeLifecycleHookEvent,\n schemaName: string,\n input: Record<string, unknown>,\n data: Record<string, unknown>\n): DevModeSnippetExample {\n const phase = lifecycleHookPhase(event)\n const context: Record<string, unknown> = {\n user: sampleAdminUserSummary(),\n entityType: schemaName,\n timestamp: '2026-01-01T00:00:00.000Z'\n }\n\n if (event !== 'beforeCreate' && event !== 'afterCreate') {\n context.entityId = SAMPLE_UUID\n }\n if (phase === 'before' && !event.endsWith('Delete')) {\n context.input = event.endsWith('Publish')\n ? { ...input, published: true }\n : event.endsWith('Unpublish')\n ? { published: false }\n : input\n }\n if (phase === 'after' && !event.endsWith('Delete')) {\n context.entityId = SAMPLE_UUID\n context.data = data\n }\n\n return createExample('Context', context)\n}\n\nfunction buildEntityDevModeLifecycleHooks(\n schema: Schema,\n adminImportAlias?: string\n): DevModeLifecycleHookExample[] {\n const entityLabel = singularizeLabel(schema.label)\n const { regularDbFields } = getEntityFieldContext(schema)\n const inputFields = regularDbFields.filter((field) =>\n isActionField(field, ENTITY_ACTION_FIELD_EXCLUSIONS)\n )\n const input = createInputObject(inputFields)\n const data = createEntityDataObject(schema)\n const events: DevModeLifecycleHookEvent[] = [\n 'beforeCreate',\n 'afterCreate',\n 'beforeUpdate',\n 'afterUpdate',\n 'beforeDelete',\n 'afterDelete'\n ]\n\n if (schema.actions?.draft === true) {\n events.push('beforePublish', 'afterPublish', 'beforeUnpublish', 'afterUnpublish')\n }\n\n return events.map((event) => ({\n id: lifecycleHookId(event),\n label: event,\n event,\n phase: lifecycleHookPhase(event),\n icon: lifecycleHookIcon(event),\n language: 'ts',\n code: lifecycleHookCode(schema.name, event, entityLabel, adminImportAlias),\n contextExample: lifecycleHookContextExample(event, schema.name, input, data)\n }))\n}\n\nexport function buildSingleDevModeIntegration(\n schema: Schema,\n adminDir: string,\n actionImportPath: string,\n adminImportAlias?: string\n): DevModeIntegrationArtifact {\n return createDevModeIntegrationArtifact(\n schema,\n 'single',\n adminDir,\n buildSingleDevModeSnippets(schema, actionImportPath, adminImportAlias),\n [],\n adminImportAlias\n )\n}\n\nfunction buildSingleDevModeSnippets(\n schema: Schema,\n actionImportPath: string,\n adminImportAlias?: string\n): DevModeSnippet[] {\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n const camelSingular = toCamelCase(singular)\n const singleLabel = schema.label\n const inputFields = flattenFields(schema.fields)\n .filter((field) => !(field.type === 'relationship' && field.multiple === true))\n .filter((field) => isActionField(field, SINGLE_ACTION_FIELD_EXCLUSIONS))\n const upsertInput = createInputObject(inputFields)\n const actionModulePath = resolveActionModulePath(actionImportPath, adminImportAlias)\n const singleData = createSingleDataObject(schema)\n const upsertResponse = { success: true, [camelSingular]: singleData }\n\n return [\n {\n id: 'read',\n label: `${singleLabel} Read`,\n kind: 'query',\n icon: 'eye',\n language: 'tsx',\n responseExample: createResponseExample(singleData),\n code: `import { get${Singular} } from '${actionModulePath}'\n\nexport default async function ${Singular}Summary() {\n const ${camelSingular} = await get${Singular}()\n\n if (!${camelSingular}) {\n return null\n }\n\n return <pre>{JSON.stringify(${camelSingular}, null, 2)}</pre>\n}\n`\n },\n {\n id: 'upsert',\n label: `Save ${singleLabel}`,\n kind: 'mutation',\n icon: 'save',\n language: 'tsx',\n payloadExample: createPayloadExample(upsertInput),\n responseExample: createResponseExample(upsertResponse),\n code: `'use client'\n\nimport * as React from 'react'\nimport { upsert${Singular}, type ${Singular}UpsertInput } from '${actionModulePath}'\n\nconst input: ${Singular}UpsertInput = ${formatTsObject(upsertInput)}\n\nexport function Save${Singular}Button() {\n const [isPending, startTransition] = React.useTransition()\n\n return (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => {\n startTransition(async () => {\n await upsert${Singular}(input)\n })\n }}\n >\n Save ${schema.label.toLowerCase()}\n </button>\n )\n}\n`\n }\n ]\n}\n\nexport function buildFormDevModeIntegration(\n schema: FormSchema,\n adminDir: string,\n actionImportPath: string,\n adminImportAlias?: string\n): DevModeIntegrationArtifact {\n return createDevModeIntegrationArtifact(\n schema,\n 'form',\n adminDir,\n buildFormDevModeSnippets(schema, actionImportPath, adminImportAlias),\n [],\n adminImportAlias\n )\n}\n\nfunction buildFormDevModeSnippets(\n schema: FormSchema,\n actionImportPath: string,\n adminImportAlias?: string\n): DevModeSnippet[] {\n const pascal = toPascalCase(schema.name)\n const fields = getAllFormSchemaFields(schema)\n const submissionInput = createFormInputObject(fields)\n const actionModulePath = resolveActionModulePath(actionImportPath, adminImportAlias)\n const submissionData = createFormSubmissionObject(fields)\n const submitResponse = { success: true, submission: submissionData }\n const submissionsResponse = { submissions: [submissionData], total: 1 }\n const deleteResponse = { success: true }\n const formLabel = schema.label\n\n return [\n {\n id: 'submit',\n label: `Submit ${formLabel}`,\n kind: 'mutation',\n icon: 'send',\n language: 'tsx',\n payloadExample: createPayloadExample(submissionInput),\n responseExample: createResponseExample(submitResponse),\n code: `'use client'\n\nimport * as React from 'react'\nimport {\n create${pascal}Submission,\n type Create${pascal}SubmissionInput\n} from '${actionModulePath}'\n\nconst input: Create${pascal}SubmissionInput = ${formatTsObject(submissionInput)}\n\nexport function ${pascal}SubmitButton() {\n const [isPending, startTransition] = React.useTransition()\n\n return (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => {\n startTransition(async () => {\n await create${pascal}Submission(input)\n })\n }}\n >\n Submit ${schema.label.toLowerCase()}\n </button>\n )\n}\n`\n },\n {\n id: 'submissions',\n label: `${formLabel} Submissions`,\n kind: 'query',\n icon: 'inbox',\n language: 'tsx',\n responseExample: createResponseExample(submissionsResponse),\n code: `import { get${pascal}Submissions } from '${actionModulePath}'\n\nexport default async function ${pascal}Submissions() {\n const { submissions, total } = await get${pascal}Submissions({ limit: 10, offset: 0 })\n\n return (\n <section>\n <h2>{total} ${schema.label.toLowerCase()} submissions</h2>\n <pre>{JSON.stringify(submissions, null, 2)}</pre>\n </section>\n )\n}\n`\n },\n {\n id: 'delete',\n label: `Delete ${formLabel} Submission`,\n kind: 'mutation',\n icon: 'trash',\n language: 'tsx',\n payloadExample: createPayloadExample(SAMPLE_UUID),\n responseExample: createResponseExample(deleteResponse),\n code: `'use client'\n\nimport * as React from 'react'\nimport { delete${pascal}Submission } from '${actionModulePath}'\n\nexport function Delete${pascal}SubmissionButton({ id }: { id: string }) {\n const [isPending, startTransition] = React.useTransition()\n\n return (\n <button\n type=\"button\"\n disabled={isPending}\n onClick={() => {\n startTransition(async () => {\n await delete${pascal}Submission(id)\n })\n }}\n >\n Delete submission\n </button>\n )\n}\n`\n }\n ]\n}\n","import type { TableColumnSize } from '@core-engine/schema/types.js'\n\nconst TABLE_COLUMN_SIZE_PRESETS: Record<TableColumnSize, number> = {\n sm: 120,\n default: 220,\n lg: 320,\n xl: 420\n}\n\nexport function getTableColumnSize(size: TableColumnSize | undefined): number {\n return TABLE_COLUMN_SIZE_PRESETS[size ?? 'default'] ?? TABLE_COLUMN_SIZE_PRESETS.default\n}\n\nexport function buildColumnSize(size: TableColumnSize | undefined): string {\n return `size: ${getTableColumnSize(size)},\\n `\n}\n","import type { FormActions, FormColumn, FormField } from '@core-engine/schema/types.js'\nimport { buildColumnSize, getTableColumnSize } from '@next-adapter/generators/table-column-size.js'\n\n// ============================================================================\n// Column Definition Helper\n// ============================================================================\n\nfunction generateColumnDef(col: FormColumn): string {\n const sortableHeader = col.sortable\n ? `header: ({ column }) => {\n const sortDirection = column.getIsSorted()\n\n return (\n <Button\n variant=\"ghost\"\n onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}\n className=\"w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group\"\n >\n <span className=\"truncate\">${col.header}</span>\n <SortIndicator direction={sortDirection} />\n </Button>\n )\n }`\n : `header: '${col.header}'`\n\n let cellDef: string\n switch (col.type) {\n case 'email':\n cellDef = `cell: ({ row }) => {\n const email = row.getValue('${col.accessorKey}') as string\n return email ? <a href={\\`mailto:\\${email}\\`} className=\"text-primary hover:underline\">{email}</a> : '-'\n }`\n break\n case 'date':\n cellDef = `cell: ({ row }) => {\n const date = row.getValue('${col.accessorKey}') as string\n return date ? new Date(date).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }) : '-'\n }`\n break\n case 'badge':\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${col.accessorKey}') as string\n return <Badge variant=\"outline\">{value || 'N/A'}</Badge>\n }`\n break\n case 'number':\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${col.accessorKey}') as number\n return <div className=\"text-right\">{value !== null && value !== undefined ? value : '-'}</div>\n }`\n break\n default:\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${col.accessorKey}') as string\n return <div>{value || '-'}</div>\n }`\n }\n\n return ` {\n accessorKey: '${col.accessorKey}',\n ${buildColumnSize(col.size)}${sortableHeader},\n ${cellDef}\n }`\n}\n\n// ============================================================================\n// Columns Generator\n// ============================================================================\n\nexport function generateColumns(\n fields: FormField[],\n pascal: string,\n kebab: string,\n _camel: string,\n actionImportPath: string,\n customColumns?: FormColumn[],\n adminRoutePath = '/admin',\n actions?: FormActions\n): string {\n const hasBadge = customColumns?.some((c) => c.type === 'badge') ?? false\n const hasDelete = actions?.delete !== false\n\n const columnDefs = customColumns\n ? customColumns.map((col) => generateColumnDef(col)).join(',\\n')\n : fields\n .filter((f) => f.name)\n .map((f) => {\n const accessor = f.name!\n return ` {\n accessorKey: '${accessor}',\n size: ${getTableColumnSize('default')},\n header: ({ column }) => {\n const sortDirection = column.getIsSorted()\n\n return (\n <Button\n variant=\"ghost\"\n onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}\n className=\"w-full min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group\"\n >\n <span className=\"truncate\">${f.label}</span>\n <SortIndicator direction={sortDirection} />\n </Button>\n )\n },\n cell: ({ row }) => {\n const value = row.getValue('${accessor}')\n return <div>${f.type === 'textarea' ? \"{value ? String(value).substring(0, 100) + (String(value).length > 100 ? '...' : '') : '-'}\" : \"{String(value ?? '-')}\"}</div>\n }\n }`\n })\n .join(',\\n')\n\n const deleteImport = hasDelete\n ? `import { ${pascal}DeleteAction } from './${kebab}-delete-action'\\n`\n : ''\n\n return `'use client'\n\nimport { SortIndicator } from '@admin/components/shared/sort-indicator'\nimport type { ${pascal}SubmissionData } from '@admin/actions/${actionImportPath}'\n${deleteImport}${hasBadge ? \"import { Badge } from '@admin/components/ui/badge'\\n\" : ''}import { Button } from '@admin/components/ui/button'\nimport { Checkbox } from '@admin/components/ui/checkbox'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Eye } from 'lucide-react'\nimport Link from 'next/link'\n\nexport const columns: ColumnDef<${pascal}SubmissionData>[] = [\n {\n id: 'select',\n size: 50,\n enableResizing: false,\n meta: { width: '50px' },\n header: ({ table }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}\n onCheckedChange={(value: boolean) => table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n ),\n cell: ({ row }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value: boolean) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n ),\n enableSorting: false,\n enableHiding: false\n },\n${columnDefs},\n {\n id: 'actions',\n size: 100,\n enableResizing: false,\n meta: { width: '100px' },\n header: () => <span className=\"sr-only\">Actions</span>,\n cell: ({ row }) => {\n const submission = row.original\n return (\n <div className=\"flex justify-end items-center gap-2\">\n <Button variant=\"outline\" size=\"icon\" className=\"size-8\" asChild>\n <Link href={\\`${adminRoutePath}/forms/${kebab}/\\${submission.id}/view\\`}>\n <Eye className=\"size-3\" />\n <span className=\"sr-only\">View</span>\n </Link>\n </Button>${hasDelete ? `\\n <${pascal}DeleteAction id={submission.id} />` : ''}\n </div>\n )\n }\n }\n]\n`\n}\n","/**\n * Generator for the per-row DeleteAction component used by form-admin columns.\n *\n * Emits a small client component that owns the delete dialog state for a\n * single form submission. Lives next to columns.tsx so columns can stay\n * declarative.\n */\n\nexport function generateFormDeleteActionFile(params: {\n pascal: string\n camel: string\n actionImportPath: string\n}): string {\n const { pascal, camel, actionImportPath } = params\n\n return `'use client'\n\nimport { delete${pascal}Submission } from '@admin/actions/${actionImportPath}'\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger\n} from '@admin/components/ui/alert-dialog'\nimport { Button } from '@admin/components/ui/button'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { Trash } from 'lucide-react'\nimport { useState, useTransition } from 'react'\nimport { toast } from 'sonner'\n\nexport function ${pascal}DeleteAction({ id }: { id: string }) {\n const [open, setOpen] = useState(false)\n const [isPending, startTransition] = useTransition()\n const queryClient = useQueryClient()\n\n const handleDelete = () => {\n startTransition(async () => {\n try {\n const result = await delete${pascal}Submission(id)\n if (result.success) {\n toast.success('Submission deleted successfully')\n queryClient.refetchQueries({ queryKey: ['${camel}-submissions'] })\n setOpen(false)\n } else {\n toast.error(result.error || 'Failed to delete submission')\n }\n } catch {\n toast.error('An error occurred')\n }\n })\n }\n\n return (\n <AlertDialog open={open} onOpenChange={setOpen}>\n <AlertDialogTrigger asChild>\n <Button variant=\"destructive\" size=\"icon\" className=\"size-8\">\n <Trash className=\"size-3\" />\n <span className=\"sr-only\">Delete</span>\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Are you sure?</AlertDialogTitle>\n <AlertDialogDescription>\n This will permanently delete this submission.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(e: React.MouseEvent) => { e.preventDefault(); handleDelete() }}\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )\n}\n`\n}\n","export function generatePage(pascal: string, kebab: string): string {\n return `import { getSetting } from '@admin/actions/settings'\nimport { Suspense } from 'react'\nimport { ${pascal}SubmissionsPageContent } from './${kebab}-submissions-page-content'\nimport { ${pascal}SubmissionsPageSkeleton } from './${kebab}-submissions-page-skeleton'\nimport { columns } from './columns'\n\nexport default async function Page() {\n const initialSettings = await getSetting()\n\n return (\n <Suspense fallback={<${pascal}SubmissionsPageSkeleton />}>\n <${pascal}SubmissionsPageContent columns={columns} initialSettings={initialSettings} />\n </Suspense>\n )\n}\n`\n}\n\nexport function generatePageSkeleton(pascal: string): string {\n return `export function ${pascal}SubmissionsPageSkeleton() {\n return <div className=\"p-6\">Loading...</div>\n}\n`\n}\n","export function generatePageContent(\n pascal: string,\n kebab: string,\n camel: string,\n label: string,\n actionImportPath: string,\n adminRoutePath = '/admin',\n devModeIntegrateButtonExportName: string,\n devModeIntegrateButtonImportPath: string,\n hasExport = false\n): string {\n const exportIconImport = hasExport ? 'Download, ' : ''\n const exportHookImport = hasExport\n ? `\\nimport { useExport${pascal}SubmissionsCSV } from '@admin/hooks/use-${kebab}-form'`\n : ''\n const exportHook = hasExport ? `\\n const exportCsv = useExport${pascal}SubmissionsCSV()` : ''\n const exportButton = hasExport\n ? `\n <Button\n variant=\"outline\"\n onClick={() => exportCsv.mutate()}\n disabled={exportCsv.isPending}\n >\n <Download className=\"size-3.5\" />\n Export CSV\n </Button>`\n : ''\n return `'use client'\n\nimport type { Setting } from '@admin/actions/settings'\nimport { useIsFetching, useQueryClient } from '@tanstack/react-query'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ${exportIconImport}Settings } from 'lucide-react'\nimport Link from 'next/link'\nimport { parseAsArrayOf, parseAsInteger, parseAsString, useQueryState, useQueryStates } from 'nuqs'\nimport * as React from 'react'\nimport { toast } from 'sonner'\nimport type { ${pascal}SubmissionData } from '@admin/actions/${actionImportPath}'\nimport { deleteBulk${pascal}Submissions } from '@admin/actions/${actionImportPath}'\nimport { DeleteDialog } from '@admin/components/shared/delete-dialog'\nimport { EntityFiltersBar } from '@admin/components/shared/entity-filters-bar'\nimport { PageHeader } from '@admin/components/shared/page-header'\nimport { Button } from '@admin/components/ui/button'\nimport { ${devModeIntegrateButtonExportName} } from '${devModeIntegrateButtonImportPath}'${exportHookImport}\nimport { ${pascal}SubmissionsTable } from './${kebab}-submissions-table'\n\ninterface ${pascal}SubmissionsPageContentProps<TValue> {\n columns: ColumnDef<${pascal}SubmissionData, TValue>[]\n initialSettings?: Setting | null\n}\n\nexport function ${pascal}SubmissionsPageContent<TValue>({\n columns,\n initialSettings\n}: ${pascal}SubmissionsPageContentProps<TValue>) {\n const queryClient = useQueryClient()\n const isSearchFetching = useIsFetching({ queryKey: ['${camel}-submissions'] }) > 0${exportHook}\n const [search, setSearch] = useQueryState('q', parseAsString.withDefault(''))\n const [, setPageIndex] = useQueryState('page', parseAsInteger.withDefault(0))\n const filterParsers = {\n submittedAtFrom: parseAsString.withDefault(''),\n submittedAtTo: parseAsString.withDefault(''),\n } as const\n const [filterValues, setFilters] = useQueryStates(filterParsers)\n const submittedAtFrom = filterValues.submittedAtFrom\n const submittedAtTo = filterValues.submittedAtTo\n const [selectedIds, setSelectedIds] = useQueryState(\n 'selected',\n parseAsArrayOf(parseAsString).withDefault([])\n )\n const [isPending, startTransition] = React.useTransition()\n\n const handleBulkDelete = () => {\n startTransition(async () => {\n try {\n const result = await deleteBulk${pascal}Submissions(selectedIds)\n\n if (result.success) {\n toast.success(\n \\`\\${selectedIds.length} submission\\${selectedIds.length > 1 ? 's' : ''} deleted successfully\\`\n )\n queryClient.refetchQueries({ queryKey: ['${camel}-submissions'] })\n void setSelectedIds([])\n } else {\n toast.error(result.error || 'Failed to delete submissions')\n }\n } catch (error) {\n toast.error('An error occurred')\n console.error(error)\n }\n })\n }\n\n const activeFilterCount = [search, (submittedAtFrom || submittedAtTo)].filter(Boolean).length\n\n const handleSearch = React.useCallback((value: string | null) => {\n React.startTransition(() => {\n void setPageIndex(0)\n void setSearch(value)\n })\n }, [setSearch, setPageIndex])\n\n const handleClearAll = React.useCallback(() => {\n React.startTransition(() => {\n void setPageIndex(0)\n void setSearch(null)\n void setFilters({\n submittedAtFrom: null,\n submittedAtTo: null\n })\n })\n }, [setSearch, setFilters, setPageIndex])\n\n const filters = [\n {\n key: 'submittedAt',\n label: 'Submitted',\n type: 'date-range' as const,\n from: submittedAtFrom,\n to: submittedAtTo\n }\n ]\n\n return (\n <React.Fragment>\n <PageHeader\n title=\"${label}\"\n actions={\n <div className=\"flex items-center gap-1\">\n <${devModeIntegrateButtonExportName} initialSettings={initialSettings} />${exportButton}\n <Button variant=\"outline\" asChild>\n <Link href=\"${adminRoutePath}/forms/${kebab}/settings\">\n <Settings className=\"size-3.5\" />\n Settings\n </Link>\n </Button>\n </div>\n }\n />\n <EntityFiltersBar\n filters={filters}\n activeFilterCount={activeFilterCount}\n onFilterChange={(updates) => {\n React.startTransition(() => {\n void setPageIndex(0)\n void setFilters(updates)\n })\n }}\n onClearAll={handleClearAll}\n search={search}\n searchPlaceholder=\"Search ${label.toLowerCase()} submissions...\"\n isPending={isSearchFetching}\n onSearch={handleSearch}\n actions={\n selectedIds.length > 0 ? (\n <DeleteDialog\n count={selectedIds.length}\n entityName=\"submission\"\n onConfirm={handleBulkDelete}\n isPending={isPending}\n />\n ) : null\n }\n />\n <main className=\"space-y-4 pb-6 px-4\">\n <${pascal}SubmissionsTable\n columns={columns}\n selectedIds={selectedIds}\n setSelectedIds={setSelectedIds}\n search={search}\n submittedAtFrom={submittedAtFrom}\n submittedAtTo={submittedAtTo}\n />\n </main>\n </React.Fragment>\n )\n}\n`\n}\n","export function generateSettingsPage(pascal: string, kebab: string): string {\n return `import { getFormSettings } from '@admin/actions/forms'\nimport { ${pascal}SettingsPageContent } from './settings-page-content'\n\nexport default async function ${pascal}SettingsPage() {\n const settings = await getFormSettings('${kebab}')\n\n return <${pascal}SettingsPageContent initialSettings={settings} />\n}\n`\n}\n\nexport function generateSettingsPageContent(pascal: string, kebab: string, label: string): string {\n return `'use client'\n\nimport {\n testFormWebhook,\n type FormSettingsData,\n upsertFormSettings,\n} from '@admin/actions/forms'\nimport { PageHeader } from '@admin/components/shared/page-header'\nimport { Button } from '@admin/components/ui/button'\nimport { Input } from '@admin/components/ui/input'\nimport { Label } from '@admin/components/ui/label'\nimport { Switch } from '@admin/components/ui/switch'\nimport { Textarea } from '@admin/components/ui/textarea'\nimport { LoaderCircle } from 'lucide-react'\nimport * as React from 'react'\nimport { toast } from 'sonner'\n\ninterface ${pascal}SettingsPageContentProps {\n initialSettings: FormSettingsData | null\n}\n\nexport function ${pascal}SettingsPageContent({\n initialSettings,\n}: ${pascal}SettingsPageContentProps) {\n const [notificationEmails, setNotificationEmails] = React.useState(\n initialSettings?.notificationEmails ?? ''\n )\n const [webhookUrl, setWebhookUrl] = React.useState(initialSettings?.webhookUrl ?? '')\n const [webhookEnabled, setWebhookEnabled] = React.useState(\n initialSettings?.webhookEnabled ?? false\n )\n const [isSaving, startSaveTransition] = React.useTransition()\n const [isTesting, startTestTransition] = React.useTransition()\n\n const handleSave = () => {\n startSaveTransition(async () => {\n const result = await upsertFormSettings('${kebab}', {\n notificationEmails: notificationEmails || null,\n webhookUrl: webhookUrl || null,\n webhookEnabled,\n })\n if (result.success) {\n toast.success('Settings saved successfully')\n } else {\n toast.error(result.error || 'Failed to save settings')\n }\n })\n }\n\n const handleTestWebhook = () => {\n startTestTransition(async () => {\n const result = await testFormWebhook('${kebab}')\n if (result.success) {\n toast.success('Test webhook sent successfully')\n } else {\n toast.error(result.error || 'Failed to send test webhook')\n }\n })\n }\n\n return (\n <>\n <PageHeader title=\"${label} Settings\" />\n <div className=\"space-y-6 rounded-lg border p-6 mx-6 mt-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"notificationEmails\">Notification Emails</Label>\n <Textarea\n id=\"notificationEmails\"\n placeholder=\"email@example.com, another@example.com\"\n value={notificationEmails}\n onChange={(e) => setNotificationEmails(e.target.value)}\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">\n Comma-separated list of email addresses to notify on new submissions.\n </p>\n </div>\n\n <div className=\"space-y-4 border-t pt-6\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"webhookUrl\">Webhook URL</Label>\n <Input\n id=\"webhookUrl\"\n type=\"url\"\n placeholder=\"https://hooks.example.com/endpoint\"\n value={webhookUrl}\n onChange={(e) => setWebhookUrl(e.target.value)}\n />\n <p className=\"text-xs text-muted-foreground\">\n Receive a POST request with form data on each submission.\n </p>\n </div>\n\n <div className=\"flex items-center space-x-2\">\n <Switch\n id=\"webhookEnabled\"\n checked={webhookEnabled}\n onCheckedChange={setWebhookEnabled}\n />\n <Label htmlFor=\"webhookEnabled\">Enable Webhook</Label>\n </div>\n\n {webhookUrl && webhookEnabled && (\n <Button\n variant=\"outline\"\n onClick={handleTestWebhook}\n disabled={isTesting}\n >\n {isTesting ? (\n <>\n <LoaderCircle className=\"animate-spin\" />\n Sending...\n </>\n ) : (\n 'Test Webhook'\n )}\n </Button>\n )}\n </div>\n\n <div className=\"border-t pt-6\">\n <Button onClick={handleSave} disabled={isSaving}>\n {isSaving ? (\n <>\n <LoaderCircle className=\"animate-spin\" />\n Saving...\n </>\n ) : (\n 'Save Settings'\n )}\n </Button>\n </div>\n </div>\n </>\n )\n}\n`\n}\n","export function generateTable(\n pascal: string,\n kebab: string,\n label: string,\n actionImportPath: string,\n adminRoutePath = '/admin'\n): string {\n return `'use client'\n\nimport type { ${pascal}SubmissionData } from '@admin/actions/${actionImportPath}'\nimport { DataTablePagination } from '@admin/components/shared/data-table/data-table-pagination'\nimport { use${pascal}Submissions } from '@admin/hooks/use-${kebab}-form'\nimport { useTableUtils } from '@admin/hooks/use-table-utils'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@admin/components/ui/table'\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n type SortingState,\n useReactTable,\n} from '@tanstack/react-table'\nimport { GripVertical } from 'lucide-react'\nimport { useRouter } from 'next/navigation'\nimport { parseAsInteger, parseAsString, useQueryState } from 'nuqs'\nimport * as React from 'react'\nimport { cn } from '@admin/utils/shared/cn'\n\ninterface ${pascal}SubmissionsTableProps<TValue> {\n columns: ColumnDef<${pascal}SubmissionData, TValue>[]\n selectedIds: string[]\n setSelectedIds: (ids: string[]) => void\n search?: string\n submittedAtFrom?: string\n submittedAtTo?: string\n}\n\nexport function ${pascal}SubmissionsTable<TValue>({\n columns,\n selectedIds,\n setSelectedIds,\n search,\n submittedAtFrom,\n submittedAtTo,\n}: ${pascal}SubmissionsTableProps<TValue>) {\n const router = useRouter()\n const [pageIndex, setPageIndex] = useQueryState('page', parseAsInteger.withDefault(0))\n const [pageSize, setPageSize] = useQueryState('size', parseAsInteger.withDefault(20))\n const [sortField, setSortField] = useQueryState('sort', parseAsString.withDefault(''))\n const [sortDir, setSortDir] = useQueryState('dir', parseAsString.withDefault(''))\n\n const orderBy = sortField || undefined\n const orderDirection = (sortDir as 'asc' | 'desc') || undefined\n\n const { data, error, isPending } = use${pascal}Submissions(\n search,\n submittedAtFrom,\n submittedAtTo,\n pageIndex,\n pageSize,\n orderBy,\n orderDirection\n )\n const {\n columnSizing,\n handleColumnSizingChange,\n hoveredColumnId,\n registerTable,\n resetColumnSizingToContainer,\n setHoveredColumnId,\n tableContainerRef\n } = useTableUtils<${pascal}SubmissionData>()\n\n const tableData = data?.submissions ?? []\n const totalRows = data?.total ?? 0\n const effectivePageSize = pageSize === -1 ? totalRows : pageSize\n const pageCount = effectivePageSize > 0 ? Math.ceil(totalRows / effectivePageSize) : 1\n\n const sorting: SortingState = sortField\n ? [{ id: sortField, desc: sortDir === 'desc' }]\n : []\n\n const handleSortingChange = React.useCallback(\n (updater: SortingState | ((old: SortingState) => SortingState)) => {\n const newSorting = typeof updater === 'function' ? updater(sorting) : updater\n React.startTransition(() => {\n if (newSorting.length === 0) {\n void setSortField(null)\n void setSortDir(null)\n } else {\n void setSortField(newSorting[0].id)\n void setSortDir(newSorting[0].desc ? 'desc' : 'asc')\n }\n void setPageIndex(0)\n })\n },\n [sorting, setSortField, setSortDir, setPageIndex]\n )\n\n const rowSelection = React.useMemo(() => {\n const selection: Record<string, boolean> = {}\n const submissions = data?.submissions ?? []\n submissions.forEach((submission, index) => {\n if (selectedIds.includes(submission.id)) {\n selection[index.toString()] = true\n }\n })\n return selection\n }, [selectedIds, data?.submissions])\n\n const handleRowSelectionChange = React.useCallback(\n (updater: Record<string, boolean> | ((old: Record<string, boolean>) => Record<string, boolean>)) => {\n const submissions = data?.submissions ?? []\n const newSelection = typeof updater === 'function' ? updater(rowSelection) : updater\n\n const currentPageSelectedIds = new Set(\n Object.keys(newSelection)\n .filter((key) => newSelection[key])\n .map((key) => submissions[Number.parseInt(key, 10)]?.id)\n .filter((id): id is string => Boolean(id))\n )\n\n const currentPageIds = new Set(submissions.map((item) => item.id))\n const otherPageIds = selectedIds.filter((id) => !currentPageIds.has(id))\n setSelectedIds([...otherPageIds, ...currentPageSelectedIds])\n },\n [data?.submissions, rowSelection, selectedIds, setSelectedIds]\n )\n\n const handlePaginationChange = React.useCallback(\n (\n updater:\n | { pageIndex: number; pageSize: number }\n | ((old: { pageIndex: number; pageSize: number }) => {\n pageIndex: number\n pageSize: number\n }),\n ) => {\n const current = { pageIndex, pageSize: effectivePageSize }\n const next = typeof updater === 'function' ? updater(current) : updater\n React.startTransition(() => {\n void setPageIndex(next.pageIndex)\n })\n },\n [pageIndex, effectivePageSize, setPageIndex]\n )\n\n const table = useReactTable({\n data: tableData,\n columns,\n columnResizeMode: 'onChange',\n defaultColumn: {\n minSize: 48,\n size: 220\n },\n getCoreRowModel: getCoreRowModel(),\n manualPagination: true,\n manualSorting: true,\n pageCount,\n rowCount: totalRows,\n onSortingChange: handleSortingChange,\n onColumnSizingChange: handleColumnSizingChange,\n onRowSelectionChange: handleRowSelectionChange,\n onPaginationChange: handlePaginationChange,\n state: {\n sorting,\n columnSizing,\n rowSelection,\n pagination: {\n pageIndex,\n pageSize: effectivePageSize\n }\n }\n })\n registerTable(table)\n\n return (\n <div className=\"space-y-6 pb-24\">\n <div ref={tableContainerRef} className=\"overflow-hidden material-sm border-border\">\n <Table className=\"table-fixed\" style={{ width: table.getTotalSize() }}>\n <colgroup>\n {table.getVisibleLeafColumns().map((column) => (\n <col key={column.id} style={{ width: column.getSize() }} />\n ))}\n </colgroup>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header, headerIndex) => {\n const meta = header.column.columnDef.meta as Record<string, unknown> | undefined\n const resizeLabel = typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : header.column.id\n const nextHeader = headerGroup.headers[headerIndex + 1]\n const canResizeColumn = header.column.getCanResize() && nextHeader?.column.getCanResize() === true\n return (\n <TableHead\n key={header.id}\n className={cn('group/resize-header relative overflow-hidden', {\n 'text-center': meta?.align === 'center',\n 'text-right': meta?.align === 'right'\n })}\n data-column-id={header.column.id}\n onMouseEnter={() => setHoveredColumnId(header.column.id)}\n onMouseLeave={() => setHoveredColumnId((current) => (current === header.column.id ? null : current))}\n style={{ width: header.getSize() }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {canResizeColumn ? (\n <button\n type=\"button\"\n aria-label={\\`Resize \\${resizeLabel} column\\`}\n className=\"group/resize-handle absolute right-0 top-0 z-10 flex h-full w-5 cursor-col-resize touch-none select-none items-center justify-center text-muted-foreground opacity-0 transition-opacity hover:text-foreground focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none group-focus-within/resize-header:opacity-100 data-[column-hovered=true]:opacity-100 data-[resizing=true]:opacity-100\"\n data-resize-handle\n data-column-hovered={hoveredColumnId === header.column.id ? 'true' : 'false'}\n data-resizing={header.column.getIsResizing() ? 'true' : 'false'}\n onDoubleClick={resetColumnSizingToContainer}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n >\n <GripVertical aria-hidden=\"true\" className={cn('size-3.5', { 'text-ring': header.column.getIsResizing() })} />\n </button>\n ) : null}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isPending ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n <div className=\"text-muted-foreground\">Loading ${label} submissions...</div>\n </TableCell>\n </TableRow>\n ) : error ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n <div className=\"text-destructive\">Error loading ${label} submissions: {error.message}</div>\n </TableCell>\n </TableRow>\n ) : table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() ? 'selected' : undefined}\n className=\"cursor-pointer\"\n onClick={(e) => {\n const target = e.target as HTMLElement\n if (!e.currentTarget.contains(target)) return\n if (target.closest('button, a, input, [role=\"checkbox\"]')) return\n router.push(\\`${adminRoutePath}/forms/${kebab}/\\${row.original.id}/view\\`)\n }}\n >\n {row.getVisibleCells().map((cell) => {\n const meta = cell.column.columnDef.meta as Record<string, unknown> | undefined\n return (\n <TableCell\n key={cell.id}\n className={cn({\n 'text-center': meta?.align === 'center',\n 'text-right': meta?.align === 'right'\n })}\n data-column-id={cell.column.id}\n onMouseEnter={() => setHoveredColumnId(cell.column.id)}\n onMouseLeave={() => setHoveredColumnId((current) => (current === cell.column.id ? null : current))}\n style={{ width: cell.column.getSize() }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No ${label} submissions found.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n\n <DataTablePagination\n table={table}\n paginationMode=\"controlled\"\n pageSize={pageSize}\n pageIndex={pageIndex}\n pageCount={pageCount}\n setPageIndex={setPageIndex}\n setPageSize={(nextPageSize) => {\n void setPageSize(nextPageSize)\n void setPageIndex(0)\n }}\n />\n </div>\n )\n}\n`\n}\n","import type { FormField } from '@core-engine/schema/types.js'\n\nexport function generateViewPage(\n pascal: string,\n _kebab: string,\n fields: FormField[],\n label: string,\n includeDynamic: boolean,\n actionImportPath: string,\n _nextMajorVersion = 16\n): string {\n const fieldItems = fields\n .filter((f) => f.name)\n .map((f) => {\n const name = f.name!\n const lbl = f.label\n\n if (f.type === 'email') {\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <p className=\"text-sm\">\n {submission.${name} ? (\n <a href={\\`mailto:\\${submission.${name}}\\`} className=\"text-primary hover:underline\">{submission.${name}}</a>\n ) : '-'}\n </p>\n </div>`\n }\n if (f.type === 'textarea') {\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <p className=\"text-sm whitespace-pre-wrap\">{submission.${name} || '-'}</p>\n </div>`\n }\n if (f.type === 'checkbox') {\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <p className=\"text-sm\">{submission.${name} ? 'Yes' : 'No'}</p>\n </div>`\n }\n if (f.type === 'date') {\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <p className=\"text-sm\">{submission.${name} ? new Date(submission.${name}).toLocaleDateString() : '-'}</p>\n </div>`\n }\n if (f.type === 'url') {\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <p className=\"text-sm\">\n {submission.${name} ? (\n <a href={submission.${name}} target=\"_blank\" rel=\"noopener noreferrer\" className=\"text-primary hover:underline break-all\">{submission.${name}}</a>\n ) : '-'}\n </p>\n </div>`\n }\n if (f.type === 'list' || f.type === 'multiselect') {\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <div className=\"text-sm\">\n {Array.isArray(submission.${name}) && submission.${name}.length > 0 ? (\n <ul className=\"list-disc list-inside space-y-1\">\n {submission.${name}.map((item: Record<string, unknown>, idx: number) => (\n <li key={idx}>{typeof item === 'string' ? item : Object.entries(item).map(([k, v]) => \\`\\${k}: \\${v}\\`).join(', ')}</li>\n ))}\n </ul>\n ) : '-'}\n </div>\n </div>`\n }\n return ` <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-muted-foreground\">${lbl}</p>\n <p className=\"text-sm\">{submission.${name} ?? '-'}</p>\n </div>`\n })\n .join('\\n')\n\n const customFieldsSection = includeDynamic\n ? `\n {submission.customFields && Object.keys(submission.customFields).length > 0 && (\n <div className=\"space-y-3 border-t pt-4\">\n <p className=\"text-sm font-semibold text-muted-foreground\">Custom Fields</p>\n {Object.entries(submission.customFields).map(([key, value]) => (\n <div key={key} className=\"space-y-1\">\n <p className=\"text-sm font-medium capitalize\">{key.replace(/([A-Z])/g, ' $1').trim()}</p>\n <p className=\"text-sm\">{value !== null && value !== undefined ? String(value) : '-'}</p>\n </div>\n ))}\n </div>\n )}`\n : ''\n\n return `import { get${pascal}Submission } from '@admin/actions/${actionImportPath}'\nimport { PageHeader } from '@admin/components/shared/page-header'\nimport { notFound } from 'next/navigation'\n\ninterface PageProps {\n params: Promise<{ id: string }>\n}\n\nexport default async function Page({ params }: PageProps) {\n const { id } = await params\n const submission = await get${pascal}Submission(id)\n\n if (!submission) {\n notFound()\n }\n\n return (\n <>\n <PageHeader title=\"${label} Submission\" />\n <div className=\"rounded-lg border p-6 mx-6 mt-6 space-y-4\">\n${fieldItems}${customFieldsSection}\n <div className=\"space-y-1 border-t pt-4\">\n <p className=\"text-sm font-medium text-muted-foreground\">Submitted At</p>\n <p className=\"text-sm\">\n {new Date(submission.submittedAt).toLocaleString('en-US', {\n month: 'long', day: 'numeric', year: 'numeric',\n hour: 'numeric', minute: '2-digit'\n })}\n </p>\n </div>\n </div>\n </>\n )\n}\n`\n}\n","/**\n * Form admin pages generator: creates admin UI for viewing/managing form submissions\n *\n * Generates under (authenticated)/forms/<name>/:\n * page.tsx, columns.tsx, <name>-submissions-table.tsx,\n * <name>-submissions-page-content.tsx, [id]/view/page.tsx\n */\n\nimport {\n getAllFormSchemaFields,\n hasDynamicFields\n} from '@core-engine/schema/field-helpers/index.js'\nimport type { FormSchema, GeneratedFile, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { buildFormDevModeIntegration } from '@next-adapter/generators/dev-mode-integration.js'\nimport { generateColumns } from '@next-adapter/generators/form-admin/admin-columns.js'\nimport { generateFormDeleteActionFile } from '@next-adapter/generators/form-admin/admin-delete-action.js'\nimport {\n generatePage,\n generatePageSkeleton\n} from '@next-adapter/generators/form-admin/admin-page.js'\nimport { generatePageContent } from '@next-adapter/generators/form-admin/admin-page-content.js'\nimport {\n generateSettingsPage,\n generateSettingsPageContent\n} from '@next-adapter/generators/form-admin/admin-settings-page.js'\nimport { generateTable } from '@next-adapter/generators/form-admin/admin-table.js'\nimport { generateViewPage } from '@next-adapter/generators/form-admin/admin-view-page.js'\n\n// ============================================================================\n// Result Type\n// ============================================================================\n\nexport interface FormAdminPagesResult {\n files: GeneratedFile[]\n}\n\n// ============================================================================\n// Generator\n// ============================================================================\n\nexport function generateFormAdminPages(\n schema: FormSchema,\n pagesDir: string,\n options: GeneratorOptions\n): FormAdminPagesResult {\n const formName = schema.name\n const kebab = toKebabCase(formName)\n const pascal = toPascalCase(formName)\n const camel = toCamelCase(formName)\n const actionImportPath = resolveSchemaActionImportPath(formName, options.outputNamespace)\n const adminRoutePath = options.adminRoutePath ?? '/admin'\n const devModeIntegration = buildFormDevModeIntegration(\n schema,\n options.adminDir ?? 'admin',\n actionImportPath,\n options.adminImportAlias\n )\n const fields = getAllFormSchemaFields(schema)\n const hasDelete = schema.actions?.delete !== false\n const hasExport = schema.actions?.export === true\n const baseFiles: GeneratedFile[] = [\n createGeneratedFile(`${pagesDir}/forms/${kebab}/page.tsx`, generatePage(pascal, kebab)),\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/${kebab}-submissions-page-skeleton.tsx`,\n generatePageSkeleton(pascal)\n ),\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/columns.tsx`,\n generateColumns(\n fields,\n pascal,\n kebab,\n camel,\n actionImportPath,\n schema.columns,\n adminRoutePath,\n schema.actions\n )\n )\n ]\n if (hasDelete) {\n baseFiles.push(\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/${kebab}-delete-action.tsx`,\n generateFormDeleteActionFile({ pascal, camel, actionImportPath })\n )\n )\n }\n return {\n files: [\n ...baseFiles,\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/${kebab}-submissions-table.tsx`,\n generateTable(pascal, kebab, schema.label, actionImportPath, adminRoutePath)\n ),\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/${kebab}-submissions-page-content.tsx`,\n generatePageContent(\n pascal,\n kebab,\n camel,\n schema.label,\n actionImportPath,\n adminRoutePath,\n devModeIntegration.buttonExportName,\n devModeIntegration.buttonImportPath,\n hasExport\n )\n ),\n ...devModeIntegration.files,\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/[id]/view/page.tsx`,\n generateViewPage(\n pascal,\n kebab,\n fields,\n schema.label,\n hasDynamicFields(schema),\n actionImportPath,\n options.nextMajorVersion\n )\n ),\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/settings/page.tsx`,\n generateSettingsPage(pascal, kebab)\n ),\n createGeneratedFile(\n `${pagesDir}/forms/${kebab}/settings/settings-page-content.tsx`,\n generateSettingsPageContent(pascal, kebab, schema.label)\n )\n ]\n }\n}\n","/**\n * Form navigation generator: emits a per-form nav extract under admin/data/navigation/\n */\n\nimport type { FormSchema, GeneratedFile, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase, toKebabCase } from '@core-engine/utils/string.js'\n\nexport interface FormNavigationResult {\n files: GeneratedFile[]\n}\n\nexport function updateFormNavigation(\n schema: FormSchema,\n navigationDir: string,\n options: GeneratorOptions = {}\n): FormNavigationResult {\n const adminRoutePath = options.adminRoutePath ?? '/admin'\n const icon = schema.icon || 'Inbox'\n const group = schema.navGroup?.label ?? 'Forms'\n const groupIcon = schema.navGroup?.icon ?? 'Inbox'\n const kebabName = toKebabCase(schema.name)\n const lines = [\n ` label: '${schema.label}'`,\n ` href: '${adminRoutePath}/forms/${kebabName}'`,\n ` icon: ${icon}`,\n ` group: '${group}'`,\n ` groupIcon: ${groupIcon}`\n ]\n\n if (schema.navGroup?.position != null) {\n lines.push(` groupPosition: ${schema.navGroup.position}`)\n }\n\n if (schema.navPosition != null) {\n lines.push(` position: ${schema.navPosition}`)\n }\n\n const content = `import type { AdminNavigationItem } from '@admin/types/navigation'\nimport { ${Array.from(new Set([icon, groupIcon]))\n .sort()\n .join(', ')} } from 'lucide-react'\n\nexport const ${toCamelCase(schema.name)}Nav: AdminNavigationItem[] = [\n {\n${lines.join(',\\n')}\n }\n]\n`\n\n return {\n files: [createGeneratedFile(`${navigationDir}/${schema.name}.ts`, content)]\n }\n}\n","/**\n * Form pipeline step 2: Server actions for form submissions\n * Split into individual files with barrel index.ts\n */\n\nimport { getAllFormSchemaFields } from '@core-engine/schema/field-helpers/index.js'\nimport type {\n FormField,\n FormSchema,\n GeneratedFile,\n GeneratorOptions\n} from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionDir } from '@next-adapter/config/paths.js'\n\ninterface StepResult {\n files: GeneratedFile[]\n}\n\nconst SEARCHABLE_FORM_FIELD_TYPES = new Set<FormField['type']>([\n 'text',\n 'textarea',\n 'email',\n 'phone',\n 'url',\n 'select',\n 'radio'\n])\n\nconst SORTABLE_FORM_FIELD_TYPES = new Set<FormField['type']>([\n 'text',\n 'textarea',\n 'email',\n 'phone',\n 'number',\n 'url',\n 'date',\n 'select',\n 'radio',\n 'checkbox',\n 'timezone'\n])\n\nfunction getSearchableSubmissionFields(fields: FormField[]): string[] {\n return Array.from(\n new Set(\n fields\n .filter((field): field is FormField & { name: string } => Boolean(field.name))\n .filter((field) => SEARCHABLE_FORM_FIELD_TYPES.has(field.type))\n .map((field) => field.name)\n )\n )\n}\n\nfunction getSortableSubmissionFields(schema: FormSchema, fields: FormField[]): string[] {\n if (schema.columns && schema.columns.length > 0) {\n return Array.from(\n new Set(\n schema.columns.filter((column) => column.sortable).map((column) => column.accessorKey)\n )\n )\n }\n\n return Array.from(\n new Set(\n fields\n .filter((field): field is FormField & { name: string } => Boolean(field.name))\n .filter((field) => SORTABLE_FORM_FIELD_TYPES.has(field.type))\n .map((field) => field.name)\n )\n )\n}\n\nfunction generateMailchimpCode(schema: FormSchema, fields: FormField[]): string {\n if (!schema.mailchimp) return ''\n\n let emailFieldName: string\n if (typeof schema.mailchimp === 'object' && schema.mailchimp.emailField) {\n emailFieldName = schema.mailchimp.emailField\n } else {\n const emailField = fields.find((f) => f.type === 'email')\n if (!emailField || !emailField.name) {\n console.warn(\n `Warning: Form \"${schema.name}\" has mailchimp enabled but no email field found. Skipping.`\n )\n return ''\n }\n emailFieldName = emailField.name\n }\n\n return `\\n // Add to Mailchimp audience (fire-and-forget, non-blocking)\n addToMailchimpAudience(data.${emailFieldName})`\n}\n\nexport function generateFormActions(\n schema: FormSchema,\n actionsDir: string,\n options: GeneratorOptions\n): StepResult {\n const schemaActionDir = resolveSchemaActionDir(actionsDir, schema.name, options.outputNamespace)\n const formName = schema.name\n const tableName = `${toCamelCase(formName)}Submissions`\n const pascal = toPascalCase(formName)\n const kebab = toKebabCase(formName)\n const formSettingsKey = kebab\n const fields = getAllFormSchemaFields(schema)\n const searchFields = getSearchableSubmissionFields(fields)\n const sortableFields = getSortableSubmissionFields(schema, fields)\n const nextMajor = options.nextMajorVersion ?? 16\n const cacheInvalidationFn = nextMajor >= 16 ? 'updateTag' : 'revalidateTag'\n const cacheReadImport =\n nextMajor >= 16\n ? `import { cacheLife, cacheTag } from 'next/cache'`\n : `import { unstable_cacheTag as cacheTag } from 'next/cache'`\n const cacheLifeLine = nextMajor >= 16 ? `\\n cacheLife('max')` : ''\n const idPlaceholder = '$' + '{id}'\n\n const dataFields = fields\n .map((f) => {\n let tsType = 'string'\n if (f.type === 'number') tsType = 'number'\n else if (f.type === 'checkbox') tsType = 'boolean'\n else if (f.type === 'multiselect') tsType = 'string[]'\n else if (f.type === 'list') {\n tsType = f.fields && f.fields.length > 0 ? 'Record<string, unknown>[]' : 'string[]'\n }\n const isReq = f.required && !f.condition\n const opt = isReq ? '' : '?'\n const nullable = isReq ? '' : ' | null'\n return ` ${f.name}${opt}: ${tsType}${nullable}`\n })\n .join('\\n')\n\n const validation = fields\n .filter((f) => f.required && !f.condition)\n .map((f) => {\n const error = `return { success: false, error: '${f.label || f.name} is required' }`\n let check: string\n if (f.type === 'checkbox') {\n check = `data.${f.name} !== true`\n } else if (f.type === 'number') {\n check = `data.${f.name} === undefined || data.${f.name} === null`\n } else if (f.type === 'multiselect' || f.type === 'list') {\n check = `!Array.isArray(data.${f.name}) || data.${f.name}.length === 0`\n } else {\n check = `data.${f.name} === undefined || data.${f.name} === null || data.${f.name} === ''`\n }\n return `if (${check}) {\\n ${error}\\n }`\n })\n .join('\\n ')\n\n const mailchimpImport = schema.mailchimp\n ? `\\nimport { addToMailchimpAudience } from '@admin/actions/mailchimp/add-to-mailchimp-audience'`\n : ''\n const mailchimpCall = generateMailchimpCode(schema, fields)\n\n const emailField = fields.find((f) => f.type === 'email')\n const submitterEmailField = emailField?.name ?? null\n const schemaNotificationFallback = schema.notificationEmail\n ? `[${JSON.stringify(schema.notificationEmail)}]`\n : 'process.env.NOTIFICATION_EMAIL\\n ? [process.env.NOTIFICATION_EMAIL]\\n : []'\n\n const sortableColumnsMap = sortableFields\n .map((field) => ` '${field}': ${tableName}.${field}`)\n .join(',\\n')\n\n const searchBlock =\n searchFields.length > 0\n ? ` const search = filters?.search\n if (search && typeof search === 'string' && search.trim()) {\n const searchTerm = \\`%\\${search.trim().toLowerCase()}%\\`\n conditions.push(\n or(\n${searchFields.map((field) => ` ilike(${tableName}.${field}, searchTerm)`).join(',\\n')}\n )\n )\n }\n`\n : ''\n\n const getSubmissionsDrizzleImports = ['and', 'asc', 'desc', 'gte', 'lt', 'sql']\n if (searchFields.length > 0) {\n getSubmissionsDrizzleImports.push('ilike', 'or')\n }\n\n const typesContent = `export interface ${pascal}SubmissionData {\n id: string\n${dataFields}\n ipAddress: string | null\n userAgent: string | null\n submittedAt: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface ${pascal}SubmissionsResponse {\n submissions: ${pascal}SubmissionData[]\n total: number\n}\n\nexport interface Get${pascal}SubmissionsFilters {\n search?: string\n submittedAtFrom?: string\n submittedAtTo?: string\n limit?: number\n offset?: number\n orderBy?: string\n orderDirection?: 'asc' | 'desc'\n}\n\nexport interface Create${pascal}SubmissionInput {\n${dataFields}\n ipAddress?: string\n userAgent?: string\n}\n\nexport interface Create${pascal}SubmissionResult {\n success: boolean\n error?: string\n submission?: ${pascal}SubmissionData\n}\n\nexport interface Delete${pascal}SubmissionResult {\n success: boolean\n error?: string\n count?: number\n}\n\nexport const CACHE_TAG = '${formName}:submissions:all'\nexport const CACHE_TAG_BY_ID = (id: string) => \\`${formName}:submissions:id:${idPlaceholder}\\`\n`\n\n const getSubmissionsContent = `'use server'\n\nimport { ${getSubmissionsDrizzleImports.sort().join(', ')} } from 'drizzle-orm'\nimport db from '@admin/db'\nimport { ${tableName} } from '@admin/db/schema'\n${cacheReadImport}\nimport { CACHE_TAG } from './types'\nimport type {\n Get${pascal}SubmissionsFilters,\n ${pascal}SubmissionsResponse,\n ${pascal}SubmissionData\n} from './types'\n\nfunction getExclusiveDateUpperBound(value?: string): string | null {\n if (!value) return null\n\n const date = new Date(\\`\\${value}T00:00:00.000Z\\`)\n if (Number.isNaN(date.getTime())) return null\n\n date.setUTCDate(date.getUTCDate() + 1)\n return date.toISOString().slice(0, 10)\n}\n\nconst SORTABLE_COLUMNS = {\n${sortableColumnsMap}\n} as const\n\nexport async function get${pascal}Submissions(\n filters?: Get${pascal}SubmissionsFilters\n): Promise<${pascal}SubmissionsResponse> {\n 'use cache'${cacheLifeLine}\n cacheTag(CACHE_TAG)\n\n try {\n const conditions = []\n${searchBlock} if (filters?.submittedAtFrom) {\n conditions.push(gte(${tableName}.submittedAt, filters.submittedAtFrom))\n }\n const submittedAtExclusiveTo = getExclusiveDateUpperBound(filters?.submittedAtTo)\n if (submittedAtExclusiveTo) {\n conditions.push(lt(${tableName}.submittedAt, submittedAtExclusiveTo))\n }\n\n const query = db.select().from(${tableName})\n\n const sortColumn = filters?.orderBy && filters.orderBy in SORTABLE_COLUMNS\n ? SORTABLE_COLUMNS[filters.orderBy as keyof typeof SORTABLE_COLUMNS]\n : ${tableName}.submittedAt\n const sortFn =\n filters?.orderBy && filters.orderBy in SORTABLE_COLUMNS\n ? filters.orderDirection === 'desc'\n ? desc\n : asc\n : desc\n const orderClause = sortFn(sortColumn)\n\n const orderedQuery = conditions.length > 0\n ? query.where(and(...conditions)).orderBy(orderClause)\n : query.orderBy(orderClause)\n\n const limit = filters?.limit\n const offset = filters?.offset\n const isPaginated = typeof limit === 'number' && limit > 0\n let results: unknown[]\n if (isPaginated) {\n const paginatedQuery = typeof offset === 'number' && offset > 0\n ? orderedQuery.limit(limit).offset(offset)\n : orderedQuery.limit(limit)\n results = await paginatedQuery\n } else {\n results = await orderedQuery\n }\n\n const total = isPaginated\n ? Number(\n (\n await db\n .select({ count: sql\\`count(*)\\` })\n .from(${tableName})\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n )[0]?.count ?? 0\n )\n : results.length\n\n return {\n submissions: results as ${pascal}SubmissionData[],\n total\n }\n } catch (error) {\n console.error('Error fetching ${formName} submissions:', error)\n throw new Error('Failed to fetch ${formName} submissions')\n }\n}\n`\n\n const getSubmissionContent = `'use server'\n\nimport { eq } from 'drizzle-orm'\nimport db from '@admin/db'\nimport { ${tableName} } from '@admin/db/schema'\n${cacheReadImport}\nimport { CACHE_TAG, CACHE_TAG_BY_ID } from './types'\nimport type { ${pascal}SubmissionData } from './types'\n\nexport async function get${pascal}Submission(id: string): Promise<${pascal}SubmissionData | null> {\n 'use cache'${cacheLifeLine}\n cacheTag(CACHE_TAG_BY_ID(id))\n cacheTag(CACHE_TAG)\n\n try {\n const [submission] = await db\n .select()\n .from(${tableName})\n .where(eq(${tableName}.id, id))\n .limit(1)\n return (submission as ${pascal}SubmissionData) ?? null\n } catch (error) {\n console.error(\\`Error fetching ${formName} submission \\${id}:\\`, error)\n throw new Error('Failed to fetch ${formName} submission')\n }\n}\n`\n\n const createContent = `'use server'\n\nimport db from '@admin/db'\nimport { ${tableName} } from '@admin/db/schema'\nimport { getFormSettings } from '@admin/actions/forms'\nimport { sendFormEmails } from '@admin/actions/email/form-delivery'\nimport { sendWebhook } from '@admin/utils/webhook/webhook'\nimport { ${cacheInvalidationFn} } from 'next/cache'\n${mailchimpImport}\nimport { CACHE_TAG, CACHE_TAG_BY_ID } from './types'\nimport type { Create${pascal}SubmissionInput, Create${pascal}SubmissionResult, ${pascal}SubmissionData } from './types'\n\nexport async function create${pascal}Submission(\n data: Create${pascal}SubmissionInput\n): Promise<Create${pascal}SubmissionResult> {\n try {\n ${validation}\n\n const [submission] = await db\n .insert(${tableName})\n .values({\n ...data,\n submittedAt: new Date().toISOString()\n })\n .returning()\n\n const settings = await getFormSettings('${formSettingsKey}')\n const notificationEmails = settings?.notificationEmails\n ? settings.notificationEmails.split(',').map((e: string) => e.trim()).filter(Boolean)\n : ${schemaNotificationFallback}\n\n await sendFormEmails({\n formName: '${formName}',\n formLabel: '${schema.label}',\n notificationEmails,\n submitterEmail: ${submitterEmailField ? `data.${submitterEmailField}` : 'null'},\n submissionData: data as Record<string, unknown>,\n submittedAt: (submission as ${pascal}SubmissionData).submittedAt,\n })\n\n if (settings?.webhookEnabled && settings?.webhookUrl) {\n sendWebhook(settings.webhookUrl, {\n form_name: '${formName}',\n submission_id: submission.id,\n ...data,\n submitted_at: (submission as ${pascal}SubmissionData).submittedAt,\n })\n }${mailchimpCall}\n\n ${cacheInvalidationFn}(CACHE_TAG)\n ${cacheInvalidationFn}(CACHE_TAG_BY_ID((submission as ${pascal}SubmissionData).id))\n\n return {\n success: true,\n submission: submission as ${pascal}SubmissionData\n }\n } catch (error) {\n console.error('Error creating ${formName} submission:', error)\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create ${formName} submission'\n }\n }\n}\n`\n\n const deleteContent = `'use server'\n\nimport { eq } from 'drizzle-orm'\nimport db from '@admin/db'\nimport { ${tableName} } from '@admin/db/schema'\nimport { ${cacheInvalidationFn} } from 'next/cache'\nimport { CACHE_TAG, CACHE_TAG_BY_ID } from './types'\nimport type { Delete${pascal}SubmissionResult } from './types'\n\nexport async function delete${pascal}Submission(id: string): Promise<Delete${pascal}SubmissionResult> {\n try {\n await db.delete(${tableName}).where(eq(${tableName}.id, id))\n ${cacheInvalidationFn}(CACHE_TAG)\n ${cacheInvalidationFn}(CACHE_TAG_BY_ID(id))\n return { success: true }\n } catch (error) {\n console.error(\\`Error deleting ${formName} submission \\${id}:\\`, error)\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to delete ${formName} submission'\n }\n }\n}\n`\n\n const deleteBulkContent = `'use server'\n\nimport { eq, or } from 'drizzle-orm'\nimport db from '@admin/db'\nimport { ${tableName} } from '@admin/db/schema'\nimport { ${cacheInvalidationFn} } from 'next/cache'\nimport { CACHE_TAG, CACHE_TAG_BY_ID } from './types'\nimport type { Delete${pascal}SubmissionResult } from './types'\n\nexport async function deleteBulk${pascal}Submissions(ids: string[]): Promise<Delete${pascal}SubmissionResult> {\n try {\n if (ids.length === 0) return { success: true, count: 0 }\n await db.delete(${tableName}).where(\n or(...ids.map(id => eq(${tableName}.id, id)))\n )\n ${cacheInvalidationFn}(CACHE_TAG)\n for (const id of ids) {\n ${cacheInvalidationFn}(CACHE_TAG_BY_ID(id))\n }\n return { success: true, count: ids.length }\n } catch (error) {\n console.error(\\`Error bulk deleting ${formName} submissions:\\`, error)\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to bulk delete ${formName} submissions'\n }\n }\n}\n`\n\n const hasExport = schema.actions?.export === true\n\n const exportCsvContent = `'use server'\n\nimport { get${pascal}Submissions } from './get-${kebab}-submissions'\n\nexport async function export${pascal}SubmissionsCSV(): Promise<string> {\n const { submissions } = await get${pascal}Submissions()\n if (submissions.length === 0) return ''\n const headers = Object.keys(submissions[0]).join(',')\n const rows = submissions.map((sub) =>\n Object.values(sub)\n .map((val: unknown) => {\n if (val === null || val === undefined) return ''\n const str = String(val)\n if (str.includes(',') || str.includes('\"') || str.includes('\\\\n')) {\n return \\`\"\\${str.replace(/\"/g, '\"\"')}\"\\`\n }\n return str\n })\n .join(',')\n )\n return [headers, ...rows].join('\\\\n')\n}\n`\n\n const exportBarrelLine = hasExport\n ? `\\nexport { export${pascal}SubmissionsCSV } from './export-${kebab}-submissions-csv'`\n : ''\n\n const barrelContent = `export type {\n ${pascal}SubmissionData,\n ${pascal}SubmissionsResponse,\n Get${pascal}SubmissionsFilters,\n Create${pascal}SubmissionInput,\n Create${pascal}SubmissionResult,\n Delete${pascal}SubmissionResult\n} from './types'\nexport { get${pascal}Submissions } from './get-${kebab}-submissions'\nexport { get${pascal}Submission } from './get-${kebab}-submission'\nexport { create${pascal}Submission } from './create-${kebab}-submission'\nexport { delete${pascal}Submission } from './delete-${kebab}-submission'\nexport { deleteBulk${pascal}Submissions } from './delete-bulk-${kebab}-submissions'${exportBarrelLine}\nexport { CACHE_TAG, CACHE_TAG_BY_ID } from './types'\n`\n\n const files: { name: string; content: string }[] = [\n { name: 'types.ts', content: typesContent },\n { name: `get-${kebab}-submissions.ts`, content: getSubmissionsContent },\n { name: `get-${kebab}-submission.ts`, content: getSubmissionContent },\n { name: `create-${kebab}-submission.ts`, content: createContent },\n { name: `delete-${kebab}-submission.ts`, content: deleteContent },\n { name: `delete-bulk-${kebab}-submissions.ts`, content: deleteBulkContent }\n ]\n if (hasExport) {\n files.push({ name: `export-${kebab}-submissions-csv.ts`, content: exportCsvContent })\n }\n files.push({ name: 'index.ts', content: barrelContent })\n\n return {\n files: files.map((file) => createGeneratedFile(`${schemaActionDir}/${file.name}`, file.content))\n }\n}\n","/**\n * Shared helpers for form component generation\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { formFieldToZodType } from '@core-engine/schema/type-mappers/index.js'\nimport type { FormField, GeneratedFile } from '@core-engine/schema/types.js'\nimport { singularize } from '@core-engine/utils/string.js'\n\nexport interface StepResult {\n files: GeneratedFile[]\n}\n\nconst ADMIN_CUSTOM_COMPONENTS = new Set(['media-gallery-field'])\n\n/**\n * Check if a component exists in the user's project.\n * Shadcn registry components resolve from components/ui; BetterStart custom components resolve from components/custom.\n */\nexport function resolveUiImport(cwd: string, componentName: string): string {\n const componentDirectory = ADMIN_CUSTOM_COMPONENTS.has(componentName)\n ? 'components/custom'\n : 'components/ui'\n const locations = [componentDirectory, `src/${componentDirectory}`]\n for (const loc of locations) {\n if (\n fs.existsSync(path.join(cwd, loc, `${componentName}.tsx`)) ||\n fs.existsSync(path.join(cwd, loc, `${componentName}.ts`))\n ) {\n return `@/${componentDirectory}/${componentName}`\n }\n }\n return `@admin/${componentDirectory}/${componentName}`\n}\n\n/** Escape text for safe use in JSX content */\nexport function escapeJsx(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\n/** Emit a FormLabel line: visible when label is truthy, sr-only fallback to `name` when empty. */\nexport function formLabelLine(\n name: string,\n label: string,\n requiredStar: string,\n className?: string\n): string {\n if (!label) return `<FormLabel className=\"sr-only\">${name}${requiredStar}</FormLabel>`\n return className\n ? `<FormLabel className=\"${className}\">${label}${requiredStar}</FormLabel>`\n : `<FormLabel>${label}${requiredStar}</FormLabel>`\n}\n\nfunction labelWithDescriptionLine(\n labelJSX: string,\n descriptionJSX: string,\n indent: string\n): string {\n if (!descriptionJSX) return labelJSX\n return `<div className=\"flex flex-col gap-1\">\n${indent} ${labelJSX}\n${indent} ${descriptionJSX}\n${indent}</div>`\n}\n\nfunction formLabelWithDescriptionLine(\n name: string,\n label: string,\n requiredStar: string,\n descriptionJSX: string,\n indent: string,\n className?: string\n): string {\n return labelWithDescriptionLine(\n formLabelLine(name, label, requiredStar, className),\n descriptionJSX,\n indent\n )\n}\n\nfunction formItemProps(height: FormField['height'], className?: string): string {\n const classes = [height === 'fill' ? 'flex-1 min-h-0' : '', className ?? ''].filter(Boolean)\n return classes.length > 0 ? ` className=\"${classes.join(' ')}\"` : ''\n}\n\nfunction fillControlProps(height: FormField['height'], className?: string): string {\n const classes = [className ?? '', height === 'fill' ? 'flex-1' : ''].filter(Boolean)\n return classes.length > 0 ? ` className=\"${classes.join(' ')}\"` : ''\n}\n\nfunction fillFormItemProps(height: FormField['height']): string {\n return formItemProps(height, height === 'fill' ? 'flex flex-col' : undefined)\n}\n\n/** Flatten form fields, resolving groups and skipping dynamic fields */\nexport function flattenFormFields(fields: FormField[]): FormField[] {\n return fields.flatMap((field) => {\n if (field.type === 'dynamicFields') return []\n if (field.type === 'group' && field.fields) return flattenFormFields(field.fields)\n return field.type === 'group' ? [] : [field]\n })\n}\n\n/** Build Zod schema field entries from form fields */\nexport function buildZodFields(fields: FormField[]): string {\n return fields\n .filter((f) => f.name)\n .map((f) => ` ${f.name}: ${formFieldToZodType(f)}`)\n .join(',\\n')\n}\n\n/** Build default value entries from form fields */\nexport function buildDefaultValues(fields: FormField[]): string {\n return fields\n .filter((f) => f.name)\n .map((f) => {\n if (f.type === 'checkbox') return ` ${f.name}: false`\n if (f.type === 'number') return ` ${f.name}: undefined`\n if (f.type === 'multiselect' || f.type === 'list') return ` ${f.name}: []`\n if (f.type === 'radio' && f.defaultValue !== undefined)\n return ` ${f.name}: '${f.defaultValue}'`\n if (f.type === 'select' || f.type === 'radio') return ` ${f.name}: undefined`\n if (f.defaultValue !== undefined) return ` ${f.name}: '${f.defaultValue}'`\n return ` ${f.name}: ''`\n })\n .join(',\\n')\n}\n\n/** Build useFieldArray declarations for list fields */\nexport function buildFieldArrayDecls(listFields: FormField[]): string {\n return listFields\n .map(\n (f) =>\n ` const ${f.name}FieldArray = useFieldArray({ control: form.control, name: '${f.name}' })`\n )\n .join('\\n')\n}\n\n/** Build watch variable declarations for showWhen fields */\nexport function buildWatchDecls(fields: FormField[]): { setup: string; hasWatch: boolean } {\n const watchFields = new Set<string>()\n for (const f of fields) {\n if (f.showWhen) {\n watchFields.add(f.showWhen.field)\n }\n }\n if (watchFields.size === 0) return { setup: '', hasWatch: false }\n const decls = Array.from(watchFields)\n .map((wf) => ` const ${wf}Value = form.watch('${wf}')`)\n .join('\\n')\n return { setup: `\\n${decls}\\n`, hasWatch: true }\n}\n\n/** Get list fields that need useFieldArray */\nexport function getListFields(fields: FormField[]): FormField[] {\n return fields.filter((f) => f.name && f.type === 'list' && f.fields && f.fields.length > 0)\n}\n\n/**\n * Render an array of form fields to JSX, preserving group layout.\n * Group fields render as a responsive grid wrapper; other fields render normally.\n */\nexport function renderFieldsJSX(fields: FormField[]): string {\n return fields\n .filter((f) => !f.hidden)\n .map((f) => {\n if (f.type === 'dynamicFields') return ''\n if (f.type === 'group' && f.fields) {\n const cols = f.columns || 2\n const innerJSX = renderFieldsJSX(f.fields)\n const groupJSX = ` <div className=\"grid grid-cols-1 md:grid-cols-${cols} gap-5\">\\n${innerJSX}\\n </div>`\n return f.showWhen ? wrapShowWhen(f, groupJSX) : groupJSX\n }\n if (!f.name) return ''\n return wrapShowWhen(f, generateFieldJSX(f))\n })\n .filter(Boolean)\n .join('\\n\\n')\n}\n\n/** Wrap field JSX with showWhen conditional if applicable */\nexport function wrapShowWhen(field: FormField, jsx: string): string {\n if (!field.showWhen) return jsx\n const watchVar = `${field.showWhen.field}Value`\n const { value } = field.showWhen\n if (Array.isArray(value)) {\n const vals = value.map((v) => `'${v}'`).join(', ')\n return ` {[${vals}].includes(${watchVar} as string) && (\\n${jsx}\\n )}`\n }\n return ` {${watchVar} === '${value}' && (\\n${jsx}\\n )}`\n}\n\n/** Generate JSX for a single form field */\nexport function generateFieldJSX(field: FormField): string {\n const name = field.name || ''\n const label = field.label ? escapeJsx(field.label) : ''\n const placeholder = field.placeholder || ''\n const hint = field.hint || ''\n\n const hintJSX = hint ? `<FormDescription>${escapeJsx(hint)}</FormDescription>` : ''\n const hintPlainJSX = hint\n ? `<p className=\"text-sm text-muted-foreground\">${escapeJsx(hint)}</p>`\n : ''\n const requiredStar = field.required ? ' <span className=\"text-destructive\">*</span>' : ''\n\n switch (field.type) {\n case 'textarea':\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${fillFormItemProps(field.height)}>\n ${formLabelWithDescriptionLine(name, label, requiredStar, hintJSX, ' ')}\n <FormControl>\n <Textarea${fillControlProps(field.height)} placeholder=\"${placeholder}\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n\n case 'radio':\n if (field.options && field.options.length > 0) {\n const radioItems = field.options\n .map(\n (opt) =>\n ` <FormLabel htmlFor=\"${name}-${opt.value}\" className=\"flex items-center space-x-2 text-sm font-medium leading-none\">\n <RadioGroupItem value=\"${opt.value}\" id=\"${name}-${opt.value}\" />\n <span>${escapeJsx(opt.label)}</span>\n </FormLabel>`\n )\n .join('\\n')\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${formItemProps(field.height, 'space-y-3')}>\n ${formLabelWithDescriptionLine(name, label, requiredStar, hintJSX, ' ')}\n <FormControl>\n <RadioGroup onValueChange={field.onChange} defaultValue={field.value} className=\"flex items-center space-x-2\">\n${radioItems}\n </RadioGroup>\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n }\n return generateTextFieldJSX(\n name,\n label,\n placeholder,\n hintJSX,\n requiredStar,\n 'text',\n field.height\n )\n\n case 'select':\n if (field.options && field.options.length > 0) {\n const optionItems = field.options\n .map(\n (opt) =>\n ` <SelectItem value=\"${opt.value}\">${escapeJsx(opt.label)}</SelectItem>`\n )\n .join('\\n')\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${formItemProps(field.height)}>\n ${formLabelWithDescriptionLine(name, label, requiredStar, hintJSX, ' ')}\n <Select onValueChange={field.onChange} defaultValue={field.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue placeholder=\"${placeholder || 'Select...'}\" />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n${optionItems}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />`\n }\n return generateTextFieldJSX(\n name,\n label,\n placeholder,\n hintJSX,\n requiredStar,\n 'text',\n field.height\n )\n\n case 'checkbox':\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${formItemProps(field.height, 'flex flex-row items-start space-x-3 space-y-0')}>\n <FormControl>\n <input\n type=\"checkbox\"\n checked={field.value}\n onChange={field.onChange}\n className=\"mt-1\"\n />\n </FormControl>\n <div className=\"space-y-2 leading-none\">\n ${formLabelWithDescriptionLine(name, label || name, requiredStar, hintJSX, ' ')}\n <FormMessage />\n </div>\n </FormItem>\n )}\n />`\n\n case 'email':\n return generateTextFieldJSX(\n name,\n label,\n placeholder || 'email@example.com',\n hintJSX,\n requiredStar,\n 'email',\n field.height\n )\n\n case 'number':\n return generateNumberFieldJSX(name, label, placeholder, hintJSX, requiredStar, field.height)\n\n case 'date':\n return generateTextFieldJSX(\n name,\n label,\n placeholder,\n hintJSX,\n requiredStar,\n 'date',\n field.height\n )\n\n case 'url':\n return generateTextFieldJSX(\n name,\n label,\n placeholder || 'https://',\n hintJSX,\n requiredStar,\n 'url',\n field.height\n )\n\n case 'phone':\n return generateTextFieldJSX(\n name,\n label,\n placeholder || '+1 (555) 000-0000',\n hintJSX,\n requiredStar,\n 'tel',\n field.height\n )\n\n case 'file':\n case 'upload':\n return generateFileUploadFieldJSX(field, name, label, hintJSX, requiredStar)\n\n case 'list':\n return generateListFieldJSX(field, name, label, hintPlainJSX, requiredStar)\n\n default:\n return generateTextFieldJSX(\n name,\n label,\n placeholder,\n hintJSX,\n requiredStar,\n 'text',\n field.height\n )\n }\n}\n\nexport function generateTextFieldJSX(\n name: string,\n label: string,\n placeholder: string,\n hintJSX: string,\n requiredStar: string,\n inputType: string,\n height?: FormField['height']\n): string {\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${formItemProps(height)}>\n ${formLabelWithDescriptionLine(name, label, requiredStar, hintJSX, ' ')}\n <FormControl>\n <Input type=\"${inputType}\" placeholder=\"${placeholder}\" {...field} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n}\n\nfunction generateNumberFieldJSX(\n name: string,\n label: string,\n placeholder: string,\n hintJSX: string,\n requiredStar: string,\n height?: FormField['height']\n): string {\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${formItemProps(height)}>\n ${formLabelWithDescriptionLine(name, label, requiredStar, hintJSX, ' ')}\n <FormControl>\n <Input\n type=\"number\"\n placeholder=\"${placeholder}\"\n value={field.value ?? ''}\n onChange={(event) => {\n const nextValue = event.target.value === '' ? undefined : event.target.valueAsNumber\n const normalizedValue = Number.isNaN(nextValue) ? undefined : nextValue\n field.onChange(normalizedValue)\n }}\n onBlur={field.onBlur}\n name={field.name}\n ref={field.ref}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n}\n\nfunction generateFileUploadFieldJSX(\n field: FormField,\n name: string,\n label: string,\n hintJSX: string,\n requiredStar: string\n): string {\n const accept = field.accept || '*/*'\n return ` <FormField\n control={form.control}\n name=\"${name}\"\n render={({ field }) => (\n <FormItem${formItemProps(field.height)}>\n ${formLabelWithDescriptionLine(name, label, requiredStar, hintJSX, ' ')}\n <FormControl>\n <MediaGalleryField\n value={field.value}\n onChange={field.onChange}\n onBlur={field.onBlur}\n accept=\"${accept}\"\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n}\n\nfunction generateListFieldJSX(\n field: FormField,\n name: string,\n label: string,\n hintJSX: string,\n requiredStar: string\n): string {\n if (!field.fields || field.fields.length === 0) {\n return generateTextFieldJSX(\n name,\n label,\n field.placeholder || '',\n hintJSX,\n requiredStar,\n 'text',\n field.height\n )\n }\n\n const singularLabel = singularize(label || name)\n\n const nestedFieldsJSX = field.fields\n .map((nf) => {\n const nfName = nf.name || ''\n const nfLabelRaw = nf.label ? escapeJsx(nf.label) : ''\n const nfPlaceholder = nf.placeholder || ''\n\n if (nf.type === 'select' && nf.options && nf.options.length > 0) {\n const selectItems = nf.options\n .map(\n (opt) =>\n ` <SelectItem value=\"${opt.value}\">${escapeJsx(opt.label)}</SelectItem>`\n )\n .join('\\n')\n return ` <FormField\n control={form.control}\n name={\\`${name}.\\${index}.${nf.name}\\`}\n render={({ field: formField }) => (\n <FormItem className=\"flex-1\">\n ${formLabelLine(nfName, nfLabelRaw, '')}\n <Select onValueChange={formField.onChange} defaultValue={formField.value}>\n <FormControl>\n <SelectTrigger>\n <SelectValue placeholder=\"${nf.placeholder || 'Select...'}\" />\n </SelectTrigger>\n </FormControl>\n <SelectContent>\n${selectItems}\n </SelectContent>\n </Select>\n <FormMessage />\n </FormItem>\n )}\n />`\n }\n if (nf.type === 'number') {\n return ` <FormField\n control={form.control}\n name={\\`${name}.\\${index}.${nf.name}\\`}\n render={({ field: formField }) => (\n <FormItem className=\"flex-1\">\n ${formLabelLine(nfName, nfLabelRaw, '')}\n <FormControl>\n <Input\n type=\"number\"\n placeholder=\"${nfPlaceholder}\"\n value={formField.value ?? ''}\n onChange={(event) => {\n const nextValue = event.target.value === '' ? undefined : event.target.valueAsNumber\n const normalizedValue = Number.isNaN(nextValue) ? undefined : nextValue\n formField.onChange(normalizedValue)\n }}\n onBlur={formField.onBlur}\n name={formField.name}\n ref={formField.ref}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n }\n\n return ` <FormField\n control={form.control}\n name={\\`${name}.\\${index}.${nf.name}\\`}\n render={({ field: formField }) => (\n <FormItem className=\"flex-1\">\n ${formLabelLine(nfName, nfLabelRaw, '')}\n <FormControl>\n <Input type=\"text\" placeholder=\"${nfPlaceholder}\" {...formField} />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />`\n })\n .join('\\n')\n\n const defaultObj = field.fields\n .map((nf) => {\n if (nf.type === 'select' || nf.type === 'radio') return `${nf.name}: undefined`\n if (nf.type === 'checkbox') return `${nf.name}: false`\n if (nf.type === 'number') return `${nf.name}: undefined`\n return `${nf.name}: ''`\n })\n .join(', ')\n\n return ` <div className=\"space-y-2\">\n ${labelWithDescriptionLine(formLabelLine(name, label, requiredStar, 'text-sm font-medium leading-none'), hintJSX, ' ')}\n {${name}FieldArray.fields.map((item, index) => (\n <div key={item.id} className=\"relative rounded-lg border p-4\">\n <button\n type=\"button\"\n onClick={() => ${name}FieldArray.remove(index)}\n className=\"absolute right-2 top-2 inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"size-4\" />\n <span className=\"sr-only\">Remove</span>\n </button>\n <div className=\"space-y-4 pr-8\">\n${nestedFieldsJSX}\n </div>\n </div>\n ))}\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => ${name}FieldArray.append({ ${defaultObj} })}\n >\n Add ${singularLabel}\n </Button>\n </div>`\n}\n","/**\n * Multi-step wizard form component generator\n */\n\nimport {\n getAllFormSchemaFields,\n getStepFieldNames\n} from '@core-engine/schema/field-helpers/index.js'\nimport type { FormSchema, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport {\n buildDefaultValues,\n buildFieldArrayDecls,\n buildWatchDecls,\n buildZodFields,\n escapeJsx,\n getListFields,\n renderFieldsJSX,\n resolveUiImport,\n type StepResult\n} from '@next-adapter/generators/form-pipeline/form-component-shared.js'\n\nexport function generateMultiStepForm(\n schema: FormSchema,\n cwd: string,\n adminDir: string,\n options: GeneratorOptions\n): StepResult {\n const formName = schema.name\n const pascal = toPascalCase(formName)\n const kebab = toKebabCase(formName)\n const actionImportPath = resolveSchemaActionImportPath(formName, options.outputNamespace)\n const steps = schema.steps!\n\n // All fields flattened (for Zod schema + defaults)\n const allFields = getAllFormSchemaFields(schema)\n const zodFields = buildZodFields(allFields)\n const defaults = buildDefaultValues(allFields)\n\n // List fields and watch declarations are global\n const listFields = getListFields(allFields)\n const hasListFields = listFields.length > 0\n const { setup: watchSetup } = buildWatchDecls(allFields)\n\n const rhfImport = hasListFields\n ? `import { useFieldArray, useForm } from 'react-hook-form'`\n : `import { useForm } from 'react-hook-form'`\n const fieldArraySetup = hasListFields ? `\\n${buildFieldArrayDecls(listFields)}\\n` : ''\n\n // Build STEPS constant\n const stepsConst = buildStepsConstant(steps)\n\n // Build per-step content blocks\n const stepContentBlocks = steps\n .map((step, index) => {\n const fieldsJSX = renderFieldsJSX(step.fields)\n return ` {currentStep === ${index} && (\\n <>\\n${fieldsJSX}\\n </>\\n )}`\n })\n .join('\\n')\n\n const submitText = schema.submitButtonText || 'Submit'\n const successMessage = escapeJsx(schema.successMessage || 'Form submitted successfully!')\n const redirectUrl = schema.redirectUrl\n const successHandler = redirectUrl\n ? `window.location.href = ${JSON.stringify(redirectUrl)}`\n : 'setSubmitted(true)'\n\n // Resolve UI imports\n const hasRadio = allFields.some((f) => f.type === 'radio')\n const hasFileUpload = allFields.some((f) => f.type === 'file' || f.type === 'upload')\n const buttonImport = resolveUiImport(cwd, 'button')\n const formImport = resolveUiImport(cwd, 'form')\n const inputImport = resolveUiImport(cwd, 'input')\n const textareaImport = resolveUiImport(cwd, 'textarea')\n const selectImport = resolveUiImport(cwd, 'select')\n const radioGroupImport = resolveUiImport(cwd, 'radio-group')\n const mediaUploadImport = resolveUiImport(cwd, 'media-gallery-field')\n\n const content = buildComponentSource({\n pascal,\n kebab,\n rhfImport,\n hasRadio,\n hasFileUpload,\n hasListFields,\n actionImportPath,\n buttonImport,\n formImport,\n inputImport,\n textareaImport,\n selectImport,\n radioGroupImport,\n mediaUploadImport,\n zodFields,\n defaults,\n stepsConst,\n fieldArraySetup,\n watchSetup,\n stepContentBlocks,\n submitText,\n successMessage,\n successHandler\n })\n\n return {\n files: [createGeneratedFile(`${adminDir}/components/forms/${kebab}-form.tsx`, content)]\n }\n}\n\nfunction buildStepsConstant(steps: NonNullable<FormSchema['steps']>): string {\n const entries = steps.map((step) => {\n const fieldNames = getStepFieldNames(step)\n const fieldsStr = fieldNames.map((n) => `'${n}'`).join(', ')\n const desc = step.description ? `, description: '${escapeQuotes(step.description)}'` : ''\n return ` { name: '${step.name}', label: '${escapeQuotes(step.label)}'${desc}, fields: [${fieldsStr}] }`\n })\n return `const STEPS = [\\n${entries.join(',\\n')}\\n]`\n}\n\nfunction escapeQuotes(str: string): string {\n return str.replace(/'/g, \"\\\\'\")\n}\n\ninterface ComponentParts {\n pascal: string\n kebab: string\n actionImportPath: string\n rhfImport: string\n hasRadio: boolean\n hasFileUpload: boolean\n hasListFields: boolean\n buttonImport: string\n formImport: string\n inputImport: string\n textareaImport: string\n selectImport: string\n radioGroupImport: string\n mediaUploadImport: string\n zodFields: string\n defaults: string\n stepsConst: string\n fieldArraySetup: string\n watchSetup: string\n stepContentBlocks: string\n submitText: string\n successMessage: string\n successHandler: string\n}\n\nfunction buildComponentSource(p: ComponentParts): string {\n const queryClientImport = p.hasFileUpload\n ? `\\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'`\n : ''\n const queryClientSetup = p.hasFileUpload ? `\\nconst queryClient = new QueryClient()\\n` : ''\n const formComponentDecl = p.hasFileUpload\n ? `function ${p.pascal}FormInner`\n : `export function ${p.pascal}Form`\n const exportWrapper = p.hasFileUpload\n ? `\\nexport function ${p.pascal}Form() {\n return (\n <QueryClientProvider client={queryClient}>\n <${p.pascal}FormInner />\n </QueryClientProvider>\n )\n}\\n`\n : ''\n\n return `'use client'\n\nimport { standardSchemaResolver } from '@hookform/resolvers/standard-schema'\nimport { ChevronLeft, ChevronRight${p.hasListFields ? ', Trash2' : ''} } from 'lucide-react'\nimport { createParser, useQueryState } from 'nuqs'\nimport * as React from 'react'\n${p.rhfImport}\nimport { z } from 'zod/v3'${queryClientImport}\nimport { create${p.pascal}Submission } from '@admin/actions/${p.actionImportPath}'\nimport { Button } from '${p.buttonImport}'\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '${p.formImport}'\nimport { Input } from '${p.inputImport}'${p.hasFileUpload ? `\\nimport { MediaGalleryField } from '${p.mediaUploadImport}'` : ''}\n${p.hasRadio ? `import { RadioGroup, RadioGroupItem } from '${p.radioGroupImport}'\\n` : ''}\nimport { Textarea } from '${p.textareaImport}'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '${p.selectImport}'\n\nconst formSchema = z.object({\n${p.zodFields}\n})\n\ntype FormValues = z.infer<typeof formSchema>\n${queryClientSetup}\n${p.stepsConst}\n\nconst stepParser = createParser({\n parse(value) {\n if (!/^\\\\d+$/.test(value)) {\n return null\n }\n const step = Number.parseInt(value, 10)\n if (!Number.isInteger(step) || step < 0 || step >= STEPS.length) {\n return null\n }\n return step\n },\n serialize(value) {\n return String(value)\n }\n}).withDefault(0)\n\n${formComponentDecl}() {\n const [currentStep, setCurrentStep] = useQueryState('step', stepParser)\n const [submitted, setSubmitted] = React.useState(false)\n const [submitting, startSubmitTransition] = React.useTransition()\n\n const form = useForm<FormValues>({\n resolver: standardSchemaResolver(formSchema),\n defaultValues: {\n${p.defaults}\n },\n })\n\n${p.fieldArraySetup}${p.watchSetup}\n async function handleNext() {\n const stepFields = STEPS[currentStep].fields as (keyof FormValues)[]\n const isValid = await form.trigger(stepFields, { shouldFocus: true })\n if (isValid) {\n setCurrentStep(currentStep + 1)\n }\n }\n\n function handleBack() {\n setCurrentStep(currentStep - 1)\n }\n\n function onSubmit(values: FormValues) {\n startSubmitTransition(async () => {\n try {\n const result = await create${p.pascal}Submission(values)\n if (result.success) {\n ${p.successHandler}\n } else {\n form.setError('root', { message: result.error || 'Something went wrong' })\n }\n } catch {\n form.setError('root', { message: 'Something went wrong. Please try again.' })\n }\n })\n }\n\n if (submitted) {\n return (\n <div className=\"rounded-lg border p-6 text-center\">\n <h3 className=\"text-lg font-semibold\">Thank you!</h3>\n <p className=\"mt-2 text-muted-foreground\">${p.successMessage}</p>\n </div>\n )\n }\n\n return (\n <Form {...form}>\n <form onSubmit={(e) => e.preventDefault()} className=\"space-y-8\">\n {/* Step header */}\n <div>\n <h3 className=\"text-lg font-semibold\">{STEPS[currentStep].label}</h3>\n {'description' in STEPS[currentStep] && STEPS[currentStep].description && (\n <p className=\"text-sm text-muted-foreground mt-1\">{STEPS[currentStep].description}</p>\n )}\n </div>\n\n {/* Step content */}\n <div key={currentStep} className=\"animate-in fade-in duration-300 space-y-6\">\n${p.stepContentBlocks}\n </div>\n\n {form.formState.errors.root && (\n <p className=\"text-sm text-destructive\">{form.formState.errors.root.message}</p>\n )}\n\n {/* Navigation */}\n <div className=\"flex justify-between\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={handleBack}\n disabled={currentStep === 0}\n >\n <ChevronLeft className=\"size-4\" />\n Back\n </Button>\n {currentStep < STEPS.length - 1 ? (\n <Button type=\"button\" onClick={handleNext}>\n Next\n <ChevronRight className=\"ml-2 size-4\" />\n </Button>\n ) : (\n <Button type=\"button\" disabled={submitting} onClick={() => form.handleSubmit(onSubmit)()}>\n {submitting ? 'Submitting...' : '${p.submitText}'}\n </Button>\n )}\n </div>\n </form>\n </Form>\n )\n}\n${exportWrapper}`\n}\n","/**\n * Single-step (flat) form component generator\n */\n\nimport { getAllFormSchemaFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { FormSchema, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport {\n buildDefaultValues,\n buildFieldArrayDecls,\n buildWatchDecls,\n buildZodFields,\n escapeJsx,\n getListFields,\n renderFieldsJSX,\n resolveUiImport,\n type StepResult\n} from '@next-adapter/generators/form-pipeline/form-component-shared.js'\n\nexport function generateSingleStepForm(\n schema: FormSchema,\n cwd: string,\n adminDir: string,\n options: GeneratorOptions\n): StepResult {\n const formName = schema.name\n const pascal = toPascalCase(formName)\n const fields = getAllFormSchemaFields(schema)\n const kebab = toKebabCase(formName)\n const actionImportPath = resolveSchemaActionImportPath(formName, options.outputNamespace)\n\n const zodFields = buildZodFields(fields)\n const defaults = buildDefaultValues(fields)\n const listFields = getListFields(fields)\n const hasListFields = listFields.length > 0\n const { setup: watchSetup } = buildWatchDecls(fields)\n\n const rawFields = schema.fields || []\n const fieldJSX = renderFieldsJSX(rawFields)\n\n const submitText = schema.submitButtonText || 'Submit'\n const successMessage = escapeJsx(schema.successMessage || 'Form submitted successfully!')\n const redirectUrl = schema.redirectUrl\n const successHandler = redirectUrl\n ? `window.location.href = ${JSON.stringify(redirectUrl)}`\n : 'setSubmitted(true)'\n\n const rhfImport = hasListFields\n ? `import { useFieldArray, useForm } from 'react-hook-form'`\n : `import { useForm } from 'react-hook-form'`\n\n const fieldArraySetup = hasListFields ? `\\n${buildFieldArrayDecls(listFields)}\\n` : ''\n\n const hasRadio = fields.some((f) => f.type === 'radio')\n const hasFileUpload = fields.some((f) => f.type === 'file' || f.type === 'upload')\n const buttonImport = resolveUiImport(cwd, 'button')\n const formImport = resolveUiImport(cwd, 'form')\n const inputImport = resolveUiImport(cwd, 'input')\n const textareaImport = resolveUiImport(cwd, 'textarea')\n const selectImport = resolveUiImport(cwd, 'select')\n const radioGroupImport = resolveUiImport(cwd, 'radio-group')\n const mediaUploadImport = resolveUiImport(cwd, 'media-gallery-field')\n\n const queryClientImport = hasFileUpload\n ? `\\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'`\n : ''\n const queryClientSetup = hasFileUpload ? `\\nconst queryClient = new QueryClient()\\n` : ''\n\n const formComponentDecl = hasFileUpload\n ? `function ${pascal}FormInner`\n : `export function ${pascal}Form`\n const exportWrapper = hasFileUpload\n ? `\\nexport function ${pascal}Form() {\n return (\n <QueryClientProvider client={queryClient}>\n <${pascal}FormInner />\n </QueryClientProvider>\n )\n}\\n`\n : ''\n\n const lucideImport = hasListFields ? `\\nimport { Trash2 } from 'lucide-react'` : ''\n\n const content = `'use client'\n\nimport { standardSchemaResolver } from '@hookform/resolvers/standard-schema'${lucideImport}\nimport * as React from 'react'\n${rhfImport}\nimport { z } from 'zod/v3'${queryClientImport}\nimport { create${pascal}Submission } from '@admin/actions/${actionImportPath}'\nimport { Button } from '${buttonImport}'\nimport {\n Form,\n FormControl,\n FormDescription,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n} from '${formImport}'\nimport { Input } from '${inputImport}'${hasFileUpload ? `\\nimport { MediaGalleryField } from '${mediaUploadImport}'` : ''}${hasRadio ? `\\nimport { RadioGroup, RadioGroupItem } from '${radioGroupImport}'` : ''}\nimport { Textarea } from '${textareaImport}'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '${selectImport}'\n\nconst formSchema = z.object({\n${zodFields}\n})\n\ntype FormValues = z.infer<typeof formSchema>\n${queryClientSetup}\n${formComponentDecl}() {\n const [submitted, setSubmitted] = React.useState(false)\n const [submitting, startSubmitTransition] = React.useTransition()\n\n const form = useForm<FormValues>({\n resolver: standardSchemaResolver(formSchema),\n defaultValues: {\n${defaults}\n },\n })\n${fieldArraySetup}${watchSetup}\n function onSubmit(values: FormValues) {\n startSubmitTransition(async () => {\n try {\n const result = await create${pascal}Submission(values)\n if (result.success) {\n ${successHandler}\n } else {\n form.setError('root', { message: result.error || 'Something went wrong' })\n }\n } catch {\n form.setError('root', { message: 'Something went wrong. Please try again.' })\n }\n })\n }\n\n if (submitted) {\n return (\n <div className=\"rounded-lg border p-6 text-center\">\n <h3 className=\"text-lg font-semibold\">Thank you!</h3>\n <p className=\"mt-2 text-muted-foreground\">${successMessage}</p>\n </div>\n )\n }\n\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit(onSubmit)} className=\"space-y-6\">\n${fieldJSX}\n\n {form.formState.errors.root && (\n <p className=\"text-sm text-destructive\">{form.formState.errors.root.message}</p>\n )}\n\n <Button type=\"submit\" disabled={submitting}>\n {submitting ? 'Submitting...' : '${submitText}'}\n </Button>\n </form>\n </Form>\n )\n}\n${exportWrapper}`\n\n return {\n files: [createGeneratedFile(`${adminDir}/components/forms/${kebab}-form.tsx`, content)]\n }\n}\n","/**\n * Form pipeline step 4: Public form component generation\n * Routes to single-step or multi-step generator based on schema structure.\n */\n\nimport { isMultiStepForm } from '@core-engine/schema/field-helpers/index.js'\nimport type { FormSchema, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { generateMultiStepForm } from '@next-adapter/generators/form-pipeline/form-component-multistep.js'\nimport type { StepResult } from '@next-adapter/generators/form-pipeline/form-component-shared.js'\nimport { generateSingleStepForm } from '@next-adapter/generators/form-pipeline/form-component-single.js'\n\nexport function generateFormComponent(\n schema: FormSchema,\n cwd: string,\n adminDir: string,\n options: GeneratorOptions\n): StepResult {\n if (isMultiStepForm(schema) && schema.steps!.length > 1) {\n return generateMultiStepForm(schema, cwd, adminDir, options)\n }\n return generateSingleStepForm(schema, cwd, adminDir, options)\n}\n","/**\n * Form pipeline step 1: Database schema generation for form submissions\n */\n\nimport {\n getAllFormSchemaFields,\n hasDynamicFields\n} from '@core-engine/schema/field-helpers/index.js'\nimport { formFieldToDrizzleType } from '@core-engine/schema/type-mappers/index.js'\nimport type { FormSchema, GeneratedFile, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveExtensionNamespace } from '@next-adapter/config/paths.js'\n\ninterface StepResult {\n files: GeneratedFile[]\n}\n\nexport function generateFormDatabase(\n schema: FormSchema,\n dbDir: string,\n options: GeneratorOptions\n): StepResult {\n const outputNamespace = resolveExtensionNamespace(schema.name, options.outputNamespace)\n const tableName = `${toCamelCase(schema.name)}Submissions`\n const fields = getAllFormSchemaFields(schema)\n const includeDynamic = hasDynamicFields(schema)\n\n const requiredImports = new Set<string>(['pgTable', 'timestamp', 'text', 'uuid'])\n if (includeDynamic) {\n requiredImports.add('jsonb')\n }\n\n const fieldDefs = fields\n .map((field) => {\n const drizzleType = formFieldToDrizzleType(field, requiredImports)\n return ` ${field.name}: ${drizzleType},`\n })\n .join('\\n')\n\n const customFieldsCol = includeDynamic\n ? '\\n customFields: jsonb().$type<Record<string, unknown>>(),'\n : ''\n\n const imports = Array.from(requiredImports).sort().join(',\\n ')\n const content = `import { sql } from 'drizzle-orm'\nimport {\n ${imports}\n} from 'drizzle-orm/pg-core'\n\nexport const ${tableName} = pgTable('${toPascalCase(schema.name)}Submissions', {\n id: uuid().defaultRandom().primaryKey().notNull(),\n${fieldDefs}${customFieldsCol}\n ipAddress: text(),\n userAgent: text(),\n submittedAt: timestamp({ precision: 3, mode: 'string' }).default(sql\\`CURRENT_TIMESTAMP\\`).notNull(),\n createdAt: timestamp({ precision: 3, mode: 'string' }).default(sql\\`CURRENT_TIMESTAMP\\`).notNull(),\n updatedAt: timestamp({ precision: 3, mode: 'string' }).default(sql\\`CURRENT_TIMESTAMP\\`).notNull()\n})\n`\n\n return {\n files: [createGeneratedFile(`${dbDir}/${outputNamespace}/${schema.name}.ts`, content)]\n }\n}\n","/**\n * Form pipeline step 3: React Query hook for form submissions\n */\n\nimport type { FormSchema, GeneratedFile, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\n\ninterface StepResult {\n files: GeneratedFile[]\n}\n\nexport function generateFormHook(\n schema: FormSchema,\n hooksDir: string,\n options: GeneratorOptions\n): StepResult {\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const formName = schema.name\n const pascal = toPascalCase(formName)\n const camel = toCamelCase(formName)\n const kebab = toKebabCase(formName)\n const successMsg = (schema.successMessage || 'Form submitted successfully').replace(/'/g, \"\\\\'\")\n const hasExport = schema.actions?.export === true\n\n const submissionActionImports = [\n `create${pascal}Submission,`,\n `delete${pascal}Submission,`,\n hasExport ? `export${pascal}SubmissionsCSV,` : null,\n `get${pascal}Submission,`,\n `get${pascal}Submissions,`\n ]\n .filter((line): line is string => line !== null)\n .map((line) => ` ${line}`)\n .join('\\n')\n\n const content = `import {\n${submissionActionImports}\n} from '@admin/actions/${actionImportPath}'\nimport type {\n Create${pascal}SubmissionInput,\n Get${pascal}SubmissionsFilters\n} from '@admin/actions/${actionImportPath}'\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'\nimport { toast } from 'sonner'\n\nexport function use${pascal}Submissions(\n search?: string,\n submittedAtFrom?: string,\n submittedAtTo?: string,\n page?: number,\n pageSize?: number,\n orderBy?: string,\n orderDirection?: 'asc' | 'desc'\n) {\n return useQuery({\n queryKey: [\n '${camel}-submissions',\n search ?? '',\n submittedAtFrom ?? '',\n submittedAtTo ?? '',\n page ?? 0,\n pageSize ?? 20,\n orderBy ?? '',\n orderDirection ?? ''\n ],\n queryFn: () => {\n const filters: Get${pascal}SubmissionsFilters = {}\n\n if (search) filters.search = search\n if (submittedAtFrom) filters.submittedAtFrom = submittedAtFrom\n if (submittedAtTo) filters.submittedAtTo = submittedAtTo\n if (pageSize != null && pageSize !== -1) {\n filters.limit = pageSize\n filters.offset = (page ?? 0) * pageSize\n }\n if (orderBy) filters.orderBy = orderBy\n if (orderDirection) filters.orderDirection = orderDirection\n\n return get${pascal}Submissions(Object.keys(filters).length > 0 ? filters : undefined)\n }\n })\n}\n\nexport function use${pascal}Submission(id: string | null) {\n return useQuery({\n queryKey: ['${camel}-submission', id],\n queryFn: () => get${pascal}Submission(id!),\n enabled: !!id\n })\n}\n\nexport function useCreate${pascal}Submission() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (data: Create${pascal}SubmissionInput) => create${pascal}Submission(data),\n onSuccess: async (result) => {\n if (result.success) {\n toast.success('${successMsg}')\n await queryClient.refetchQueries({ queryKey: ['${camel}-submissions'] })\n } else {\n toast.error(result.error || 'Failed to submit form')\n }\n },\n onError: (error: Error) => {\n toast.error(error.message || 'Failed to submit form')\n }\n })\n}\n\nexport function useDelete${pascal}Submission() {\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: (id: string) => delete${pascal}Submission(id),\n onSuccess: async () => {\n toast.success('Submission deleted successfully')\n await queryClient.refetchQueries({ queryKey: ['${camel}-submissions'] })\n },\n onError: (error: Error) => {\n toast.error(error.message || 'Failed to delete submission')\n }\n })\n}\n${\n hasExport\n ? `\nexport function useExport${pascal}SubmissionsCSV() {\n return useMutation({\n mutationFn: export${pascal}SubmissionsCSV,\n onSuccess: (csvContent) => {\n const blob = new Blob([csvContent], { type: 'text/csv' })\n const url = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = '${formName}-submissions-' + new Date().toISOString().split('T')[0] + '.csv'\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n window.URL.revokeObjectURL(url)\n toast.success('CSV exported successfully')\n },\n onError: (error: Error) => {\n toast.error(error.message || 'Failed to export CSV')\n }\n })\n}\n`\n : ''\n}`\n\n return {\n files: [createGeneratedFile(`${hooksDir}/use-${kebab}-form.ts`, content)]\n }\n}\n","import type { GeneratedFile } from '@core-engine/schema/types.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { ts } from 'ts-morph'\n\nfunction rewriteAdminModulePath(modulePath: string, namespace: string): string {\n const resolved = resolveAdminNamespace(namespace)\n\n if (modulePath === '@admin/auth/middleware') {\n return `${resolved.alias}/auth/session`\n }\n\n if (modulePath === '@admin/auth/auth' || modulePath === '@admin/auth') {\n return `${resolved.alias}/auth/server`\n }\n\n if (modulePath === '@admin/auth/client') {\n return `${resolved.alias}/auth/client`\n }\n\n if (modulePath === '@admin') {\n return resolved.alias\n }\n\n if (modulePath.startsWith('@admin/')) {\n return `${resolved.alias}${modulePath.slice('@admin'.length)}`\n }\n\n return modulePath\n}\n\nfunction getScriptKind(filePath: string): ts.ScriptKind {\n if (filePath.endsWith('.tsx')) {\n return ts.ScriptKind.TSX\n }\n\n if (filePath.endsWith('.jsx')) {\n return ts.ScriptKind.JSX\n }\n\n return ts.ScriptKind.TS\n}\n\nfunction namespaceGeneratedIdentifiers(\n content: string,\n namespace: string,\n filePath: string\n): string {\n const resolved = resolveAdminNamespace(namespace)\n const typeReplacements = new Map([\n ['UserData', 'User'],\n ['UsersResponse', 'UsersPage'],\n ['SettingData', 'Setting'],\n ['UpsertSettingInput', 'SettingUpsertInput'],\n ['UpsertSettingResult', 'SettingUpsertResult'],\n ['AdminNavigationItem', `${resolved.pascal}NavigationItem`],\n ['AdminUserSummary', `${resolved.pascal}UserSummary`],\n ['AdminMedia', `${resolved.pascal}Media`]\n ])\n const valueReplacements = new Map([['adminMedia', `${resolved.camel}Media`]])\n const sourceFile = ts.createSourceFile(\n filePath,\n content,\n ts.ScriptTarget.Latest,\n true,\n getScriptKind(filePath)\n )\n const edits: Array<{ start: number; end: number; value: string }> = []\n\n function addEdit(node: ts.Identifier, value: string): void {\n edits.push({\n start: node.getStart(sourceFile),\n end: node.getEnd(),\n value\n })\n }\n\n function getModulePathForSpecifier(node: ts.Node): string | null {\n if (ts.isImportSpecifier(node)) {\n const namedBindings = node.parent\n const importClause = namedBindings.parent\n const importDeclaration = importClause.parent\n if (ts.isImportDeclaration(importDeclaration)) {\n return getModuleSpecifierText(importDeclaration.moduleSpecifier)\n }\n }\n\n if (ts.isExportSpecifier(node)) {\n const namedExports = node.parent\n const exportDeclaration = namedExports.parent\n if (ts.isExportDeclaration(exportDeclaration) && exportDeclaration.moduleSpecifier) {\n return getModuleSpecifierText(exportDeclaration.moduleSpecifier)\n }\n }\n\n return null\n }\n\n function getModuleSpecifierText(moduleSpecifier: ts.Expression): string | null {\n if (\n ts.isStringLiteral(moduleSpecifier) ||\n ts.isNoSubstitutionTemplateLiteral(moduleSpecifier)\n ) {\n return moduleSpecifier.text\n }\n\n return null\n }\n\n function isGeneratedAdminModulePath(modulePath: string): boolean {\n return (\n modulePath === '@admin' ||\n modulePath.startsWith('@admin/') ||\n modulePath === resolved.alias ||\n modulePath.startsWith(`${resolved.alias}/`)\n )\n }\n\n function isGeneratedMediaTableModulePath(modulePath: string): boolean {\n return (\n modulePath === '@admin/db/schema' ||\n modulePath === `${resolved.alias}/db/schema` ||\n modulePath.endsWith('/db/schema')\n )\n }\n\n function isImportOrExportSpecifierName(node: ts.Identifier): boolean {\n const parent = node.parent\n return (\n (ts.isImportSpecifier(parent) && (parent.name === node || parent.propertyName === node)) ||\n (ts.isExportSpecifier(parent) && (parent.name === node || parent.propertyName === node))\n )\n }\n\n function shouldRewriteSpecifier(\n node: ts.Identifier,\n replacements: Map<string, string>,\n modulePathPredicate: (modulePath: string) => boolean\n ): string | null {\n if (!isImportOrExportSpecifierName(node)) {\n return null\n }\n\n const parent = node.parent as ts.ImportSpecifier | ts.ExportSpecifier\n const modulePath = getModulePathForSpecifier(parent)\n if (!modulePath || !modulePathPredicate(modulePath)) {\n return null\n }\n\n return replacements.get(node.text) ?? null\n }\n\n function shouldRewriteTypeIdentifier(node: ts.Identifier): string | null {\n const specifierReplacement = shouldRewriteSpecifier(\n node,\n typeReplacements,\n isGeneratedAdminModulePath\n )\n if (specifierReplacement) {\n return specifierReplacement\n }\n\n const replacement = typeReplacements.get(node.text)\n if (!replacement) {\n return null\n }\n\n const parent = node.parent\n if (\n (ts.isTypeReferenceNode(parent) && parent.typeName === node) ||\n (ts.isExpressionWithTypeArguments(parent) && parent.expression === node) ||\n (ts.isInterfaceDeclaration(parent) && parent.name === node) ||\n (ts.isTypeAliasDeclaration(parent) && parent.name === node)\n ) {\n return replacement\n }\n\n return null\n }\n\n function isValueDeclarationOrPropertyName(node: ts.Identifier): boolean {\n const parent = node.parent\n\n return (\n (ts.isImportSpecifier(parent) && (parent.name === node || parent.propertyName === node)) ||\n (ts.isExportSpecifier(parent) && (parent.name === node || parent.propertyName === node)) ||\n (ts.isPropertyAccessExpression(parent) && parent.name === node) ||\n (ts.isPropertyAssignment(parent) && parent.name === node) ||\n (ts.isShorthandPropertyAssignment(parent) && parent.name === node) ||\n (ts.isBindingElement(parent) && parent.name === node) ||\n (ts.isVariableDeclaration(parent) && parent.name === node) ||\n (ts.isParameter(parent) && parent.name === node) ||\n (ts.isFunctionDeclaration(parent) && parent.name === node) ||\n (ts.isFunctionExpression(parent) && parent.name === node) ||\n (ts.isPropertyDeclaration(parent) && parent.name === node) ||\n (ts.isMethodDeclaration(parent) && parent.name === node) ||\n (ts.isMethodSignature(parent) && parent.name === node) ||\n (ts.isPropertySignature(parent) && parent.name === node)\n )\n }\n\n function shouldRewriteValueIdentifier(node: ts.Identifier): string | null {\n const specifierReplacement = shouldRewriteSpecifier(\n node,\n valueReplacements,\n isGeneratedMediaTableModulePath\n )\n if (specifierReplacement) {\n return specifierReplacement\n }\n\n const replacement = valueReplacements.get(node.text)\n if (!replacement || isValueDeclarationOrPropertyName(node)) {\n return null\n }\n\n return replacement\n }\n\n function visit(node: ts.Node): void {\n if (ts.isIdentifier(node)) {\n const value = shouldRewriteTypeIdentifier(node) ?? shouldRewriteValueIdentifier(node)\n if (value) {\n addEdit(node, value)\n }\n }\n\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n if (edits.length === 0) {\n return content\n }\n\n let output = content\n for (const edit of edits.slice().reverse()) {\n output = `${output.slice(0, edit.start)}${edit.value}${output.slice(edit.end)}`\n }\n\n return output\n}\n\nfunction namespaceModuleSpecifiers(content: string, namespace: string): string {\n const replaceModulePath = (_match: string, prefix: string, modulePath: string, suffix: string) =>\n `${prefix}${rewriteAdminModulePath(modulePath, namespace)}${suffix}`\n\n return content\n .replace(\n /^(\\s*(?:(?:import|export)\\b[^\\n]*\\bfrom\\s+|\\}\\s+from\\s+)['\"])(@admin(?:\\/[^'\"]*)?)(['\"])/gm,\n replaceModulePath\n )\n .replace(/^(\\s*import\\s+['\"])(@admin(?:\\/[^'\"]*)?)(['\"])/gm, replaceModulePath)\n}\n\nfunction namespaceGeneratedContent(content: string, namespace: string, filePath: string): string {\n return namespaceModuleSpecifiers(\n namespaceGeneratedIdentifiers(content, namespace, filePath),\n namespace\n )\n}\n\nexport function namespaceGeneratedFiles(\n files: GeneratedFile[],\n namespace: string\n): GeneratedFile[] {\n return files.map((file) => ({\n path: file.path,\n content: namespaceGeneratedContent(file.content, namespace, file.path)\n }))\n}\n","/**\n * Form pipeline orchestrator — runs all form generation steps in sequence\n */\n\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport type { FormSchema, GeneratedFile, GeneratorOptions } from '@core-engine/schema/types.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveExtensionNamespace, resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport { generateFormAdminPages } from '@next-adapter/generators/form-admin/index.js'\nimport { updateFormNavigation } from '@next-adapter/generators/form-navigation.js'\nimport { generateFormActions } from '@next-adapter/generators/form-pipeline/form-actions.js'\nimport { generateFormComponent } from '@next-adapter/generators/form-pipeline/form-component.js'\nimport { generateFormDatabase } from '@next-adapter/generators/form-pipeline/form-database.js'\nimport { generateFormHook } from '@next-adapter/generators/form-pipeline/form-hook.js'\nimport { namespaceGeneratedFiles } from '@next-adapter/generators/namespace-output.js'\n\nexport interface FormPipelineResult {\n success: boolean\n files: GeneratedFile[]\n errors: string[]\n}\n\n/**\n * Run the form generation pipeline\n */\nexport function runFormPipeline(\n schema: FormSchema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n options: GeneratorOptions = {}\n): FormPipelineResult {\n const paths = resolveProjectPaths(config)\n const outputNamespace = resolveExtensionNamespace(schema.name, options.outputNamespace)\n const adminNamespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const namespacedOptions = {\n ...options,\n outputNamespace,\n adminDir: paths.adminDir,\n adminRoutePath: adminNamespace.routePath,\n adminImportAlias: adminNamespace.alias,\n nextMajorVersion: config.nextMajorVersion\n }\n const files: GeneratedFile[] = []\n const errors: string[] = []\n\n const steps: { name: string; run: () => GeneratedFile[] }[] = [\n {\n name: 'Database schema (submissions)',\n run: () => generateFormDatabase(schema, paths.adminDbDir, namespacedOptions).files\n },\n {\n name: 'Server actions',\n run: () => generateFormActions(schema, paths.adminActionsDir, namespacedOptions).files\n },\n {\n name: 'React Query hook',\n run: () => generateFormHook(schema, paths.adminHooksDir, namespacedOptions).files\n },\n {\n name: 'Public form component',\n run: () => generateFormComponent(schema, cwd, paths.adminDir, namespacedOptions).files\n },\n {\n name: 'Admin pages',\n run: () => generateFormAdminPages(schema, paths.pagesDir, namespacedOptions).files\n },\n {\n name: 'Navigation',\n run: () => updateFormNavigation(schema, paths.adminNavigationDir, namespacedOptions).files\n }\n ]\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]\n const stepNum = i + 1\n try {\n const result = step.run()\n files.push(...result)\n if (!options.silent) console.log(` ${stepNum}. ${step.name} ✓`)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n errors.push(`${step.name}: ${msg}`)\n if (!options.silent) console.error(` ${stepNum}. ${step.name} ✗ — ${msg}`)\n }\n }\n\n return {\n success: errors.length === 0,\n files: namespaceGeneratedFiles(files, config.frameworkConfig.next.namespace),\n errors\n }\n}\n","export function lifecycleHookImport(): string {\n return `\\nimport { runAfterHooks, runBeforeHooks } from '@admin/lib/lifecycle-hooks'`\n}\n\nexport function lifecycleContext(entityType: string, extras: string): string {\n return `{\n user: actor,\n entityType: '${entityType}',\n timestamp: now${extras}\n }`\n}\n\nexport function beforeHook(event: string, context: string): string {\n return `await runBeforeHooks('${event}', ${context})`\n}\n\nexport function afterHook(event: string, context: string): string {\n return `runAfterHooks('${event}', ${context})`\n}\n","/**\n * Content generators for individual entity action files.\n * Each function returns the string content for one generated file.\n */\n\nimport type { SchemaField } from '@core-engine/schema/types.js'\nimport { singularize, toCamelCase, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { buildAuthorshipAliasBlock } from '@next-adapter/generators/actions/action-helpers.js'\nimport {\n afterHook,\n beforeHook,\n lifecycleContext,\n lifecycleHookImport\n} from '@next-adapter/generators/actions/lifecycle-hook-emissions.js'\nimport type { ResolvedEntityFilter } from '@next-adapter/generators/entity-filters.js'\n\n/** Shared context for all entity file generators */\nexport interface EntityCtx {\n singular: string\n plural: string\n Singular: string\n Plural: string\n tableVar: string\n camelSingular: string\n camelPlural: string\n cacheTag: string\n cacheReadImport: string\n cacheLifeLine: string\n /** Cache invalidation function name: 'updateTag' (Next >=16) or 'revalidateTag' (Next <16) */\n cacheInvalidationFn: string\n hasRelationships: boolean\n hasM2M: boolean\n hasListRels: boolean\n hasMediaFields: boolean\n mediaFields: SchemaField[]\n galleryFields: SchemaField[]\n hasHtmlOutput: boolean\n hasSlug: boolean\n hasDraft: boolean\n hasSearch: boolean\n hasFilters: boolean\n hasAutoSlug: boolean\n hasCreatableSelectFields: boolean\n searchFields: string[]\n htmlOutputFields: SchemaField[]\n creatableSelectFields: SchemaField[]\n m2mFields: SchemaField[]\n filterableFields: SchemaField[]\n relTableImports: string[]\n listRelTableImports: string[]\n // Pre-computed template fragments\n dataInterface: string\n displayDataInterface: string\n responseInterface: string\n filtersInterface: string\n createInterface: string\n updateInterface: string\n selectClause: string\n listSelectClause: string\n displaySelectClause: string\n filterConditions: string\n searchBlock: string\n resultMapping: string\n listResultMapping: string\n singleRowReturn: string\n displaySingleRowReturn: string\n fieldMeta: string\n createMappings: string\n htmlCreateBlock: string\n htmlCreateMappings: string\n autoSlugCreate: string\n autoSlugUpdate: string\n populateListRelsFn: string\n filters: ResolvedEntityFilter[]\n sortableColumns: string[]\n selectOptionsTableVar: string\n versionSnapshotKeys: string[]\n versionRestoreKeys: string[]\n}\n\nexport interface SelectOptionCtx {\n singular: string\n plural: string\n Singular: string\n camelSingular: string\n cacheReadImport: string\n cacheLifeLine: string\n /** Cache invalidation function name: 'updateTag' (Next >=16) or 'revalidateTag' (Next <16) */\n cacheInvalidationFn: string\n creatableSelectFields: SchemaField[]\n selectOptionsTableVar: string\n}\n\n// ============================================================================\n// types.ts\n// ============================================================================\n\nexport function genTypesContent(ctx: EntityCtx): string {\n const idPlaceholder = '$' + '{id}'\n const tagEntries = [\n ` all: '${ctx.cacheTag}'`,\n ` byId: (id: string) => \\`${ctx.plural}:id:${idPlaceholder}\\``\n ]\n if (ctx.hasSlug) {\n tagEntries.push(` bySlug: (slug: string) => \\`${ctx.plural}:slug:\\${slug}\\``)\n }\n\n const parts = [\n ctx.dataInterface,\n ctx.displayDataInterface || null,\n ctx.responseInterface,\n ctx.filtersInterface,\n ctx.hasCreatableSelectFields ? buildSelectOptionTypes(ctx) : null,\n ctx.createInterface,\n `export interface ${ctx.Singular}CreateResult {\\n success: boolean\\n error?: string\\n ${ctx.camelSingular}?: ${ctx.Singular}\\n}`,\n ctx.updateInterface,\n `export interface ${ctx.Singular}UpdateResult {\\n success: boolean\\n error?: string\\n ${ctx.camelSingular}?: ${ctx.Singular}\\n}`,\n `export interface ${ctx.Singular}DeleteResult {\\n success: boolean\\n error?: string\\n}`,\n `export const ${ctx.camelPlural}CacheTags = {\\n${tagEntries.join(',\\n')}\\n} as const`\n ]\n return `${parts.filter(Boolean).join('\\n\\n')}\\n`\n}\n\nexport function buildSelectOptionTypes(ctx: SelectOptionCtx): string {\n const fieldNames = ctx.creatableSelectFields\n .map((field) => JSON.stringify(field.name))\n .join(' | ')\n\n return `export type ${ctx.Singular}SelectOptionFieldName = ${fieldNames}\n\nexport interface ${ctx.Singular}SelectOption {\n id: string\n fieldName: ${ctx.Singular}SelectOptionFieldName\n label: string\n value: string\n createdAt: string\n updatedAt: string\n}\n\nexport interface Create${ctx.Singular}SelectOptionInput {\n fieldName: ${ctx.Singular}SelectOptionFieldName\n label: string\n}\n\nexport interface Create${ctx.Singular}SelectOptionResult {\n success: boolean\n error?: string\n option?: ${ctx.Singular}SelectOption\n}\n\nexport const ${ctx.camelSingular}SelectOptionsCacheTags = {\n byField: (fieldName: ${ctx.Singular}SelectOptionFieldName) => \\`${ctx.plural}:select-options:\\${fieldName}\\`\n} as const`\n}\n\n// ============================================================================\n// helpers.ts (conditional)\n// ============================================================================\n\nexport function genHelpersContent(ctx: EntityCtx): string | null {\n const lines: string[] = []\n const drizzleImports = new Set<string>()\n const schemaImports = new Set<string>()\n\n if (ctx.hasM2M) {\n drizzleImports.add('eq')\n for (const field of ctx.m2mFields) {\n schemaImports.add(toCamelCase(`${ctx.singular}${toPascalCase(field.relationship || '')}`))\n }\n }\n if (ctx.hasListRels) {\n drizzleImports.add('inArray')\n for (const t of ctx.listRelTableImports) schemaImports.add(t)\n }\n if (ctx.hasMediaFields) {\n drizzleImports.add('inArray')\n schemaImports.add('adminMedia')\n }\n\n if (ctx.hasM2M || ctx.hasListRels || ctx.hasMediaFields) {\n lines.push(`import db from '@admin/db'`)\n }\n const tables = [...schemaImports].sort()\n if (tables.length > 0) {\n lines.push(`import { ${tables.join(', ')} } from '@admin/db/schema'`)\n }\n if (drizzleImports.size > 0) {\n lines.push(`import { ${[...drizzleImports].sort().join(', ')} } from 'drizzle-orm'`)\n }\n if (ctx.hasMediaFields) {\n lines.push(`import type { AdminMedia } from '@admin/types'`)\n }\n lines.push(`import type { ${ctx.Singular} } from './types'`)\n lines.push('')\n\n if (ctx.hasListRels) {\n const exportedFn = ctx.populateListRelsFn\n .replace('async function', 'export async function')\n .trim()\n lines.push(exportedFn)\n lines.push('')\n }\n\n if (ctx.hasMediaFields) {\n lines.push(generateResolveMediaFunction(ctx))\n lines.push('')\n }\n\n lines.push(generateVersionSnapshotHelpers(ctx))\n lines.push('')\n\n return lines.join('\\n')\n}\n\nfunction generateVersionSnapshotHelpers(ctx: EntityCtx): string {\n const snapshotKeys = ctx.versionSnapshotKeys.map((key) => JSON.stringify(key)).join(', ')\n const restoreKeys = ctx.versionRestoreKeys.map((key) => JSON.stringify(key)).join(', ')\n const m2mKeys = ctx.m2mFields.map((field) => JSON.stringify(field.name)).join(', ')\n const loadM2MStatements = ctx.m2mFields\n .map((field) => {\n const rel = field.relationship || ''\n const RelPascal = toPascalCase(rel)\n const relSingular = singularize(rel)\n const junctionVar = toCamelCase(`${ctx.singular}${RelPascal}`)\n const entityIdCol = `${ctx.singular}Id`\n const relIdCol = `${relSingular}Id`\n\n return ` const ${field.name}Rows = await client\n .select({ ${relIdCol}: ${junctionVar}.${relIdCol} })\n .from(${junctionVar})\n .where(eq(${junctionVar}.${entityIdCol}, id))\n snapshot.${field.name} = ${field.name}Rows.map((row) => row.${relIdCol})`\n })\n .join('\\n')\n const snapshotClientType = ctx.hasM2M\n ? `\\ntype VersionSnapshotClient = typeof db | Parameters<Parameters<typeof db.transaction>[0]>[0]\\n`\n : ''\n const relationshipSnapshotHelper = ctx.hasM2M\n ? `\nexport async function build${ctx.Singular}VersionSnapshotWithRelationships(\n row: Partial<${ctx.Singular}> | Record<string, unknown>,\n client: VersionSnapshotClient = db\n): Promise<Record<string, unknown>> {\n const source = row as Record<string, unknown>\n const snapshot = build${ctx.Singular}VersionSnapshot(source)\n const id = typeof source.id === 'string' ? source.id : null\n\n if (!id) {\n for (const key of VERSION_M2M_KEYS) {\n snapshot[key] = Array.isArray(snapshot[key]) ? snapshot[key] : []\n }\n return snapshot\n }\n\n${loadM2MStatements}\n\n return snapshot\n}\n`\n : ''\n\n return `${snapshotClientType}const VERSION_SNAPSHOT_KEYS = [${snapshotKeys}] as const\nconst VERSION_RESTORE_KEYS = [${restoreKeys}] as const\nconst VERSION_M2M_KEYS = [${m2mKeys}] as const\n\nexport function build${ctx.Singular}VersionSnapshot(row: Partial<${ctx.Singular}> | Record<string, unknown>): Record<string, unknown> {\n const source = row as Record<string, unknown>\n const snapshot: Record<string, unknown> = {}\n\n for (const key of VERSION_SNAPSHOT_KEYS) {\n if (key in source) {\n snapshot[key] = source[key]\n }\n }\n\n for (const key of VERSION_M2M_KEYS) {\n snapshot[key] = Array.isArray(snapshot[key]) ? snapshot[key] : []\n }\n\n return snapshot\n}\n${relationshipSnapshotHelper}\n\nexport function build${ctx.Singular}RestoreData(data: Record<string, unknown>): Record<string, unknown> {\n const restoreData: Record<string, unknown> = {}\n\n for (const key of VERSION_RESTORE_KEYS) {\n if (key in data) {\n restoreData[key] = data[key]\n }\n }\n\n return restoreData\n}\n\nexport function has${ctx.Singular}VersionChanges(\n previous: Record<string, unknown>,\n next: Record<string, unknown>\n): boolean {\n return JSON.stringify(previous) !== JSON.stringify(next)\n}`\n}\n\nfunction generateResolveMediaFunction(ctx: EntityCtx): string {\n const singleFields = ctx.mediaFields.map((f) => f.name)\n const arrayFields = ctx.galleryFields.map((f) => f.name)\n\n const collectSingle = singleFields\n .map(\n (name) =>\n ` for (const row of rows) {\\n const val = row.${name}\\n if (val && typeof val === 'string' && !val.startsWith('http')) ids.add(val)\\n }`\n )\n .join('\\n')\n const collectArray = arrayFields\n .map(\n (name) =>\n ` for (const row of rows) {\\n const arr = row.${name}\\n if (Array.isArray(arr)) for (const id of arr) { if (id && !id.startsWith('http')) ids.add(id) }\\n }`\n )\n .join('\\n')\n\n const assignSingle = singleFields\n .map(\n (name) =>\n ` row.${name}Media = (row.${name} && !row.${name}.startsWith('http')) ? mediaMap.get(row.${name}) ?? null : null`\n )\n .join('\\n')\n const assignArray = arrayFields\n .map(\n (name) =>\n ` row.${name}Media = Array.isArray(row.${name}) ? row.${name}.map((id: string) => mediaMap.get(id)).filter(Boolean) as AdminMedia[] : []`\n )\n .join('\\n')\n\n return `export async function resolve${ctx.Singular}MediaFields(rows: ${ctx.Singular}[]): Promise<${ctx.Singular}[]> {\n if (rows.length === 0) return rows\n\n const ids = new Set<string>()\n${collectSingle}${collectArray ? `\\n${collectArray}` : ''}\n\n if (ids.size === 0) {\n for (const row of rows) {\n${singleFields.map((name) => ` row.${name}Media = null`).join('\\n')}${arrayFields.length > 0 ? `\\n${arrayFields.map((name) => ` row.${name}Media = []`).join('\\n')}` : ''}\n }\n return rows\n }\n\n const mediaRows = await db.select().from(adminMedia).where(inArray(adminMedia.id, [...ids]))\n const mediaMap = new Map<string, AdminMedia>(mediaRows.map(m => [m.id, m]))\n\n for (const row of rows) {\n${assignSingle}${assignArray ? `\\n${assignArray}` : ''}\n }\n\n return rows\n}`\n}\n\n// ============================================================================\n// get-{plural}.ts\n// ============================================================================\n\nexport function genGetPluralContent(ctx: EntityCtx): string {\n const dbImports = [ctx.tableVar, 'user', ...ctx.relTableImports].sort()\n const drizzle: string[] = ['asc', 'desc']\n const hasDateRangeFilters = ctx.filters.some((filter) => filter.type === 'date-range')\n if (ctx.hasSearch || ctx.filterableFields.length > 1) drizzle.push('and')\n if (ctx.hasSearch) drizzle.push('ilike', 'or')\n if (ctx.filterableFields.some(() => true)) drizzle.push('eq')\n if (hasDateRangeFilters) drizzle.push('gte', 'lt')\n drizzle.push('sql')\n if (ctx.hasRelationships) drizzle.push('eq')\n const sortedDrizzle = [...new Set(drizzle)].sort()\n\n const typeImports = [`${ctx.Plural}Page`, `${ctx.Plural}Query`, `${ctx.Singular}`]\n const helperImports: string[] = []\n if (ctx.hasListRels) helperImports.push(`populate${ctx.Singular}ListRelationships`)\n if (ctx.hasMediaFields) helperImports.push(`resolve${ctx.Singular}MediaFields`)\n const populateImport =\n helperImports.length > 0 ? `\\nimport { ${helperImports.join(', ')} } from './helpers'` : ''\n const dateRangeHelper = hasDateRangeFilters\n ? `\n\nfunction getExclusiveDateUpperBound(value?: string): string | null {\n if (!value) return null\n\n const date = new Date(\\`\\${value}T00:00:00.000Z\\`)\n if (Number.isNaN(date.getTime())) return null\n\n date.setUTCDate(date.getUTCDate() + 1)\n return date.toISOString().slice(0, 10)\n}`\n : ''\n\n // Build the column map for dynamic orderBy\n const sortableColumns = ctx.sortableColumns ?? []\n const columnMapEntries = sortableColumns\n .map((col: string) => ` '${col}': ${ctx.tableVar}.${col}`)\n .join(',\\n')\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { ${dbImports.join(', ')} } from '@admin/db/schema'\nimport { ${sortedDrizzle.join(', ')} } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/pg-core'\n${ctx.cacheReadImport}\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport type { ${typeImports.sort().join(', ')} } from './types'${populateImport}${dateRangeHelper}\n\n${buildAuthorshipAliasBlock()}\n\nconst SORTABLE_COLUMNS = {\n${columnMapEntries}\n} as const\n\nexport async function get${ctx.Plural}(query?: ${ctx.Plural}Query): Promise<${ctx.Plural}Page> {\n 'use cache'${ctx.cacheLifeLine}\n cacheTag(${ctx.camelPlural}CacheTags.all)\n\n try {\n const conditions = []\n${ctx.searchBlock}${ctx.filterConditions}\n\n const baseQuery = ${ctx.listSelectClause}\n\n // Determine sort order: use requested column or default to sortOrder\n const sortColumn = query?.orderBy && query.orderBy in SORTABLE_COLUMNS\n ? SORTABLE_COLUMNS[query.orderBy as keyof typeof SORTABLE_COLUMNS]\n : ${ctx.tableVar}.sortOrder\n const sortFn = query?.orderDirection === 'desc' ? desc : asc\n const orderClause = sortFn(sortColumn)\n\n const orderedQuery = conditions.length > 0\n ? baseQuery.where(and(...conditions)).orderBy(orderClause)\n : baseQuery.orderBy(orderClause)\n\n const rawLimit = query?.limit\n const limit = typeof rawLimit === 'number'\n ? Number.isFinite(rawLimit)\n ? Math.max(1, rawLimit)\n : 1\n : undefined\n const rawOffset = query?.offset\n const offset = typeof rawOffset === 'number' && Number.isFinite(rawOffset)\n ? Math.max(0, rawOffset)\n : 0\n const isPaginated = typeof limit === 'number'\n let results: unknown[]\n if (isPaginated) {\n const paginatedQuery = offset > 0\n ? orderedQuery.limit(limit).offset(offset)\n : orderedQuery.limit(limit)\n results = await paginatedQuery\n } else {\n results = await orderedQuery\n }\n\n const total = isPaginated\n ? Number((await db.select({ count: sql\\`count(*)\\` }).from(${ctx.tableVar})${ctx.hasSearch || ctx.filterableFields.length > 0 ? '.where(conditions.length > 0 ? and(...conditions) : undefined)' : ''})[0]?.count ?? 0)\n : results.length${ctx.listResultMapping}\n } catch (error) {\n console.error('Error fetching ${ctx.plural}:', error)\n return { ${ctx.camelPlural}: [], total: 0 }\n }\n}\n`\n}\n\n// ============================================================================\n// get-{singular}-by-id.ts\n// ============================================================================\n\nexport function genGetByIdContent(ctx: EntityCtx): string {\n const dbImports = [ctx.tableVar, 'user', ...ctx.relTableImports].sort()\n const drizzle: string[] = ['eq']\n const sortedDrizzle = [...new Set(drizzle)].sort()\n\n const byIdHelperImports: string[] = []\n if (ctx.hasListRels) byIdHelperImports.push(`populate${ctx.Singular}ListRelationships`)\n if (ctx.hasMediaFields) byIdHelperImports.push(`resolve${ctx.Singular}MediaFields`)\n const populateImport =\n byIdHelperImports.length > 0\n ? `\\nimport { ${byIdHelperImports.join(', ')} } from './helpers'`\n : ''\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { ${dbImports.join(', ')} } from '@admin/db/schema'\nimport { ${sortedDrizzle.join(', ')} } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/pg-core'\n${ctx.cacheReadImport}\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport type { ${ctx.Singular} } from './types'${populateImport}\n\n${buildAuthorshipAliasBlock()}\n\nexport async function get${ctx.Singular}ById(id: string): Promise<${ctx.Singular} | null> {\n 'use cache'${ctx.cacheLifeLine}\n cacheTag(${ctx.camelPlural}CacheTags.byId(id))\n cacheTag(${ctx.camelPlural}CacheTags.all)\n\n try {\n const result = await ${ctx.selectClause}.where(eq(${ctx.tableVar}.id, id)).limit(1)\n if (result.length === 0) return null\n ${ctx.singleRowReturn}\n } catch (error) {\n console.error('Error fetching ${ctx.singular}:', error)\n return null\n }\n}\n`\n}\n\n// ============================================================================\n// get-{singular}-by-slug.ts (conditional)\n// ============================================================================\n\nexport function genGetBySlugContent(ctx: EntityCtx): string | null {\n if (!ctx.hasSlug) return null\n const returnType = ctx.hasHtmlOutput ? `${ctx.Singular}View` : `${ctx.Singular}`\n const dbImports = [ctx.tableVar, 'user', ...ctx.relTableImports].sort()\n const drizzle: string[] = ['eq']\n const sortedDrizzle = [...new Set(drizzle)].sort()\n\n const typeImport = ctx.hasHtmlOutput ? `${ctx.Singular}View` : `${ctx.Singular}`\n const extraTypes = ctx.hasListRels && ctx.hasHtmlOutput ? `, ${ctx.Singular}` : ''\n const populateImport = ctx.hasListRels\n ? `\\nimport { populate${ctx.Singular}ListRelationships } from './helpers'`\n : ''\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { ${dbImports.join(', ')} } from '@admin/db/schema'\nimport { ${sortedDrizzle.join(', ')} } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/pg-core'\n${ctx.cacheReadImport}\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport type { ${typeImport}${extraTypes} } from './types'${populateImport}\n\n${buildAuthorshipAliasBlock()}\n\nexport async function get${ctx.Singular}BySlug(slug: string): Promise<${returnType} | null> {\n 'use cache'${ctx.cacheLifeLine}\n cacheTag(${ctx.camelPlural}CacheTags.bySlug(slug))\n cacheTag(${ctx.camelPlural}CacheTags.all)\n\n try {\n const result = await ${ctx.displaySelectClause}.where(eq(${ctx.tableVar}.slug, slug)).limit(1)\n if (result.length === 0) return null\n ${ctx.displaySingleRowReturn}\n } catch (error) {\n console.error('Error fetching ${ctx.singular} by slug:', error)\n return null\n }\n}\n`\n}\n\n// ============================================================================\n// create-{singular}.ts\n// ============================================================================\n\nexport function genCreateContent(ctx: EntityCtx): string {\n const kebabSingular = toKebabCase(ctx.singular)\n const snapshotImport = ctx.hasM2M\n ? `build${ctx.Singular}VersionSnapshotWithRelationships`\n : `build${ctx.Singular}VersionSnapshot`\n const snapshotData = ctx.hasM2M\n ? `await build${ctx.Singular}VersionSnapshotWithRelationships(createdRow as ${ctx.Singular}, tx)`\n : `build${ctx.Singular}VersionSnapshot(createdRow as ${ctx.Singular})`\n const slugImport = ctx.hasAutoSlug\n ? `\\nimport { slugify } from '@admin/utils/validation/validation'`\n : ''\n const markdownImport = ctx.hasHtmlOutput\n ? `\\nimport { renderMarkdownSync } from './markdown'`\n : ''\n const createContext = lifecycleContext(\n ctx.plural,\n `,\\n input: input as unknown as Record<string, unknown>`\n )\n const createResultContext = lifecycleContext(\n ctx.plural,\n `,\\n entityId: created${ctx.Singular}Id,\\n input: input as unknown as Record<string, unknown>,\\n data: created${ctx.Singular}Data as unknown as Record<string, unknown>`\n )\n const createBeforePublishBlock = ctx.hasDraft\n ? `\\n const isCreatingPublished = input.published === true\\n if (isCreatingPublished) {\\n ${beforeHook('beforePublish', 'lifecycleContext')}\\n }\\n`\n : ''\n const createAfterPublishBlock = ctx.hasDraft\n ? `\\n if (result[0]?.published === true) {\\n ${afterHook('afterPublish', `created${ctx.Singular}Context`)}\\n }`\n : ''\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${ctx.tableVar} } from '@admin/db/schema'\nimport { desc } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { createEntityVersion, entityVersionsCacheTags } from '@admin/actions/entity-versions'\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport { get${ctx.Singular}ById } from './get-${kebabSingular}-by-id'\nimport { ${snapshotImport} } from './helpers'\n${lifecycleHookImport()}\nimport type { ${ctx.Singular}CreateInput, ${ctx.Singular}CreateResult, ${ctx.Singular} } from './types'${markdownImport}${slugImport}\n\nexport async function create${ctx.Singular}(input: ${ctx.Singular}CreateInput): Promise<${ctx.Singular}CreateResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n const actorId = actor.id\n const now = new Date().toISOString()\n const lifecycleContext = ${createContext}\n ${beforeHook('beforeCreate', 'lifecycleContext')}\n${ctx.autoSlugCreate}\n${createBeforePublishBlock}\n\n const result = await db.transaction(async (tx) => {\n const maxSortOrderResult = await tx\n .select({ maxOrder: ${ctx.tableVar}.sortOrder })\n .from(${ctx.tableVar})\n .orderBy(desc(${ctx.tableVar}.sortOrder))\n .limit(1)\n const nextSortOrder = (maxSortOrderResult[0]?.maxOrder ?? 0) + 1\n${ctx.htmlCreateBlock}\n const createdRows = await tx.insert(${ctx.tableVar}).values({\n${ctx.createMappings},${ctx.hasHtmlOutput ? `\\n${ctx.htmlCreateMappings},` : ''}${ctx.hasDraft ? `\\n published: input.published ?? false,` : ''}\n sortOrder: nextSortOrder,\n createdAt: now,\n updatedAt: now,\n createdBy: actorId,\n updatedBy: actorId\n }).returning()\n\n const createdRow = createdRows[0]\n if (createdRow?.id) {\n await createEntityVersion(tx, {\n entityType: '${ctx.plural}',\n entityId: createdRow.id,\n data: ${snapshotData},\n createdBy: actorId\n })\n }\n\n return createdRows\n })\n\n const created${ctx.Singular}Id = result[0]?.id\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n if (created${ctx.Singular}Id !== null && created${ctx.Singular}Id !== undefined) {\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.byId(created${ctx.Singular}Id))\n ${ctx.cacheInvalidationFn}(entityVersionsCacheTags.for('${ctx.plural}', created${ctx.Singular}Id))\n }\n const created${ctx.Singular} =\n typeof created${ctx.Singular}Id === 'string'\n ? await get${ctx.Singular}ById(created${ctx.Singular}Id)\n : null\n const created${ctx.Singular}Data = created${ctx.Singular} ?? (result[0] as ${ctx.Singular})\n const created${ctx.Singular}Context = ${createResultContext}\n ${afterHook('afterCreate', `created${ctx.Singular}Context`)}\n${createAfterPublishBlock}\n\n return {\n success: true,\n ${ctx.camelSingular}: created${ctx.Singular}Data\n }\n } catch (error) {\n console.error('Error creating ${ctx.singular}:', error)\n throw new Error(error instanceof Error ? error.message : 'Failed to create ${ctx.singular}')\n }\n}\n`\n}\n\n// ============================================================================\n// update-{singular}.ts\n// ============================================================================\n\nexport function genUpdateContent(ctx: EntityCtx): string {\n const kebabSingular = toKebabCase(ctx.singular)\n const snapshotImport = ctx.hasM2M\n ? `build${ctx.Singular}VersionSnapshotWithRelationships`\n : `build${ctx.Singular}VersionSnapshot`\n const previousSnapshot = ctx.hasM2M\n ? `await build${ctx.Singular}VersionSnapshotWithRelationships(previousRow as ${ctx.Singular}, tx)`\n : `build${ctx.Singular}VersionSnapshot(previousRow as ${ctx.Singular})`\n const slugImport = ctx.hasAutoSlug\n ? `\\nimport { slugify } from '@admin/utils/validation/validation'`\n : ''\n const markdownImport = ctx.hasHtmlOutput\n ? `\\nimport { renderMarkdownSync } from './markdown'`\n : ''\n const htmlUpdateBlock = ctx.hasHtmlOutput\n ? `\\n` +\n ctx.htmlOutputFields\n .map(\n (f) =>\n ` if (processedData.${f.name} !== undefined) {\\n processedData.${f.name}Html = renderMarkdownSync(String(processedData.${f.name} || ''))\\n }`\n )\n .join('\\n') +\n '\\n'\n : ''\n const updateContext = lifecycleContext(\n ctx.plural,\n `,\\n entityId: id,\\n input: updateData as unknown as Record<string, unknown>`\n )\n const updateResultContext = lifecycleContext(\n ctx.plural,\n `,\\n entityId: id,\\n input: updateData as unknown as Record<string, unknown>,\\n data: updated${ctx.Singular}Data as unknown as Record<string, unknown>`\n )\n const updateBeforePublishBlock = ctx.hasDraft\n ? `\\n const isPublishing = previousRow.published !== true && updateData.published === true\\n const isUnpublishing = previousRow.published === true && updateData.published === false\\n if (isPublishing) {\\n ${beforeHook('beforePublish', 'lifecycleContext')}\\n }\\n if (isUnpublishing) {\\n ${beforeHook('beforeUnpublish', 'lifecycleContext')}\\n }\\n`\n : ''\n const updateAfterPublishBlock = ctx.hasDraft\n ? `\\n if (isPublishing) {\\n ${afterHook('afterPublish', `updated${ctx.Singular}Context`)}\\n }\\n if (isUnpublishing) {\\n ${afterHook('afterUnpublish', `updated${ctx.Singular}Context`)}\\n }`\n : ''\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${ctx.tableVar} } from '@admin/db/schema'\nimport { eq } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { createEntityVersion, entityVersionsCacheTags } from '@admin/actions/entity-versions'\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport { get${ctx.Singular}ById } from './get-${kebabSingular}-by-id'\nimport {\n build${ctx.Singular}RestoreData,\n ${snapshotImport},\n has${ctx.Singular}VersionChanges\n} from './helpers'\n${lifecycleHookImport()}\nimport type { ${ctx.Singular}UpdateInput, ${ctx.Singular}UpdateResult, ${ctx.Singular} } from './types'${markdownImport}${slugImport}\n\nexport async function update${ctx.Singular}(input: ${ctx.Singular}UpdateInput): Promise<${ctx.Singular}UpdateResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n const { id, ...updateData } = input\n const actorId = actor.id\n const now = new Date().toISOString()\n const [previousRow] = await db\n .select()\n .from(${ctx.tableVar})\n .where(eq(${ctx.tableVar}.id, id))\n .limit(1)\n\n if (!previousRow) throw new Error('${ctx.Singular} not found')\n\n const lifecycleContext = ${updateContext}\n ${beforeHook('beforeUpdate', 'lifecycleContext')}\n${updateBeforePublishBlock}${ctx.autoSlugUpdate}\n const fieldMeta = [\n ${ctx.fieldMeta}\n ]\n\n const processedData: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(updateData)) {\n if (key === 'published') { processedData[key] = value; continue }\n const field = fieldMeta.find(f => f.name === key)\n if (!field) continue\n if (field.type === 'list') {\n processedData[key] = value || []\n } else if (!field.required && ['date', 'timestamp', 'time', 'string', 'varchar', 'text', 'select'].includes(field.type)) {\n processedData[key] = value && value !== '' ? value : null\n } else {\n processedData[key] = value\n }\n }\n${htmlUpdateBlock}\n const result = await db.transaction(async (tx) => {\n const previousSnapshot = ${previousSnapshot}\n const nextSnapshot = {\n ...previousSnapshot,\n ...build${ctx.Singular}RestoreData(processedData)\n }\n const shouldCreateVersion = has${ctx.Singular}VersionChanges(previousSnapshot, nextSnapshot)\n\n if (shouldCreateVersion) {\n await createEntityVersion(tx, {\n entityType: '${ctx.plural}',\n entityId: id,\n data: previousSnapshot,\n createdBy: actorId\n })\n }\n\n return tx.update(${ctx.tableVar})\n .set({ ...processedData, updatedAt: now, updatedBy: actorId })\n .where(eq(${ctx.tableVar}.id, id))\n .returning()\n })\n\n if (result.length === 0) throw new Error('${ctx.Singular} not found')\n\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.byId(id))\n ${ctx.cacheInvalidationFn}(entityVersionsCacheTags.for('${ctx.plural}', id))\n const updated${ctx.Singular} = await get${ctx.Singular}ById(id)\n const updated${ctx.Singular}Data = updated${ctx.Singular} ?? (result[0] as ${ctx.Singular})\n const updated${ctx.Singular}Context = ${updateResultContext}\n${updateAfterPublishBlock}\n ${afterHook('afterUpdate', `updated${ctx.Singular}Context`)}\n\n return {\n success: true,\n ${ctx.camelSingular}: updated${ctx.Singular}Data\n }\n } catch (error) {\n console.error('Error updating ${ctx.singular}:', error)\n throw new Error(error instanceof Error ? error.message : 'Failed to update ${ctx.singular}')\n }\n}\n`\n}\n\n// ============================================================================\n// get-versions-by-{singular}-id.ts / restore-{singular}-version.ts\n// ============================================================================\n\nexport function genGetVersionsContent(ctx: EntityCtx): string {\n return `'use server'\n\nimport { getEntityVersions } from '@admin/actions/entity-versions'\nimport type { EntityVersionWithAuthor } from '@admin/actions/entity-versions'\n\nexport async function getVersionsBy${ctx.Singular}Id(\n id: string\n): Promise<EntityVersionWithAuthor[]> {\n return getEntityVersions('${ctx.plural}', id)\n}\n`\n}\n\nfunction buildRestoreManyToManyStatements(ctx: EntityCtx): string {\n return ctx.m2mFields\n .map((field) => {\n const rel = field.relationship || ''\n const RelPascal = toPascalCase(rel)\n const relSingular = singularize(rel)\n const junctionVar = toCamelCase(`${ctx.singular}${RelPascal}`)\n const entityIdCol = `${ctx.singular}Id`\n const relIdCol = `${relSingular}Id`\n\n return ` const ${field.name}Value = versionData.${field.name}\n const ${field.name}Ids = Array.isArray(${field.name}Value)\n ? ${field.name}Value.filter((id): id is string => typeof id === 'string')\n : []\n await tx.delete(${junctionVar}).where(eq(${junctionVar}.${entityIdCol}, versionRow.entityId))\n if (${field.name}Ids.length > 0) {\n await tx.insert(${junctionVar}).values(\n ${field.name}Ids.map((${relSingular}Id) => ({\n ${entityIdCol}: versionRow.entityId,\n ${relIdCol}: ${relSingular}Id\n }))\n )\n }`\n })\n .join('\\n')\n}\n\nexport function genRestoreContent(ctx: EntityCtx): string {\n const kebabSingular = toKebabCase(ctx.singular)\n const snapshotImport = ctx.hasM2M\n ? `build${ctx.Singular}VersionSnapshotWithRelationships`\n : `build${ctx.Singular}VersionSnapshot`\n const currentSnapshot = ctx.hasM2M\n ? `await build${ctx.Singular}VersionSnapshotWithRelationships(currentRow as ${ctx.Singular}, tx)`\n : `build${ctx.Singular}VersionSnapshot(currentRow as ${ctx.Singular})`\n const dbImports = [\n 'entityVersions',\n ctx.tableVar,\n ...ctx.m2mFields.map((field) => {\n const rel = field.relationship || ''\n return toCamelCase(`${ctx.singular}${toPascalCase(rel)}`)\n })\n ].sort()\n const restoreM2M = buildRestoreManyToManyStatements(ctx)\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${dbImports.join(', ')} } from '@admin/db/schema'\nimport { and, eq } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { createEntityVersion, entityVersionsCacheTags } from '@admin/actions/entity-versions'\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport { get${ctx.Singular}ById } from './get-${kebabSingular}-by-id'\nimport {\n build${ctx.Singular}RestoreData,\n ${snapshotImport}\n} from './helpers'\nimport type { ${ctx.Singular}UpdateResult, ${ctx.Singular} } from './types'\n\nexport async function restore${ctx.Singular}Version(\n versionId: string\n): Promise<${ctx.Singular}UpdateResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n const actorId = actor.id\n const now = new Date().toISOString()\n\n const [versionRow] = await db\n .select()\n .from(entityVersions)\n .where(and(eq(entityVersions.id, versionId), eq(entityVersions.entityType, '${ctx.plural}')))\n .limit(1)\n\n if (!versionRow) throw new Error('${ctx.Singular} version not found')\n\n const versionData = versionRow.data as Record<string, unknown>\n const restoreData = build${ctx.Singular}RestoreData(versionData)\n\n const result = await db.transaction(async (tx) => {\n const [currentRow] = await tx\n .select()\n .from(${ctx.tableVar})\n .where(eq(${ctx.tableVar}.id, versionRow.entityId))\n .limit(1)\n\n if (!currentRow) throw new Error('${ctx.Singular} not found')\n\n await createEntityVersion(tx, {\n entityType: '${ctx.plural}',\n entityId: versionRow.entityId,\n data: ${currentSnapshot},\n createdBy: actorId\n })\n${restoreM2M ? `\\n${restoreM2M}\\n` : ''}\n return tx.update(${ctx.tableVar})\n .set({ ...restoreData, updatedAt: now, updatedBy: actorId })\n .where(eq(${ctx.tableVar}.id, versionRow.entityId))\n .returning()\n })\n\n if (result.length === 0) throw new Error('${ctx.Singular} not found')\n\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.byId(versionRow.entityId))\n ${ctx.cacheInvalidationFn}(entityVersionsCacheTags.for('${ctx.plural}', versionRow.entityId))\n const restored${ctx.Singular} = await get${ctx.Singular}ById(versionRow.entityId)\n\n return {\n success: true,\n ${ctx.camelSingular}: restored${ctx.Singular} ?? (result[0] as ${ctx.Singular})\n }\n } catch (error) {\n console.error('Error restoring ${ctx.singular} version:', error)\n throw new Error(error instanceof Error ? error.message : 'Failed to restore ${ctx.singular} version')\n }\n}\n`\n}\n\n// ============================================================================\n// get-{singular}-select-options.ts / create-{singular}-select-option.ts\n// ============================================================================\n\nfunction buildSelectOptionFieldNames(ctx: SelectOptionCtx): string {\n return ctx.creatableSelectFields.map((field) => JSON.stringify(field.name)).join(', ')\n}\n\nfunction buildSelectOptionStaticOptions(ctx: SelectOptionCtx): string {\n const entries = ctx.creatableSelectFields\n .map((field) => {\n const options = (field.options ?? [])\n .map(\n (option) =>\n `{ label: ${JSON.stringify(option.label)}, value: ${JSON.stringify(option.value)} }`\n )\n .join(', ')\n return ` ${JSON.stringify(field.name)}: [${options}]`\n })\n .join(',\\n')\n\n return `const STATIC_SELECT_OPTIONS = {\\n${entries}\\n} as const`\n}\n\nexport function genGetSelectOptionsContent(ctx: SelectOptionCtx): string {\n return `'use server'\n\nimport db from '@admin/db'\nimport { ${ctx.selectOptionsTableVar} } from '@admin/db/schema'\nimport { asc, eq } from 'drizzle-orm'\n${ctx.cacheReadImport}\nimport { ${ctx.camelSingular}SelectOptionsCacheTags } from './types'\nimport type { ${ctx.Singular}SelectOption, ${ctx.Singular}SelectOptionFieldName } from './types'\n\nconst SELECT_OPTION_FIELDS = [${buildSelectOptionFieldNames(ctx)}] as const\n\nfunction isSelectOptionFieldName(fieldName: string): fieldName is ${ctx.Singular}SelectOptionFieldName {\n return (SELECT_OPTION_FIELDS as readonly string[]).includes(fieldName)\n}\n\nexport async function get${ctx.Singular}SelectOptions(\n fieldName: ${ctx.Singular}SelectOptionFieldName\n): Promise<${ctx.Singular}SelectOption[]> {\n 'use cache'${ctx.cacheLifeLine}\n cacheTag(${ctx.camelSingular}SelectOptionsCacheTags.byField(fieldName))\n\n if (!isSelectOptionFieldName(fieldName)) return []\n\n try {\n const rows = await db\n .select()\n .from(${ctx.selectOptionsTableVar})\n .where(eq(${ctx.selectOptionsTableVar}.fieldName, fieldName))\n .orderBy(asc(${ctx.selectOptionsTableVar}.label))\n\n return rows as ${ctx.Singular}SelectOption[]\n } catch (error) {\n console.error('Error fetching ${ctx.singular} select options:', error)\n return []\n }\n}\n`\n}\n\nexport function genCreateSelectOptionContent(ctx: SelectOptionCtx): string {\n return `'use server'\n\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport db from '@admin/db'\nimport { ${ctx.selectOptionsTableVar} } from '@admin/db/schema'\nimport { eq } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { ${ctx.camelSingular}SelectOptionsCacheTags } from './types'\nimport type {\n Create${ctx.Singular}SelectOptionInput,\n Create${ctx.Singular}SelectOptionResult,\n ${ctx.Singular}SelectOption,\n ${ctx.Singular}SelectOptionFieldName\n} from './types'\n\n${buildSelectOptionStaticOptions(ctx)}\n\nfunction toSelectOptionValue(label: string): string {\n const normalized = label\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n\n return normalized || 'option'\n}\n\nasync function resolveSelectOptionValue(\n fieldName: ${ctx.Singular}SelectOptionFieldName,\n label: string\n): Promise<string> {\n const baseValue = toSelectOptionValue(label)\n const rows = await db\n .select({ value: ${ctx.selectOptionsTableVar}.value })\n .from(${ctx.selectOptionsTableVar})\n .where(eq(${ctx.selectOptionsTableVar}.fieldName, fieldName))\n const usedValues = new Set([\n ...STATIC_SELECT_OPTIONS[fieldName].map((option) => option.value),\n ...rows.map((row) => row.value)\n ])\n\n if (!usedValues.has(baseValue)) return baseValue\n\n let suffix = 2\n let value = \\`\\${baseValue}-\\${suffix}\\`\n while (usedValues.has(value)) {\n suffix += 1\n value = \\`\\${baseValue}-\\${suffix}\\`\n }\n\n return value\n}\n\nexport async function create${ctx.Singular}SelectOption(\n input: Create${ctx.Singular}SelectOptionInput\n): Promise<Create${ctx.Singular}SelectOptionResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n const label = input.label.trim()\n if (!label) {\n return { success: false, error: 'Option label is required' }\n }\n\n const staticMatch = STATIC_SELECT_OPTIONS[input.fieldName].find(\n (option) => option.label.toLowerCase() === label.toLowerCase()\n )\n if (staticMatch) {\n return {\n success: true,\n option: {\n id: staticMatch.value,\n fieldName: input.fieldName,\n label: staticMatch.label,\n value: staticMatch.value,\n createdAt: '',\n updatedAt: ''\n }\n }\n }\n\n const rows = await db\n .select()\n .from(${ctx.selectOptionsTableVar})\n .where(eq(${ctx.selectOptionsTableVar}.fieldName, input.fieldName))\n const existing = rows.find((row) => row.label.toLowerCase() === label.toLowerCase())\n if (existing) {\n return { success: true, option: existing as ${ctx.Singular}SelectOption }\n }\n\n const actorId = actor.id\n const now = new Date().toISOString()\n const value = await resolveSelectOptionValue(input.fieldName, label)\n const [option] = await db\n .insert(${ctx.selectOptionsTableVar})\n .values({\n fieldName: input.fieldName,\n label,\n value,\n createdAt: now,\n updatedAt: now,\n createdBy: actorId,\n updatedBy: actorId\n })\n .returning()\n\n ${ctx.cacheInvalidationFn}(${ctx.camelSingular}SelectOptionsCacheTags.byField(input.fieldName))\n\n return { success: true, option: option as ${ctx.Singular}SelectOption }\n } catch (error) {\n console.error('Error creating ${ctx.singular} select option:', error)\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to create option'\n }\n }\n}\n`\n}\n\n// ============================================================================\n// delete-{singular}.ts\n// ============================================================================\n\nexport function genDeleteContent(ctx: EntityCtx): string {\n const deleteContext = lifecycleContext(ctx.plural, `,\\n entityId: id`)\n\n return `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${ctx.tableVar} } from '@admin/db/schema'\nimport { eq } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { deleteEntityVersions, entityVersionsCacheTags } from '@admin/actions/entity-versions'\nimport { ${ctx.camelPlural}CacheTags } from './types'\n${lifecycleHookImport()}\nimport type { ${ctx.Singular}DeleteResult } from './types'\n\nexport async function delete${ctx.Singular}(id: string): Promise<${ctx.Singular}DeleteResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n const now = new Date().toISOString()\n const lifecycleContext = ${deleteContext}\n ${beforeHook('beforeDelete', 'lifecycleContext')}\n\n try {\n await db.transaction(async (tx) => {\n await deleteEntityVersions(tx, '${ctx.plural}', [id])\n await tx.delete(${ctx.tableVar}).where(eq(${ctx.tableVar}.id, id))\n })\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.byId(id))\n ${ctx.cacheInvalidationFn}(entityVersionsCacheTags.for('${ctx.plural}', id))\n ${afterHook('afterDelete', 'lifecycleContext')}\n return { success: true }\n } catch (error) {\n console.error('Error deleting ${ctx.singular}:', error)\n return { success: false, error: error instanceof Error ? error.message : 'Failed to delete ${ctx.singular}' }\n }\n}\n`\n}\n\n// ============================================================================\n// delete-bulk-{plural}.ts\n// ============================================================================\n\nexport function genDeleteBulkContent(ctx: EntityCtx): string {\n return `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${ctx.tableVar} } from '@admin/db/schema'\nimport { inArray } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { deleteEntityVersions, entityVersionsCacheTags } from '@admin/actions/entity-versions'\nimport { ${ctx.camelPlural}CacheTags } from './types'\n${lifecycleHookImport()}\nimport type { ${ctx.Singular}DeleteResult } from './types'\n\nexport async function deleteBulk${ctx.Plural}(ids: string[]): Promise<${ctx.Singular}DeleteResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n if (ids.length === 0) return { success: false, error: 'No items selected for deletion' }\n\n const now = new Date().toISOString()\n const lifecycleContexts = ids.map((id) => ({\n user: actor,\n entityType: '${ctx.plural}',\n timestamp: now,\n entityId: id\n }))\n\n for (const lifecycleContext of lifecycleContexts) {\n ${beforeHook('beforeDelete', 'lifecycleContext')}\n }\n\n try {\n await db.transaction(async (tx) => {\n await deleteEntityVersions(tx, '${ctx.plural}', ids)\n await tx.delete(${ctx.tableVar}).where(inArray(${ctx.tableVar}.id, ids))\n })\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n for (const id of ids) {\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.byId(id))\n ${ctx.cacheInvalidationFn}(entityVersionsCacheTags.for('${ctx.plural}', id))\n }\n for (const lifecycleContext of lifecycleContexts) {\n ${afterHook('afterDelete', 'lifecycleContext')}\n }\n return { success: true }\n } catch (error) {\n console.error('Error deleting ${ctx.plural}:', error)\n return { success: false, error: error instanceof Error ? error.message : 'Failed to delete ${ctx.plural}' }\n }\n}\n`\n}\n\n// ============================================================================\n// bulk-update-{plural}-sort-order.ts\n// ============================================================================\n\nexport function genBulkSortOrderContent(ctx: EntityCtx): string {\n return `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${ctx.tableVar} } from '@admin/db/schema'\nimport { asc, eq, notInArray } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { ${ctx.camelPlural}CacheTags } from './types'\n\nexport async function bulkUpdate${ctx.Plural}SortOrder(\n updates: Array<{ id: string; sortOrder: number }>\n): Promise<{ success: boolean; error?: string }> {\n await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n if (updates.length === 0) return { success: true }\n\n // Sort the provided items by their new position\n const sorted = [...updates].sort((a, b) => a.sortOrder - b.sortOrder)\n const updatedIds = sorted.map((u) => u.id)\n\n // Fetch all items NOT in the update set, preserving their current order\n const remaining = await db\n .select({ id: ${ctx.tableVar}.id })\n .from(${ctx.tableVar})\n .where(updatedIds.length > 0 ? notInArray(${ctx.tableVar}.id, updatedIds) : undefined)\n .orderBy(asc(${ctx.tableVar}.sortOrder))\n\n // Merge: place updated items at their new positions, append remaining after\n // The updated items define positions 0..N-1 within the loaded window.\n // Remaining items (not loaded by the client) keep their relative order and\n // are appended after the last updated item's position.\n const maxUpdatedPosition = Math.max(...sorted.map((u) => u.sortOrder))\n const allIds: string[] = new Array(maxUpdatedPosition + 1 + remaining.length)\n\n // Place updated items at their requested positions\n for (const u of sorted) {\n allIds[u.sortOrder] = u.id\n }\n\n // Fill remaining items into empty slots, then append the rest\n let fillIndex = 0\n let remainingIndex = 0\n // First fill any gaps before maxUpdatedPosition\n while (fillIndex <= maxUpdatedPosition && remainingIndex < remaining.length) {\n if (allIds[fillIndex] === undefined) {\n allIds[fillIndex] = remaining[remainingIndex].id as string\n remainingIndex++\n }\n fillIndex++\n }\n // Append remaining items after the updated window\n let appendIndex = maxUpdatedPosition + 1\n while (remainingIndex < remaining.length) {\n allIds[appendIndex] = remaining[remainingIndex].id as string\n remainingIndex++\n appendIndex++\n }\n\n // Renumber all items gap-free\n await Promise.all(\n allIds.filter(Boolean).map((id, index) =>\n db.update(${ctx.tableVar}).set({ sortOrder: index }).where(eq(${ctx.tableVar}.id, id))\n )\n )\n\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n return { success: true }\n } catch (error) {\n console.error('Error bulk updating sort order:', error)\n return { success: false, error: error instanceof Error ? error.message : 'Failed to bulk update sort order' }\n }\n}\n`\n}\n\n// ============================================================================\n// M2M files: get-{rel}-for-{singular}.ts and set-{rel}-for-{singular}.ts\n// ============================================================================\n\nexport function genM2MFiles(ctx: EntityCtx): Array<{ name: string; content: string }> {\n const files: Array<{ name: string; content: string }> = []\n\n for (const f of ctx.m2mFields) {\n const rel = f.relationship || ''\n const RelPascal = toPascalCase(rel)\n const relSingular = singularize(rel)\n const junctionVar = toCamelCase(`${ctx.singular}${RelPascal}`)\n const entityIdCol = `${ctx.singular}Id`\n const relIdCol = `${relSingular}Id`\n const kebabRel = rel\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n\n // get file\n files.push({\n name: `get-${kebabRel}-for-${ctx.singular}.ts`,\n content: `'use server'\n\nimport db from '@admin/db'\nimport { ${junctionVar} } from '@admin/db/schema'\nimport { eq } from 'drizzle-orm'\n${ctx.cacheReadImport}\nimport { ${ctx.camelPlural}CacheTags } from './types'\n\nexport async function get${RelPascal}For${ctx.Singular}(${ctx.singular}Id: string): Promise<string[]> {\n 'use cache'${ctx.cacheLifeLine}\n cacheTag(${ctx.camelPlural}CacheTags.byId(${ctx.singular}Id))\n cacheTag(${ctx.camelPlural}CacheTags.all)\n\n try {\n const results = await db\n .select({ ${relIdCol}: ${junctionVar}.${relIdCol} })\n .from(${junctionVar})\n .where(eq(${junctionVar}.${entityIdCol}, ${ctx.singular}Id))\n return results.map((r) => r.${relIdCol})\n } catch (error) {\n console.error('Error fetching ${rel} for ${ctx.singular}:', error)\n return []\n }\n}\n`\n })\n\n // set file\n files.push({\n name: `set-${kebabRel}-for-${ctx.singular}.ts`,\n content: `'use server'\n\nimport db from '@admin/db'\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport { ${junctionVar}, ${ctx.tableVar} } from '@admin/db/schema'\nimport { eq } from 'drizzle-orm'\nimport { ${ctx.cacheInvalidationFn} } from 'next/cache'\nimport { createEntityVersion, entityVersionsCacheTags } from '@admin/actions/entity-versions'\nimport { ${ctx.camelPlural}CacheTags } from './types'\nimport {\n build${ctx.Singular}VersionSnapshotWithRelationships,\n has${ctx.Singular}VersionChanges\n} from './helpers'\n\nexport async function set${RelPascal}For${ctx.Singular}(\n ${ctx.singular}Id: string,\n ${rel}Ids: string[]\n): Promise<{ success: boolean; error?: string }> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n await db.transaction(async (tx) => {\n const [previousRow] = await tx\n .select()\n .from(${ctx.tableVar})\n .where(eq(${ctx.tableVar}.id, ${ctx.singular}Id))\n .limit(1)\n\n if (!previousRow) {\n throw new Error('${ctx.Singular} not found')\n }\n\n const previousSnapshot = await build${ctx.Singular}VersionSnapshotWithRelationships(\n previousRow as Record<string, unknown>,\n tx\n )\n const nextSnapshot = { ...previousSnapshot, ${f.name}: ${rel}Ids }\n const shouldCreateVersion = has${ctx.Singular}VersionChanges(previousSnapshot, nextSnapshot)\n\n if (shouldCreateVersion) {\n await createEntityVersion(tx, {\n entityType: '${ctx.plural}',\n entityId: ${ctx.singular}Id,\n data: previousSnapshot,\n createdBy: actor.id\n })\n }\n\n await tx.delete(${junctionVar}).where(eq(${junctionVar}.${entityIdCol}, ${ctx.singular}Id))\n if (${rel}Ids.length > 0) {\n await tx.insert(${junctionVar}).values(\n ${rel}Ids.map((${relSingular}Id) => ({\n ${entityIdCol}: ${ctx.singular}Id,\n ${relIdCol}: ${relSingular}Id\n }))\n )\n }\n })\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.all)\n ${ctx.cacheInvalidationFn}(${ctx.camelPlural}CacheTags.byId(${ctx.singular}Id))\n ${ctx.cacheInvalidationFn}(entityVersionsCacheTags.for('${ctx.plural}', ${ctx.singular}Id))\n return { success: true }\n } catch (error) {\n console.error('Error setting ${rel} for ${ctx.singular}:', error)\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Failed to set ${rel}'\n }\n }\n}\n`\n })\n }\n\n return files\n}\n\n// ============================================================================\n// get-distinct-{plural}-{field}.ts files\n// ============================================================================\n\nexport function genDistinctFiles(ctx: EntityCtx): Array<{ name: string; content: string }> {\n if (!ctx.hasFilters) return []\n\n return ctx.filters\n .filter((filter) => filter.source === 'distinct')\n .map((filter) => {\n const fieldPascal = toPascalCase(filter.key)\n const kebabField = filter.key\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n const kebabPlural = ctx.plural\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n\n return {\n name: `get-distinct-${kebabPlural}-${kebabField}.ts`,\n content: `'use server'\n\nimport db from '@admin/db'\nimport { ${ctx.tableVar} } from '@admin/db/schema'\nimport { asc, isNotNull } from 'drizzle-orm'\n${ctx.cacheReadImport}\nimport { ${ctx.camelPlural}CacheTags } from './types'\n\nexport async function getDistinct${ctx.Plural}${fieldPascal}(): Promise<string[]> {\n 'use cache'${ctx.cacheLifeLine}\n cacheTag(${ctx.camelPlural}CacheTags.all)\n\n try {\n const results = await db\n .selectDistinct({ value: ${ctx.tableVar}.${filter.field} })\n .from(${ctx.tableVar})\n .where(isNotNull(${ctx.tableVar}.${filter.field}))\n .orderBy(asc(${ctx.tableVar}.${filter.field}))\n return results.map((r) => String(r.value)).filter(Boolean)\n } catch (error) {\n console.error('Error fetching distinct ${ctx.plural} ${filter.field}:', error)\n return []\n }\n}\n`\n }\n })\n}\n\n// ============================================================================\n// index.ts (barrel)\n// ============================================================================\n\nexport function genBarrelContent(\n files: Array<{ name: string; content: string }>,\n ctx: EntityCtx\n): string {\n const lines: string[] = []\n\n // Re-export types\n const typeNames: string[] = [\n `${ctx.Singular}`,\n ctx.hasHtmlOutput ? `${ctx.Singular}View` : null,\n `${ctx.Plural}Page`,\n `${ctx.Plural}Query`,\n `${ctx.Singular}CreateInput`,\n `${ctx.Singular}CreateResult`,\n `${ctx.Singular}UpdateInput`,\n `${ctx.Singular}UpdateResult`,\n `${ctx.Singular}DeleteResult`,\n ctx.hasCreatableSelectFields ? `${ctx.Singular}SelectOption` : null,\n ctx.hasCreatableSelectFields ? `${ctx.Singular}SelectOptionFieldName` : null,\n ctx.hasCreatableSelectFields ? `Create${ctx.Singular}SelectOptionInput` : null,\n ctx.hasCreatableSelectFields ? `Create${ctx.Singular}SelectOptionResult` : null\n ].filter(Boolean) as string[]\n lines.push(`export type { ${typeNames.join(', ')} } from './types'`)\n lines.push('')\n\n // Re-export action functions from each file (skip helper/internal modules)\n for (const file of files) {\n if (file.name === 'types.ts' || file.name === 'helpers.ts' || file.name === 'markdown.ts')\n continue\n // Extract exported function names from the content\n const exportMatches = file.content.matchAll(/export async function (\\w+)/g)\n const fnNames = [...exportMatches].map((m) => m[1])\n if (fnNames.length > 0) {\n const modulePath = `./${file.name.replace(/\\.ts$/, '')}`\n lines.push(`export { ${fnNames.join(', ')} } from '${modulePath}'`)\n }\n }\n\n lines.push('')\n return lines.join('\\n')\n}\n","export function genMarkdownRendererContent(): string {\n return `import { randomUUID } from 'node:crypto'\nimport { createRequire } from 'node:module'\nimport katex from 'katex'\nimport MarkdownIt from 'markdown-it'\nimport sanitizeHtml from 'sanitize-html'\n\ntype MarkdownToken = MarkdownIt.Token\n\ninterface DollarMathOptions {\n allow_space?: boolean\n allow_digits?: boolean\n double_inline?: boolean\n allow_labels?: boolean\n renderer?: (content: string, options: { displayMode: boolean }) => string\n labelNormalizer?: (label: string) => string\n labelRenderer?: (label: string) => string\n}\n\ntype DollarMathPlugin = (md: MarkdownIt, options?: DollarMathOptions) => void\n\nconst dollarmathModule = createRequire(import.meta.url)('markdown-it-dollarmath') as\n | DollarMathPlugin\n | { default: DollarMathPlugin }\nconst dollarmath =\n typeof dollarmathModule === 'function' ? dollarmathModule : dollarmathModule.default\n\ninterface MarkdownInlineState {\n src: string\n pos: number\n md: MarkdownIt\n env: unknown\n tokens: MarkdownToken[]\n push(type: string, tag: string, nesting: -1 | 0 | 1): MarkdownToken\n}\n\ninterface MarkdownBlockState {\n src: string\n bMarks: number[]\n tShift: number[]\n sCount: number[]\n eMarks: number[]\n blkIndent: number\n line: number\n push(type: string, tag: string, nesting: -1 | 0 | 1): MarkdownToken\n}\n\ninterface MarkdownRenderContext {\n placeholderPrefix: string\n trustedMathHtml: string[]\n}\n\nconst highlightColorNames = new Set([\n 'gray',\n 'brown',\n 'orange',\n 'yellow',\n 'green',\n 'blue',\n 'purple',\n 'pink',\n 'red'\n])\n\nconst mathBlockEnvironmentNames = new Set([\n 'align',\n 'align*',\n 'aligned',\n 'alignedat',\n 'alignedat*',\n 'array',\n 'bmatrix',\n 'cases',\n 'equation',\n 'equation*',\n 'gather',\n 'gather*',\n 'gathered',\n 'matrix',\n 'multline',\n 'multline*',\n 'pmatrix',\n 'smallmatrix',\n 'split',\n 'vmatrix'\n])\n\nconst cssLengthPattern = /^-?(?:(?:\\\\d+(?:\\\\.\\\\d+)?)|(?:\\\\.\\\\d+))(?:em|ex|mu|px|rem|%)$|^0$/\nconst cssBorderWidthPattern = /^(?:(?:\\\\d+(?:\\\\.\\\\d+)?)|(?:\\\\.\\\\d+))(?:em|px|rem)$|^0$/\n\nlet activeRenderContext: MarkdownRenderContext | null = null\n\nfunction renderKatex(content: string, displayMode: boolean) {\n return katex.renderToString(content, {\n displayMode,\n output: 'htmlAndMathml',\n throwOnError: false,\n strict: 'ignore',\n trust: false\n })\n}\n\nfunction renderTrustedMathPlaceholder(content: string, displayMode: boolean) {\n const html = sanitizeKatexHtml(renderKatex(content, displayMode))\n if (!activeRenderContext) return html\n\n const placeholder = \\`\\${activeRenderContext.placeholderPrefix + activeRenderContext.trustedMathHtml.length}__\\`\n activeRenderContext.trustedMathHtml.push(html)\n return placeholder\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\\\w\\\\s-]/g, '')\n .replace(/\\\\s+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-+|-+$/g, '')\n}\n\nfunction headingAnchorPlugin(md: MarkdownIt) {\n md.core.ruler.push('heading_anchors', (state) => {\n const tokens = state.tokens\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n if (token.type !== 'heading_open') continue\n\n const contentToken = tokens[i + 1]\n if (!contentToken || contentToken.type !== 'inline' || !contentToken.content) continue\n\n const slug = slugify(contentToken.content)\n const idIndex = token.attrIndex('id')\n if (idIndex < 0) {\n token.attrPush(['id', slug])\n } else if (token.attrs) {\n token.attrs[idIndex][1] = slug\n }\n }\n return true\n })\n}\n\nfunction betterStartMathPlugin(md: MarkdownIt) {\n md.inline.ruler.before('escape', 'betterstart_bracket_inline_math', tokenizeBracketInlineMath)\n md.block.ruler.before('paragraph', 'betterstart_bracket_block_math', tokenizeBracketBlockMath, {\n alt: ['paragraph', 'reference', 'blockquote', 'list']\n })\n}\n\nfunction tokenizeBracketInlineMath(state: MarkdownInlineState, silent: boolean): boolean {\n if (!state.src.startsWith('\\\\\\\\(', state.pos)) return false\n\n const closingIndex = findUnescapedSequence(state.src, '\\\\\\\\)', state.pos + 2)\n if (closingIndex === -1) return false\n\n const content = state.src.slice(state.pos + 2, closingIndex)\n if (!content.trim() || content.includes('\\\\n')) return false\n\n if (!silent) {\n const token = state.push('html_inline', '', 0)\n token.content = renderTrustedMathPlaceholder(content, false)\n }\n\n state.pos = closingIndex + 2\n return true\n}\n\nfunction tokenizeBracketBlockMath(\n state: MarkdownBlockState,\n startLine: number,\n endLine: number,\n silent: boolean\n): boolean {\n if (state.sCount[startLine] - state.blkIndent >= 4) return false\n\n const startPosition = state.bMarks[startLine] + state.tShift[startLine]\n const firstLine = state.src.slice(startPosition, state.eMarks[startLine])\n\n if (firstLine.startsWith('\\\\\\\\[')) {\n const closingIndex = findUnescapedSequence(state.src, '\\\\\\\\]', startPosition + 2)\n if (closingIndex === -1) return false\n\n const closingLine = findLineForPosition(state, startLine, endLine, closingIndex + 2)\n if (closingLine === -1) return false\n if (/\\\\S/.test(state.src.slice(closingIndex + 2, state.eMarks[closingLine]))) return false\n\n if (!silent) {\n const token = state.push('html_block', '', 0)\n token.block = true\n token.content = renderTrustedMathPlaceholder(state.src.slice(startPosition + 2, closingIndex).trim(), true)\n token.markup = '\\\\\\\\[\\\\\\\\]'\n token.map = [startLine, closingLine + 1]\n }\n\n state.line = closingLine + 1\n return true\n }\n\n const environmentMatch = /^\\\\\\\\begin\\\\{([^}]+)\\\\}/.exec(firstLine)\n if (!environmentMatch || !mathBlockEnvironmentNames.has(environmentMatch[1])) return false\n\n const closingSequence = \\`\\\\\\\\end{\\${environmentMatch[1]}}\\`\n const closingIndex = findUnescapedSequence(state.src, closingSequence, startPosition + environmentMatch[0].length)\n if (closingIndex === -1) return false\n\n const closingEnd = closingIndex + closingSequence.length\n const closingLine = findLineForPosition(state, startLine, endLine, closingEnd)\n if (closingLine === -1) return false\n if (/\\\\S/.test(state.src.slice(closingEnd, state.eMarks[closingLine]))) return false\n\n if (!silent) {\n const token = state.push('html_block', '', 0)\n token.block = true\n token.content = renderTrustedMathPlaceholder(state.src.slice(startPosition, closingEnd).trim(), true)\n token.markup = '\\\\\\\\begin'\n token.map = [startLine, closingLine + 1]\n }\n\n state.line = closingLine + 1\n return true\n}\n\nfunction findLineForPosition(\n state: MarkdownBlockState,\n startLine: number,\n endLine: number,\n position: number\n) {\n for (let line = startLine; line < endLine; line++) {\n if (position <= state.eMarks[line]) return line\n }\n\n return -1\n}\n\nfunction findUnescapedSequence(value: string, sequence: string, start: number) {\n let index = value.indexOf(sequence, start)\n\n while (index !== -1) {\n if (!isEscaped(value, index)) return index\n index = value.indexOf(sequence, index + sequence.length)\n }\n\n return -1\n}\n\nfunction isEscaped(value: string, index: number) {\n let slashCount = 0\n\n for (let offset = index - 1; offset >= 0 && value[offset] === '\\\\\\\\'; offset--) {\n slashCount++\n }\n\n return slashCount % 2 === 1\n}\n\nconst md = MarkdownIt({\n html: true,\n linkify: true,\n typographer: true,\n breaks: true\n})\n .use(headingAnchorPlugin)\n .use(betterStartMathPlugin)\n .use(dollarmath, {\n allow_space: false,\n allow_digits: false,\n double_inline: true,\n allow_labels: true,\n renderer(content: string, { displayMode }: { displayMode: boolean }) {\n return renderTrustedMathPlaceholder(content, displayMode)\n },\n labelNormalizer(label: string) {\n const normalized = label\n .trim()\n .replace(/[\\\\s]+/g, '-')\n .replace(/[^A-Za-z0-9_.:-]/g, '')\n return normalized || 'equation'\n },\n labelRenderer(label: string) {\n return \\`<a id=\"\\${label}\" href=\"#\\${label}\" class=\"mathlabel\" title=\"Permalink to this equation\">&para;</a>\\`\n }\n })\n\nfunction sanitizeMarkdownHtml(html: string): string {\n return sanitizeHtml(html, {\n allowedTags: sanitizeHtml.defaults.allowedTags.concat([\n 'img',\n 'u',\n 'span'\n ]),\n allowedAttributes: {\n ...sanitizeHtml.defaults.allowedAttributes,\n a: ['href', 'name', 'target', 'rel', 'id'],\n annotation: ['encoding'],\n h1: ['id'],\n h2: ['id'],\n h3: ['id'],\n h4: ['id'],\n h5: ['id'],\n h6: ['id'],\n img: ['src', 'alt', 'title', 'width', 'height'],\n span: ['aria-hidden', 'data-highlight-color']\n },\n allowedSchemes: ['http', 'https', 'mailto', 'tel'],\n transformTags: {\n span(tagName, attribs) {\n const highlightColor = attribs['data-highlight-color']\n const sanitizedAttribs: Record<string, string> = {}\n\n if (highlightColor && highlightColorNames.has(highlightColor)) {\n sanitizedAttribs['data-highlight-color'] = highlightColor\n }\n\n return {\n tagName,\n attribs: sanitizedAttribs\n }\n }\n }\n })\n}\n\nfunction sanitizeKatexHtml(html: string): string {\n return sanitizeHtml(html, {\n allowedTags: [\n 'annotation',\n 'div',\n 'math',\n 'mfrac',\n 'mi',\n 'mn',\n 'mo',\n 'mover',\n 'mrow',\n 'msqrt',\n 'mspace',\n 'mstyle',\n 'msub',\n 'msubsup',\n 'msup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'semantics',\n 'span'\n ],\n allowedAttributes: {\n annotation: ['encoding'],\n div: ['class', 'style'],\n math: ['xmlns'],\n span: ['class', 'style', 'aria-hidden'],\n mtd: ['columnalign'],\n mtr: ['rowalign'],\n mstyle: ['scriptlevel', 'displaystyle'],\n mspace: ['width'],\n mrow: ['class'],\n mo: ['stretchy', 'fence', 'separator', 'lspace', 'rspace'],\n mi: ['mathvariant'],\n mn: ['mathvariant'],\n mtext: ['mathvariant'],\n semantics: [],\n mfrac: ['linethickness']\n },\n allowedStyles: {\n '*': {\n 'border-bottom-width': [cssBorderWidthPattern],\n 'border-style': [/^solid$/],\n 'border-width': [cssBorderWidthPattern],\n height: [cssLengthPattern],\n left: [cssLengthPattern],\n 'margin-left': [cssLengthPattern],\n 'margin-right': [cssLengthPattern],\n 'min-width': [cssLengthPattern],\n 'padding-left': [cssLengthPattern],\n position: [/^relative$/],\n top: [cssLengthPattern],\n 'vertical-align': [cssLengthPattern],\n width: [cssLengthPattern]\n }\n }\n })\n}\n\nexport function renderMarkdownSync(src: string): string {\n const context: MarkdownRenderContext = {\n placeholderPrefix: \\`__BETTERSTART_KATEX_\\${randomUUID()}_\\`,\n trustedMathHtml: []\n }\n\n activeRenderContext = context\n let html: string\n try {\n html = md.render(src)\n } finally {\n activeRenderContext = null\n }\n\n let sanitized = sanitizeMarkdownHtml(html)\n context.trustedMathHtml.forEach((mathHtml, index) => {\n sanitized = sanitized\n .split(\\`\\${context.placeholderPrefix + index}__\\`)\n .join(mathHtml)\n })\n\n return sanitized\n}\n`\n}\n","/**\n * Generator 2: Server actions — admin/lib/actions/<name>/\n * Generates 'use server' CRUD actions for an entity schema,\n * split into individual files with a barrel index.ts.\n */\n\nimport { getManyToManyFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { Schema, SchemaField } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport {\n pluralize,\n quotePropertyName,\n singularize,\n toCamelCase,\n toKebabCase,\n toPascalCase\n} from '@core-engine/utils/string.js'\nimport { resolveSchemaActionDir } from '@next-adapter/config/paths.js'\nimport type { ActionsGeneratorResult } from '@next-adapter/generators/actions/action-helpers.js'\nimport {\n buildAuthorshipDataFields,\n buildAuthorshipJoins,\n buildAuthorshipSelects,\n buildAuthorshipUserType,\n buildExplicitSelect,\n buildRelationshipSelect,\n buildResultMapping,\n buildSingleRowMapping,\n findListFieldsWithRelationships,\n generateFieldMapping,\n generatePopulateListRelsFunction,\n getFieldType,\n isAuthorshipFieldName\n} from '@next-adapter/generators/actions/action-helpers.js'\nimport type { EntityCtx } from '@next-adapter/generators/actions/entity-file-contents.js'\nimport {\n genBarrelContent,\n genBulkSortOrderContent,\n genCreateContent,\n genCreateSelectOptionContent,\n genDeleteBulkContent,\n genDeleteContent,\n genDistinctFiles,\n genGetByIdContent,\n genGetBySlugContent,\n genGetPluralContent,\n genGetSelectOptionsContent,\n genGetVersionsContent,\n genHelpersContent,\n genM2MFiles,\n genRestoreContent,\n genTypesContent,\n genUpdateContent\n} from '@next-adapter/generators/actions/entity-file-contents.js'\nimport { genMarkdownRendererContent } from '@next-adapter/generators/actions/markdown-renderer.js'\nimport {\n getEntityFieldContext,\n getFilterableFields,\n resolveEntityFilters\n} from '@next-adapter/generators/entity-filters.js'\n\n/**\n * Generate server action files for an entity, split into individual files.\n */\nexport function generateActions(\n schema: Schema,\n actionsDir: string,\n options: {\n force?: boolean\n schemasDir?: string\n nextMajorVersion?: number\n outputNamespace?: string\n } = {}\n): ActionsGeneratorResult {\n const ctx = buildEntityContext(schema, options.nextMajorVersion)\n const schemaActionDir = resolveSchemaActionDir(actionsDir, schema.name, options.outputNamespace)\n\n // Build all file entries\n const kebabSingular = toKebabCase(ctx.singular)\n const kebabPlural = toKebabCase(ctx.plural)\n const files: Array<{ name: string; content: string }> = []\n\n files.push({ name: 'types.ts', content: genTypesContent(ctx) })\n\n const helpersContent = genHelpersContent(ctx)\n if (helpersContent) {\n files.push({ name: 'helpers.ts', content: helpersContent })\n }\n if (ctx.hasHtmlOutput) {\n files.push({ name: 'markdown.ts', content: genMarkdownRendererContent() })\n }\n\n files.push({ name: `get-${kebabPlural}.ts`, content: genGetPluralContent(ctx) })\n files.push({ name: `get-${kebabSingular}-by-id.ts`, content: genGetByIdContent(ctx) })\n if (ctx.hasCreatableSelectFields) {\n files.push({\n name: `get-${kebabSingular}-select-options.ts`,\n content: genGetSelectOptionsContent(ctx)\n })\n files.push({\n name: `create-${kebabSingular}-select-option.ts`,\n content: genCreateSelectOptionContent(ctx)\n })\n }\n\n const bySlugContent = genGetBySlugContent(ctx)\n if (bySlugContent) {\n files.push({ name: `get-${kebabSingular}-by-slug.ts`, content: bySlugContent })\n }\n\n files.push({ name: `create-${kebabSingular}.ts`, content: genCreateContent(ctx) })\n files.push({ name: `update-${kebabSingular}.ts`, content: genUpdateContent(ctx) })\n files.push({\n name: `get-versions-by-${kebabSingular}-id.ts`,\n content: genGetVersionsContent(ctx)\n })\n files.push({ name: `restore-${kebabSingular}-version.ts`, content: genRestoreContent(ctx) })\n files.push({ name: `delete-${kebabSingular}.ts`, content: genDeleteContent(ctx) })\n files.push({ name: `delete-bulk-${kebabPlural}.ts`, content: genDeleteBulkContent(ctx) })\n files.push({\n name: `bulk-update-${kebabPlural}-sort-order.ts`,\n content: genBulkSortOrderContent(ctx)\n })\n\n // M2M files (conditional, per relationship)\n files.push(...genM2MFiles(ctx))\n\n // Distinct filter files (conditional, per filter field)\n files.push(...genDistinctFiles(ctx))\n\n // Barrel index.ts (must be last, references other files)\n files.push({ name: 'index.ts', content: genBarrelContent(files, ctx) })\n\n return {\n files: files.map((file) => createGeneratedFile(`${schemaActionDir}/${file.name}`, file.content))\n }\n}\n\n// ============================================================================\n// Context builder — computes all shared state for content generators\n// ============================================================================\n\nfunction buildEntityContext(schema: Schema, nextMajorVersion?: number): EntityCtx {\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const Plural = toPascalCase(plural)\n const tableVar = toCamelCase(schema.name)\n const camelPlural = toCamelCase(plural)\n const camelSingular = toCamelCase(singular)\n\n const { dbFields, regularDbFields, allDbFields } = getEntityFieldContext(schema)\n const m2mFields = getManyToManyFields(schema.fields)\n const hasM2M = m2mFields.length > 0\n\n const relationshipFields = dbFields.filter(\n (f) => f.type === 'relationship' && f.relationship && !f.multiple\n )\n const hasRelationships = relationshipFields.length > 0\n\n const listFieldsWithRels = findListFieldsWithRelationships(dbFields)\n const hasListRels = listFieldsWithRels.length > 0\n\n // Media field detection\n const mediaFields = regularDbFields.filter(\n (f) => f.type === 'image' || f.type === 'video' || f.type === 'media'\n )\n const galleryFields = regularDbFields.filter((f) => f.type === 'gallery')\n const hasMediaFields = mediaFields.length > 0 || galleryFields.length > 0\n\n const allListRelQueries: Array<{\n fieldPath: string\n relField: SchemaField\n relTable: string\n listFieldName: string\n }> = []\n\n for (const { field: listField, path: fieldPath } of listFieldsWithRels) {\n const rels = (listField.fields || []).filter((f) => f.type === 'relationship' && f.relationship)\n for (const relField of rels) {\n allListRelQueries.push({\n fieldPath: fieldPath.join('_'),\n relField,\n relTable: toCamelCase(relField.relationship!),\n listFieldName: listField.name\n })\n }\n }\n\n const populateListRelsFn = hasListRels\n ? generatePopulateListRelsFunction(allListRelQueries, Singular)\n : ''\n\n const htmlOutputFields = regularDbFields.filter(\n (f) => (f.type === 'richtext' || f.type === 'markdown') && f.output === 'html'\n )\n const hasHtmlOutput = htmlOutputFields.length > 0\n\n const hasSlug = regularDbFields.some((f) => f.name === 'slug')\n const hasDraft = schema.actions?.draft === true\n const hasSearch = (schema.search?.fields || []).length > 0\n const searchFields = schema.search?.fields || []\n const resolvedFilters = resolveEntityFilters(schema)\n const hasFilters = resolvedFilters.length > 0\n const hasAutoSlug = schema.autoSlugify?.enabled === true\n const creatableSelectFields = regularDbFields.filter(\n (f) => f.type === 'select' && f.creatable === true\n )\n const hasCreatableSelectFields = creatableSelectFields.length > 0\n const dateRangeFilterFields = new Set(\n resolvedFilters.filter((filter) => filter.type === 'date-range').map((filter) => filter.field)\n )\n\n const listExcludeFields = new Set(htmlOutputFields.map((f) => f.name))\n const listDbFields = hasHtmlOutput\n ? allDbFields.filter((f) => !listExcludeFields.has(f.name))\n : allDbFields\n\n const createFields = regularDbFields.filter(\n (f) =>\n !f.primaryKey &&\n f.name !== 'createdAt' &&\n f.name !== 'updatedAt' &&\n f.name !== 'sortOrder' &&\n !isAuthorshipFieldName(f.name)\n )\n\n const versionSnapshotKeys = [\n ...createFields.map((field) => field.name),\n ...htmlOutputFields.map((field) => `${field.name}Html`),\n ...m2mFields.map((field) => field.name),\n ...(hasDraft ? ['published'] : [])\n ]\n const versionRestoreKeys = [\n ...createFields.map((field) => field.name),\n ...htmlOutputFields.map((field) => `${field.name}Html`),\n ...(hasDraft ? ['published'] : [])\n ]\n\n const filterableFields = getFilterableFields(allDbFields)\n\n // Per-file DB imports\n const relTableImports = relationshipFields.map((f) => toCamelCase(f.relationship!))\n const listRelTableImports = allListRelQueries.map((q) => q.relTable)\n\n // --- Build interfaces ---\n const dataFields = allDbFields\n .map(\n (f) =>\n ` ${quotePropertyName(f.name)}: ${getFieldType(f, 'output')}${\n f.required || f.primaryKey ? '' : ' | null'\n }`\n )\n .join('\\n')\n const m2mFieldTypes = m2mFields.map((f) => ` ${quotePropertyName(f.name)}: string[]`).join('\\n')\n const htmlFieldTypes = htmlOutputFields.map((f) => ` ${f.name}Html: string`).join('\\n')\n const mediaCompanionTypes = [\n ...mediaFields.map((f) => ` ${quotePropertyName(`${f.name}Media`)}: AdminMedia | null`),\n ...galleryFields.map((f) => ` ${quotePropertyName(`${f.name}Media`)}: AdminMedia[]`)\n ].join('\\n')\n\n const mediaTypeImport = hasMediaFields ? `\\nimport type { AdminMedia } from '@admin/types'\\n` : ''\n const dataInterface = `${mediaTypeImport}${buildAuthorshipUserType()}\\n\\nexport interface ${Singular} {\\n${dataFields}${htmlFieldTypes ? `\\n${htmlFieldTypes}` : ''}${m2mFieldTypes ? `\\n${m2mFieldTypes}` : ''}${mediaCompanionTypes ? `\\n${mediaCompanionTypes}` : ''}\\n${buildAuthorshipDataFields()}\\n}`\n\n const displayDbFields = allDbFields.filter(\n (f) => !htmlOutputFields.some((h) => h.name === f.name)\n )\n const displayDataFields = displayDbFields\n .map(\n (f) =>\n ` ${quotePropertyName(f.name)}: ${getFieldType(f, 'output')}${\n f.required || f.primaryKey ? '' : ' | null'\n }`\n )\n .join('\\n')\n const displayDataInterface = hasHtmlOutput\n ? `export interface ${Singular}View {\\n${displayDataFields}${htmlFieldTypes ? `\\n${htmlFieldTypes}` : ''}${m2mFieldTypes ? `\\n${m2mFieldTypes}` : ''}\\n${buildAuthorshipDataFields()}\\n}`\n : ''\n\n const responseInterface = `export interface ${Plural}Page {\\n ${camelPlural}: ${Singular}[]\\n total: number\\n}`\n\n const filtersInterfaceFields = filterableFields\n .map((f) => {\n if (!dateRangeFilterFields.has(f.name)) {\n return ` ${quotePropertyName(f.name)}?: ${getFieldType(f)}`\n }\n\n return [\n ` ${quotePropertyName(f.name)}?: ${getFieldType(f)}`,\n ` ${quotePropertyName(`${f.name}From`)}?: ${getFieldType(f)}`,\n ` ${quotePropertyName(`${f.name}To`)}?: ${getFieldType(f)}`\n ].join('\\n')\n })\n .join('\\n')\n const filtersInterface = `export interface ${Plural}Query {\\n search?: string\\n${filtersInterfaceFields}\\n limit?: number\\n offset?: number\\n orderBy?: string\\n orderDirection?: 'asc' | 'desc'\\n}`\n\n const createInterfaceFields = createFields\n .map(\n (f) => ` ${quotePropertyName(f.name)}${f.required ? '' : '?'}: ${getFieldType(f, 'input')}`\n )\n .join('\\n')\n const createInterface = `export interface ${Singular}CreateInput {\\n${createInterfaceFields}${hasDraft ? `\\n published?: boolean` : ''}\\n}`\n\n const updateInterfaceFields = createFields\n .map((f) => ` ${quotePropertyName(f.name)}?: ${getFieldType(f, 'input')}`)\n .join('\\n')\n const updateInterface = `export interface ${Singular}UpdateInput {\\n id: string\\n${updateInterfaceFields}${hasDraft ? `\\n published?: boolean` : ''}\\n}`\n\n // --- Build select clauses ---\n const authorshipSelects = buildAuthorshipSelects(hasRelationships ? ' ' : ' ')\n const authorshipJoins = buildAuthorshipJoins(tableVar)\n\n const selectClause = hasRelationships\n ? buildRelationshipSelect(\n allDbFields,\n relationshipFields,\n tableVar,\n htmlOutputFields,\n authorshipSelects,\n authorshipJoins\n )\n : buildExplicitSelect(\n allDbFields,\n tableVar,\n htmlOutputFields,\n authorshipSelects,\n authorshipJoins\n )\n\n const listSelectClause = hasHtmlOutput\n ? hasRelationships\n ? buildRelationshipSelect(\n listDbFields,\n relationshipFields,\n tableVar,\n [],\n authorshipSelects,\n authorshipJoins\n )\n : buildExplicitSelect(listDbFields, tableVar, [], authorshipSelects, authorshipJoins)\n : selectClause\n\n const displaySelectClause =\n hasHtmlOutput && hasSlug\n ? hasRelationships\n ? buildRelationshipSelect(\n displayDbFields,\n relationshipFields,\n tableVar,\n htmlOutputFields,\n authorshipSelects,\n authorshipJoins\n )\n : buildExplicitSelect(\n displayDbFields,\n tableVar,\n htmlOutputFields,\n authorshipSelects,\n authorshipJoins\n )\n : selectClause\n\n // --- Build query parts ---\n const filterConditions = filterableFields\n .map((f) => {\n if (dateRangeFilterFields.has(f.name)) {\n return ` if (query?.${f.name}) {\\n conditions.push(eq(${tableVar}.${f.name}, query.${f.name}))\\n }\\n if (query?.${f.name}From) {\\n conditions.push(gte(${tableVar}.${f.name}, query.${f.name}From))\\n }\\n const ${f.name}ExclusiveTo = getExclusiveDateUpperBound(query?.${f.name}To)\\n if (${f.name}ExclusiveTo) {\\n conditions.push(lt(${tableVar}.${f.name}, ${f.name}ExclusiveTo))\\n }`\n }\n\n return f.type === 'boolean'\n ? ` if (query?.${f.name} !== undefined) {\\n conditions.push(eq(${tableVar}.${f.name}, query.${f.name}))\\n }`\n : ` if (query?.${f.name}) {\\n conditions.push(eq(${tableVar}.${f.name}, query.${f.name}))\\n }`\n })\n .join('\\n')\n\n const searchBlock = hasSearch\n ? ` const search = query?.search\\n if (search && typeof search === 'string' && search.trim()) {\\n const searchTerm = \\`%\\${search.trim().toLowerCase()}%\\`\\n conditions.push(\\n or(\\n${searchFields.map((f) => ` ilike(${tableVar}.${f}, searchTerm)`).join(',\\n')}\\n )\\n )\\n }\\n`\n : ''\n\n const baseResultMapping = buildResultMapping(\n allDbFields,\n relationshipFields,\n Plural,\n camelPlural,\n Singular,\n hasListRels\n )\n\n // Wrap with media resolution if needed\n const resultMapping = hasMediaFields\n ? wrapWithMediaResolution(baseResultMapping, camelPlural, Singular)\n : baseResultMapping\n\n const baseListResultMapping = hasHtmlOutput\n ? buildResultMapping(\n listDbFields,\n relationshipFields,\n Plural,\n camelPlural,\n Singular,\n hasListRels\n )\n : baseResultMapping\n\n const listResultMapping = hasMediaFields\n ? wrapWithMediaResolution(baseListResultMapping, camelPlural, Singular)\n : baseListResultMapping\n\n const fieldMeta = createFields\n .map((f) => `{ name: '${f.name}', type: '${f.type}', required: ${f.required ?? false} }`)\n .join(',\\n ')\n\n const createMappings = createFields\n .map((f) => ` ${f.name}: ${generateFieldMapping(f)}`)\n .join(',\\n')\n\n const htmlCreateBlock = hasHtmlOutput\n ? `\\n` +\n htmlOutputFields\n .map((f) => ` const ${f.name}Html = renderMarkdownSync(input.${f.name} || '')`)\n .join('\\n') +\n '\\n'\n : ''\n\n const htmlCreateMappings = htmlOutputFields.map((f) => ` ${f.name}Html`).join(',\\n')\n\n const autoSlugCreate = hasAutoSlug\n ? `\\n if ((!input.${schema.autoSlugify!.targetField} || input.${schema.autoSlugify!.targetField} === '') && input.${schema.autoSlugify!.sourceField}) {\\n input.${schema.autoSlugify!.targetField} = slugify(input.${schema.autoSlugify!.sourceField})\\n }\\n`\n : ''\n const autoSlugUpdate = hasAutoSlug\n ? `\\n if (updateData.${schema.autoSlugify!.sourceField}) {\\n if (updateData.${schema.autoSlugify!.targetField} === '' || updateData.${schema.autoSlugify!.targetField} === undefined) {\\n updateData.${schema.autoSlugify!.targetField} = slugify(updateData.${schema.autoSlugify!.sourceField})\\n }\\n }\\n`\n : ''\n\n const cacheTag = `${plural}:all`\n\n // --- Build single row returns ---\n const baseSingleRowReturn = (() => {\n const singleRowMapping = buildSingleRowMapping(\n allDbFields,\n relationshipFields,\n Singular,\n htmlOutputFields\n )\n if (hasRelationships && hasListRels) {\n return `const row = result[0]\\n return await populate${Singular}ListRelationships(${singleRowMapping})`\n }\n if (hasRelationships) {\n return `const row = result[0]\\n return ${singleRowMapping}`\n }\n if (hasListRels) {\n return `const row = result[0]\\n return await populate${Singular}ListRelationships(${singleRowMapping})`\n }\n return `const row = result[0]\\n return ${singleRowMapping}`\n })()\n\n const singleRowReturn = hasMediaFields\n ? `${baseSingleRowReturn.replace(/return ([\\s\\S]+)$/, `const singleRow = $1\\n const [resolved] = await resolve${Singular}MediaFields([singleRow])\\n return resolved`)}`\n : baseSingleRowReturn\n\n const displaySingleRowReturn = hasHtmlOutput\n ? (() => {\n const displayType = `${Singular}View`\n if (hasRelationships && hasListRels) {\n return `const row = result[0]\\n return await populate${Singular}ListRelationships(${buildSingleRowMapping(displayDbFields, relationshipFields, Singular, htmlOutputFields)}) as unknown as ${displayType}`\n }\n if (hasRelationships) {\n return `const row = result[0]\\n return ${buildSingleRowMapping(displayDbFields, relationshipFields, displayType, htmlOutputFields)}`\n }\n if (hasListRels) {\n return `const row = result[0]\\n return await populate${Singular}ListRelationships(${buildSingleRowMapping(displayDbFields, relationshipFields, Singular, htmlOutputFields)}) as unknown as ${displayType}`\n }\n return `const row = result[0]\\n return ${buildSingleRowMapping(displayDbFields, relationshipFields, displayType, htmlOutputFields)}`\n })()\n : singleRowReturn\n\n const nextMajor = nextMajorVersion ?? 16\n const cacheInvalidationFn = nextMajor >= 16 ? 'updateTag' : 'revalidateTag'\n const cacheReadImport =\n nextMajor >= 16\n ? `import { cacheLife, cacheTag } from 'next/cache'`\n : `import { unstable_cacheTag as cacheTag } from 'next/cache'`\n const cacheLifeLine = nextMajor >= 16 ? `\\n cacheLife('max')` : ''\n\n return {\n singular,\n plural,\n Singular,\n Plural,\n tableVar,\n camelSingular,\n camelPlural,\n cacheTag,\n cacheReadImport,\n cacheLifeLine,\n cacheInvalidationFn,\n hasRelationships,\n hasM2M,\n hasListRels,\n hasMediaFields,\n mediaFields,\n galleryFields,\n hasHtmlOutput,\n hasSlug,\n hasDraft,\n hasSearch,\n hasFilters,\n hasAutoSlug,\n hasCreatableSelectFields,\n searchFields,\n htmlOutputFields,\n creatableSelectFields,\n m2mFields,\n filterableFields,\n relTableImports,\n listRelTableImports,\n dataInterface,\n displayDataInterface,\n responseInterface,\n filtersInterface,\n createInterface,\n updateInterface,\n selectClause,\n listSelectClause,\n displaySelectClause,\n filterConditions,\n searchBlock,\n resultMapping,\n listResultMapping,\n singleRowReturn,\n displaySingleRowReturn,\n fieldMeta,\n createMappings,\n htmlCreateBlock,\n htmlCreateMappings,\n autoSlugCreate,\n autoSlugUpdate,\n populateListRelsFn,\n filters: resolvedFilters,\n sortableColumns: (schema.columns ?? [])\n .filter((col) => col.sortable === true)\n .map((col) => col.accessorKey),\n selectOptionsTableVar: `${tableVar}SelectOptions`,\n versionSnapshotKeys,\n versionRestoreKeys\n }\n}\n\n/**\n * Wrap result mapping with media resolution call.\n * Finds the return statement and inserts a resolveMediaFields call before it.\n */\nfunction wrapWithMediaResolution(mapping: string, camelPlural: string, Singular: string): string {\n // Replace `return { camelPlural: <array>, total }` with\n // `const resolved = await resolveMediaFields(<array>); return { camelPlural: resolved, total }`\n const returnPattern = new RegExp(\n `return \\\\{\\\\n\\\\s+${camelPlural}: ([^,]+),\\\\n\\\\s+total\\\\n\\\\s+\\\\}`\n )\n const match = mapping.match(returnPattern)\n if (match) {\n const arrayExpr = match[1].trim()\n return mapping.replace(\n match[0],\n `const resolved${Singular}Media = await resolve${Singular}MediaFields(${arrayExpr})\\n\\n return {\\n ${camelPlural}: resolved${Singular}Media,\\n total\\n }`\n )\n }\n // Fallback: simple return with results as Type[]\n return mapping.replace(\n new RegExp(`${camelPlural}: (results as ${Singular}\\\\[\\\\])`),\n `${camelPlural}: await resolve${Singular}MediaFields($1)`\n )\n}\n","/**\n * Generator 2b: Server actions for single (singleton) schemas\n * Split into individual files: types.ts, get-{singular}.ts, upsert-{singular}.ts, index.ts\n */\n\nimport { isLayoutField } from '@core-engine/schema/constants.js'\nimport { flattenFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport {\n pluralize,\n quotePropertyName,\n singularize,\n toCamelCase,\n toKebabCase,\n toPascalCase\n} from '@core-engine/utils/string.js'\nimport { resolveSchemaActionDir } from '@next-adapter/config/paths.js'\nimport type { ActionsGeneratorResult } from '@next-adapter/generators/actions/action-helpers.js'\nimport {\n buildAuthorshipAliasBlock,\n buildAuthorshipDataFields,\n buildAuthorshipJoins,\n buildAuthorshipSelects,\n buildAuthorshipUserType,\n buildExplicitSelect,\n buildSingleRowMapping,\n createAuthorshipFields,\n getFieldType,\n isAuthorshipFieldName\n} from '@next-adapter/generators/actions/action-helpers.js'\nimport {\n buildSelectOptionTypes,\n genCreateSelectOptionContent,\n genGetSelectOptionsContent,\n type SelectOptionCtx\n} from '@next-adapter/generators/actions/entity-file-contents.js'\nimport { genMarkdownRendererContent } from '@next-adapter/generators/actions/markdown-renderer.js'\n\n/**\n * Generate server actions for a single (singleton) schema, split into individual files.\n */\nexport function generateSingleActions(\n schema: Schema,\n actionsDir: string,\n options: { force?: boolean; nextMajorVersion?: number; outputNamespace?: string } = {}\n): ActionsGeneratorResult {\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const tableVar = toCamelCase(schema.name)\n const camelSingular = toCamelCase(singular)\n const kebabSingular = toKebabCase(singular)\n const schemaActionDir = resolveSchemaActionDir(actionsDir, schema.name, options.outputNamespace)\n\n const dbFields = flattenFields(schema.fields).filter(\n (f) => !(f.type === 'relationship' && f.multiple === true) && !isLayoutField(f.type)\n )\n\n const htmlOutputFields = dbFields.filter(\n (f) => (f.type === 'richtext' || f.type === 'markdown') && f.output === 'html'\n )\n const hasHtmlOutput = htmlOutputFields.length > 0\n const creatableSelectFields = dbFields.filter(\n (field) => field.type === 'select' && field.creatable === true\n )\n const hasCreatableSelectFields = creatableSelectFields.length > 0\n\n const allDbFields = [...dbFields]\n if (!dbFields.some((f) => f.name === 'createdAt')) {\n allDbFields.push({ name: 'createdAt', type: 'timestamp' as const, required: true })\n }\n if (!dbFields.some((f) => f.name === 'updatedAt')) {\n allDbFields.push({ name: 'updatedAt', type: 'timestamp' as const, required: true })\n }\n for (const field of createAuthorshipFields()) {\n if (!dbFields.some((f) => f.name === field.name)) {\n allDbFields.push(field)\n }\n }\n\n const upsertFields = dbFields.filter(\n (f) =>\n !f.primaryKey &&\n f.name !== 'createdAt' &&\n f.name !== 'updatedAt' &&\n !isAuthorshipFieldName(f.name)\n )\n\n // --- Build types ---\n const dataFields = allDbFields\n .map(\n (f) =>\n ` ${quotePropertyName(f.name)}: ${getFieldType(f, 'output')}${\n f.required || f.primaryKey ? '' : ' | null'\n }`\n )\n .join('\\n')\n const htmlFieldTypes = htmlOutputFields.map((f) => ` ${f.name}Html: string`).join('\\n')\n\n const upsertInterfaceFields = upsertFields\n .map((f) => ` ${quotePropertyName(f.name)}?: ${getFieldType(f, 'input')}`)\n .join('\\n')\n\n const fieldMeta = upsertFields\n .map((f) => `{ name: '${f.name}', type: '${f.type}', required: ${f.required ?? false} }`)\n .join(',\\n ')\n\n const cacheTag = `${schema.name}:all`\n const cacheTagsVar = `${tableVar}CacheTags`\n const nextMajor = options.nextMajorVersion ?? 16\n const cacheInvalidationFn = nextMajor >= 16 ? 'updateTag' : 'revalidateTag'\n const cacheReadImport =\n nextMajor >= 16\n ? `import { cacheLife, cacheTag } from 'next/cache'`\n : `import { unstable_cacheTag as cacheTag } from 'next/cache'`\n const cacheLifeLine = nextMajor >= 16 ? `\\n cacheLife('max')` : ''\n const singletonId = '00000000-0000-0000-0000-000000000001'\n const selectOptionsCtx: SelectOptionCtx = {\n singular,\n plural,\n Singular,\n camelSingular,\n cacheReadImport,\n cacheLifeLine,\n cacheInvalidationFn,\n creatableSelectFields,\n selectOptionsTableVar: `${tableVar}SelectOptions`\n }\n\n // --- types.ts ---\n const typesContent = `${[\n buildAuthorshipUserType(),\n `export interface ${Singular} {\\n${dataFields}${htmlFieldTypes ? `\\n${htmlFieldTypes}` : ''}\\n${buildAuthorshipDataFields()}\\n}`,\n `export interface ${Singular}UpsertInput {\\n${upsertInterfaceFields}\\n}`,\n `export interface ${Singular}UpsertResult {\\n success: boolean\\n error?: string\\n ${camelSingular}?: ${Singular}\\n}`,\n hasCreatableSelectFields ? buildSelectOptionTypes(selectOptionsCtx) : null,\n `export const ${cacheTagsVar} = {\\n all: '${cacheTag}'\\n} as const`\n ]\n .filter(Boolean)\n .join('\\n\\n')}\\n`\n\n // --- get-{singular}.ts ---\n const authorshipSelects = buildAuthorshipSelects()\n const authorshipJoins = buildAuthorshipJoins(tableVar)\n const selectClause = buildExplicitSelect(\n allDbFields,\n tableVar,\n htmlOutputFields,\n authorshipSelects,\n authorshipJoins\n )\n const singleRowReturn = `const row = result[0]\\n return ${buildSingleRowMapping(allDbFields, [], `${Singular}`, htmlOutputFields)}`\n\n const getContent = `'use server'\n\nimport db from '@admin/db'\nimport { ${tableVar}, user } from '@admin/db/schema'\nimport { eq } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/pg-core'\n${cacheReadImport}\nimport { ${cacheTagsVar} } from './types'\nimport type { ${Singular} } from './types'\n\n${buildAuthorshipAliasBlock()}\n\nconst SINGLETON_ID = '${singletonId}'\n\nexport async function get${Singular}(): Promise<${Singular} | null> {\n 'use cache'${cacheLifeLine}\n cacheTag(${cacheTagsVar}.all)\n\n try {\n const result = await ${selectClause}.where(eq(${tableVar}.id, SINGLETON_ID)).limit(1)\n if (result.length === 0) return null\n ${singleRowReturn}\n } catch (error) {\n console.error('Error fetching ${singular}:', error)\n return null\n }\n}\n`\n\n // --- upsert-{singular}.ts ---\n const markdownImport = hasHtmlOutput ? `\\nimport { renderMarkdownSync } from './markdown'` : ''\n const htmlUpsertBlock = hasHtmlOutput\n ? `\\n` +\n htmlOutputFields\n .map(\n (f) =>\n ` if (processedData.${f.name} !== undefined) {\\n processedData.${f.name}Html = renderMarkdownSync(String(processedData.${f.name} || ''))\\n }`\n )\n .join('\\n') +\n '\\n'\n : ''\n const upsertContent = `'use server'\n\nimport { requireRole, UserRole } from '@admin/auth/middleware'\nimport db from '@admin/db'\nimport { ${tableVar} } from '@admin/db/schema'\nimport { ${cacheInvalidationFn} } from 'next/cache'\nimport { get${Singular} } from './get-${kebabSingular}'\nimport { ${cacheTagsVar} } from './types'\nimport type { ${Singular}UpsertInput, ${Singular}UpsertResult, ${Singular} } from './types'${markdownImport}\n\nconst SINGLETON_ID = '${singletonId}'\n\nexport async function upsert${Singular}(input: ${Singular}UpsertInput): Promise<${Singular}UpsertResult> {\n const actor = await requireRole([UserRole.ADMIN, UserRole.EDITOR])\n\n try {\n const actorId = actor.id\n const fieldMeta = [\n ${fieldMeta}\n ]\n\n const processedData: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(input)) {\n const field = fieldMeta.find(f => f.name === key)\n if (!field) continue\n if (field.type === 'list') {\n processedData[key] = value || []\n } else if (!field.required && ['date', 'timestamp', 'time', 'string', 'varchar', 'text', 'select'].includes(field.type)) {\n processedData[key] = value && value !== '' ? value : null\n } else {\n processedData[key] = value\n }\n }\n${htmlUpsertBlock}\n const now = new Date().toISOString()\n\n const result = await db\n .insert(${tableVar})\n .values({\n id: SINGLETON_ID,\n ...processedData,\n createdAt: now,\n updatedAt: now,\n createdBy: actorId,\n updatedBy: actorId\n })\n .onConflictDoUpdate({\n target: ${tableVar}.id,\n set: { ...processedData, updatedAt: now, updatedBy: actorId }\n })\n .returning()\n\n ${cacheInvalidationFn}(${cacheTagsVar}.all)\n const saved${Singular} = await get${Singular}()\n\n return {\n success: true,\n ${camelSingular}: saved${Singular} ?? (result[0] as ${Singular})\n }\n } catch (error) {\n console.error('Error upserting ${singular}:', error)\n throw new Error(error instanceof Error ? error.message : 'Failed to save ${singular}')\n }\n}\n`\n\n // --- index.ts (barrel) ---\n const selectOptionTypeExports = hasCreatableSelectFields\n ? `, ${Singular}SelectOption, ${Singular}SelectOptionFieldName, Create${Singular}SelectOptionInput, Create${Singular}SelectOptionResult`\n : ''\n const selectOptionFunctionExports = hasCreatableSelectFields\n ? `export { get${Singular}SelectOptions } from './get-${kebabSingular}-select-options'\nexport { create${Singular}SelectOption } from './create-${kebabSingular}-select-option'\n`\n : ''\n const barrelContent = `export type { ${Singular}, ${Singular}UpsertInput, ${Singular}UpsertResult${selectOptionTypeExports} } from './types'\nexport { get${Singular} } from './get-${kebabSingular}'\nexport { upsert${Singular} } from './upsert-${kebabSingular}'\n${selectOptionFunctionExports}\n`\n\n const files = [\n { name: 'types.ts', content: typesContent },\n ...(hasHtmlOutput ? [{ name: 'markdown.ts', content: genMarkdownRendererContent() }] : []),\n { name: `get-${kebabSingular}.ts`, content: getContent },\n ...(hasCreatableSelectFields\n ? [\n {\n name: `get-${kebabSingular}-select-options.ts`,\n content: genGetSelectOptionsContent(selectOptionsCtx)\n },\n {\n name: `create-${kebabSingular}-select-option.ts`,\n content: genCreateSelectOptionContent(selectOptionsCtx)\n }\n ]\n : []),\n { name: `upsert-${kebabSingular}.ts`, content: upsertContent },\n { name: 'index.ts', content: barrelContent }\n ]\n\n return {\n files: files.map((file) => createGeneratedFile(`${schemaActionDir}/${file.name}`, file.content))\n }\n}\n","/**\n * Template strings for column action components.\n */\n\n// ============================================================================\n// Row Actions Component File Template\n// ============================================================================\n\nexport function generateRowActionsFileTemplate(params: {\n Actions: string\n DeleteDialog: string\n deleteDialogFileName: string\n singular: string\n}): string {\n const { Actions, DeleteDialog, deleteDialogFileName, singular } = params\n\n return `'use client'\n\nimport { Button } from '@admin/components/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuTrigger\n} from '@admin/components/ui/dropdown-menu'\nimport { MoreHorizontal } from 'lucide-react'\nimport * as React from 'react'\nimport { ${DeleteDialog} } from './${deleteDialogFileName}'\n\nexport function ${Actions}({ id }: { id: string }) {\n const [menuOpen, setMenuOpen] = React.useState(false)\n const [deleteOpen, setDeleteOpen] = React.useState(false)\n\n function handleDeleteOpenChange(open: boolean) {\n setDeleteOpen(open)\n\n if (!open) {\n setMenuOpen(false)\n }\n }\n\n return (\n <DropdownMenu open={menuOpen} onOpenChange={setMenuOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"size-8 p-0\"\n aria-label={\\`Open ${singular} actions for \\${id}\\`}\n >\n <span className=\"sr-only\">Open ${singular} actions</span>\n <MoreHorizontal className=\"size-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <${DeleteDialog}\n id={id}\n open={deleteOpen}\n onOpenChange={handleDeleteOpenChange}\n />\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n`\n}\n\n// ============================================================================\n// Delete Dialog Component File Template\n// ============================================================================\n\nexport function generateDeleteDialogFileTemplate(params: {\n Singular: string\n actionImportPath: string\n singular: string\n plural: string\n}): string {\n const { Singular, actionImportPath, singular, plural } = params\n\n return `'use client'\n\nimport { delete${Singular} } from '@admin/actions/${actionImportPath}'\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger\n} from '@admin/components/ui/alert-dialog'\nimport { DropdownMenuItem } from '@admin/components/ui/dropdown-menu'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { Trash } from 'lucide-react'\nimport * as React from 'react'\nimport { toast } from 'sonner'\n\ninterface Delete${Singular}DialogProps {\n id: string\n open: boolean\n onOpenChange: (open: boolean) => void\n}\n\nexport function Delete${Singular}Dialog({\n id,\n open,\n onOpenChange\n}: Delete${Singular}DialogProps) {\n const [isPending, startTransition] = React.useTransition()\n const queryClient = useQueryClient()\n\n const handleDelete = () => {\n startTransition(async () => {\n try {\n const result = await delete${Singular}(id)\n\n if (result.success) {\n toast.success('${Singular} deleted successfully')\n queryClient.refetchQueries({ queryKey: ['${plural}'] })\n onOpenChange(false)\n } else {\n toast.error(result.error || 'Failed to delete ${singular}')\n }\n } catch (error) {\n toast.error('An error occurred')\n console.error(error)\n }\n })\n }\n\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogTrigger asChild>\n <DropdownMenuItem variant=\"destructive\" onSelect={(event) => event.preventDefault()}>\n <Trash className=\"size-4\" />\n Delete ${singular}\n </DropdownMenuItem>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Are you sure?</AlertDialogTitle>\n <AlertDialogDescription>\n This action cannot be undone. This will permanently delete this ${singular}.\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(e) => {\n e.preventDefault()\n handleDelete()\n }}\n disabled={isPending}\n >\n {isPending ? 'Deleting...' : 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n )\n}\n`\n}\n","/**\n * Column definition generators for TanStack Table columns\n */\n\nimport type { SchemaColumn, SchemaField } from '@core-engine/schema/types.js'\nimport { buildColumnSize } from '@next-adapter/generators/table-column-size.js'\n\n// ============================================================================\n// Column Helpers\n// ============================================================================\n\nexport function isSortableColumn(column: SchemaColumn): boolean {\n return column.sortable === true\n}\n\nexport function buildColumnMeta(column: SchemaColumn, extra?: Record<string, string>): string {\n const props: Record<string, string> = { ...extra }\n if (column.align && column.align !== 'left') {\n props.align = column.align\n }\n const entries = Object.entries(props)\n if (entries.length === 0) return ''\n const inner = entries.map(([k, v]) => `${k}: '${v}'`).join(', ')\n return `meta: { ${inner} },\\n `\n}\n\nexport function generateTitleFallback(fields: SchemaField[]): string {\n const fieldNames = new Set(fields.map((f) => f.name))\n const fallbacks: string[] = []\n if (fieldNames.has('title')) fallbacks.push('row.original.title')\n if (fieldNames.has('name')) fallbacks.push('row.original.name')\n fallbacks.push('row.original.id')\n fallbacks.push(\"''\")\n return fallbacks.join(' || ')\n}\n\nfunction quoteStringLiteral(value: string): string {\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n')\n\n return `'${escaped}'`\n}\n\nfunction getBooleanColumnLabels(\n column: SchemaColumn,\n fields: SchemaField[]\n): { trueLabel: string; falseLabel: string } {\n const field = fields.find((item) => item.name === column.accessorKey)\n const baseLabel = field?.label || column.header\n const defaultLabels =\n column.accessorKey === 'published'\n ? { trueLabel: 'Published', falseLabel: 'Draft' }\n : { trueLabel: baseLabel, falseLabel: `Not ${baseLabel}` }\n\n return {\n trueLabel: quoteStringLiteral(column.trueLabel ?? defaultLabels.trueLabel),\n falseLabel: quoteStringLiteral(column.falseLabel ?? defaultLabels.falseLabel)\n }\n}\n\nfunction getAuthorshipUserAccessor(accessorKey: string): 'createdByUser' | 'updatedByUser' | null {\n if (accessorKey === 'createdBy') return 'createdByUser'\n if (accessorKey === 'updatedBy') return 'updatedByUser'\n return null\n}\n\nfunction generateAuthorshipValue(userAccessor: 'createdByUser' | 'updatedByUser'): string {\n return `const actor = row.original.${userAccessor}\n const label = actor?.name || actor?.email`\n}\n\nfunction fieldHasMediaCompanion(column: SchemaColumn, fields: SchemaField[]): boolean {\n const field = fields.find((item) => item.name === column.accessorKey)\n return field?.type === 'image' || field?.type === 'media' || field?.type === 'video'\n}\n\nfunction buildImageUrlExpression(\n column: SchemaColumn,\n fields: SchemaField[],\n fallbackExpression: string\n): string {\n const fallback = `(${fallbackExpression} as string | null | undefined)`\n\n if (!fieldHasMediaCompanion(column, fields)) {\n return fallback\n }\n\n return `row.original.${column.accessorKey}Media?.url ?? ${fallback}`\n}\n\nfunction generateImageElement(column: SchemaColumn): string {\n return `<Avatar className=\"size-10 overflow-hidden border\">\n {imageUrl ? (\n <Image\n src={imageUrl}\n alt={title ? \\`${column.header} image for \\${title}\\` : '${column.header} image'}\n fill\n sizes=\"40px\"\n className=\"rounded-full object-cover\"\n unoptimized\n />\n ) : (\n <AvatarFallback>\n {String(title || imageUrl).substring(0, 2).toUpperCase()}\n </AvatarFallback>\n )}\n </Avatar>`\n}\n\nfunction generateImageCellMedia(\n column: SchemaColumn,\n fields: SchemaField[],\n valueExpression: string,\n options: { selectable?: boolean } = {}\n): string {\n const imageUrlExpression = buildImageUrlExpression(column, fields, valueExpression)\n const titleFallback = generateTitleFallback(fields)\n const imageElement = generateImageElement(column)\n\n if (options.selectable) {\n return `const imageUrl = ${imageUrlExpression} ?? ''\n const title = ${titleFallback}\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n ${imageElement.split('\\n').join('\\n ')}\n </div>\n )`\n }\n\n return `const imageUrl = ${imageUrlExpression} ?? ''\n const title = ${titleFallback}\n return (\n ${imageElement}\n )`\n}\n\n// ============================================================================\n// Cell Renderers\n// ============================================================================\n\nfunction buildSortableHeaderButtonJsx(\n column: SchemaColumn,\n options: { className: string } = { className: 'w-full' }\n): string {\n return `<Button\n variant=\"ghost\"\n onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}\n className=\"${options.className} min-w-0 justify-start overflow-hidden px-0! border-none rounded-none bg-transparent! scale-100! group\"\n aria-label={\\`Sort by ${column.header}, \\${sortLabel}\\`}\n aria-sort={sortDirection === 'asc' ? 'ascending' : sortDirection === 'desc' ? 'descending' : 'none'}\n >\n <span className=\"truncate\">${column.header}</span>\n <SortIndicator direction={sortDirection} />\n </Button>`\n}\n\nfunction buildSortLabelExpr(): string {\n return `const sortDirection = column.getIsSorted()\n const sortLabel = sortDirection === 'asc'\n ? 'sorted ascending'\n : sortDirection === 'desc'\n ? 'sorted descending'\n : 'not sorted'\n`\n}\n\nexport function generateColumnDef(column: SchemaColumn, fields: SchemaField[]): string {\n const sortable = isSortableColumn(column)\n const headerDef = sortable\n ? `header: ({ column }) => {\n ${buildSortLabelExpr()}\n return (\n ${buildSortableHeaderButtonJsx(column, { className: 'w-full' })}\n )\n }`\n : `header: '${column.header}'`\n\n let cellDef = ''\n const authorshipUserAccessor = getAuthorshipUserAccessor(column.accessorKey)\n\n if (authorshipUserAccessor) {\n cellDef = `cell: ({ row }) => {\n ${generateAuthorshipValue(authorshipUserAccessor)}\n return label ? (\n <div className=\"text-sm font-medium\" title={actor?.email}>\n {label}\n </div>\n ) : (\n <div className=\"text-muted-foreground\">Unavailable</div>\n )\n }`\n } else\n switch (column.type) {\n case 'image':\n case 'avatar':\n cellDef = `cell: ({ row }) => {\n ${generateImageCellMedia(column, fields, `row.getValue('${column.accessorKey}')`)}\n }`\n break\n case 'badge':\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${column.accessorKey}')\n return (\n <Badge variant=\"outline\">\n {value === null || value === undefined ? 'Unavailable' : String(value)}\n </Badge>\n )\n }`\n break\n case 'date':\n cellDef = `cell: ({ row }) => {\n const date = new Date(row.getValue('${column.accessorKey}'))\n return (\n <div className=\"text-sm\">\n {date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })}\n </div>\n )\n }`\n break\n case 'email':\n cellDef = `cell: ({ row }) => {\n const email = row.getValue('${column.accessorKey}') as string\n return <div className=\"text-sm font-medium\">{email}</div>\n }`\n break\n case 'number':\n if (column.format === 'currency') {\n cellDef = `cell: ({ row }) => {\n const amount = row.getValue('${column.accessorKey}') as number\n return (\n <div className=\"text-sm font-medium\">\n {new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(amount)}\n </div>\n )\n }`\n } else {\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${column.accessorKey}') as number\n return <div className=\"text-sm\">{value}</div>\n }`\n }\n break\n case 'boolean':\n {\n const { trueLabel, falseLabel } = getBooleanColumnLabels(column, fields)\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${column.accessorKey}') as boolean\n return (\n <Badge variant={value ? 'outline' : 'secondary'}>\n {value ? ${trueLabel} : ${falseLabel}}\n </Badge>\n )\n }`\n }\n break\n case 'link':\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${column.accessorKey}') as string\n if (!value) return <div className=\"text-muted-foreground\">\\u2014</div>\n return (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-blue-600 hover:text-blue-800 hover:underline dark:text-blue-400 dark:hover:text-blue-300\"\n title={value}\n >\n {truncateText(value, 50)}\n </a>\n )\n }`\n break\n case 'custom':\n if (column.component) {\n cellDef = `cell: ({ row }) => {\n return <${column.component} data={row.original} />\n }`\n } else {\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${column.accessorKey}')\n return <div>{value === null || value === undefined ? 'Unavailable' : String(value)}</div>\n }`\n }\n break\n default:\n cellDef = `cell: ({ row }) => {\n const value = row.getValue('${column.accessorKey}')\n return <div>{value === null || value === undefined ? 'Unavailable' : String(value)}</div>\n }`\n break\n }\n\n const meta = buildColumnMeta(column)\n\n return ` {\n accessorKey: '${column.accessorKey}',\n ${buildColumnSize(column.size)}${meta}${headerDef},\n ${cellDef}\n }`\n}\n\nexport function generateFirstColumnDef(\n column: SchemaColumn,\n fields: SchemaField[],\n options: { selectable?: boolean } = {}\n): string {\n if (options.selectable === false) {\n return generateColumnDef(column, fields)\n }\n\n const sortable = isSortableColumn(column)\n const headerDef = sortable\n ? `header: ({ table, column }) => {\n ${buildSortLabelExpr()}\n return (\n <div className=\"flex min-w-0 items-center gap-4 pl-1\">\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n ${buildSortableHeaderButtonJsx(column, { className: 'flex-1' })}\n </div>\n )\n }`\n : `header: ({ table }) => (\n <div className=\"flex items-center gap-4 pl-1\">\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n <span>${column.header}</span>\n </div>\n )`\n\n let cellDef = ''\n const authorshipUserAccessor = getAuthorshipUserAccessor(column.accessorKey)\n\n if (authorshipUserAccessor) {\n cellDef = `cell: ({ row }) => {\n ${generateAuthorshipValue(authorshipUserAccessor)}\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n {label ? (\n <span className=\"text-sm font-medium truncate max-w-[300px]\" title={actor?.email}>\n {label}\n </span>\n ) : (\n <span className=\"text-muted-foreground\">Unavailable</span>\n )}\n </div>\n )\n }`\n } else\n switch (column.type) {\n case 'image':\n case 'avatar':\n cellDef = `cell: ({ row }) => {\n ${generateImageCellMedia(column, fields, `row.original.${column.accessorKey}`, {\n selectable: true\n })}\n }`\n break\n case 'badge':\n cellDef = `cell: ({ row }) => {\n const value = row.original.${column.accessorKey}\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <Badge variant=\"outline\">\n {value === null || value === undefined ? 'Unavailable' : String(value)}\n </Badge>\n </div>\n )\n }`\n break\n case 'date':\n cellDef = `cell: ({ row }) => {\n const date = new Date(row.original.${column.accessorKey})\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <div className=\"text-sm\">\n {date.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n })}\n </div>\n </div>\n )\n }`\n break\n case 'email':\n cellDef = `cell: ({ row }) => {\n const email = row.original.${column.accessorKey} as string\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <span className=\"text-sm font-medium truncate max-w-[300px]\">{email}</span>\n </div>\n )\n }`\n break\n case 'number':\n if (column.format === 'currency') {\n cellDef = `cell: ({ row }) => {\n const amount = row.original.${column.accessorKey} as number\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <div className=\"text-sm font-medium\">\n {new Intl.NumberFormat('en-US', {\n style: 'currency',\n currency: 'USD'\n }).format(amount)}\n </div>\n </div>\n )\n }`\n } else {\n cellDef = `cell: ({ row }) => {\n const value = row.original.${column.accessorKey} as number\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <div className=\"text-sm\">{value}</div>\n </div>\n )\n }`\n }\n break\n case 'boolean':\n {\n const { trueLabel, falseLabel } = getBooleanColumnLabels(column, fields)\n cellDef = `cell: ({ row }) => {\n const value = row.original.${column.accessorKey} as boolean\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <Badge variant={value ? 'outline' : 'secondary'}>\n {value ? ${trueLabel} : ${falseLabel}}\n </Badge>\n </div>\n )\n }`\n }\n break\n case 'custom':\n if (column.component) {\n cellDef = `cell: ({ row }) => {\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <${column.component} data={row.original} />\n </div>\n )\n }`\n } else {\n cellDef = `cell: ({ row }) => {\n const value = row.original.${column.accessorKey}\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <span className=\"truncate max-w-[300px]\">\n {value === null || value === undefined ? 'Unavailable' : String(value)}\n </span>\n </div>\n )\n }`\n }\n break\n case 'link':\n cellDef = `cell: ({ row }) => {\n const value = row.original.${column.accessorKey} as string\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n {value ? (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm text-blue-600 hover:text-blue-800 hover:underline dark:text-blue-400 dark:hover:text-blue-300 truncate block max-w-[250px]\"\n title={value}\n onClick={(e) => e.stopPropagation()}\n >\n {truncateText(value, 50)}\n </a>\n ) : (\n <span className=\"text-muted-foreground\">\\u2014</span>\n )}\n </div>\n )\n }`\n break\n default:\n cellDef = `cell: ({ row }) => {\n const value = row.original.${column.accessorKey}\n return (\n <div className=\"flex items-center gap-4 h-full pl-1\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n <span className=\"truncate max-w-[300px]\">\n {value === null || value === undefined ? 'Unavailable' : String(value)}\n </span>\n </div>\n )\n }`\n break\n }\n\n const meta = buildColumnMeta(column)\n\n return ` {\n accessorKey: '${column.accessorKey}',\n ${buildColumnSize(column.size)}${meta}${headerDef},\n ${cellDef},\n enableSorting: ${sortable ? 'true' : 'false'},\n enableHiding: false\n }`\n}\n","/**\n * Custom cell component generator — creates stub cell components for custom column types\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { singularize, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\n\nexport function createCustomCellComponent(\n schema: Schema,\n componentName: string,\n pagesDir: string,\n options: GeneratorOptions = {}\n): GeneratedFile[] {\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n\n const content = `import type { ${Singular} } from '@admin/actions/${actionImportPath}'\n\ninterface ${componentName}Props {\n data: ${Singular}\n}\n\nexport function ${componentName}({ data }: ${componentName}Props) {\n return (\n <div>\n {JSON.stringify(data)}\n </div>\n )\n}\n`\n\n return [createGeneratedFile(`${pagesDir}/${schema.name}/cells/${componentName}.tsx`, content)]\n}\n","/**\n * Generator 4: Column definitions — (authenticated)/<n>/columns.tsx\n * Generates TanStack Table column definitions for entity list views\n */\n\nimport { flattenFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { pluralize, singularize, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport {\n generateDeleteDialogFileTemplate,\n generateRowActionsFileTemplate\n} from '@next-adapter/generators/columns/column-actions.js'\nimport {\n generateColumnDef,\n generateFirstColumnDef,\n isSortableColumn\n} from '@next-adapter/generators/columns/column-defs.js'\nimport { createCustomCellComponent } from '@next-adapter/generators/columns/custom-cell.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface ColumnsGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate column definitions for entity list view\n */\nexport function generateColumns(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): ColumnsGeneratorResult {\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const columns = schema.columns ?? []\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const Actions = `${Singular}Actions`\n const DeleteDialog = `Delete${Singular}Dialog`\n const deleteDialogFileName = `delete-${singular}-dialog`\n\n const flatFields = flattenFields(schema.fields || [])\n\n // --- Determine needed imports ---\n let needsSortIcons = false\n let needsBadge = false\n let needsButton = false\n let needsImageRenderer = false\n let needsTruncate = false\n\n for (const column of columns) {\n if (isSortableColumn(column)) {\n needsSortIcons = true\n needsButton = true\n }\n if (column.type === 'badge' || column.type === 'boolean') needsBadge = true\n if (column.type === 'image' || column.type === 'avatar') needsImageRenderer = true\n if (column.type === 'link') needsTruncate = true\n }\n\n const hasDelete = schema.actions?.delete ?? false\n\n // --- Build lucide icons ---\n const lucideIcons: string[] = []\n\n // --- Build UI component imports (individual per-component) ---\n const uiImports: string[] = []\n if (needsButton) uiImports.push(\"import { Button } from '@admin/components/ui/button'\")\n if (needsBadge) uiImports.push(\"import { Badge } from '@admin/components/ui/badge'\")\n if (hasDelete) uiImports.push(\"import { Checkbox } from '@admin/components/ui/checkbox'\")\n if (needsImageRenderer) {\n uiImports.push(\"import { Avatar, AvatarFallback } from '@admin/components/ui/avatar'\")\n }\n\n // --- Custom component imports ---\n const customImports: string[] = []\n const customFiles: GeneratedFile[] = []\n for (const column of columns) {\n if (column.type === 'custom' && column.component) {\n customImports.push(`import { ${column.component} } from './cells/${column.component}'`)\n customFiles.push(...createCustomCellComponent(schema, column.component, pagesDir, options))\n }\n }\n\n const utilityImports: string[] = []\n if (needsSortIcons) {\n utilityImports.push(\"import { SortIndicator } from '@admin/components/shared/sort-indicator'\")\n }\n if (needsTruncate) utilityImports.push(\"import { truncateText } from '@admin/utils/text/text'\")\n\n // --- Generate columns ---\n const firstColumn = columns[0]\n const restColumns = columns.slice(1)\n\n const firstColDef = generateFirstColumnDef(firstColumn, flatFields, { selectable: hasDelete })\n const restColDefs = restColumns.map((col) => generateColumnDef(col, flatFields)).join(',\\n')\n\n // --- Actions column ---\n const actionsColumn = hasDelete\n ? ` {\n id: 'actions',\n size: 64,\n enableResizing: false,\n meta: { width: '64px' },\n header: () => <span className=\"sr-only\">Actions</span>,\n cell: ({ row }) => (\n <div className=\"flex justify-end\">\n <${Actions} id={row.original.id} />\n </div>\n )\n }`\n : ''\n\n // --- Assemble file ---\n const content = `'use client'\n\nimport type { ColumnDef } from '@tanstack/react-table'\n${lucideIcons.length > 0 ? `import { ${lucideIcons.join(', ')} } from 'lucide-react'` : ''}\n${needsImageRenderer ? \"import Image from 'next/image'\" : ''}\n${uiImports.join('\\n')}\n${utilityImports.join('\\n')}\nimport type { ${Singular} } from '@admin/actions/${actionImportPath}'\n${customImports.join('\\n')}\n${hasDelete ? `import { ${Actions} } from './actions'\\n` : ''}\nexport const columns: ColumnDef<${Singular}>[] = [\n${firstColDef}${restColDefs ? `,\\n${restColDefs}` : ''}${actionsColumn ? `,\\n${actionsColumn}` : ''}\n]\n`\n const files = [createGeneratedFile(`${pagesDir}/${schema.name}/columns.tsx`, content)]\n\n if (hasDelete) {\n files.push(\n createGeneratedFile(\n `${pagesDir}/${schema.name}/actions.tsx`,\n generateRowActionsFileTemplate({\n Actions,\n DeleteDialog,\n deleteDialogFileName,\n singular\n })\n ),\n createGeneratedFile(\n `${pagesDir}/${schema.name}/${deleteDialogFileName}.tsx`,\n generateDeleteDialogFileTemplate({\n Singular,\n actionImportPath,\n singular,\n plural\n })\n )\n )\n }\n\n return {\n files: [...files, ...customFiles]\n }\n}\n","/**\n * Generator 9: Create page — (authenticated)/<n>/new/page.tsx\n * Generates server page component for creating a new entity\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport {\n singularize,\n singularizeLabel,\n toKebabCase,\n toPascalCase\n} from '@core-engine/utils/string.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface CreatePageGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate create page component for adding a new entity\n */\nexport function generateCreatePage(\n schema: Schema,\n pagesDir: string,\n _options: GeneratorOptions = {}\n): CreatePageGeneratorResult {\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n const singLabel = singularizeLabel(schema.label)\n const kebabName = toKebabCase(schema.name)\n\n const content = `import { ${Singular}Form } from '../${kebabName}-form'\n\nexport default function Create${Singular}Page() {\n return <${Singular}Form pageTitle=\"Create ${singLabel}\" />\n}\n`\n\n return {\n files: [createGeneratedFile(`${pagesDir}/${schema.name}/new/page.tsx`, content)]\n }\n}\n","/**\n * Generator 1: Database schema — emit per-schema extract under admin/lib/db/<namespace>/\n */\n\nimport { isLayoutField } from '@core-engine/schema/constants.js'\nimport { flattenFields, getManyToManyFields } from '@core-engine/schema/field-helpers/index.js'\nimport { toDrizzleType } from '@core-engine/schema/type-mappers/index.js'\nimport type {\n GeneratedFile,\n GeneratorOptions,\n Schema,\n SchemaField\n} from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { singularize, toCamelCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveExtensionNamespace } from '@next-adapter/config/paths.js'\n\nfunction getFieldModifiers(field: SchemaField, needsSql: { value: boolean }): string {\n const modifiers: string[] = []\n\n if (field.primaryKey) {\n modifiers.push('.primaryKey()')\n }\n\n const isDateField = field.type === 'date' || field.type === 'timestamp'\n const hasValidDefault =\n field.default !== undefined && field.default !== null && !(isDateField && field.default === '')\n\n if (hasValidDefault) {\n if (field.type === 'select' && field.multiple) {\n const defaultValues = Array.isArray(field.default) ? field.default : [field.default]\n const jsonDefault = JSON.stringify(defaultValues.map((value) => String(value))).replaceAll(\n \"'\",\n \"''\"\n )\n modifiers.push(`.default(sql\\`'${jsonDefault}'::jsonb\\`)`)\n needsSql.value = true\n } else if (typeof field.default === 'string') {\n modifiers.push(`.default('${field.default}')`)\n } else {\n modifiers.push(`.default(${field.default})`)\n }\n }\n\n if (field.name === 'createdAt' || field.name === 'updatedAt') {\n modifiers.push('.default(sql`CURRENT_TIMESTAMP`)')\n needsSql.value = true\n }\n\n if (field.required || field.primaryKey) {\n modifiers.push('.notNull()')\n }\n\n return modifiers.join('')\n}\n\nfunction generateTableDefinition(\n schema: Schema,\n requiredImports: Set<string>,\n needsSql: { value: boolean }\n): string {\n const tableName = toPascalCase(schema.name)\n const variableName = toCamelCase(schema.name)\n\n requiredImports.add('pgTable')\n\n const dbFields = flattenFields(schema.fields).filter(\n (field) =>\n !(field.type === 'relationship' && field.multiple === true) && !isLayoutField(field.type)\n )\n\n const hasDraftMode = schema.actions?.draft === true\n const hasPublishedField = dbFields.some((field) => field.name === 'published')\n\n const fieldDefs = dbFields\n .map((field) => {\n const drizzleType = toDrizzleType(field, requiredImports)\n const modifiers = getFieldModifiers(field, needsSql)\n const line = ` ${field.name}: ${drizzleType}${modifiers}`\n\n if ((field.type === 'richtext' || field.type === 'markdown') && field.output === 'html') {\n const snakeName = field.name.replace(/([A-Z])/g, '_$1').toLowerCase()\n requiredImports.add('text')\n return `${line},\\n ${field.name}Html: text('${snakeName}_html')`\n }\n\n return line\n })\n .join(',\\n')\n\n let publishedField = ''\n if (hasDraftMode && !hasPublishedField) {\n requiredImports.add('boolean')\n publishedField = `,\\n published: boolean().notNull().default(false)`\n }\n\n const hasCreatedAt = dbFields.some((field) => field.name === 'createdAt')\n const hasUpdatedAt = dbFields.some((field) => field.name === 'updatedAt')\n const hasCreatedBy = dbFields.some((field) => field.name === 'createdBy')\n const hasUpdatedBy = dbFields.some((field) => field.name === 'updatedBy')\n let generatedFields = ''\n if (!hasCreatedAt || !hasUpdatedAt) {\n requiredImports.add('timestamp')\n needsSql.value = true\n }\n if (!hasCreatedAt) {\n generatedFields += `,\\n createdAt: timestamp({ precision: 3, mode: 'string' }).default(sql\\`CURRENT_TIMESTAMP\\`).notNull()`\n }\n if (!hasUpdatedAt) {\n generatedFields += `,\\n updatedAt: timestamp({ precision: 3, mode: 'string' }).default(sql\\`CURRENT_TIMESTAMP\\`).notNull()`\n }\n if (!hasCreatedBy || !hasUpdatedBy) {\n requiredImports.add('text')\n }\n if (!hasCreatedBy) {\n generatedFields += `,\\n createdBy: text().references(() => user.id, { onDelete: 'set null' })`\n }\n if (!hasUpdatedBy) {\n generatedFields += `,\\n updatedBy: text().references(() => user.id, { onDelete: 'set null' })`\n }\n\n const isSingle = schema.type === 'single'\n const hasSortOrder = dbFields.some((field) => field.name === 'sortOrder')\n let sortOrderField = ''\n if (!isSingle && !hasSortOrder) {\n requiredImports.add('integer')\n sortOrderField = `,\\n sortOrder: integer().notNull().default(0)`\n }\n\n return `export const ${variableName} = pgTable(\n '${tableName}',\n {\n${fieldDefs}${publishedField}${generatedFields}${sortOrderField}\n }\n)\n`\n}\n\nfunction getCreatableSelectFields(schema: Schema): SchemaField[] {\n return flattenFields(schema.fields).filter(\n (field) => field.type === 'select' && field.creatable === true && !isLayoutField(field.type)\n )\n}\n\nfunction generateSelectOptionsTable(\n schema: Schema,\n requiredImports: Set<string>,\n needsSql: { value: boolean }\n): string | null {\n const creatableSelectFields = getCreatableSelectFields(schema)\n if (creatableSelectFields.length === 0) {\n return null\n }\n\n const tableName = `${toPascalCase(schema.name)}SelectOptions`\n const variableName = `${toCamelCase(schema.name)}SelectOptions`\n const indexName = `${tableName}_fieldName_value_key`\n\n requiredImports.add('pgTable')\n requiredImports.add('text')\n requiredImports.add('timestamp')\n requiredImports.add('uniqueIndex')\n requiredImports.add('uuid')\n requiredImports.add('varchar')\n needsSql.value = true\n\n return `export const ${variableName} = pgTable(\n '${tableName}',\n {\n id: uuid().defaultRandom().primaryKey().notNull(),\n fieldName: varchar('fieldName', { length: 100 }).notNull(),\n label: varchar('label', { length: 255 }).notNull(),\n value: varchar('value', { length: 255 }).notNull(),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'string' })\n .default(sql\\`CURRENT_TIMESTAMP\\`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'string' })\n .default(sql\\`CURRENT_TIMESTAMP\\`)\n .notNull(),\n createdBy: text('createdBy').references(() => user.id, { onDelete: 'set null' }),\n updatedBy: text('updatedBy').references(() => user.id, { onDelete: 'set null' })\n },\n (table) => [\n uniqueIndex('${indexName}').using(\n 'btree',\n table.fieldName.asc().nullsLast().op('text_ops'),\n table.value.asc().nullsLast().op('text_ops')\n )\n ]\n)\n`\n}\n\nfunction schemaHasReverseManyToMany(targetSchema: Schema, currentSchemaName: string): boolean {\n return getManyToManyFields(targetSchema.fields).some(\n (field) => field.relationship === currentSchemaName\n )\n}\n\nfunction shouldEmitJunction(\n currentSchemaName: string,\n field: SchemaField,\n relatedSchemas: Map<string, Schema>\n): boolean {\n const relationship = field.relationship\n if (!relationship) {\n return false\n }\n\n const targetSchema = relatedSchemas.get(relationship)\n if (!targetSchema) {\n throw new Error(\n `Missing relationship schema \"${relationship}\" referenced by \"${currentSchemaName}\".`\n )\n }\n\n const hasReverse = schemaHasReverseManyToMany(targetSchema, currentSchemaName)\n if (!hasReverse) {\n return true\n }\n\n return currentSchemaName.localeCompare(relationship) <= 0\n}\n\nfunction generateJunctionTable(\n schemaName: string,\n field: SchemaField,\n requiredImports: Set<string>,\n siblingImports: Set<string>,\n currentNamespace: string\n): { name: string; content: string } {\n const relationship = field.relationship\n if (!relationship) {\n throw new Error(`Relationship field \"${field.name}\" is missing \"relationship\".`)\n }\n\n const singularSchema = singularize(schemaName)\n const singularRelation = singularize(relationship)\n const junctionName = `${singularSchema}${toPascalCase(relationship)}`\n const junctionPascal = toPascalCase(junctionName)\n const schemaIdCol = `${singularSchema}Id`\n const relationIdCol = `${singularRelation}Id`\n const schemaTableRef = toCamelCase(schemaName)\n const relationTableRef = toCamelCase(relationship)\n\n requiredImports.add('pgTable')\n requiredImports.add('uuid')\n requiredImports.add('primaryKey')\n const relationshipNamespace =\n currentNamespace === schemaName ? resolveExtensionNamespace(relationship) : currentNamespace\n const relationshipImport =\n relationshipNamespace === currentNamespace\n ? `./${relationship}`\n : `../${relationshipNamespace}/${relationship}`\n siblingImports.add(`import { ${relationTableRef} } from '${relationshipImport}'`)\n\n return {\n name: toCamelCase(junctionName),\n content: `export const ${toCamelCase(junctionName)} = pgTable(\n '${junctionPascal}',\n {\n ${schemaIdCol}: uuid().notNull().references(() => ${schemaTableRef}.id, { onDelete: 'cascade' }),\n ${relationIdCol}: uuid().notNull().references(() => ${relationTableRef}.id, { onDelete: 'cascade' })\n },\n (table) => [primaryKey({ columns: [table.${schemaIdCol}, table.${relationIdCol}] })]\n)\n`\n }\n}\n\nexport interface DatabaseGeneratorResult {\n files: GeneratedFile[]\n tableName: string\n junctionTables: string[]\n}\n\nexport function generateDatabase(\n schema: Schema,\n dbDir: string,\n options: GeneratorOptions = {},\n relatedSchemas: Map<string, Schema> = new Map()\n): DatabaseGeneratorResult {\n const outputNamespace = resolveExtensionNamespace(schema.name, options.outputNamespace)\n const requiredImports = new Set<string>()\n const siblingImports = new Set<string>()\n const needsSql = { value: false }\n\n const tableDef = generateTableDefinition(schema, requiredImports, needsSql)\n const selectOptionsTableDef = generateSelectOptionsTable(schema, requiredImports, needsSql)\n\n const emittedJunctions = getManyToManyFields(schema.fields)\n .filter((field) => shouldEmitJunction(schema.name, field, relatedSchemas))\n .map((field) =>\n generateJunctionTable(schema.name, field, requiredImports, siblingImports, outputNamespace)\n )\n\n const importBlocks: string[] = []\n if (needsSql.value) {\n importBlocks.push(`import { sql } from 'drizzle-orm'`)\n }\n\n const pgCoreImports = Array.from(requiredImports).sort()\n if (pgCoreImports.length > 0) {\n importBlocks.push(`import {\n ${pgCoreImports.join(',\\n ')}\n} from 'drizzle-orm/pg-core'`)\n }\n\n if (siblingImports.size > 0) {\n importBlocks.push(...Array.from(siblingImports).sort())\n }\n\n importBlocks.push(\n outputNamespace === 'core'\n ? `import { user } from './schema'`\n : `import { user } from '../core/schema'`\n )\n\n const sections = [\n importBlocks.join('\\n'),\n tableDef.trim(),\n selectOptionsTableDef?.trim(),\n ...emittedJunctions.map((junction) => junction.content.trim())\n ].filter(Boolean)\n\n const content = `${sections.join('\\n\\n')}\\n`\n const tableName = toCamelCase(schema.name)\n\n return {\n files: [createGeneratedFile(`${dbDir}/${outputNamespace}/${schema.name}.ts`, content)],\n tableName,\n junctionTables: emittedJunctions.map((junction) => junction.name)\n }\n}\n","/**\n * Generator 10: Edit page — (authenticated)/<n>/[id]/edit/page.tsx\n * Generates server page component for editing an existing entity\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { singularize, toCamelCase, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface EditPageGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate edit page component for updating an existing entity\n */\nexport function generateEditPage(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): EditPageGeneratorResult {\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n const camelSingular = toCamelCase(singular)\n const kebabName = toKebabCase(schema.name)\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n\n const content = `import { notFound } from 'next/navigation'\nimport { get${Singular}ById } from '@admin/actions/${actionImportPath}'\nimport { ${Singular}Form } from '../../${kebabName}-form'\n\ninterface PageProps {\n params: Promise<{\n id: string\n }>\n}\n\nexport default async function Edit${Singular}Page({ params }: PageProps) {\n const { id } = await params\n const ${camelSingular} = await get${Singular}ById(id)\n\n if (!${camelSingular}) {\n notFound()\n }\n\n return <${Singular}Form key={\\`\\${${camelSingular}.id}-\\${${camelSingular}.updatedAt}\\`} initialData={${camelSingular}} pageTitle=\"Edit ${Singular}\" />\n}\n`\n\n return {\n files: [createGeneratedFile(`${pagesDir}/${schema.name}/[id]/edit/page.tsx`, content)]\n }\n}\n","/**\n * Zod schema generation helpers for entity/single forms\n */\n\nimport type { SchemaField } from '@core-engine/schema/types.js'\nimport { quotePropertyName } from '@core-engine/utils/string.js'\n\nexport function getFormFieldType(field: SchemaField): string {\n switch (field.type) {\n case 'boolean':\n return 'checkbox'\n case 'text':\n return 'textarea'\n case 'markdown':\n return 'markdown'\n case 'richtext':\n return 'richtext'\n case 'number':\n case 'decimal':\n return 'number'\n case 'date':\n return 'date'\n case 'time':\n return 'time'\n case 'timestamp':\n return 'datetime-local'\n default:\n return 'text'\n }\n}\n\nexport function getZodType(field: SchemaField): string {\n const label = field.label || field.name\n\n switch (field.type) {\n case 'uuid':\n case 'serial':\n return field.required\n ? `z.string().uuid('${label} must be a valid UUID')`\n : `z.string().uuid('${label} must be a valid UUID').optional()`\n case 'number':\n case 'decimal':\n return field.required\n ? `z.number({ message: '${label} is required' })`\n : 'z.number().optional()'\n case 'boolean':\n return 'z.boolean()'\n case 'string':\n case 'varchar':\n case 'text':\n case 'markdown':\n case 'richtext': {\n if (field.name.toLowerCase().includes('email')) {\n const base = field.required\n ? `z.string().min(1, '${label} is required').email('Please enter a valid email address')`\n : `z.string().email('Please enter a valid email address').optional()`\n return field.length ? `${base}.max(${field.length})` : base\n }\n const base = field.required ? `z.string().min(1, '${label} is required')` : 'z.string()'\n return field.length ? `${base}.max(${field.length})` : base\n }\n case 'date':\n if (!field.required) {\n return 'z.string().transform(val => val === \"\" ? undefined : val).optional()'\n }\n return `z.string().min(1, '${label} is required')`\n case 'timestamp':\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'image':\n case 'video':\n case 'media': {\n if (!field.required) {\n return 'z.string().transform(val => val === \"\" ? undefined : val).optional()'\n }\n return `z.string().min(1, 'Please select ${label.toLowerCase()} from the media gallery')`\n }\n case 'gallery':\n return field.required\n ? `z.array(z.string()).min(1, '${label} must have at least one item')`\n : 'z.array(z.string()).optional()'\n case 'list':\n if (field.fields && field.fields.length > 0) {\n const nested = field.fields\n .flatMap((nf) => {\n const defs: string[] = []\n const zodType = getZodType(nf)\n const alreadyOptional = zodType.includes('.optional()')\n let def = ` ${quotePropertyName(nf.name)}: ${zodType}`\n if (!nf.required && !alreadyOptional) def += '.optional()'\n defs.push(def)\n if (nf.hasIcon)\n defs.push(` ${quotePropertyName(`${nf.name}Icon`)}: z.string().optional()`)\n return defs\n })\n .join(',\\n')\n const obj = `z.object({\\n${nested}\\n })`\n const arr = field.maxItems ? `z.array(${obj}).max(${field.maxItems})` : `z.array(${obj})`\n return field.required\n ? `${arr}.min(1, '${label} must have at least one item')`\n : `${arr}.optional()`\n }\n return field.required\n ? `z.array(z.string()).min(1, '${label} must have at least one item')`\n : 'z.array(z.string()).optional()'\n case 'select': {\n if (field.multiple) {\n if (field.creatable) {\n return field.required\n ? `z.array(z.string()).min(1, '${label} is required')`\n : 'z.array(z.string()).optional()'\n }\n if (field.options && field.options.length > 0) {\n const values = field.options.map((o) => `'${o.value}'`).join(', ')\n const arr = `[${values}] as const`\n const arraySchema = `z.array(z.string()).refine((values) => values.every((value) => (${arr} as readonly string[]).includes(value)), { message: 'Invalid ${label}' })`\n return field.required\n ? `${arraySchema}.min(1, '${label} is required')`\n : `${arraySchema}.optional()`\n }\n return field.required\n ? `z.array(z.string()).min(1, '${label} is required')`\n : 'z.array(z.string()).optional()'\n }\n if (field.creatable) {\n return field.required\n ? `z.string().min(1, '${label} is required')`\n : 'z.string().optional()'\n }\n if (field.options && field.options.length > 0) {\n const values = field.options.map((o) => `'${o.value}'`).join(', ')\n const arr = `[${values}] as const`\n return field.required\n ? `z.string().min(1, '${label} is required').refine((val) => (${arr} as readonly string[]).includes(val), { message: 'Invalid ${label}' })`\n : `z.string().refine((val) => !val || (${arr} as readonly string[]).includes(val), { message: 'Invalid ${label}' }).optional()`\n }\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n }\n case 'icon':\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'relationship':\n if (field.multiple) {\n return field.required\n ? `z.array(z.string().uuid()).min(1, '${label} is required')`\n : 'z.array(z.string().uuid()).optional()'\n }\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n case 'group':\n if (field.fields && field.fields.length > 0) {\n const nested = field.fields\n .map((nf) => {\n const zodType = getZodType(nf)\n const alreadyOptional = zodType.includes('.optional()')\n let def = ` ${quotePropertyName(nf.name)}: ${zodType}`\n if (!nf.required && !alreadyOptional) def += '.optional()'\n return def\n })\n .join(',\\n')\n return field.required\n ? `z.object({\\n${nested}\\n })`\n : `z.object({\\n${nested}\\n }).optional()`\n }\n return 'z.record(z.unknown()).optional()'\n default:\n return field.required ? `z.string().min(1, '${label} is required')` : 'z.string().optional()'\n }\n}\n","/**\n * Shared logic for entity and single form generators\n */\n\nimport { isLayoutField } from '@core-engine/schema/constants.js'\nimport type { GeneratedFile, SchemaField } from '@core-engine/schema/types.js'\nimport { quotePropertyName, toPascalCase } from '@core-engine/utils/string.js'\nimport { getZodType } from '@next-adapter/generators/form/zod-schema.js'\n\nexport interface FormGeneratorResult {\n files: GeneratedFile[]\n}\n\nfunction hasVisibleLabel(field: SchemaField): boolean {\n return typeof field.label === 'string' ? field.label.trim().length > 0 : Boolean(field.label)\n}\n\nexport function formLabel(field: SchemaField, text: string): string {\n const className = hasVisibleLabel(field) ? '' : ' className=\"sr-only\"'\n return `<FormLabel${className}>${text}</FormLabel>`\n}\n\nexport function formItemProps(field: SchemaField, className?: string): string {\n const classes = [field.height === 'fill' ? 'flex-1 min-h-0' : '', className ?? ''].filter(Boolean)\n return classes.length > 0 ? ` className=\"${classes.join(' ')}\"` : ''\n}\n\nexport function fillControlClass(field: SchemaField, className: string): string {\n return [className, field.height === 'fill' ? 'flex-1' : ''].filter(Boolean).join(' ')\n}\n\nexport function collectRelationshipFields(\n fields: SchemaField[],\n _tabFieldNames: Set<string>\n): SchemaField[] {\n const result: SchemaField[] = []\n const seen = new Set<string>()\n function collect(fieldsToCheck: SchemaField[]): void {\n for (const f of fieldsToCheck) {\n if (f.type === 'relationship' && f.relationship && !seen.has(f.name)) {\n seen.add(f.name)\n result.push(f)\n }\n if (f.type === 'group' && f.fields) collect(f.fields)\n if (f.type === 'tabs' && f.tabs) {\n for (const tab of f.tabs) {\n if (tab.fields) collect(tab.fields)\n }\n }\n }\n }\n collect(fields)\n return result\n}\n\nfunction selectDefaultValues(f: SchemaField): string[] {\n if (f.default === undefined || f.default === null || f.default === '') return []\n const values = Array.isArray(f.default) ? f.default : [f.default]\n return values.map((value) => String(value))\n}\n\ninterface DefaultValueFromTarget {\n name: string\n sourceName: string\n}\n\nfunction buildFieldMap(fields: SchemaField[]): Map<string, SchemaField> {\n const fieldMap = new Map<string, SchemaField>()\n for (const field of fields) {\n if (!field.primaryKey && field.type !== 'tabs' && !isLayoutField(field.type)) {\n fieldMap.set(field.name, field)\n }\n }\n return fieldMap\n}\n\nfunction collectDefaultValueFromTargets(fields: SchemaField[]): DefaultValueFromTarget[] {\n const fieldMap = buildFieldMap(fields)\n return fields.flatMap((field) => {\n const sourceName = field.defaultValueFrom?.trim()\n if (\n !sourceName ||\n field.primaryKey ||\n field.type === 'tabs' ||\n isLayoutField(field.type) ||\n sourceName === field.name ||\n !fieldMap.has(sourceName)\n ) {\n return []\n }\n\n return [{ name: field.name, sourceName }]\n })\n}\n\nexport function defaultValueFromHandlerName(sourceName: string): string {\n return `applyDefaultValueFrom${toPascalCase(sourceName)}`\n}\n\nexport function collectDefaultValueFromSourceNames(fields: SchemaField[]): Set<string> {\n return new Set(collectDefaultValueFromTargets(fields).map((target) => target.sourceName))\n}\n\nfunction defaultFallbackValue(f: SchemaField): string {\n if (f.type === 'list' || f.type === 'gallery') return '[]'\n if (f.type === 'boolean') return f.default === true ? 'true' : 'false'\n if (f.type === 'number' || f.type === 'decimal') return f.required ? '0' : 'undefined'\n if (f.type === 'uuid' || f.type === 'serial' || f.type === 'relationship') {\n return f.multiple ? '[]' : \"''\"\n }\n if (f.type === 'date' || f.type === 'timestamp') return 'undefined'\n if (f.type === 'select') {\n if (f.multiple) return JSON.stringify(selectDefaultValues(f))\n return f.default !== undefined && f.default !== null ? JSON.stringify(f.default) : \"''\"\n }\n if (f.default !== undefined && f.default !== null) {\n return typeof f.default === 'string' ? JSON.stringify(f.default) : String(f.default)\n }\n return \"''\"\n}\n\nfunction hasInitialValueExpression(fieldName: string, dataSource = 'initialData'): string {\n return `${dataSource}?.${fieldName} !== undefined && ${dataSource}?.${fieldName} !== null && ${dataSource}?.${fieldName} !== ''`\n}\n\nexport function generateDefaultValue(\n f: SchemaField,\n fieldMap?: Map<string, SchemaField>,\n dataSource = 'initialData'\n): string {\n if (\n f.defaultValueFrom &&\n f.defaultValueFrom.trim() !== f.name &&\n fieldMap?.has(f.defaultValueFrom.trim())\n ) {\n const sourceName = f.defaultValueFrom.trim()\n return ` ${f.name}: ${hasInitialValueExpression(f.name, dataSource)}\n ? ${dataSource}.${f.name}\n : ${hasInitialValueExpression(sourceName, dataSource)}\n ? (${dataSource}.${sourceName} as never)\n : ${defaultFallbackValue(f)}`\n }\n if (f.type === 'list' || f.type === 'gallery')\n return ` ${f.name}: ${dataSource}?.${f.name} ?? []`\n if (f.type === 'boolean') {\n const def = f.default === true ? 'true' : 'false'\n return ` ${f.name}: ${dataSource}?.${f.name} ?? ${def}`\n }\n if (f.type === 'number' || f.type === 'decimal') {\n const def = f.required ? '0' : 'undefined'\n return ` ${f.name}: ${dataSource}?.${f.name} ?? ${def}`\n }\n if (f.type === 'uuid' || f.type === 'serial') {\n return ` ${f.name}: ${dataSource}?.${f.name} ?? ''`\n }\n if (f.type === 'relationship') {\n if (f.multiple) return ` ${f.name}: ${dataSource}?.${f.name} ?? []`\n return ` ${f.name}: ${dataSource}?.${f.name}\n ? (typeof ${dataSource}?.${f.name} === 'object' ? String(${dataSource}?.${f.name}.id) : String(${dataSource}?.${f.name}))\n : ''`\n }\n if (f.type === 'date' || f.type === 'timestamp') {\n return ` ${f.name}: ${dataSource}?.${f.name} ?? undefined`\n }\n if (f.type === 'select') {\n if (f.multiple) {\n const fallback = JSON.stringify(selectDefaultValues(f))\n if (f.creatable) {\n return ` ${f.name}: Array.isArray(${dataSource}?.${f.name}) ? ${dataSource}?.${f.name} : ${fallback}`\n }\n const validValuesExpression = `([${(f.options || []).map((option) => JSON.stringify(option.value)).join(', ')}] as const as readonly string[])`\n return ` ${f.name}: Array.isArray(${dataSource}?.${f.name})\n ? ${dataSource}?.${f.name}.filter((value) => ${validValuesExpression}.includes(value))\n : ${fallback}`\n }\n const fallback =\n f.default !== undefined && f.default !== null ? JSON.stringify(f.default) : \"''\"\n if (f.creatable) {\n return ` ${f.name}: typeof ${dataSource}?.${f.name} === 'string' ? ${dataSource}?.${f.name} : ${fallback}`\n }\n const validValuesExpression = `([${(f.options || []).map((option) => JSON.stringify(option.value)).join(', ')}] as const as readonly string[])`\n return ` ${f.name}: typeof ${dataSource}?.${f.name} === 'string' && ${validValuesExpression}.includes(${dataSource}?.${f.name}) ? ${dataSource}?.${f.name} : ${fallback}`\n }\n if (f.default !== undefined && f.default !== null) {\n const def = typeof f.default === 'string' ? `'${f.default}'` : f.default\n return ` ${f.name}: ${dataSource}?.${f.name} ?? ${def}`\n }\n return ` ${f.name}: ${dataSource}?.${f.name} ?? ''`\n}\n\nexport function buildDefaultValueFromSyncFunctions(fields: SchemaField[]): string {\n const mappings = new Map<string, string[]>()\n for (const target of collectDefaultValueFromTargets(fields)) {\n const targets = mappings.get(target.sourceName) ?? []\n targets.push(target.name)\n mappings.set(target.sourceName, targets)\n }\n\n return Array.from(mappings.entries())\n .map(([sourceName, targetNames]) => {\n const targetSync = targetNames\n .map((targetName) => {\n const currentValueName = `current${toPascalCase(targetName)}`\n return ` const ${currentValueName} = form.getValues('${targetName}') as unknown\n if (\n ${currentValueName} === '' ||\n ${currentValueName} === undefined ||\n ${currentValueName} === null ||\n ${currentValueName} === previousValue\n ) {\n form.setValue('${targetName}', nextValue as never, {\n shouldDirty: false,\n shouldValidate: true\n })\n }`\n })\n .join('\\n')\n\n return ` function ${defaultValueFromHandlerName(sourceName)}(nextValue: unknown) {\n const previousValue = form.getValues('${sourceName}') as unknown\n${targetSync}\n }`\n })\n .join('\\n\\n')\n}\n\nexport function buildZodFields(flatFields: SchemaField[]): string {\n return flatFields\n .filter((f) => !f.primaryKey && f.type !== 'tabs' && !isLayoutField(f.type))\n .flatMap((f) => {\n const defs: string[] = []\n const zodType = getZodType(f)\n const alreadyOptional = zodType.includes('.optional()')\n let def = ` ${quotePropertyName(f.name)}: ${zodType}`\n if (!f.required && !alreadyOptional) def += '.optional()'\n defs.push(def)\n if (f.hasIcon) defs.push(` ${quotePropertyName(`${f.name}Icon`)}: z.string().optional()`)\n return defs\n })\n .join(',\\n')\n}\n\nexport function buildDefaultValues(\n flatFields: SchemaField[],\n dataSource = 'initialData',\n sourceFields = flatFields\n): string {\n const fieldMap = buildFieldMap(sourceFields)\n return flatFields\n .filter((f) => !f.primaryKey && f.type !== 'tabs' && !isLayoutField(f.type))\n .flatMap((f) => {\n const defs = [generateDefaultValue(f, fieldMap, dataSource)]\n if (f.hasIcon) defs.push(` ${f.name}Icon: ${dataSource}?.${f.name}Icon ?? ''`)\n return defs\n })\n .join(',\\n')\n}\n\nexport function buildUiImports(ctx: {\n hasBoolean: boolean\n hasTextarea: boolean\n hasImage: boolean\n hasVideo: boolean\n hasMedia: boolean\n hasGallery: boolean\n hasIcon: boolean\n hasIconPostfix: boolean\n hasDate: boolean\n hasMarkdown: boolean\n hasRichtext: boolean\n hasSeparator: boolean\n hasSelect: boolean\n hasSelectCombobox: boolean\n hasCreatableSelect: boolean\n hasMultiSelect: boolean\n hasTabsField: boolean\n hasRelationship: boolean\n hasSimpleList: boolean\n hasNestedList: boolean\n hasCardContent?: boolean\n hasSectionCardHeading?: boolean\n hasFormRoot?: boolean\n hasButton?: boolean\n hasFormControls?: boolean\n hasInput?: boolean\n}): string[] {\n const cardImports = ['Card']\n if (ctx.hasCardContent || ctx.hasSectionCardHeading) cardImports.push('CardContent')\n if (ctx.hasSectionCardHeading) cardImports.push('CardHeader', 'CardTitle')\n const formImports = [\n ctx.hasFormRoot === false ? '' : 'Form',\n ...(ctx.hasFormControls === false\n ? []\n : ['FormControl', 'FormDescription', 'FormField', 'FormItem', 'FormLabel', 'FormMessage'])\n ].filter(Boolean)\n\n const uiImports: string[] = [\n `import { ${cardImports.join(', ')} } from '@admin/components/ui/card'`,\n ctx.hasInput === false ? '' : \"import { Input } from '@admin/components/ui/input'\",\n formImports.length > 0\n ? `import {\n ${formImports.join(',\\n ')}\n} from '@admin/components/ui/form'`\n : ''\n ].filter(Boolean)\n\n if (ctx.hasButton !== false) {\n uiImports.unshift(\"import { Button } from '@admin/components/ui/button'\")\n }\n\n if (ctx.hasBoolean) uiImports.push(\"import { Checkbox } from '@admin/components/ui/checkbox'\")\n if (ctx.hasTextarea) uiImports.push(\"import { Textarea } from '@admin/components/ui/textarea'\")\n if (ctx.hasImage || ctx.hasVideo || ctx.hasMedia)\n uiImports.push(\n \"import { MediaGalleryField } from '@admin/components/custom/media-gallery-field'\"\n )\n if (ctx.hasGallery)\n uiImports.push(\"import { GalleryField } from '@admin/components/custom/gallery-field'\")\n if (ctx.hasIcon || ctx.hasIconPostfix)\n uiImports.push(\"import { IconPicker } from '@admin/components/custom/icon-picker'\")\n if (ctx.hasDate)\n uiImports.push(\"import { DatePicker } from '@admin/components/custom/date-picker'\")\n if (ctx.hasMarkdown || ctx.hasRichtext)\n uiImports.push(\"import { ContentEditor } from '@admin/components/custom/content-editor'\")\n if (ctx.hasSeparator) uiImports.push(\"import { Separator } from '@admin/components/ui/separator'\")\n if (ctx.hasSelect) {\n uiImports.push(`import {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger\n} from '@admin/components/ui/select'`)\n }\n if (ctx.hasRelationship || ctx.hasSelectCombobox) {\n const commandImports = [\n 'Command',\n 'CommandEmpty',\n 'CommandGroup',\n 'CommandInput',\n 'CommandItem',\n 'CommandList',\n ctx.hasCreatableSelect ? 'CommandSeparator' : ''\n ].filter(Boolean)\n uiImports.push(`import {\n ${commandImports.join(',\\n ')}\n} from '@admin/components/ui/command'`)\n uiImports.push(`import {\n Popover,\n PopoverContent,\n PopoverTrigger\n} from '@admin/components/ui/popover'`)\n }\n if (ctx.hasMultiSelect) {\n uiImports.push(\"import { Badge } from '@admin/components/ui/badge'\")\n uiImports.push(`import {\n Tooltip,\n TooltipContent,\n TooltipTrigger\n} from '@admin/components/ui/tooltip'`)\n }\n if (ctx.hasTabsField) {\n uiImports.push(`import {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent\n} from '@admin/components/ui/tabs'`)\n }\n if (ctx.hasSimpleList)\n uiImports.push(\"import { DynamicListField } from '@admin/components/custom/dynamic-list-field'\")\n if (ctx.hasNestedList) {\n uiImports.push(`import {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger\n} from '@admin/components/ui/accordion'`)\n if (!ctx.hasSeparator)\n uiImports.push(\"import { Separator } from '@admin/components/ui/separator'\")\n uiImports.push(\"import { Label } from '@admin/components/ui/label'\")\n }\n\n return uiImports\n}\n","/**\n * List/nested-list JSX generation for form fields\n */\n\nimport type { SchemaField } from '@core-engine/schema/types.js'\nimport { singularize, toPascalCase } from '@core-engine/utils/string.js'\nimport { formItemProps, formLabel } from '@next-adapter/generators/form/form-shared.js'\n\nfunction labelWithDescription(labelJSX: string, descriptionJSX: string, indent: string): string {\n if (!descriptionJSX) return labelJSX\n return `<div className=\"flex flex-col gap-1\">\n${indent} ${labelJSX}\n${indent} ${descriptionJSX}\n${indent}</div>`\n}\n\nfunction emptyNestedFieldValue(field: SchemaField): string {\n if (field.type === 'boolean') return 'false'\n if (field.type === 'number' || field.type === 'decimal') return field.required ? '0' : 'undefined'\n return \"''\"\n}\n\nexport function renderListField(field: SchemaField, indent: string, label: string): string {\n const listHintJSX = field.hint\n ? `<p className=\"text-[0.8rem] text-muted-foreground\">${field.hint}</p>`\n : ''\n\n // Simple string list — use DynamicListField\n if (!field.fields || field.fields.length === 0) {\n const hideLabelProp = field.label ? '' : `\\n${indent} hideLabel`\n const descriptionProp = field.hint\n ? `\\n${indent} description={${JSON.stringify(field.hint)}}`\n : ''\n return `${indent}<DynamicListField\n${indent} name=\"${field.name}\"\n${indent} label=\"${label}\"${hideLabelProp}${descriptionProp}\n${indent} disabled={isPending}${field.maxItems ? `\\n${indent} maxItems={${field.maxItems}}` : ''}\n${indent} placeholder=\"Enter value\"\n${indent}/>`\n }\n\n // Nested fields list — useFieldArray + Accordion\n const singularLabel = singularize(label)\n const pascalFieldName = toPascalCase(field.name)\n\n // Find title field for accordion header\n const stringTypes = ['string', 'varchar', 'text']\n const titleField =\n field.fields.find((f) => f.name === 'title' && stringTypes.includes(f.type)) ||\n field.fields.find((f) => f.name === 'name' && stringTypes.includes(f.type)) ||\n field.fields.find((f) => stringTypes.includes(f.type))\n const accordionTitle = titleField\n ? `{form.watch(\\`${field.name}.\\${index}.${titleField.name}\\`) || '${singularLabel} ' + (index + 1)}`\n : `${singularLabel} {index + 1}`\n\n // Generate nested field JSX\n const nestedFieldsJSX = field.fields\n .map((nf) => {\n const nestedLabel = nf.label || nf.name\n const nestedHint = nf.hint ? `<FormDescription>${nf.hint}</FormDescription>` : ''\n if (nf.type === 'boolean') {\n return `${indent} <FormField\n${indent} control={form.control}\n${indent} name={\\`${field.name}.\\${index}.${nf.name}\\`}\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(nf, 'flex flex-row items-start space-x-3 space-y-0')}>\n${indent} <FormControl>\n${indent} <Checkbox checked={formField.value} onCheckedChange={formField.onChange} disabled={isPending} />\n${indent} </FormControl>\n${indent} ${labelWithDescription(`<FormLabel>${nestedLabel}</FormLabel>`, nestedHint, `${indent} `)}\n${indent} </FormItem>\n${indent} )}\n${indent} />`\n }\n if (nf.type === 'image' || nf.type === 'video' || nf.type === 'media') {\n const acceptProp =\n nf.type === 'image' ? ' accept=\"image/*\"' : nf.type === 'video' ? ' accept=\"video/*\"' : ''\n return `${indent} <FormField\n${indent} control={form.control}\n${indent} name={\\`${field.name}.\\${index}.${nf.name}\\`}\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(nf)}>\n${indent} ${labelWithDescription(formLabel(nf, nestedLabel), nestedHint, `${indent} `)}\n${indent} <FormControl>\n${indent} <MediaGalleryField value={formField.value} onChange={formField.onChange} onBlur={formField.onBlur} disabled={isPending}${acceptProp} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent} />`\n }\n if (nf.type === 'number' || nf.type === 'decimal') {\n const stepProp = nf.type === 'decimal' ? ' step=\"any\"' : ''\n return `${indent} <FormField\n${indent} control={form.control}\n${indent} name={\\`${field.name}.\\${index}.${nf.name}\\`}\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(nf)}>\n${indent} ${labelWithDescription(formLabel(nf, nestedLabel), nestedHint, `${indent} `)}\n${indent} <FormControl>\n${indent} <Input\n${indent} type=\"number\"${stepProp}\n${indent} placeholder=\"Enter ${nestedLabel.toLowerCase()}\"\n${indent} disabled={isPending}\n${indent} value={formField.value ?? ''}\n${indent} onChange={(event) => {\n${indent} const nextValue = event.target.value === '' ? undefined : event.target.valueAsNumber\n${indent} const normalizedValue = Number.isNaN(nextValue) ? undefined : nextValue\n${indent} formField.onChange(normalizedValue)\n${indent} }}\n${indent} onBlur={formField.onBlur}\n${indent} name={formField.name}\n${indent} ref={formField.ref}\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent} />`\n }\n // Default: text input for nested fields\n return `${indent} <FormField\n${indent} control={form.control}\n${indent} name={\\`${field.name}.\\${index}.${nf.name}\\`}\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(nf)}>\n${indent} ${labelWithDescription(formLabel(nf, nestedLabel), nestedHint, `${indent} `)}\n${indent} <FormControl>\n${indent} <Input placeholder=\"Enter ${nestedLabel.toLowerCase()}\" disabled={isPending} {...formField} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent} />`\n })\n .join('\\n')\n\n return `${indent}<FormItem${formItemProps(field)}>\n${indent} {${field.name}FieldArray.fields.length === 0 && (\n${indent} <div className=\"text-sm text-muted-foreground rounded-lg border border-dashed p-6 text-center\">\n${indent} <p>No ${label.toLowerCase()} added yet.</p>\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"outline\"\n${indent} className=\"mt-2\"\n${indent} onClick={() => {\n${indent} ${field.name}FieldArray.append({${field.fields.map((nf) => `${nf.name}: ${emptyNestedFieldValue(nf)}`).join(', ')}})\n${indent} set${pascalFieldName}Expanded(\\`item-\\${${field.name}FieldArray.fields.length + 1}\\`)\n${indent} }}\n${indent} disabled={isPending}\n${indent} >\n${indent} <Plus className=\"size-3\" />\n${indent} Add ${singularLabel}\n${indent} </Button>\n${indent} </div>\n${indent} )}\n${indent} {${field.name}FieldArray.fields.length > 0 && (\n${indent} <div className=\"space-y-5\">\n${indent} <div className=\"flex items-start justify-between gap-3\">\n${indent} <div className=\"flex flex-col gap-1\">\n${indent} <Label className=\"${field.label ? 'text-base' : 'sr-only'}\">${label}</Label>\n${listHintJSX ? `${indent} ${listHintJSX}\\n` : ''}${indent} </div>\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"outline\"\n${indent} onClick={() => {\n${indent} ${field.name}FieldArray.append({${field.fields.map((nf) => `${nf.name}: ${emptyNestedFieldValue(nf)}`).join(', ')}})\n${indent} set${pascalFieldName}Expanded(\\`item-\\${${field.name}FieldArray.fields.length + 1}\\`)\n${indent} }}\n${indent} disabled={isPending${field.maxItems ? ` || ${field.name}FieldArray.fields.length >= ${field.maxItems}` : ''}}\n${indent} >\n${indent} <Plus className=\"size-3\" />\n${indent} Add ${singularLabel}\n${indent} </Button>\n${indent} </div>\n${indent} <Accordion\n${indent} type=\"single\"\n${indent} collapsible\n${indent} className=\"w-full gap-1 flex flex-col\"\n${indent} value={${field.name}Expanded}\n${indent} onValueChange={set${pascalFieldName}Expanded}\n${indent} >\n${indent} {${field.name}FieldArray.fields.map((item, index) => (\n${indent} <AccordionItem\n${indent} key={item.id}\n${indent} value={\\`item-\\${index + 1}\\`}\n${indent} className=\"p-0 border-none\"\n${indent} >\n${indent} <div className=\"space-y-5 rounded-lg border p-4 bg-background [&_h3]:m-0 w-full\">\n${indent} <div className=\"flex items-center gap-2\">\n${indent} <div className=\"min-w-0 flex-1\">\n${indent} <AccordionTrigger className=\"flex items-center p-0 justify-between w-full\">\n${indent} <span className=\"text-sm font-medium w-full\">\n${indent} ${accordionTitle}\n${indent} </span>\n${indent} </AccordionTrigger>\n${indent} </div>\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"ghost\"\n${indent} size=\"icon-xs\"\n${indent} aria-label=\"Remove ${singularLabel}\"\n${indent} onClick={(e) => {\n${indent} e.stopPropagation()\n${indent} if (isPending) return\n${indent} ${field.name}FieldArray.remove(index)\n${indent} }}\n${indent} disabled={isPending}\n${indent} >\n${indent} <X className=\"size-3\" />\n${indent} </Button>\n${indent} </div>\n${indent} <AccordionContent className=\"flex flex-col gap-4 px-1\">\n${indent} <Separator className=\"mt-2\" />\n${indent} <div className=\"space-y-5\">\n${nestedFieldsJSX}\n${indent} </div>\n${indent} </AccordionContent>\n${indent} </div>\n${indent} </AccordionItem>\n${indent} ))}\n${indent} </Accordion>\n${indent} </div>\n${indent} )}\n${indent}</FormItem>`\n}\n","/**\n * Form field JSX generation — dispatcher + per-type renderers\n */\n\nimport type { SchemaField } from '@core-engine/schema/types.js'\nimport { singularize, toPascalCase } from '@core-engine/utils/string.js'\nimport { renderListField } from '@next-adapter/generators/form/field-jsx-nested.js'\nimport {\n defaultValueFromHandlerName,\n fillControlClass,\n formItemProps,\n formLabel\n} from '@next-adapter/generators/form/form-shared.js'\nimport { getFormFieldType } from '@next-adapter/generators/form/zod-schema.js'\n\nexport interface FieldRenderContext {\n creatableSelectFieldNames?: Set<string>\n defaultValueFromSourceNames?: Set<string>\n slotFilter?: 'main' | 'sidebar'\n}\n\nfunction defaultValueFromSourceHandler(\n field: SchemaField,\n context: FieldRenderContext\n): string | null {\n if (!context.defaultValueFromSourceNames?.has(field.name)) return null\n return defaultValueFromHandlerName(field.name)\n}\n\nfunction generateIconPostfix(field: SchemaField, indent: string): string {\n const label = field.label || field.name\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}Icon\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem>\n${indent} ${formLabel(field, `${label} Icon`)}\n${indent} <FormControl>\n${indent} <IconPicker\n${indent} value={formField.value}\n${indent} onValueChange={formField.onChange}\n${indent} triggerPlaceholder=\"Select icon\"\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction fillFormItemProps(field: SchemaField): string {\n return formItemProps(field, field.height === 'fill' ? 'flex flex-col' : undefined)\n}\n\nfunction formLabelWithDescription(\n field: SchemaField,\n label: string,\n hintJSX: string,\n indent: string\n): string {\n if (!hintJSX) return formLabel(field, label)\n return `<div className=\"flex flex-col gap-1\">\n${indent} ${formLabel(field, label)}\n${indent} ${hintJSX}\n${indent}</div>`\n}\n\nexport function generateFieldJSX(\n field: SchemaField,\n indent = ' ',\n context: FieldRenderContext = {}\n): string {\n if (field.hidden) return ''\n if (context.slotFilter && (field.slot ?? 'main') !== context.slotFilter) return ''\n\n const mainJSX = generateFieldJSXCore(field, indent, context)\n if (!mainJSX) return ''\n\n if (field.hasIcon && !['group', 'section', 'tabs', 'separator'].includes(field.type)) {\n return `${mainJSX}\\n${generateIconPostfix(field, indent)}`\n }\n\n return mainJSX\n}\n\nfunction generateFieldJSXCore(\n field: SchemaField,\n indent = ' ',\n context: FieldRenderContext = {}\n): string {\n const fieldType = getFormFieldType(field)\n const label = field.label || field.name\n const hintJSX = field.hint ? `<FormDescription>${field.hint}</FormDescription>` : ''\n\n if ((field.type === 'group' || field.type === 'section') && field.fields)\n return renderGroupField(field, indent, label, context)\n if (field.type === 'separator') return renderSeparatorField(field, indent)\n if (field.type === 'boolean') return renderBooleanField(field, indent, label, hintJSX, context)\n if (field.type === 'image')\n return renderMediaGalleryField(field, indent, label, hintJSX, context, 'image/*')\n if (field.type === 'video')\n return renderMediaGalleryField(field, indent, label, hintJSX, context, 'video/*')\n if (field.type === 'media') return renderMediaGalleryField(field, indent, label, hintJSX, context)\n if (field.type === 'gallery') return renderGalleryField(field, indent, label, hintJSX, context)\n if (field.type === 'icon') return renderIconField(field, indent, label, hintJSX)\n if (field.type === 'date') return renderDateField(field, indent, label, hintJSX, context)\n if (field.type === 'select') return renderSelectField(field, indent, label, hintJSX, context)\n if (field.type === 'richtext') return renderRichtextField(field, indent, label, hintJSX, context)\n if (field.type === 'markdown') return renderMarkdownField(field, indent, label, hintJSX, context)\n if (field.type === 'text') return renderTextareaField(field, indent, label, hintJSX, context)\n if (field.type === 'number' || field.type === 'decimal')\n return renderNumberField(field, indent, label, fieldType, hintJSX, context)\n if (field.type === 'relationship' && field.relationship)\n return renderRelationshipField(field, indent, label, hintJSX, context)\n if (field.type === 'list') return renderListField(field, indent, label)\n\n return renderDefaultField(field, indent, label, fieldType, hintJSX, context)\n}\n\nfunction renderGroupField(\n field: SchemaField,\n indent: string,\n label: string,\n context: FieldRenderContext\n): string {\n const columns = field.columns || 1\n const groupFields = field\n .fields!.map((nf) => generateFieldJSX(nf, `${indent} `, context))\n .filter(Boolean)\n .join('\\n')\n if (!groupFields) return ''\n const heading =\n label && label !== field.name\n ? `${indent}<h3 className=\"text-lg font-medium\">${label}</h3>\\n`\n : ''\n return `\n${heading}${indent} <div className=\"grid ${columns > 1 ? `grid-cols-${columns}` : 'grid-cols-1'} gap-5\">\n${groupFields}\n${indent}</div>`\n}\n\nfunction renderSeparatorField(field: SchemaField, indent: string): string {\n if (field.label) {\n return `${indent}<div className=\"relative my-4\">\n${indent} <div className=\"absolute inset-0 flex items-center\">\n${indent} <Separator className=\"w-full\" />\n${indent} </div>\n${indent} <div className=\"relative flex justify-center text-xs uppercase\">\n${indent} <span className=\"bg-background px-2 text-muted-foreground\">${field.label}</span>\n${indent} </div>\n${indent}</div>`\n }\n return `${indent}<Separator className=\"my-4\" />`\n}\n\nfunction renderBooleanField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onCheckedChange = defaultValueFromHandler\n ? `(checked) => {\n${indent} ${defaultValueFromHandler}(checked)\n${indent} formField.onChange(checked)\n${indent} }`\n : 'formField.onChange'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field, 'flex flex-row items-start space-x-3 space-y-0')}>\n${indent} <FormControl>\n${indent} <Checkbox\n${indent} checked={formField.value}\n${indent} onCheckedChange={${onCheckedChange}}\n${indent} disabled={isPending}\n${indent} />\n${indent} </FormControl>\n${indent} <div className=\"flex flex-col gap-1\">\n${indent} <FormLabel>${label}</FormLabel>${hintJSX ? `\\n${indent} ${hintJSX}` : ''}\n${indent} </div>\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderMediaGalleryField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext,\n accept?: string\n): string {\n const acceptProp = accept ? `\\n${indent} accept=\"${accept}\"` : ''\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onChange = defaultValueFromHandler\n ? `(value) => {\n${indent} ${defaultValueFromHandler}(value)\n${indent} formField.onChange(value)\n${indent} }`\n : 'formField.onChange'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <MediaGalleryField\n${indent} value={formField.value}\n${indent} onChange={${onChange}}\n${indent} onBlur={formField.onBlur}\n${indent} disabled={isPending}${acceptProp}\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderGalleryField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const maxItemsProp = field.maxItems ? `\\n${indent} maxItems={${field.maxItems}}` : ''\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onChange = defaultValueFromHandler\n ? `(value) => {\n${indent} ${defaultValueFromHandler}(value)\n${indent} formField.onChange(value)\n${indent} }`\n : 'formField.onChange'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <GalleryField\n${indent} value={formField.value}\n${indent} onChange={${onChange}}\n${indent} disabled={isPending}${maxItemsProp}\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderIconField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string\n): string {\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <IconPicker\n${indent} value={formField.value}\n${indent} onValueChange={formField.onChange}\n${indent} triggerPlaceholder=\"Select ${label.toLowerCase()}\"\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderDateField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onChange = defaultValueFromHandler\n ? `(value) => {\n${indent} ${defaultValueFromHandler}(value)\n${indent} formField.onChange(value)\n${indent} }`\n : 'formField.onChange'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <DatePicker\n${indent} value={formField.value}\n${indent} onChange={${onChange}}\n${indent} disabled={isPending}\n${indent} placeholder=\"Select ${label.toLowerCase()}\"\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderSelectField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n if (field.multiple) {\n return renderMultiSelectField(field, indent, label, hintJSX, context)\n }\n\n if (field.creatable && context.creatableSelectFieldNames?.has(field.name)) {\n return renderCreatableSelectField(field, indent, label, hintJSX, context)\n }\n\n const options = field.options || []\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onValueChange = defaultValueFromHandler\n ? `(value) => {\n${indent} ${defaultValueFromHandler}(value)\n${indent} formField.onChange(value)\n${indent} }`\n : 'formField.onChange'\n const placeholder = field.placeholder || `Select ${label.toLowerCase()}`\n const selectedLabelExpression = options.reduceRight(\n (fallback, option) =>\n `formField.value === ${JSON.stringify(option.value)} ? ${JSON.stringify(option.label)} : ${fallback}`,\n 'undefined'\n )\n const validValuesExpression = `([${options.map((option) => JSON.stringify(option.value)).join(', ')}] as const as readonly string[])`\n const optionsJSX = options\n .map(\n (o) =>\n `${indent} <SelectItem key=\"${o.value}\" value=\"${o.value}\">${o.label}</SelectItem>`\n )\n .join('\\n')\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <Select\n${indent} value={typeof formField.value === \"string\" && ${validValuesExpression}.includes(formField.value) ? formField.value : undefined}\n${indent} onValueChange={${onValueChange}}\n${indent} disabled={isPending}\n${indent} >\n${indent} <SelectTrigger className=\"w-full\">\n${indent} <span data-slot=\"select-value\" className=\"pointer-events-none\">\n${indent} {(${selectedLabelExpression}) ?? ${JSON.stringify(placeholder)}}\n${indent} </span>\n${indent} </SelectTrigger>\n${indent} <SelectContent position=\"popper\" align=\"start\">\n${optionsJSX}\n${indent} </SelectContent>\n${indent} </Select>\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderMultiSelectField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const fieldPascal = toPascalCase(field.name)\n const isCreatable = field.creatable && context.creatableSelectFieldNames?.has(field.name)\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const optionsVar = isCreatable ? `${field.name}Options` : 'staticOptions'\n const staticOptions = `[${(field.options ?? [])\n .map(\n (option) =>\n `{ label: ${JSON.stringify(option.label)}, value: ${JSON.stringify(option.value)} }`\n )\n .join(', ')}]`\n const openVar = `${field.name}Open`\n const setOpenVar = `set${fieldPascal}Open`\n const searchVar = `${field.name}Search`\n const setSearchVar = `set${fieldPascal}Search`\n const pendingVar = `create${fieldPascal}OptionPending`\n const createHandler = `handleCreate${fieldPascal}Option`\n const placeholder = field.placeholder || `Select ${label.toLowerCase()}`\n const previewLimit = Math.max(1, Math.floor(field.previewLimit ?? 1))\n const lowerLabel = label.toLowerCase()\n const optionsDeclaration = isCreatable\n ? `const options = ${optionsVar}`\n : `const staticOptions = ${staticOptions}\n${indent} const options = staticOptions`\n const searchInput = isCreatable\n ? `<CommandInput\n${indent} placeholder=\"Search ${lowerLabel}...\"\n${indent} value={${searchVar}}\n${indent} onValueChange={${setSearchVar}}\n${indent} />`\n : `<CommandInput placeholder=\"Search ${lowerLabel}...\" />`\n const createState = isCreatable\n ? `\n${indent} const createLabel = ${searchVar}.trim()\n${indent} const canCreateOption =\n${indent} createLabel.length > 0 &&\n${indent} !options.some(\n${indent} (option) =>\n${indent} option.label.toLowerCase() === createLabel.toLowerCase() ||\n${indent} option.value.toLowerCase() === createLabel.toLowerCase()\n${indent} )\n`\n : ''\n const createAction = isCreatable\n ? `\n${indent} {canCreateOption ? (\n${indent} <>\n${indent} <CommandSeparator />\n${indent} <div className=\"p-1\">\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"ghost\"\n${indent} className=\"w-full justify-start\"\n${indent} disabled={${pendingVar}}\n${indent} onClick={() => ${createHandler}(createLabel)}\n${indent} >\n${indent} <Plus className=\"size-4\" />\n${indent} {${pendingVar} ? 'Creating...' : \\`Create \"\\${createLabel}\"\\`}\n${indent} </Button>\n${indent} </div>\n${indent} </>\n${indent} ) : null}`\n : ''\n const clearSearch = isCreatable ? `\\n${indent} ${setSearchVar}('')` : ''\n\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => {\n${indent} ${optionsDeclaration}\n${indent} const selectedValues = Array.isArray(formField.value) ? formField.value : []\n${indent} const selectedOptions = options.filter((option) => selectedValues.includes(option.value))${createState}\n${indent} const previewLimit = ${previewLimit}\n${indent} const shouldCollapseSelectedOptions =\n${indent} selectedOptions.length > Math.max(previewLimit, 2)\n${indent} const visibleSelectedOptions = shouldCollapseSelectedOptions\n${indent} ? selectedOptions.slice(0, previewLimit)\n${indent} : selectedOptions\n${indent} const hiddenSelectedOptions = shouldCollapseSelectedOptions\n${indent} ? selectedOptions.slice(previewLimit)\n${indent} : []\n${indent} return (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <Popover open={${openVar}} onOpenChange={${setOpenVar}}>\n${indent} <PopoverTrigger asChild>\n${indent} <FormControl>\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"outline\"\n${indent} role=\"combobox\"\n${indent} aria-expanded={${openVar}}\n${indent} className={cn(\"w-full justify-between gap-2\", {\n${indent} \"text-muted-foreground\": selectedOptions.length === 0\n${indent} })}\n${indent} disabled={isPending}\n${indent} >\n${indent} <span className=\"flex min-w-0 flex-1 items-center gap-2 text-left\">\n${indent} {selectedOptions.length > 0 ? (\n${indent} <>\n${indent} <span className=\"truncate\">\n${indent} {visibleSelectedOptions.map((option) => option.label).join(', ')}\n${indent} </span>\n${indent} {hiddenSelectedOptions.length > 0 ? (\n${indent} <Tooltip>\n${indent} <TooltipTrigger asChild>\n${indent} <Badge\n${indent} variant=\"outline\"\n${indent} className=\"h-5 shrink-0 tabular-nums\"\n${indent} >\n${indent} {'+'}\n${indent} {hiddenSelectedOptions.length}{' '}\n${indent} {hiddenSelectedOptions.length === 1 ? 'other' : 'others'}\n${indent} </Badge>\n${indent} </TooltipTrigger>\n${indent} <TooltipContent align=\"center\" side=\"bottom\" className=\"max-w-60 w-full\">\n${indent} <div className=\"space-y-1\">\n${indent} {hiddenSelectedOptions.map((option) => (\n${indent} <div key={option.value} className=\"truncate\">\n${indent} {option.label}\n${indent} </div>\n${indent} ))}\n${indent} </div>\n${indent} </TooltipContent>\n${indent} </Tooltip>\n${indent} ) : null}\n${indent} </>\n${indent} ) : (\n${indent} <span className=\"truncate\">{${JSON.stringify(placeholder)}}</span>\n${indent} )}\n${indent} </span>\n${indent} <ChevronsUpDown className=\"size-4 shrink-0 opacity-50\" />\n${indent} </Button>\n${indent} </FormControl>\n${indent} </PopoverTrigger>\n${indent} <PopoverContent className=\"w-(--radix-popover-trigger-width) p-0\" align=\"start\">\n${indent} <Command>\n${indent} ${searchInput}\n${indent} <CommandList>\n${indent} <CommandEmpty>No ${lowerLabel} found.</CommandEmpty>\n${indent} <CommandGroup>\n${indent} {options.map((option) => {\n${indent} const isSelected = selectedValues.includes(option.value)\n${indent} return (\n${indent} <CommandItem\n${indent} key={option.value}\n${indent} value={\\`\\${option.label} \\${option.value}\\`}\n${indent} onSelect={() => {\n${indent} const nextValues = isSelected\n${indent} ? selectedValues.filter((value: string) => value !== option.value)\n${indent} : [...selectedValues, option.value]\n${defaultValueFromHandler ? `${indent} ${defaultValueFromHandler}(nextValues)\\n` : ''}${indent} formField.onChange(nextValues)${clearSearch}\n${indent} }}\n${indent} >\n${indent} <Check className={cn(\"size-4\", {\n${indent} \"opacity-100\": isSelected,\n${indent} \"opacity-0\": !isSelected\n${indent} })} />\n${indent} <span className=\"truncate\">{option.label}</span>\n${indent} </CommandItem>\n${indent} )\n${indent} })}\n${indent} </CommandGroup>\n${indent} </CommandList>${createAction}\n${indent} </Command>\n${indent} </PopoverContent>\n${indent} </Popover>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )\n${indent} }}\n${indent}/>`\n}\n\nfunction renderCreatableSelectField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const fieldPascal = toPascalCase(field.name)\n const optionsVar = `${field.name}Options`\n const openVar = `${field.name}Open`\n const setOpenVar = `set${fieldPascal}Open`\n const searchVar = `${field.name}Search`\n const setSearchVar = `set${fieldPascal}Search`\n const pendingVar = `create${fieldPascal}OptionPending`\n const createHandler = `handleCreate${fieldPascal}Option`\n const placeholder = field.placeholder || `Select ${label.toLowerCase()}`\n const lowerLabel = label.toLowerCase()\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => {\n${indent} const selectedOption = ${optionsVar}.find((option) => option.value === formField.value)\n${indent} const createLabel = ${searchVar}.trim()\n${indent} const canCreateOption =\n${indent} createLabel.length > 0 &&\n${indent} !${optionsVar}.some(\n${indent} (option) =>\n${indent} option.label.toLowerCase() === createLabel.toLowerCase() ||\n${indent} option.value.toLowerCase() === createLabel.toLowerCase()\n${indent} )\n\n${indent} return (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <Popover open={${openVar}} onOpenChange={${setOpenVar}}>\n${indent} <PopoverTrigger asChild>\n${indent} <FormControl>\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"outline\"\n${indent} role=\"combobox\"\n${indent} aria-expanded={${openVar}}\n${indent} className={cn(\"w-full justify-between\", {\n${indent} \"text-muted-foreground\": !selectedOption\n${indent} })}\n${indent} disabled={isPending}\n${indent} >\n${indent} <span className=\"truncate\">{selectedOption?.label ?? ${JSON.stringify(placeholder)}}</span>\n${indent} <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n${indent} </Button>\n${indent} </FormControl>\n${indent} </PopoverTrigger>\n${indent} <PopoverContent className=\"w-(--radix-popover-trigger-width) p-0\" align=\"start\">\n${indent} <Command>\n${indent} <CommandInput\n${indent} placeholder=\"Search ${lowerLabel}...\"\n${indent} value={${searchVar}}\n${indent} onValueChange={${setSearchVar}}\n${indent} />\n${indent} <CommandList>\n${indent} <CommandEmpty>No ${lowerLabel} found.</CommandEmpty>\n${indent} <CommandGroup>\n${indent} {${optionsVar}.map((option) => (\n${indent} <CommandItem\n${indent} key={option.value}\n${indent} value={\\`\\${option.label} \\${option.value}\\`}\n${indent} onSelect={() => {\n${defaultValueFromHandler ? `${indent} ${defaultValueFromHandler}(option.value)\\n` : ''}${indent} formField.onChange(option.value)\n${indent} ${setSearchVar}('')\n${indent} ${setOpenVar}(false)\n${indent} }}\n${indent} >\n${indent} <Check className={cn(\"size-4\", {\n${indent} \"opacity-100\": formField.value === option.value,\n${indent} \"opacity-0\": formField.value !== option.value\n${indent} })} />\n${indent} <span className=\"truncate\">{option.label}</span>\n${indent} </CommandItem>\n${indent} ))}\n${indent} </CommandGroup>\n${indent} </CommandList>\n${indent} {canCreateOption ? (\n${indent} <>\n${indent} <CommandSeparator />\n${indent} <div className=\"p-1\">\n${indent} <Button\n${indent} type=\"button\"\n${indent} variant=\"ghost\"\n${indent} className=\"w-full justify-start\"\n${indent} disabled={${pendingVar}}\n${indent} onClick={() => ${createHandler}(createLabel)}\n${indent} >\n${indent} <Plus className=\"size-4\" />\n${indent} {${pendingVar} ? 'Creating...' : \\`Create \"\\${createLabel}\"\\`}\n${indent} </Button>\n${indent} </div>\n${indent} </>\n${indent} ) : null}\n${indent} </Command>\n${indent} </PopoverContent>\n${indent} </Popover>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )\n${indent} }}\n${indent}/>`\n}\n\nfunction renderRichtextField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onChange = defaultValueFromHandler\n ? `(value) => {\n${indent} ${defaultValueFromHandler}(value)\n${indent} formField.onChange(value)\n${indent} }`\n : 'formField.onChange'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${fillFormItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <ContentEditor\n${indent} value={formField.value}\n${indent} onChange={${onChange}}\n${indent} defaultMode=\"rich\"\n${indent} className=\"${fillControlClass(field, 'min-h-[300px]')}\"\n${indent} placeholder=\"Enter ${label.toLowerCase()}\"\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderMarkdownField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const onChange = defaultValueFromHandler\n ? `(value) => {\n${indent} ${defaultValueFromHandler}(value)\n${indent} formField.onChange(value)\n${indent} }`\n : 'formField.onChange'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${fillFormItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <ContentEditor\n${indent} value={formField.value}\n${indent} onChange={${onChange}}\n${indent} defaultMode=\"source\"\n${indent} className=\"${fillControlClass(field, 'min-h-[300px]')}\"\n${indent} placeholder=\"Enter ${label.toLowerCase()}\"\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderTextareaField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const fieldProps = defaultValueFromHandler\n ? `value={formField.value ?? ''}\n${indent} onChange={(event) => {\n${indent} ${defaultValueFromHandler}(event.target.value)\n${indent} formField.onChange(event)\n${indent} }}\n${indent} onBlur={formField.onBlur}\n${indent} name={formField.name}\n${indent} ref={formField.ref}`\n : '{...formField}'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${fillFormItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <Textarea\n${indent} placeholder=\"Enter ${label.toLowerCase()}\"\n${indent} className=\"${fillControlClass(field, 'min-h-[80px]')}\"\n${indent} disabled={isPending}\n${indent} ${fieldProps}\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderRelationshipField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const relName = field.relationship!\n const relSingular = singularize(relName)\n const relPascal = toPascalCase(relSingular)\n const displayField = `(('name' in item && item.name) || ('title' in item && item.title) || ('label' in item && item.label) || \\`${relPascal} \\${item.id ?? 'Unknown'}\\`) as string`\n const dataArray = `${relName}Data?.${relName}`\n\n if (field.multiple) {\n return renderMultiRelationshipField(\n field,\n indent,\n label,\n hintJSX,\n displayField,\n dataArray,\n relSingular,\n context\n )\n }\n\n return renderSingleRelationshipField(\n field,\n indent,\n label,\n hintJSX,\n displayField,\n dataArray,\n relSingular,\n context\n )\n}\n\nfunction renderMultiRelationshipField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n displayField: string,\n dataArray: string,\n relSingular: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field, 'flex flex-col')}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <Popover open={${field.name}Open} onOpenChange={set${toPascalCase(field.name)}Open}>\n${indent} <PopoverTrigger asChild>\n${indent} <FormControl>\n${indent} <Button\n${indent} variant=\"outline\"\n${indent} role=\"combobox\"\n${indent} className={cn(\"w-full justify-between\", {\n${indent} \"text-muted-foreground\": !formField.value || formField.value.length === 0\n${indent} })}\n${indent} disabled={isPending}\n${indent} >\n${indent} {(formField.value?.length ?? 0) > 0\n${indent} ? \\`\\${formField.value?.length ?? 0} selected\\`\n${indent} : \"Select ${label.toLowerCase()}\"}\n${indent} <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n${indent} </Button>\n${indent} </FormControl>\n${indent} </PopoverTrigger>\n${indent} <PopoverContent className=\"w-full p-0\" align=\"start\">\n${indent} <Command>\n${indent} <CommandInput placeholder=\"Search ${label.toLowerCase()}...\" />\n${indent} <CommandList>\n${indent} <CommandEmpty>No ${relSingular} found.</CommandEmpty>\n${indent} <CommandGroup>\n${indent} {${dataArray}?.filter((item) => item.id !== null).map((item) => {\n${indent} const displayName = ${displayField}\n${indent} const isSelected = formField.value?.includes(item.id) || false\n${indent} return (\n${indent} <CommandItem\n${indent} key={item.id}\n${indent} value={displayName}\n${indent} onSelect={() => {\n${indent} const current = formField.value || []\n${defaultValueFromHandler ? `${indent} const nextValue = isSelected\\n${indent} ? current.filter((id: string) => id !== item.id)\\n${indent} : [...current, item.id]\\n${indent} ${defaultValueFromHandler}(nextValue)\\n${indent} formField.onChange(nextValue)` : `${indent} formField.onChange(isSelected\\n${indent} ? current.filter((id: string) => id !== item.id)\\n${indent} : [...current, item.id])`}\n${indent} }}\n${indent} >\n${indent} <Check className={cn(\"size-4\", {\n${indent} \"opacity-100\": isSelected,\n${indent} \"opacity-0\": !isSelected\n${indent} })} />\n${indent} {displayName}\n${indent} </CommandItem>\n${indent} )\n${indent} })}\n${indent} </CommandGroup>\n${indent} </CommandList>\n${indent} </Command>\n${indent} </PopoverContent>\n${indent} </Popover>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderSingleRelationshipField(\n field: SchemaField,\n indent: string,\n label: string,\n hintJSX: string,\n displayField: string,\n dataArray: string,\n relSingular: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field, 'flex flex-col')}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <Popover open={${field.name}Open} onOpenChange={set${toPascalCase(field.name)}Open}>\n${indent} <PopoverTrigger asChild>\n${indent} <FormControl>\n${indent} <Button\n${indent} variant=\"outline\"\n${indent} role=\"combobox\"\n${indent} className={cn(\"w-full justify-between\", {\n${indent} \"text-muted-foreground\": !formField.value\n${indent} })}\n${indent} disabled={isPending}\n${indent} >\n${indent} {formField.value\n${indent} ? (() => {\n${indent} const item = ${dataArray}?.find((item) => item.id !== null && String(item.id) === formField.value)\n${indent} return item ? (${displayField}) : \"Select ${label.toLowerCase()}\"\n${indent} })()\n${indent} : \"Select ${label.toLowerCase()}\"}\n${indent} <ChevronsUpDown className=\"ml-2 size-4 shrink-0 opacity-50\" />\n${indent} </Button>\n${indent} </FormControl>\n${indent} </PopoverTrigger>\n${indent} <PopoverContent className=\"w-full p-0\" align=\"start\">\n${indent} <Command>\n${indent} <CommandInput placeholder=\"Search ${label.toLowerCase()}...\" />\n${indent} <CommandList>\n${indent} <CommandEmpty>No ${relSingular} found.</CommandEmpty>\n${indent} <CommandGroup>\n${indent} {${dataArray}?.filter((item) => item.id !== null).map((item) => {\n${indent} const displayName = ${displayField}\n${indent} return (\n${indent} <CommandItem\n${indent} key={item.id}\n${indent} value={displayName}\n${indent} onSelect={() => {\n${defaultValueFromHandler ? `${indent} ${defaultValueFromHandler}(String(item.id))\\n` : ''}${indent} formField.onChange(String(item.id))\n${indent} set${toPascalCase(field.name)}Open(false)\n${indent} }}\n${indent} >\n${indent} <Check className={cn(\"size-4\", {\n${indent} \"opacity-100\": formField.value === String(item.id),\n${indent} \"opacity-0\": formField.value !== String(item.id)\n${indent} })} />\n${indent} {displayName}\n${indent} </CommandItem>\n${indent} )\n${indent} })}\n${indent} </CommandGroup>\n${indent} </CommandList>\n${indent} </Command>\n${indent} </PopoverContent>\n${indent} </Popover>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderDefaultField(\n field: SchemaField,\n indent: string,\n label: string,\n fieldType: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const fieldProps = defaultValueFromHandler\n ? `value={formField.value ?? ''}\n${indent} onChange={(event) => {\n${indent} ${defaultValueFromHandler}(event.target.value)\n${indent} formField.onChange(event)\n${indent} }}\n${indent} onBlur={formField.onBlur}\n${indent} name={formField.name}\n${indent} ref={formField.ref}`\n : '{...formField}'\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <Input\n${indent} type=\"${fieldType}\"\n${indent} placeholder=\"Enter ${label.toLowerCase()}\"\n${indent} disabled={isPending}\n${indent} ${fieldProps}\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n\nfunction renderNumberField(\n field: SchemaField,\n indent: string,\n label: string,\n fieldType: string,\n hintJSX: string,\n context: FieldRenderContext\n): string {\n const defaultValueFromHandler = defaultValueFromSourceHandler(field, context)\n const stepProp = field.type === 'decimal' ? `\\n${indent} step=\"any\"` : ''\n const applyDefaultValueFrom = defaultValueFromHandler\n ? `${indent} ${defaultValueFromHandler}(normalizedValue)\\n`\n : ''\n\n return `${indent}<FormField\n${indent} control={form.control}\n${indent} name=\"${field.name}\"\n${indent} render={({ field: formField }) => (\n${indent} <FormItem${formItemProps(field)}>\n${indent} ${formLabelWithDescription(field, label, hintJSX, `${indent} `)}\n${indent} <FormControl>\n${indent} <Input\n${indent} type=\"${fieldType}\"${stepProp}\n${indent} placeholder=\"Enter ${label.toLowerCase()}\"\n${indent} disabled={isPending}\n${indent} value={formField.value ?? ''}\n${indent} onChange={(event) => {\n${indent} const nextValue = event.target.value === '' ? undefined : event.target.valueAsNumber\n${indent} const normalizedValue = Number.isNaN(nextValue) ? undefined : nextValue\n${applyDefaultValueFrom}${indent} formField.onChange(normalizedValue)\n${indent} }}\n${indent} onBlur={formField.onBlur}\n${indent} name={formField.name}\n${indent} ref={formField.ref}\n${indent} />\n${indent} </FormControl>\n${indent} <FormMessage />\n${indent} </FormItem>\n${indent} )}\n${indent}/>`\n}\n","/**\n * Entity form generator — create/edit form with Zod validation, React Hook Form, and mutations\n */\n\nimport { flattenFields, hasFieldType } from '@core-engine/schema/field-helpers/index.js'\nimport type { GeneratorOptions, Schema, SchemaField } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { pluralize, singularize, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { isAuthorshipFieldName } from '@next-adapter/generators/actions/action-helpers.js'\nimport { generateFieldJSX } from '@next-adapter/generators/form/field-jsx.js'\nimport {\n buildDefaultValueFromSyncFunctions,\n buildDefaultValues,\n buildUiImports,\n buildZodFields,\n collectDefaultValueFromSourceNames,\n collectRelationshipFields,\n defaultValueFromHandlerName,\n type FormGeneratorResult\n} from '@next-adapter/generators/form/form-shared.js'\n\nfunction collectSidebarSectionHeadingFields(fields: SchemaField[]): SchemaField[] {\n const headingFields: SchemaField[] = []\n\n for (const field of fields) {\n if (field.type === 'section' && field.slot === 'sidebar' && field.heading?.title) {\n headingFields.push(field)\n continue\n }\n if (field.slot === 'sidebar') continue\n\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n headingFields.push(...collectSidebarSectionHeadingFields(field.fields))\n }\n if (field.type === 'tabs' && field.tabs) {\n for (const tab of field.tabs) {\n headingFields.push(...collectSidebarSectionHeadingFields(tab.fields || []))\n }\n }\n }\n\n return headingFields\n}\n\nexport function generateForm(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): FormGeneratorResult {\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const kebabSingular = toKebabCase(singular)\n const hookName = `use${Singular}Form`\n const hookOptionsName = `Use${Singular}FormOptions`\n const hookPath = `${options.adminDir ?? 'admin'}/hooks/${schema.name}/use-${kebabSingular}-form.ts`\n const hookImportPath = `@admin/hooks/${schema.name}/use-${kebabSingular}-form`\n const contentComponentName = `${Singular}FormContent`\n const adminRoutePath = options.adminRoutePath ?? '/admin'\n\n // Analyze fields\n const allFormFields = schema.fields.filter(\n (f) =>\n !f.primaryKey &&\n f.name !== 'createdAt' &&\n f.name !== 'updatedAt' &&\n !isAuthorshipFieldName(f.name)\n )\n const flatFields = flattenFields(allFormFields)\n const hasDraft = schema.actions?.draft === true\n const showMetadataWidget = schema.type !== 'single' && schema.metadata !== false\n\n // Collect tab field names\n const tabFieldNames = new Set<string>()\n for (const f of schema.fields) {\n if (f.type === 'tabs' && f.tabs) {\n for (const tab of f.tabs) {\n if (tab.fields) for (const tf of tab.fields) tabFieldNames.add(tf.name)\n }\n }\n }\n\n // Check what components are needed\n const hasBoolean = hasFieldType(schema.fields, 'boolean')\n const hasImage = hasFieldType(schema.fields, 'image')\n const hasVideo = hasFieldType(schema.fields, 'video')\n const hasMedia = hasFieldType(schema.fields, 'media')\n const hasGallery = hasFieldType(schema.fields, 'gallery')\n const hasIcon = hasFieldType(schema.fields, 'icon')\n const hasDate = hasFieldType(schema.fields, 'date')\n const creatableSelectFields = flatFields.filter(\n (f) => f.type === 'select' && f.creatable === true\n )\n const creatableSelectFieldNames = new Set(creatableSelectFields.map((field) => field.name))\n const hasCreatableSelect = creatableSelectFields.length > 0\n const multiSelectFields = flatFields.filter((f) => f.type === 'select' && f.multiple === true)\n const staticMultiSelectFields = multiSelectFields.filter((f) => f.creatable !== true)\n const hasSelectCombobox = hasCreatableSelect || multiSelectFields.length > 0\n const hasSelect = flatFields.some(\n (f) => f.type === 'select' && f.creatable !== true && f.multiple !== true\n )\n const hasMarkdown = hasFieldType(schema.fields, 'markdown')\n const hasRichtext = hasFieldType(schema.fields, 'richtext')\n const hasTextarea = hasFieldType(schema.fields, 'text')\n const hasSeparator = hasFieldType(schema.fields, 'separator')\n const hasRelationship = hasFieldType(schema.fields, 'relationship')\n const hasTabsField = schema.fields.some((f) => f.type === 'tabs')\n const tabsField = schema.fields.find((f) => f.type === 'tabs')\n const tabNames = tabsField?.tabs?.map((tab) => tab.name) ?? []\n\n const mainRelFields = collectRelationshipFields(schema.fields, tabFieldNames)\n\n // Collect list fields with nested fields (need useFieldArray hooks)\n const listFieldsWithNested: SchemaField[] = []\n function collectListFields(fields: SchemaField[]): void {\n for (const f of fields) {\n if (f.type === 'list' && f.fields && f.fields.length > 0 && !f.hidden) {\n listFieldsWithNested.push(f)\n }\n if ((f.type === 'group' || f.type === 'section') && f.fields) collectListFields(f.fields)\n if (f.type === 'tabs' && f.tabs) {\n for (const tab of f.tabs) {\n if (tab.fields) collectListFields(tab.fields)\n }\n }\n }\n }\n collectListFields(allFormFields)\n const hasList = hasFieldType(schema.fields, 'list')\n const hasNestedList = listFieldsWithNested.length > 0\n // Simple list uses DynamicListField; nested list uses useFieldArray + Accordion\n const hasSimpleList =\n hasList && flatFields.some((f) => f.type === 'list' && (!f.fields || f.fields.length === 0))\n const sidebarSectionHeadingFields = collectSidebarSectionHeadingFields(allFormFields)\n const hasSectionCardHeading = sidebarSectionHeadingFields.length > 0\n const sectionHeadingIconNames = Array.from(\n new Set(\n sidebarSectionHeadingFields.flatMap((field) => {\n const icon = field.heading?.icon?.trim()\n return icon ? [toPascalCase(icon)] : []\n })\n )\n )\n\n // Build Zod schema\n const zodFields = buildZodFields(flatFields)\n\n // Build default values\n const defaultValues = buildDefaultValues(flatFields)\n const defaultValueFromSourceNames = collectDefaultValueFromSourceNames(flatFields)\n const defaultValueFromSyncFunctions = buildDefaultValueFromSyncFunctions(flatFields)\n\n // Build form fields JSX, split by slot ('main' default vs 'sidebar')\n const cardFieldIndent = ' '\n type SchemaTab = NonNullable<SchemaField['tabs']>[number]\n type SidebarFieldEntry = {\n field: SchemaField\n tabName?: string\n }\n type RenderedSidebarFieldEntry = SidebarFieldEntry & { jsx: string }\n\n const renderNestedTabsField = (\n f: SchemaField,\n childContext: { slotFilter?: 'main' | 'sidebar' } = {}\n ): string => {\n const indent = cardFieldIndent\n if (!f.tabs) return ''\n\n const tabsList = f.tabs\n .map((t) => `${indent} <TabsTrigger value=\"${t.name}\">${t.label}</TabsTrigger>`)\n .join('\\n')\n const tabsContent = f.tabs\n .map((t) => {\n const tabFields = (t.fields || [])\n .map((tf) =>\n generateFieldJSX(tf, `${indent} `, {\n creatableSelectFieldNames,\n defaultValueFromSourceNames,\n ...childContext\n })\n )\n .filter(Boolean)\n .join('\\n')\n return `${indent} <TabsContent value=\"${t.name}\" className=\"space-y-4 pt-4 pb-6 px-4 rounded-lg border bg-card\">\n${tabFields}\n${indent} </TabsContent>`\n })\n .join('\\n')\n return `${indent}<Tabs value={activeTab} onValueChange={(value) => void setActiveTab(value as TabValue)} className=\"w-full\">\n${indent} <TabsList>\n${tabsList}\n${indent} </TabsList>\n${tabsContent}\n${indent}</Tabs>`\n }\n\n function collectSidebarFields(fields: SchemaField[], tabName?: string): SidebarFieldEntry[] {\n const sidebarFields: SidebarFieldEntry[] = []\n\n for (const field of fields) {\n if (field.slot === 'sidebar') {\n sidebarFields.push({ field, tabName })\n continue\n }\n\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n sidebarFields.push(...collectSidebarFields(field.fields, tabName))\n }\n if (field.type === 'tabs' && field.tabs) {\n for (const tab of field.tabs) {\n sidebarFields.push(...collectSidebarFields(tab.fields || [], tab.name))\n }\n }\n }\n\n return sidebarFields\n }\n const renderMainField = (f: SchemaField): string => {\n const indent = cardFieldIndent\n\n if ((f.slot ?? 'main') !== 'main') return ''\n if (f.type === 'tabs') return renderNestedTabsField(f, { slotFilter: 'main' })\n if (tabFieldNames.has(f.name)) return ''\n return generateFieldJSX(f, indent, {\n creatableSelectFieldNames,\n defaultValueFromSourceNames,\n slotFilter: 'main'\n })\n }\n const renderPromotedSidebarField = (f: SchemaField): string => {\n const indent = cardFieldIndent\n\n if (f.type === 'tabs') return renderNestedTabsField(f)\n return generateFieldJSX(f, indent, { creatableSelectFieldNames, defaultValueFromSourceNames })\n }\n const renderConditionalSidebarEntry = ({ field, tabName }: SidebarFieldEntry): string => {\n const fieldJSX = renderPromotedSidebarField(field)\n if (!fieldJSX) return ''\n if (!tabName) return fieldJSX\n if (!field.hasIcon) {\n return `${cardFieldIndent}{activeTab === ${JSON.stringify(tabName)} ? (\n${fieldJSX}\n${cardFieldIndent}) : null}`\n }\n\n return `${cardFieldIndent}{activeTab === ${JSON.stringify(tabName)} ? (\n${cardFieldIndent} <>\n${fieldJSX}\n${cardFieldIndent} </>\n${cardFieldIndent}) : null}`\n }\n const renderStaticSidebarEntry = ({ field }: SidebarFieldEntry): string =>\n renderPromotedSidebarField(field)\n\n const renderSidebarCardHeading = (field: SchemaField, indent: string): string => {\n const heading = field.heading\n if (!heading?.title) return ''\n\n const iconName = heading.icon?.trim() ? toPascalCase(heading.icon.trim()) : null\n const iconJSX = iconName\n ? `\n${indent} <${iconName} className=\"size-4 shrink-0\" />`\n : ''\n\n return `${indent} <CardHeader>\n${indent} <CardTitle className=\"flex items-center gap-1.5\">${iconJSX}\n${indent} <span>{${JSON.stringify(heading.title)}}</span>\n${indent} </CardTitle>\n${indent} </CardHeader>`\n }\n const renderSidebarCard = (\n fieldsJSX: string,\n indent = ' ',\n headingField?: SchemaField\n ): string => {\n if (!fieldsJSX) return ''\n const headingJSX = headingField ? renderSidebarCardHeading(headingField, indent) : ''\n if (headingJSX) {\n return `${indent}<Card className=\"gap-0\">\n${headingJSX}\n${indent} <CardContent className=\"space-y-5 p-5\">\n${fieldsJSX}\n${indent} </CardContent>\n${indent}</Card>`\n }\n return `${indent}<Card className=\"space-y-5 p-5 gap-0\">\n${fieldsJSX}\n${indent}</Card>`\n }\n const wrapSidebarCardForTab = (cardJSX: string, tabName?: string): string => {\n if (!tabName) return cardJSX\n\n return ` {activeTab === ${JSON.stringify(tabName)} ? (\n${cardJSX}\n ) : null}`\n }\n const isSeparateSidebarCard = (field: SchemaField): boolean =>\n field.type === 'section' && field.slot === 'sidebar'\n const renderSidebarColumn = (\n entries: RenderedSidebarFieldEntry[],\n options: { conditionalTabs?: boolean; scrollable?: boolean } = {}\n ): string => {\n if (entries.length === 0) return ''\n\n const cards: string[] = []\n let defaultCardFields: string[] = []\n\n function flushDefaultCardFields() {\n const fieldsJSX = defaultCardFields.filter(Boolean).join('\\n')\n if (!fieldsJSX) return\n cards.push(renderSidebarCard(fieldsJSX, ' '))\n defaultCardFields = []\n }\n\n for (const entry of entries) {\n if (!isSeparateSidebarCard(entry.field)) {\n defaultCardFields.push(entry.jsx)\n continue\n }\n\n flushDefaultCardFields()\n const cardJSX = renderSidebarCard(entry.jsx, ' ', entry.field)\n cards.push(options.conditionalTabs ? wrapSidebarCardForTab(cardJSX, entry.tabName) : cardJSX)\n }\n\n flushDefaultCardFields()\n\n const columnClassName = options.scrollable\n ? 'relative h-fit max-h-full space-y-4 overflow-y-auto pb-4 lg:sticky lg:top-0'\n : 'lg:sticky lg:top-17 space-y-4 pb-4'\n\n return ` <div className=\"${columnClassName}\">\n${cards.join('\\n')}\n </div>`\n }\n const renderTabMainFields = (tab: SchemaTab, commonMainFieldsJSX: string): string => {\n const tabFieldsJSX = (tab.fields || [])\n .map((tf) =>\n generateFieldJSX(tf, cardFieldIndent, {\n creatableSelectFieldNames,\n defaultValueFromSourceNames,\n slotFilter: 'main'\n })\n )\n .filter(Boolean)\n .join('\\n')\n\n return [commonMainFieldsJSX, tabFieldsJSX].filter(Boolean).join('\\n')\n }\n const renderTopLevelTabContent = (\n tab: SchemaTab,\n commonMainFieldsJSX: string,\n commonSidebarEntries: SidebarFieldEntry[]\n ): string => {\n const tabMainFieldsJSX = renderTabMainFields(tab, commonMainFieldsJSX)\n const tabSidebarEntries = [\n ...commonSidebarEntries,\n ...collectSidebarFields(tab.fields || [], tab.name)\n ]\n .map((entry) => ({ ...entry, jsx: renderStaticSidebarEntry(entry) }))\n .filter((entry): entry is RenderedSidebarFieldEntry => entry.jsx.length > 0)\n const gridClass = `grid grid-cols-1 ${tabSidebarEntries.length > 0 ? 'lg:grid-cols-[1fr_360px] ' : ''}h-full min-h-0 gap-4 items-stretch`\n const sidebarColumn = renderSidebarColumn(tabSidebarEntries, { scrollable: true })\n\n return ` <TabsContent value=\"${tab.name}\" className=\"min-h-0 w-full flex-1 overflow-hidden\">\n <div className=\"${gridClass}\">\n <div className=\"h-full min-h-0 min-w-0 pb-4\">\n <Card className=\"relative min-h-0 min-w-0 space-y-5 overflow-y-auto p-8 gap-0 h-full\">\n${tabMainFieldsJSX}\n </Card>\n </div>\n${sidebarColumn}\n </div>\n </TabsContent>`\n }\n const renderTopLevelTabsLayout = (\n tabsField: SchemaField,\n commonFields: SchemaField[]\n ): string => {\n if (!tabsField.tabs) return ''\n\n const commonMainFieldsJSX = commonFields.map(renderMainField).filter(Boolean).join('\\n')\n const commonSidebarEntries = collectSidebarFields(commonFields)\n const tabsList = tabsField.tabs\n .map((tab) => ` <TabsTrigger value=\"${tab.name}\">${tab.label}</TabsTrigger>`)\n .join('\\n')\n const tabsContent = tabsField.tabs\n .map((tab) => renderTopLevelTabContent(tab, commonMainFieldsJSX, commonSidebarEntries))\n .join('\\n')\n\n return ` <Tabs value={activeTab} onValueChange={(value) => void setActiveTab(value as TabValue)} className=\"flex h-full min-h-0 w-full flex-col gap-4\">\n <TabsList className=\"sticky top-0 z-10 shrink-0 bg-background\">\n${tabsList}\n </TabsList>\n${tabsContent}\n </Tabs>`\n }\n\n const visibleFields = allFormFields.filter((f) => !(hasDraft && f.name === 'published'))\n const topLevelTabsField = visibleFields.find(\n (field) => field.type === 'tabs' && (field.slot ?? 'main') === 'main' && field.tabs?.length\n )\n const topLevelCommonFields = topLevelTabsField\n ? visibleFields.filter((field) => field !== topLevelTabsField)\n : visibleFields\n const mainFieldsJSX = topLevelCommonFields.map(renderMainField).filter(Boolean).join('\\n')\n const sidebarEntries = collectSidebarFields(topLevelCommonFields)\n .map((entry) => ({ ...entry, jsx: renderConditionalSidebarEntry(entry) }))\n .filter((entry): entry is RenderedSidebarFieldEntry => entry.jsx.length > 0)\n const hasSidebarFields = sidebarEntries.length > 0\n const hasCommonSidebarFields = sidebarEntries.some((entry) => !entry.tabName)\n const sidebarTabNames = Array.from(\n new Set(sidebarEntries.flatMap((entry) => (entry.tabName ? [entry.tabName] : [])))\n )\n const shouldGuardSidebarByTab =\n hasSidebarFields && !hasCommonSidebarFields && sidebarTabNames.length > 0\n const sidebarVisibilityState = shouldGuardSidebarByTab\n ? `\\n const hasVisibleSidebarFields = ${sidebarTabNames\n .map((tabName) => `activeTab === ${JSON.stringify(tabName)}`)\n .join(' || ')}\\n`\n : ''\n const formGridOpen = shouldGuardSidebarByTab\n ? ` <div\n className={cn(\n 'grid grid-cols-1 gap-4 items-start h-full',\n {\n 'lg:grid-cols-[1fr_360px]': hasVisibleSidebarFields\n }\n )}\n >`\n : ` <div className=\"grid grid-cols-1 ${hasSidebarFields ? 'lg:grid-cols-[1fr_360px] ' : ''}gap-4 items-start h-full\">`\n const sidebarCardJSX = !hasSidebarFields\n ? ''\n : shouldGuardSidebarByTab\n ? ` {hasVisibleSidebarFields ? (\n${renderSidebarColumn(sidebarEntries, { conditionalTabs: true })}\n ) : null}`\n : renderSidebarColumn(sidebarEntries, { conditionalTabs: true })\n const formBodyJSX = topLevelTabsField\n ? renderTopLevelTabsLayout(topLevelTabsField, topLevelCommonFields)\n : `${formGridOpen}\n <div className=\"h-full min-w-0\">\n <Card className=\"min-w-0 h-full\">\n <CardContent className=\"space-y-5 gap-0 h-full\">\n${mainFieldsJSX}\n</CardContent>\n </Card>\n </div>\n${sidebarCardJSX}\n </div>`\n const formClassName = topLevelTabsField\n ? showMetadataWidget\n ? `className={cn('min-h-0', {\n 'h-[calc(100svh-56px-56px-32px)]': initialData?.id != null,\n 'h-[calc(100svh-56px-32px)]': initialData?.id == null\n })}`\n : 'className=\"h-[calc(100svh-56px-32px)] min-h-0\"'\n : 'className=\"space-y-6 h-full\"'\n\n // --- Build imports ---\n const formControlFreeFieldTypes = new Set(['separator', 'tabs'])\n const inputFreeFieldTypes = new Set([\n 'boolean',\n 'image',\n 'video',\n 'media',\n 'gallery',\n 'icon',\n 'date',\n 'select',\n 'richtext',\n 'markdown',\n 'text',\n 'relationship',\n 'list',\n 'separator',\n 'tabs'\n ])\n const contentUsesFormControls = flatFields.some((field) => {\n if (field.primaryKey || field.hidden) return false\n if (field.hasIcon && !['group', 'section', 'tabs', 'separator'].includes(field.type)) {\n return true\n }\n if (field.type === 'list' && (!field.fields || field.fields.length === 0)) return false\n return !formControlFreeFieldTypes.has(field.type)\n })\n const nestedListUsesInput = listFieldsWithNested.some((field) =>\n field.fields?.some(\n (nestedField) => !['boolean', 'image', 'video', 'media'].includes(nestedField.type)\n )\n )\n const contentUsesInput =\n nestedListUsesInput ||\n flatFields.some(\n (field) => !field.primaryKey && !field.hidden && !inputFreeFieldTypes.has(field.type)\n )\n const contentUsesPendingState = flatFields.some(\n (field) => !field.primaryKey && !field.hidden && !['separator', 'tabs'].includes(field.type)\n )\n const fieldRendersMainJSXForImports = (field: SchemaField): boolean => {\n if (field.hidden) return false\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n return field.fields.some(fieldRendersMainJSXForImports)\n }\n if (field.type === 'tabs') return Boolean(field.tabs?.length)\n return true\n }\n const fieldSupportsIconPostfix = (field: SchemaField): boolean =>\n !['group', 'section', 'tabs', 'separator'].includes(field.type)\n const hasRenderedIconPostfix = (fields: SchemaField[]): boolean => {\n for (const field of fields) {\n if (field.hidden) continue\n if (\n field.hasIcon &&\n fieldSupportsIconPostfix(field) &&\n fieldRendersMainJSXForImports(field)\n ) {\n return true\n }\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n if (hasRenderedIconPostfix(field.fields)) return true\n }\n if (field.type === 'tabs' && field.tabs) {\n for (const tab of field.tabs) {\n if (hasRenderedIconPostfix(tab.fields ?? [])) return true\n }\n }\n }\n return false\n }\n const contentHasRenderedIconPostfix = hasRenderedIconPostfix(allFormFields)\n const uiImports = buildUiImports({\n hasBoolean,\n hasTextarea,\n hasImage,\n hasVideo,\n hasMedia,\n hasGallery,\n hasIcon,\n hasIconPostfix: contentHasRenderedIconPostfix,\n hasDate,\n hasMarkdown,\n hasRichtext,\n hasSeparator,\n hasSelect,\n hasSelectCombobox,\n hasCreatableSelect,\n hasMultiSelect: multiSelectFields.length > 0,\n hasTabsField,\n hasRelationship,\n hasSimpleList,\n hasNestedList,\n hasCardContent: true,\n hasSectionCardHeading,\n hasFormRoot: false,\n hasButton: hasRelationship || hasSelectCombobox || hasNestedList,\n hasFormControls: contentUsesFormControls || contentHasRenderedIconPostfix,\n hasInput: contentUsesInput\n })\n\n // Lucide icons\n const lucideIcons: string[] = []\n const addLucideIcons = (...icons: string[]) => {\n for (const icon of icons) {\n if (!lucideIcons.includes(icon)) lucideIcons.push(icon)\n }\n }\n addLucideIcons(...sectionHeadingIconNames)\n if (hasRelationship || hasSelectCombobox) addLucideIcons('Check', 'ChevronsUpDown')\n if (hasCreatableSelect) addLucideIcons('Plus')\n if (hasNestedList) {\n addLucideIcons('Plus', 'X')\n }\n\n // Relationship hooks\n const relHookImports = mainRelFields\n .map((f) => {\n const relPlural = toPascalCase(pluralize(f.relationship || ''))\n return `import { use${relPlural} } from '@admin/hooks/use-${f.relationship}'`\n })\n .filter((v, i, a) => a.indexOf(v) === i)\n .join('\\n')\n\n // Relationship state\n const relState = mainRelFields\n .map((f) => {\n const relPlural = toPascalCase(pluralize(f.relationship || ''))\n return ` const [${f.name}Open, set${toPascalCase(f.name)}Open] = React.useState(false)\n const { data: ${f.relationship}Data } = use${relPlural}()`\n })\n .filter((v, i, a) => a.indexOf(v) === i)\n .join('\\n')\n\n const creatableSelectState = creatableSelectFields\n .map((field) => {\n const fieldPascal = toPascalCase(field.name)\n const staticOptions = (field.options ?? [])\n .map(\n (option) =>\n `{ label: ${JSON.stringify(option.label)}, value: ${JSON.stringify(option.value)} }`\n )\n .join(', ')\n return ` const [${field.name}Open, set${fieldPascal}Open] = React.useState(false)\n const [${field.name}Search, set${fieldPascal}Search] = React.useState('')\n const [create${fieldPascal}OptionPending, startCreate${fieldPascal}OptionTransition] = React.useTransition()\n const { data: ${field.name}CreatedOptions = [] as ${Singular}SelectOption[] } = useQuery<${Singular}SelectOption[]>({\n queryKey: ['${schema.name}', 'select-options', '${field.name}'],\n queryFn: () => get${Singular}SelectOptions('${field.name}')\n })\n const ${field.name}StaticOptions: Array<{ label: string; value: string }> = [${staticOptions}]\n const ${field.name}Options = [\n ...${field.name}StaticOptions,\n ...${field.name}CreatedOptions.filter(\n (createdOption: ${Singular}SelectOption) =>\n !${field.name}StaticOptions.some((option) => option.value === createdOption.value)\n )\n ]`\n })\n .join('\\n')\n\n const staticMultiSelectState = staticMultiSelectFields\n .map(\n (field) =>\n ` const [${field.name}Open, set${toPascalCase(field.name)}Open] = React.useState(false)`\n )\n .join('\\n')\n\n // List field array hooks\n const fieldArrayHooks = listFieldsWithNested\n .map((field) => {\n const pascalFieldName = toPascalCase(field.name)\n return ` const [${field.name}Expanded, set${pascalFieldName}Expanded] = React.useState<string | undefined>(undefined)\n const ${field.name}FieldArray = useFieldArray({\n control: form.control,\n name: '${field.name}'\n })`\n })\n .join('\\n')\n\n const creatableSelectHandlers = creatableSelectFields\n .map((field) => {\n const fieldPascal = toPascalCase(field.name)\n const defaultValueFromHandler = defaultValueFromSourceNames.has(field.name)\n ? `applyDefaultValueFrom${fieldPascal}`\n : null\n const setCreatedOptionValue = field.multiple\n ? `const currentValue = form.getValues('${field.name}')\n const selectedValues = Array.isArray(currentValue) ? currentValue : []\n const nextValues = [...new Set([...selectedValues, result.option.value])]\n ${defaultValueFromHandler ? `${defaultValueFromHandler}(nextValues)\\n ` : ''}form.setValue('${field.name}', nextValues, {\n shouldDirty: true,\n shouldValidate: true\n })`\n : `${defaultValueFromHandler ? `${defaultValueFromHandler}(result.option.value)\\n ` : ''}form.setValue('${field.name}', result.option.value, {\n shouldDirty: true,\n shouldValidate: true\n })`\n return ` function handleCreate${fieldPascal}Option(label: string) {\n const trimmedLabel = label.trim()\n if (!trimmedLabel) return\n\n startCreate${fieldPascal}OptionTransition(async () => {\n const result = await create${Singular}SelectOption({\n fieldName: '${field.name}',\n label: trimmedLabel\n })\n\n if (!result.success || !result.option) {\n toast.error(result.error || 'Failed to create option')\n return\n }\n\n await queryClient.invalidateQueries({\n queryKey: ['${schema.name}', 'select-options', '${field.name}']\n })\n ${setCreatedOptionValue}\n set${fieldPascal}Search('')\n set${fieldPascal}Open(false)\n toast.success('Option created')\n })\n }`\n })\n .join('\\n\\n')\n\n const uniqueNames = (names: string[]): string[] => Array.from(new Set(names))\n const defaultValueFromHandlerNames = Array.from(defaultValueFromSourceNames).map((sourceName) =>\n defaultValueFromHandlerName(sourceName)\n )\n const relationshipHookReturnNames = mainRelFields.flatMap((field) => [\n `${field.name}Open`,\n `set${toPascalCase(field.name)}Open`,\n `${field.relationship}Data`\n ])\n const creatableSelectReturnNames = creatableSelectFields.flatMap((field) => {\n const fieldPascal = toPascalCase(field.name)\n return [\n `${field.name}Open`,\n `set${fieldPascal}Open`,\n `${field.name}Search`,\n `set${fieldPascal}Search`,\n `create${fieldPascal}OptionPending`,\n `${field.name}Options`,\n `handleCreate${fieldPascal}Option`\n ]\n })\n const staticMultiSelectReturnNames = staticMultiSelectFields.flatMap((field) => [\n `${field.name}Open`,\n `set${toPascalCase(field.name)}Open`\n ])\n const fieldArrayReturnNames = listFieldsWithNested.flatMap((field) => [\n `${field.name}Expanded`,\n `set${toPascalCase(field.name)}Expanded`,\n `${field.name}FieldArray`\n ])\n const hookReturnNames = uniqueNames([\n 'initialData',\n 'form',\n 'isPending',\n 'isDirty',\n ...(hasDraft\n ? [\n 'submitIntent',\n 'canPublishPristineDraft',\n 'canSubmitDraftAction',\n 'canSubmitPublishAction'\n ]\n : []),\n ...(hasTabsField ? ['activeTab', 'setActiveTab'] : []),\n ...relationshipHookReturnNames,\n ...creatableSelectReturnNames,\n ...staticMultiSelectReturnNames,\n ...defaultValueFromHandlerNames,\n ...fieldArrayReturnNames,\n 'onSubmit',\n 'handleErrors'\n ])\n const hookReturnObject = hookReturnNames.map((name) => ` ${name}`).join(',\\n')\n const contentStateNames = uniqueNames([\n ...(hasDraft || (topLevelTabsField && showMetadataWidget) ? ['initialData'] : []),\n 'form',\n ...(contentUsesPendingState ? ['isPending'] : []),\n ...(hasTabsField ? ['activeTab', 'setActiveTab'] : []),\n ...relationshipHookReturnNames,\n ...creatableSelectReturnNames,\n ...staticMultiSelectReturnNames,\n ...defaultValueFromHandlerNames,\n ...fieldArrayReturnNames,\n 'onSubmit',\n 'handleErrors'\n ])\n const contentStateDestructure = contentStateNames.map((name) => ` ${name}`).join(',\\n')\n\n const needsCn =\n hasRelationship ||\n hasSelectCombobox ||\n shouldGuardSidebarByTab ||\n Boolean(topLevelTabsField && showMetadataWidget)\n const needsReact =\n mainRelFields.length > 0 ||\n hasNestedList ||\n hasDraft ||\n hasCreatableSelect ||\n staticMultiSelectFields.length > 0\n const metadataOffsetConst = showMetadataWidget ? 'const SCROLL_BORDER_OFFSET = 8;\\n\\n' : ''\n const tabParserConst = hasTabsField\n ? `const TAB_VALUES = [${tabNames.map((name) => JSON.stringify(name)).join(', ')}] as const\nconst TAB_PARSER = parseAsStringLiteral(TAB_VALUES).withDefault(TAB_VALUES[0])\n\nexport type TabValue = (typeof TAB_VALUES)[number]\n\n`\n : ''\n const metadataScrollState = showMetadataWidget\n ? ' const hasScrolled = usePageScrollThreshold(SCROLL_BORDER_OFFSET)\\n'\n : ''\n const metadataStrip = showMetadataWidget\n ? ` {initialData?.id != null && (\n <div\n className={cn(\n 'sticky z-10 flex flex-col gap-1 px-4 bg-background h-14 xl:flex-row xl:items-center xl:justify-between top-14 transition-shadow overflow-x-clip border-b border-border/80',\n {\n 'shadow-modal/3': hasScrolled\n }\n )}\n >\n <div className=\"flex flex-1 items-center gap-1 w-full\">\n <EntityMetadata\n data={initialData}\n entityType=\"${plural}\"\n entityId={initialData.id}\n getVersionsAction={getVersionsBy${Singular}Id}\n restoreVersionAction={restore${Singular}Version}\n />\n </div>\n </div>\n )}\n\n`\n : ''\n\n // --- Assemble files ---\n const hookContent = `'use client'\n${needsReact ? \"\\nimport * as React from 'react'\" : ''}\nimport { standardSchemaResolver } from '@hookform/resolvers/standard-schema'\nimport { useMutation, ${hasCreatableSelect ? 'useQuery, ' : ''}useQueryClient } from '@tanstack/react-query'\nimport { useRouter } from 'next/navigation'\nimport {${hasNestedList ? ' useFieldArray,' : ''} useForm } from 'react-hook-form'\nimport { toast } from 'sonner'\nimport { z } from 'zod/v3'${hasTabsField ? \"\\nimport { parseAsStringLiteral, useQueryState } from 'nuqs'\" : ''}\n${relHookImports ? `${relHookImports}\\n` : ''}\nimport type {\n ${Singular},\n ${Singular}CreateInput,${hasCreatableSelect ? `\\n ${Singular}SelectOption,` : ''}\n ${Singular}UpdateInput\n} from '@admin/actions/${actionImportPath}'\nimport { create${Singular}, ${hasCreatableSelect ? `create${Singular}SelectOption, get${Singular}SelectOptions, ` : ''}update${Singular} } from '@admin/actions/${actionImportPath}'\n\n${tabParserConst}const formSchema = z.object({\n${zodFields}\n})\n\nexport type FormValues = z.infer<typeof formSchema>\n\ninterface ${hookOptionsName} {\n initialData?: ${Singular}\n}\n\nexport function ${hookName}({ initialData }: ${hookOptionsName}) {\n const router = useRouter()\n const queryClient = useQueryClient()${hasTabsField ? \"\\n const [activeTab, setActiveTab] = useQueryState('tab', TAB_PARSER)\" : ''}${relState ? `\\n${relState}` : ''}${creatableSelectState ? `\\n${creatableSelectState}` : ''}${staticMultiSelectState ? `\\n${staticMultiSelectState}` : ''}${hasDraft ? \"\\n const [submitIntent, setSubmitIntent] = React.useState<'draft' | 'publish' | null>(null)\" : ''}\n\n const createMutation = useMutation({\n mutationFn: (data: ${Singular}CreateInput) => create${Singular}(data),\n onSuccess: async () => {\n toast.success('${Singular} created successfully')\n await queryClient.invalidateQueries({ queryKey: ['${plural}'] })\n router.push('${adminRoutePath}/${schema.name}')\n },\n onError: (error: Error) => {\n toast.error(error.message || 'Failed to create ${singular}')\n }${hasDraft ? ',\\n onSettled: () => {\\n setSubmitIntent(null)\\n }' : ''}\n })\n\n const updateMutation = useMutation({\n mutationFn: (data: ${Singular}UpdateInput) => update${Singular}(data),\n onSuccess: async () => {\n toast.success('${Singular} updated successfully')\n await queryClient.invalidateQueries({ queryKey: ['${plural}'] })\n router.refresh()\n },\n onError: (error: Error) => {\n toast.error(error.message || 'Failed to update ${singular}')\n }${hasDraft ? ',\\n onSettled: () => {\\n setSubmitIntent(null)\\n }' : ''}\n })\n\n const isPending = createMutation.isPending || updateMutation.isPending\n\n const form = useForm<FormValues>({\n resolver: standardSchemaResolver(formSchema),\n defaultValues: {\n${defaultValues}\n }\n })\n const { isDirty } = form.formState\n${hasDraft ? ' const canPublishPristineDraft = Boolean(initialData && !initialData.published)\\n const canSubmitDraftAction = Boolean(initialData?.published || isDirty)\\n const canSubmitPublishAction = isDirty || canPublishPristineDraft\\n' : ''}\n${defaultValueFromSyncFunctions ? `\\n${defaultValueFromSyncFunctions}\\n` : ''}\n${fieldArrayHooks ? `\\n${fieldArrayHooks}\\n` : ''}\n${creatableSelectHandlers ? `${creatableSelectHandlers}\\n\\n` : ''}\n function onSubmit(values: FormValues${hasDraft ? ', publishedValue: boolean = false' : ''}) {\n${hasDraft ? \" if (publishedValue ? !canSubmitPublishAction : !canSubmitDraftAction) {\\n return\\n }\\n setSubmitIntent(publishedValue ? 'publish' : 'draft')\\n\" : ''} if (initialData) {\n updateMutation.mutate({\n id: initialData.id,\n ...values${hasDraft ? ',\\n published: publishedValue' : ''}\n })\n } else {\n createMutation.mutate({\n ...values${hasDraft ? ',\\n published: publishedValue' : ''}\n } as ${Singular}CreateInput)\n }\n }\n\n function handleErrors(errors: Record<string, unknown>) {\n${hasDraft ? ' setSubmitIntent(null)\\n' : ''} const firstError = Object.values(errors)[0] as { message?: string } | undefined\n if (firstError?.message) {\n toast.error(String(firstError.message))\n } else {\n toast.error('Please fix the form errors before submitting')\n }\n }\n\n return {\n${hookReturnObject}\n }\n}\n`\n\n const content = `'use client'\n${lucideIcons.length > 0 ? `\\nimport { ${lucideIcons.join(', ')} } from 'lucide-react'` : ''}${hasTabsField ? `\\nimport type { TabValue, ${hookName} } from '${hookImportPath}'` : `\\nimport type { ${hookName} } from '${hookImportPath}'`}${needsCn ? \"\\nimport { cn } from '@admin/utils/shared/cn'\" : ''}\n${uiImports.join('\\n')}\n\ninterface ${contentComponentName}Props {\n state: ReturnType<typeof ${hookName}>\n}\n\nexport function ${contentComponentName}({ state }: ${contentComponentName}Props) {\n const {\n${contentStateDestructure}\n } = state\n${sidebarVisibilityState}\n return (\n <form id=\"${schema.name}-form\" onSubmit={form.handleSubmit((values) => onSubmit(values${hasDraft ? ', initialData?.published ?? false' : ''}), handleErrors)} ${formClassName}>\n${formBodyJSX}\n </form>\n )\n}\n`\n\n const shellContent = `'use client'\n${showMetadataWidget ? \"\\nimport { usePageScrollThreshold } from '@admin/hooks/use-page-scroll-threshold'\" : ''}\nimport { Button } from '@admin/components/ui/button'\nimport { Form } from '@admin/components/ui/form'\nimport { PageHeader } from '@admin/components/shared/page-header'${showMetadataWidget ? \"\\nimport { EntityMetadata } from '@admin/components/shared/entity-metadata'\\nimport { cn } from '@admin/utils/shared/cn'\" : ''}\nimport type { ${Singular} } from '@admin/actions/${actionImportPath}'\n${showMetadataWidget ? `import { getVersionsBy${Singular}Id, restore${Singular}Version } from '@admin/actions/${actionImportPath}'` : ''}\nimport { ${hookName} } from '${hookImportPath}'\nimport { ${contentComponentName} } from './${schema.name}-form-content'\n\n${metadataOffsetConst}export type { FormValues } from '${hookImportPath}'\n\ninterface ${Singular}FormProps {\n initialData?: ${Singular}\n pageTitle: string\n}\n\nexport function ${Singular}Form({ initialData, pageTitle }: ${Singular}FormProps) {\n${metadataScrollState} const entityForm = ${hookName}({ initialData })\n\n return (\n <>\n <PageHeader\n title={pageTitle}\n actions={\n${\n hasDraft\n ? ` <div className=\"flex items-center gap-1\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => entityForm.form.handleSubmit((values) => entityForm.onSubmit(values, false), entityForm.handleErrors)()}\n disabled={!entityForm.canSubmitDraftAction || (!initialData?.published && entityForm.isPending)}\n >\n {entityForm.isPending && entityForm.submitIntent === 'draft'\n ? 'Saving...'\n : initialData?.published ? 'Unpublish' : 'Save Changes'}\n </Button>\n <Button\n type=\"button\"\n onClick={() => entityForm.form.handleSubmit((values) => entityForm.onSubmit(values, true), entityForm.handleErrors)()}\n disabled={entityForm.isPending || !entityForm.canSubmitPublishAction}\n >\n {entityForm.isPending && entityForm.submitIntent === 'publish'\n ? initialData?.published ? 'Saving...' : 'Publishing...'\n : initialData?.published ? 'Publish Changes' : 'Publish'}\n </Button>\n </div>`\n : ` <Button\n type=\"button\"\n onClick={() => entityForm.form.handleSubmit((values) => entityForm.onSubmit(values), entityForm.handleErrors)()}\n disabled={entityForm.isPending || !entityForm.isDirty}\n >\n {entityForm.isPending ? 'Saving...' : initialData ? 'Update' : 'Create'}\n </Button>`\n}\n }\n />\n${metadataStrip} <main className=\"w-full p-4 h-full\">\n <Form {...entityForm.form}>\n <${contentComponentName} state={entityForm} />\n </Form>\n </main>\n </>\n )\n}\n`\n\n return {\n files: [\n createGeneratedFile(hookPath, hookContent),\n createGeneratedFile(`${pagesDir}/${schema.name}/${schema.name}-form-content.tsx`, content),\n createGeneratedFile(`${pagesDir}/${schema.name}/${schema.name}-form.tsx`, shellContent)\n ]\n }\n}\n","/**\n * Single (singleton) form generator — Card-per-section with independent saves.\n * Top-level `section` fields each become a Card with their own useForm + useMutation.\n * Schemas without sections fall back to a single Card with all fields.\n */\n\nimport { isLayoutField } from '@core-engine/schema/constants.js'\nimport { flattenFields, hasFieldType } from '@core-engine/schema/field-helpers/index.js'\nimport type { GeneratorOptions, Schema, SchemaField } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { pluralize, singularize, toCamelCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { isAuthorshipFieldName } from '@next-adapter/generators/actions/action-helpers.js'\nimport { generateFieldJSX } from '@next-adapter/generators/form/field-jsx.js'\nimport {\n buildDefaultValueFromSyncFunctions,\n buildDefaultValues,\n buildUiImports,\n buildZodFields,\n collectDefaultValueFromSourceNames,\n collectRelationshipFields,\n type FormGeneratorResult\n} from '@next-adapter/generators/form/form-shared.js'\n\n// ============================================================================\n// Card group parsing\n// ============================================================================\n\ninterface CardGroup {\n title: string\n description: string\n hint: string\n varPrefix: string\n componentName: string\n fields: SchemaField[]\n flatFields: SchemaField[]\n}\n\n/**\n * Parse schema fields into card groups.\n * - Top-level `section` fields each become a card.\n * - Fields without sections → one card (backward compat).\n */\nfunction parseCardGroups(allFormFields: SchemaField[], schemaLabel: string): CardGroup[] {\n const sections = allFormFields.filter((f) => f.type === 'section' && f.fields)\n const nonSections = allFormFields.filter((f) => f.type !== 'section' && !isLayoutField(f.type))\n\n // If no sections, all fields go in one card\n if (sections.length === 0) {\n const title = nonSections[0]?.label || nonSections[0]?.name || schemaLabel\n return [\n {\n title,\n description: '',\n hint: '',\n varPrefix: toCamelCase(nonSections[0]?.name || 'form'),\n componentName: `${toPascalCase(nonSections[0]?.name || 'form')}Card`,\n fields: nonSections,\n flatFields: flattenFields(nonSections).filter((f) => !isLayoutField(f.type))\n }\n ]\n }\n\n // Each section becomes a card\n const groups: CardGroup[] = []\n for (const section of sections) {\n const innerFields = section.fields || []\n groups.push({\n title: section.label || section.name,\n description: section.description || '',\n hint: section.hint || '',\n varPrefix: toCamelCase(section.name),\n componentName: `${toPascalCase(section.name)}Card`,\n fields: innerFields,\n flatFields: flattenFields(innerFields).filter((f) => !isLayoutField(f.type))\n })\n }\n\n // If there are also loose fields outside sections, put them in a default card\n if (nonSections.length > 0) {\n const title = nonSections[0]?.label || nonSections[0]?.name || 'General'\n groups.unshift({\n title,\n description: '',\n hint: '',\n varPrefix: toCamelCase(nonSections[0]?.name || 'general'),\n componentName: `${toPascalCase(nonSections[0]?.name || 'General')}Card`,\n fields: nonSections,\n flatFields: flattenFields(nonSections).filter((f) => !isLayoutField(f.type))\n })\n }\n\n return groups\n}\n\n// ============================================================================\n// Per-group analysis\n// ============================================================================\n\ninterface GroupAnalysis {\n relFields: SchemaField[]\n multiSelectFields: SchemaField[]\n listFieldsWithNested: SchemaField[]\n hasTabsField: boolean\n tabFieldNames: Set<string>\n}\n\nfunction analyzeGroup(fields: SchemaField[]): GroupAnalysis {\n const tabFieldNames = new Set<string>()\n for (const f of fields) {\n if (f.type === 'tabs' && f.tabs) {\n for (const tab of f.tabs) {\n if (tab.fields) for (const tf of tab.fields) tabFieldNames.add(tf.name)\n }\n }\n }\n\n const relFields = collectRelationshipFields(fields, tabFieldNames)\n const multiSelectFields = flattenFields(fields).filter(\n (f) => f.type === 'select' && f.multiple === true\n )\n\n const listFieldsWithNested: SchemaField[] = []\n function collectLists(flds: SchemaField[]): void {\n for (const f of flds) {\n if (f.type === 'list' && f.fields && f.fields.length > 0 && !f.hidden) {\n listFieldsWithNested.push(f)\n }\n if (f.type === 'group' && f.fields) collectLists(f.fields)\n if (f.type === 'tabs' && f.tabs) {\n for (const tab of f.tabs) {\n if (tab.fields) collectLists(tab.fields)\n }\n }\n }\n }\n collectLists(fields)\n\n const hasTabsField = fields.some((f) => f.type === 'tabs')\n\n return {\n relFields,\n multiSelectFields,\n listFieldsWithNested,\n hasTabsField,\n tabFieldNames\n }\n}\n\n// ============================================================================\n// Per-group JSX generation\n// ============================================================================\n\nfunction buildGroupFieldsJSX(\n group: CardGroup,\n analysis: GroupAnalysis,\n defaultValueFromSourceNames: Set<string>,\n creatableSelectFieldNames: Set<string>\n): string {\n const indent = ' '\n return group.fields\n .map((f) => {\n if (f.type === 'tabs' && f.tabs) {\n const tabsList = f.tabs\n .map((t) => ` <TabsTrigger value=\"${t.name}\">${t.label}</TabsTrigger>`)\n .join('\\n')\n const tabsContent = f.tabs\n .map((t) => {\n const tabFields = (t.fields || [])\n .map((tf) =>\n generateFieldJSX(tf, ' ', {\n creatableSelectFieldNames,\n defaultValueFromSourceNames\n })\n )\n .join('\\n')\n return ` <TabsContent value=\"${t.name}\" className=\"space-y-6\">\n${tabFields}\n </TabsContent>`\n })\n .join('\\n')\n return `${indent}<Tabs value={activeTab} onValueChange={(value) => void setActiveTab(value as ${toPascalCase(group.varPrefix)}TabValue)} className=\"w-full\">\n <TabsList>\n${tabsList}\n </TabsList>\n${tabsContent}\n${indent}</Tabs>`\n }\n if (analysis.tabFieldNames.has(f.name)) return ''\n return generateFieldJSX(f, indent, {\n creatableSelectFieldNames,\n defaultValueFromSourceNames\n })\n })\n .filter(Boolean)\n .join('\\n')\n}\n\nfunction buildGroupRelState(analysis: GroupAnalysis): string {\n return analysis.relFields\n .map((f) => {\n const relPlural = toPascalCase(pluralize(f.relationship || ''))\n return ` const [${f.name}Open, set${toPascalCase(f.name)}Open] = React.useState(false)\n const { data: ${f.relationship}Data } = use${relPlural}()`\n })\n .filter((v, i, a) => a.indexOf(v) === i)\n .join('\\n')\n}\n\nfunction buildGroupSelectState(fields: SchemaField[]): string {\n return fields\n .map(\n (field) =>\n ` const [${field.name}Open, set${toPascalCase(field.name)}Open] = React.useState(false)`\n )\n .join('\\n')\n}\n\nfunction buildGroupCreatableSelectState(\n fields: SchemaField[],\n schema: Schema,\n Singular: string\n): string {\n return fields\n .map((field) => {\n const fieldPascal = toPascalCase(field.name)\n const staticOptions = (field.options ?? [])\n .map(\n (option) =>\n `{ label: ${JSON.stringify(option.label)}, value: ${JSON.stringify(option.value)} }`\n )\n .join(', ')\n return ` const [${field.name}Open, set${fieldPascal}Open] = React.useState(false)\n const [${field.name}Search, set${fieldPascal}Search] = React.useState('')\n const [create${fieldPascal}OptionPending, startCreate${fieldPascal}OptionTransition] = React.useTransition()\n const { data: ${field.name}CreatedOptions = [] as ${Singular}SelectOption[] } = useQuery<${Singular}SelectOption[]>({\n queryKey: ['${schema.name}', 'select-options', '${field.name}'],\n queryFn: () => get${Singular}SelectOptions('${field.name}')\n })\n const ${field.name}StaticOptions: Array<{ label: string; value: string }> = [${staticOptions}]\n const ${field.name}Options = [\n ...${field.name}StaticOptions,\n ...${field.name}CreatedOptions.filter(\n (createdOption: ${Singular}SelectOption) =>\n !${field.name}StaticOptions.some((option) => option.value === createdOption.value)\n )\n ]`\n })\n .join('\\n')\n}\n\nfunction buildGroupFieldArrayHooks(analysis: GroupAnalysis): string {\n return analysis.listFieldsWithNested\n .map((field) => {\n const pascalFieldName = toPascalCase(field.name)\n return ` const [${field.name}Expanded, set${pascalFieldName}Expanded] = React.useState<string | undefined>(undefined)\n const ${field.name}FieldArray = useFieldArray({\n control: form.control,\n name: '${field.name}'\n })`\n })\n .join('\\n')\n}\n\nfunction buildGroupCreatableSelectHandlers(\n fields: SchemaField[],\n schema: Schema,\n Singular: string,\n defaultValueFromSourceNames: Set<string>\n): string {\n return fields\n .map((field) => {\n const fieldPascal = toPascalCase(field.name)\n const defaultValueFromHandler = defaultValueFromSourceNames.has(field.name)\n ? `applyDefaultValueFrom${fieldPascal}`\n : null\n const setCreatedOptionValue = field.multiple\n ? `const currentValue = form.getValues('${field.name}')\n const selectedValues = Array.isArray(currentValue) ? currentValue : []\n const nextValues = [...new Set([...selectedValues, result.option.value])]\n ${defaultValueFromHandler ? `${defaultValueFromHandler}(nextValues)\\n ` : ''}form.setValue('${field.name}', nextValues, {\n shouldDirty: true,\n shouldValidate: true\n })`\n : `${defaultValueFromHandler ? `${defaultValueFromHandler}(result.option.value)\\n ` : ''}form.setValue('${field.name}', result.option.value, {\n shouldDirty: true,\n shouldValidate: true\n })`\n return ` function handleCreate${fieldPascal}Option(label: string) {\n const trimmedLabel = label.trim()\n if (!trimmedLabel) return\n\n startCreate${fieldPascal}OptionTransition(async () => {\n const result = await create${Singular}SelectOption({\n fieldName: '${field.name}',\n label: trimmedLabel\n })\n\n if (!result.success || !result.option) {\n toast.error(result.error || 'Failed to create option')\n return\n }\n\n await queryClient.invalidateQueries({\n queryKey: ['${schema.name}', 'select-options', '${field.name}']\n })\n ${setCreatedOptionValue}\n set${fieldPascal}Search('')\n set${fieldPascal}Open(false)\n toast.success('Option created')\n })\n }`\n })\n .join('\\n\\n')\n}\n\n// ============================================================================\n// Card component generation\n// ============================================================================\n\nfunction generateCardComponent(\n group: CardGroup,\n schema: Schema,\n analysis: GroupAnalysis,\n allFlatFields: SchemaField[]\n): string {\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n\n const zodFields = buildZodFields(group.flatFields)\n const defaultValues = buildDefaultValues(group.flatFields, 'initialData', allFlatFields)\n const defaultValueFromSourceNames = collectDefaultValueFromSourceNames(group.flatFields)\n const defaultValueFromSyncFunctions = buildDefaultValueFromSyncFunctions(group.flatFields)\n const creatableSelectFields = group.flatFields.filter(\n (field) => field.type === 'select' && field.creatable === true\n )\n const creatableSelectFieldNames = new Set(creatableSelectFields.map((field) => field.name))\n const fieldsJSX = buildGroupFieldsJSX(\n group,\n analysis,\n defaultValueFromSourceNames,\n creatableSelectFieldNames\n )\n const relState = buildGroupRelState(analysis)\n const selectState = buildGroupSelectState(\n analysis.multiSelectFields.filter((field) => field.creatable !== true)\n )\n const creatableSelectState = buildGroupCreatableSelectState(\n creatableSelectFields,\n schema,\n Singular\n )\n const creatableSelectHandlers = buildGroupCreatableSelectHandlers(\n creatableSelectFields,\n schema,\n Singular,\n defaultValueFromSourceNames\n )\n const fieldArrayHooks = buildGroupFieldArrayHooks(analysis)\n const savedValueName = `saved${Singular}`\n const resetValues = buildDefaultValues(group.flatFields, savedValueName, allFlatFields).replace(\n /^ {6}/gm,\n ' '\n )\n\n const descriptionLine = group.description\n ? `\\n <CardDescription>${group.description}</CardDescription>`\n : ''\n const tabField = group.fields.find((field) => field.type === 'tabs')\n const tabNames = tabField?.tabs?.map((tab) => tab.name) ?? []\n const tabParserConst = analysis.hasTabsField\n ? `\nconst ${group.varPrefix}TabValues = [${tabNames.map((name) => JSON.stringify(name)).join(', ')}] as const\nconst ${group.varPrefix}TabParser = parseAsStringLiteral(${group.varPrefix}TabValues).withDefault(${group.varPrefix}TabValues[0])\n\ntype ${toPascalCase(group.varPrefix)}TabValue = (typeof ${group.varPrefix}TabValues)[number]\n`\n : ''\n\n return `const ${group.varPrefix}Schema = z.object({\n${zodFields}\n})\n${tabParserConst}\n\nfunction ${group.componentName}({ initialData }: { initialData?: ${Singular} | null }) {\n const queryClient = useQueryClient()${analysis.hasTabsField ? `\\n const [activeTab, setActiveTab] = useQueryState('tab', ${group.varPrefix}TabParser)` : ''}${relState ? `\\n${relState}` : ''}${creatableSelectState ? `\\n${creatableSelectState}` : ''}${selectState ? `\\n${selectState}` : ''}\n\n const form = useForm<z.infer<typeof ${group.varPrefix}Schema>>({\n resolver: standardSchemaResolver(${group.varPrefix}Schema),\n defaultValues: {\n${defaultValues}\n }\n })\n\n const mutation = useMutation({\n mutationFn: (data: ${Singular}UpsertInput) => upsert${Singular}(data),\n onSuccess: async (result) => {\n const ${savedValueName} = result.${toCamelCase(singular)}\n if (${savedValueName}) {\n form.reset({\n${resetValues}\n })\n }\n toast.success('${group.title} saved')\n void queryClient.invalidateQueries({ queryKey: ['${schema.name}'] })\n },\n onError: (error: Error) => {\n toast.error(error.message || 'Failed to save')\n }\n })\n\n const isPending = mutation.isPending\n${defaultValueFromSyncFunctions ? `\\n${defaultValueFromSyncFunctions}\\n` : ''}\n${fieldArrayHooks ? `\\n${fieldArrayHooks}\\n` : ''}\n${creatableSelectHandlers ? `${creatableSelectHandlers}\\n\\n` : ''}\n return (\n <Form {...form}>\n <form onSubmit={form.handleSubmit((values) => {\n mutation.mutate(values as ${Singular}UpsertInput)\n })}>\n <Card >\n <CardHeader>\n <CardTitle>${group.title}</CardTitle>${descriptionLine}\n </CardHeader>\n <CardContent className=\"space-y-6\">\n${fieldsJSX}\n </CardContent>\n <CardFooter>${group.hint ? `\\n <p className=\"text-sm text-muted-foreground\">${group.hint}</p>` : ''}\n <Button type=\"submit\" disabled={isPending || !form.formState.isDirty} className=\"ml-auto min-w-25\">\n {isPending && <LoaderCircle className=\"animate-spin\" />}\n {isPending ? 'Saving...' : 'Save'}\n </Button>\n </CardFooter>\n </Card>\n </form>\n </Form>\n )\n}`\n}\n\nfunction fieldRendersMainJSXForImports(field: SchemaField): boolean {\n if (field.hidden) return false\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n return field.fields.some(fieldRendersMainJSXForImports)\n }\n if (field.type === 'tabs') return Boolean(field.tabs?.length)\n return true\n}\n\nfunction fieldSupportsIconPostfix(field: SchemaField): boolean {\n return !['group', 'section', 'tabs', 'separator'].includes(field.type)\n}\n\nfunction hasRenderedIconPostfix(fields: SchemaField[]): boolean {\n for (const field of fields) {\n if (field.hidden) continue\n if (field.hasIcon && fieldSupportsIconPostfix(field) && fieldRendersMainJSXForImports(field)) {\n return true\n }\n if ((field.type === 'group' || field.type === 'section') && field.fields) {\n if (hasRenderedIconPostfix(field.fields)) return true\n }\n if (field.type === 'tabs' && field.tabs) {\n for (const tab of field.tabs) {\n if (hasRenderedIconPostfix(tab.fields ?? [])) return true\n }\n }\n }\n return false\n}\n\n// ============================================================================\n// Main generator\n// ============================================================================\n\nexport function generateSingleForm(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): FormGeneratorResult {\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n\n // Filter out auto-generated fields\n const allFormFields = schema.fields.filter(\n (f) =>\n !f.primaryKey &&\n f.name !== 'createdAt' &&\n f.name !== 'updatedAt' &&\n !isAuthorshipFieldName(f.name)\n )\n\n // Parse into card groups\n const cardGroups = parseCardGroups(allFormFields, schema.label)\n\n // --- Global field analysis for imports ---\n const hasBoolean = hasFieldType(schema.fields, 'boolean')\n const hasImage = hasFieldType(schema.fields, 'image')\n const hasVideo = hasFieldType(schema.fields, 'video')\n const hasMedia = hasFieldType(schema.fields, 'media')\n const hasGallery = hasFieldType(schema.fields, 'gallery')\n const hasIcon = hasFieldType(schema.fields, 'icon')\n const hasIconPostfix = hasRenderedIconPostfix(allFormFields)\n const hasDate = hasFieldType(schema.fields, 'date')\n const flatFields = flattenFields(allFormFields)\n const hasMultiSelect = flatFields.some((f) => f.type === 'select' && f.multiple === true)\n const hasCreatableSelect = flatFields.some((f) => f.type === 'select' && f.creatable === true)\n const hasSelectCombobox = hasMultiSelect || hasCreatableSelect\n const hasSelect = flatFields.some(\n (f) => f.type === 'select' && f.multiple !== true && f.creatable !== true\n )\n const hasMarkdown = hasFieldType(schema.fields, 'markdown')\n const hasRichtext = hasFieldType(schema.fields, 'richtext')\n const hasTextarea = hasFieldType(schema.fields, 'text')\n const hasSeparator = hasFieldType(schema.fields, 'separator')\n const hasRelationship = hasFieldType(schema.fields, 'relationship')\n const hasTabsField = cardGroups.some((group) => analyzeGroup(group.fields).hasTabsField)\n const hasList = hasFieldType(schema.fields, 'list')\n const hasNestedList = cardGroups.some(\n (g) => analyzeGroup(g.fields).listFieldsWithNested.length > 0\n )\n const hasSimpleList =\n hasList && flatFields.some((f) => f.type === 'list' && (!f.fields || f.fields.length === 0))\n\n // Global relationship hooks for imports\n const allRelFields: SchemaField[] = []\n for (const g of cardGroups) {\n const a = analyzeGroup(g.fields)\n for (const rf of a.relFields) {\n if (!allRelFields.some((e) => e.relationship === rf.relationship)) {\n allRelFields.push(rf)\n }\n }\n }\n\n const needsReact = allRelFields.length > 0 || hasNestedList || hasSelectCombobox\n\n // --- Build imports ---\n const uiImports = buildUiImports({\n hasBoolean,\n hasTextarea,\n hasImage,\n hasVideo,\n hasMedia,\n hasGallery,\n hasIcon,\n hasIconPostfix,\n hasDate,\n hasMarkdown,\n hasRichtext,\n hasSeparator,\n hasSelect,\n hasSelectCombobox,\n hasCreatableSelect,\n hasMultiSelect,\n hasTabsField,\n hasRelationship,\n hasSimpleList,\n hasNestedList\n })\n\n // Add Card imports\n const cardImportIndex = uiImports.indexOf(\"import { Card } from '@admin/components/ui/card'\")\n if (cardImportIndex !== -1) {\n uiImports.splice(cardImportIndex, 1)\n }\n uiImports.push(`import {\n Card,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle\n} from '@admin/components/ui/card'`)\n\n // Lucide icons\n const lucideIcons: string[] = ['LoaderCircle']\n if (hasRelationship || hasSelectCombobox) lucideIcons.push('Check', 'ChevronsUpDown')\n if (hasCreatableSelect) lucideIcons.push('Plus')\n if (hasNestedList) {\n if (!lucideIcons.includes('Plus')) lucideIcons.push('Plus')\n if (!lucideIcons.includes('X')) lucideIcons.push('X')\n }\n\n // Relationship hook imports\n const relHookImports = allRelFields\n .map((f) => {\n const relPlural = toPascalCase(pluralize(f.relationship || ''))\n return `import { use${relPlural} } from '@admin/hooks/use-${f.relationship}'`\n })\n .filter((v, i, a) => a.indexOf(v) === i)\n .join('\\n')\n\n // --- Generate per-group card components ---\n const cardComponents = cardGroups.map((group) => {\n const analysis = analyzeGroup(group.fields)\n return generateCardComponent(group, schema, analysis, flatFields)\n })\n\n // --- Generate parent component ---\n const cardRenders = cardGroups\n .map((g) => ` <${g.componentName} initialData={initialData} />`)\n .join('\\n')\n\n // --- Assemble file ---\n const content = `'use client'\n${needsReact ? \"\\nimport * as React from 'react'\" : ''}\nimport { standardSchemaResolver } from '@hookform/resolvers/standard-schema'\nimport { useMutation, ${hasCreatableSelect ? 'useQuery, ' : ''}useQueryClient } from '@tanstack/react-query'${lucideIcons.length > 0 ? `\\nimport { ${lucideIcons.join(', ')} } from 'lucide-react'` : ''}\nimport {${hasNestedList ? ' useFieldArray,' : ''} useForm } from 'react-hook-form'\nimport { toast } from 'sonner'\nimport { z } from 'zod/v3'${hasTabsField ? \"\\nimport { parseAsStringLiteral, useQueryState } from 'nuqs'\" : ''}${hasRelationship || hasSelectCombobox ? \"\\nimport { cn } from '@admin/utils/shared/cn'\" : ''}\n${relHookImports ? `${relHookImports}\\n` : ''}${uiImports.join('\\n')}\nimport type {\n ${Singular},\n ${hasCreatableSelect ? `${Singular}SelectOption,\\n ` : ''}${Singular}UpsertInput\n} from '@admin/actions/${actionImportPath}'\nimport { ${hasCreatableSelect ? `create${Singular}SelectOption, get${Singular}SelectOptions, ` : ''}upsert${Singular} } from '@admin/actions/${actionImportPath}'\n\n${cardComponents.join('\\n\\n')}\n\ninterface ${Singular}FormProps {\n initialData?: ${Singular} | null\n}\n\nexport function ${Singular}Form({ initialData }: ${Singular}FormProps) {\n return (\n <div className=\"space-y-6\">\n${cardRenders}\n </div>\n )\n}\n`\n\n return {\n files: [createGeneratedFile(`${pagesDir}/${schema.name}/${schema.name}-form.tsx`, content)]\n }\n}\n","/**\n * Generator 3: React Query hook — admin/hooks/use-<n>.ts\n * Generates client-side data fetching hooks wrapping server actions\n */\n\nimport { flattenFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { pluralize, singularize, toCamelCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { resolveEntityFilters } from '@next-adapter/generators/entity-filters.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface HookGeneratorResult {\n files: GeneratedFile[]\n hookName: string\n}\n\n/**\n * Generate React Query hook for an entity — writes to admin/hooks/use-<n>.ts\n */\nexport function generateHook(\n schema: Schema,\n hooksDir: string,\n options: GeneratorOptions = {}\n): HookGeneratorResult {\n const hookFileName = `use-${schema.name}.ts`\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const Plural = toPascalCase(plural)\n\n // Check if schema has a slug field\n const dbFields = flattenFields(schema.fields)\n const hasSlugField = dbFields.some((f) => f.name === 'slug')\n const hasHtmlOutput = dbFields.some(\n (f) => (f.type === 'richtext' || f.type === 'markdown') && f.output === 'html'\n )\n\n const resolvedFilters = resolveEntityFilters(schema).map((filter) => ({\n ...filter,\n variableName: toCamelCase(filter.key),\n pascalName: toPascalCase(filter.key),\n fromVariableName: `${toCamelCase(filter.key)}From`,\n toVariableName: `${toCamelCase(filter.key)}To`\n }))\n const hasFilters = resolvedFilters.length > 0\n\n // --- Build imports from actions ---\n const actionImports: string[] = [`get${Plural}`, `get${Singular}ById`]\n if (hasSlugField) actionImports.push(`get${Singular}BySlug`)\n if (hasFilters) {\n for (const filter of resolvedFilters) {\n if (filter.source === 'distinct') {\n actionImports.push(`getDistinct${Plural}${filter.pascalName}`)\n }\n }\n }\n const typeImports = [\n `type ${Singular}`,\n ...(hasHtmlOutput && hasSlugField ? [`type ${Singular}View`] : []),\n `type ${Plural}Page`,\n `type ${Plural}Query`\n ]\n\n // --- Build filter parameters ---\n const filterParams = hasFilters\n ? resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [`${filter.fromVariableName}?: string`, `${filter.toVariableName}?: string`]\n : [`${filter.variableName}?: string`]\n )\n .join(', ')\n : ''\n const paginationParams =\n \"page?: number, pageSize?: number, orderBy?: string, orderDirection?: 'asc' | 'desc'\"\n const allParams = filterParams\n ? `search?: string, ${filterParams}, ${paginationParams}`\n : `search?: string, ${paginationParams}`\n\n // --- Build query key with all filter params + pagination ---\n const queryKeyParts = [\n \"search ?? ''\",\n ...(hasFilters\n ? resolvedFilters.flatMap((filter) =>\n filter.type === 'date-range'\n ? [`${filter.fromVariableName} ?? ''`, `${filter.toVariableName} ?? ''`]\n : [`${filter.variableName} ?? ''`]\n )\n : []),\n 'safePage',\n 'safePageSize',\n \"orderBy ?? ''\",\n \"orderDirection ?? ''\"\n ].join(', ')\n\n // --- Build filters object in queryFn ---\n const paginationBlock = ` if (safePageSize !== -1) {\n filters.limit = safePageSize\n filters.offset = safePage * safePageSize\n }\n if (orderBy) filters.orderBy = orderBy\n if (orderDirection) filters.orderDirection = orderDirection`\n\n const filtersBody = hasFilters\n ? `const filters: ${Plural}Query = {}\n if (search) filters.search = search\n${resolvedFilters\n .map((filter) => {\n if (filter.builtIn === 'status') {\n return ` if (status === 'published') filters.published = true\n if (status === 'draft') filters.published = false`\n }\n\n if (filter.type === 'date-range') {\n return ` if (${filter.fromVariableName}) filters.${filter.field}From = ${filter.fromVariableName}\n if (${filter.toVariableName}) filters.${filter.field}To = ${filter.toVariableName}`\n }\n\n if (filter.type === 'boolean') {\n return ` if (${filter.variableName} === 'true') filters.${filter.field} = true\n if (${filter.variableName} === 'false') filters.${filter.field} = false`\n }\n\n return ` if (${filter.variableName}) filters.${filter.field} = ${filter.variableName}`\n })\n .join('\\n')}\n${paginationBlock}\n return get${Plural}(Object.keys(filters).length > 0 ? filters : undefined)`\n : `const filters: ${Plural}Query = {}\n if (search) filters.search = search\n${paginationBlock}\n return get${Plural}(Object.keys(filters).length > 0 ? filters : undefined)`\n\n // --- Singular hook ---\n const singularHook = `\nexport function use${Singular}(id: string | null | undefined): UseQueryResult<${Singular} | null, Error> {\n return useQuery({\n queryKey: ['${singular}', id],\n queryFn: () => (id ? get${Singular}ById(id) : Promise.resolve(null)),\n enabled: !!id,\n })\n}`\n\n // --- Slug hook ---\n const slugReturnType = hasHtmlOutput ? `${Singular}View` : `${Singular}`\n const slugHook = hasSlugField\n ? `\n\nexport function use${Singular}BySlug(slug: string | null | undefined): UseQueryResult<${slugReturnType} | null, Error> {\n return useQuery({\n queryKey: ['${singular}', 'slug', slug],\n queryFn: () => (slug ? get${Singular}BySlug(slug) : Promise.resolve(null)),\n enabled: !!slug,\n })\n}`\n : ''\n\n // --- Distinct filter hooks ---\n const distinctHooks = hasFilters\n ? resolvedFilters\n .filter((filter) => filter.source === 'distinct')\n .map(\n (filter) => `\n\nexport function use${Plural}Distinct${filter.pascalName}(): UseQueryResult<string[], Error> {\n return useQuery({\n queryKey: ['${plural}', 'distinct', '${filter.key}'],\n queryFn: () => getDistinct${Plural}${filter.pascalName}()\n })\n}`\n )\n .join('')\n : ''\n\n // --- Assemble file ---\n const content = `import {\n ${[...actionImports, ...typeImports].join(',\\n ')}\n} from '@admin/actions/${actionImportPath}'\nimport { type UseQueryResult, useQuery } from '@tanstack/react-query'\n\nexport function use${Plural}(\n ${allParams ? `${allParams},` : ''}\n options?: { enabled?: boolean }\n): UseQueryResult<${Plural}Page, Error> {\n const safePage = Number.isFinite(page ?? 0) && (page ?? 0) > 0 ? (page ?? 0) : 0\n const safePageSize = pageSize === -1 || (Number.isFinite(pageSize ?? 20) && (pageSize ?? 20) > 0) ? (pageSize ?? 20) : 20\n\n return useQuery({\n queryKey: ['${plural}', ${queryKeyParts}],\n queryFn: () => {\n ${filtersBody}\n },\n enabled: options?.enabled ?? true,\n })\n}\n${singularHook}${slugHook}${distinctHooks}\n`\n\n return {\n files: [createGeneratedFile(`${hooksDir}/${hookFileName}`, content)],\n hookName: `use${Plural}`\n }\n}\n\n/**\n * Generate React Query hook for a single (singleton) schema.\n * Only useXxx() query — no list, slug, or filter hooks.\n */\nexport function generateSingleHook(\n schema: Schema,\n hooksDir: string,\n options: GeneratorOptions = {}\n): HookGeneratorResult {\n const hookFileName = `use-${schema.name}.ts`\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n\n const content = `import {\n get${Singular},\n type ${Singular}\n} from '@admin/actions/${actionImportPath}'\nimport { type UseQueryResult, useQuery } from '@tanstack/react-query'\n\ninterface Use${Singular}Options {\n initialData?: ${Singular} | null\n}\n\nexport function use${Singular}(options: Use${Singular}Options = {}): UseQueryResult<${Singular} | null, Error> {\n return useQuery({\n queryKey: ['${schema.name}'],\n queryFn: () => get${Singular}(),\n staleTime: Number.POSITIVE_INFINITY,\n gcTime: Number.POSITIVE_INFINITY,\n ...(options.initialData !== undefined ? { initialData: options.initialData } : {}),\n })\n}\n`\n\n return {\n files: [createGeneratedFile(`${hooksDir}/${hookFileName}`, content)],\n hookName: `use${Singular}`\n }\n}\n","/**\n * Generator 11: Navigation — emit per-schema extract under admin/data/navigation/\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase } from '@core-engine/utils/string.js'\n\nconst NO_NAV_SCHEMAS = new Set(['settings'])\n\nexport interface NavigationGeneratorResult {\n files: GeneratedFile[]\n}\n\nfunction buildNavigationItem(schema: Schema, adminRoutePath: string): string {\n const lines = [\n ` label: '${schema.label}'`,\n ` href: '${adminRoutePath}/${schema.name}'`,\n ` icon: ${schema.icon}`\n ]\n\n if (schema.navGroup) {\n lines.push(` group: '${schema.navGroup.label}'`)\n if (schema.navGroup.icon) {\n lines.push(` groupIcon: ${schema.navGroup.icon}`)\n }\n if (schema.navGroup.position != null) {\n lines.push(` groupPosition: ${schema.navGroup.position}`)\n }\n }\n\n if (schema.navPosition != null) {\n lines.push(` position: ${schema.navPosition}`)\n }\n\n return ` {\\n${lines.join(',\\n')}\\n }`\n}\n\nexport function updateNavigation(\n schema: Schema,\n navigationDir: string,\n options: GeneratorOptions = {}\n): NavigationGeneratorResult {\n if (NO_NAV_SCHEMAS.has(schema.name)) {\n return { files: [] }\n }\n\n const adminRoutePath = options.adminRoutePath ?? '/admin'\n\n const imports = new Set<string>([schema.icon])\n if (schema.navGroup?.icon) {\n imports.add(schema.navGroup.icon)\n }\n\n const content = `import type { AdminNavigationItem } from '@admin/types/navigation'\nimport { ${Array.from(imports).sort().join(', ')} } from 'lucide-react'\n\nexport const ${toCamelCase(schema.name)}Nav: AdminNavigationItem[] = [\n${buildNavigationItem(schema, adminRoutePath)}\n]\n`\n\n return {\n files: [createGeneratedFile(`${navigationDir}/${schema.name}.ts`, content)]\n }\n}\n","/**\n * Generator 7: Page (server) — (authenticated)/<n>/page.tsx\n * Generates the server page component that renders columns + page content\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { pluralize, toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface PageGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate server page component for entity list view\n */\nexport function generatePage(\n schema: Schema,\n pagesDir: string,\n _options: GeneratorOptions = {}\n): PageGeneratorResult {\n const plural = pluralize(schema.name)\n const Plural = toPascalCase(plural)\n const kebabPlural = toKebabCase(plural)\n\n const content = `import { getSetting } from '@admin/actions/settings'\nimport * as React from 'react'\nimport { columns } from './columns'\nimport { ${Plural}PageContent } from './${kebabPlural}-page-content'\nimport { ${Plural}PageSkeleton } from './${kebabPlural}-page-skeleton'\n\nexport default async function ${Plural}Page() {\n const initialSettings = await getSetting()\n\n return (\n <React.Suspense fallback={<${Plural}PageSkeleton />}>\n <${Plural}PageContent columns={columns} initialSettings={initialSettings} />\n </React.Suspense>\n )\n}\n`\n const skeletonContent = `export function ${Plural}PageSkeleton() {\n return (\n <div className=\"flex items-center justify-center h-48\">\n <div className=\"text-muted-foreground\">Loading ${schema.label}...</div>\n </div>\n )\n}\n`\n\n return {\n files: [\n createGeneratedFile(`${pagesDir}/${schema.name}/page.tsx`, content),\n createGeneratedFile(\n `${pagesDir}/${schema.name}/${kebabPlural}-page-skeleton.tsx`,\n skeletonContent\n )\n ]\n }\n}\n","/**\n * Generator 6: Page content — (authenticated)/<n>/<n>-page-content.tsx\n * Generates client component with search, filters, bulk delete, sort order dialog, and table\n */\n\nimport { flattenFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport {\n pluralize,\n singularize,\n singularizeLabel,\n toCamelCase,\n toKebabCase,\n toPascalCase\n} from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { buildEntityDevModeIntegration } from '@next-adapter/generators/dev-mode-integration.js'\nimport { resolveEntityFilters } from '@next-adapter/generators/entity-filters.js'\n\nfunction formatSelectOptions(options: { label: string; value: string }[]): string {\n return `[${options\n .map(\n (option) =>\n `{ \"label\": ${JSON.stringify(option.label)}, \"value\": ${JSON.stringify(option.value)} }`\n )\n .join(', ')}]`\n}\n\nfunction formatPropertyAccess(objectName: string, key: string): string {\n return /^[A-Za-z_$][\\w$]*$/.test(key)\n ? `${objectName}.${key}`\n : `${objectName}[${JSON.stringify(key)}]`\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface PageContentGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate page content component for entity list view\n */\nexport function generatePageContent(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): PageContentGeneratorResult {\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const Plural = toPascalCase(plural)\n const camelPlural = toCamelCase(plural)\n const fileName = `${toKebabCase(plural)}-page-content.tsx`\n const adminRoutePath = options.adminRoutePath ?? '/admin'\n const devModeIntegration = buildEntityDevModeIntegration(\n schema,\n options.adminDir ?? 'admin',\n actionImportPath,\n options.adminImportAlias\n )\n const hasCreate = schema.actions?.create ?? false\n const hasDelete = schema.actions?.delete ?? false\n const resolvedFilters = resolveEntityFilters(schema).map((filter) => ({\n ...filter,\n variableName: toCamelCase(filter.key),\n pascalName: toPascalCase(filter.key),\n fromVariableName: `${toCamelCase(filter.key)}From`,\n toVariableName: `${toCamelCase(filter.key)}To`\n }))\n const hasFilters = resolvedFilters.length > 0\n const distinctFilters = resolvedFilters.filter((filter) => filter.source === 'distinct')\n\n // --- Build title field fallback for sort order dialog labels ---\n const flatFields = flattenFields(schema.fields || [])\n const fieldNames = new Set(flatFields.map((f) => f.name))\n const labelParts: string[] = []\n if (fieldNames.has('title')) labelParts.push('item.title as string')\n if (fieldNames.has('name')) labelParts.push('item.name as string')\n labelParts.push('String(item.id)')\n const labelExpr =\n labelParts.length === 1\n ? labelParts[0]\n : `(${labelParts.slice(0, -1).join(' || ')} || ${labelParts[labelParts.length - 1]})`\n\n const lucideIcons: string[] = ['GripVertical']\n\n // --- Hook imports (only for distinct filters) ---\n const hookImportNames: string[] = []\n if (distinctFilters.length > 0) {\n for (const filter of distinctFilters) {\n hookImportNames.push(`use${Plural}Distinct${filter.pascalName}`)\n }\n }\n\n let imports = `'use client'\n\nimport type { Setting } from '@admin/actions/settings'\nimport { useIsFetching, useQuery, useQueryClient } from '@tanstack/react-query'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { ${lucideIcons.join(', ')} } from 'lucide-react'\n${hasCreate ? \"import Link from 'next/link'\\n\" : ''}import { parseAsInteger, parseAsString${hasFilters ? ', useQueryStates' : ''}${hasDelete ? ', parseAsArrayOf' : ''}, useQueryState } from 'nuqs'\nimport * as React from 'react'\nimport { toast } from 'sonner'\n${hasFilters ? \"import { EntityFiltersBar } from '@admin/components/shared/entity-filters-bar'\\n\" : ''}import { SortOrderDialog } from '@admin/components/shared/sort-order-dialog'\nimport { PageHeader } from '@admin/components/shared/page-header'\nimport { Button } from '@admin/components/ui/button'\nimport { ${devModeIntegration.buttonExportName} } from '${devModeIntegration.buttonImportPath}'\n`\n\n if (hasDelete) {\n imports += `import { DeleteDialog } from '@admin/components/shared/delete-dialog'\n`\n }\n\n if (hookImportNames.length > 0) {\n imports += `import {\n ${hookImportNames.join(',\\n ')}\n} from '@admin/hooks/use-${schema.name}'\n`\n }\n\n imports += `import type { ${Singular} } from '@admin/actions/${actionImportPath}'\nimport { get${Plural}, bulkUpdate${Plural}SortOrder } from '@admin/actions/${actionImportPath}'\n${hasDelete ? `import { deleteBulk${Plural} } from '@admin/actions/${actionImportPath}'\\n` : ''}import { ${Plural}Table } from './${toKebabCase(plural)}-table'\n`\n\n const filterStateLogic = hasFilters\n ? ` const filterParsers = {\n${resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [\n ` '${filter.key}From': parseAsString.withDefault('')`,\n ` '${filter.key}To': parseAsString.withDefault('')`\n ]\n : [` '${filter.key}': parseAsString.withDefault('')`]\n )\n .join(',\\n')}\n } as const\n const [filterValues, setFilters] = useQueryStates(filterParsers)\n${resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [\n ` const ${filter.fromVariableName} = ${formatPropertyAccess('filterValues', `${filter.key}From`)}`,\n ` const ${filter.toVariableName} = ${formatPropertyAccess('filterValues', `${filter.key}To`)}`\n ]\n : [` const ${filter.variableName} = ${formatPropertyAccess('filterValues', filter.key)}`]\n )\n .join('\\n')}\n${resolvedFilters\n .map((filter) =>\n filter.source === 'distinct'\n ? ` const { data: ${filter.variableName}Options } = use${Plural}Distinct${filter.pascalName}()`\n : ''\n )\n .filter(Boolean)\n .join('\\n')}\n`\n : ''\n\n const filterOptionsLogic = resolvedFilters\n .map((filter) => {\n if (filter.type === 'date-range') {\n return ''\n }\n\n if (filter.source === 'distinct') {\n return ` const ${filter.variableName}SelectOptions = (${filter.variableName}Options ?? []).map((option) => ({\n label: option,\n value: option\n }))`\n }\n\n return ` const ${filter.variableName}SelectOptions = ${formatSelectOptions(filter.options)}`\n })\n .filter(Boolean)\n .join('\\n')\n\n const clearFilterObject = resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [` '${filter.key}From': null`, ` '${filter.key}To': null`]\n : [` '${filter.key}': null`]\n )\n .join(',\\n')\n\n const activeFilterCountExpr = `[search${resolvedFilters\n .map((filter) =>\n filter.type === 'date-range'\n ? `, (${filter.fromVariableName} || ${filter.toVariableName})`\n : `, ${filter.variableName}`\n )\n .join('')}].filter(Boolean).length`\n\n const filterConfigEntries = hasFilters\n ? resolvedFilters\n .map((filter) => {\n if (filter.type === 'date-range') {\n return ` { key: '${filter.key}', label: '${filter.label}', type: 'date-range' as const, from: ${filter.fromVariableName}, to: ${filter.toVariableName} }`\n }\n return ` { key: '${filter.key}', label: '${filter.label}', type: 'select' as const, value: ${filter.variableName}, options: ${filter.variableName}SelectOptions }`\n })\n .join(',\\n')\n : ''\n\n const deleteLogic = hasDelete\n ? `\n const [selectedIds, setSelectedIds] = useQueryState(\n 'selected',\n parseAsArrayOf(parseAsString).withDefault([])\n )\n const [isPending, startTransition] = React.useTransition()\n\n const handleBulkDelete = () => {\n startTransition(async () => {\n try {\n const result = await deleteBulk${Plural}(selectedIds)\n\n if (result.success) {\n toast.success(\n \\`\\${selectedIds.length} ${singular}\\${selectedIds.length > 1 ? 's' : ''} deleted successfully\\`\n )\n queryClient.refetchQueries({ queryKey: ['${plural}'] })\n void setSelectedIds([])\n } else {\n toast.error(result.error || 'Failed to delete ${plural}')\n }\n } catch (error) {\n toast.error('An error occurred')\n console.error(error)\n }\n })\n }\n`\n : ''\n\n const sortOrderLogic = `\n const [sortDialogOpen, setSortDialogOpen] = React.useState(false)\n const { data: sortOrderSummary } = useQuery({\n queryKey: ['${plural}', 'sort-order-summary'],\n queryFn: () => get${Plural}({ limit: 1, offset: 0 })\n })\n const sortOrderTotalRows = sortOrderSummary?.total ?? 0\n\n const fetchSortPage = React.useCallback(\n async (offset: number, limit: number) => {\n const result = await get${Plural}({ limit, offset })\n return {\n items: (result.${camelPlural} ?? []).map((item) => ({\n id: item.id,\n label: ${labelExpr}\n })),\n total: result.total\n }\n },\n []\n )\n\n const handleSaveSortOrder = React.useCallback(\n async (updates: { id: string; sortOrder: number }[]) => {\n const result = await bulkUpdate${Plural}SortOrder(updates)\n if (result.success) {\n queryClient.refetchQueries({ queryKey: ['${plural}'] })\n }\n return result\n },\n [queryClient]\n )\n`\n\n const deleteButton = hasDelete\n ? `\n {selectedIds.length > 0 && (\n <DeleteDialog\n count={selectedIds.length}\n entityName=\"${singular}\"\n onConfirm={handleBulkDelete}\n isPending={isPending}\n />\n )}`\n : ''\n\n const createButton = hasCreate\n ? `\n <Button asChild>\n <Link href=\"${adminRoutePath}/${schema.name}/new\">\n Create ${singularizeLabel(schema.label)}\n </Link>\n </Button>`\n : ''\n\n const rearrangeButton = `\n <Button variant=\"outline\" onClick={() => setSortDialogOpen(true)} disabled={sortOrderTotalRows === 0}>\n <GripVertical className=\"size-4\" />\n Rearrange\n </Button>`\n\n const filtersActionsContent = hasDelete\n ? ` <div className=\"flex items-center gap-1\">${deleteButton}${rearrangeButton}\n </div>`\n : ` <div className=\"flex items-center gap-1\">${rearrangeButton}\n </div>`\n\n const filterPropsStr = hasFilters\n ? resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [\n `${filter.fromVariableName}={${filter.fromVariableName}}`,\n `${filter.toVariableName}={${filter.toVariableName}}`\n ]\n : [`${filter.variableName}={${filter.variableName}}`]\n )\n .join(' ')\n : ''\n const allTableProps = filterPropsStr ? `search={search} ${filterPropsStr}` : 'search={search}'\n const tableProps = hasDelete\n ? `columns={columns} selectedIds={selectedIds} setSelectedIds={setSelectedIds} ${allTableProps}`\n : `columns={columns} selectedIds={[]} setSelectedIds={() => {}} ${allTableProps}`\n\n const sortOrderDialog = `\n <SortOrderDialog\n open={sortDialogOpen}\n onOpenChange={setSortDialogOpen}\n queryKey={['${plural}']}\n fetchPage={fetchSortPage}\n onSave={handleSaveSortOrder}\n title=\"Rearrange ${schema.label}\"\n description=\"Drag items to reorder them.\"\n />`\n\n const content = `${imports}\ninterface ${Plural}PageContentProps<TValue> {\n columns: ColumnDef<${Singular}, TValue>[]\n initialSettings?: Setting | null\n}\n\nexport function ${Plural}PageContent<TValue>({\n columns,\n initialSettings\n}: ${Plural}PageContentProps<TValue>) {\n const queryClient = useQueryClient()\n const isSearchFetching = useIsFetching({ queryKey: ['${plural}'] }) > 0\n const [search, setSearch] = useQueryState('q', parseAsString.withDefault(''))\n const [, setPageIndex] = useQueryState('page', parseAsInteger.withDefault(0))\n${filterStateLogic ? `\\n${filterStateLogic}` : ''}${deleteLogic}${sortOrderLogic}\n${filterOptionsLogic ? `${filterOptionsLogic}\\n` : ''} const activeFilterCount = ${activeFilterCountExpr}\n\n const handleSearch = React.useCallback((value: string | null) => {\n React.startTransition(() => {\n void setPageIndex(0)\n void setSearch(value)\n })\n }, [setSearch, setPageIndex])\n\n const handleClearAll = React.useCallback(() => {\n React.startTransition(() => {\n void setPageIndex(0)\n void setSearch(null)\n${\n hasFilters\n ? ` void setFilters({\n${clearFilterObject}\n })`\n : ''\n}\n })\n }, [setSearch, setPageIndex${hasFilters ? ', setFilters' : ''}])\n${\n filterConfigEntries\n ? `\n const filters = [\n${filterConfigEntries}\n ]\n`\n : ''\n}\n return (\n <React.Fragment>\n <PageHeader\n title=\"${schema.label}\"\n actions={\n <div className=\"flex items-center gap-1\">\n <${devModeIntegration.buttonExportName} initialSettings={initialSettings} />\n ${createButton}\n </div>\n }\n />\n${\n hasFilters\n ? `\n <EntityFiltersBar\n filters={filters}\n activeFilterCount={activeFilterCount}\n onFilterChange={(updates) => {\n React.startTransition(() => {\n void setPageIndex(0)\n void setFilters(updates)\n })\n }}\n onClearAll={handleClearAll}\n search={search}\n searchPlaceholder=\"Search ${schema.label.toLowerCase()}...\"\n isPending={isSearchFetching}\n onSearch={handleSearch}\n actions={\n${filtersActionsContent}\n }\n />`\n : `\n <div className=\"flex items-center justify-end\">\n${filtersActionsContent}\n </div>`\n}\n <main className=\"space-y-4 px-4 pb-4 h-full\">\n <${Plural}Table ${tableProps} />${sortOrderDialog}\n </main>\n </React.Fragment>\n )\n}\n`\n\n return {\n files: [\n createGeneratedFile(`${pagesDir}/${schema.name}/${fileName}`, content),\n ...devModeIntegration.files\n ]\n }\n}\n","/**\n * Generator: Single page — (authenticated)/<n>/page.tsx\n * Server component that fetches the singleton record and renders the form.\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { singularize, toPascalCase } from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { buildSingleDevModeIntegration } from '@next-adapter/generators/dev-mode-integration.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface SinglePageGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate server page for a single (singleton) schema.\n * Calls getXxx() and renders XxxForm with initialData (null on first visit).\n */\nexport function generateSinglePage(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): SinglePageGeneratorResult {\n const singular = singularize(schema.name)\n const Singular = toPascalCase(singular)\n const PageName = toPascalCase(schema.name)\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const devModeIntegration = buildSingleDevModeIntegration(\n schema,\n options.adminDir ?? 'admin',\n actionImportPath,\n options.adminImportAlias\n )\n const settingsImport =\n schema.name === 'settings' ? '' : \"import { getSetting } from '@admin/actions/settings'\\n\"\n const dataLoad =\n schema.name === 'settings'\n ? ` const data = await get${Singular}()\n`\n : ` const [data, initialSettings] = await Promise.all([\n get${Singular}(),\n getSetting()\n ])\n`\n const initialSettingsProp =\n schema.name === 'settings' ? 'initialSettings={data}' : 'initialSettings={initialSettings}'\n\n const content = `${settingsImport}import { get${Singular} } from '@admin/actions/${actionImportPath}'\nimport { PageHeader } from '@admin/components/shared/page-header'\nimport { ${devModeIntegration.buttonExportName} } from '${devModeIntegration.buttonImportPath}'\nimport { ${Singular}Form } from './${schema.name}-form'\nimport React from 'react'\n\nexport default async function ${PageName}Page() {\n${dataLoad}\n\n return (\n <React.Fragment>\n <PageHeader\n title=\"${schema.label}\"\n actions={<${devModeIntegration.buttonExportName} ${initialSettingsProp} />}\n />\n <main className=\"container mx-auto max-w-5xl w-full p-4\">\n <${Singular}Form initialData={data} />\n </main>\n </React.Fragment>\n )\n}\n`\n\n return {\n files: [\n createGeneratedFile(`${pagesDir}/${schema.name}/page.tsx`, content),\n ...devModeIntegration.files\n ]\n }\n}\n","/**\n * Generator 5: Table component — (authenticated)/<n>/<n>-table.tsx\n * Generates data table with server-side pagination, sorting, and row selection\n */\n\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport {\n pluralize,\n singularize,\n toCamelCase,\n toKebabCase,\n toPascalCase\n} from '@core-engine/utils/string.js'\nimport { resolveSchemaActionImportPath } from '@next-adapter/config/paths.js'\nimport { resolveEntityFilters } from '@next-adapter/generators/entity-filters.js'\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport interface TableGeneratorResult {\n files: GeneratedFile[]\n}\n\n/**\n * Generate table component for entity list view\n */\nexport function generateTable(\n schema: Schema,\n pagesDir: string,\n options: GeneratorOptions = {}\n): TableGeneratorResult {\n const actionImportPath = resolveSchemaActionImportPath(schema.name, options.outputNamespace)\n const singular = singularize(schema.name)\n const plural = pluralize(schema.name)\n const Singular = toPascalCase(singular)\n const Plural = toPascalCase(plural)\n const camelPlural = toCamelCase(plural)\n const tableFileName = `${toKebabCase(plural)}-table.tsx`\n const adminRoutePath = options.adminRoutePath ?? '/admin'\n const resolvedFilters = resolveEntityFilters(schema).map((filter) => ({\n ...filter,\n variableName: toCamelCase(filter.key),\n fromVariableName: `${toCamelCase(filter.key)}From`,\n toVariableName: `${toCamelCase(filter.key)}To`\n }))\n const hasFilters = resolvedFilters.length > 0\n const filterProps = hasFilters\n ? resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [`${filter.fromVariableName}?: string`, `${filter.toVariableName}?: string`]\n : [`${filter.variableName}?: string`]\n )\n .join('\\n ')\n : ''\n const allFilterProps = filterProps ? `\\n ${filterProps}` : ''\n const filterParams = hasFilters\n ? resolvedFilters\n .flatMap((filter) =>\n filter.type === 'date-range'\n ? [filter.fromVariableName, filter.toVariableName]\n : [filter.variableName]\n )\n .join(', ')\n : ''\n const hookFilterArgs = filterParams ? `search, ${filterParams}` : 'search'\n const hasEdit = schema.actions?.edit ?? false\n\n const content = `'use client'\n\nimport {\n DataTablePagination,\n} from '@admin/components/shared/data-table/data-table-pagination'\nimport {\n type ColumnDef,\n flexRender,\n getCoreRowModel,\n useReactTable\n} from '@tanstack/react-table'\nimport { GripVertical } from 'lucide-react'\nimport { parseAsInteger, parseAsString, useQueryStates } from 'nuqs'\n${hasEdit ? \"import { useRouter } from 'next/navigation'\\n\" : ''}import {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow\n} from '@admin/components/ui/table'\nimport { use${Plural} } from '@admin/hooks/use-${schema.name}'\nimport type { ${Singular} } from '@admin/actions/${actionImportPath}'\nimport { Card, CardContent } from '@admin/components/ui/card'\nimport { useTableUtils } from '@admin/hooks/use-table-utils'\nimport { cn } from '@admin/utils/shared/cn'\n\ninterface ${Plural}TableProps<TValue> extends React.HTMLAttributes<HTMLDivElement> {\n columns: ColumnDef<${Singular}, TValue>[]\n selectedIds: string[]\n setSelectedIds: (ids: string[]) => void\n search?: string${allFilterProps}\n}\n\nexport function ${Plural}Table<TValue>({ columns, selectedIds, setSelectedIds, ${hookFilterArgs}, className }: ${Plural}TableProps<TValue>) {\n const defaultPageSize = 20\n${hasEdit ? ' const router = useRouter()\\n' : ''} const [{\n page: pageIndex,\n size: pageSize,\n sort: sortField,\n dir: sortDir\n }, setTableQuery] = useQueryStates({\n page: parseAsInteger.withDefault(0),\n size: parseAsInteger.withDefault(defaultPageSize),\n sort: parseAsString.withDefault(''),\n dir: parseAsString.withDefault('')\n })\n\n const safePageIndex = Number.isFinite(pageIndex) && pageIndex > 0 ? pageIndex : 0\n const safePageSize = pageSize === -1 || (Number.isFinite(pageSize) && pageSize > 0) ? pageSize : defaultPageSize\n const { data, error, isPending } = use${Plural}(${hookFilterArgs}, safePageIndex, safePageSize, sortField || undefined, (sortDir as 'asc' | 'desc') || undefined)\n\n const tableData = data?.${camelPlural} ?? []\n const totalRows = data?.total ?? 0\n const effectivePageSize = safePageSize === -1 ? totalRows : safePageSize\n const pageCount = effectivePageSize > 0 ? Math.ceil(totalRows / effectivePageSize) : 1\n const shouldShowPagination = totalRows > defaultPageSize\n\n const {\n columnSizing,\n handleColumnSizingChange,\n handlePaginationChange,\n handleRowSelectionChange,\n handleSortingChange,\n hoveredColumnId,\n registerTable,\n resetColumnSizingToContainer,\n rowSelection,\n setHoveredColumnId,\n sorting,\n tableContainerRef\n } = useTableUtils<${Singular}>({\n data: tableData,\n selectedIds,\n onSelectedIdsChange: setSelectedIds,\n pageIndex: safePageIndex,\n pageSize: effectivePageSize,\n setPageIndex: (nextPageIndex) => setTableQuery({ page: nextPageIndex }),\n setSortingParams: ({\n pageIndex: nextPageIndex,\n sortDir: nextSortDir,\n sortField: nextSortField\n }) => setTableQuery({\n page: nextPageIndex,\n sort: nextSortField,\n dir: nextSortDir\n }),\n sortField,\n sortDir\n })\n\n const table = useReactTable({\n data: tableData,\n columns,\n columnResizeMode: 'onChange',\n defaultColumn: {\n minSize: 48,\n size: 220\n },\n getCoreRowModel: getCoreRowModel(),\n manualPagination: true,\n manualSorting: true,\n pageCount,\n rowCount: totalRows,\n onSortingChange: handleSortingChange,\n onColumnSizingChange: handleColumnSizingChange,\n onRowSelectionChange: handleRowSelectionChange,\n onPaginationChange: handlePaginationChange,\n state: {\n sorting,\n columnSizing,\n rowSelection,\n pagination: {\n pageIndex: safePageIndex,\n pageSize: effectivePageSize\n }\n }\n })\n registerTable(table)\n\n return (\n <div\n className={cn(\"flex flex-col gap-6 pt-px pb-2\", {\n \"min-h-[calc(100svh-128px)]\": !shouldShowPagination,\n \"min-h-[calc(100svh-180px)]\": shouldShowPagination\n }, className)}\n >\n <Card className=\"min-h-0 flex-1 p-0\">\n <CardContent ref={tableContainerRef} className=\"flex min-h-0 flex-1 flex-col p-0\">\n <Table containerClassName=\"min-h-0 flex-1\" className=\"table-fixed\" style={{ width: table.getTotalSize() }}>\n <colgroup>\n {table.getVisibleLeafColumns().map((column) => (\n <col key={column.id} style={{ width: column.getSize() }} />\n ))}\n </colgroup>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header, headerIndex) => {\n const meta = header.column.columnDef.meta as Record<string, unknown> | undefined\n const resizeLabel = typeof header.column.columnDef.header === 'string' ? header.column.columnDef.header : header.column.id\n const nextHeader = headerGroup.headers[headerIndex + 1]\n const canResizeColumn = header.column.getCanResize() && nextHeader?.column.getCanResize() === true\n return (\n <TableHead\n key={header.id}\n className={cn('group/resize-header relative overflow-hidden', {\n 'text-center': meta?.align === 'center',\n 'text-right': meta?.align === 'right'\n })}\n data-column-id={header.column.id}\n onMouseEnter={() => setHoveredColumnId(header.column.id)}\n onMouseLeave={() => setHoveredColumnId((current) => (current === header.column.id ? null : current))}\n style={{ width: header.getSize() }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {canResizeColumn ? (\n <button\n type=\"button\"\n aria-label={\\`Resize \\${resizeLabel} column\\`}\n className=\"group/resize-handle absolute right-0 top-0 z-10 flex h-full w-5 cursor-col-resize touch-none select-none items-center justify-center text-muted-foreground opacity-0 transition-opacity hover:text-foreground focus-visible:text-foreground focus-visible:opacity-100 focus-visible:outline-none group-focus-within/resize-header:opacity-100 data-[column-hovered=true]:opacity-100 data-[resizing=true]:opacity-100\"\n data-resize-handle\n data-column-hovered={hoveredColumnId === header.column.id ? 'true' : 'false'}\n data-resizing={header.column.getIsResizing() ? 'true' : 'false'}\n onDoubleClick={resetColumnSizingToContainer}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n >\n <GripVertical aria-hidden=\"true\" className={cn('size-3.5', { 'text-ring': header.column.getIsResizing() })} />\n </button>\n ) : null}\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {isPending ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n <div className=\"text-muted-foreground\">Loading ${schema.label}...</div>\n </TableCell>\n </TableRow>\n ) : error ? (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n <div className=\"text-destructive\">Error loading ${schema.label}: {error.message}</div>\n </TableCell>\n </TableRow>\n ) : table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() ? 'selected' : undefined}${\n hasEdit\n ? `\n className=\"cursor-pointer\"\n onClick={(e) => {\n const target = e.target as HTMLElement\n if (!e.currentTarget.contains(target)) return\n if (target.closest('button, a, input, [role=\"checkbox\"]')) return\n router.push(\\`${adminRoutePath}/${schema.name}/\\${row.original.id}/edit\\`)\n }}`\n : ''\n }\n >\n {row.getVisibleCells().map((cell) => {\n const meta = cell.column.columnDef.meta as Record<string, unknown> | undefined\n return (\n <TableCell\n key={cell.id}\n className={cn({\n 'text-center': meta?.align === 'center',\n 'text-right': meta?.align === 'right'\n })}\n data-column-id={cell.column.id}\n onMouseEnter={() => setHoveredColumnId(cell.column.id)}\n onMouseLeave={() => setHoveredColumnId((current) => (current === cell.column.id ? null : current))}\n style={{ width: cell.column.getSize() }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n No ${schema.label} found.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n {shouldShowPagination ? (\n <DataTablePagination\n table={table}\n paginationMode=\"controlled\"\n pageSize={safePageSize}\n pageIndex={safePageIndex}\n pageCount={pageCount}\n setPageIndex={(nextPageIndex) => setTableQuery({ page: nextPageIndex })}\n setPageSize={(nextPageSize) =>\n setTableQuery({ page: 0, size: nextPageSize })\n }\n />\n ) : null}\n </div>\n )\n}\n`\n\n return {\n files: [createGeneratedFile(`${pagesDir}/${schema.name}/${tableFileName}`, content)]\n }\n}\n","/**\n * Pipeline orchestrator — runs entity and single generation steps in sequence\n */\n\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { getManyToManyFields } from '@core-engine/schema/field-helpers/index.js'\nimport { loadSchema, normalizeSchemaSlotLayout } from '@core-engine/schema/schema-reader.js'\nimport type { GeneratedFile, GeneratorOptions, Schema } from '@core-engine/schema/types.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveExtensionNamespace, resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport { generateActions, generateSingleActions } from '@next-adapter/generators/actions/index.js'\nimport { generateColumns } from '@next-adapter/generators/columns/index.js'\nimport { generateCreatePage } from '@next-adapter/generators/create-page.js'\nimport { generateDatabase } from '@next-adapter/generators/database.js'\nimport { generateEditPage } from '@next-adapter/generators/edit-page.js'\nimport { generateForm, generateSingleForm } from '@next-adapter/generators/form/index.js'\nimport { generateHook, generateSingleHook } from '@next-adapter/generators/hook.js'\nimport { namespaceGeneratedFiles } from '@next-adapter/generators/namespace-output.js'\nimport { updateNavigation } from '@next-adapter/generators/navigation.js'\nimport { generatePage } from '@next-adapter/generators/page.js'\nimport { generatePageContent } from '@next-adapter/generators/page-content.js'\nimport { generateSinglePage } from '@next-adapter/generators/single-page.js'\nimport { generateTable } from '@next-adapter/generators/table.js'\n\nexport interface PipelineResult {\n success: boolean\n files: GeneratedFile[]\n errors: string[]\n}\n\nfunction loadRelationshipSchemas(\n schema: Schema,\n cwd: string,\n schemasDir: string\n): Map<string, Schema> {\n const targets = new Set(\n getManyToManyFields(schema.fields)\n .map((field) => field.relationship)\n .filter((relationship): relationship is string => Boolean(relationship))\n )\n\n const relatedSchemas = new Map<string, Schema>()\n for (const relationship of targets) {\n const loaded = loadSchema(`${cwd}/${schemasDir}`.replace(/\\/+/g, '/'), relationship)\n if (loaded.type === 'form') {\n throw new Error(\n `Relationship \"${schema.name}\" -> \"${relationship}\" cannot target a form schema.`\n )\n }\n relatedSchemas.set(relationship, loaded.schema)\n }\n\n return relatedSchemas\n}\n\n/**\n * Run the full entity generation pipeline.\n */\nexport function runEntityPipeline(\n schema: Schema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n options: GeneratorOptions = {}\n): PipelineResult {\n const normalizedSchema = normalizeSchemaSlotLayout(schema)\n const paths = resolveProjectPaths(config)\n const outputNamespace = resolveExtensionNamespace(normalizedSchema.name, options.outputNamespace)\n const adminNamespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const namespacedOptions = {\n ...options,\n outputNamespace,\n adminDir: paths.adminDir,\n adminRoutePath: adminNamespace.routePath,\n adminImportAlias: adminNamespace.alias\n }\n const files: GeneratedFile[] = []\n const errors: string[] = []\n const relatedSchemas = loadRelationshipSchemas(normalizedSchema, cwd, paths.schemasDir)\n\n const steps: { name: string; run: () => GeneratedFile[] }[] = [\n {\n name: 'Database schema',\n run: () =>\n generateDatabase(normalizedSchema, paths.adminDbDir, namespacedOptions, relatedSchemas)\n .files\n },\n {\n name: 'Server actions',\n run: () =>\n generateActions(normalizedSchema, paths.adminActionsDir, {\n force: options.force,\n nextMajorVersion: config.nextMajorVersion,\n outputNamespace\n }).files\n },\n {\n name: 'React Query hook',\n run: () => generateHook(normalizedSchema, paths.adminHooksDir, namespacedOptions).files\n },\n {\n name: 'Column definitions',\n run: () => generateColumns(normalizedSchema, paths.pagesDir, namespacedOptions).files\n },\n {\n name: 'Table component',\n run: () => generateTable(normalizedSchema, paths.pagesDir, namespacedOptions).files\n },\n {\n name: 'Page content',\n run: () => generatePageContent(normalizedSchema, paths.pagesDir, namespacedOptions).files\n },\n {\n name: 'Page (server)',\n run: () => generatePage(normalizedSchema, paths.pagesDir, namespacedOptions).files\n }\n ]\n\n // Steps 8-10 are conditional on schema.actions\n if (normalizedSchema.actions?.create || normalizedSchema.actions?.edit) {\n steps.push({\n name: 'Form',\n run: () => generateForm(normalizedSchema, paths.pagesDir, namespacedOptions).files\n })\n }\n\n if (normalizedSchema.actions?.create) {\n steps.push({\n name: 'Create page',\n run: () => generateCreatePage(normalizedSchema, paths.pagesDir, namespacedOptions).files\n })\n }\n\n if (normalizedSchema.actions?.edit) {\n steps.push({\n name: 'Edit page',\n run: () => generateEditPage(normalizedSchema, paths.pagesDir, namespacedOptions).files\n })\n }\n\n steps.push({\n name: 'Navigation',\n run: () => updateNavigation(normalizedSchema, paths.adminNavigationDir, namespacedOptions).files\n })\n\n // Execute each step\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]\n const stepNum = i + 1\n try {\n const result = step.run()\n files.push(...result)\n if (!options.silent) console.log(` ${stepNum}. ${step.name} ✓`)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n errors.push(`${step.name}: ${msg}`)\n if (!options.silent) console.error(` ${stepNum}. ${step.name} ✗ — ${msg}`)\n }\n }\n\n return {\n success: errors.length === 0,\n files: namespaceGeneratedFiles(files, config.frameworkConfig.next.namespace),\n errors\n }\n}\n\n/**\n * Run the single (singleton) generation pipeline.\n */\nexport function runSinglePipeline(\n schema: Schema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n options: GeneratorOptions = {}\n): PipelineResult {\n const normalizedSchema = normalizeSchemaSlotLayout(schema)\n const paths = resolveProjectPaths(config)\n const outputNamespace = resolveExtensionNamespace(normalizedSchema.name, options.outputNamespace)\n const adminNamespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const namespacedOptions = {\n ...options,\n outputNamespace,\n adminDir: paths.adminDir,\n adminRoutePath: adminNamespace.routePath,\n adminImportAlias: adminNamespace.alias\n }\n const files: GeneratedFile[] = []\n const errors: string[] = []\n const relatedSchemas = loadRelationshipSchemas(normalizedSchema, cwd, paths.schemasDir)\n\n const steps: { name: string; run: () => GeneratedFile[] }[] = [\n {\n name: 'Database schema',\n run: () =>\n generateDatabase(normalizedSchema, paths.adminDbDir, namespacedOptions, relatedSchemas)\n .files\n },\n {\n name: 'Server actions',\n run: () =>\n generateSingleActions(normalizedSchema, paths.adminActionsDir, {\n force: options.force,\n nextMajorVersion: config.nextMajorVersion,\n outputNamespace\n }).files\n },\n {\n name: 'React Query hook',\n run: () => generateSingleHook(normalizedSchema, paths.adminHooksDir, namespacedOptions).files\n },\n {\n name: 'Form',\n run: () => generateSingleForm(normalizedSchema, paths.pagesDir, namespacedOptions).files\n },\n {\n name: 'Single page',\n run: () => generateSinglePage(normalizedSchema, paths.pagesDir, namespacedOptions).files\n },\n {\n name: 'Navigation',\n run: () =>\n updateNavigation(normalizedSchema, paths.adminNavigationDir, namespacedOptions).files\n }\n ]\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]\n const stepNum = i + 1\n try {\n const result = step.run()\n files.push(...result)\n if (!options.silent) console.log(` ${stepNum}. ${step.name} ✓`)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n errors.push(`${step.name}: ${msg}`)\n if (!options.silent) console.error(` ${stepNum}. ${step.name} ✗ — ${msg}`)\n }\n }\n\n return {\n success: errors.length === 0,\n files: namespaceGeneratedFiles(files, config.frameworkConfig.next.namespace),\n errors\n }\n}\n\n// Re-export individual generators for direct use\nexport { generateActions, generateSingleActions } from '@next-adapter/generators/actions/index.js'\nexport { generateColumns } from '@next-adapter/generators/columns/index.js'\nexport { generateCreatePage } from '@next-adapter/generators/create-page.js'\nexport { generateDatabase } from '@next-adapter/generators/database.js'\nexport { generateEditPage } from '@next-adapter/generators/edit-page.js'\nexport { generateForm, generateSingleForm } from '@next-adapter/generators/form/index.js'\nexport { generateHook, generateSingleHook } from '@next-adapter/generators/hook.js'\nexport { updateNavigation } from '@next-adapter/generators/navigation.js'\nexport { generatePage } from '@next-adapter/generators/page.js'\nexport { generatePageContent } from '@next-adapter/generators/page-content.js'\nexport { generateSinglePage } from '@next-adapter/generators/single-page.js'\nexport { generateTable } from '@next-adapter/generators/table.js'\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { resolveCliAssetPath } from '@core-engine/utils/cli-root.js'\nimport type { BetterstartPluginId } from '@plugin-engine/types.js'\n\nexport function pluginTemplateRoot(pluginId: BetterstartPluginId): string {\n return resolveCliAssetPath('adapters', 'next', 'plugins', pluginId)\n}\n\nexport function readPluginTemplate(pluginId: BetterstartPluginId, relativePath: string): string {\n return fs.readFileSync(path.join(pluginTemplateRoot(pluginId), relativePath), 'utf-8')\n}\n\nexport function listPluginSchemaTemplatePaths(pluginId: BetterstartPluginId): string[] {\n const schemasDir = path.join(pluginTemplateRoot(pluginId), 'schemas')\n if (!fs.existsSync(schemasDir)) {\n return []\n }\n\n return fs\n .readdirSync(schemasDir)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport type { FormSchema, GeneratedFile, Schema } from '@core-engine/schema/types.js'\nimport {\n buildRenamePlanAliasMap,\n type RenamePlan,\n transformContentForRenamePlan\n} from '@core-engine/snapshots/ast-substitution.js'\nimport {\n deleteProjectFile,\n mergeGeneratedFile,\n readProjectFile,\n writeProjectFile\n} from '@core-engine/snapshots/merge.js'\nimport {\n createManifest,\n getCurrentCliVersion,\n loadManifest,\n saveManifest,\n snapshotTargetPath,\n writeSnapshotFiles\n} from '@core-engine/snapshots/store.js'\nimport { sortGeneratedFiles } from '@core-engine/utils/generated-files.js'\nimport { reconstructSnapshotFiles } from '@next-adapter/snapshots/reconstruct.js'\n\nfunction normalize(content: string): string {\n return content.replace(/\\r\\n/g, '\\n')\n}\n\nfunction isInteractiveSession(interactive: boolean): boolean {\n return interactive && Boolean(process.stdin.isTTY) && process.env.CI !== 'true'\n}\n\nasync function promptNoBaseDecision(filePath: string): Promise<'overwrite' | 'skip' | 'backup'> {\n const answer = await p.select({\n message: `File already exists without snapshot base: ${filePath}`,\n options: [\n { value: 'backup', label: 'Backup and overwrite', hint: 'recommended' },\n { value: 'overwrite', label: 'Overwrite' },\n { value: 'skip', label: 'Skip' }\n ],\n initialValue: 'backup'\n })\n\n if (p.isCancel(answer)) {\n throw new Error('Generation cancelled.')\n }\n\n return answer as 'overwrite' | 'skip' | 'backup'\n}\n\nfunction writeBackupFile(cwd: string, filePath: string, content: string, suffix = '.bak'): void {\n const backupPath = `${snapshotTargetPath(cwd, filePath)}${suffix}`\n fs.mkdirSync(path.dirname(backupPath), { recursive: true })\n fs.writeFileSync(backupPath, content, 'utf-8')\n}\n\nexport interface ApplyGeneratedFilesOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n scope: string\n schemaJson: Schema | FormSchema | { name: string }\n generatedFiles: GeneratedFile[]\n force: boolean\n interactive: boolean\n renamePlan?: RenamePlan\n}\n\nexport interface ApplyGeneratedFilesSummary {\n writtenFresh: string[]\n overwritten: string[]\n mergedCleanly: string[]\n conflictPaths: string[]\n orphanedKept: string[]\n orphanedDeleted: string[]\n skipped: string[]\n skippedCleared: string[]\n tombstoneCleared?: string\n}\n\nexport async function applyGeneratedFiles({\n cwd,\n config,\n scope,\n schemaJson,\n generatedFiles,\n force,\n interactive,\n renamePlan\n}: ApplyGeneratedFilesOptions): Promise<ApplyGeneratedFilesSummary> {\n const manifest = loadManifest(cwd, scope)\n const summary: ApplyGeneratedFilesSummary = {\n writtenFresh: [],\n overwritten: [],\n mergedCleanly: [],\n conflictPaths: [],\n orphanedKept: [],\n orphanedDeleted: [],\n skipped: [],\n skippedCleared: []\n }\n\n const remoteFiles = sortGeneratedFiles(generatedFiles)\n const remotePaths = new Set(remoteFiles.map((file) => file.path))\n const skipped = new Set(force ? [] : (manifest?.skipped ?? []))\n const interactiveSession = isInteractiveSession(interactive)\n const aliasMap = renamePlan ? buildRenamePlanAliasMap(renamePlan) : new Map<string, string>()\n const consumedBasePaths = new Set<string>()\n\n let baseFiles = new Map<string, GeneratedFile>()\n let mismatchedPaths = new Set<string>()\n let trackedBasePaths = new Set<string>()\n if (manifest) {\n const reconstructed = reconstructSnapshotFiles(cwd, config, manifest)\n baseFiles = new Map(reconstructed.files.map((file) => [file.path, file]))\n mismatchedPaths = new Set(reconstructed.mismatchedPaths)\n trackedBasePaths = new Set(reconstructed.trackedPaths)\n }\n\n for (const file of remoteFiles) {\n if (skipped.has(file.path) && !force) {\n continue\n }\n\n if (force) {\n const localContent = readProjectFile(cwd, file.path)\n writeProjectFile(cwd, file)\n if (localContent == null) {\n summary.writtenFresh.push(file.path)\n } else if (normalize(localContent) !== normalize(file.content)) {\n summary.overwritten.push(file.path)\n }\n continue\n }\n\n const aliasPath = aliasMap.get(file.path)\n let baseFile = baseFiles.get(file.path)\n let localContent = readProjectFile(cwd, file.path)\n let aliasedLocalPath: string | null = null\n\n if (!baseFile && aliasPath && !mismatchedPaths.has(aliasPath)) {\n const aliasedBase = baseFiles.get(aliasPath)\n if (aliasedBase) {\n const transformedBase = renamePlan\n ? transformContentForRenamePlan(aliasedBase.content, aliasPath, renamePlan, file.path)\n : null\n\n if (!transformedBase?.parseFailed) {\n baseFile = {\n path: file.path,\n content: transformedBase ? transformedBase.content : aliasedBase.content\n }\n consumedBasePaths.add(aliasPath)\n }\n }\n }\n\n if (baseFile && localContent == null && aliasPath) {\n const aliasedLocal = readProjectFile(cwd, aliasPath)\n if (aliasedLocal != null) {\n const transformedLocal = renamePlan\n ? transformContentForRenamePlan(aliasedLocal, aliasPath, renamePlan, file.path)\n : null\n\n if (!transformedLocal?.parseFailed) {\n localContent = transformedLocal ? transformedLocal.content : aliasedLocal\n aliasedLocalPath = aliasPath\n }\n }\n }\n\n if (baseFile && renamePlan && baseFile.path === file.path) {\n const transformedBase = transformContentForRenamePlan(baseFile.content, file.path, renamePlan)\n if (!transformedBase.parseFailed) {\n baseFile = {\n path: file.path,\n content: transformedBase.content\n }\n }\n }\n\n if (localContent != null && renamePlan && !aliasedLocalPath) {\n const transformedLocal = transformContentForRenamePlan(localContent, file.path, renamePlan)\n if (!transformedLocal.parseFailed) {\n localContent = transformedLocal.content\n }\n }\n\n if (localContent == null) {\n writeProjectFile(cwd, file)\n summary.writtenFresh.push(file.path)\n continue\n }\n\n if (!baseFile || mismatchedPaths.has(file.path)) {\n const decision = force\n ? 'overwrite'\n : interactiveSession\n ? await promptNoBaseDecision(file.path)\n : 'backup'\n\n if (decision === 'skip') {\n skipped.add(file.path)\n summary.skipped.push(file.path)\n continue\n }\n\n if (decision === 'backup') {\n writeBackupFile(cwd, file.path, localContent)\n }\n\n writeProjectFile(cwd, file)\n if (aliasedLocalPath) {\n deleteProjectFile(cwd, aliasedLocalPath)\n }\n summary.writtenFresh.push(file.path)\n continue\n }\n\n if (normalize(localContent) === normalize(file.content)) {\n if (aliasedLocalPath) {\n writeProjectFile(cwd, file)\n deleteProjectFile(cwd, aliasedLocalPath)\n }\n continue\n }\n\n if (normalize(localContent) === normalize(baseFile.content)) {\n writeProjectFile(cwd, file)\n if (aliasedLocalPath) {\n deleteProjectFile(cwd, aliasedLocalPath)\n }\n summary.mergedCleanly.push(file.path)\n continue\n }\n\n if (normalize(file.content) === normalize(baseFile.content)) {\n if (aliasedLocalPath) {\n writeProjectFile(cwd, {\n path: file.path,\n content: localContent\n })\n deleteProjectFile(cwd, aliasedLocalPath)\n }\n continue\n }\n\n const merged = mergeGeneratedFile(baseFile, localContent, file)\n writeProjectFile(cwd, merged.file)\n if (aliasedLocalPath) {\n deleteProjectFile(cwd, aliasedLocalPath)\n }\n if (merged.conflict) {\n summary.conflictPaths.push(file.path)\n } else {\n summary.mergedCleanly.push(file.path)\n }\n }\n\n const orphanCandidatePaths = Array.from(\n new Set([...trackedBasePaths, ...baseFiles.keys()])\n ).sort()\n\n for (const filePath of orphanCandidatePaths) {\n if (consumedBasePaths.has(filePath)) {\n continue\n }\n\n if (remotePaths.has(filePath)) {\n continue\n }\n\n const localContent = readProjectFile(cwd, filePath)\n if (localContent == null) {\n continue\n }\n\n if (force) {\n deleteProjectFile(cwd, filePath)\n summary.orphanedDeleted.push(filePath)\n continue\n }\n\n const baseFile = baseFiles.get(filePath)\n if (!baseFile) {\n continue\n }\n\n if (normalize(localContent) === normalize(baseFile.content)) {\n deleteProjectFile(cwd, filePath)\n summary.orphanedDeleted.push(filePath)\n } else {\n summary.orphanedKept.push(filePath)\n }\n }\n\n const nextSkipped = Array.from(skipped)\n .filter((filePath) => remotePaths.has(filePath))\n .sort()\n summary.skippedCleared = Array.from(skipped)\n .filter((filePath) => !remotePaths.has(filePath))\n .sort()\n\n const trackedFiles = remoteFiles.filter((file) => !nextSkipped.includes(file.path))\n writeSnapshotFiles(cwd, scope, trackedFiles)\n const nextManifest = createManifest(\n scope,\n schemaJson,\n getCurrentCliVersion(),\n trackedFiles,\n nextSkipped\n )\n saveManifest(cwd, scope, nextManifest)\n\n return summary\n}\n","import { toKebabCase, toPascalCase } from '@core-engine/utils/string.js'\nimport { Node, Project, type SourceFile, type ts } from 'ts-morph'\n\nexport interface FieldRenameSelection {\n before: string\n after: string\n}\n\nexport interface CustomCellRenameSelection {\n before: string\n after: string\n oldPath: string\n newPath: string\n columnsPath: string\n}\n\nexport interface RenamePlan {\n fields: FieldRenameSelection[]\n customCells: CustomCellRenameSelection[]\n}\n\nexport interface RenamePreviewChange {\n path: string\n line: number\n before: string\n after: string\n}\n\nexport interface RenameTransformResult {\n changed: boolean\n content: string\n parseFailed: boolean\n previewChanges: RenamePreviewChange[]\n}\n\ninterface TextEdit {\n start: number\n end: number\n replacement: string\n}\n\nconst project = new Project({\n useInMemoryFileSystem: true,\n skipAddingFilesFromTsConfig: true\n})\n\nfunction escapeForRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction quoteLiteral(value: string, quote: string): string {\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(new RegExp(escapeForRegex(quote), 'g'), `\\\\${quote}`)\n\n return `${quote}${escaped}${quote}`\n}\n\nfunction applyTextEdits(content: string, edits: TextEdit[]): string {\n return edits\n .sort((a, b) => b.start - a.start)\n .reduce(\n (next, edit) => next.slice(0, edit.start) + edit.replacement + next.slice(edit.end),\n content\n )\n}\n\nfunction collectPreviewChanges(\n path: string,\n beforeContent: string,\n afterContent: string\n): RenamePreviewChange[] {\n const beforeLines = beforeContent.split('\\n')\n const afterLines = afterContent.split('\\n')\n const maxLength = Math.max(beforeLines.length, afterLines.length)\n const changes: RenamePreviewChange[] = []\n\n for (let index = 0; index < maxLength; index++) {\n const before = beforeLines[index] ?? ''\n const after = afterLines[index] ?? ''\n\n if (before === after) {\n continue\n }\n\n changes.push({\n path,\n line: index + 1,\n before: before.trim(),\n after: after.trim()\n })\n }\n\n return changes\n}\n\nfunction hasParseDiagnostics(sourceFile: SourceFile): boolean {\n const diagnostics =\n (sourceFile.compilerNode as ts.SourceFile & { parseDiagnostics?: readonly ts.Diagnostic[] })\n .parseDiagnostics ?? []\n return diagnostics.length > 0\n}\n\nfunction getJsxAttributeName(node: Node): string | null {\n let current: Node | undefined = node\n\n while (current) {\n const parent = current.getParent()\n if (!parent) {\n return null\n }\n\n if (Node.isJsxAttribute(parent)) {\n return parent.getNameNode().getText()\n }\n\n if (Node.isSourceFile(parent)) {\n return null\n }\n\n current = parent\n }\n\n return null\n}\n\nfunction getPropertyNameForInitializer(node: Node): string | null {\n const parent = node.getParent()\n if (!parent) {\n return null\n }\n\n if (Node.isPropertyAssignment(parent) && parent.getInitializer() === node) {\n return parent.getName()\n }\n\n return null\n}\n\nfunction getTemplateReplacement(node: Node, literalText: string): string {\n if (Node.isTemplateHead(node)) {\n return `\\`${literalText}\\${`\n }\n\n if (Node.isTemplateMiddle(node)) {\n return `}${literalText}\\${`\n }\n\n return `}${literalText}\\``\n}\n\nfunction replacePathSegments(value: string, before: string, after: string): string {\n const variants: Array<[string, string]> = [\n [`${before}Html`, `${after}Html`],\n [before, after]\n ]\n\n let next = value\n for (const [from, to] of variants) {\n next = next.replace(\n new RegExp(`(^|[.\\\\-/])${escapeForRegex(from)}(?=$|[.\\\\-/])`, 'g'),\n (_, prefix: string) => `${prefix}${to}`\n )\n }\n\n return next\n}\n\nfunction replaceIdentifierExact(text: string, before: string, after: string): string {\n const beforePascal = toPascalCase(before)\n const afterPascal = toPascalCase(after)\n const variants = new Map<string, string>([\n [before, after],\n [`${before}Html`, `${after}Html`],\n [`${before}Field`, `${after}Field`],\n [`${before}FieldArray`, `${after}FieldArray`],\n [`${before}Open`, `${after}Open`],\n [`${before}Expanded`, `${after}Expanded`],\n [`${before}From`, `${after}From`],\n [`${before}To`, `${after}To`],\n [`${before}Media`, `${after}Media`],\n [`${before}MediaIds`, `${after}MediaIds`],\n [beforePascal, afterPascal],\n [`${beforePascal}Field`, `${afterPascal}Field`],\n [`${beforePascal}Column`, `${afterPascal}Column`],\n [`${beforePascal}Props`, `${afterPascal}Props`],\n [`set${beforePascal}Open`, `set${afterPascal}Open`],\n [`set${beforePascal}Expanded`, `set${afterPascal}Expanded`]\n ])\n\n return variants.get(text) ?? text\n}\n\nfunction replaceCustomCellIdentifier(text: string, before: string, after: string): string {\n if (text === before) {\n return after\n }\n\n if (text === `${before}Props`) {\n return `${after}Props`\n }\n\n return text\n}\n\nfunction replaceStringLiteralValue(\n value: string,\n filePath: string,\n node: Node,\n plan: RenamePlan\n): string {\n let next = value\n\n for (const rename of plan.fields) {\n const jsxAttribute = getJsxAttributeName(node)\n const propertyName = getPropertyNameForInitializer(node)\n const isFieldPathLiteral =\n jsxAttribute === 'name' ||\n jsxAttribute === 'id' ||\n jsxAttribute === 'htmlFor' ||\n propertyName === 'accessorKey' ||\n propertyName === 'id' ||\n propertyName === 'name'\n\n if (isFieldPathLiteral) {\n next = replacePathSegments(next, rename.before, rename.after)\n continue\n }\n\n if (next === rename.before) {\n next = rename.after\n continue\n }\n\n if (next === `${rename.before}Html`) {\n next = `${rename.after}Html`\n }\n }\n\n for (const rename of plan.customCells) {\n if (filePath !== rename.columnsPath) {\n continue\n }\n\n if (next === `./cells/${rename.before}`) {\n next = `./cells/${rename.after}`\n }\n }\n\n return next\n}\n\nfunction replaceTemplateLiteralValue(value: string, node: Node, plan: RenamePlan): string {\n const jsxAttribute = getJsxAttributeName(node)\n if (jsxAttribute !== 'name' && jsxAttribute !== 'id' && jsxAttribute !== 'htmlFor') {\n return value\n }\n\n return plan.fields.reduce(\n (next, rename) => replacePathSegments(next, rename.before, rename.after),\n value\n )\n}\n\nfunction replaceIdentifierValue(value: string, filePath: string, plan: RenamePlan): string {\n let next = value\n\n for (const rename of plan.customCells) {\n if (\n filePath === rename.columnsPath ||\n filePath === rename.oldPath ||\n filePath === rename.newPath\n ) {\n next = replaceCustomCellIdentifier(next, rename.before, rename.after)\n }\n }\n\n for (const rename of plan.fields) {\n next = replaceIdentifierExact(next, rename.before, rename.after)\n }\n\n return next\n}\n\nfunction buildEditsForSourceFile(\n sourceFile: SourceFile,\n filePath: string,\n plan: RenamePlan\n): TextEdit[] {\n const edits: TextEdit[] = []\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isIdentifier(node)) {\n const next = replaceIdentifierValue(node.getText(), filePath, plan)\n if (next !== node.getText()) {\n edits.push({\n start: node.getStart(),\n end: node.getEnd(),\n replacement: next\n })\n }\n return\n }\n\n if (Node.isStringLiteral(node)) {\n const quote = node.getText().startsWith(\"'\") ? \"'\" : '\"'\n const next = replaceStringLiteralValue(node.getLiteralValue(), filePath, node, plan)\n if (next !== node.getLiteralValue()) {\n edits.push({\n start: node.getStart(),\n end: node.getEnd(),\n replacement: quoteLiteral(next, quote)\n })\n }\n return\n }\n\n if (Node.isNoSubstitutionTemplateLiteral(node)) {\n const next = replaceStringLiteralValue(node.getLiteralText(), filePath, node, plan)\n if (next !== node.getLiteralText()) {\n edits.push({\n start: node.getStart(),\n end: node.getEnd(),\n replacement: `\\`${next}\\``\n })\n }\n return\n }\n\n if (Node.isTemplateHead(node) || Node.isTemplateMiddle(node) || Node.isTemplateTail(node)) {\n const next = replaceTemplateLiteralValue(node.getLiteralText(), node, plan)\n if (next !== node.getLiteralText()) {\n edits.push({\n start: node.getStart(),\n end: node.getEnd(),\n replacement: getTemplateReplacement(node, next)\n })\n }\n }\n })\n\n return edits\n}\n\nexport function transformContentForRenamePlan(\n content: string,\n filePath: string,\n plan: RenamePlan,\n displayPath = filePath\n): RenameTransformResult {\n if (plan.fields.length === 0 && plan.customCells.length === 0) {\n return {\n changed: false,\n content,\n parseFailed: false,\n previewChanges: []\n }\n }\n\n const sourceFile = project.createSourceFile(\n `rename-${displayPath.replace(/[^\\w.-]+/g, '_')}`,\n content,\n { overwrite: true }\n )\n\n if (hasParseDiagnostics(sourceFile)) {\n return {\n changed: false,\n content,\n parseFailed: true,\n previewChanges: []\n }\n }\n\n const edits = buildEditsForSourceFile(sourceFile, filePath, plan)\n if (edits.length === 0) {\n return {\n changed: false,\n content,\n parseFailed: false,\n previewChanges: []\n }\n }\n\n const nextContent = applyTextEdits(content, edits)\n\n return {\n changed: nextContent !== content,\n content: nextContent,\n parseFailed: false,\n previewChanges: collectPreviewChanges(displayPath, content, nextContent)\n }\n}\n\nexport function buildCustomCellRenameSelection(\n schemaName: string,\n pagesDir: string,\n before: string,\n after: string\n): CustomCellRenameSelection {\n return {\n before,\n after,\n oldPath: `${pagesDir}/${schemaName}/cells/${before}.tsx`,\n newPath: `${pagesDir}/${schemaName}/cells/${after}.tsx`,\n columnsPath: `${pagesDir}/${schemaName}/columns.tsx`\n }\n}\n\nexport function buildRenamePreviewPaths(\n remotePaths: string[],\n plan: RenamePlan\n): Array<{ sourcePath: string; displayPath: string }> {\n const paths = new Map<string, { sourcePath: string; displayPath: string }>()\n\n for (const remotePath of remotePaths) {\n paths.set(remotePath, {\n sourcePath: remotePath,\n displayPath: remotePath\n })\n }\n\n for (const rename of plan.customCells) {\n paths.set(rename.oldPath, {\n sourcePath: rename.oldPath,\n displayPath: rename.newPath\n })\n paths.set(rename.columnsPath, {\n sourcePath: rename.columnsPath,\n displayPath: rename.columnsPath\n })\n }\n\n return Array.from(paths.values()).sort((a, b) => a.displayPath.localeCompare(b.displayPath))\n}\n\nexport function formatRenameSelectionSummary(plan: RenamePlan): string[] {\n const lines: string[] = []\n\n if (plan.fields.length > 0) {\n lines.push(\n `field renames: ${plan.fields.map((rename) => `${rename.before} -> ${rename.after}`).join(', ')}`\n )\n }\n\n if (plan.customCells.length > 0) {\n lines.push(\n `custom cell renames: ${plan.customCells.map((rename) => `${rename.before} -> ${rename.after}`).join(', ')}`\n )\n }\n\n return lines\n}\n\nexport function buildRenamePlanAliasMap(plan: RenamePlan): Map<string, string> {\n return new Map(plan.customCells.map((rename) => [rename.newPath, rename.oldPath]))\n}\n\nexport function isCustomCellPath(filePath: string, rename: CustomCellRenameSelection): boolean {\n return filePath === rename.oldPath || filePath === rename.newPath\n}\n\nexport function getCustomCellComponentNameCandidates(\n before: string,\n after: string\n): Array<[string, string]> {\n return [\n [before, after],\n [`${before}Props`, `${after}Props`],\n [toKebabCase(before), toKebabCase(after)]\n ]\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { GeneratedFile } from '@core-engine/schema/types.js'\nimport { normalizeLineEndings, snapshotTargetPath } from '@core-engine/snapshots/store.js'\nimport { mergeDiff3 } from 'node-diff3'\n\nexport interface MergeOutput {\n file: GeneratedFile\n conflict: boolean\n}\n\nfunction splitLines(content: string): string[] {\n return normalizeLineEndings(content).split('\\n')\n}\n\nexport function mergeGeneratedFile(\n base: GeneratedFile,\n localContent: string,\n remote: GeneratedFile\n): MergeOutput {\n const merged = mergeDiff3(\n splitLines(localContent),\n splitLines(base.content),\n splitLines(remote.content),\n {\n excludeFalseConflicts: true,\n label: {\n a: 'LOCAL',\n o: 'BASE',\n b: 'REMOTE'\n }\n }\n )\n\n return {\n file: {\n path: remote.path,\n content: merged.result.join('\\n')\n },\n conflict: merged.conflict\n }\n}\n\nexport function writeProjectFile(cwd: string, file: GeneratedFile): void {\n const outputPath = snapshotTargetPath(cwd, file.path)\n fs.mkdirSync(path.dirname(outputPath), { recursive: true })\n fs.writeFileSync(outputPath, file.content, 'utf-8')\n}\n\nexport function readProjectFile(cwd: string, filePath: string): string | null {\n const fullPath = snapshotTargetPath(cwd, filePath)\n if (!fs.existsSync(fullPath)) {\n return null\n }\n\n return fs.readFileSync(fullPath, 'utf-8')\n}\n\nexport function deleteProjectFile(cwd: string, filePath: string): void {\n fs.rmSync(snapshotTargetPath(cwd, filePath), { force: true })\n}\n\nexport function hasConflictMarkers(content: string): boolean {\n return /^(<{7}|={7}|>{7})( |$)/m.test(content)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport type { GeneratedFile } from '@core-engine/schema/types.js'\nimport { createGeneratedFile } from '@core-engine/utils/generated-files.js'\nimport { toCamelCase } from '@core-engine/utils/string.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport { namespaceGeneratedFiles } from '@next-adapter/generators/namespace-output.js'\n\ninterface NamespacedExtract {\n namespace: string\n name: string\n path: string\n}\n\nfunction listExtractNames(cwd: string, dirPath: string, ignored = new Set<string>()): string[] {\n const fullDir = path.join(cwd, ...dirPath.split('/'))\n if (!fs.existsSync(fullDir)) {\n return []\n }\n\n return fs\n .readdirSync(fullDir)\n .filter((fileName) => fileName.endsWith('.ts'))\n .map((fileName) => fileName.replace(/\\.ts$/, ''))\n .filter((name) => !ignored.has(name))\n .sort()\n}\n\nfunction listNamespacedExtracts(\n cwd: string,\n dirPath: string,\n ignoredNamespaces = new Set<string>()\n): NamespacedExtract[] {\n const fullDir = path.join(cwd, ...dirPath.split('/'))\n if (!fs.existsSync(fullDir)) {\n return []\n }\n\n const extracts: NamespacedExtract[] = []\n for (const namespace of fs.readdirSync(fullDir).sort()) {\n if (ignoredNamespaces.has(namespace)) {\n continue\n }\n\n const namespaceDir = path.join(fullDir, namespace)\n if (!fs.existsSync(namespaceDir) || !fs.statSync(namespaceDir).isDirectory()) {\n continue\n }\n\n for (const fileName of fs.readdirSync(namespaceDir).sort()) {\n if (!fileName.endsWith('.ts')) {\n continue\n }\n\n const name = fileName.replace(/\\.ts$/, '')\n extracts.push({\n namespace,\n name,\n path: `${dirPath}/${namespace}/${fileName}`\n })\n }\n }\n\n return extracts.sort((a, b) =>\n `${a.namespace}/${a.name}`.localeCompare(`${b.namespace}/${b.name}`)\n )\n}\n\nfunction renderDbBarrel(dbExtracts: NamespacedExtract[]): string {\n const exportLines = dbExtracts.map(\n (extract) => `export * from './${extract.namespace}/${extract.name}'`\n )\n return `export * from './core/schema'\n${exportLines.length > 0 ? `\\n${exportLines.join('\\n')}\\n` : '\\n'}`\n}\n\nfunction renderNavigationBarrel(navExtractNames: string[], namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n const importLines = navExtractNames.map(\n (name) => `import { ${toCamelCase(name)}Nav } from './navigation/${name}'`\n )\n const spreadLines = navExtractNames.map((name) => ` ...${toCamelCase(name)}Nav`)\n const extractImports = importLines.length > 0 ? `\\n${importLines.join('\\n')}` : ''\n\n return `import { House, ImagePlay } from 'lucide-react'\nimport type { ${namespace.pascal}NavigationItem } from '${namespace.alias}/types/navigation'${extractImports}\n\nexport type { ${namespace.pascal}NavigationItem } from '${namespace.alias}/types/navigation'\n\nconst coreNav: ${namespace.pascal}NavigationItem[] = [\n {\n label: 'Overview',\n href: '${namespace.routePath}',\n icon: House,\n position: 0,\n },\n {\n label: 'Media',\n href: '${namespace.routePath}/media',\n icon: ImagePlay,\n position: 1,\n },\n]\n\nfunction comparePositions(a?: number, b?: number): number {\n if (a != null && b != null) return a - b\n if (a != null) return -1\n if (b != null) return 1\n return 0\n}\n\nconst combinedNavigation = [\n ...coreNav${spreadLines.length > 0 ? `,\\n${spreadLines.join(',\\n')}` : ''}\n]\n\nconst dashboard = combinedNavigation.find((item) => item.href === '${namespace.routePath}')\nconst others = combinedNavigation.filter((item) => item.href !== '${namespace.routePath}')\n\nothers.sort((a, b) => {\n if (!a.group && b.group) return -1\n if (a.group && !b.group) return 1\n if (a.group && b.group && a.group !== b.group) {\n return comparePositions(a.groupPosition, b.groupPosition) || a.group.localeCompare(b.group)\n }\n return comparePositions(a.position, b.position) || a.label.localeCompare(b.label)\n})\n\nexport const ${namespace.camel}Navigation = [...(dashboard ? [dashboard] : []), ...others]\n`\n}\n\nexport function renderBarrelFiles(cwd: string, config: ResolvedBetterstartConfig): GeneratedFile[] {\n const paths = resolveProjectPaths(config)\n const dbExtracts = listNamespacedExtracts(cwd, paths.adminDbDir).filter(\n (extract) => !(extract.namespace === 'core' && extract.name === 'schema')\n )\n const navExtractNames = listExtractNames(cwd, paths.adminNavigationDir, new Set(['core']))\n\n return namespaceGeneratedFiles(\n [\n createGeneratedFile(paths.adminDbSchemaFile, renderDbBarrel(dbExtracts)),\n createGeneratedFile(\n paths.adminNavigationFile,\n renderNavigationBarrel(navExtractNames, config.frameworkConfig.next.namespace)\n )\n ],\n config.frameworkConfig.next.namespace\n )\n}\n","import type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport type { FormSchema, GeneratedFile, Schema } from '@core-engine/schema/types.js'\nimport {\n BARREL_SCOPE,\n hashContent,\n hasSnapshotFiles,\n manifestFilesByPath,\n readSnapshotFiles,\n type SnapshotManifest,\n writeSnapshotFiles\n} from '@core-engine/snapshots/store.js'\nimport { runFormPipeline } from '@next-adapter/generators/form-pipeline/index.js'\nimport { runEntityPipeline, runSinglePipeline } from '@next-adapter/generators/index.js'\nimport { renderBarrelFiles } from '@next-adapter/snapshots/barrels.js'\n\nfunction renderManifestFiles(\n cwd: string,\n config: ResolvedBetterstartConfig,\n manifest: SnapshotManifest\n): GeneratedFile[] {\n if (manifest.schemaName === BARREL_SCOPE) {\n return renderBarrelFiles(cwd, config)\n }\n\n const schema = manifest.schemaJson\n if ('type' in schema && schema.type === 'form') {\n return runFormPipeline(schema as FormSchema, cwd, config, {\n force: true,\n silent: true\n }).files\n }\n\n if ('type' in schema && schema.type === 'single') {\n return runSinglePipeline(schema as Schema, cwd, config, {\n force: true,\n silent: true\n }).files\n }\n\n return runEntityPipeline(schema as Schema, cwd, config, {\n force: true,\n silent: true\n }).files\n}\n\nexport interface ReconstructionResult {\n files: GeneratedFile[]\n mismatchedPaths: string[]\n trackedPaths: string[]\n}\n\nexport function reconstructSnapshotFiles(\n cwd: string,\n config: ResolvedBetterstartConfig,\n manifest: SnapshotManifest\n): ReconstructionResult {\n const trackedPaths = manifest.files.map((file) => file.path).sort()\n\n if (hasSnapshotFiles(cwd, manifest.schemaName)) {\n return {\n files: readSnapshotFiles(cwd, manifest.schemaName, manifest),\n mismatchedPaths: [],\n trackedPaths\n }\n }\n\n const renderedFiles = renderManifestFiles(cwd, config, manifest).filter(\n (file) => !manifest.skipped.includes(file.path)\n )\n const manifestFiles = manifestFilesByPath(manifest)\n const validFiles: GeneratedFile[] = []\n const mismatchedPaths: string[] = []\n\n for (const file of renderedFiles) {\n const manifestFile = manifestFiles.get(file.path)\n if (!manifestFile || manifestFile.hash !== hashContent(file.content)) {\n mismatchedPaths.push(file.path)\n continue\n }\n validFiles.push(file)\n }\n\n if (validFiles.length > 0) {\n writeSnapshotFiles(cwd, manifest.schemaName, validFiles)\n }\n\n return {\n files: validFiles,\n mismatchedPaths,\n trackedPaths\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { stringifyProjectJson } from '@core-engine/utils/json-format.js'\nimport type { InstalledPluginManifest } from '@plugin-engine/types.js'\n\nfunction pluginsDir(cwd: string): string {\n return path.join(cwd, '.betterstart', 'plugins')\n}\n\nexport function pluginManifestPath(cwd: string, pluginId: string): string {\n return path.join(pluginsDir(cwd), pluginId, 'manifest.json')\n}\n\nexport function loadInstalledPluginManifest(\n cwd: string,\n pluginId: string\n): InstalledPluginManifest | null {\n const filePath = pluginManifestPath(cwd, pluginId)\n if (!fs.existsSync(filePath)) {\n return null\n }\n\n return JSON.parse(fs.readFileSync(filePath, 'utf-8')) as InstalledPluginManifest\n}\n\nexport function saveInstalledPluginManifest(cwd: string, manifest: InstalledPluginManifest): void {\n const filePath = pluginManifestPath(cwd, manifest.id)\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, stringifyProjectJson(manifest), 'utf-8')\n}\n\nexport function deleteInstalledPluginManifest(cwd: string, pluginId: string): void {\n fs.rmSync(path.dirname(pluginManifestPath(cwd, pluginId)), {\n recursive: true,\n force: true\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { GenerateCommandOptions } from '@core-engine/commands/runtime.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { walkFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { LoadedSchema } from '@core-engine/schema/schema-reader.js'\nimport {\n listSchemaNames,\n loadSchema,\n SchemaNotFoundError,\n validateLoadedSchema\n} from '@core-engine/schema/schema-reader.js'\nimport {\n buildCustomCellRenameSelection,\n buildRenamePreviewPaths,\n formatRenameSelectionSummary,\n type RenamePlan,\n transformContentForRenamePlan\n} from '@core-engine/snapshots/ast-substitution.js'\nimport { ensureSnapshotGitFiles } from '@core-engine/snapshots/gitignore.js'\nimport {\n detectRenameCandidates,\n detectStringRenameCandidates\n} from '@core-engine/snapshots/rename-detector.js'\nimport { diffSchemas } from '@core-engine/snapshots/schema-diff.js'\nimport {\n BARREL_SCOPE,\n clearTombstone,\n hasTombstone,\n loadManifest,\n snapshotRootExists\n} from '@core-engine/snapshots/store.js'\nimport { detectPackageManager } from '@core-engine/utils/package-manager.js'\nimport { toKebabCase } from '@core-engine/utils/string.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport { runFormPipeline } from '@next-adapter/generators/form-pipeline/index.js'\nimport { runEntityPipeline, runSinglePipeline } from '@next-adapter/generators/index.js'\nimport { runPostGenerate, scanConflictPaths } from '@next-adapter/generators/post-generate.js'\nimport { installDependenciesAsync } from '@next-adapter/init/scaffolders/dependencies.js'\nimport { hasInstalledIntegrationFeature } from '@next-adapter/integration-runtime.js'\nimport { ensureUserSchemaOwnership } from '@next-adapter/plugin-runtime.js'\nimport { applyGeneratedFiles } from '@next-adapter/snapshots/apply.js'\nimport { renderBarrelFiles } from '@next-adapter/snapshots/barrels.js'\nimport { getSchemaOwner } from '@plugin-engine/ownership.js'\n\nfunction isInteractiveSession(): boolean {\n return Boolean(process.stdin.isTTY) && process.env.CI !== 'true'\n}\n\nfunction isStoredSchemaJson(\n schemaJson: { name: string } | LoadedSchema['schema']\n): schemaJson is LoadedSchema['schema'] {\n return 'fields' in schemaJson\n}\n\nconst MARKDOWN_IT_RENDERER_SPEC = 'markdown-it@^13.0.2'\nconst MARKDOWN_RENDERER_DEPS = [\n 'katex',\n MARKDOWN_IT_RENDERER_SPEC,\n 'markdown-it-dollarmath',\n 'sanitize-html'\n]\nconst MARKDOWN_RENDERER_DEV_DEPS = ['@types/markdown-it@13', '@types/sanitize-html']\n\ninterface ProjectPackageJson {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n}\n\nfunction getGeneratedSchemaRoutePath(loaded: LoadedSchema, adminRoutePath: string): string {\n const schemaPath = toKebabCase(loaded.schema.name)\n return loaded.type === 'form'\n ? `${adminRoutePath}/forms/${schemaPath}`\n : `${adminRoutePath}/${schemaPath}`\n}\n\nfunction readPackageJson(cwd: string): ProjectPackageJson | null {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) return null\n\n try {\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as ProjectPackageJson\n } catch {\n return null\n }\n}\n\nfunction packageNameFromSpec(spec: string): string {\n if (spec.startsWith('@')) {\n const versionSeparator = spec.indexOf('@', 1)\n return versionSeparator === -1 ? spec : spec.slice(0, versionSeparator)\n }\n\n const versionSeparator = spec.indexOf('@')\n return versionSeparator === -1 ? spec : spec.slice(0, versionSeparator)\n}\n\nfunction hasDependency(pkg: ProjectPackageJson | null, name: string, runtimeOnly = false): boolean {\n if (!pkg) return false\n if (Object.hasOwn(pkg.dependencies ?? {}, name)) return true\n return runtimeOnly ? false : Object.hasOwn(pkg.devDependencies ?? {}, name)\n}\n\nfunction hasCompatibleMarkdownItDependency(pkg: ProjectPackageJson | null): boolean {\n const spec = pkg?.dependencies?.['markdown-it']\n return typeof spec === 'string' && /^(?:workspace:|link:|file:|portal:|\\^?13\\.|~13\\.)/.test(spec)\n}\n\nfunction schemaNeedsMarkdownRenderer(loaded: LoadedSchema): boolean {\n if (loaded.type === 'form') return false\n\n let needsRenderer = false\n\n walkFields(loaded.schema.fields, (field) => {\n if ((field.type === 'richtext' || field.type === 'markdown') && field.output === 'html') {\n needsRenderer = true\n }\n })\n\n return needsRenderer\n}\n\nasync function ensureMarkdownRendererDependencies(cwd: string, required: boolean): Promise<void> {\n if (!required) return\n\n const pkg = readPackageJson(cwd)\n const dependencies = MARKDOWN_RENDERER_DEPS.filter((spec) =>\n spec === MARKDOWN_IT_RENDERER_SPEC\n ? !hasCompatibleMarkdownItDependency(pkg)\n : !hasDependency(pkg, packageNameFromSpec(spec), true)\n )\n const devDependencies = MARKDOWN_RENDERER_DEV_DEPS.filter(\n (spec) => !hasDependency(pkg, packageNameFromSpec(spec))\n )\n\n if (dependencies.length === 0 && devDependencies.length === 0) return\n\n const pm = detectPackageManager(cwd)\n const s = p.spinner()\n s.start('Installing markdown renderer dependencies')\n const result = await installDependenciesAsync({\n cwd,\n pm,\n dependencies,\n devDependencies\n })\n\n if (!result.success) {\n s.stop('Failed to install markdown renderer dependencies')\n throw new Error(result.error ?? 'Failed to install markdown renderer dependencies.')\n }\n\n s.stop(\n `Installed markdown renderer dependencies (${dependencies.length} deps + ${devDependencies.length} dev deps)`\n )\n}\n\nfunction assertSnapshotStateOrExit(cwd: string): void {\n if (snapshotRootExists(cwd)) {\n return\n }\n\n console.error(\n ' Project state is unsupported or incomplete. Re-run `betterstart init --force` to create the current snapshot-backed layout.'\n )\n process.exit(1)\n}\n\nfunction printSchemaDiff(scope: string, loaded: LoadedSchema, cwd: string): void {\n const manifest = loadManifest(cwd, scope)\n if (!manifest || scope === BARREL_SCOPE || !isStoredSchemaJson(manifest.schemaJson)) {\n return\n }\n\n const diff = diffSchemas(manifest.schemaJson, loaded.schema)\n const renameCandidates = detectRenameCandidates(diff.removed, diff.added)\n\n if (\n diff.added.length === 0 &&\n diff.removed.length === 0 &&\n diff.changed.length === 0 &&\n diff.customComponents.added.length === 0 &&\n diff.customComponents.removed.length === 0\n ) {\n return\n }\n\n console.log(` Schema diff for ${scope}:`)\n if (diff.added.length > 0) {\n console.log(` + fields: ${diff.added.map((field) => field.name).join(', ')}`)\n }\n if (diff.removed.length > 0) {\n console.log(` - fields: ${diff.removed.map((field) => field.name).join(', ')}`)\n }\n if (diff.changed.length > 0) {\n console.log(\n ` ~ fields: ${diff.changed.map((entry) => `${entry.before.name}:${entry.before.type}->${entry.after.type}`).join(', ')}`\n )\n }\n if (renameCandidates.length > 0) {\n console.log(\n ` ? rename candidates: ${renameCandidates.map((entry) => `${entry.before}->${entry.after}`).join(', ')}`\n )\n }\n if (diff.customComponents.added.length > 0 || diff.customComponents.removed.length > 0) {\n console.log(\n ` custom cells: +[${diff.customComponents.added.join(', ')}] -[${diff.customComponents.removed.join(', ')}]`\n )\n }\n}\n\nasync function promptConfirm(message: string): Promise<boolean> {\n const result = await p.confirm({\n message,\n initialValue: true\n })\n\n if (p.isCancel(result)) {\n throw new Error('Generation cancelled.')\n }\n\n return Boolean(result)\n}\n\nfunction readLocalProjectFile(cwd: string, filePath: string): string | null {\n const fullPath = path.join(cwd, ...filePath.split('/'))\n if (!fs.existsSync(fullPath)) {\n return null\n }\n\n return fs.readFileSync(fullPath, 'utf-8')\n}\n\nfunction validateCustomCellRenameSelections(\n cwd: string,\n selected: RenamePlan['customCells'],\n fieldRenames: RenamePlan['fields']\n): { renames: RenamePlan['customCells']; warnings: string[] } {\n const renames: RenamePlan['customCells'] = []\n const warnings: string[] = []\n\n for (const rename of selected) {\n const validationPlan: RenamePlan = {\n fields: fieldRenames,\n customCells: [rename]\n }\n const validationPaths = [rename.columnsPath, rename.oldPath]\n let valid = true\n\n for (const validationPath of validationPaths) {\n const content = readLocalProjectFile(cwd, validationPath)\n if (content == null) {\n continue\n }\n\n const result = transformContentForRenamePlan(content, validationPath, validationPlan)\n if (result.parseFailed) {\n warnings.push(\n `Skipped custom cell rename ${rename.before} -> ${rename.after}: AST parse failed for ${validationPath}`\n )\n valid = false\n break\n }\n }\n\n if (valid) {\n renames.push(rename)\n }\n }\n\n return { renames, warnings }\n}\n\nfunction collectRenamePreview(\n cwd: string,\n remotePaths: string[],\n plan: RenamePlan\n): { previewLines: string[]; warnings: string[] } {\n const previewLines: string[] = []\n const warnings: string[] = []\n\n for (const previewPath of buildRenamePreviewPaths(remotePaths, plan)) {\n const content = readLocalProjectFile(cwd, previewPath.sourcePath)\n if (content == null) {\n continue\n }\n\n const result = transformContentForRenamePlan(\n content,\n previewPath.sourcePath,\n plan,\n previewPath.displayPath\n )\n\n if (result.parseFailed) {\n warnings.push(\n `AST rename preview skipped for ${previewPath.displayPath}: parse failed, merge will fall back for that file`\n )\n continue\n }\n\n for (const change of result.previewChanges) {\n previewLines.push(\n ` ${change.path}:${change.line}\\n - ${change.before || '(empty)'}\\n + ${change.after || '(empty)'}`\n )\n }\n }\n\n return { previewLines, warnings }\n}\n\nasync function maybeBuildRenamePlan(\n loaded: LoadedSchema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n generatedFiles: Array<{ path: string; content: string }>,\n options: { force: boolean; interactive: boolean }\n): Promise<RenamePlan | undefined> {\n if (!options.interactive || options.force) {\n return undefined\n }\n\n const manifest = loadManifest(cwd, loaded.schema.name)\n if (!manifest || !isStoredSchemaJson(manifest.schemaJson)) {\n return undefined\n }\n\n const diff = diffSchemas(manifest.schemaJson, loaded.schema)\n const fieldCandidates = detectRenameCandidates(diff.removed, diff.added)\n const customCellCandidates = detectStringRenameCandidates(\n diff.customComponents.removed,\n diff.customComponents.added\n )\n\n if (fieldCandidates.length === 0 && customCellCandidates.length === 0) {\n return undefined\n }\n\n const plan: RenamePlan = {\n fields: [],\n customCells: []\n }\n\n for (const candidate of fieldCandidates) {\n const accepted = await promptConfirm(\n `Field '${candidate.before}' was removed and '${candidate.after}' was added. Treat it as a rename before merge?`\n )\n\n if (accepted) {\n plan.fields.push(candidate)\n }\n }\n\n if (customCellCandidates.length > 0) {\n const paths = resolveProjectPaths(config)\n for (const candidate of customCellCandidates) {\n const accepted = await promptConfirm(\n `Custom cell '${candidate.before}' was removed and '${candidate.after}' was added. Treat it as a rename before merge?`\n )\n\n if (accepted) {\n plan.customCells.push(\n buildCustomCellRenameSelection(\n loaded.schema.name,\n paths.pagesDir,\n candidate.before,\n candidate.after\n )\n )\n }\n }\n }\n\n const validatedCustomCells = validateCustomCellRenameSelections(\n cwd,\n plan.customCells,\n plan.fields\n )\n const finalPlan: RenamePlan = {\n fields: plan.fields,\n customCells: validatedCustomCells.renames\n }\n\n if (finalPlan.fields.length === 0 && finalPlan.customCells.length === 0) {\n for (const warning of validatedCustomCells.warnings) {\n console.warn(` ${warning}`)\n }\n return undefined\n }\n\n const preview = collectRenamePreview(\n cwd,\n generatedFiles.map((file) => file.path),\n finalPlan\n )\n\n console.log(' Proposed rename substitutions:')\n for (const line of formatRenameSelectionSummary(finalPlan)) {\n console.log(` ${line}`)\n }\n\n const previewLines = preview.previewLines.slice(0, 20)\n for (const line of previewLines) {\n console.log(line)\n }\n\n if (preview.previewLines.length > previewLines.length) {\n console.log(` ... ${preview.previewLines.length - previewLines.length} more change(s)`)\n }\n\n for (const warning of [...validatedCustomCells.warnings, ...preview.warnings]) {\n console.warn(` ${warning}`)\n }\n\n const confirmed = await promptConfirm('Apply these rename substitutions before merge?')\n return confirmed ? finalPlan : undefined\n}\n\nfunction validateIntegrationRequirements(\n loaded: LoadedSchema,\n config: ResolvedBetterstartConfig\n): void {\n if (\n loaded.type === 'form' &&\n loaded.schema.mailchimp &&\n !hasInstalledIntegrationFeature(config, 'mailchimp')\n ) {\n throw new Error(\n `Form schema \"${loaded.schema.name}\" sets \"mailchimp\", but the mailchimp integration is not installed. Run \\`betterstart add --integration mailchimp\\` or remove the \"mailchimp\" property from the schema.`\n )\n }\n}\n\nfunction runPipeline(\n loaded: LoadedSchema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n options: { force: boolean }\n) {\n const owner = getSchemaOwner(cwd, loaded.schema.name)\n const outputNamespace =\n owner === 'core'\n ? 'core'\n : owner?.startsWith('plugin:')\n ? owner.replace(/^plugin:/, '')\n : undefined\n\n if (loaded.type === 'form') {\n return runFormPipeline(loaded.schema, cwd, config, {\n force: options.force,\n silent: true,\n outputNamespace\n })\n }\n\n if (loaded.type === 'single') {\n return runSinglePipeline(loaded.schema, cwd, config, {\n force: options.force,\n silent: true,\n outputNamespace\n })\n }\n\n return runEntityPipeline(loaded.schema, cwd, config, {\n force: options.force,\n silent: true,\n outputNamespace\n })\n}\n\nasync function applySchemaGeneration(\n loaded: LoadedSchema,\n cwd: string,\n config: ResolvedBetterstartConfig,\n options: { force: boolean; interactive: boolean }\n) {\n const scope = loaded.schema.name\n const tombstoneCleared = hasTombstone(cwd, scope)\n if (tombstoneCleared) {\n clearTombstone(cwd, scope)\n }\n\n validateIntegrationRequirements(loaded, config)\n printSchemaDiff(scope, loaded, cwd)\n\n const pipelineResult = runPipeline(loaded, cwd, config, options)\n if (!pipelineResult.success) {\n throw new Error(pipelineResult.errors.join('; '))\n }\n\n const renamePlan = await maybeBuildRenamePlan(loaded, cwd, config, pipelineResult.files, options)\n\n const summary = await applyGeneratedFiles({\n cwd,\n config,\n scope,\n schemaJson: loaded.schema,\n generatedFiles: pipelineResult.files,\n force: options.force,\n interactive: options.interactive,\n renamePlan\n })\n\n if (tombstoneCleared) {\n summary.tombstoneCleared = scope\n }\n\n return {\n fileCount: pipelineResult.files.length,\n summary\n }\n}\n\nasync function applyBarrels(\n cwd: string,\n config: ResolvedBetterstartConfig,\n options: { force: boolean; interactive: boolean }\n) {\n return applyGeneratedFiles({\n cwd,\n config,\n scope: BARREL_SCOPE,\n schemaJson: { name: BARREL_SCOPE },\n generatedFiles: renderBarrelFiles(cwd, config),\n force: options.force,\n interactive: options.interactive\n })\n}\n\nfunction printApplySummary(\n schemaName: string,\n summary: Awaited<ReturnType<typeof applySchemaGeneration>>['summary']\n): void {\n console.log(` ${schemaName}:`)\n if (summary.tombstoneCleared) {\n console.log(` Tombstone cleared: ${summary.tombstoneCleared}`)\n }\n if (summary.writtenFresh.length > 0) {\n console.log(` written fresh: ${summary.writtenFresh.length}`)\n }\n if (summary.overwritten.length > 0) {\n console.log(` overwritten: ${summary.overwritten.length}`)\n }\n if (summary.mergedCleanly.length > 0) {\n console.log(` merged cleanly: ${summary.mergedCleanly.length}`)\n }\n if (summary.conflictPaths.length > 0) {\n console.log(` with conflicts: ${summary.conflictPaths.length}`)\n }\n if (summary.orphanedDeleted.length > 0) {\n console.log(` orphaned deleted: ${summary.orphanedDeleted.length}`)\n }\n if (summary.orphanedKept.length > 0) {\n console.log(` orphaned kept: ${summary.orphanedKept.length}`)\n }\n if (summary.skipped.length > 0) {\n console.log(` skipped: ${summary.skipped.join(', ')}`)\n }\n if (summary.skippedCleared.length > 0) {\n console.log(` skip entries cleared: ${summary.skippedCleared.join(', ')}`)\n }\n}\n\nexport async function runGenerateCommand(\n schemaName: string | undefined,\n options: GenerateCommandOptions\n): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const interactive = options.all\n ? options.interactive && isInteractiveSession()\n : isInteractiveSession()\n\n let config: ResolvedBetterstartConfig\n try {\n config = await resolveConfig(cwd)\n } catch (error) {\n console.error(\n ` Error loading config: ${error instanceof Error ? error.message : String(error)}`\n )\n process.exit(1)\n }\n\n assertSnapshotStateOrExit(cwd)\n ensureSnapshotGitFiles(cwd)\n\n const paths = resolveProjectPaths(config)\n const schemasDir = path.join(cwd, ...paths.schemasDir.split('/'))\n\n if (options.all) {\n const schemaNames = listSchemaNames(schemasDir)\n if (schemaNames.length === 0) {\n console.error(`\\n No schemas found in ${schemasDir}\\n`)\n process.exit(1)\n }\n\n const failed: string[] = []\n const processed: string[] = []\n const processedRoutes: string[] = []\n let markdownDepsChecked = false\n const adminRoutePath = resolveAdminNamespace(config.frameworkConfig.next.namespace).routePath\n\n console.log(`\\n BetterStart Generator — regenerating ${schemaNames.length} schema(s)\\n`)\n\n for (const name of schemaNames) {\n if (hasTombstone(cwd, name)) {\n if (loadManifest(cwd, name)) {\n clearTombstone(cwd, name)\n console.warn(` - ${name}: tombstone cleared (manifest present)`)\n } else {\n console.log(` - ${name}: skipped (tombstoned)`)\n continue\n }\n }\n\n try {\n const loaded = loadSchema(schemasDir, name)\n validateIntegrationRequirements(loaded, config)\n const validationErrors = validateLoadedSchema(loaded)\n if (validationErrors.length > 0) {\n throw new Error(validationErrors.join('; '))\n }\n\n const needsMarkdownRenderer = schemaNeedsMarkdownRenderer(loaded)\n if (!markdownDepsChecked && needsMarkdownRenderer) {\n await ensureMarkdownRendererDependencies(cwd, true)\n markdownDepsChecked = true\n }\n\n const result = await applySchemaGeneration(loaded, cwd, config, {\n force: options.force,\n interactive\n })\n ensureUserSchemaOwnership(cwd, name)\n printApplySummary(name, result.summary)\n processed.push(name)\n processedRoutes.push(getGeneratedSchemaRoutePath(loaded, adminRoutePath))\n } catch (error) {\n console.error(` ✗ ${name}: ${error instanceof Error ? error.message : String(error)}`)\n failed.push(name)\n }\n }\n\n if (processed.length > 0) {\n const barrelSummary = await applyBarrels(cwd, config, {\n force: options.force,\n interactive\n })\n printApplySummary(BARREL_SCOPE, barrelSummary)\n }\n\n const conflictPaths = scanConflictPaths(cwd)\n if (processed.length > 0) {\n await runPostGenerate(cwd, processed[0] ?? 'admin', {\n skipMigration: options.skipMigration,\n hasConflicts: conflictPaths.length > 0,\n conflictPaths,\n adminRoutePath,\n schemaRoutePath: processedRoutes[0]\n })\n }\n\n if (failed.length > 0) {\n console.error(`\\n Failed: ${failed.join(', ')}`)\n process.exit(1)\n }\n\n console.log('')\n return\n }\n\n if (!schemaName) {\n console.error(' Error: schema name is required (or use --all)')\n process.exit(1)\n }\n\n let loaded: LoadedSchema\n try {\n loaded = loadSchema(schemasDir, schemaName)\n } catch (error) {\n if (error instanceof SchemaNotFoundError) {\n console.error(` ${error.message}`)\n } else {\n console.error(\n ` Error loading schema: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n process.exit(1)\n }\n\n const validationErrors = validateLoadedSchema(loaded)\n if (validationErrors.length > 0) {\n console.error(' Schema validation failed:')\n for (const error of validationErrors) {\n console.error(` - ${error}`)\n }\n process.exit(1)\n }\n\n console.log(`\\n BetterStart Generator — ${loaded.schema.name}\\n`)\n const needsMarkdownRenderer = schemaNeedsMarkdownRenderer(loaded)\n await ensureMarkdownRendererDependencies(cwd, needsMarkdownRenderer)\n const result = await applySchemaGeneration(loaded, cwd, config, {\n force: options.force,\n interactive\n })\n ensureUserSchemaOwnership(cwd, loaded.schema.name)\n printApplySummary(loaded.schema.name, result.summary)\n\n const barrelSummary = await applyBarrels(cwd, config, {\n force: options.force,\n interactive\n })\n printApplySummary(BARREL_SCOPE, barrelSummary)\n\n const conflictPaths = scanConflictPaths(cwd)\n const adminRoutePath = resolveAdminNamespace(config.frameworkConfig.next.namespace).routePath\n await runPostGenerate(cwd, loaded.schema.name, {\n skipMigration: options.skipMigration,\n hasConflicts: conflictPaths.length > 0,\n conflictPaths,\n adminRoutePath,\n schemaRoutePath: getGeneratedSchemaRoutePath(loaded, adminRoutePath)\n })\n console.log('')\n}\n","import type { SchemaDiffField } from '@core-engine/snapshots/schema-diff.js'\n\nexport interface RenameCandidate {\n before: string\n after: string\n}\n\nfunction levenshtein(a: string, b: string): number {\n const matrix = Array.from({ length: a.length + 1 }, () => new Array<number>(b.length + 1).fill(0))\n\n for (let i = 0; i <= a.length; i++) matrix[i]![0] = i\n for (let j = 0; j <= b.length; j++) matrix[0]![j] = j\n\n for (let i = 1; i <= a.length; i++) {\n for (let j = 1; j <= b.length; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n matrix[i]![j] = Math.min(\n matrix[i - 1]![j]! + 1,\n matrix[i]![j - 1]! + 1,\n matrix[i - 1]![j - 1]! + cost\n )\n }\n }\n\n return matrix[a.length]![b.length]!\n}\n\nexport function detectStringRenameCandidates(\n removed: string[],\n added: string[]\n): RenameCandidate[] {\n const candidates: RenameCandidate[] = []\n\n for (const before of removed) {\n const match = added.find((after) => levenshtein(before, after) <= 3)\n if (match) {\n candidates.push({ before, after: match })\n }\n }\n\n return candidates\n}\n\nexport function detectRenameCandidates(\n removed: SchemaDiffField[],\n added: SchemaDiffField[]\n): RenameCandidate[] {\n const candidates: RenameCandidate[] = []\n\n for (const before of removed) {\n const match = added.find(\n (after) => after.type === before.type && levenshtein(before.name, after.name) <= 3\n )\n if (match) {\n candidates.push({ before: before.name, after: match.name })\n }\n }\n\n return candidates\n}\n","import { flattenFields, getAllFormSchemaFields } from '@core-engine/schema/field-helpers/index.js'\nimport type { FormSchema, Schema } from '@core-engine/schema/types.js'\n\nexport interface SchemaDiffField {\n name: string\n type: string\n}\n\nexport interface SchemaDiffResult {\n added: SchemaDiffField[]\n removed: SchemaDiffField[]\n changed: Array<{ before: SchemaDiffField; after: SchemaDiffField }>\n customComponents: {\n added: string[]\n removed: string[]\n }\n}\n\nfunction collectFields(schema: Schema | FormSchema): SchemaDiffField[] {\n if ('type' in schema && schema.type === 'form') {\n return getAllFormSchemaFields(schema as FormSchema)\n .filter((field): field is typeof field & { name: string } => Boolean(field.name))\n .map((field) => ({ name: field.name, type: field.type }))\n }\n\n return flattenFields(schema.fields).map((field) => ({\n name: field.name,\n type: field.type\n }))\n}\n\nfunction collectCustomComponents(schema: Schema | FormSchema): string[] {\n if (schema.type === 'form') {\n return []\n }\n\n return (schema.columns || [])\n .filter((column) => column.type === 'custom' && column.component)\n .map((column) => column.component as string)\n .sort()\n}\n\nexport function diffSchemas(\n before: Schema | FormSchema,\n after: Schema | FormSchema\n): SchemaDiffResult {\n const beforeFields = new Map(collectFields(before).map((field) => [field.name, field]))\n const afterFields = new Map(collectFields(after).map((field) => [field.name, field]))\n\n const added: SchemaDiffField[] = []\n const removed: SchemaDiffField[] = []\n const changed: Array<{ before: SchemaDiffField; after: SchemaDiffField }> = []\n\n for (const [name, beforeField] of beforeFields) {\n const afterField = afterFields.get(name)\n if (!afterField) {\n removed.push(beforeField)\n continue\n }\n if (beforeField.type !== afterField.type) {\n changed.push({ before: beforeField, after: afterField })\n }\n }\n\n for (const [name, afterField] of afterFields) {\n if (!beforeFields.has(name)) {\n added.push(afterField)\n }\n }\n\n const beforeComponents = new Set(collectCustomComponents(before))\n const afterComponents = new Set(collectCustomComponents(after))\n\n return {\n added: added.sort((a, b) => a.name.localeCompare(b.name)),\n removed: removed.sort((a, b) => a.name.localeCompare(b.name)),\n changed: changed.sort((a, b) => a.before.name.localeCompare(b.before.name)),\n customComponents: {\n added: Array.from(afterComponents)\n .filter((name) => !beforeComponents.has(name))\n .sort(),\n removed: Array.from(beforeComponents)\n .filter((name) => !afterComponents.has(name))\n .sort()\n }\n }\n}\n","import { execFileSync, spawn } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nimport * as p from '@clack/prompts'\nimport type { InitCommandOptions } from '@core-engine/commands/runtime.js'\nimport { loadConfigFile } from '@core-engine/config/resolver.js'\nimport { writeConfigFile } from '@core-engine/config/serialize.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport {\n createNextAppCommand,\n detectPackageManager,\n runCommand\n} from '@core-engine/utils/package-manager.js'\nimport { detectNextMajorVersion, detectProject } from '@next-adapter/config/detect.js'\nimport {\n DEFAULT_ADMIN_NAMESPACE,\n deriveMigrationsDir,\n deriveNamespacePaths,\n resolveAdminNamespace,\n validateAdminDashboardPath,\n validateAdminNamespace\n} from '@next-adapter/config/namespace.js'\nimport { getDefaultConfig } from '@next-adapter/config.js'\nimport { promptDatabase } from '@next-adapter/init/prompts/database.js'\nimport { promptPlugins } from '@next-adapter/init/prompts/plugins.js'\nimport { promptProject } from '@next-adapter/init/prompts/project.js'\nimport { scaffoldApiRoutes } from '@next-adapter/init/scaffolders/api-routes.js'\nimport { scaffoldAuth } from '@next-adapter/init/scaffolders/auth.js'\nimport { scaffoldBase } from '@next-adapter/init/scaffolders/base.js'\nimport { scaffoldBiome } from '@next-adapter/init/scaffolders/biome.js'\nimport { scaffoldComponents } from '@next-adapter/init/scaffolders/components.js'\nimport { scaffoldCoreSchemas } from '@next-adapter/init/scaffolders/core-schemas.js'\nimport { scaffoldDatabase } from '@next-adapter/init/scaffolders/database.js'\nimport {\n DRIZZLE_KIT_POSTGRES_DRIVER_DEP,\n getCliDependencySyncPlan,\n getDependencyPlan,\n hasDrizzleKitPostgresDriverDependency,\n installDependenciesAsync\n} from '@next-adapter/init/scaffolders/dependencies.js'\nimport {\n type DevScriptPortResult,\n detectDevPort,\n ensureDefaultDevScriptPort\n} from '@next-adapter/init/scaffolders/dev-server.js'\nimport { scaffoldEnv } from '@next-adapter/init/scaffolders/env.js'\nimport { scaffoldLayout } from '@next-adapter/init/scaffolders/layout.js'\nimport { scaffoldNextConfig } from '@next-adapter/init/scaffolders/next-config.js'\nimport { scaffoldTailwind } from '@next-adapter/init/scaffolders/tailwind.js'\nimport { scaffoldTsconfig } from '@next-adapter/init/scaffolders/tsconfig.js'\nimport { isEmailProviderIntegration } from '@next-adapter/integration-registry.js'\nimport { installIntegrations, parseIntegrationList } from '@next-adapter/integration-runtime.js'\nimport { installPlugins, parsePluginList } from '@next-adapter/plugin-runtime.js'\nimport { runDrizzlePush } from '@next-adapter/utils/drizzle-push.js'\nimport pc from 'picocolors'\nimport { buildSeedScript } from './seed.js'\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: needed to strip ANSI escape sequences from captured command output\nconst ANSI_ESCAPE_PATTERN = /\\u001B\\[[0-?]*[ -/]*[@-~]/g\nconst REMOVABLE_NAMESPACE_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nfunction normalizeNamespaceForRemoval(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return\n }\n\n const segment = value.trim()\n return REMOVABLE_NAMESPACE_PATTERN.test(segment) ? segment : undefined\n}\n\nfunction readNamespaceFromConfigSource(source: string): string | undefined {\n const match = source.match(/\\bnamespace\\s*:\\s*(['\"`])([^'\"`]+)\\1/)\n return normalizeNamespaceForRemoval(match?.[2])\n}\n\nasync function readExistingConfigNamespace(cwd: string): Promise<string | undefined> {\n const configPath = path.resolve(cwd, 'admin.config.ts')\n if (!fs.existsSync(configPath)) {\n return\n }\n\n const sourceNamespace = readNamespaceFromConfigSource(fs.readFileSync(configPath, 'utf-8'))\n if (sourceNamespace) {\n return sourceNamespace\n }\n\n try {\n const loadedConfig = await loadConfigFile(configPath)\n return normalizeNamespaceForRemoval(loadedConfig.frameworkConfig?.next?.namespace)\n } catch {\n return\n }\n}\n\nexport async function resolveForceInitNamespaces(\n cwd: string,\n targetNamespace: string\n): Promise<string[]> {\n const namespaces = new Set<string>([validateAdminNamespace(targetNamespace)])\n const hasConfig = fs.existsSync(path.resolve(cwd, 'admin.config.ts'))\n const existingNamespace = await readExistingConfigNamespace(cwd)\n\n if (existingNamespace) {\n namespaces.add(existingNamespace)\n } else if (hasConfig) {\n namespaces.add(DEFAULT_ADMIN_NAMESPACE)\n }\n\n return [...namespaces]\n}\n\nexport function removeExistingAdminPaths(\n cwd: string,\n namespaces: string | Iterable<string>\n): number {\n const segments = Array.from(\n new Set(\n (typeof namespaces === 'string' ? [namespaces] : [...namespaces]).flatMap((namespace) => {\n const segment = normalizeNamespaceForRemoval(namespace)\n return segment ? [segment] : []\n })\n )\n )\n const nukeDirs = [\n ...segments.flatMap((segment) => [segment, `app/(${segment})`, `src/app/(${segment})`]),\n '.betterstart'\n ]\n const nukeFiles = ['admin.config.ts', 'ADMIN.md', 'drizzle.config.ts']\n let removed = 0\n\n for (const dir of nukeDirs) {\n const fullPath = path.resolve(cwd, dir)\n if (fs.existsSync(fullPath)) {\n fs.rmSync(fullPath, { recursive: true, force: true })\n removed++\n }\n }\n\n for (const file of nukeFiles) {\n const fullPath = path.resolve(cwd, file)\n if (fs.existsSync(fullPath)) {\n fs.unlinkSync(fullPath)\n removed++\n }\n }\n\n return removed\n}\n\nexport async function runInitCommand(\n name: string | undefined,\n options: InitCommandOptions\n): Promise<void> {\n p.intro(pc.bgCyan(pc.black(' Setup Your Dashboard ')))\n\n let cwd = process.cwd()\n let forceMode = Boolean(options.force)\n let namespace = DEFAULT_ADMIN_NAMESPACE\n if (options.namespace) {\n try {\n namespace = validateAdminNamespace(options.namespace)\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : String(error))\n process.exit(1)\n }\n }\n\n if (!options.yes && !options.namespace) {\n const defaultDashboardPath = resolveAdminNamespace(DEFAULT_ADMIN_NAMESPACE).routePath\n const namespaceInput = await p.text({\n message: \"What's the path you want the dashboard to be?\",\n placeholder: `eg. ${defaultDashboardPath}`,\n defaultValue: defaultDashboardPath,\n validate(value) {\n try {\n validateAdminDashboardPath(value ?? defaultDashboardPath)\n return\n } catch (error) {\n return error instanceof Error ? error.message : String(error)\n }\n }\n })\n if (p.isCancel(namespaceInput)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n namespace = validateAdminDashboardPath(namespaceInput)\n }\n\n let project = detectProject(cwd, namespace)\n let pm = detectPackageManager(cwd)\n let isFreshProject = false\n\n // Determine srcDir\n let srcDir: boolean\n if (project.isExisting) {\n p.log.info(`Next.js app detected ${pc.dim('·')} ${pc.cyan(pm)}`)\n srcDir = project.hasSrcDir\n\n if (!project.hasTypeScript) {\n p.log.error('TypeScript is required. Please add a tsconfig.json first.')\n process.exit(1)\n }\n\n if (forceMode) {\n const nuked = removeExistingAdminPaths(cwd, await resolveForceInitNamespaces(cwd, namespace))\n if (nuked > 0) {\n p.log.warn(`${pc.yellow('Force mode:')} removed ${nuked} existing admin paths`)\n }\n // Re-detect project after wipe\n project = detectProject(cwd, namespace)\n } else if (project.conflicts.length > 0) {\n const conflictLines = project.conflicts.map((c) => `${pc.yellow('▲')} ${c}`)\n conflictLines.push(\n '',\n pc.dim(`Use ${pc.bold('--force')} to remove existing admin files before scaffolding.`)\n )\n p.note(conflictLines.join('\\n'), pc.yellow('Conflicts'))\n if (!options.yes) {\n const proceed = await p.confirm({\n message: [\n `Continue with ${pc.bold(pc.cyan('--force'))}?`,\n `${pc.cyan('│')} ${pc.dim('This will force overwrite the existing admin code.')}`,\n pc.cyan('│')\n ].join('\\n'),\n initialValue: true\n })\n if (p.isCancel(proceed) || !proceed) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n forceMode = true\n const nuked = removeExistingAdminPaths(\n cwd,\n await resolveForceInitNamespaces(cwd, namespace)\n )\n if (nuked > 0) {\n p.log.warn(`${pc.yellow('Force mode:')} removed ${nuked} existing admin paths`)\n }\n project = detectProject(cwd, namespace)\n }\n }\n } else {\n p.log.info('No Next.js app found — Running the fresh project mode...')\n const projectPrompt = await promptProject(name)\n srcDir = projectPrompt.useSrcDir\n\n // Ask for preferred package manager\n if (!options.yes) {\n const pmChoice = await p.select({\n message: 'Which package manager do you want to use?',\n options: [\n { value: 'pnpm' as const, label: 'pnpm', hint: 'recommended' },\n { value: 'npm' as const, label: 'npm' },\n { value: 'yarn' as const, label: 'yarn' },\n { value: 'bun' as const, label: 'bun' }\n ]\n })\n if (p.isCancel(pmChoice)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n pm = pmChoice\n }\n\n // Run create-next-app using the selected package manager's native command\n // to avoid nested-npx issues when BetterStart shells out to CNA.\n const displayName =\n projectPrompt.projectName === '.' ? path.basename(cwd) : projectPrompt.projectName\n\n const { bin, prefix } = createNextAppCommand(pm)\n const cnaArgs = [\n ...prefix,\n projectPrompt.projectName,\n '--yes',\n '--typescript',\n '--tailwind',\n '--app',\n '--turbopack',\n '--biome',\n '--react-compiler',\n `--use-${pm}`\n ]\n if (srcDir) cnaArgs.push('--src-dir')\n else cnaArgs.push('--no-src-dir')\n\n const createNextAppSpinner = p.spinner()\n createNextAppSpinner.start(`Creating a Next.js app (latest)`)\n\n const createNextAppResult = await runQuietCommand(bin, cnaArgs, {\n cwd,\n timeoutMs: 120_000\n })\n\n if (!createNextAppResult.success) {\n createNextAppSpinner.stop(`Failed to create Next.js app: ${displayName}`)\n if (createNextAppResult.output.trim().length > 0) {\n process.stderr.write(`${createNextAppResult.output.trimEnd()}\\n`)\n }\n p.log.error(createNextAppResult.error)\n p.log.info(\n `You can create the project manually:\\n ${pc.cyan(`npx create-next-app@latest ${projectPrompt.projectName} --typescript --tailwind --app`)}\\n Then run ${pc.cyan('betterstart init')} inside it.`\n )\n process.exit(1)\n }\n\n // Move into the new project directory\n cwd = path.resolve(cwd, projectPrompt.projectName)\n\n // Verify the project was actually created\n const hasPackageJson = fs.existsSync(path.join(cwd, 'package.json'))\n const hasNextConfig = ['next.config.ts', 'next.config.js', 'next.config.mjs'].some((f) =>\n fs.existsSync(path.join(cwd, f))\n )\n\n if (!hasPackageJson || !hasNextConfig) {\n createNextAppSpinner.stop(`Failed to create Next.js app: ${displayName}`)\n p.log.error(\n 'create-next-app completed but the project was not created. This can happen with nested npx calls.'\n )\n const manualCmd = `npx create-next-app@latest ${projectPrompt.projectName} --typescript --tailwind --app`\n p.log.info(\n `Create the project manually:\\n ${pc.cyan(manualCmd)}\\n Then run ${pc.cyan('betterstart init')} inside it.`\n )\n process.exit(1)\n }\n\n const installedNextVersion = detectInstalledNextVersion(cwd)\n const nextVersionSuffix = installedNextVersion ? `${pc.cyan(`v${installedNextVersion}`)}` : ''\n\n createNextAppSpinner.stop(`Created a Next.js ${nextVersionSuffix} app in ${displayName}`)\n project = detectProject(cwd, namespace)\n isFreshProject = true\n }\n\n const selectedPlugins = (() => {\n if (options.plugins) {\n return parsePluginList(options.plugins)\n }\n\n return []\n })()\n const selectedIntegrations = (() => {\n if (options.integrations) {\n return parseIntegrationList(options.integrations)\n }\n\n return []\n })()\n\n const pluginSelection =\n selectedPlugins.length > 0 || selectedIntegrations.length > 0\n ? {\n plugins: selectedPlugins,\n integrations: selectedIntegrations,\n storage: selectedIntegrations.includes('r2') ? 'r2' : 'local'\n }\n : options.yes\n ? {\n plugins: [] as ReturnType<typeof parsePluginList>,\n integrations: [] as ReturnType<typeof parseIntegrationList>,\n storage: 'local' as const\n }\n : await promptPlugins()\n\n // Database URL — check existing .env.local first, then prompt if needed\n let databaseUrl: string | undefined\n const existingDbUrl = readExistingDbUrl(cwd)\n\n if (options.yes) {\n // Non-interactive mode: --database-url flag > existing env > placeholder\n if (options.databaseUrl) {\n if (!isValidDbUrl(options.databaseUrl)) {\n p.log.error(\n `Invalid database URL. Must start with ${pc.cyan('postgres://')} or ${pc.cyan('postgresql://')}`\n )\n process.exit(1)\n }\n databaseUrl = options.databaseUrl\n } else if (existingDbUrl) {\n databaseUrl = existingDbUrl\n }\n // else: no flag, no existing → use placeholder (databaseUrl stays undefined)\n } else if (existingDbUrl) {\n // Interactive mode but a valid URL already exists — skip the prompt\n const masked = maskDbUrl(existingDbUrl)\n p.log.info(`Using existing database URL from .env.local ${pc.dim(`(${masked})`)}`)\n databaseUrl = existingDbUrl\n } else {\n const dbResult = await promptDatabase()\n databaseUrl = dbResult.url\n }\n\n // Build config\n const nextMajorVersion = detectNextMajorVersion(cwd)\n const config: ResolvedBetterstartConfig = {\n ...getDefaultConfig(srcDir, nextMajorVersion)\n }\n config.frameworkConfig.next.namespace = namespace\n config.frameworkConfig.next.paths = deriveNamespacePaths(namespace, srcDir)\n config.paths = config.frameworkConfig.next.paths\n config.database.migrationsDir = deriveMigrationsDir(namespace)\n\n // Run scaffolders — group fast steps under one spinner, then show results in a note box\n interface ScaffoldResult {\n label: string\n result: string\n }\n const results: ScaffoldResult[] = []\n const s = p.spinner()\n\n s.start('Directory structure')\n\n const baseFiles = scaffoldBase({\n cwd,\n config,\n includeEmailTemplatesDir: pluginSelection.integrations.some(isEmailProviderIntegration)\n })\n results.push({ label: 'Directory structure', result: `${baseFiles.length} files` })\n\n s.message('TypeScript aliases')\n const tsResult = scaffoldTsconfig(cwd, config)\n results.push({\n label: 'TypeScript aliases',\n result: tsResult.added.length > 0 ? `${tsResult.added.length} paths` : 'already set'\n })\n\n s.message('Tailwind CSS')\n const twResult = scaffoldTailwind(cwd, srcDir, namespace)\n results.push({\n label: 'Tailwind CSS',\n result: twResult.appended ? 'updated' : twResult.file ? 'already set' : 'no CSS file'\n })\n\n s.message('Dev server')\n const devServerResult = ensureDefaultDevScriptPort(cwd)\n results.push({\n label: 'Dev server',\n result: formatDevServerResult(devServerResult)\n })\n\n s.message('Environment variables')\n const envResult = scaffoldEnv(cwd, { databaseUrl, namespace })\n const envCount = envResult.added.length + envResult.updated.length\n results.push({\n label: 'Environment variables',\n result: envCount > 0 ? `${envCount} vars` : 'already set'\n })\n\n s.message('Database')\n const dbFiles = scaffoldDatabase({ cwd, config })\n results.push({ label: 'Database', result: `${dbFiles.length} files` })\n\n s.message('Authentication')\n const authFiles = scaffoldAuth({ cwd, config })\n results.push({ label: 'Authentication', result: `${authFiles.length} files` })\n\n s.message('Components')\n const compFiles = scaffoldComponents({ cwd, config })\n results.push({ label: 'Components', result: `${compFiles.length} files` })\n\n s.message('Pages & layouts')\n const layoutFiles = scaffoldLayout({ cwd, config })\n results.push({ label: 'Pages & layouts', result: `${layoutFiles.length} files` })\n\n s.message('API routes')\n const apiFiles = scaffoldApiRoutes({ cwd, config })\n results.push({ label: 'API routes', result: `${apiFiles.length} routes` })\n\n s.message('Linter')\n let linterResult: string\n if (project.linter.type === 'none') {\n const biomeResult = scaffoldBiome(cwd, project.linter)\n linterResult = biomeResult.installed ? 'biome (new)' : 'none'\n } else {\n linterResult = project.linter.type\n }\n results.push({ label: 'Linter', result: linterResult })\n\n s.message('Next.js config')\n const nextConfigResult = scaffoldNextConfig({ cwd, nextMajorVersion })\n results.push({\n label: 'Next.js config',\n result:\n nextConfigResult.status === 'created'\n ? 'created'\n : nextConfigResult.status === 'updated'\n ? 'updated'\n : nextConfigResult.status === 'already-set'\n ? 'already set'\n : nextConfigResult.status === 'not-needed'\n ? 'not needed'\n : 'manual setup needed'\n })\n\n // Build the note content before stopping the spinner\n const maxLabel = Math.max(...results.map((r) => r.label.length))\n const noteLines = results.map((r) => {\n const padded = r.label.padEnd(maxLabel + 3)\n return `${pc.green('✓')} ${padded}${pc.dim(r.result)}`\n })\n\n // Stop spinner quietly and erase the empty stop line, then show results card\n s.stop('')\n process.stdout.write('\\x1B[2A\\x1B[J')\n p.note(noteLines.join('\\n'), 'Scaffolded admin')\n\n // If drizzle.config.ts already existed (wasn't created), offer to update it\n const drizzleConfigPath = path.join(cwd, 'drizzle.config.ts')\n if (!dbFiles.includes('drizzle.config.ts') && fs.existsSync(drizzleConfigPath)) {\n if (forceMode) {\n const { readNamespacedTemplate } = await import('@next-adapter/template-reader.js')\n fs.writeFileSync(\n drizzleConfigPath,\n readNamespacedTemplate('drizzle.config.ts', namespace),\n 'utf-8'\n )\n p.log.success('Updated drizzle.config.ts')\n } else if (!options.yes) {\n const overwrite = await p.confirm({\n message: 'drizzle.config.ts already exists. Overwrite with latest version?',\n initialValue: true\n })\n if (!p.isCancel(overwrite) && overwrite) {\n const { readNamespacedTemplate } = await import('@next-adapter/template-reader.js')\n fs.writeFileSync(\n drizzleConfigPath,\n readNamespacedTemplate('drizzle.config.ts', namespace),\n 'utf-8'\n )\n p.log.success('Updated drizzle.config.ts')\n }\n }\n }\n\n // Install dependencies (async so spinner can animate)\n const coreDependencyPlan = getDependencyPlan([], [], project.linter.type === 'none')\n const cliDependencyPlan = getCliDependencySyncPlan(cwd)\n s.start('Installing dependencies (this may take a minute)')\n const depsResult = await installDependenciesAsync({\n cwd,\n pm,\n dependencies: Array.from(\n new Set([...coreDependencyPlan.dependencies, ...(cliDependencyPlan?.dependencies ?? [])])\n ),\n devDependencies: Array.from(\n new Set([\n ...coreDependencyPlan.devDependencies,\n ...(cliDependencyPlan?.devDependencies ?? [])\n ])\n )\n })\n let depsInstalled = false\n if (depsResult.success) {\n s.stop('')\n depsInstalled = true\n } else {\n s.stop('Failed to install dependencies')\n p.log.warning(depsResult.error ?? 'Unknown error')\n p.log.info(\n `You can install them manually:\\n ${pc.cyan(`${pm} add ${depsResult.dependencies.join(' ')}`)}\\n ${pc.cyan(`${pm} add -D ${depsResult.devDeps.join(' ')}`)}`\n )\n }\n\n // Generate core-owned schemas\n if (depsInstalled) {\n process.stdout.write('\\x1B[2A\\x1B[J')\n }\n s.start('Generating core schemas')\n const coreSchemasResult = scaffoldCoreSchemas({ cwd, config })\n s.stop('')\n process.stdout.write('\\x1B[2A\\x1B[J')\n\n // Install selected plugins through the shared plugin pipeline\n const pluginInstallResult =\n pluginSelection.plugins.length > 0\n ? (() => {\n s.start(`Installing plugins: ${pluginSelection.plugins.join(', ')}`)\n return installPlugins({\n cwd,\n config,\n pm,\n pluginIds: pluginSelection.plugins,\n interactive: !options.yes,\n includeBiome: project.linter.type === 'none'\n })\n })()\n : Promise.resolve({ installed: [], skipped: [], warnings: [], config })\n const resolvedPluginInstallResult = await pluginInstallResult\n if (pluginSelection.plugins.length > 0) {\n s.stop('')\n process.stdout.write('\\x1B[2A\\x1B[J')\n }\n\n const integrationInstallResult =\n pluginSelection.integrations.length > 0\n ? (() => {\n s.start(`Installing integrations: ${pluginSelection.integrations.join(', ')}`)\n return installIntegrations({\n cwd,\n config: resolvedPluginInstallResult.config,\n pm,\n integrationIds: pluginSelection.integrations,\n interactive: !options.yes,\n includeBiome: project.linter.type === 'none'\n })\n })()\n : Promise.resolve({\n installed: [],\n skipped: [],\n warnings: [],\n config: resolvedPluginInstallResult.config\n })\n const resolvedIntegrationInstallResult = await integrationInstallResult\n if (pluginSelection.integrations.length > 0) {\n s.stop('')\n process.stdout.write('\\x1B[2A\\x1B[J')\n }\n\n writeConfigFile(cwd, resolvedIntegrationInstallResult.config)\n const usesLocalStorage = resolvedIntegrationInstallResult.config.storage.provider !== 'r2'\n\n // Build combined note for deps + core/plugin install\n const installLines: string[] = []\n if (depsInstalled) {\n installLines.push(\n `${pc.green('✓')} Dependencies ${pc.dim(`${depsResult.dependencies.length} deps + ${depsResult.devDeps.length} dev deps`)}`\n )\n }\n if (coreSchemasResult.errors.length > 0) {\n installLines.push(\n `${pc.yellow('▲')} Core schemas ${pc.dim(`${coreSchemasResult.errors.length} warning(s)`)}`\n )\n for (const err of coreSchemasResult.errors) {\n installLines.push(` ${pc.dim(err)}`)\n }\n } else {\n installLines.push(\n `${pc.green('✓')} Core schemas ${pc.dim(`${coreSchemasResult.schemas.length} schemas, ${coreSchemasResult.generatedFiles.length} files`)}`\n )\n }\n installLines.push(\n `${pc.green('✓')} Plugins ${pc.dim(resolvedPluginInstallResult.installed.length > 0 ? resolvedPluginInstallResult.installed.join(', ') : 'core only')}`\n )\n for (const warning of resolvedPluginInstallResult.warnings) {\n installLines.push(` ${pc.yellow('▲')} ${warning}`)\n }\n installLines.push(\n `${pc.green('✓')} Integrations ${pc.dim(resolvedIntegrationInstallResult.installed.length > 0 ? resolvedIntegrationInstallResult.installed.join(', ') : 'none')}`\n )\n for (const warning of resolvedIntegrationInstallResult.warnings) {\n installLines.push(` ${pc.yellow('▲')} ${warning}`)\n }\n if (usesLocalStorage) {\n installLines.push(\n ` ${pc.yellow('▲')} Local filesystem storage is only for development or self-hosted persistent-disk deployments. Use Cloudflare R2 or AWS S3 for hosted/serverless production.`\n )\n }\n p.note(installLines.join('\\n'), 'Installed')\n\n // Push database schema after core/plugin generation so entity tables are included\n let dbPushed = false\n if (depsResult.success && options.skipMigration && hasDbUrl(cwd)) {\n p.log.info(`Skipping database schema push ${pc.dim('(--skip-migration)')}`)\n } else if (depsResult.success && hasDbUrl(cwd)) {\n let driverReady = hasDrizzleKitPostgresDriverDependency(cwd)\n\n if (!driverReady) {\n s.start(\n `Installing Drizzle Kit Postgres driver dependency (${DRIZZLE_KIT_POSTGRES_DRIVER_DEP})`\n )\n const driverResult = await installDependenciesAsync({\n cwd,\n pm,\n dependencies: [],\n devDependencies: [DRIZZLE_KIT_POSTGRES_DRIVER_DEP]\n })\n\n if (!driverResult.success) {\n s.stop('Database push failed')\n p.log.warning(driverResult.error ?? `Failed to install ${DRIZZLE_KIT_POSTGRES_DRIVER_DEP}`)\n p.log.info(\n `Install ${DRIZZLE_KIT_POSTGRES_DRIVER_DEP} manually, then run: ${pc.cyan(drizzlePushCommand(pm))}`\n )\n } else {\n driverReady = hasDrizzleKitPostgresDriverDependency(cwd)\n s.stop(`${pc.green('✓')} Drizzle Kit Postgres driver dependency installed`)\n }\n }\n\n if (driverReady) {\n const useTerminalForDbPush = shouldUseTerminalForDbPush(options)\n if (useTerminalForDbPush) {\n p.log.info(`Running ${pc.cyan('drizzle-kit push --force')}`)\n } else {\n s.start('Pushing database schema (drizzle-kit push)')\n }\n\n const pushResult = await runDrizzlePush(cwd, { inheritStdio: useTerminalForDbPush })\n if (pushResult.success) {\n if (useTerminalForDbPush) {\n p.log.success('Database schema pushed')\n } else {\n s.stop(`${pc.green('✓')} Database schema pushed`)\n }\n dbPushed = true\n } else {\n if (!useTerminalForDbPush) {\n s.stop('Database push failed')\n }\n p.log.warning(pushResult.error ?? 'Unknown error')\n p.log.info(`You can run it manually: ${pc.cyan(drizzlePushCommand(pm))}`)\n }\n }\n }\n\n // Auto-seed admin user (only when db push succeeded and interactive mode)\n let seedEmail: string | undefined\n let seedPassword: string | undefined\n let seedSuccess = false\n let adminAccountReady = false\n\n if (dbPushed && options.skipAdminCreation) {\n p.log.info(\n `Skipping admin user creation ${pc.dim(`(use ${betterstartExecCommand(pm, 'seed')} later)`)}`\n )\n }\n\n if (dbPushed && !options.yes && !options.skipAdminCreation) {\n const adminDir = config.paths?.admin ?? './admin'\n const authBasePath = `${resolveAdminNamespace(namespace).apiPath}/auth`\n let replaceExistingAdmin = false\n const adminCheck = await checkExistingAdmin(cwd, adminDir, authBasePath)\n\n if (adminCheck.error) {\n p.log.warning(`Could not verify existing admin account ${pc.dim(`(${adminCheck.error})`)}`)\n } else if (adminCheck.existingAdmin) {\n const existingAdminLabel = formatAdminIdentity(adminCheck.existingAdmin)\n const adminAction = await p.select({\n message: 'Found an already existing admin account. Do you want to replace it or skip?',\n options: [\n {\n value: 'replace' as const,\n label: 'Replace',\n hint: existingAdminLabel\n },\n {\n value: 'skip' as const,\n label: 'Skip'\n }\n ]\n })\n\n if (p.isCancel(adminAction)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n if (adminAction === 'skip') {\n adminAccountReady = true\n p.log.info(`Keeping existing admin account ${pc.dim(`(${existingAdminLabel})`)}`)\n } else {\n replaceExistingAdmin = true\n }\n }\n\n if (!adminAccountReady) {\n p.note(\n pc.dim(\n replaceExistingAdmin\n ? 'Replace the existing admin account to access the admin.'\n : 'Create your first admin user to access the admin.'\n ),\n 'Admin account'\n )\n\n const credentials = await p.group(\n {\n email: () =>\n p.text({\n message: 'Admin email',\n placeholder: 'admin@example.com',\n validate: (v) => {\n if (!v || !v.includes('@')) return 'Please enter a valid email'\n }\n }),\n password: () =>\n p.password({\n message: 'Admin password',\n validate: (v) => {\n if (!v || v.length < 8) return 'Password must be at least 8 characters'\n }\n })\n },\n {\n onCancel: () => {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n }\n )\n\n seedEmail = credentials.email\n seedPassword = credentials.password\n\n let seedOverwriteMode: SeedOverwriteMode | undefined = replaceExistingAdmin\n ? 'admin'\n : undefined\n s.start(replaceExistingAdmin ? 'Replacing admin user' : 'Creating admin user')\n let seedResult = await runSeed(\n cwd,\n adminDir,\n authBasePath,\n credentials.email,\n credentials.password,\n seedOverwriteMode\n )\n\n if (seedResult.existingUser) {\n s.stop(`${pc.yellow('▲')} An account already exists for ${credentials.email}`)\n const replace = await p.confirm({\n message: 'Replace the existing account with this email?',\n initialValue: false\n })\n if (!p.isCancel(replace) && replace) {\n seedOverwriteMode = 'email'\n s.start('Replacing admin user')\n seedResult = await runSeed(\n cwd,\n adminDir,\n authBasePath,\n credentials.email,\n credentials.password,\n seedOverwriteMode\n )\n }\n }\n\n if (seedResult.success) {\n s.stop(\n seedOverwriteMode === 'admin'\n ? `${pc.green('✓')} Admin user replaced`\n : `${pc.green('✓')} Admin user created`\n )\n seedSuccess = true\n adminAccountReady = true\n } else if (seedResult.error) {\n s.stop(`${pc.red('✗')} Failed to create admin user`)\n p.note(\n `${pc.red(seedResult.error)}\\n\\nRun manually: ${pc.cyan(betterstartExecCommand(pm, 'seed'))}`,\n pc.red('Seed failed')\n )\n }\n }\n }\n\n // Git init + commit for fresh projects\n if (isFreshProject) {\n s.start('Creating initial git commit')\n try {\n execFileSync('git', ['init'], { cwd, stdio: 'pipe' })\n execFileSync('git', ['add', '.'], { cwd, stdio: 'pipe' })\n execFileSync('git', ['commit', '-m', 'Initial commit from BetterStart'], {\n cwd,\n stdio: 'pipe'\n })\n s.stop('Created initial git commit')\n } catch {\n s.stop('Git commit skipped')\n }\n }\n\n const totalFiles =\n baseFiles.length +\n dbFiles.length +\n authFiles.length +\n compFiles.length +\n layoutFiles.length +\n apiFiles.length\n\n const adminNamespace = resolveAdminNamespace(namespace)\n const adminLoginUrl = `http://localhost:${detectDevPort(cwd)}${adminNamespace.routePath}/login`\n const installedPluginList =\n resolvedPluginInstallResult.installed.length > 0\n ? resolvedPluginInstallResult.installed.join(', ')\n : 'core only'\n const installedIntegrationList =\n resolvedIntegrationInstallResult.installed.length > 0\n ? resolvedIntegrationInstallResult.installed.join(', ')\n : 'none'\n\n // Summary\n const summaryLines: string[] = [\n `Plugins: ${pc.cyan(installedPluginList)}`,\n `Integrations: ${pc.cyan(installedIntegrationList)}`,\n `Storage: ${pc.cyan(usesLocalStorage ? 'local filesystem' : 'Cloudflare R2')}`,\n `Files created: ${pc.cyan(String(totalFiles))}`,\n `Env vars: ${envResult.added.length} added, ${envResult.skipped.length} skipped`\n ]\n\n // Next steps\n const nextSteps: string[] = []\n let step = 1\n const envStepLabel = databaseUrl\n ? `Fill in remaining values in ${pc.cyan('.env.local')}`\n : `Fill in values in ${pc.cyan('.env.local')}`\n nextSteps.push(` ${step++}. ${envStepLabel}`)\n if (!dbPushed) {\n nextSteps.push(` ${step++}. Run ${pc.cyan(drizzlePushCommand(pm))} to sync the database`)\n }\n if (!adminAccountReady) {\n nextSteps.push(\n ` ${step++}. Run ${pc.cyan(betterstartExecCommand(pm, 'seed'))} to create an admin user`\n )\n }\n nextSteps.push(\n ` ${step++}. Run ${pc.cyan(runCommand(pm, 'dev'))} and open ${pc.cyan(adminLoginUrl)}`\n )\n nextSteps.push(\n ` ${step++}. Run ${pc.cyan(betterstartExecCommand(pm, 'generate <schema>'))} to create content types`\n )\n nextSteps.push(\n ` ${step++}. Run ${pc.cyan(betterstartExecCommand(pm, 'add --integration <name>'))} to install integrations later`\n )\n\n summaryLines.push('', 'Next steps:', ...nextSteps)\n\n p.note(summaryLines.join('\\n'), 'Admin scaffolded successfully')\n\n // Offer to start the dev server (interactive mode only)\n if (!options.yes && !options.skipDevServerStart) {\n const devCmd = runCommand(pm, 'dev')\n const startDev = await p.confirm({\n message: 'Start the development server?',\n initialValue: true\n })\n\n if (!p.isCancel(startDev) && startDev) {\n p.outro(`Starting ${pc.cyan(devCmd)}...`)\n await startManagedDevServer(cwd, devCmd, adminLoginUrl, {\n email: seedSuccess && seedEmail ? seedEmail : undefined,\n password: seedSuccess && seedPassword ? seedPassword : undefined\n })\n return\n }\n }\n\n p.outro('Done!')\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Validate a database connection URL */\nfunction isValidDbUrl(url: string): boolean {\n return url.startsWith('postgres://') || url.startsWith('postgresql://')\n}\n\n/** Read DATABASE_URL from .env.local, returning the value if it's a real URL. */\nfunction readExistingDbUrl(cwd: string): string | undefined {\n const envPath = path.join(cwd, '.env.local')\n if (!fs.existsSync(envPath)) return undefined\n const content = fs.readFileSync(envPath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed.startsWith('#') || !trimmed.includes('=')) continue\n const [key, ...rest] = trimmed.split('=')\n if (key?.trim() === 'DATABASE_URL') {\n const val = rest\n .join('=')\n .replace(/^['\"]|['\"]$/g, '')\n .trim()\n if (\n val.length > 0 &&\n !val.startsWith('your_') &&\n val !== 'postgresql://...' &&\n isValidDbUrl(val)\n ) {\n return val\n }\n }\n }\n return undefined\n}\n\n/** Mask a database URL for display: show host only. */\nfunction maskDbUrl(url: string): string {\n try {\n const parsed = new URL(url)\n return `${parsed.protocol}//${parsed.host}/***`\n } catch {\n return 'postgres://***'\n }\n}\n\n/** Check if DATABASE_URL is set in .env.local */\nfunction hasDbUrl(cwd: string): boolean {\n const envPath = path.join(cwd, '.env.local')\n if (!fs.existsSync(envPath)) return false\n const content = fs.readFileSync(envPath, 'utf-8')\n // Check the var exists and has a non-placeholder value\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed.startsWith('#') || !trimmed.includes('=')) continue\n const [key, ...rest] = trimmed.split('=')\n if (key?.trim() === 'DATABASE_URL') {\n const val = rest.join('=').trim()\n const unquoted = val.replace(/^['\"]|['\"]$/g, '')\n return unquoted.length > 0 && !unquoted.startsWith('your_') && unquoted !== 'postgresql://...'\n }\n }\n return false\n}\n\ninterface SeedResult {\n success: boolean\n error: string | null\n existingUser?: string\n}\n\ninterface ExistingAdmin {\n email: string\n name?: string\n}\n\ninterface ExistingAdminCheckResult {\n existingAdmin?: ExistingAdmin\n error: string | null\n}\n\ntype SeedOverwriteMode = 'admin' | 'email'\n\ninterface QuietCommandResult {\n success: boolean\n error: string\n output: string\n}\n\nfunction detectInstalledNextVersion(cwd: string): string | undefined {\n const installedNextPackagePath = path.join(cwd, 'node_modules', 'next', 'package.json')\n if (fs.existsSync(installedNextPackagePath)) {\n try {\n const installedPkg = JSON.parse(fs.readFileSync(installedNextPackagePath, 'utf-8')) as {\n version?: unknown\n }\n if (typeof installedPkg.version === 'string' && installedPkg.version.length > 0) {\n return installedPkg.version\n }\n } catch {\n // Fall through to the project package.json dependency range.\n }\n }\n\n const projectPackagePath = path.join(cwd, 'package.json')\n if (!fs.existsSync(projectPackagePath)) return undefined\n\n try {\n const projectPkg = JSON.parse(fs.readFileSync(projectPackagePath, 'utf-8')) as {\n dependencies?: Record<string, unknown>\n devDependencies?: Record<string, unknown>\n }\n const nextVersion = projectPkg.dependencies?.next ?? projectPkg.devDependencies?.next\n if (typeof nextVersion !== 'string' || nextVersion.length === 0) {\n return undefined\n }\n return nextVersion.replace(/^[~^<>=\\s]+/, '')\n } catch {\n return undefined\n }\n}\n\nfunction formatDevServerResult(result: DevScriptPortResult): string {\n switch (result.status) {\n case 'updated':\n return `set to ${result.port}`\n case 'preserved':\n return `using ${result.port}`\n case 'skipped':\n return `custom script preserved; BetterStart uses ${result.port}`\n case 'missing-script':\n return `no dev script; BetterStart uses ${result.port}`\n case 'missing-package':\n return `package.json missing; BetterStart uses ${result.port}`\n }\n}\n\nfunction shouldUseTerminalForDbPush(options: InitCommandOptions): boolean {\n return (\n !options.yes &&\n process.env.CI !== 'true' &&\n Boolean(process.stdin.isTTY) &&\n Boolean(process.stdout.isTTY)\n )\n}\n\nfunction betterstartExecCommand(\n pm: ReturnType<typeof detectPackageManager>,\n subcommand: string\n): string {\n switch (pm) {\n case 'pnpm':\n return `pnpm betterstart ${subcommand}`.trim()\n case 'yarn':\n return `yarn betterstart ${subcommand}`.trim()\n case 'bun':\n return `bunx betterstart ${subcommand}`.trim()\n default:\n return `npx betterstart ${subcommand}`.trim()\n }\n}\n\nfunction drizzlePushCommand(pm: ReturnType<typeof detectPackageManager>): string {\n switch (pm) {\n case 'pnpm':\n return 'pnpm drizzle-kit push'\n case 'yarn':\n return 'yarn drizzle-kit push'\n case 'bun':\n return 'bunx drizzle-kit push'\n default:\n return 'npx drizzle-kit push'\n }\n}\n\nfunction formatAdminIdentity(admin: ExistingAdmin): string {\n return admin.name?.trim() ? `${admin.name} (${admin.email})` : admin.email\n}\n\nfunction runSeedScript(\n cwd: string,\n adminDir: string,\n authBasePath: string,\n envOverrides: NodeJS.ProcessEnv\n): Promise<{\n code: number | null\n stdout: string\n stderr: string\n timeout: boolean\n spawnError?: string\n}> {\n const scriptsDir = path.join(cwd, adminDir, 'scripts')\n const seedPath = path.join(scriptsDir, 'seed.ts')\n\n if (!fs.existsSync(scriptsDir)) {\n fs.mkdirSync(scriptsDir, { recursive: true })\n }\n fs.writeFileSync(seedPath, buildSeedScript(authBasePath), 'utf-8')\n\n const cleanup = () => {\n try {\n fs.unlinkSync(seedPath)\n if (fs.existsSync(scriptsDir) && fs.readdirSync(scriptsDir).length === 0) {\n fs.rmdirSync(scriptsDir)\n }\n } catch {\n // Not critical\n }\n }\n\n return new Promise((resolve) => {\n const tsxBin = path.join(cwd, 'node_modules', '.bin', 'tsx')\n const child = spawn(tsxBin, [seedPath], {\n cwd,\n stdio: 'pipe',\n env: {\n ...process.env,\n ...envOverrides\n }\n })\n let stdout = ''\n let stderr = ''\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString()\n })\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString()\n })\n const timeout = setTimeout(() => {\n child.kill()\n cleanup()\n resolve({ code: null, stdout, stderr, timeout: true })\n }, 30_000)\n child.on('close', (code) => {\n clearTimeout(timeout)\n cleanup()\n resolve({ code, stdout, stderr, timeout: false })\n })\n child.on('error', (err) => {\n clearTimeout(timeout)\n cleanup()\n resolve({ code: null, stdout, stderr, timeout: false, spawnError: err.message })\n })\n })\n}\n\n/** Check whether an admin account already exists before prompting for credentials. */\nasync function checkExistingAdmin(\n cwd: string,\n adminDir: string,\n authBasePath: string\n): Promise<ExistingAdminCheckResult> {\n const result = await runSeedScript(cwd, adminDir, authBasePath, {\n SEED_CHECK_ADMIN: 'true'\n })\n\n if (result.timeout) {\n return { error: 'Admin account check timed out after 30 seconds' }\n }\n\n if (result.spawnError) {\n return { error: parseSeedError(result.stdout, result.spawnError) }\n }\n\n if (result.code === 0) {\n return { error: null }\n }\n\n if (result.code === 3) {\n const rawAdmin = result.stdout.match(/EXISTING_ADMIN:(.+)/)?.[1]?.trim()\n if (!rawAdmin) {\n return { error: 'Admin account check returned an unreadable response' }\n }\n\n try {\n const existingAdmin = JSON.parse(rawAdmin) as ExistingAdmin\n return { existingAdmin, error: null }\n } catch {\n return { error: 'Admin account check returned an unreadable response' }\n }\n }\n\n return { error: parseSeedError(result.stdout, result.stderr) }\n}\n\n/** Write seed script, run it with tsx, clean up. Returns success/error. */\nasync function runSeed(\n cwd: string,\n adminDir: string,\n authBasePath: string,\n email: string,\n password: string,\n overwriteMode?: SeedOverwriteMode\n): Promise<SeedResult> {\n const result = await runSeedScript(cwd, adminDir, authBasePath, {\n SEED_EMAIL: email,\n SEED_PASSWORD: password,\n SEED_NAME: 'Admin',\n ...(overwriteMode ? { SEED_OVERWRITE_MODE: overwriteMode } : {})\n })\n\n if (result.timeout) {\n return { success: false, error: 'Seed timed out after 30 seconds' }\n }\n\n if (result.spawnError) {\n return { success: false, error: parseSeedError(result.stdout, result.spawnError) }\n }\n\n if (result.code === 0) {\n return { success: true, error: null }\n }\n\n if (result.code === 2) {\n // Exit code 2 = user already exists\n const name = result.stdout.match(/EXISTING_USER:(.+)/)?.[1]?.trim()\n return { success: false, error: null, existingUser: name ?? email }\n }\n\n return { success: false, error: parseSeedError(result.stdout, result.stderr) }\n}\n\n/** Extract a human-readable error from seed script output */\nfunction parseSeedError(stdout: string, stderr: string): string {\n // Check for common patterns in stderr/stdout\n const combined = `${stdout}\\n${stderr}`\n\n // \"Seed failed: <message>\" from the catch handler\n const seedFailed = combined.match(/Seed failed:\\s*(.+)/)?.[1]?.trim()\n if (seedFailed) return seedFailed\n\n // \"Failed to create user\" from auth API failure\n if (combined.includes('Failed to create user')) return 'Auth API failed to create user'\n\n // Connection errors\n if (combined.includes('ECONNREFUSED') || combined.includes('connection refused'))\n return 'Could not connect to database'\n if (combined.includes('DATABASE_URL')) return 'Database URL is missing or invalid'\n if (combined.includes('password authentication failed'))\n return 'Database authentication failed — check your connection string'\n if (combined.includes('does not exist') && combined.includes('relation'))\n return 'Database tables not found — run drizzle-kit push first'\n if (combined.includes('MODULE_NOT_FOUND') || combined.includes('Cannot find module'))\n return 'Missing dependencies — run your package manager install first'\n\n // Fall back to first meaningful line of stderr\n const firstLine = stderr\n .split('\\n')\n .map((l) => l.trim())\n .find((l) => l.length > 0 && !l.startsWith('at ') && !l.startsWith('node:'))\n if (firstLine) return firstLine\n\n return 'Unknown error — run betterstart seed for details'\n}\n\nfunction runQuietCommand(\n bin: string,\n args: string[],\n options: {\n cwd: string\n timeoutMs: number\n env?: NodeJS.ProcessEnv\n }\n): Promise<QuietCommandResult> {\n return new Promise((resolve) => {\n const child = spawn(bin, args, {\n cwd: options.cwd,\n stdio: 'pipe',\n env: {\n ...process.env,\n ...options.env\n }\n })\n\n let stdout = ''\n let stderr = ''\n let timedOut = false\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout += chunk.toString()\n })\n\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr += chunk.toString()\n })\n\n const timeout = setTimeout(() => {\n timedOut = true\n child.kill('SIGTERM')\n }, options.timeoutMs)\n\n child.on('close', (code, signal) => {\n clearTimeout(timeout)\n\n const output = [stdout.trimEnd(), stderr.trimEnd()].filter(Boolean).join('\\n')\n\n if (timedOut) {\n resolve({\n success: false,\n error: `Command timed out after ${Math.floor(options.timeoutMs / 1000)} seconds`,\n output\n })\n return\n }\n\n if (signal) {\n resolve({\n success: false,\n error: `Command was terminated by ${signal}`,\n output\n })\n return\n }\n\n if (code === 0) {\n resolve({\n success: true,\n error: '',\n output\n })\n return\n }\n\n resolve({\n success: false,\n error: `Command exited with code ${code ?? 'unknown'}`,\n output\n })\n })\n\n child.on('error', (err) => {\n clearTimeout(timeout)\n const output = [stdout.trimEnd(), stderr.trimEnd()].filter(Boolean).join('\\n')\n resolve({\n success: false,\n error: err.message,\n output\n })\n })\n })\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(ANSI_ESCAPE_PATTERN, '')\n}\n\nfunction printAdminReadyNote(state: {\n adminLoginUrl: string\n adminEmail?: string\n adminPassword?: string\n}): void {\n const lines = [`Admin: ${pc.cyan(state.adminLoginUrl)}`]\n\n if (state.adminEmail && state.adminPassword) {\n lines.unshift(`Password: ${pc.cyan(state.adminPassword)}`)\n lines.unshift(`Admin user: ${pc.cyan(state.adminEmail)}`)\n }\n\n p.note(lines.join('\\n'), 'Admin ready')\n}\n\nfunction shouldSuppressDevServerStartupLine(line: string): {\n suppress: boolean\n isReadyLine: boolean\n} {\n const plain = stripAnsi(line).trim()\n\n if (plain.length === 0) {\n return { suppress: true, isReadyLine: false }\n }\n\n if (plain.includes('Ready in ')) {\n return { suppress: true, isReadyLine: true }\n }\n\n if (\n plain.startsWith('> ') ||\n plain.startsWith('▲ Next.js ') ||\n plain.startsWith('- ') ||\n plain.startsWith('· ') ||\n plain.startsWith('⨯ ')\n ) {\n return { suppress: true, isReadyLine: false }\n }\n\n if (plain.startsWith('✓ ') && !plain.includes('Ready in ')) {\n return { suppress: true, isReadyLine: false }\n }\n\n return { suppress: false, isReadyLine: false }\n}\n\nfunction pipeManagedDevServerStream(\n stream: NodeJS.ReadableStream | null | undefined,\n target: NodeJS.WriteStream,\n state: {\n suppressStartup: boolean\n readyLogged: boolean\n adminLoginUrl: string\n adminEmail?: string\n adminPassword?: string\n }\n): void {\n if (!stream) return\n\n let buffer = ''\n\n const flushBuffer = (flushRemainder = false) => {\n let newlineIndex = buffer.indexOf('\\n')\n\n while (newlineIndex !== -1) {\n const line = buffer.slice(0, newlineIndex + 1)\n buffer = buffer.slice(newlineIndex + 1)\n writeLine(line)\n newlineIndex = buffer.indexOf('\\n')\n }\n\n if (flushRemainder && buffer.length > 0) {\n writeLine(buffer)\n buffer = ''\n }\n }\n\n const writeLine = (line: string) => {\n if (!state.suppressStartup) {\n target.write(line)\n return\n }\n\n const verdict = shouldSuppressDevServerStartupLine(line)\n\n if (verdict.isReadyLine) {\n if (!state.readyLogged) {\n printAdminReadyNote(state)\n state.readyLogged = true\n }\n return\n }\n\n if (verdict.suppress) {\n return\n }\n\n if (state.readyLogged) {\n state.suppressStartup = false\n }\n\n target.write(line)\n }\n\n stream.on('data', (chunk: Buffer | string) => {\n buffer += chunk.toString()\n flushBuffer()\n })\n\n stream.on('end', () => {\n flushBuffer(true)\n })\n}\n\nfunction startManagedDevServer(\n cwd: string,\n devCmd: string,\n adminLoginUrl: string,\n adminCredentials?: {\n email?: string\n password?: string\n }\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const [bin, ...args] = devCmd.split(' ')\n const child = spawn(bin, args, {\n cwd,\n stdio: ['inherit', 'pipe', 'pipe']\n })\n\n const state = {\n suppressStartup: true,\n readyLogged: false,\n adminLoginUrl,\n adminEmail: adminCredentials?.email,\n adminPassword: adminCredentials?.password\n }\n\n const forwardSignal = (signal: NodeJS.Signals) => {\n if (!child.killed) {\n child.kill(signal)\n }\n }\n\n const cleanup = () => {\n process.off('SIGINT', forwardSignal)\n process.off('SIGTERM', forwardSignal)\n process.off('SIGHUP', forwardSignal)\n }\n\n process.on('SIGINT', forwardSignal)\n process.on('SIGTERM', forwardSignal)\n process.on('SIGHUP', forwardSignal)\n\n pipeManagedDevServerStream(child.stdout, process.stdout, state)\n pipeManagedDevServerStream(child.stderr, process.stderr, state)\n\n child.on('close', (code, signal) => {\n cleanup()\n\n if (signal) {\n process.kill(process.pid, signal)\n return\n }\n\n if (typeof code === 'number' && code !== 0) {\n process.exitCode = code\n }\n\n resolve()\n })\n\n child.on('error', (err) => {\n cleanup()\n reject(err)\n })\n })\n}\n","import { execFileSync } from 'node:child_process'\n\nimport * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nexport interface DatabasePromptResult {\n url: string\n}\n\nconst VERCEL_NEON_URL = 'https://vercel.com/dashboard/integrations/checkout/neon'\n\n/**\n * Prompt the user to configure their database connection.\n */\nexport async function promptDatabase(): Promise<DatabasePromptResult> {\n const choice = await p.select({\n message: 'How would you like to connect your PostgreSQL database?',\n options: [\n {\n value: 'vercel-neon' as const,\n label: 'Vercel (Neon)',\n hint: 'opens browser to create a free Postgres database'\n },\n {\n value: 'manual' as const,\n label: 'Enter connection string manually'\n }\n ],\n initialValue: 'vercel-neon' as const\n })\n\n if (p.isCancel(choice)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n if (choice === 'vercel-neon') {\n openBrowser(VERCEL_NEON_URL)\n p.log.info(\n `Opening Vercel... Create a Neon Postgres database, then copy the ${pc.cyan('DATABASE_URL')} from the dashboard.`\n )\n }\n\n const url = await promptConnectionString()\n return { url }\n}\n\n/** Text prompt for the connection string with quote-stripping validation. */\nasync function promptConnectionString(): Promise<string> {\n const input = await p.text({\n message: 'Paste your PostgreSQL connection string',\n placeholder: 'postgres://user:pass@host/db',\n validate(val) {\n const normalized = val?.trim() ?? ''\n\n if (!normalized) {\n return 'A connection string is required to continue'\n }\n\n const stripped = normalized.replace(/^['\"]|['\"]$/g, '')\n if (!stripped.startsWith('postgres://') && !stripped.startsWith('postgresql://')) {\n return 'Must start with postgres:// or postgresql://'\n }\n }\n })\n\n if (p.isCancel(input)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n return (input as string).replace(/^['\"]|['\"]$/g, '').trim()\n}\n\nfunction openBrowser(url: string): void {\n try {\n const platform = process.platform\n if (platform === 'darwin') {\n execFileSync('open', [url], { stdio: 'ignore' })\n } else if (platform === 'win32') {\n execFileSync('cmd', ['/c', 'start', url], { stdio: 'ignore' })\n } else {\n execFileSync('xdg-open', [url], { stdio: 'ignore' })\n }\n } catch {\n // Browser opening is best effort; the prompt still accepts a pasted URL.\n }\n}\n","import { styleText } from 'node:util'\n\nimport * as p from '@clack/prompts'\nimport type { BetterstartIntegrationId } from '@integration-engine/types.js'\nimport type { BetterstartPluginId } from '@plugin-engine/types.js'\n\nexport type StorageMode = 'local' | 'r2'\n\nexport interface PluginPromptResult {\n plugins: BetterstartPluginId[]\n integrations: BetterstartIntegrationId[]\n storage: StorageMode\n}\n\nexport async function promptPlugins(): Promise<PluginPromptResult> {\n const storage = await p.select({\n message: 'Choose a file storage mode',\n options: [\n {\n value: 'r2' as const,\n label: 'Cloudflare R2',\n hint: 'recommended for hosted/serverless production'\n },\n {\n value: 'local' as const,\n label: 'Local filesystem (public/media)',\n hint: 'development or self-hosted persistent disk'\n }\n ],\n initialValue: 'r2' as const\n })\n\n if (p.isCancel(storage)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n const selectedPlugins = await p.multiselect({\n message: `Select preset plugins\\n${styleText('dim', 'Press [Spacebar] to select/unselect')}`,\n options: [\n {\n value: 'blog' as const,\n label: 'Blog',\n hint: 'Posts'\n }\n ],\n required: false,\n initialValues: ['blog' as const]\n })\n\n if (p.isCancel(selectedPlugins)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n const selectedIntegrations = await p.multiselect({\n message: 'Select integrations',\n options: [\n {\n value: 'resend' as const,\n label: 'Resend',\n hint: 'Auth + Forms email delivery'\n },\n {\n value: 'mailchimp' as const,\n label: 'Mailchimp',\n hint: 'Form audience sync'\n }\n ],\n required: false,\n initialValues: []\n })\n\n if (p.isCancel(selectedIntegrations)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n const integrations =\n storage === 'r2' ? [...selectedIntegrations, 'r2' as const] : selectedIntegrations\n return {\n plugins: selectedPlugins,\n integrations,\n storage\n }\n}\n","import * as p from '@clack/prompts'\nimport pc from 'picocolors'\n\nexport interface ProjectPromptResult {\n projectName: string\n useSrcDir: boolean\n}\n\n/**\n * Prompt for project name and src/ directory (fresh project only).\n */\nexport async function promptProject(defaultName?: string): Promise<ProjectPromptResult> {\n const projectName = await p.text({\n message: [\n 'What is your project name?',\n `${pc.cyan('│')} ${pc.dim(\"If you don't want a directory created with the project name, just press `\")}${pc.bold(\n pc.cyan('.')\n )}${pc.dim('` and hit enter.')}`,\n pc.cyan('│')\n ].join('\\n'),\n placeholder: defaultName ?? 'my-app',\n defaultValue: defaultName ?? 'my-app',\n validate: (value) => {\n if (!value?.trim()) return 'Project name is required'\n if (value.trim() === '.') return undefined\n if (!/^[a-z0-9_-]+$/i.test(value.trim())) {\n return 'Project name can only contain letters, numbers, hyphens, and underscores'\n }\n return undefined\n }\n })\n\n if (p.isCancel(projectName)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n const useSrcDir = await p.confirm({\n message: 'Use src/ directory?',\n initialValue: false\n })\n\n if (p.isCancel(useSrcDir)) {\n p.cancel('Setup cancelled.')\n process.exit(0)\n }\n\n return { projectName: projectName.trim(), useSrcDir }\n}\n","import path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { ensureDir, safeWriteFile } from '@core-engine/utils/fs.js'\nimport { applyAdminNamespaceToContent } from '@next-adapter/config/namespace.js'\nimport { applyNextCacheApiForVersion, readTemplate } from '@next-adapter/template-reader.js'\n\nexport interface ApiRoutesScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n}\n\n/**\n * Create Admin API routes under /api/admin/.\n */\nexport function scaffoldApiRoutes({ cwd, config }: ApiRoutesScaffoldOptions): string[] {\n const created: string[] = []\n const apiDir = path.resolve(cwd, config.paths.api)\n const namespace = config.frameworkConfig.next.namespace\n\n function write(relPath: string, content: string): void {\n const fullPath = path.join(apiDir, relPath)\n ensureDir(path.dirname(fullPath))\n const versionedContent = applyNextCacheApiForVersion(content, config.nextMajorVersion)\n if (safeWriteFile(fullPath, applyAdminNamespaceToContent(versionedContent, namespace))) {\n created.push(path.join(config.paths.api, relPath))\n }\n }\n\n // Better Auth catch-all: /api/admin/auth/[...all]/route.ts\n write(path.join('auth', '[...all]', 'route.ts'), readTemplate('api/auth-route.ts'))\n\n // Upload: /api/admin/upload/route.ts\n write(path.join('upload', 'route.ts'), readTemplate('api/upload-route.ts'))\n\n return created\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport fse from 'fs-extra'\n\n/**\n * Ensure a directory exists, creating it recursively if needed.\n */\nexport function ensureDir(dirPath: string): void {\n fse.ensureDirSync(dirPath)\n}\n\n/**\n * Write a file, creating parent directories as needed.\n * Will NOT overwrite an existing file unless `force` is true.\n * Returns true if the file was written, false if skipped.\n */\nexport function safeWriteFile(filePath: string, content: string, force = false): boolean {\n if (!force && fs.existsSync(filePath)) {\n return false\n }\n ensureDir(path.dirname(filePath))\n fs.writeFileSync(filePath, content, 'utf-8')\n return true\n}\n\n/**\n * Copy a single file, creating parent directories as needed.\n * Will NOT overwrite an existing file unless `force` is true.\n */\nexport function safeCopyFile(src: string, dest: string, force = false): boolean {\n if (!force && fs.existsSync(dest)) {\n return false\n }\n ensureDir(path.dirname(dest))\n fs.copyFileSync(src, dest)\n return true\n}\n\n/**\n * Recursively copy a directory of templates.\n * Skips existing files unless `force` is true.\n * Returns lists of written and skipped file paths.\n */\nexport function copyTemplateDir(\n srcDir: string,\n destDir: string,\n force = false\n): { written: string[]; skipped: string[] } {\n const written: string[] = []\n const skipped: string[] = []\n\n function walk(currentSrc: string, currentDest: string): void {\n const entries = fs.readdirSync(currentSrc, { withFileTypes: true })\n for (const entry of entries) {\n const srcPath = path.join(currentSrc, entry.name)\n const destPath = path.join(currentDest, entry.name)\n\n if (entry.isDirectory()) {\n walk(srcPath, destPath)\n } else {\n if (safeCopyFile(srcPath, destPath, force)) {\n written.push(destPath)\n } else {\n skipped.push(destPath)\n }\n }\n }\n }\n\n walk(srcDir, destDir)\n return { written, skipped }\n}\n\n/**\n * Append content to a file if the marker text is not already present.\n * Creates the file if it doesn't exist.\n * Returns true if content was appended.\n */\nexport function appendToFile(filePath: string, content: string, marker: string): boolean {\n if (fs.existsSync(filePath)) {\n const existing = fs.readFileSync(filePath, 'utf-8')\n if (existing.includes(marker)) {\n return false\n }\n fs.writeFileSync(filePath, `${existing.trimEnd()}\\n${content}\\n`, 'utf-8')\n } else {\n ensureDir(path.dirname(filePath))\n fs.writeFileSync(filePath, `${content}\\n`, 'utf-8')\n }\n return true\n}\n","import path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { safeWriteFile } from '@core-engine/utils/fs.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\nimport { readTemplate } from '@next-adapter/template-reader.js'\n\nexport interface AuthScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n}\n\nexport function scaffoldAuth({ cwd, config }: AuthScaffoldOptions): string[] {\n const created: string[] = []\n const authDir = path.resolve(cwd, config.paths.admin, 'lib', 'actions', 'auth')\n const namespace = config.frameworkConfig.next.namespace\n\n function write(filename: string, content: string): void {\n const outputFile = applyAdminNamespaceToPath(filename, namespace)\n const fullPath = path.join(authDir, outputFile)\n if (safeWriteFile(fullPath, applyAdminNamespaceToContent(content, namespace))) {\n created.push(path.join(config.paths.admin, 'lib', 'actions', 'auth', outputFile))\n }\n }\n\n write('server.ts', readTemplate('lib/actions/auth/auth.ts'))\n write('client.ts', readTemplate('lib/actions/auth/client.ts'))\n write('session.ts', readTemplate('lib/actions/auth/middleware.ts'))\n\n return created\n}\n","import path from 'node:path'\nimport { serializeConfig } from '@core-engine/config/serialize.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { ensureDir, safeWriteFile } from '@core-engine/utils/fs.js'\n\nexport interface BaseScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n includeEmailTemplatesDir?: boolean\n}\n\n/**\n * Create the admin/ directory structure and admin.config.ts.\n */\nexport function scaffoldBase({\n cwd,\n config,\n includeEmailTemplatesDir = false\n}: BaseScaffoldOptions): string[] {\n const created: string[] = []\n\n // Create admin/ subdirectories\n const adminDirs = [\n config.paths.admin,\n config.paths.schemas,\n path.join(config.paths.admin, 'lib'),\n path.join(config.paths.admin, 'lib', 'db'),\n path.join(config.paths.admin, 'lib', 'db', 'core'),\n path.join(config.paths.admin, 'lib', 'db', 'migrations'),\n path.join(config.paths.admin, 'lib', 'actions'),\n path.join(config.paths.admin, 'lib', 'actions', 'auth'),\n path.join(config.paths.admin, 'lib', 'actions', 'email'),\n path.join(config.paths.admin, 'lib', 'actions', 'forms'),\n path.join(config.paths.admin, 'lib', 'actions', 'media'),\n path.join(config.paths.admin, 'lib', 'actions', 'profile'),\n path.join(config.paths.admin, 'lib', 'actions', 'storage'),\n path.join(config.paths.admin, 'lib', 'actions', 'upload'),\n path.join(config.paths.admin, 'lib', 'actions', 'users'),\n path.join(config.paths.admin, 'hooks'),\n path.join(config.paths.admin, 'components', 'ui'),\n path.join(config.paths.admin, 'components', 'custom'),\n path.join(config.paths.admin, 'components', 'layouts'),\n path.join(config.paths.admin, 'components', 'shared'),\n path.join(config.paths.admin, 'components', 'shared', 'data-table'),\n path.join(config.paths.admin, 'components', 'shared', 'media'),\n path.join(config.paths.admin, 'data'),\n path.join(config.paths.admin, 'data', 'navigation'),\n path.join(config.paths.admin, 'types'),\n path.join(config.paths.admin, 'utils'),\n path.join(config.paths.admin, 'utils', 'core')\n ]\n\n if (includeEmailTemplatesDir) {\n adminDirs.push(path.join(config.paths.admin, 'components', 'email-templates'))\n }\n\n for (const dir of adminDirs) {\n ensureDir(path.resolve(cwd, dir))\n }\n\n // Create app route directories\n const adminDir = path.dirname(config.paths.pages)\n const appDirs = [\n config.paths.pages,\n config.paths.login,\n config.paths.api,\n path.join(adminDir, '(account)', 'profile')\n ]\n\n for (const dir of appDirs) {\n ensureDir(path.resolve(cwd, dir))\n }\n\n // Write admin.config.ts\n const configContent = serializeConfig(config)\n if (safeWriteFile(path.resolve(cwd, 'admin.config.ts'), configContent)) {\n created.push('admin.config.ts')\n }\n\n return created\n}\n","/**\n * Biome scaffolder: creates biome.json if no existing linter is detected\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\n\nimport type { LinterInfo } from '@next-adapter/config/detect.js'\n\nexport interface BiomeScaffoldResult {\n /** Whether Biome was set up */\n installed: boolean\n /** Reason it was skipped (if any) */\n skippedReason: string | null\n}\n\n/**\n * Create biome.json config if no linter exists.\n * Does NOT install the package — the dependency installer (task 5.05) handles that.\n */\nexport function scaffoldBiome(cwd: string, linter: LinterInfo): BiomeScaffoldResult {\n if (linter.type !== 'none') {\n return {\n installed: false,\n skippedReason: `${linter.type} already configured (${linter.configFile})`\n }\n }\n\n const configPath = path.join(cwd, 'biome.json')\n if (fs.existsSync(configPath)) {\n return { installed: false, skippedReason: 'biome.json already exists' }\n }\n\n const config = {\n $schema: 'https://biomejs.dev/schemas/2.3.10/schema.json',\n vcs: {\n enabled: true,\n clientKind: 'git',\n useIgnoreFile: true\n },\n assist: {\n actions: {\n source: {\n organizeImports: 'on'\n }\n }\n },\n formatter: {\n enabled: true,\n indentStyle: 'space',\n indentWidth: 2,\n lineWidth: 100\n },\n linter: {\n enabled: true,\n rules: {\n recommended: true,\n correctness: {\n noUnusedImports: 'warn',\n noUnusedVariables: 'warn'\n },\n style: {\n noNonNullAssertion: 'off'\n }\n }\n },\n javascript: {\n formatter: {\n quoteStyle: 'single',\n trailingCommas: 'all',\n semicolons: 'asNeeded'\n }\n },\n files: {\n includes: [\n '**',\n '!!**/node_modules',\n '!!**/.next',\n '!!**/dist',\n '!!**/build',\n '!!**/out',\n '!!**/coverage',\n '!!**/.turbo',\n '!!**/.vercel',\n '!!**/.betterstart/snapshots/**/files',\n '!!**/*.tsbuildinfo',\n '!!**/next-env.d.ts',\n '!**/*.config.js',\n '!**/*.config.mjs',\n '!**/*.config.cjs'\n ]\n }\n }\n\n fs.writeFileSync(configPath, `${JSON.stringify(config, null, 2)}\\n`, 'utf-8')\n return { installed: true, skippedReason: null }\n}\n","import path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { resolveCliAssetPath } from '@core-engine/utils/cli-root.js'\nimport { safeWriteFile } from '@core-engine/utils/fs.js'\nimport { detectProjectName } from '@next-adapter/config/detect.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath,\n resolveAdminNamespace\n} from '@next-adapter/config/namespace.js'\nimport { adminDataTemplate } from '@next-adapter/init/templates/app/admin.js'\nimport { applyNextCacheApiForVersion, readTemplate } from '@next-adapter/template-reader.js'\nimport fs from 'fs-extra'\n\nexport interface ComponentScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n}\n\n/**\n * Copy all Admin components, hooks, types, utils, data, and lib code into the project.\n */\nexport function scaffoldComponents({ cwd, config }: ComponentScaffoldOptions): string[] {\n const admin = path.resolve(cwd, config.paths.admin)\n const created: string[] = []\n const namespace = config.frameworkConfig.next.namespace\n\n function write(relPath: string, content: string): void {\n const namespacedRelPath = applyAdminNamespaceToPath(relPath, namespace)\n const fullPath = path.join(admin, namespacedRelPath)\n const versionedContent = applyNextCacheApiForVersion(content, config.nextMajorVersion)\n if (safeWriteFile(fullPath, applyAdminNamespaceToContent(versionedContent, namespace))) {\n created.push(path.join(config.paths.admin, namespacedRelPath))\n }\n }\n\n // --- CSS ---\n write('admin-globals.css', readTemplate('admin-globals.css'))\n\n // --- Components: layouts ---\n write(\n 'components/layouts/admin-providers.tsx',\n readTemplate('components/layouts/admin-providers.tsx')\n )\n write(\n 'components/layouts/admin-nav-link.tsx',\n readTemplate('components/layouts/admin-nav-link.tsx')\n )\n write(\n 'components/layouts/admin-sidebar.tsx',\n readTemplate('components/layouts/admin-sidebar.tsx')\n )\n write(\n 'components/layouts/admin-sidebar-branding-rsc.tsx',\n readTemplate('components/layouts/admin-sidebar-branding-rsc.tsx')\n )\n write(\n 'components/layouts/admin-sidebar-branding-skeleton.tsx',\n readTemplate('components/layouts/admin-sidebar-branding-skeleton.tsx')\n )\n write(\n 'components/layouts/admin-sidebar-nav-link.tsx',\n readTemplate('components/layouts/admin-sidebar-nav-link.tsx')\n )\n write(\n 'components/layouts/admin-sidebar-nav-link-skeleton.tsx',\n readTemplate('components/layouts/admin-sidebar-nav-link-skeleton.tsx')\n )\n write(\n 'components/layouts/admin-sidebar-user-menu.tsx',\n readTemplate('components/layouts/admin-sidebar-user-menu.tsx')\n )\n write(\n 'components/layouts/admin-sidebar-user-menu-skeleton.tsx',\n readTemplate('components/layouts/admin-sidebar-user-menu-skeleton.tsx')\n )\n write(\n 'components/layouts/sidebar-branding.tsx',\n readTemplate('components/layouts/sidebar-branding.tsx')\n )\n write('components/layouts/admin-header.tsx', readTemplate('components/layouts/admin-header.tsx'))\n write(\n 'components/layouts/content-skeleton.tsx',\n readTemplate('components/layouts/content-skeleton.tsx')\n )\n // --- Components: shared ---\n write('components/shared/page-header.tsx', readTemplate('components/shared/page-header.tsx'))\n write(\n 'components/shared/sort-indicator.tsx',\n readTemplate('components/shared/sort-indicator.tsx')\n )\n write(\n 'components/shared/dev-mode-integrate.tsx',\n readTemplate('components/shared/dev-mode-integrate.tsx')\n )\n write(\n 'components/shared/dev-mode/copyable-code-block.tsx',\n readTemplate('components/shared/dev-mode/copyable-code-block.tsx')\n )\n write(\n 'components/shared/dev-mode/dev-mode-code-mirror.tsx',\n readTemplate('components/shared/dev-mode/dev-mode-code-mirror.tsx')\n )\n write(\n 'components/shared/dev-mode/dev-mode-types.ts',\n readTemplate('components/shared/dev-mode/dev-mode-types.ts')\n )\n write(\n 'components/shared/dev-mode/plain-code-fallback.tsx',\n readTemplate('components/shared/dev-mode/plain-code-fallback.tsx')\n )\n write(\n 'components/shared/dev-mode/lifecycle-hooks-tab.tsx',\n readTemplate('components/shared/dev-mode/lifecycle-hooks-tab.tsx')\n )\n write(\n 'components/shared/dev-mode/snippets-tab.tsx',\n readTemplate('components/shared/dev-mode/snippets-tab.tsx')\n )\n write('components/shared/delete-dialog.tsx', readTemplate('components/shared/delete-dialog.tsx'))\n write(\n 'components/shared/entity-metadata.tsx',\n readTemplate('components/shared/entity-metadata.tsx')\n )\n write(\n 'components/shared/entity-versions/entity-versions-button.tsx',\n readTemplate('components/shared/entity-versions/entity-versions-button.tsx')\n )\n write(\n 'components/shared/entity-versions/entity-versions-drawer.tsx',\n readTemplate('components/shared/entity-versions/entity-versions-drawer.tsx')\n )\n write(\n 'components/shared/entity-versions/entity-versions-current-row.tsx',\n readTemplate('components/shared/entity-versions/entity-versions-current-row.tsx')\n )\n write(\n 'components/shared/entity-versions/entity-version-item.tsx',\n readTemplate('components/shared/entity-versions/entity-version-item.tsx')\n )\n write(\n 'components/shared/entity-versions/entity-version-restore-dialog.tsx',\n readTemplate('components/shared/entity-versions/entity-version-restore-dialog.tsx')\n )\n write(\n 'components/shared/entity-filters-bar.tsx',\n readTemplate('components/shared/entity-filters-bar.tsx')\n )\n write('components/shared/search-input.tsx', readTemplate('components/shared/search-input.tsx'))\n write(\n 'components/shared/sort-order-dialog.tsx',\n readTemplate('components/shared/sort-order-dialog.tsx')\n )\n write(\n 'components/shared/sort-order-drag-overlay-item.tsx',\n readTemplate('components/shared/sort-order-drag-overlay-item.tsx')\n )\n write(\n 'components/shared/sort-order-item.tsx',\n readTemplate('components/shared/sort-order-item.tsx')\n )\n write(\n 'components/shared/sort-order-types.ts',\n readTemplate('components/shared/sort-order-types.ts')\n )\n // --- Components: shared/media ---\n write(\n 'components/shared/media/media-preview.tsx',\n readTemplate('components/shared/media/media-preview.tsx')\n )\n write(\n 'components/shared/media/media-grid-item.tsx',\n readTemplate('components/shared/media/media-grid-item.tsx')\n )\n write(\n 'components/shared/media/media-grid.tsx',\n readTemplate('components/shared/media/media-grid.tsx')\n )\n write(\n 'components/shared/media/media-empty-state.tsx',\n readTemplate('components/shared/media/media-empty-state.tsx')\n )\n write(\n 'components/shared/media/edit-media-dialog.tsx',\n readTemplate('components/shared/media/edit-media-dialog.tsx')\n )\n write(\n 'components/shared/media/edit-media-dialog-content.tsx',\n readTemplate('components/shared/media/edit-media-dialog-content.tsx')\n )\n write(\n 'components/shared/media/media-delete-drawer.tsx',\n readTemplate('components/shared/media/media-delete-drawer.tsx')\n )\n write(\n 'components/shared/media/media-delete-dialog.tsx',\n readTemplate('components/shared/media/media-delete-dialog.tsx')\n )\n write(\n 'components/shared/media/media-gallery-dialog.tsx',\n readTemplate('components/shared/media/media-gallery-dialog.tsx')\n )\n write(\n 'components/shared/media/media-filters-bar.tsx',\n readTemplate('components/shared/media/media-filters-bar.tsx')\n )\n write(\n 'components/shared/media/media-url-importer.tsx',\n readTemplate('components/shared/media/media-url-importer.tsx')\n )\n write(\n 'components/shared/media/media-grid-pagination.tsx',\n readTemplate('components/shared/media/media-grid-pagination.tsx')\n )\n // --- Components: shared/data-table ---\n write(\n 'components/shared/data-table/data-table.tsx',\n readTemplate('components/shared/data-table/data-table.tsx')\n )\n write(\n 'components/shared/data-table/data-table-pagination.tsx',\n readTemplate('components/shared/data-table/data-table-pagination.tsx')\n )\n // --- Components: ui (shadcn registry raw file copy) ---\n const uiCreated = copyUiTemplates(cwd, config)\n created.push(...uiCreated)\n\n // --- Components: custom (BetterStart raw file copy) ---\n const customCreated = copyCustomTemplates(cwd, config)\n created.push(...customCreated)\n\n // --- Core types ---\n write('types/index.ts', readTemplate('types/index.ts'))\n write('types/auth.ts', readTemplate('types/auth.ts'))\n write('types/navigation.ts', readTemplate('types/navigation.ts'))\n write('types/table-meta.ts', readTemplate('types/table-meta.ts'))\n\n // --- Domain utils ---\n for (const relPath of [\n 'utils/auth/roles.ts',\n 'utils/date/date.ts',\n 'utils/dev-mode/code-block-height.ts',\n 'utils/editor/content-editor.ts',\n 'utils/editor/content-editor-rich-extensions.ts',\n 'utils/editor/editor-view.ts',\n 'utils/editor/markdown.ts',\n 'utils/editor/node-attrs.ts',\n 'utils/editor/source-media.ts',\n 'utils/editor/slash-commands.ts',\n 'utils/editor/table-add-controls.ts',\n 'utils/editor/table-bubble.ts',\n 'utils/editor/table-input.ts',\n 'utils/editor/task-item.ts',\n 'utils/editor/tiptap.ts',\n 'utils/email/form-delivery.ts',\n 'utils/media/fallback.ts',\n 'utils/media/media.ts',\n 'utils/media/query.ts',\n 'utils/navigation/order.ts',\n 'utils/navigation/sidebar.ts',\n 'utils/page/boundary.ts',\n 'utils/seo/seo.ts',\n 'utils/shared/cn.ts',\n 'utils/storage/local.ts',\n 'utils/table/table.ts',\n 'utils/text/text.ts',\n 'utils/theme/system.ts',\n 'utils/upload/remote.ts',\n 'utils/upload/upload.ts',\n 'utils/user/user.ts',\n 'utils/validation/validation.ts',\n 'utils/webhook/webhook.ts'\n ]) {\n write(relPath, readTemplate(relPath))\n }\n\n // --- Hooks ---\n write('hooks/use-upload.ts', readTemplate('hooks/use-upload.ts'))\n write(\n 'hooks/content-editor/use-blockquote.ts',\n readTemplate('hooks/content-editor/use-blockquote.ts')\n )\n write(\n 'hooks/content-editor/use-code-block.ts',\n readTemplate('hooks/content-editor/use-code-block.ts')\n )\n write(\n 'hooks/content-editor/use-color-highlight.ts',\n readTemplate('hooks/content-editor/use-color-highlight.ts')\n )\n write(\n 'hooks/content-editor/use-content-editor-source-mode.tsx',\n readTemplate('hooks/content-editor/use-content-editor-source-mode.tsx')\n )\n write(\n 'hooks/content-editor/use-content-editor.ts',\n readTemplate('hooks/content-editor/use-content-editor.ts')\n )\n write(\n 'hooks/content-editor/use-content-editor-media-insertion.ts',\n readTemplate('hooks/content-editor/use-content-editor-media-insertion.ts')\n )\n write(\n 'hooks/content-editor/use-content-editor-table-add-controls.ts',\n readTemplate('hooks/content-editor/use-content-editor-table-add-controls.ts')\n )\n write(\n 'hooks/content-editor/use-content-editor-mobile-toolbar.ts',\n readTemplate('hooks/content-editor/use-content-editor-mobile-toolbar.ts')\n )\n write(\n 'hooks/content-editor/use-content-editor-slash-menu.ts',\n readTemplate('hooks/content-editor/use-content-editor-slash-menu.ts')\n )\n write('hooks/content-editor/use-heading.ts', readTemplate('hooks/content-editor/use-heading.ts'))\n write(\n 'hooks/content-editor/use-heading-dropdown-menu.ts',\n readTemplate('hooks/content-editor/use-heading-dropdown-menu.ts')\n )\n write(\n 'hooks/content-editor/use-is-breakpoint.ts',\n readTemplate('hooks/content-editor/use-is-breakpoint.ts')\n )\n write(\n 'hooks/content-editor/use-link-popover.ts',\n readTemplate('hooks/content-editor/use-link-popover.ts')\n )\n write('hooks/content-editor/use-list.ts', readTemplate('hooks/content-editor/use-list.ts'))\n write(\n 'hooks/content-editor/use-list-dropdown-menu.ts',\n readTemplate('hooks/content-editor/use-list-dropdown-menu.ts')\n )\n write('hooks/content-editor/use-mark.ts', readTemplate('hooks/content-editor/use-mark.ts'))\n write(\n 'hooks/content-editor/use-menu-navigation.ts',\n readTemplate('hooks/content-editor/use-menu-navigation.ts')\n )\n write(\n 'hooks/content-editor/use-undo-redo.ts',\n readTemplate('hooks/content-editor/use-undo-redo.ts')\n )\n write(\n 'hooks/content-editor/use-tiptap-editor.ts',\n readTemplate('hooks/content-editor/use-tiptap-editor.ts')\n )\n write('hooks/use-copy-to-clipboard.ts', readTemplate('hooks/use-copy-to-clipboard.ts'))\n write('hooks/use-dev-mode-integration.ts', readTemplate('hooks/use-dev-mode-integration.ts'))\n write('hooks/use-local-storage.ts', readTemplate('hooks/use-local-storage.ts'))\n write('hooks/use-admin-theme.tsx', readTemplate('hooks/use-admin-theme.tsx'))\n write('hooks/use-users.ts', readTemplate('hooks/use-users.ts'))\n write('hooks/use-mobile.ts', readTemplate('hooks/use-mobile.ts'))\n write('hooks/use-failed-image-url.ts', readTemplate('hooks/use-failed-image-url.ts'))\n write('hooks/use-media.ts', readTemplate('hooks/use-media.ts'))\n write('hooks/use-entity-versions.ts', readTemplate('hooks/use-entity-versions.ts'))\n write('hooks/use-media-filters-bar.ts', readTemplate('hooks/use-media-filters-bar.ts'))\n write('hooks/use-table-utils.ts', readTemplate('hooks/use-table-utils.ts'))\n write(\n 'hooks/use-page-boundary-blur-visibility.ts',\n readTemplate('hooks/use-page-boundary-blur-visibility.ts')\n )\n write('hooks/use-page-scroll-threshold.ts', readTemplate('hooks/use-page-scroll-threshold.ts'))\n\n // --- Core data/navigation ---\n const adminNamespace = resolveAdminNamespace(namespace)\n const projectName = detectProjectName(cwd)\n write('data/navigation.ts', readTemplate('data/navigation.ts'))\n write(`utils/app/${adminNamespace.camel}.ts`, adminDataTemplate(projectName, namespace))\n\n // --- Lib ---\n for (const relPath of [\n 'lib/actions/forms/types.ts',\n 'lib/actions/forms/get-form-settings.ts',\n 'lib/actions/forms/upsert-form-settings.ts',\n 'lib/actions/forms/get-all-form-settings.ts',\n 'lib/actions/forms/test-form-webhook.ts',\n 'lib/actions/forms/index.ts',\n 'lib/actions/entity-versions/types.ts',\n 'lib/actions/entity-versions/get-entity-versions.ts',\n 'lib/actions/entity-versions/internal-create-entity-version.ts',\n 'lib/actions/entity-versions/internal-delete-entity-versions.ts',\n 'lib/actions/entity-versions/index.ts',\n 'lib/lifecycle-hooks/types.ts',\n 'lib/lifecycle-hooks/registry.ts',\n 'lib/lifecycle-hooks/runner.ts',\n 'lib/lifecycle-hooks/register.ts',\n 'lib/lifecycle-hooks/register.local.ts',\n 'lib/lifecycle-hooks/index.ts',\n 'lib/actions/upload/types.ts',\n 'lib/actions/upload/upload-files.ts',\n 'lib/actions/upload/upload-file.ts',\n 'lib/actions/upload/upload-media-from-url.ts',\n 'lib/actions/upload/upload-image-from-url.ts',\n 'lib/actions/upload/index.ts',\n 'lib/actions/users/types.ts',\n 'lib/actions/users/create-user.ts',\n 'lib/actions/users/get-users.ts',\n 'lib/actions/users/update-user-role.ts',\n 'lib/actions/users/delete-user.ts',\n 'lib/actions/users/index.ts',\n 'lib/actions/media/types.ts',\n 'lib/actions/media/get-media.ts',\n 'lib/actions/media/get-media-by-id.ts',\n 'lib/actions/media/get-media-by-ids.ts',\n 'lib/actions/media/create-media.ts',\n 'lib/actions/media/update-media.ts',\n 'lib/actions/media/delete-media.ts',\n 'lib/actions/media/delete-media-bulk.ts',\n 'lib/actions/media/index.ts',\n 'lib/actions/profile/types.ts',\n 'lib/actions/profile/is-email-configured.ts',\n 'lib/actions/profile/invalidate-users-cache.ts',\n 'lib/actions/profile/update-email.ts',\n 'lib/actions/profile/index.ts'\n ]) {\n write(relPath, readTemplate(relPath))\n }\n for (const relPath of [\n 'lib/actions/email/index.ts',\n 'lib/actions/email/provider.ts',\n 'lib/actions/email/types.ts',\n 'lib/actions/email/none.ts',\n 'lib/actions/email/is-email-delivery-configured.ts',\n 'lib/actions/email/send-email.ts',\n 'lib/actions/email/send-password-reset-email.ts',\n 'lib/actions/email/form-delivery.ts',\n 'lib/actions/storage/index.ts',\n 'lib/actions/storage/provider.ts',\n 'lib/actions/storage/types.ts',\n 'lib/actions/storage/local.ts',\n 'lib/actions/storage/save-upload.ts'\n ]) {\n write(relPath, readTemplate(relPath))\n }\n\n // --- Schema metaschema ---\n const schemaCreated = copySchemaMetaschema(cwd, config)\n created.push(...schemaCreated)\n\n return created\n}\n\n/**\n * Copy raw shadcn registry UI component files from the shared React Admin asset pack.\n */\nfunction copyUiTemplates(cwd: string, config: ResolvedBetterstartConfig): string[] {\n return copyStaticComponentTemplates(cwd, config, 'ui', 'ui')\n}\n\n/**\n * Copy raw BetterStart custom component files from the shared React Admin asset pack.\n */\nfunction copyCustomTemplates(cwd: string, config: ResolvedBetterstartConfig): string[] {\n return copyStaticComponentTemplates(cwd, config, 'custom', 'custom')\n}\n\nfunction copyStaticComponentTemplates(\n cwd: string,\n config: ResolvedBetterstartConfig,\n sourceDirectory: 'ui' | 'custom',\n targetDirectory: 'ui' | 'custom'\n): string[] {\n const created: string[] = []\n const destDir = path.resolve(cwd, config.paths.admin, 'components', targetDirectory)\n\n const srcDir = resolveCliAssetPath('shared-assets', 'react-admin', sourceDirectory)\n\n if (!fs.existsSync(srcDir)) {\n return created\n }\n\n fs.ensureDirSync(destDir)\n\n if (sourceDirectory === 'custom') {\n copyStaticComponentTemplatesRecursive(\n srcDir,\n destDir,\n '',\n path.join(config.paths.admin, 'components', targetDirectory),\n config.frameworkConfig.next.namespace,\n created\n )\n return created\n }\n\n const files = fs\n .readdirSync(srcDir, { withFileTypes: true })\n .filter(\n (entry) => entry.isFile() && (entry.name.endsWith('.tsx') || entry.name.endsWith('.ts'))\n )\n .map((entry) => entry.name)\n\n for (const file of files) {\n const namespacedFile = applyAdminNamespaceToPath(file, config.frameworkConfig.next.namespace)\n const destPath = path.join(destDir, namespacedFile)\n if (!fs.existsSync(destPath)) {\n const content = fs.readFileSync(path.join(srcDir, file), 'utf-8')\n fs.writeFileSync(\n destPath,\n applyAdminNamespaceToContent(content, config.frameworkConfig.next.namespace),\n 'utf-8'\n )\n created.push(path.join(config.paths.admin, 'components', targetDirectory, namespacedFile))\n }\n }\n\n return created\n}\n\nfunction copyStaticComponentTemplatesRecursive(\n srcDir: string,\n destDir: string,\n relBase: string,\n createdPrefix: string,\n namespace: string,\n created: string[]\n): void {\n const entries = fs.readdirSync(srcDir, { withFileTypes: true })\n for (const entry of entries) {\n const rel = path.join(relBase, entry.name)\n const srcPath = path.join(srcDir, entry.name)\n const destPath = path.join(destDir, entry.name)\n\n if (entry.isDirectory()) {\n const namespacedDestPath = path.join(\n destDir,\n applyAdminNamespaceToPath(entry.name, namespace)\n )\n copyStaticComponentTemplatesRecursive(\n srcPath,\n namespacedDestPath,\n rel,\n createdPrefix,\n namespace,\n created\n )\n continue\n }\n\n if (!entry.name.endsWith('.tsx') && !entry.name.endsWith('.ts')) {\n continue\n }\n\n const namespacedRel = applyAdminNamespaceToPath(rel, namespace)\n const namespacedDestPath = path.join(\n path.dirname(destPath),\n applyAdminNamespaceToPath(entry.name, namespace)\n )\n if (!fs.existsSync(namespacedDestPath)) {\n fs.ensureDirSync(path.dirname(namespacedDestPath))\n const content = fs.readFileSync(srcPath, 'utf-8')\n fs.writeFileSync(\n namespacedDestPath,\n applyAdminNamespaceToContent(content, namespace),\n 'utf-8'\n )\n created.push(path.join(createdPrefix, namespacedRel))\n }\n }\n}\n\n/**\n * Copy schema.json metaschema into admin/schemas/ so users get IDE validation.\n */\nfunction copySchemaMetaschema(cwd: string, config: ResolvedBetterstartConfig): string[] {\n const created: string[] = []\n const srcPath = resolveCliAssetPath('shared-assets', 'react-admin', 'schema.json')\n const destPath = path.resolve(cwd, config.paths.schemas, 'schema.json')\n\n if (fs.existsSync(srcPath) && !fs.existsSync(destPath)) {\n fs.ensureDirSync(path.dirname(destPath))\n fs.copyFileSync(srcPath, destPath)\n created.push(path.join(config.paths.schemas, 'schema.json'))\n }\n\n return created\n}\n","/**\n * Template: <namespace>/utils/app/<namespaceCamel>.ts\n * Admin metadata (project name, etc.)\n */\nimport { DEFAULT_ADMIN_NAMESPACE, resolveAdminNamespace } from '@next-adapter/config/namespace.js'\n\nexport function adminDataTemplate(\n projectName: string,\n namespaceValue = DEFAULT_ADMIN_NAMESPACE\n): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n\n return `export const ${namespace.camel} = {\n name: '${projectName}',\n}\n`\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport type { Schema } from '@core-engine/schema/types.js'\nimport { ensureSnapshotGitFiles } from '@core-engine/snapshots/gitignore.js'\nimport { writeProjectFile } from '@core-engine/snapshots/merge.js'\nimport {\n BARREL_SCOPE,\n createManifest,\n getCurrentCliVersion,\n saveManifest,\n writeSnapshotFiles\n} from '@core-engine/snapshots/store.js'\nimport { getGeneratedFilePaths } from '@core-engine/utils/generated-files.js'\nimport { runSinglePipeline } from '@next-adapter/generators/index.js'\nimport { defaultSettingsSchema } from '@next-adapter/init/templates/core/default-settings.js'\nimport { ensureCoreSchemaOwnership } from '@next-adapter/plugin-runtime.js'\nimport { renderBarrelFiles } from '@next-adapter/snapshots/barrels.js'\n\nexport interface CoreSchemasScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n}\n\nexport interface CoreSchemasScaffoldResult {\n schemas: string[]\n generatedFiles: string[]\n errors: string[]\n}\n\nexport function scaffoldCoreSchemas({\n cwd,\n config\n}: CoreSchemasScaffoldOptions): CoreSchemasScaffoldResult {\n const result: CoreSchemasScaffoldResult = {\n schemas: [],\n generatedFiles: [],\n errors: []\n }\n\n const schemaContent = defaultSettingsSchema()\n const schemaName = 'settings'\n const schemaPath = path.join(cwd, config.paths.schemas, `${schemaName}.json`)\n fs.mkdirSync(path.dirname(schemaPath), { recursive: true })\n fs.writeFileSync(schemaPath, schemaContent, 'utf-8')\n result.schemas.push(`${schemaName}.json`)\n\n ensureSnapshotGitFiles(cwd)\n\n try {\n const parsed = JSON.parse(schemaContent) as Schema\n const cliVersion = getCurrentCliVersion()\n const pipelineResult = runSinglePipeline(parsed, cwd, config, {\n force: true,\n silent: true,\n mode: 'init'\n })\n\n for (const file of pipelineResult.files) {\n writeProjectFile(cwd, file)\n }\n\n writeSnapshotFiles(cwd, parsed.name, pipelineResult.files)\n saveManifest(\n cwd,\n parsed.name,\n createManifest(parsed.name, parsed, cliVersion, pipelineResult.files, [])\n )\n ensureCoreSchemaOwnership(cwd, parsed.name)\n result.generatedFiles.push(...getGeneratedFilePaths(pipelineResult.files))\n\n if (!pipelineResult.success) {\n result.errors.push(...pipelineResult.errors.map((error) => `${schemaName}.json: ${error}`))\n }\n\n const barrelFiles = renderBarrelFiles(cwd, config)\n for (const file of barrelFiles) {\n writeProjectFile(cwd, file)\n }\n writeSnapshotFiles(cwd, BARREL_SCOPE, barrelFiles)\n saveManifest(\n cwd,\n BARREL_SCOPE,\n createManifest(BARREL_SCOPE, { name: BARREL_SCOPE }, cliVersion, barrelFiles, [])\n )\n result.generatedFiles.push(...getGeneratedFilePaths(barrelFiles))\n } catch (error) {\n result.errors.push(\n `${schemaName}.json: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n\n return result\n}\n","/**\n * Default core settings schema.\n * Generates the singleton form at /admin/settings.\n */\nexport function defaultSettingsSchema(): string {\n return JSON.stringify(\n {\n name: 'settings',\n type: 'single',\n label: 'Settings',\n description: 'General Settings',\n icon: 'Settings',\n fields: [\n {\n type: 'section',\n name: 'siteSettings',\n label: 'Dashboard Settings',\n description: 'General settings for the dashboard',\n fields: [\n {\n name: 'dashboardName',\n type: 'string',\n label: 'Name',\n hint: 'Displayed in the sidebar and throughout the dashboard',\n default: 'BetterStart'\n },\n {\n name: 'dashboardDescription',\n type: 'text',\n label: 'Description',\n hint: 'A brief description of the application'\n }\n ]\n },\n {\n type: 'section',\n name: 'branding',\n label: 'Branding',\n description: 'Logo and visual identity',\n fields: [{ name: 'dashboardLogo', type: 'image', label: 'Logo' }]\n },\n {\n type: 'section',\n name: 'developer',\n label: 'Developer',\n description: 'Developer tools for the dashboard',\n fields: [\n {\n name: 'devMode',\n type: 'boolean',\n label: 'Dev Mode',\n hint: 'Show generated integration snippets and schema details in the dashboard',\n default: true\n }\n ]\n }\n ]\n },\n null,\n 2\n )\n}\n","import path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { safeWriteFile } from '@core-engine/utils/fs.js'\nimport { applyAdminNamespaceToContent } from '@next-adapter/config/namespace.js'\nimport { readTemplate } from '@next-adapter/template-reader.js'\n\nexport interface DatabaseScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n}\n\nexport function scaffoldDatabase({ cwd, config }: DatabaseScaffoldOptions): string[] {\n const created: string[] = []\n const dbDir = path.resolve(cwd, config.paths.admin, 'lib', 'db')\n const namespace = config.frameworkConfig.next.namespace\n\n function write(filename: string, content: string): void {\n const fullPath = path.join(dbDir, filename)\n if (safeWriteFile(fullPath, applyAdminNamespaceToContent(content, namespace))) {\n created.push(path.join(config.paths.admin, 'lib', 'db', filename))\n }\n }\n\n write('client.ts', readTemplate('lib/db/client.ts'))\n write('core/schema.ts', readTemplate('lib/db/core/schema.ts'))\n write('schema.ts', readTemplate('lib/db/schema.ts'))\n\n // Drizzle config goes at project root (where drizzle-kit expects it)\n const drizzleConfigPath = path.resolve(cwd, 'drizzle.config.ts')\n if (\n safeWriteFile(\n drizzleConfigPath,\n applyAdminNamespaceToContent(readTemplate('drizzle.config.ts'), namespace)\n )\n ) {\n created.push('drizzle.config.ts')\n }\n\n return created\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport const DEFAULT_DEV_PORT = 4242\n\nconst DEV_PORT_FLAG_PATTERN = /(?:^|\\s)(?:--port(?:=|\\s+)|-p(?:=|\\s+)?)(\\d+)(?=\\s|$)/\nconst DEV_PORT_ENV_PATTERN = /(?:^|\\s)PORT=(\\d+)(?=\\s|$)/\n\nexport interface DevScriptPortResult {\n status: 'updated' | 'preserved' | 'skipped' | 'missing-package' | 'missing-script'\n port: number\n}\n\ninterface PackageJsonShape {\n scripts?: Record<string, string>\n}\n\nexport function detectDevPort(cwd: string): number {\n const pkg = readPackageJson(cwd)\n if (!pkg) return DEFAULT_DEV_PORT\n\n return detectDevPortFromScript(pkg.scripts?.dev) ?? DEFAULT_DEV_PORT\n}\n\nexport function detectDevPortFromScript(devScript?: string): number | undefined {\n if (typeof devScript !== 'string') return undefined\n\n const trimmed = devScript.trim()\n if (trimmed.length === 0) return undefined\n\n const flagMatch = trimmed.match(DEV_PORT_FLAG_PATTERN)\n const envMatch = trimmed.match(DEV_PORT_ENV_PATTERN)\n const rawPort = flagMatch?.[1] ?? envMatch?.[1]\n if (!rawPort) return undefined\n\n const port = Number.parseInt(rawPort, 10)\n return isValidPort(port) ? port : undefined\n}\n\nexport function ensureDefaultDevScriptPort(cwd: string): DevScriptPortResult {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) {\n return { status: 'missing-package', port: DEFAULT_DEV_PORT }\n }\n\n const raw = fs.readFileSync(pkgPath, 'utf-8')\n let pkg: PackageJsonShape\n\n try {\n pkg = JSON.parse(raw) as PackageJsonShape\n } catch {\n return { status: 'missing-package', port: DEFAULT_DEV_PORT }\n }\n\n const devScript = pkg.scripts?.dev\n if (typeof devScript !== 'string' || devScript.trim().length === 0) {\n return { status: 'missing-script', port: DEFAULT_DEV_PORT }\n }\n\n const explicitPort = detectDevPortFromScript(devScript)\n if (explicitPort) {\n return { status: 'preserved', port: explicitPort }\n }\n\n if (!isPlainNextDevScript(devScript)) {\n return { status: 'skipped', port: DEFAULT_DEV_PORT }\n }\n\n const normalizedScript = `${normalizeWhitespace(devScript)} --port ${DEFAULT_DEV_PORT}`\n pkg.scripts = {\n ...pkg.scripts,\n dev: normalizedScript\n }\n\n const newline = raw.includes('\\r\\n') ? '\\r\\n' : '\\n'\n const indent = detectIndent(raw)\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, indent)}${newline}`, 'utf-8')\n\n return { status: 'updated', port: DEFAULT_DEV_PORT }\n}\n\nfunction readPackageJson(cwd: string): PackageJsonShape | undefined {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) return undefined\n\n try {\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as PackageJsonShape\n } catch {\n return undefined\n }\n}\n\nfunction isPlainNextDevScript(devScript: string): boolean {\n const normalized = normalizeWhitespace(devScript)\n return (\n normalized === 'next dev' ||\n normalized === 'next dev --turbopack' ||\n normalized === 'next dev --turbo'\n )\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.trim().replace(/\\s+/g, ' ')\n}\n\nfunction detectIndent(raw: string): string | number {\n const indentMatch = raw.match(/^[ \\t]+(?=\")/m)\n return indentMatch?.[0] ?? 2\n}\n\nfunction isValidPort(port: number): boolean {\n return Number.isInteger(port) && port > 0 && port <= 65535\n}\n","import crypto from 'node:crypto'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { EnvSection } from '@core-engine/utils/env.js'\nimport { appendEnvVars } from '@core-engine/utils/env.js'\nimport { detectDevPort } from '@next-adapter/init/scaffolders/dev-server.js'\n\nconst LEGACY_DEFAULT_AUTH_URL = 'http://localhost:3000'\n\nfunction getCoreEnvSections(\n databaseUrl: string | undefined,\n devPort: number,\n namespace: string\n): EnvSection[] {\n const authSecret = crypto.randomBytes(32).toString('base64')\n return [\n {\n header: 'Database (PostgreSQL)',\n vars: [{ key: 'DATABASE_URL', value: databaseUrl ?? 'postgresql://...' }]\n },\n {\n header: 'Authentication',\n vars: [\n { key: 'BETTERSTART_AUTH_SECRET', value: authSecret },\n { key: 'BETTERSTART_AUTH_URL', value: `http://localhost:${devPort}` },\n { key: 'BETTERSTART_AUTH_BASE_PATH', value: `/api/${namespace}/auth` }\n ]\n }\n ]\n}\n\nfunction shouldOverwriteAuthUrl(cwd: string, devPort: number): boolean {\n const existingAuthUrl = readExistingEnvVar(cwd, 'BETTERSTART_AUTH_URL')\n if (!existingAuthUrl) return false\n\n return (\n existingAuthUrl === LEGACY_DEFAULT_AUTH_URL && existingAuthUrl !== `http://localhost:${devPort}`\n )\n}\n\nfunction readExistingEnvVar(cwd: string, key: string): string | undefined {\n const envPath = join(cwd, '.env.local')\n if (!existsSync(envPath)) return undefined\n\n const content = readFileSync(envPath, 'utf-8')\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (trimmed.startsWith('#') || !trimmed.includes('=')) continue\n\n const [lineKey, ...rest] = trimmed.split('=')\n if (lineKey?.trim() !== key) continue\n\n return rest\n .join('=')\n .replace(/^['\"]|['\"]$/g, '')\n .trim()\n }\n\n return undefined\n}\n\n/**\n * Append BETTERSTART_* environment variables to .env.local.\n */\nexport function scaffoldEnv(\n cwd: string,\n options: { databaseUrl?: string; namespace?: string }\n): { added: string[]; skipped: string[]; updated: string[] } {\n const devPort = detectDevPort(cwd)\n const sections = getCoreEnvSections(options.databaseUrl, devPort, options.namespace ?? 'admin')\n const authBasePath = `/api/${options.namespace ?? 'admin'}/auth`\n const overwrite = new Set<string>()\n if (options.databaseUrl) {\n overwrite.add('DATABASE_URL')\n }\n if (shouldOverwriteAuthUrl(cwd, devPort)) {\n overwrite.add('BETTERSTART_AUTH_URL')\n }\n if (readExistingEnvVar(cwd, 'BETTERSTART_AUTH_BASE_PATH') !== authBasePath) {\n overwrite.add('BETTERSTART_AUTH_BASE_PATH')\n }\n\n return appendEnvVars(cwd, sections, overwrite)\n}\n","import path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { ensureDir, safeWriteFile } from '@core-engine/utils/fs.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\nimport { readTemplate } from '@next-adapter/template-reader.js'\n\nexport interface LayoutScaffoldOptions {\n cwd: string\n config: ResolvedBetterstartConfig\n}\n\n/**\n * Create all Admin route structures: layouts, login, dashboard, users, settings.\n */\nexport function scaffoldLayout({ cwd, config }: LayoutScaffoldOptions): string[] {\n const created: string[] = []\n const namespace = config.frameworkConfig.next.namespace\n\n function write(targetPath: string, content: string): void {\n const relPath = path.isAbsolute(targetPath) ? path.relative(cwd, targetPath) : targetPath\n if (relPath.startsWith('..') || path.isAbsolute(relPath)) {\n throw new Error(`Refusing to scaffold layout outside project root: ${targetPath}`)\n }\n\n const namespacedRelPath = applyAdminNamespaceToPath(relPath, namespace)\n const fullPath = path.resolve(cwd, namespacedRelPath)\n ensureDir(path.dirname(fullPath))\n if (safeWriteFile(fullPath, applyAdminNamespaceToContent(content, namespace))) {\n created.push(namespacedRelPath)\n }\n }\n\n // Derive base Admin layout dir from pages path\n // pages = \"./src/app/(admin)/admin/(authenticated)\" → adminDir = \"./src/app/(admin)/admin\"\n const adminDir = path.dirname(config.paths.pages)\n\n // --- Shared Admin layout ---\n write(path.join(adminDir, 'layout.tsx'), readTemplate('pages/admin-layout.tsx'))\n\n // --- Authenticated layout ---\n write(path.join(config.paths.pages, 'layout.tsx'), readTemplate('pages/authenticated-layout.tsx'))\n write(path.join(config.paths.pages, 'auth-gate-rsc.tsx'), readTemplate('pages/auth-gate-rsc.tsx'))\n\n // --- Login page ---\n write(path.join(config.paths.login, 'page.tsx'), readTemplate('pages/login-page.tsx'))\n write(\n path.join(config.paths.login, 'login-page-rsc.tsx'),\n readTemplate('pages/login-page-rsc.tsx')\n )\n write(\n path.join(config.paths.login, 'login-page-skeleton.tsx'),\n readTemplate('pages/login-page-skeleton.tsx')\n )\n write(path.join(config.paths.login, 'login-form.tsx'), readTemplate('pages/login-form.tsx'))\n\n const authDir = path.dirname(config.paths.login)\n\n // --- Forgot password page ---\n const forgotPasswordDir = path.join(authDir, 'forgot-password')\n write(path.join(forgotPasswordDir, 'page.tsx'), readTemplate('pages/forgot-password-page.tsx'))\n write(\n path.join(forgotPasswordDir, 'forgot-password-page-skeleton.tsx'),\n readTemplate('pages/forgot-password-page-skeleton.tsx')\n )\n write(\n path.join(forgotPasswordDir, 'forgot-password-form.tsx'),\n readTemplate('pages/forgot-password-form.tsx')\n )\n\n // --- Reset password page ---\n const resetPasswordDir = path.join(authDir, 'reset-password')\n write(path.join(resetPasswordDir, 'page.tsx'), readTemplate('pages/reset-password-page.tsx'))\n write(\n path.join(resetPasswordDir, 'reset-password-page-skeleton.tsx'),\n readTemplate('pages/reset-password-page-skeleton.tsx')\n )\n write(\n path.join(resetPasswordDir, 'reset-password-form.tsx'),\n readTemplate('pages/reset-password-form.tsx')\n )\n\n // --- Dashboard ---\n write(path.join(config.paths.pages, 'page.tsx'), readTemplate('pages/dashboard-page.tsx'))\n\n // --- Users pages ---\n const usersDir = path.join(config.paths.pages, 'users')\n write(path.join(usersDir, 'page.tsx'), readTemplate('pages/users/users-page.tsx'))\n write(\n path.join(usersDir, 'users-page-skeleton.tsx'),\n readTemplate('pages/users/users-page-skeleton.tsx')\n )\n write(\n path.join(usersDir, 'users-page-content.tsx'),\n readTemplate('pages/users/users-page-content.tsx')\n )\n write(path.join(usersDir, 'users-table.tsx'), readTemplate('pages/users/users-table.tsx'))\n write(path.join(usersDir, 'columns.tsx'), readTemplate('pages/users/columns.tsx'))\n write(\n path.join(usersDir, 'create-user-dialog.tsx'),\n readTemplate('pages/users/create-user-dialog.tsx')\n )\n write(\n path.join(usersDir, 'delete-user-dialog.tsx'),\n readTemplate('pages/users/delete-user-dialog.tsx')\n )\n write(\n path.join(usersDir, 'edit-role-dialog.tsx'),\n readTemplate('pages/users/edit-role-dialog.tsx')\n )\n\n // --- Media pages ---\n const mediaDir = path.join(config.paths.pages, 'media')\n write(path.join(mediaDir, 'page.tsx'), readTemplate('pages/media/media-page.tsx'))\n write(\n path.join(mediaDir, 'media-page-skeleton.tsx'),\n readTemplate('pages/media/media-page-skeleton.tsx')\n )\n write(\n path.join(mediaDir, 'media-page-content.tsx'),\n readTemplate('pages/media/media-page-content.tsx')\n )\n\n // --- Account layout + Profile page ---\n const accountDir = path.join(adminDir, '(account)')\n write(path.join(accountDir, 'layout.tsx'), readTemplate('pages/account-layout.tsx'))\n write(path.join(accountDir, 'account-shell-rsc.tsx'), readTemplate('pages/account-shell-rsc.tsx'))\n write(\n path.join(accountDir, 'minimal-account-shell.tsx'),\n readTemplate('pages/minimal-account-shell.tsx')\n )\n\n const profileDir = path.join(accountDir, 'profile')\n write(path.join(profileDir, 'page.tsx'), readTemplate('pages/profile/profile-page.tsx'))\n write(path.join(profileDir, 'profile-form.tsx'), readTemplate('pages/profile/profile-form.tsx'))\n\n // --- Profile action + Sign-out component ---\n write(\n path.join(config.paths.admin, 'lib', 'actions', 'profile', 'index.ts'),\n readTemplate('lib/actions/profile/index.ts')\n )\n write(\n path.join(config.paths.admin, 'components', 'layouts', 'admin-sign-out.tsx'),\n readTemplate('components/layouts/admin-sign-out.tsx')\n )\n\n return created\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface NextConfigScaffoldOptions {\n cwd: string\n nextMajorVersion: number\n}\n\nexport type NextConfigScaffoldStatus =\n | 'created'\n | 'updated'\n | 'already-set'\n | 'unsupported'\n | 'not-needed'\n\nexport interface NextConfigScaffoldResult {\n status: NextConfigScaffoldStatus\n}\n\ntype CacheConfigMode = 'experimental-use-cache' | 'cache-components'\n\nconst BETTERSTART_ASSET_HOST = 'assets.betterstart.dev'\n\ninterface ContentUpdateResult {\n content: string\n changed: boolean\n unsupported?: boolean\n}\n\n/**\n * Ensure BetterStart's required Next.js config is present in the user's next.config.\n * Next.js 15 uses `experimental.useCache = true`.\n * Next.js 16+ uses top-level `cacheComponents = true`.\n * BetterStart remote assets also require an `images` allowance for `assets.betterstart.dev`.\n */\nexport function scaffoldNextConfig({\n cwd,\n nextMajorVersion\n}: NextConfigScaffoldOptions): NextConfigScaffoldResult {\n const cacheConfigMode = resolveCacheConfigMode(nextMajorVersion)\n if (!cacheConfigMode) {\n return { status: 'not-needed' }\n }\n\n const variants = ['next.config.ts', 'next.config.mjs', 'next.config.js']\n let configPath: string | null = null\n\n for (const variant of variants) {\n const candidate = path.resolve(cwd, variant)\n if (fs.existsSync(candidate)) {\n configPath = candidate\n break\n }\n }\n\n if (!configPath) {\n const newPath = path.resolve(cwd, 'next.config.ts')\n fs.writeFileSync(newPath, createNextConfigTemplate(cacheConfigMode), 'utf-8')\n return { status: 'created' }\n }\n\n const content = fs.readFileSync(configPath, 'utf-8')\n const configObject = findConfigObject(content)\n\n if (!configObject) {\n return { status: 'unsupported' }\n }\n\n const cacheUpdateResult =\n cacheConfigMode === 'cache-components'\n ? ensureCacheComponents(content, configObject)\n : ensureExperimentalUseCache(content, configObject)\n\n if (cacheUpdateResult.unsupported) {\n return { status: 'unsupported' }\n }\n\n const updatedConfigObject = findConfigObject(cacheUpdateResult.content)\n if (!updatedConfigObject) {\n return { status: 'unsupported' }\n }\n\n const imagesUpdateResult = ensureBetterStartImageHost(\n cacheUpdateResult.content,\n updatedConfigObject\n )\n if (imagesUpdateResult.unsupported) {\n return { status: 'unsupported' }\n }\n\n const changed = cacheUpdateResult.changed || imagesUpdateResult.changed\n if (!changed) {\n return { status: 'already-set' }\n }\n\n fs.writeFileSync(configPath, imagesUpdateResult.content, 'utf-8')\n return { status: 'updated' }\n}\n\nfunction resolveCacheConfigMode(nextMajorVersion: number): CacheConfigMode | null {\n if (nextMajorVersion >= 16) return 'cache-components'\n if (nextMajorVersion >= 15) return 'experimental-use-cache'\n return null\n}\n\nfunction createNextConfigTemplate(mode: CacheConfigMode): string {\n if (mode === 'cache-components') {\n return `import type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n cacheComponents: true,\n images: {\n remotePatterns: [\n {\n protocol: 'https',\n hostname: '${BETTERSTART_ASSET_HOST}',\n },\n ],\n },\n}\n\nexport default nextConfig\n`\n }\n\n return `import type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n experimental: {\n useCache: true,\n },\n images: {\n remotePatterns: [\n {\n protocol: 'https',\n hostname: '${BETTERSTART_ASSET_HOST}',\n },\n ],\n },\n}\n\nexport default nextConfig\n`\n}\n\nfunction ensureCacheComponents(\n content: string,\n configObject: ConfigObjectMatch\n): ContentUpdateResult {\n return upsertTopLevelBooleanProperty(content, configObject, 'cacheComponents')\n}\n\nfunction ensureExperimentalUseCache(\n content: string,\n configObject: ConfigObjectMatch\n): ContentUpdateResult {\n let updatedContent = content\n let changed = false\n\n const withoutCacheComponents = removeTopLevelProperty(\n updatedContent,\n configObject,\n 'cacheComponents'\n )\n updatedContent = withoutCacheComponents.content\n changed = withoutCacheComponents.changed\n\n const refreshedConfigObject = findConfigObject(updatedContent)\n if (!refreshedConfigObject) {\n return { content, changed: false, unsupported: true }\n }\n\n const experimentalProp = findTopLevelProperty(\n updatedContent,\n refreshedConfigObject.start,\n refreshedConfigObject.end,\n 'experimental'\n )\n\n if (!experimentalProp) {\n return {\n content:\n updatedContent.slice(0, refreshedConfigObject.start + 1) +\n `\\n${refreshedConfigObject.propertyIndent}experimental: {\\n${refreshedConfigObject.propertyIndent} useCache: true,\\n${refreshedConfigObject.propertyIndent}},` +\n updatedContent.slice(refreshedConfigObject.start + 1),\n changed: true\n }\n }\n\n const experimentalValue = experimentalProp.value.trim()\n if (!experimentalValue.startsWith('{')) {\n return { content, changed: false, unsupported: true }\n }\n\n const experimentalObjectStart = updatedContent.indexOf('{', experimentalProp.valueStart)\n if (experimentalObjectStart < 0) {\n return { content, changed: false, unsupported: true }\n }\n\n const experimentalObjectEnd = findMatchingBrace(updatedContent, experimentalObjectStart)\n if (experimentalObjectEnd < 0) {\n return { content, changed: false, unsupported: true }\n }\n\n const useCacheProp = findTopLevelProperty(\n updatedContent,\n experimentalObjectStart,\n experimentalObjectEnd,\n 'useCache'\n )\n\n if (useCacheProp) {\n if (useCacheProp.value.trim() === 'true') {\n return { content: updatedContent, changed }\n }\n\n return {\n content:\n updatedContent.slice(0, useCacheProp.valueStart) +\n 'true' +\n updatedContent.slice(useCacheProp.valueEnd),\n changed: true\n }\n }\n\n const propertyIndent = detectPropertyIndent(updatedContent, experimentalObjectStart)\n return {\n content:\n updatedContent.slice(0, experimentalObjectStart + 1) +\n `\\n${propertyIndent}useCache: true,` +\n updatedContent.slice(experimentalObjectStart + 1),\n changed: true\n }\n}\n\nfunction ensureBetterStartImageHost(\n content: string,\n configObject: ConfigObjectMatch\n): ContentUpdateResult {\n const imagesProp = findTopLevelProperty(content, configObject.start, configObject.end, 'images')\n\n if (!imagesProp) {\n return {\n content:\n content.slice(0, configObject.start + 1) +\n `\\n${configObject.propertyIndent}images: {\\n${configObject.propertyIndent} remotePatterns: [\\n${configObject.propertyIndent} {\\n${configObject.propertyIndent} protocol: 'https',\\n${configObject.propertyIndent} hostname: '${BETTERSTART_ASSET_HOST}',\\n${configObject.propertyIndent} },\\n${configObject.propertyIndent} ],\\n${configObject.propertyIndent}},` +\n content.slice(configObject.start + 1),\n changed: true\n }\n }\n\n const imagesValue = imagesProp.value.trim()\n if (!imagesValue.startsWith('{')) {\n return { content, changed: false, unsupported: true }\n }\n\n const imagesObjectStart = content.indexOf('{', imagesProp.valueStart)\n if (imagesObjectStart < 0) {\n return { content, changed: false, unsupported: true }\n }\n\n const imagesObjectEnd = findMatchingBrace(content, imagesObjectStart)\n if (imagesObjectEnd < 0) {\n return { content, changed: false, unsupported: true }\n }\n\n if (hasBetterStartImageHostConfigured(content, imagesObjectStart, imagesObjectEnd)) {\n return { content, changed: false }\n }\n\n const remotePatternsProp = findTopLevelProperty(\n content,\n imagesObjectStart,\n imagesObjectEnd,\n 'remotePatterns'\n )\n if (!remotePatternsProp) {\n const propertyIndent = detectPropertyIndent(content, imagesObjectStart)\n return {\n content:\n content.slice(0, imagesObjectStart + 1) +\n `\\n${propertyIndent}remotePatterns: [\\n${propertyIndent} {\\n${propertyIndent} protocol: 'https',\\n${propertyIndent} hostname: '${BETTERSTART_ASSET_HOST}',\\n${propertyIndent} },\\n${propertyIndent}],` +\n content.slice(imagesObjectStart + 1),\n changed: true\n }\n }\n\n const remotePatternsValue = remotePatternsProp.value.trim()\n if (!remotePatternsValue.startsWith('[')) {\n return { content, changed: false, unsupported: true }\n }\n\n const arrayStart = content.indexOf('[', remotePatternsProp.valueStart)\n if (arrayStart < 0) {\n return { content, changed: false, unsupported: true }\n }\n\n const arrayEnd = findMatchingBracket(content, arrayStart)\n if (arrayEnd < 0) {\n return { content, changed: false, unsupported: true }\n }\n\n if (content.slice(arrayStart, arrayEnd + 1).includes(BETTERSTART_ASSET_HOST)) {\n return { content, changed: false }\n }\n\n const arrayIndent = detectPropertyIndent(content, arrayStart)\n const closingIndent = getLineIndent(content, arrayStart)\n const beforeClose = content.slice(arrayStart + 1, arrayEnd)\n const trailingWhitespace = beforeClose.match(/\\s*$/)?.[0] ?? ''\n const insertionPoint = arrayEnd - trailingWhitespace.length\n const normalizedItems = beforeClose.slice(0, beforeClose.length - trailingWhitespace.length)\n const separator = normalizedItems.trim().length === 0 || /,\\s*$/.test(normalizedItems) ? '' : ','\n const closingGap = trailingWhitespace.length > 0 ? trailingWhitespace : `\\n${closingIndent}`\n\n return {\n content:\n content.slice(0, insertionPoint) +\n `${separator}\\n${arrayIndent}{\\n${arrayIndent} protocol: 'https',\\n${arrayIndent} hostname: '${BETTERSTART_ASSET_HOST}',\\n${arrayIndent}},${closingGap}` +\n content.slice(arrayEnd),\n changed: true\n }\n}\n\nfunction upsertTopLevelBooleanProperty(\n content: string,\n configObject: ConfigObjectMatch,\n propertyName: string\n): ContentUpdateResult {\n const existingProp = findTopLevelProperty(\n content,\n configObject.start,\n configObject.end,\n propertyName\n )\n\n if (existingProp) {\n if (existingProp.value.trim() === 'true') {\n return { content, changed: false }\n }\n\n return {\n content: `${content.slice(0, existingProp.valueStart)}true${content.slice(existingProp.valueEnd)}`,\n changed: true\n }\n }\n\n return {\n content:\n content.slice(0, configObject.start + 1) +\n `\\n${configObject.propertyIndent}${propertyName}: true,` +\n content.slice(configObject.start + 1),\n changed: true\n }\n}\n\nfunction removeTopLevelProperty(\n content: string,\n configObject: ConfigObjectMatch,\n propertyName: string\n): ContentUpdateResult {\n const property = findTopLevelProperty(content, configObject.start, configObject.end, propertyName)\n if (!property) {\n return { content, changed: false }\n }\n\n const propertyLineStart = content.lastIndexOf('\\n', property.propertyStart) + 1\n let propertyEnd = property.valueEnd\n\n if (content[propertyEnd] === ',') propertyEnd++\n if (content[propertyEnd] === '\\r') propertyEnd++\n if (content[propertyEnd] === '\\n') propertyEnd++\n\n return {\n content: content.slice(0, propertyLineStart) + content.slice(propertyEnd),\n changed: true\n }\n}\n\ninterface ConfigObjectMatch {\n start: number\n end: number\n propertyIndent: string\n}\n\ninterface PropertyMatch {\n propertyStart: number\n value: string\n valueStart: number\n valueEnd: number\n}\n\nconst CONFIG_OBJECT_PATTERNS = [\n /\\b(?:const|let|var)\\s+\\w+\\s*:\\s*NextConfig\\s*=\\s*\\{/g,\n /\\b(?:const|let|var)\\s+nextConfig\\s*=\\s*\\{/g,\n /\\b(?:const|let|var)\\s+\\w+\\s*:\\s*NextConfig\\s*=\\s*(?:[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*\\(\\s*)+\\{/g,\n /\\b(?:const|let|var)\\s+nextConfig\\s*=\\s*(?:[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*\\(\\s*)+\\{/g,\n /export\\s+default\\s+\\{/g,\n /export\\s+default\\s+(?:[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*\\(\\s*)+\\{/g,\n /module\\.exports\\s*=\\s*\\{/g,\n /module\\.exports\\s*=\\s*(?:[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*)*\\(\\s*)+\\{/g\n]\n\nfunction findConfigObject(content: string): ConfigObjectMatch | null {\n let openingBrace = -1\n let earliestMatch = Number.POSITIVE_INFINITY\n\n for (const pattern of CONFIG_OBJECT_PATTERNS) {\n const match = pattern.exec(content)\n pattern.lastIndex = 0\n if (!match) {\n continue\n }\n\n if (match.index >= earliestMatch) {\n continue\n }\n\n earliestMatch = match.index\n openingBrace = match.index + match[0].lastIndexOf('{')\n }\n\n if (openingBrace < 0) {\n return null\n }\n\n const closingBrace = findMatchingBrace(content, openingBrace)\n if (closingBrace < 0) {\n return null\n }\n\n return {\n start: openingBrace,\n end: closingBrace,\n propertyIndent: detectPropertyIndent(content, openingBrace)\n }\n}\n\nfunction detectPropertyIndent(content: string, objectStart: number): string {\n const lineStart = content.lastIndexOf('\\n', objectStart) + 1\n const baseIndent = content.slice(lineStart, objectStart).match(/^\\s*/)?.[0] ?? ''\n const body = content.slice(objectStart + 1)\n const propIndent = body.match(/\\n([ \\t]+)\\S/)\n\n return propIndent?.[1] ?? `${baseIndent} `\n}\n\nfunction findMatchingBrace(content: string, openingBrace: number): number {\n let depth = 0\n let inString: '\"' | \"'\" | '`' | null = null\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = openingBrace; i < content.length; i++) {\n const char = content[i]\n const next = content[i + 1]\n const prev = content[i - 1]\n\n if (inLineComment) {\n if (char === '\\n') inLineComment = false\n continue\n }\n\n if (inBlockComment) {\n if (prev === '*' && char === '/') inBlockComment = false\n continue\n }\n\n if (inString) {\n if (char === inString && prev !== '\\\\') inString = null\n continue\n }\n\n if (char === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (char === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = char\n continue\n }\n\n if (char === '{') {\n depth++\n continue\n }\n\n if (char === '}') {\n depth--\n if (depth === 0) return i\n }\n }\n\n return -1\n}\n\nfunction findMatchingBracket(content: string, openingBracket: number): number {\n let depth = 0\n let inString: '\"' | \"'\" | '`' | null = null\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = openingBracket; i < content.length; i++) {\n const char = content[i]\n const next = content[i + 1]\n const prev = content[i - 1]\n\n if (inLineComment) {\n if (char === '\\n') inLineComment = false\n continue\n }\n\n if (inBlockComment) {\n if (prev === '*' && char === '/') inBlockComment = false\n continue\n }\n\n if (inString) {\n if (char === inString && prev !== '\\\\') inString = null\n continue\n }\n\n if (char === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (char === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = char\n continue\n }\n\n if (char === '[') {\n depth++\n continue\n }\n\n if (char === ']') {\n depth--\n if (depth === 0) return i\n }\n }\n\n return -1\n}\n\nfunction getLineIndent(content: string, position: number): string {\n const lineStart = content.lastIndexOf('\\n', position) + 1\n return content.slice(lineStart, position).match(/^\\s*/)?.[0] ?? ''\n}\n\nfunction hasBetterStartImageHostConfigured(\n content: string,\n imagesObjectStart: number,\n imagesObjectEnd: number\n): boolean {\n const domainsProp = findTopLevelProperty(content, imagesObjectStart, imagesObjectEnd, 'domains')\n if (domainsProp?.value.includes(BETTERSTART_ASSET_HOST)) {\n return true\n }\n\n const remotePatternsProp = findTopLevelProperty(\n content,\n imagesObjectStart,\n imagesObjectEnd,\n 'remotePatterns'\n )\n return remotePatternsProp?.value.includes(BETTERSTART_ASSET_HOST) ?? false\n}\n\nfunction findTopLevelProperty(\n content: string,\n objectStart: number,\n objectEnd: number,\n propertyName: string\n): PropertyMatch | null {\n let depth = 0\n let inString: '\"' | \"'\" | '`' | null = null\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = objectStart + 1; i < objectEnd; i++) {\n const char = content[i]\n const next = content[i + 1]\n const prev = content[i - 1]\n\n if (inLineComment) {\n if (char === '\\n') inLineComment = false\n continue\n }\n\n if (inBlockComment) {\n if (prev === '*' && char === '/') inBlockComment = false\n continue\n }\n\n if (inString) {\n if (char === inString && prev !== '\\\\') inString = null\n continue\n }\n\n if (char === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (char === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = char\n continue\n }\n\n if (char === '{' || char === '[' || char === '(') {\n depth++\n continue\n }\n\n if (char === '}' || char === ']' || char === ')') {\n depth--\n continue\n }\n\n if (depth !== 0 || !isIdentifierStart(char)) {\n continue\n }\n\n if (\n !content.startsWith(propertyName, i) ||\n !isIdentifierBoundary(content[i + propertyName.length])\n ) {\n continue\n }\n\n let cursor = i + propertyName.length\n while (cursor < objectEnd && /\\s/.test(content[cursor]!)) cursor++\n if (content[cursor] !== ':') continue\n\n cursor++\n while (cursor < objectEnd && /\\s/.test(content[cursor]!)) cursor++\n const valueStart = cursor\n const valueEnd = findTopLevelValueEnd(content, valueStart, objectEnd)\n\n return {\n propertyStart: i,\n value: content.slice(valueStart, valueEnd),\n valueStart,\n valueEnd\n }\n }\n\n return null\n}\n\nfunction findTopLevelValueEnd(content: string, valueStart: number, objectEnd: number): number {\n let depth = 0\n let inString: '\"' | \"'\" | '`' | null = null\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = valueStart; i < objectEnd; i++) {\n const char = content[i]\n const next = content[i + 1]\n const prev = content[i - 1]\n\n if (inLineComment) {\n if (char === '\\n') inLineComment = false\n continue\n }\n\n if (inBlockComment) {\n if (prev === '*' && char === '/') inBlockComment = false\n continue\n }\n\n if (inString) {\n if (char === inString && prev !== '\\\\') inString = null\n continue\n }\n\n if (char === '/' && next === '/') {\n inLineComment = true\n i++\n continue\n }\n\n if (char === '/' && next === '*') {\n inBlockComment = true\n i++\n continue\n }\n\n if (char === '\"' || char === \"'\" || char === '`') {\n inString = char\n continue\n }\n\n if (char === '{' || char === '[' || char === '(') {\n depth++\n continue\n }\n\n if (char === '}' || char === ']' || char === ')') {\n depth--\n continue\n }\n\n if (depth === 0 && char === ',') {\n return i\n }\n }\n\n return objectEnd\n}\n\nfunction isIdentifierStart(char: string | undefined): boolean {\n return !!char && /[A-Za-z_$]/.test(char)\n}\n\nfunction isIdentifierBoundary(char: string | undefined): boolean {\n return !char || !/[A-Za-z0-9_$]/.test(char)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nfunction getSourceLines(namespace: string, hasSrcDir: boolean): string[] {\n return hasSrcDir\n ? [`@source \"../../${namespace}/**/*.{ts,tsx}\";`, `@source \"./(${namespace})/**/*.{ts,tsx}\";`]\n : [`@source \"../${namespace}/**/*.{ts,tsx}\";`, `@source \"./(${namespace})/**/*.{ts,tsx}\";`]\n}\n\n// Tailwind v4 @theme tokens that map CSS vars to utility classes.\n// These let Tailwind generate bg-primary, text-muted-foreground, border-border, etc.\nconst ADMIN_THEME_BLOCK = `\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --color-card: var(--card);\n --color-card-foreground: var(--card-foreground);\n --color-popover: var(--popover);\n --color-popover-foreground: var(--popover-foreground);\n --color-primary: var(--primary);\n --color-primary-foreground: var(--primary-foreground);\n --color-secondary: var(--secondary);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-muted: var(--muted);\n --color-muted-foreground: var(--muted-foreground);\n --color-accent: var(--accent);\n --color-accent-foreground: var(--accent-foreground);\n --color-destructive: var(--destructive);\n --color-destructive-foreground: var(--destructive-foreground);\n --color-border: var(--border);\n --color-input: var(--input);\n --color-input-border: var(--input-border);\n --color-ring: var(--ring);\n --color-chart-1: var(--chart-1);\n --color-chart-2: var(--chart-2);\n --color-chart-3: var(--chart-3);\n --color-chart-4: var(--chart-4);\n --color-chart-5: var(--chart-5);\n --color-sidebar: var(--sidebar);\n --color-sidebar-foreground: var(--sidebar-foreground);\n --color-sidebar-primary: var(--sidebar-primary);\n --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);\n --color-sidebar-accent: var(--sidebar-accent);\n --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);\n --color-sidebar-border: var(--sidebar-border);\n --color-sidebar-ring: var(--sidebar-ring);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}`\n\nconst ADMIN_SHADOW_INPUT_UTILITY = `\n@utility shadow-input {\n --admin-shadow-input: rgba(0, 0, 0, 0.02) 0px 4px 8px -2px;\n --tw-shadow: var(--admin-shadow-input);\n box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow),\n var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}`\n\nfunction getAdminThemeVars(): string[] {\n return ADMIN_THEME_BLOCK.split('\\n').filter((line) => line.trim().startsWith('--'))\n}\n\nfunction getMissingThemeVars(existingBlock: string): string[] {\n return getAdminThemeVars()\n .filter((line) => {\n const varName = line.trim().split(':')[0]!.trim()\n return !existingBlock.includes(varName)\n })\n .map((line) => ` ${line.trim()}`)\n}\n\n/**\n * Find the main CSS file that imports Tailwind.\n */\nfunction findMainCss(cwd: string): string | undefined {\n const candidates = [\n 'src/app/globals.css',\n 'app/globals.css',\n 'src/app/global.css',\n 'app/global.css',\n 'src/app/app.css',\n 'app/app.css',\n 'src/globals.css',\n 'globals.css'\n ]\n\n for (const candidate of candidates) {\n const filePath = path.join(cwd, candidate)\n if (fs.existsSync(filePath)) {\n return filePath\n }\n }\n return undefined\n}\n\n/**\n * Append @source directive and @theme tokens to the user's main CSS file\n * so Tailwind scans Admin component classes and generates utility classes.\n */\nexport function scaffoldTailwind(\n cwd: string,\n hasSrcDir: boolean,\n namespace = 'admin'\n): { file: string | null; appended: boolean } {\n const cssFile = findMainCss(cwd)\n if (!cssFile) {\n return { file: null, appended: false }\n }\n\n let content = fs.readFileSync(cssFile, 'utf-8')\n let changed = false\n\n // 1. Add @source directives if not present\n const sourceLines = getSourceLines(namespace, hasSrcDir)\n const missingLines = sourceLines.filter((sl) => !content.includes(sl))\n if (missingLines.length > 0) {\n const lines = content.split('\\n')\n let insertIndex = 0\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i]!.trim()\n if (\n trimmed.startsWith('@import') ||\n trimmed.startsWith('@source') ||\n trimmed.startsWith('@plugin')\n ) {\n insertIndex = i + 1\n }\n }\n lines.splice(insertIndex, 0, ...missingLines)\n content = lines.join('\\n')\n changed = true\n }\n\n // 2. Add @theme tokens, merging future tokens into existing blocks.\n const themeMatch = content.match(/@theme\\s+inline\\s*\\{/)\n if (themeMatch && themeMatch.index !== undefined) {\n let braceDepth = 0\n let insertPos = -1\n for (let i = themeMatch.index; i < content.length; i++) {\n if (content[i] === '{') braceDepth++\n if (content[i] === '}') {\n braceDepth--\n if (braceDepth === 0) {\n insertPos = i\n break\n }\n }\n }\n if (insertPos !== -1) {\n const existingBlock = content.slice(themeMatch.index, insertPos)\n const varsOnly = getMissingThemeVars(existingBlock).join('\\n')\n if (varsOnly) {\n content = `${content.slice(0, insertPos)}${varsOnly}\\n${content.slice(insertPos)}`\n changed = true\n }\n }\n } else {\n content = `${content}\\n${ADMIN_THEME_BLOCK}\\n`\n changed = true\n }\n\n if (!content.includes('@utility shadow-input')) {\n content = `${content}\\n${ADMIN_SHADOW_INPUT_UTILITY}\\n`\n changed = true\n }\n\n if (changed) {\n fs.writeFileSync(cssFile, content, 'utf-8')\n }\n\n return { file: cssFile, appended: changed }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\n\n// Strip line and block comments from JSON, respecting quoted strings.\nfunction stripJsonComments(input: string): string {\n let result = ''\n let i = 0\n while (i < input.length) {\n // Inside a string — copy until closing quote\n if (input[i] === '\"') {\n let j = i + 1\n while (j < input.length) {\n if (input[j] === '\\\\') {\n j += 2\n continue\n }\n if (input[j] === '\"') {\n j++\n break\n }\n j++\n }\n result += input.slice(i, j)\n i = j\n // Line comment\n } else if (input[i] === '/' && input[i + 1] === '/') {\n const nl = input.indexOf('\\n', i)\n i = nl === -1 ? input.length : nl\n // Block comment\n } else if (input[i] === '/' && input[i + 1] === '*') {\n const end = input.indexOf('*/', i + 2)\n i = end === -1 ? input.length : end + 2\n } else {\n result += input[i]\n i++\n }\n }\n return result\n}\n\nfunction createAdminPathAliases(config: ResolvedBetterstartConfig): Record<string, string[]> {\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const adminPath = config.paths.admin\n\n return {\n [`${namespace.alias}/*`]: [`${adminPath}/*`],\n [`${namespace.alias}/db`]: [`${adminPath}/lib/db/client`],\n [`${namespace.alias}/db/schema`]: [`${adminPath}/lib/db/schema`],\n [`${namespace.alias}/actions/*`]: [`${adminPath}/lib/actions/*`],\n [`${namespace.alias}/auth/server`]: [`${adminPath}/lib/actions/auth/server`],\n [`${namespace.alias}/auth/client`]: [`${adminPath}/lib/actions/auth/client`],\n [`${namespace.alias}/auth/session`]: [`${adminPath}/lib/actions/auth/session`],\n [`${namespace.alias}/hooks/*`]: [`${adminPath}/hooks/*`],\n [`${namespace.alias}/components/*`]: [`${adminPath}/components/*`],\n [`${namespace.alias}/types`]: [`${adminPath}/types`],\n [`${namespace.alias}/types/*`]: [`${adminPath}/types/*`],\n [`${namespace.alias}/utils/*`]: [`${adminPath}/utils/*`]\n }\n}\n\nconst DEPRECATED_ADMIN_PATH_ALIAS_SUFFIXES = ['/data/*', '/auth', '/auth/middleware']\n\nfunction sameTargets(a: string[] | undefined, b: string[]): boolean {\n return Boolean(a && a.length === b.length && a.every((value, index) => value === b[index]))\n}\n\n/**\n * Add or update BetterStart-managed admin path aliases in tsconfig.json.\n */\nexport function scaffoldTsconfig(\n cwd: string,\n config: ResolvedBetterstartConfig\n): { added: string[]; skipped: string[] } {\n const tsconfigPath = path.join(cwd, 'tsconfig.json')\n const added: string[] = []\n const skipped: string[] = []\n\n if (!fs.existsSync(tsconfigPath)) {\n skipped.push('tsconfig.json not found')\n return { added, skipped }\n }\n\n const raw = fs.readFileSync(tsconfigPath, 'utf-8')\n\n // Strip JSON comments while preserving string contents.\n // Walks character-by-character to avoid mangling strings that contain /* or //.\n const stripped = stripJsonComments(raw)\n // Remove trailing commas before } or ]\n .replace(/,\\s*([\\]}])/g, '$1')\n\n let tsconfig: Record<string, unknown>\n try {\n tsconfig = JSON.parse(stripped)\n } catch {\n skipped.push('Failed to parse tsconfig.json')\n return { added, skipped }\n }\n\n const compilerOptions = (tsconfig.compilerOptions ?? {}) as Record<string, unknown>\n const paths = (compilerOptions.paths ?? {}) as Record<string, string[]>\n\n if (compilerOptions.resolveJsonModule === true) {\n skipped.push('compilerOptions.resolveJsonModule')\n } else {\n compilerOptions.resolveJsonModule = true\n added.push('compilerOptions.resolveJsonModule')\n }\n\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const aliases = createAdminPathAliases(config)\n for (const [alias, target] of Object.entries(aliases)) {\n if (sameTargets(paths[alias], target)) {\n skipped.push(alias)\n } else {\n paths[alias] = target\n added.push(alias)\n }\n }\n\n for (const alias of Object.keys(paths)) {\n const isDefaultAdminAliasForCustomNamespace =\n namespace.alias !== '@admin' && (alias === '@admin' || alias.startsWith('@admin/'))\n const isDeprecatedCurrentAlias = DEPRECATED_ADMIN_PATH_ALIAS_SUFFIXES.some(\n (suffix) => alias === `${namespace.alias}${suffix}`\n )\n\n if (isDefaultAdminAliasForCustomNamespace || isDeprecatedCurrentAlias) {\n delete paths[alias]\n added.push(alias)\n }\n }\n\n compilerOptions.paths = paths\n tsconfig.compilerOptions = compilerOptions\n\n fs.writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\\n`, 'utf-8')\n\n return { added, skipped }\n}\n","/**\n * seed command — create initial admin user via Better Auth\n *\n * Generates a seed script at admin/scripts/seed.ts and runs it with tsx.\n * The script uses Better Auth's server API to create the user, then\n * sets the role to 'admin' via a direct database update.\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport * as clack from '@clack/prompts'\nimport type { SeedCommandOptions } from '@core-engine/commands/runtime.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveConfig } from '@next-adapter/config.js'\n\nexport function buildSeedScript(authBasePath = '/api/admin/auth'): string {\n // Self-contained: inlines DB + auth setup so tsx doesn't need generated aliases.\n // Only relative import is ../lib/db/schema which uses npm packages only.\n return `/**\n * BetterStart Admin — Seed Script\n * Creates the initial admin user\n * AUTO-GENERATED — safe to delete after running\n */\n\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\n// Load .env.local (inline — avoids @next/env dependency)\nfor (const envFile of ['.env.local', '.env']) {\n try {\n const content = readFileSync(resolve(process.cwd(), envFile), 'utf-8')\n for (const line of content.split('\\\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n const val = trimmed.slice(eqIdx + 1).trim().replace(/^['\"]|['\"]$/g, '')\n if (!process.env[key]) process.env[key] = val\n }\n } catch {}\n}\n\nimport { drizzle } from 'drizzle-orm/postgres-js'\nimport { eq } from 'drizzle-orm'\nimport postgres from 'postgres'\nimport * as schema from '../lib/db/schema'\nimport { betterAuth } from 'better-auth'\nimport { drizzleAdapter } from 'better-auth/adapters/drizzle'\n\n// Inline DB connection (mirrors generated lib/db/client.ts)\nconst databaseUrl = process.env.DATABASE_URL\nif (!databaseUrl) {\n throw new Error('DATABASE_URL is required')\n}\n\nconst client = postgres(databaseUrl)\nconst db = drizzle({ client, schema })\n\n// Inline auth setup (mirrors generated lib/actions/auth/server.ts)\nconst auth = betterAuth({\n secret: process.env.BETTERSTART_AUTH_SECRET,\n baseURL: process.env.BETTERSTART_AUTH_URL,\n basePath: process.env.BETTERSTART_AUTH_BASE_PATH || '${authBasePath}',\n database: drizzleAdapter(db, {\n provider: 'pg',\n schema: {\n user: schema.user,\n session: schema.session,\n account: schema.account,\n verification: schema.verification,\n },\n }),\n emailAndPassword: { enabled: true, minPasswordLength: 8 },\n user: {\n additionalFields: {\n role: { type: 'string', required: false, defaultValue: 'member', input: false },\n },\n },\n})\n\nconst CHECK_ADMIN_ONLY = process.env.SEED_CHECK_ADMIN === 'true'\nconst OVERWRITE_MODE = process.env.SEED_OVERWRITE_MODE\n\nasync function clearAuthorshipReferences(userId: string) {\n for (const table of Object.values(schema)) {\n if (!table || typeof table !== 'object') continue\n const tableRef = table as unknown as Record<string, unknown>\n\n if (tableRef.createdBy) {\n await db\n .update(table as never)\n .set({ createdBy: null })\n .where(eq(tableRef.createdBy as never, userId))\n }\n\n if (tableRef.updatedBy) {\n await db\n .update(table as never)\n .set({ updatedBy: null })\n .where(eq(tableRef.updatedBy as never, userId))\n }\n }\n}\n\nasync function main() {\n const existingAdmin = await db\n .select({ id: schema.user.id, email: schema.user.email, name: schema.user.name })\n .from(schema.user)\n .where(eq(schema.user.role, 'admin'))\n .then((rows: { id: string; email: string; name: string }[]) => rows[0])\n\n if (CHECK_ADMIN_ONLY) {\n if (existingAdmin) {\n console.log(\\`EXISTING_ADMIN:\\${JSON.stringify(existingAdmin)}\\`)\n process.exit(3)\n }\n process.exit(0)\n }\n\n const EMAIL = process.env.SEED_EMAIL!\n const PASSWORD = process.env.SEED_PASSWORD!\n const NAME = process.env.SEED_NAME || 'Admin'\n\n // Check if a user already exists with the requested email\n const existingUser = await db\n .select({ id: schema.user.id, name: schema.user.name })\n .from(schema.user)\n .where(eq(schema.user.email, EMAIL))\n .then((rows: { id: string; name: string }[]) => rows[0])\n\n const replaceTarget =\n OVERWRITE_MODE === 'admin' ? existingAdmin : OVERWRITE_MODE === 'email' ? existingUser : undefined\n\n if (existingUser && !replaceTarget) {\n // Exit code 2 signals \"user exists\" to the CLI\n console.log(\\`EXISTING_USER:\\${existingUser.name}\\`)\n process.exit(2)\n }\n\n if (replaceTarget) {\n console.log(\n OVERWRITE_MODE === 'admin'\n ? '\\\\n Replacing existing admin user...'\n : '\\\\n Replacing existing account...'\n )\n await clearAuthorshipReferences(replaceTarget.id)\n // Remove existing account + session rows first (foreign key refs)\n await db.delete(schema.session).where(eq(schema.session.userId, replaceTarget.id))\n await db.delete(schema.account).where(eq(schema.account.userId, replaceTarget.id))\n await db.delete(schema.user).where(eq(schema.user.id, replaceTarget.id))\n } else {\n console.log('\\\\n Creating admin user...')\n }\n\n console.log(\\` Email: \\${EMAIL}\\\\n\\`)\n\n const result = await auth.api.signUpEmail({\n body: { email: EMAIL, password: PASSWORD, name: NAME },\n })\n\n if (!result?.user) {\n console.error(' Failed to create user.')\n process.exit(1)\n }\n\n await db\n .update(schema.user)\n .set({ role: 'admin' })\n .where(eq(schema.user.id, result.user.id))\n\n console.log(\\` Admin user \\${replaceTarget ? 'replaced' : 'created'}: \\${EMAIL}\\`)\n console.log(' Role: admin\\\\n')\n process.exit(0)\n}\n\nmain().catch((err) => {\n console.error(' Seed failed:', err.message || err)\n process.exit(1)\n})\n`\n}\n\nexport async function runSeedCommand(options: SeedCommandOptions): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n\n clack.intro('BetterStart Seed')\n\n // Load config\n let config: ResolvedBetterstartConfig\n try {\n config = await resolveConfig(cwd)\n } catch (err) {\n clack.cancel(`Error loading config: ${err instanceof Error ? err.message : String(err)}`)\n process.exit(1)\n }\n\n const adminDir = config.paths?.admin ?? './admin'\n\n // Prompt for user details\n const email = await clack.text({\n message: 'Admin email',\n placeholder: 'admin@example.com',\n validate: (v) => {\n if (!v || !v.includes('@')) return 'Please enter a valid email'\n }\n })\n if (clack.isCancel(email)) {\n clack.cancel('Cancelled.')\n process.exit(0)\n }\n\n const password = await clack.password({\n message: 'Admin password',\n validate: (v) => {\n if (!v || v.length < 8) return 'Password must be at least 8 characters'\n }\n })\n if (clack.isCancel(password)) {\n clack.cancel('Cancelled.')\n process.exit(0)\n }\n\n const name = await clack.text({\n message: 'Admin name',\n placeholder: 'Admin',\n defaultValue: 'Admin'\n })\n if (clack.isCancel(name)) {\n clack.cancel('Cancelled.')\n process.exit(0)\n }\n\n // Write seed script\n const scriptsDir = path.join(cwd, adminDir, 'scripts')\n const seedPath = path.join(scriptsDir, 'seed.ts')\n\n if (!fs.existsSync(scriptsDir)) {\n fs.mkdirSync(scriptsDir, { recursive: true })\n }\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n fs.writeFileSync(seedPath, buildSeedScript(`${namespace.apiPath}/auth`), 'utf-8')\n\n const { execFile } = await import('node:child_process')\n const tsxBin = path.join(cwd, 'node_modules', '.bin', 'tsx')\n\n const runSeed = (overwrite: boolean) =>\n new Promise<{ code: number; stdout: string }>((resolve, reject) => {\n execFile(\n tsxBin,\n [seedPath],\n {\n cwd,\n env: {\n ...process.env,\n SEED_EMAIL: email,\n SEED_PASSWORD: password,\n SEED_NAME: name || 'Admin',\n ...(overwrite ? { SEED_OVERWRITE_MODE: 'email' } : {})\n }\n },\n (err, stdout, stderr) => {\n if (err && 'code' in err && err.code === 2) {\n // Exit code 2 = user already exists\n resolve({ code: 2, stdout })\n } else if (err) {\n reject(new Error(stderr || err.message))\n } else {\n resolve({ code: 0, stdout })\n }\n }\n )\n })\n\n const spinner = clack.spinner()\n spinner.start('Creating admin user...')\n\n try {\n const result = await runSeed(false)\n\n if (result.code === 2) {\n // User already exists — ask to overwrite\n const existingName =\n result.stdout\n .split('\\n')\n .find((l) => l.startsWith('EXISTING_USER:'))\n ?.replace('EXISTING_USER:', '')\n ?.trim() || 'unknown'\n\n spinner.stop(`Account already exists for ${email}`)\n\n const overwrite = await clack.confirm({\n message: `An admin account (${existingName}) already exists with this email. Replace it?`\n })\n if (clack.isCancel(overwrite) || !overwrite) {\n clack.cancel('Seed cancelled.')\n // Clean up before exiting\n try {\n fs.unlinkSync(seedPath)\n } catch {}\n process.exit(0)\n }\n\n spinner.start('Replacing admin user...')\n await runSeed(true)\n spinner.stop('Admin user replaced')\n } else {\n spinner.stop('Admin user created')\n }\n } catch (err) {\n spinner.stop('Failed to create admin user')\n\n const errMsg = err instanceof Error ? err.message : String(err)\n clack.log.error(errMsg)\n clack.log.info('You can run the seed script manually:')\n clack.log.info(\n ` SEED_EMAIL=\"${email}\" SEED_PASSWORD=\"...\" npx tsx ${path.relative(cwd, seedPath)}`\n )\n clack.outro('')\n process.exit(1)\n }\n\n // Clean up seed script\n try {\n fs.unlinkSync(seedPath)\n // Remove scripts dir if empty\n if (fs.existsSync(scriptsDir) && fs.readdirSync(scriptsDir).length === 0) {\n fs.rmdirSync(scriptsDir)\n }\n } catch {\n // Not critical\n }\n\n clack.outro(`Admin user ready: ${email}`)\n}\n","import path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { ListIntegrationsCommandOptions } from '@core-engine/commands/runtime.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport { listAvailableIntegrations } from '@next-adapter/integration-runtime.js'\n\nexport async function runListIntegrationsCommand(\n options: ListIntegrationsCommandOptions\n): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const config = await resolveConfig(cwd)\n const installedIntegrations = new Set(config.integrations.installed)\n\n const lines = listAvailableIntegrations().map((integration) => {\n const status = installedIntegrations.has(integration.id) ? 'installed' : 'available'\n return `${integration.id.padEnd(10)} ${status.padEnd(10)} ${integration.kind.padEnd(8)} ${integration.description}`\n })\n\n p.note(lines.join('\\n'), 'BetterStart integrations')\n p.outro(\n `${installedIntegrations.size} installed, ${lines.length - installedIntegrations.size} available`\n )\n}\n","import path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { ListPluginsCommandOptions } from '@core-engine/commands/runtime.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport { listAvailablePlugins } from '@next-adapter/plugin-runtime.js'\n\nexport async function runListPluginsCommand(options: ListPluginsCommandOptions): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const config = await resolveConfig(cwd)\n const installedPlugins = new Set(config.plugins.installed)\n\n const lines = listAvailablePlugins().map((plugin) => {\n const status = installedPlugins.has(plugin.id) ? 'installed' : 'available'\n return `${plugin.id.padEnd(10)} ${status.padEnd(10)} ${plugin.kind.padEnd(12)} ${plugin.description}`\n })\n\n p.note(lines.join('\\n'), 'BetterStart plugins')\n p.outro(`${installedPlugins.size} installed, ${lines.length - installedPlugins.size} available`)\n}\n","import path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { RemoveCommandOptions } from '@core-engine/commands/runtime.js'\nimport { writeConfigFile } from '@core-engine/config/serialize.js'\nimport { detectPackageManager } from '@core-engine/utils/package-manager.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport {\n formatUnknownIntegrationMessage,\n isIntegrationId\n} from '@next-adapter/integration-registry.js'\nimport { removeIntegrations } from '@next-adapter/integration-runtime.js'\nimport { formatUnknownPluginMessage, isPluginId } from '@next-adapter/plugin-registry.js'\nimport { removePlugins } from '@next-adapter/plugin-runtime.js'\n\nexport async function runRemoveCommand(\n items: string[],\n options: RemoveCommandOptions\n): Promise<void> {\n const removeIntegrationsMode = Boolean(options.integration)\n if (!removeIntegrationsMode && items.includes('core')) {\n p.log.error('The core Admin cannot be removed.')\n process.exit(1)\n }\n\n const pluginIds = items.filter(isPluginId)\n const integrationIds = items.filter(isIntegrationId)\n\n if (!removeIntegrationsMode && integrationIds.length > 0) {\n p.log.error(\n `Integration IDs require --integration. Run \\`betterstart remove --integration ${integrationIds.join(' ')}\\`.`\n )\n process.exit(1)\n }\n\n if (removeIntegrationsMode && pluginIds.length > 0) {\n p.log.error(`Plugin IDs cannot be removed with --integration: ${pluginIds.join(', ')}`)\n process.exit(1)\n }\n\n const invalidItems = removeIntegrationsMode\n ? items.filter((integrationId) => !isIntegrationId(integrationId))\n : items.filter((pluginId) => !isPluginId(pluginId))\n if (invalidItems.length > 0) {\n p.log.error(\n removeIntegrationsMode\n ? formatUnknownIntegrationMessage(invalidItems)\n : formatUnknownPluginMessage(invalidItems)\n )\n process.exit(1)\n }\n\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const config = await resolveConfig(cwd)\n const pm = detectPackageManager(cwd)\n\n if (!options.force) {\n const confirmed = await p.confirm({\n message: `Remove ${removeIntegrationsMode ? 'integration' : 'plugin'}${items.length === 1 ? '' : 's'} ${items.join(', ')}?`,\n initialValue: false\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel(`${removeIntegrationsMode ? 'Integration' : 'Plugin'} removal cancelled.`)\n process.exit(0)\n }\n }\n\n if (removeIntegrationsMode) {\n const result = await removeIntegrations({\n cwd,\n config,\n pm,\n integrationIds\n })\n\n writeConfigFile(cwd, result.config)\n\n if (result.removed.length === 0) {\n p.outro('No integrations were removed.')\n return\n }\n\n if (result.warnings.length > 0) {\n p.note(result.warnings.join('\\n'), 'Warnings')\n }\n\n p.outro(\n `Removed integration${result.removed.length === 1 ? '' : 's'}: ${result.removed.join(', ')}`\n )\n return\n }\n\n const result = await removePlugins({\n cwd,\n config,\n pm,\n pluginIds\n })\n\n writeConfigFile(cwd, result.config)\n\n if (result.removed.length === 0) {\n p.outro('No plugins were removed.')\n return\n }\n\n if (result.warnings.length > 0) {\n p.note(result.warnings.join('\\n'), 'Warnings')\n }\n\n p.outro(`Removed plugin${result.removed.length === 1 ? '' : 's'}: ${result.removed.join(', ')}`)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport readline from 'node:readline'\nimport type { RemoveSchemaCommandOptions } from '@core-engine/commands/runtime.js'\nimport { loadSchema } from '@core-engine/schema/schema-reader.js'\nimport {\n BARREL_SCOPE,\n clearTombstone,\n deleteSnapshot,\n hasTombstone,\n loadManifest,\n snapshotRootExists,\n writeTombstone\n} from '@core-engine/snapshots/store.js'\nimport { toKebabCase } from '@core-engine/utils/string.js'\nimport { resolveProjectPaths } from '@next-adapter/config/paths.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport { applyGeneratedFiles } from '@next-adapter/snapshots/apply.js'\nimport { renderBarrelFiles } from '@next-adapter/snapshots/barrels.js'\nimport { getSchemaOwner } from '@plugin-engine/ownership.js'\n\nasync function promptConfirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N) `, (answer) => {\n rl.close()\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes')\n })\n })\n}\n\nfunction removePath(cwd: string, filePath: string): boolean {\n const fullPath = path.join(cwd, ...filePath.split('/'))\n const existed = fs.existsSync(fullPath)\n fs.rmSync(fullPath, { recursive: true, force: true })\n return existed\n}\n\nfunction cleanupEmptyDirs(\n cwd: string,\n deletedPaths: string[],\n configPaths: ReturnType<typeof resolveProjectPaths>\n): void {\n const stopRoots = new Set([\n path.join(cwd, ...configPaths.adminDir.split('/')),\n path.join(cwd, ...configPaths.adminNavigationDir.split('/')),\n path.join(cwd, ...configPaths.pagesDir.split('/'))\n ])\n\n for (const deletedPath of deletedPaths) {\n let current = path.dirname(path.join(cwd, ...deletedPath.split('/')))\n\n while (!stopRoots.has(current)) {\n if (!fs.existsSync(current)) {\n current = path.dirname(current)\n continue\n }\n\n const entries = fs.readdirSync(current)\n if (entries.length > 0) {\n break\n }\n\n fs.rmdirSync(current)\n current = path.dirname(current)\n }\n }\n}\n\nfunction resolveSchemaOwnerForRemoval(\n cwd: string,\n schemaName: string\n): 'core' | 'user' | `plugin:${string}` {\n const explicitOwner = getSchemaOwner(cwd, schemaName)\n if (explicitOwner) {\n return explicitOwner\n }\n\n if (schemaName === 'settings') {\n return 'core'\n }\n\n return 'user'\n}\n\nexport async function runRemoveSchemaCommand(\n schemaName: string,\n options: RemoveSchemaCommandOptions\n): Promise<void> {\n const owner = resolveSchemaOwnerForRemoval(\n options.cwd ? path.resolve(options.cwd) : process.cwd(),\n schemaName\n )\n if (owner === 'core') {\n console.error(\n ` \"${schemaName}\" is a core Admin module and cannot be removed with remove-schema.`\n )\n process.exit(1)\n }\n if (owner.startsWith('plugin:')) {\n console.error(` \"${schemaName}\" is owned by ${owner}. Remove the owning plugin instead.`)\n process.exit(1)\n }\n\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const config = await resolveConfig(cwd)\n const paths = resolveProjectPaths(config)\n const manifest = loadManifest(cwd, schemaName)\n\n if (!snapshotRootExists(cwd)) {\n console.error(\n ' Project state is unsupported or incomplete. Re-run `betterstart init --force` to create the current snapshot-backed layout.'\n )\n process.exit(1)\n }\n\n if (!manifest) {\n console.error(\n ' Project state is unsupported or incomplete. Re-run `betterstart init --force` to create the current snapshot-backed layout.'\n )\n process.exit(1)\n }\n\n if (!options.force) {\n const confirmed = await promptConfirm(` Remove generated files for ${schemaName}?`)\n if (!confirmed) {\n console.log('\\n Cancelled.\\n')\n return\n }\n }\n\n const deletedPaths: string[] = []\n\n for (const file of [...manifest.files.map((entry) => entry.path), ...manifest.skipped]) {\n if (removePath(cwd, file)) {\n deletedPaths.push(file)\n }\n }\n\n const loaded = (() => {\n try {\n return loadSchema(path.join(cwd, ...paths.schemasDir.split('/')), schemaName)\n } catch {\n return null\n }\n })()\n\n const kebabName = toKebabCase(schemaName)\n if (loaded?.type === 'form') {\n if (removePath(cwd, `${paths.adminActionsDir}/${schemaName}`)) {\n deletedPaths.push(`${paths.adminActionsDir}/${schemaName}`)\n }\n if (removePath(cwd, `${paths.pagesDir}/forms/${kebabName}`)) {\n deletedPaths.push(`${paths.pagesDir}/forms/${kebabName}`)\n }\n } else {\n if (removePath(cwd, `${paths.adminActionsDir}/${schemaName}`)) {\n deletedPaths.push(`${paths.adminActionsDir}/${schemaName}`)\n }\n if (removePath(cwd, `${paths.pagesDir}/${schemaName}`)) {\n deletedPaths.push(`${paths.pagesDir}/${schemaName}`)\n }\n }\n\n cleanupEmptyDirs(cwd, deletedPaths, paths)\n deleteSnapshot(cwd, schemaName)\n if (hasTombstone(cwd, schemaName)) {\n clearTombstone(cwd, schemaName)\n }\n writeTombstone(cwd, schemaName)\n\n await applyGeneratedFiles({\n cwd,\n config,\n scope: BARREL_SCOPE,\n schemaJson: { name: BARREL_SCOPE },\n generatedFiles: renderBarrelFiles(cwd, config),\n force: false,\n interactive: false\n })\n\n console.log(`\\n Removed generated files for ${schemaName}.`)\n console.log(` Tombstone written: .betterstart/snapshots/_removed/${schemaName}`)\n console.log(' Schema JSON preserved.')\n console.log('')\n}\n","/**\n * uninstall command — fully reverse everything `betterstart init` did.\n * Removes Admin directories, config files, path aliases, CSS modifications,\n * env vars, and dependencies from package.json.\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport * as p from '@clack/prompts'\nimport type { UninstallCommandOptions } from '@core-engine/commands/runtime.js'\nimport { DEFAULT_ADMIN_NAMESPACE, resolveAdminNamespace } from '@next-adapter/config/namespace.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport pc from 'picocolors'\nimport { cleanCss, cleanEnvFile, cleanTsconfig } from './uninstall-cleaners.js'\n\n// ============================================================================\n// CSS File Finder (shared logic with tailwind scaffolder)\n// ============================================================================\n\nfunction findMainCss(cwd: string): string | undefined {\n const candidates = [\n 'src/app/globals.css',\n 'app/globals.css',\n 'src/app/global.css',\n 'app/global.css',\n 'src/app/app.css',\n 'app/app.css',\n 'src/globals.css',\n 'globals.css'\n ]\n for (const candidate of candidates) {\n const filePath = path.join(cwd, candidate)\n if (fs.existsSync(filePath)) return filePath\n }\n return undefined\n}\n\n// ============================================================================\n// Biome Detection\n// ============================================================================\n\nfunction isCLICreatedBiome(biomePath: string): boolean {\n if (!fs.existsSync(biomePath)) return false\n try {\n const content = JSON.parse(fs.readFileSync(biomePath, 'utf-8'))\n // Check key structural markers that match our template\n return (\n content.$schema?.includes('biomejs.dev') &&\n content.formatter?.indentStyle === 'space' &&\n content.javascript?.formatter?.quoteStyle === 'single' &&\n Array.isArray(content.files?.ignore) &&\n content.files.ignore.includes('.next')\n )\n } catch {\n return false\n }\n}\n\n// ============================================================================\n// Uninstall Plan\n// ============================================================================\n\ninterface UninstallStep {\n label: string\n items: string[]\n count: number\n unit: string\n execute: () => void\n}\n\nfunction buildUninstallPlan(cwd: string, namespaceValue: string): UninstallStep[] {\n const steps: UninstallStep[] = []\n const namespace = resolveAdminNamespace(namespaceValue)\n const hasSrc = fs.existsSync(path.join(cwd, 'src'))\n const appBase = hasSrc ? 'src/app' : 'app'\n\n // Step 1: Admin directories\n const dirs: string[] = []\n const adminDir = path.join(cwd, namespace.segment)\n const legacyAdminDir = path.join(cwd, 'admin')\n const adminRouteGroup = path.join(cwd, appBase, namespace.routeGroup)\n const legacyAdminRouteGroup = path.join(cwd, appBase, '(admin)')\n if (fs.existsSync(adminDir)) dirs.push(`${namespace.segment}/`)\n if (namespace.segment !== 'admin' && fs.existsSync(legacyAdminDir)) dirs.push('admin/')\n if (fs.existsSync(adminRouteGroup)) dirs.push(`${appBase}/${namespace.routeGroup}/`)\n if (namespace.segment !== 'admin' && fs.existsSync(legacyAdminRouteGroup))\n dirs.push(`${appBase}/(admin)/`)\n\n if (dirs.length > 0) {\n steps.push({\n label: 'Admin directories',\n items: dirs,\n count: dirs.length,\n unit: dirs.length === 1 ? 'directory' : 'directories',\n execute() {\n if (fs.existsSync(adminDir)) fs.rmSync(adminDir, { recursive: true, force: true })\n if (fs.existsSync(legacyAdminDir))\n fs.rmSync(legacyAdminDir, { recursive: true, force: true })\n if (fs.existsSync(adminRouteGroup)) {\n fs.rmSync(adminRouteGroup, { recursive: true, force: true })\n }\n if (fs.existsSync(legacyAdminRouteGroup)) {\n fs.rmSync(legacyAdminRouteGroup, { recursive: true, force: true })\n }\n }\n })\n }\n\n // Step 2: Config files\n const configFiles: string[] = []\n const configPaths: string[] = []\n const candidates = [\n ['admin.config.ts', path.join(cwd, 'admin.config.ts')],\n ['drizzle.config.ts', path.join(cwd, 'drizzle.config.ts')],\n ['ADMIN.md', path.join(cwd, 'ADMIN.md')]\n ] as const\n\n for (const [label, fullPath] of candidates) {\n if (fs.existsSync(fullPath)) {\n configFiles.push(label)\n configPaths.push(fullPath)\n }\n }\n\n const biomePath = path.join(cwd, 'biome.json')\n if (isCLICreatedBiome(biomePath)) {\n configFiles.push('biome.json (CLI-created)')\n configPaths.push(biomePath)\n }\n\n if (configFiles.length > 0) {\n steps.push({\n label: 'Config files',\n items: configFiles,\n count: configFiles.length,\n unit: configFiles.length === 1 ? 'file' : 'files',\n execute() {\n for (const p of configPaths) {\n if (fs.existsSync(p)) fs.unlinkSync(p)\n }\n }\n })\n }\n\n // Step 3: tsconfig.json generated aliases\n const tsconfigPath = path.join(cwd, 'tsconfig.json')\n if (fs.existsSync(tsconfigPath)) {\n const content = fs.readFileSync(tsconfigPath, 'utf-8')\n const aliasMatches = [\n ...(content.match(/\"@admin\\//g) ?? []),\n ...(content.match(new RegExp(`\"${namespace.alias}/`, 'g')) ?? [])\n ]\n if (aliasMatches && aliasMatches.length > 0) {\n const aliasCount = aliasMatches.length\n steps.push({\n label: 'tsconfig.json path aliases',\n items: [`${namespace.alias}/* aliases in tsconfig.json`],\n count: aliasCount,\n unit: aliasCount === 1 ? 'alias' : 'aliases',\n execute() {\n cleanTsconfig(tsconfigPath, namespace.alias)\n }\n })\n }\n }\n\n // Step 4: CSS @source lines\n const cssFile = findMainCss(cwd)\n if (cssFile) {\n const cssContent = fs.readFileSync(cssFile, 'utf-8')\n const sourceLines = cssContent\n .split('\\n')\n .filter((l) =>\n new RegExp(`^@source\\\\s+\"[^\"]*(?:admin|${namespace.segment})[^\"]*\";\\\\s*$`).test(l)\n )\n if (sourceLines.length > 0) {\n const relCss = path.relative(cwd, cssFile)\n steps.push({\n label: `CSS @source lines (${relCss})`,\n items: [`@source lines in ${relCss}`],\n count: sourceLines.length,\n unit: sourceLines.length === 1 ? 'line' : 'lines',\n execute() {\n cleanCss(cssFile, namespace.segment)\n }\n })\n }\n }\n\n // Step 5: .env.local BETTERSTART_* vars\n const envPath = path.join(cwd, '.env.local')\n if (fs.existsSync(envPath)) {\n const envContent = fs.readFileSync(envPath, 'utf-8')\n const bsVars = envContent\n .split('\\n')\n .filter((l) => l.trim().match(/^BETTERSTART_\\w+=/))\n .map((l) => l.split('=')[0]!)\n if (bsVars.length > 0) {\n steps.push({\n label: '.env.local variables',\n items: ['BETTERSTART_* vars in .env.local'],\n count: bsVars.length,\n unit: bsVars.length === 1 ? 'variable' : 'variables',\n execute() {\n cleanEnvFile(envPath)\n }\n })\n }\n }\n\n return steps\n}\n\nexport async function runUninstallCommand(options: UninstallCommandOptions): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n\n p.intro(pc.bgRed(pc.white(' BetterStart Uninstall ')))\n\n // Build the plan\n let namespace = DEFAULT_ADMIN_NAMESPACE\n try {\n const config = await resolveConfig(cwd)\n namespace = config.frameworkConfig.next.namespace\n } catch {\n // Fall back to the default namespace when config is already gone or broken.\n }\n const steps = buildUninstallPlan(cwd, namespace)\n\n if (steps.length === 0) {\n p.log.success(`${pc.green('✓')} Nothing to remove — project is already clean.`)\n p.outro('Done')\n return\n }\n\n // Show plan as a formatted note box\n const planLines = steps.map((step) => {\n const names = step.items.join(' ')\n const countLabel = pc.dim(`${step.count} ${step.unit}`)\n return `${pc.red('×')} ${names} ${countLabel}`\n })\n p.note(planLines.join('\\n'), 'Uninstall plan')\n\n // Single confirmation for everything\n if (!options.force) {\n const confirmed = await p.confirm({\n message: 'Proceed with uninstall?',\n initialValue: false\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Uninstall cancelled.')\n process.exit(0)\n }\n }\n\n // Execute all steps with a single spinner\n const s = p.spinner()\n s.start(steps[0]!.label)\n for (const step of steps) {\n s.message(step.label)\n step.execute()\n }\n const parts = steps.map((step) => `${step.count} ${step.unit}`)\n s.stop(`Removed ${parts.join(', ')}`)\n\n p.note(pc.dim('Database tables were NOT dropped — drop them manually if needed.'), 'Next steps')\n\n p.outro('Uninstall complete')\n}\n","/**\n * Cleaner functions for `betterstart uninstall`.\n * Each function modifies a single file type and returns what was removed.\n */\n\nimport fs from 'node:fs'\n\n// ============================================================================\n// JSON Comment Stripper (shared with tsconfig scaffolder)\n// ============================================================================\n\nfunction stripJsonComments(input: string): string {\n let result = ''\n let i = 0\n while (i < input.length) {\n if (input[i] === '\"') {\n let j = i + 1\n while (j < input.length) {\n if (input[j] === '\\\\') {\n j += 2\n continue\n }\n if (input[j] === '\"') {\n j++\n break\n }\n j++\n }\n result += input.slice(i, j)\n i = j\n } else if (input[i] === '/' && input[i + 1] === '/') {\n const nl = input.indexOf('\\n', i)\n i = nl === -1 ? input.length : nl\n } else if (input[i] === '/' && input[i + 1] === '*') {\n const end = input.indexOf('*/', i + 2)\n i = end === -1 ? input.length : end + 2\n } else {\n result += input[i]\n i++\n }\n }\n return result\n}\n\n// ============================================================================\n// cleanTsconfig\n// ============================================================================\n\n/**\n * Remove all `@admin/*` path aliases from tsconfig.json.\n * Returns the list of removed alias keys.\n */\nexport function cleanTsconfig(tsconfigPath: string, aliasRoot = '@admin'): string[] {\n if (!fs.existsSync(tsconfigPath)) return []\n\n const raw = fs.readFileSync(tsconfigPath, 'utf-8')\n const stripped = stripJsonComments(raw).replace(/,\\s*([\\]}])/g, '$1')\n\n let tsconfig: Record<string, unknown>\n try {\n tsconfig = JSON.parse(stripped)\n } catch {\n return []\n }\n\n const compilerOptions = (tsconfig.compilerOptions ?? {}) as Record<string, unknown>\n const paths = (compilerOptions.paths ?? {}) as Record<string, string[]>\n\n const removed: string[] = []\n for (const key of Object.keys(paths)) {\n if (\n key.startsWith('@admin/') ||\n key === '@admin/*' ||\n key.startsWith(`${aliasRoot}/`) ||\n key === `${aliasRoot}/*`\n ) {\n removed.push(key)\n delete paths[key]\n }\n }\n\n if (removed.length === 0) return []\n\n if (Object.keys(paths).length === 0) {\n compilerOptions.paths = undefined\n } else {\n compilerOptions.paths = paths\n }\n tsconfig.compilerOptions = compilerOptions\n\n fs.writeFileSync(tsconfigPath, `${JSON.stringify(tsconfig, null, 2)}\\n`, 'utf-8')\n return removed\n}\n\n// ============================================================================\n// cleanCss\n// ============================================================================\n\n/**\n * Remove @source lines containing \"admin\" from a CSS file.\n * Returns the removed lines.\n */\nexport function cleanCss(cssPath: string, namespace = 'admin'): string[] {\n if (!fs.existsSync(cssPath)) return []\n\n const content = fs.readFileSync(cssPath, 'utf-8')\n const lines = content.split('\\n')\n\n const sourcePattern = new RegExp(`^@source\\\\s+\"[^\"]*(?:admin|${namespace})[^\"]*\";\\\\s*$`)\n const removed: string[] = []\n const kept: string[] = []\n\n for (const line of lines) {\n if (sourcePattern.test(line)) {\n removed.push(line.trim())\n } else {\n kept.push(line)\n }\n }\n\n if (removed.length === 0) return []\n\n // Clean up resulting double blank lines\n const cleaned = kept.join('\\n').replace(/\\n{3,}/g, '\\n\\n')\n fs.writeFileSync(cssPath, cleaned, 'utf-8')\n return removed\n}\n\n// ============================================================================\n// cleanEnvFile\n// ============================================================================\n\n/**\n * Remove BETTERSTART_* vars and the BetterStart header block from .env.local.\n * Returns the removed variable names.\n */\nexport function cleanEnvFile(envPath: string): string[] {\n if (!fs.existsSync(envPath)) return []\n\n const content = fs.readFileSync(envPath, 'utf-8')\n const lines = content.split('\\n')\n const removed: string[] = []\n const kept: string[] = []\n\n // Track header block lines to remove\n const headerPattern = /^# =+$/\n const headerTextPattern = /^# BetterStart Admin$/\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!\n const trimmed = line.trim()\n\n // Remove BETTERSTART_* variable lines\n if (trimmed.match(/^BETTERSTART_\\w+=/)) {\n const key = trimmed.split('=')[0]!\n removed.push(key)\n continue\n }\n\n // Remove header block: # ====... / # BetterStart Admin / # ====...\n if (headerPattern.test(trimmed)) {\n const next = lines[i + 1]?.trim()\n const afterNext = lines[i + 2]?.trim()\n if (next && headerTextPattern.test(next) && afterNext && headerPattern.test(afterNext)) {\n i += 2 // skip all 3 header lines\n continue\n }\n }\n\n // Remove section comment headers that only precede BETTERSTART_ vars\n // e.g., \"# Authentication\" followed by BETTERSTART_AUTH_SECRET\n if (trimmed.startsWith('#') && !headerPattern.test(trimmed)) {\n const nextNonEmpty = findNextNonEmptyLine(lines, i + 1)\n if (nextNonEmpty?.match(/^BETTERSTART_\\w+=/)) {\n continue // skip this comment header\n }\n }\n\n kept.push(line)\n }\n\n if (removed.length === 0) return []\n\n // Clean up multiple blank lines\n const result = kept\n .join('\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim()\n\n if (result === '') {\n // File is now empty — delete it\n fs.unlinkSync(envPath)\n } else {\n fs.writeFileSync(envPath, `${result}\\n`, 'utf-8')\n }\n\n return removed\n}\n\nfunction findNextNonEmptyLine(lines: string[], startIndex: number): string | null {\n for (let i = startIndex; i < lines.length; i++) {\n const trimmed = lines[i]!.trim()\n if (trimmed !== '') return trimmed\n }\n return null\n}\n\n// ============================================================================\n// cleanPackageJsonDeps\n// ============================================================================\n\n/**\n * Remove Admin dependencies from package.json.\n * Returns the removed dep and devDep names.\n */\nexport function cleanPackageJsonDeps(\n pkgPath: string,\n allDeps: string[],\n allDevDeps: string[]\n): { removed: string[]; removedDev: string[] } {\n if (!fs.existsSync(pkgPath)) return { removed: [], removedDev: [] }\n\n const content = fs.readFileSync(pkgPath, 'utf-8')\n let pkg: Record<string, unknown>\n try {\n pkg = JSON.parse(content)\n } catch {\n return { removed: [], removedDev: [] }\n }\n\n const deps = (pkg.dependencies ?? {}) as Record<string, string>\n const devDeps = (pkg.devDependencies ?? {}) as Record<string, string>\n\n // Build lookup set: handle version-pinned names like @types/markdown-it@13 → @types/markdown-it\n const depNames = new Set(\n allDeps.map((d) =>\n d\n .split('@')\n .slice(0, d.startsWith('@') ? 2 : 1)\n .join('@')\n )\n )\n const devDepNames = new Set(\n allDevDeps.map((d) =>\n d\n .split('@')\n .slice(0, d.startsWith('@') ? 2 : 1)\n .join('@')\n )\n )\n\n const removed: string[] = []\n for (const name of Object.keys(deps)) {\n if (depNames.has(name)) {\n delete deps[name]\n removed.push(name)\n }\n }\n\n const removedDev: string[] = []\n for (const name of Object.keys(devDeps)) {\n if (devDepNames.has(name)) {\n delete devDeps[name]\n removedDev.push(name)\n }\n }\n\n if (removed.length === 0 && removedDev.length === 0) {\n return { removed: [], removedDev: [] }\n }\n\n pkg.dependencies = deps\n pkg.devDependencies = devDeps\n fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf-8')\n\n return { removed, removedDev }\n}\n","/**\n * update-component command — update individual Admin components from the latest CLI templates\n */\n\nimport { execFileSync } from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport * as clack from '@clack/prompts'\nimport type { UpdateCommandOptions } from '@core-engine/commands/runtime.js'\nimport type { ResolvedBetterstartConfig } from '@core-engine/config/types.js'\nimport { resolveCliAssetPath } from '@core-engine/utils/cli-root.js'\nimport type { BetterstartIntegrationId } from '@integration-engine/types.js'\nimport { detectProjectName } from '@next-adapter/config/detect.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath,\n resolveAdminNamespace\n} from '@next-adapter/config/namespace.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport { adminDataTemplate } from '@next-adapter/init/templates/app/admin.js'\nimport {\n renderCoreEmailProvider,\n renderCoreEmailProviderIndex,\n renderCoreStorageProvider,\n renderCoreStorageProviderIndex,\n syncInstalledIntegrationManifests\n} from '@next-adapter/integration-runtime.js'\nimport { readIntegrationTemplate } from '@next-adapter/integration-template-reader.js'\nimport { syncInstalledPluginManifests } from '@next-adapter/plugin-runtime.js'\nimport { applyNextCacheApiForVersion, readTemplate } from '@next-adapter/template-reader.js'\nimport type { BetterstartPluginId } from '@plugin-engine/types.js'\nimport fsExtra from 'fs-extra'\n\ninterface TemplateEntry {\n relPath: string | ((context: TemplateContentContext) => string)\n displayPath?: string\n content: (context: TemplateContentContext) => string\n base?: 'cwd'\n requiredPlugin?: BetterstartPluginId\n requiredIntegration?: BetterstartIntegrationId\n dependencies?: string[]\n preserveExisting?: boolean\n}\n\ninterface TemplateContentContext {\n config: ResolvedBetterstartConfig\n cwd: string\n}\n\ninterface StaticAssetComponent {\n name: string\n file: string\n}\n\nconst STATIC_CUSTOM_DEPENDENCIES: Record<string, string[]> = {\n 'content-editor': [\n 'admin-globals',\n 'content-editor/main-toolbar-content',\n 'content-editor-utils',\n 'content-editor-rich-extensions',\n 'content-editor-editor-view-utils',\n 'markdown-utils',\n 'media-gallery-field',\n 'use-content-editor',\n 'use-content-editor-table-add-controls',\n 'use-content-editor-source-mode',\n 'use-content-editor-mobile-toolbar',\n 'use-content-editor-slash-menu',\n 'use-admin-theme',\n 'use-mobile',\n 'tiptap',\n 'tiptap-utils'\n ],\n 'content-editor/tiptap-ui/blockquote-button/blockquote-button': ['use-blockquote'],\n 'content-editor/tiptap-ui/code-block-button/code-block-button': ['use-code-block'],\n 'content-editor/tiptap-ui/color-highlight-button/color-highlight-button': ['use-color-highlight'],\n 'content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover': [\n 'content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-button',\n 'content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content',\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-colors',\n 'content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover',\n 'use-color-highlight'\n ],\n 'content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content': [\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-color-button',\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-colors',\n 'content-editor/use-menu-navigation',\n 'use-color-highlight'\n ],\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-color-button': [\n 'content-editor/tiptap-ui/color-highlight-button/color-highlight-button',\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-colors'\n ],\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-colors': ['use-color-highlight'],\n 'content-editor/tiptap-ui/color-highlight-popover/source-color-highlight-popover': [\n 'content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-button',\n 'content-editor/tiptap-ui/color-highlight-popover/color-highlight-popover-content',\n 'content-editor/tiptap-ui/color-highlight-popover/highlight-colors'\n ],\n 'content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu': [\n 'content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item',\n 'use-heading',\n 'use-heading-dropdown-menu'\n ],\n 'content-editor/tiptap-ui/heading-dropdown-menu/heading-dropdown-menu-item': ['use-heading'],\n 'content-editor/tiptap-ui/link-popover/link-content': [\n 'content-editor/tiptap-ui/link-popover/link-main',\n 'use-link-popover'\n ],\n 'content-editor/tiptap-ui/link-popover/link-control-popover': [\n 'content-editor/tiptap-ui/link-popover/link-button',\n 'content-editor/tiptap-ui/link-popover/link-main'\n ],\n 'content-editor/tiptap-ui/link-popover/link-popover': [\n 'content-editor/tiptap-ui/link-popover/link-content',\n 'content-editor/tiptap-ui/link-popover/link-control-popover',\n 'use-link-popover'\n ],\n 'content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu': [\n 'content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item',\n 'use-list',\n 'use-list-dropdown-menu'\n ],\n 'content-editor/tiptap-ui/list-dropdown-menu/list-dropdown-menu-item': ['use-list'],\n 'content-editor/tiptap-ui/mark-button/mark-button': ['use-mark'],\n 'content-editor/tiptap-ui/undo-redo-button/undo-redo-button': ['use-undo-redo'],\n 'content-editor/main-toolbar-content': [\n 'content-editor',\n 'content-editor/math-popover',\n 'use-content-editor-media-insertion'\n ],\n 'content-editor/math-popover': [\n 'content-editor/math-bubble-menu',\n 'content-editor/math-button',\n 'content-editor/math-editor-controls',\n 'content-editor/math-popover-button',\n 'content-editor/use-tiptap-editor',\n 'markdown-utils',\n 'tiptap-utils'\n ],\n 'content-editor/math-bubble-menu': [\n 'content-editor/math-editor-controls',\n 'content-editor/use-tiptap-editor',\n 'markdown-utils',\n 'tiptap-utils'\n ],\n 'content-editor/math-popover-button': [\n 'content-editor/math-button',\n 'content-editor/math-editor-controls',\n 'content-editor/use-tiptap-editor',\n 'tiptap-utils'\n ],\n 'content-editor/media-gallery-block': ['media-gallery-field'],\n 'content-editor/mobile-toolbar-content': [\n 'content-editor/math-popover',\n 'content-editor/use-tiptap-editor',\n 'tiptap-utils'\n ],\n 'content-editor/selection-bubble-menu': ['content-editor/math-popover'],\n 'content-editor/slash-command-menu': ['content-editor-slash-commands-utils', 'tiptap-utils'],\n 'content-editor/source-mode': [\n 'content-editor/math-popover',\n 'use-content-editor-source-mode',\n 'tiptap'\n ],\n 'content-editor/table-bubble-menu': [\n 'content-editor-table-bubble-utils',\n 'content-editor/remove-table-part-icon',\n 'tiptap-utils'\n ],\n 'content-editor/table-button': ['content-editor-table-input-utils', 'tiptap-utils'],\n 'date-range-picker': ['date-utils'],\n 'gallery-field': [\n 'gallery-thumbnail',\n 'media-gallery-dialog',\n 'sortable-gallery-item',\n 'use-media'\n ],\n 'icon-picker': ['icons-column-skeleton', 'icons-data'],\n 'sortable-gallery-item': ['gallery-thumbnail'],\n 'media-gallery-field': [\n 'media-gallery-dialog',\n 'media-preview',\n 'media-fallback-utils',\n 'use-copy-to-clipboard',\n 'use-media'\n ],\n 'progressive-blur': ['use-page-boundary-blur-visibility'],\n 'upload-dropzone': ['upload-utils']\n}\n\nconst TIPTAP_TEMPLATE_DEPENDENCIES = [\n 'use-blockquote',\n 'use-code-block',\n 'use-color-highlight',\n 'content-editor/use-is-breakpoint',\n 'content-editor/use-menu-navigation',\n 'content-editor/use-tiptap-editor',\n 'use-content-editor-table-add-controls',\n 'content-editor-editor-view-utils',\n 'use-heading',\n 'use-heading-dropdown-menu',\n 'use-link-popover',\n 'use-list',\n 'use-list-dropdown-menu',\n 'use-mark',\n 'use-undo-redo',\n 'content-editor-node-attrs-utils',\n 'content-editor-slash-commands-utils',\n 'content-editor-table-add-controls-utils',\n 'content-editor-table-bubble-utils',\n 'content-editor-table-input-utils',\n 'content-editor-task-item-utils',\n 'content-editor-source-media-utils',\n 'content-editor/main-toolbar-content',\n 'content-editor/source-mode',\n 'tiptap-utils',\n 'content-editor/media-gallery-block',\n 'media-gallery-field'\n]\n\nconst TIPTAP_CONTENT_EDITOR_DIRECTORIES = ['tiptap-extension', 'tiptap-node', 'tiptap-ui']\n\nconst CODEMIRROR_PACKAGE_DEPS = [\n '@codemirror/commands',\n '@codemirror/lang-javascript',\n '@codemirror/lang-json',\n '@codemirror/lang-markdown',\n '@codemirror/view',\n '@uiw/codemirror-theme-github',\n '@uiw/react-codemirror'\n]\n\nconst TIPTAP_PACKAGE_DEPS = [\n '@tiptap/core',\n '@tiptap/extension-underline',\n '@tiptap/extension-highlight',\n '@tiptap/extension-horizontal-rule',\n '@tiptap/extension-image',\n '@tiptap/extension-list',\n '@tiptap/extension-placeholder',\n '@tiptap/extension-table',\n '@tiptap/extension-table-cell',\n '@tiptap/extension-table-header',\n '@tiptap/extension-table-row',\n '@tiptap/extension-typography',\n '@tiptap/extensions',\n '@tiptap/markdown',\n '@tiptap/pm',\n '@tiptap/react',\n '@tiptap/starter-kit'\n]\n\nconst KATEX_PACKAGE_DEPS = ['katex']\n\nconst TAILWIND_TYPOGRAPHY_PACKAGE_DEPS = ['@tailwindcss/typography']\n\nconst COMPONENT_PACKAGE_DEPENDENCIES: Record<string, string[]> = {\n 'admin-globals': [...TAILWIND_TYPOGRAPHY_PACKAGE_DEPS, ...KATEX_PACKAGE_DEPS],\n 'content-editor': [\n ...TIPTAP_PACKAGE_DEPS,\n ...CODEMIRROR_PACKAGE_DEPS,\n ...TAILWIND_TYPOGRAPHY_PACKAGE_DEPS,\n ...KATEX_PACKAGE_DEPS\n ],\n 'content-editor-rich-extensions': KATEX_PACKAGE_DEPS,\n 'use-content-editor': [\n ...TIPTAP_PACKAGE_DEPS,\n ...TAILWIND_TYPOGRAPHY_PACKAGE_DEPS,\n ...KATEX_PACKAGE_DEPS\n ],\n 'use-content-editor-media-insertion': ['react-hotkeys-hook'],\n 'use-color-highlight': ['react-hotkeys-hook'],\n 'dev-mode-integrate': CODEMIRROR_PACKAGE_DEPS,\n 'dev-mode-code-mirror': CODEMIRROR_PACKAGE_DEPS,\n 'use-content-editor-table-add-controls': ['@tiptap/pm', '@tiptap/react'],\n 'use-content-editor-source-mode': CODEMIRROR_PACKAGE_DEPS,\n 'content-editor/use-menu-navigation': ['@tiptap/react'],\n 'content-editor/use-tiptap-editor': ['@tiptap/react'],\n tiptap: TIPTAP_PACKAGE_DEPS,\n 'upload-dropzone': ['react-dropzone']\n}\n\nfunction applyNamespaceToTemplateEntry(\n entry: TemplateEntry,\n config: ResolvedBetterstartConfig,\n cwd: string\n) {\n const namespace = config.frameworkConfig.next.namespace\n const context = { config, cwd }\n const relPath = typeof entry.relPath === 'function' ? entry.relPath(context) : entry.relPath\n\n return {\n relPath: applyAdminNamespaceToPath(relPath, namespace),\n content: applyAdminNamespaceToContent(\n applyNextCacheApiForVersion(entry.content(context), config.nextMajorVersion),\n namespace\n )\n }\n}\n\nfunction writeNamespacedFile(srcPath: string, destPath: string, namespace: string): void {\n fs.writeFileSync(\n destPath,\n applyAdminNamespaceToContent(fs.readFileSync(srcPath, 'utf-8'), namespace),\n 'utf-8'\n )\n}\n\nfunction copyNamespacedDirectory(srcDir: string, destDir: string, namespace: string): void {\n const entries = fs.readdirSync(srcDir, { withFileTypes: true })\n\n for (const entry of entries) {\n const namespacedName = applyAdminNamespaceToPath(entry.name, namespace)\n const srcPath = path.join(srcDir, entry.name)\n const destPath = path.join(destDir, namespacedName)\n\n if (entry.isDirectory()) {\n fsExtra.ensureDirSync(destPath)\n copyNamespacedDirectory(srcPath, destPath, namespace)\n continue\n }\n\n fsExtra.ensureDirSync(path.dirname(destPath))\n writeNamespacedFile(srcPath, destPath, namespace)\n }\n}\n\ninterface FileSnapshot {\n existed: boolean\n content?: string\n}\n\ninterface ProjectPackageJson {\n dependencies?: Record<string, string>\n devDependencies?: Record<string, string>\n optionalDependencies?: Record<string, string>\n}\n\ninterface AdminShadcnComponentsJson {\n $schema: string\n style: string\n rsc: boolean\n tsx: boolean\n tailwind: {\n config: string\n css: string\n baseColor: string\n cssVariables: boolean\n prefix: string\n }\n iconLibrary: string\n aliases: {\n components: string\n ui: string\n hooks: string\n lib: string\n utils: string\n }\n}\n\nfunction hasPlugin(config: ResolvedBetterstartConfig, pluginId: string): boolean {\n return config.plugins.installed.includes(pluginId)\n}\n\nfunction hasIntegration(config: ResolvedBetterstartConfig, integrationId: string): boolean {\n return config.integrations.installed.includes(integrationId)\n}\n\nfunction readProjectPackageJson(cwd: string): ProjectPackageJson | null {\n const pkgPath = path.join(cwd, 'package.json')\n if (!fs.existsSync(pkgPath)) return null\n\n try {\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as ProjectPackageJson\n } catch {\n return null\n }\n}\n\nfunction hasDeclaredPackage(pkg: ProjectPackageJson | null, name: string): boolean {\n if (!pkg) return false\n return (\n Object.hasOwn(pkg.dependencies ?? {}, name) ||\n Object.hasOwn(pkg.devDependencies ?? {}, name) ||\n Object.hasOwn(pkg.optionalDependencies ?? {}, name)\n )\n}\n\n/**\n * Template-function components (layout, shared, hooks, utils, etc.)\n * Key = component name used on CLI, value = { relative path in admin/, content generator }\n */\nconst TEMPLATE_REGISTRY: Record<string, TemplateEntry> = {\n // CSS\n 'admin-globals': {\n relPath: 'admin-globals.css',\n content: () => readTemplate('admin-globals.css')\n },\n // Layout\n 'admin-providers': {\n relPath: 'components/layouts/admin-providers.tsx',\n content: () => readTemplate('components/layouts/admin-providers.tsx')\n },\n 'admin-nav-link': {\n relPath: 'components/layouts/admin-nav-link.tsx',\n content: () => readTemplate('components/layouts/admin-nav-link.tsx')\n },\n 'admin-sidebar': {\n relPath: 'components/layouts/admin-sidebar.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar.tsx'),\n dependencies: [\n 'admin-sidebar-branding-rsc',\n 'admin-sidebar-branding-skeleton',\n 'admin-sidebar-nav-link',\n 'admin-sidebar-user-menu',\n 'admin-sidebar-user-menu-skeleton',\n 'sidebar-utils'\n ]\n },\n 'admin-sidebar-branding-rsc': {\n relPath: 'components/layouts/admin-sidebar-branding-rsc.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar-branding-rsc.tsx'),\n dependencies: ['sidebar-branding']\n },\n 'admin-sidebar-branding-skeleton': {\n relPath: 'components/layouts/admin-sidebar-branding-skeleton.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar-branding-skeleton.tsx')\n },\n 'admin-sidebar-nav-link': {\n relPath: 'components/layouts/admin-sidebar-nav-link.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar-nav-link.tsx'),\n dependencies: ['admin-nav-link', 'admin-sidebar-nav-link-skeleton']\n },\n 'admin-sidebar-nav-link-skeleton': {\n relPath: 'components/layouts/admin-sidebar-nav-link-skeleton.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar-nav-link-skeleton.tsx')\n },\n 'admin-sidebar-user-menu': {\n relPath: 'components/layouts/admin-sidebar-user-menu.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar-user-menu.tsx'),\n dependencies: ['admin-sign-out']\n },\n 'admin-sidebar-user-menu-skeleton': {\n relPath: 'components/layouts/admin-sidebar-user-menu-skeleton.tsx',\n content: () => readTemplate('components/layouts/admin-sidebar-user-menu-skeleton.tsx')\n },\n 'sidebar-branding': {\n relPath: 'components/layouts/sidebar-branding.tsx',\n content: () => readTemplate('components/layouts/sidebar-branding.tsx'),\n dependencies: ['app-admin', 'admin-sidebar-branding-skeleton']\n },\n 'admin-header': {\n relPath: 'components/layouts/admin-header.tsx',\n content: () => readTemplate('components/layouts/admin-header.tsx')\n },\n 'admin-sign-out': {\n relPath: 'components/layouts/admin-sign-out.tsx',\n content: () => readTemplate('components/layouts/admin-sign-out.tsx')\n },\n 'content-skeleton': {\n relPath: 'components/layouts/content-skeleton.tsx',\n content: () => readTemplate('components/layouts/content-skeleton.tsx')\n },\n // Shared\n 'page-header': {\n relPath: 'components/shared/page-header.tsx',\n content: () => readTemplate('components/shared/page-header.tsx')\n },\n 'sort-indicator': {\n relPath: 'components/shared/sort-indicator.tsx',\n content: () => readTemplate('components/shared/sort-indicator.tsx')\n },\n 'dev-mode-integrate': {\n relPath: 'components/shared/dev-mode-integrate.tsx',\n content: () => readTemplate('components/shared/dev-mode-integrate.tsx'),\n dependencies: [\n 'dev-mode-copyable-code-block',\n 'dev-mode-lifecycle-hooks-tab',\n 'dev-mode-snippets-tab',\n 'dev-mode-types',\n 'use-dev-mode-integration'\n ]\n },\n 'dev-mode-copyable-code-block': {\n relPath: 'components/shared/dev-mode/copyable-code-block.tsx',\n content: () => readTemplate('components/shared/dev-mode/copyable-code-block.tsx'),\n dependencies: [\n 'dev-mode-code-mirror',\n 'dev-mode-plain-code-fallback',\n 'dev-mode-types',\n 'tabs',\n 'use-copy-to-clipboard',\n 'use-admin-theme'\n ]\n },\n 'dev-mode-code-mirror': {\n relPath: 'components/shared/dev-mode/dev-mode-code-mirror.tsx',\n content: () => readTemplate('components/shared/dev-mode/dev-mode-code-mirror.tsx'),\n dependencies: ['dev-mode-types']\n },\n 'dev-mode-types': {\n relPath: 'components/shared/dev-mode/dev-mode-types.ts',\n content: () => readTemplate('components/shared/dev-mode/dev-mode-types.ts')\n },\n 'dev-mode-plain-code-fallback': {\n relPath: 'components/shared/dev-mode/plain-code-fallback.tsx',\n content: () => readTemplate('components/shared/dev-mode/plain-code-fallback.tsx')\n },\n 'dev-mode-lifecycle-hooks-tab': {\n relPath: 'components/shared/dev-mode/lifecycle-hooks-tab.tsx',\n content: () => readTemplate('components/shared/dev-mode/lifecycle-hooks-tab.tsx'),\n dependencies: [\n 'accordion',\n 'badge',\n 'dev-mode-code-block-height-utils',\n 'dev-mode-copyable-code-block',\n 'dev-mode-types'\n ]\n },\n 'dev-mode-snippets-tab': {\n relPath: 'components/shared/dev-mode/snippets-tab.tsx',\n content: () => readTemplate('components/shared/dev-mode/snippets-tab.tsx'),\n dependencies: [\n 'accordion',\n 'badge',\n 'dev-mode-code-block-height-utils',\n 'dev-mode-copyable-code-block',\n 'dev-mode-types'\n ]\n },\n 'delete-dialog': {\n relPath: 'components/shared/delete-dialog.tsx',\n content: () => readTemplate('components/shared/delete-dialog.tsx')\n },\n 'entity-metadata': {\n relPath: 'components/shared/entity-metadata.tsx',\n content: () => readTemplate('components/shared/entity-metadata.tsx'),\n dependencies: ['entity-versions-button']\n },\n 'entity-versions-button': {\n relPath: 'components/shared/entity-versions/entity-versions-button.tsx',\n content: () => readTemplate('components/shared/entity-versions/entity-versions-button.tsx'),\n dependencies: ['button', 'entity-versions-drawer', 'use-entity-versions']\n },\n 'entity-versions-drawer': {\n relPath: 'components/shared/entity-versions/entity-versions-drawer.tsx',\n content: () => readTemplate('components/shared/entity-versions/entity-versions-drawer.tsx'),\n dependencies: ['drawer', 'entity-versions-current-row', 'entity-version-item', 'scroll-area']\n },\n 'entity-versions-current-row': {\n relPath: 'components/shared/entity-versions/entity-versions-current-row.tsx',\n content: () =>\n readTemplate('components/shared/entity-versions/entity-versions-current-row.tsx'),\n dependencies: ['avatar', 'badge', 'tooltip', 'user-utils']\n },\n 'entity-version-item': {\n relPath: 'components/shared/entity-versions/entity-version-item.tsx',\n content: () => readTemplate('components/shared/entity-versions/entity-version-item.tsx'),\n dependencies: ['avatar', 'badge', 'entity-version-restore-dialog', 'tooltip', 'user-utils']\n },\n 'entity-version-restore-dialog': {\n relPath: 'components/shared/entity-versions/entity-version-restore-dialog.tsx',\n content: () =>\n readTemplate('components/shared/entity-versions/entity-version-restore-dialog.tsx'),\n dependencies: ['alert-dialog', 'button']\n },\n 'entity-filters-bar': {\n relPath: 'components/shared/entity-filters-bar.tsx',\n content: () => readTemplate('components/shared/entity-filters-bar.tsx'),\n dependencies: ['use-page-scroll-threshold']\n },\n 'search-input': {\n relPath: 'components/shared/search-input.tsx',\n content: () => readTemplate('components/shared/search-input.tsx')\n },\n 'sort-order-dialog': {\n relPath: 'components/shared/sort-order-dialog.tsx',\n content: () => readTemplate('components/shared/sort-order-dialog.tsx'),\n dependencies: ['sort-order-drag-overlay-item', 'sort-order-item', 'sort-order-types']\n },\n 'sort-order-drag-overlay-item': {\n relPath: 'components/shared/sort-order-drag-overlay-item.tsx',\n content: () => readTemplate('components/shared/sort-order-drag-overlay-item.tsx')\n },\n 'sort-order-item': {\n relPath: 'components/shared/sort-order-item.tsx',\n content: () => readTemplate('components/shared/sort-order-item.tsx'),\n dependencies: ['sort-order-types']\n },\n 'sort-order-types': {\n relPath: 'components/shared/sort-order-types.ts',\n content: () => readTemplate('components/shared/sort-order-types.ts')\n },\n // Media\n 'media-preview': {\n relPath: 'components/shared/media/media-preview.tsx',\n content: () => readTemplate('components/shared/media/media-preview.tsx'),\n dependencies: ['use-failed-image-url']\n },\n 'media-grid-item': {\n relPath: 'components/shared/media/media-grid-item.tsx',\n content: () => readTemplate('components/shared/media/media-grid-item.tsx'),\n dependencies: ['media-preview']\n },\n 'media-grid': {\n relPath: 'components/shared/media/media-grid.tsx',\n content: () => readTemplate('components/shared/media/media-grid.tsx'),\n dependencies: ['media-grid-item']\n },\n 'media-grid-pagination': {\n relPath: 'components/shared/media/media-grid-pagination.tsx',\n content: () => readTemplate('components/shared/media/media-grid-pagination.tsx')\n },\n 'media-empty-state': {\n relPath: 'components/shared/media/media-empty-state.tsx',\n content: () => readTemplate('components/shared/media/media-empty-state.tsx')\n },\n 'edit-media-dialog': {\n relPath: 'components/shared/media/edit-media-dialog.tsx',\n content: () => readTemplate('components/shared/media/edit-media-dialog.tsx'),\n dependencies: ['edit-media-dialog-content']\n },\n 'edit-media-dialog-content': {\n relPath: 'components/shared/media/edit-media-dialog-content.tsx',\n content: () => readTemplate('components/shared/media/edit-media-dialog-content.tsx'),\n dependencies: [\n 'media-preview',\n 'media-delete-drawer',\n 'use-failed-image-url',\n 'use-copy-to-clipboard'\n ]\n },\n 'media-delete-drawer': {\n relPath: 'components/shared/media/media-delete-drawer.tsx',\n content: () => readTemplate('components/shared/media/media-delete-drawer.tsx')\n },\n 'media-delete-dialog': {\n relPath: 'components/shared/media/media-delete-dialog.tsx',\n content: () => readTemplate('components/shared/media/media-delete-dialog.tsx')\n },\n 'media-gallery-dialog': {\n relPath: 'components/shared/media/media-gallery-dialog.tsx',\n content: () => readTemplate('components/shared/media/media-gallery-dialog.tsx'),\n dependencies: [\n 'upload-dropzone',\n 'use-upload',\n 'use-media',\n 'media-grid',\n 'media-grid-pagination',\n 'media-url-importer'\n ]\n },\n 'media-filters-bar': {\n relPath: 'components/shared/media/media-filters-bar.tsx',\n content: () => readTemplate('components/shared/media/media-filters-bar.tsx'),\n dependencies: ['use-page-scroll-threshold']\n },\n 'media-url-importer': {\n relPath: 'components/shared/media/media-url-importer.tsx',\n content: () => readTemplate('components/shared/media/media-url-importer.tsx'),\n dependencies: ['media-utils']\n },\n // Data table\n 'data-table': {\n relPath: 'components/shared/data-table/data-table.tsx',\n content: () => readTemplate('components/shared/data-table/data-table.tsx'),\n dependencies: ['use-table-utils', 'data-table-pagination']\n },\n 'data-table-pagination': {\n relPath: 'components/shared/data-table/data-table-pagination.tsx',\n content: () => readTemplate('components/shared/data-table/data-table-pagination.tsx')\n },\n // Hooks\n 'use-upload': {\n relPath: 'hooks/use-upload.ts',\n content: () => readTemplate('hooks/use-upload.ts')\n },\n 'use-content-editor-source-mode': {\n relPath: 'hooks/content-editor/use-content-editor-source-mode.tsx',\n content: () => readTemplate('hooks/content-editor/use-content-editor-source-mode.tsx'),\n dependencies: [\n 'media-gallery-field',\n 'use-admin-theme',\n 'markdown-utils',\n 'content-editor-source-media-utils',\n 'tiptap-utils'\n ]\n },\n 'use-content-editor': {\n relPath: 'hooks/content-editor/use-content-editor.ts',\n content: () => readTemplate('hooks/content-editor/use-content-editor.ts'),\n dependencies: [\n 'admin-globals',\n 'content-editor-utils',\n 'content-editor-rich-extensions',\n 'content-editor-editor-view-utils',\n 'content-editor-table-bubble-utils',\n 'use-content-editor-slash-menu',\n 'use-mobile',\n 'tiptap',\n 'tiptap-utils',\n 'content-editor/media-gallery-block',\n 'media-gallery-field'\n ]\n },\n 'use-content-editor-media-insertion': {\n relPath: 'hooks/content-editor/use-content-editor-media-insertion.ts',\n content: () => readTemplate('hooks/content-editor/use-content-editor-media-insertion.ts'),\n dependencies: [\n 'content-editor/use-is-breakpoint',\n 'content-editor/use-tiptap-editor',\n 'tiptap-utils'\n ]\n },\n 'use-blockquote': {\n relPath: 'hooks/content-editor/use-blockquote.ts',\n content: () => readTemplate('hooks/content-editor/use-blockquote.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-code-block': {\n relPath: 'hooks/content-editor/use-code-block.ts',\n content: () => readTemplate('hooks/content-editor/use-code-block.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-color-highlight': {\n relPath: 'hooks/content-editor/use-color-highlight.ts',\n content: () => readTemplate('hooks/content-editor/use-color-highlight.ts'),\n dependencies: [\n 'content-editor/use-is-breakpoint',\n 'content-editor/use-tiptap-editor',\n 'tiptap-utils'\n ]\n },\n 'use-heading': {\n relPath: 'hooks/content-editor/use-heading.ts',\n content: () => readTemplate('hooks/content-editor/use-heading.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-heading-dropdown-menu': {\n relPath: 'hooks/content-editor/use-heading-dropdown-menu.ts',\n content: () => readTemplate('hooks/content-editor/use-heading-dropdown-menu.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'use-heading']\n },\n 'use-link-popover': {\n relPath: 'hooks/content-editor/use-link-popover.ts',\n content: () => readTemplate('hooks/content-editor/use-link-popover.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-list': {\n relPath: 'hooks/content-editor/use-list.ts',\n content: () => readTemplate('hooks/content-editor/use-list.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-list-dropdown-menu': {\n relPath: 'hooks/content-editor/use-list-dropdown-menu.ts',\n content: () => readTemplate('hooks/content-editor/use-list-dropdown-menu.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'use-list', 'tiptap-utils']\n },\n 'use-mark': {\n relPath: 'hooks/content-editor/use-mark.ts',\n content: () => readTemplate('hooks/content-editor/use-mark.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-undo-redo': {\n relPath: 'hooks/content-editor/use-undo-redo.ts',\n content: () => readTemplate('hooks/content-editor/use-undo-redo.ts'),\n dependencies: ['content-editor/use-tiptap-editor', 'tiptap-utils']\n },\n 'use-content-editor-table-add-controls': {\n relPath: 'hooks/content-editor/use-content-editor-table-add-controls.ts',\n content: () => readTemplate('hooks/content-editor/use-content-editor-table-add-controls.ts'),\n dependencies: ['content-editor-table-add-controls-utils', 'tiptap-utils']\n },\n 'use-content-editor-mobile-toolbar': {\n relPath: 'hooks/content-editor/use-content-editor-mobile-toolbar.ts',\n content: () => readTemplate('hooks/content-editor/use-content-editor-mobile-toolbar.ts'),\n dependencies: ['use-mobile']\n },\n 'use-content-editor-slash-menu': {\n relPath: 'hooks/content-editor/use-content-editor-slash-menu.ts',\n content: () => readTemplate('hooks/content-editor/use-content-editor-slash-menu.ts'),\n dependencies: ['content-editor-slash-commands-utils', 'tiptap-utils']\n },\n 'content-editor/use-is-breakpoint': {\n relPath: 'hooks/content-editor/use-is-breakpoint.ts',\n content: () => readTemplate('hooks/content-editor/use-is-breakpoint.ts')\n },\n 'content-editor/use-menu-navigation': {\n relPath: 'hooks/content-editor/use-menu-navigation.ts',\n content: () => readTemplate('hooks/content-editor/use-menu-navigation.ts')\n },\n 'content-editor/use-tiptap-editor': {\n relPath: 'hooks/content-editor/use-tiptap-editor.ts',\n content: () => readTemplate('hooks/content-editor/use-tiptap-editor.ts')\n },\n 'use-copy-to-clipboard': {\n relPath: 'hooks/use-copy-to-clipboard.ts',\n content: () => readTemplate('hooks/use-copy-to-clipboard.ts')\n },\n 'use-dev-mode-integration': {\n relPath: 'hooks/use-dev-mode-integration.ts',\n content: () => readTemplate('hooks/use-dev-mode-integration.ts')\n },\n 'use-local-storage': {\n relPath: 'hooks/use-local-storage.ts',\n content: () => readTemplate('hooks/use-local-storage.ts')\n },\n 'use-admin-theme': {\n relPath: 'hooks/use-admin-theme.tsx',\n content: () => readTemplate('hooks/use-admin-theme.tsx'),\n dependencies: ['theme-system-utils']\n },\n 'use-users': { relPath: 'hooks/use-users.ts', content: () => readTemplate('hooks/use-users.ts') },\n 'use-mobile': {\n relPath: 'hooks/use-mobile.ts',\n content: () => readTemplate('hooks/use-mobile.ts')\n },\n 'use-failed-image-url': {\n relPath: 'hooks/use-failed-image-url.ts',\n content: () => readTemplate('hooks/use-failed-image-url.ts')\n },\n 'use-entity-versions': {\n relPath: 'hooks/use-entity-versions.ts',\n content: () => readTemplate('hooks/use-entity-versions.ts')\n },\n 'use-media': { relPath: 'hooks/use-media.ts', content: () => readTemplate('hooks/use-media.ts') },\n 'use-media-filters-bar': {\n relPath: 'hooks/use-media-filters-bar.ts',\n content: () => readTemplate('hooks/use-media-filters-bar.ts')\n },\n 'use-table-utils': {\n relPath: 'hooks/use-table-utils.ts',\n content: () => readTemplate('hooks/use-table-utils.ts'),\n dependencies: ['table-utils-core']\n },\n 'use-page-boundary-blur-visibility': {\n relPath: 'hooks/use-page-boundary-blur-visibility.ts',\n content: () => readTemplate('hooks/use-page-boundary-blur-visibility.ts'),\n dependencies: ['page-boundary-utils']\n },\n 'use-page-scroll-threshold': {\n relPath: 'hooks/use-page-scroll-threshold.ts',\n content: () => readTemplate('hooks/use-page-scroll-threshold.ts')\n },\n // Types\n 'types-index': {\n relPath: 'types/index.ts',\n content: () => readTemplate('types/index.ts')\n },\n 'auth-types': {\n relPath: 'types/auth.ts',\n content: () => readTemplate('types/auth.ts')\n },\n 'navigation-types': {\n relPath: 'types/navigation.ts',\n content: () => readTemplate('types/navigation.ts')\n },\n 'table-meta': {\n relPath: 'types/table-meta.ts',\n content: () => readTemplate('types/table-meta.ts')\n },\n // Utils\n 'app-admin': {\n relPath: ({ config }) =>\n `utils/app/${resolveAdminNamespace(config.frameworkConfig.next.namespace).camel}.ts`,\n displayPath: 'utils/app/<namespaceCamel>.ts',\n content: ({ cwd, config }) =>\n adminDataTemplate(detectProjectName(cwd), config.frameworkConfig.next.namespace)\n },\n cn: { relPath: 'utils/shared/cn.ts', content: () => readTemplate('utils/shared/cn.ts') },\n 'auth-roles-utils': {\n relPath: 'utils/auth/roles.ts',\n content: () => readTemplate('utils/auth/roles.ts')\n },\n 'date-utils': {\n relPath: 'utils/date/date.ts',\n content: () => readTemplate('utils/date/date.ts')\n },\n 'markdown-utils': {\n relPath: 'utils/editor/markdown.ts',\n content: () => readTemplate('utils/editor/markdown.ts')\n },\n 'content-editor-utils': {\n relPath: 'utils/editor/content-editor.ts',\n content: () => readTemplate('utils/editor/content-editor.ts')\n },\n 'content-editor-rich-extensions': {\n relPath: 'utils/editor/content-editor-rich-extensions.ts',\n content: () => readTemplate('utils/editor/content-editor-rich-extensions.ts')\n },\n 'content-editor-editor-view-utils': {\n relPath: 'utils/editor/editor-view.ts',\n content: () => readTemplate('utils/editor/editor-view.ts')\n },\n 'content-editor-node-attrs-utils': {\n relPath: 'utils/editor/node-attrs.ts',\n content: () => readTemplate('utils/editor/node-attrs.ts')\n },\n 'content-editor-source-media-utils': {\n relPath: 'utils/editor/source-media.ts',\n content: () => readTemplate('utils/editor/source-media.ts')\n },\n 'content-editor-slash-commands-utils': {\n relPath: 'utils/editor/slash-commands.ts',\n content: () => readTemplate('utils/editor/slash-commands.ts')\n },\n 'content-editor-table-add-controls-utils': {\n relPath: 'utils/editor/table-add-controls.ts',\n content: () => readTemplate('utils/editor/table-add-controls.ts')\n },\n 'content-editor-table-bubble-utils': {\n relPath: 'utils/editor/table-bubble.ts',\n content: () => readTemplate('utils/editor/table-bubble.ts')\n },\n 'content-editor-table-input-utils': {\n relPath: 'utils/editor/table-input.ts',\n content: () => readTemplate('utils/editor/table-input.ts')\n },\n 'content-editor-task-item-utils': {\n relPath: 'utils/editor/task-item.ts',\n content: () => readTemplate('utils/editor/task-item.ts')\n },\n 'email-form-delivery-utils': {\n relPath: 'utils/email/form-delivery.ts',\n content: () => readTemplate('utils/email/form-delivery.ts')\n },\n 'media-fallback-utils': {\n relPath: 'utils/media/fallback.ts',\n content: () => readTemplate('utils/media/fallback.ts')\n },\n 'media-utils': {\n relPath: 'utils/media/media.ts',\n content: () => readTemplate('utils/media/media.ts')\n },\n 'media-query-utils': {\n relPath: 'utils/media/query.ts',\n content: () => readTemplate('utils/media/query.ts')\n },\n 'navigation-order-utils': {\n relPath: 'utils/navigation/order.ts',\n content: () => readTemplate('utils/navigation/order.ts')\n },\n seo: { relPath: 'utils/seo/seo.ts', content: () => readTemplate('utils/seo/seo.ts') },\n 'sidebar-utils': {\n relPath: 'utils/navigation/sidebar.ts',\n content: () => readTemplate('utils/navigation/sidebar.ts')\n },\n 'page-boundary-utils': {\n relPath: 'utils/page/boundary.ts',\n content: () => readTemplate('utils/page/boundary.ts')\n },\n 'storage-local-utils': {\n relPath: 'utils/storage/local.ts',\n content: () => readTemplate('utils/storage/local.ts')\n },\n 'table-utils-core': {\n relPath: 'utils/table/table.ts',\n content: () => readTemplate('utils/table/table.ts')\n },\n 'text-utils': {\n relPath: 'utils/text/text.ts',\n content: () => readTemplate('utils/text/text.ts')\n },\n 'theme-system-utils': {\n relPath: 'utils/theme/system.ts',\n content: () => readTemplate('utils/theme/system.ts')\n },\n 'tiptap-utils': {\n relPath: 'utils/editor/tiptap.ts',\n content: () => readTemplate('utils/editor/tiptap.ts')\n },\n 'upload-remote-utils': {\n relPath: 'utils/upload/remote.ts',\n content: () => readTemplate('utils/upload/remote.ts')\n },\n 'upload-utils': {\n relPath: 'utils/upload/upload.ts',\n content: () => readTemplate('utils/upload/upload.ts')\n },\n 'user-utils': {\n relPath: 'utils/user/user.ts',\n content: () => readTemplate('utils/user/user.ts')\n },\n validation: {\n relPath: 'utils/validation/validation.ts',\n content: () => readTemplate('utils/validation/validation.ts')\n },\n webhook: {\n relPath: 'utils/webhook/webhook.ts',\n content: () => readTemplate('utils/webhook/webhook.ts')\n },\n 'dev-mode-code-block-height-utils': {\n relPath: 'utils/dev-mode/code-block-height.ts',\n content: () => readTemplate('utils/dev-mode/code-block-height.ts')\n },\n 'lifecycle-hooks': {\n relPath: 'lib/lifecycle-hooks/index.ts',\n content: () => readTemplate('lib/lifecycle-hooks/index.ts'),\n dependencies: [\n 'lifecycle-hooks-types',\n 'lifecycle-hooks-registry',\n 'lifecycle-hooks-runner',\n 'lifecycle-hooks-register',\n 'lifecycle-hooks-register-local'\n ]\n },\n 'lifecycle-hooks-types': {\n relPath: 'lib/lifecycle-hooks/types.ts',\n content: () => readTemplate('lib/lifecycle-hooks/types.ts')\n },\n 'lifecycle-hooks-registry': {\n relPath: 'lib/lifecycle-hooks/registry.ts',\n content: () => readTemplate('lib/lifecycle-hooks/registry.ts')\n },\n 'lifecycle-hooks-runner': {\n relPath: 'lib/lifecycle-hooks/runner.ts',\n content: () => readTemplate('lib/lifecycle-hooks/runner.ts')\n },\n 'lifecycle-hooks-register': {\n relPath: 'lib/lifecycle-hooks/register.ts',\n content: () => readTemplate('lib/lifecycle-hooks/register.ts')\n },\n 'lifecycle-hooks-register-local': {\n relPath: 'lib/lifecycle-hooks/register.local.ts',\n content: () => readTemplate('lib/lifecycle-hooks/register.local.ts'),\n preserveExisting: true\n },\n 'mailchimp-integration': {\n relPath: 'lib/actions/mailchimp/add-to-mailchimp-audience.ts',\n requiredIntegration: 'mailchimp',\n content: () => readIntegrationTemplate('mailchimp', 'actions/mailchimp.ts')\n },\n // Auth\n 'auth-server': {\n relPath: 'lib/actions/auth/server.ts',\n content: () => readTemplate('lib/actions/auth/auth.ts')\n },\n 'auth-client': {\n relPath: 'lib/actions/auth/client.ts',\n content: () => readTemplate('lib/actions/auth/client.ts')\n },\n 'auth-session': {\n relPath: 'lib/actions/auth/session.ts',\n content: () => readTemplate('lib/actions/auth/middleware.ts'),\n dependencies: ['auth-roles-utils']\n },\n 'auth-layout': {\n relPath: 'app/(admin)/admin/(authenticated)/layout.tsx',\n content: () => readTemplate('pages/authenticated-layout.tsx'),\n base: 'cwd',\n dependencies: ['auth-gate-rsc']\n },\n 'auth-gate-rsc': {\n relPath: 'app/(admin)/admin/(authenticated)/auth-gate-rsc.tsx',\n content: () => readTemplate('pages/auth-gate-rsc.tsx'),\n base: 'cwd',\n dependencies: ['auth-session']\n },\n 'account-layout': {\n relPath: 'app/(admin)/admin/(account)/layout.tsx',\n content: () => readTemplate('pages/account-layout.tsx'),\n base: 'cwd',\n dependencies: ['account-shell-rsc']\n },\n 'account-shell-rsc': {\n relPath: 'app/(admin)/admin/(account)/account-shell-rsc.tsx',\n content: () => readTemplate('pages/account-shell-rsc.tsx'),\n base: 'cwd',\n dependencies: [\n 'admin-sidebar',\n 'app-admin',\n 'auth-roles-utils',\n 'auth-session',\n 'minimal-account-shell'\n ]\n },\n 'minimal-account-shell': {\n relPath: 'app/(admin)/admin/(account)/minimal-account-shell.tsx',\n content: () => readTemplate('pages/minimal-account-shell.tsx'),\n base: 'cwd',\n dependencies: ['admin-sign-out']\n },\n 'profile-page': {\n relPath: 'app/(admin)/admin/(account)/profile/page.tsx',\n content: () => readTemplate('pages/profile/profile-page.tsx'),\n base: 'cwd'\n },\n 'profile-form': {\n relPath: 'app/(admin)/admin/(account)/profile/profile-form.tsx',\n content: () => readTemplate('pages/profile/profile-form.tsx'),\n base: 'cwd',\n dependencies: ['profile-action']\n },\n // Password reset\n 'login-page': {\n relPath: 'app/(admin)/admin/(auth)/login/page.tsx',\n content: () => readTemplate('pages/login-page.tsx'),\n base: 'cwd',\n dependencies: ['login-page-rsc', 'login-page-skeleton']\n },\n 'login-page-rsc': {\n relPath: 'app/(admin)/admin/(auth)/login/login-page-rsc.tsx',\n content: () => readTemplate('pages/login-page-rsc.tsx'),\n base: 'cwd',\n dependencies: ['auth-roles-utils', 'auth-session', 'login-form']\n },\n 'login-page-skeleton': {\n relPath: 'app/(admin)/admin/(auth)/login/login-page-skeleton.tsx',\n content: () => readTemplate('pages/login-page-skeleton.tsx'),\n base: 'cwd'\n },\n 'login-form': {\n relPath: 'app/(admin)/admin/(auth)/login/login-form.tsx',\n content: () => readTemplate('pages/login-form.tsx'),\n base: 'cwd',\n dependencies: ['auth-roles-utils']\n },\n 'forgot-password-page': {\n relPath: 'app/(admin)/admin/(auth)/forgot-password/page.tsx',\n content: () => readTemplate('pages/forgot-password-page.tsx'),\n base: 'cwd',\n dependencies: ['forgot-password-page-skeleton']\n },\n 'forgot-password-page-skeleton': {\n relPath: 'app/(admin)/admin/(auth)/forgot-password/forgot-password-page-skeleton.tsx',\n content: () => readTemplate('pages/forgot-password-page-skeleton.tsx'),\n base: 'cwd'\n },\n 'forgot-password-form': {\n relPath: 'app/(admin)/admin/(auth)/forgot-password/forgot-password-form.tsx',\n content: () => readTemplate('pages/forgot-password-form.tsx'),\n base: 'cwd'\n },\n 'reset-password-page': {\n relPath: 'app/(admin)/admin/(auth)/reset-password/page.tsx',\n content: () => readTemplate('pages/reset-password-page.tsx'),\n base: 'cwd',\n dependencies: ['reset-password-page-skeleton']\n },\n 'reset-password-page-skeleton': {\n relPath: 'app/(admin)/admin/(auth)/reset-password/reset-password-page-skeleton.tsx',\n content: () => readTemplate('pages/reset-password-page-skeleton.tsx'),\n base: 'cwd'\n },\n 'reset-password-form': {\n relPath: 'app/(admin)/admin/(auth)/reset-password/reset-password-form.tsx',\n content: () => readTemplate('pages/reset-password-form.tsx'),\n base: 'cwd'\n },\n 'users-page': {\n relPath: 'app/(admin)/admin/(authenticated)/users/page.tsx',\n content: () => readTemplate('pages/users/users-page.tsx'),\n base: 'cwd',\n dependencies: ['users-page-skeleton', 'users-page-content']\n },\n 'users-page-skeleton': {\n relPath: 'app/(admin)/admin/(authenticated)/users/users-page-skeleton.tsx',\n content: () => readTemplate('pages/users/users-page-skeleton.tsx'),\n base: 'cwd'\n },\n 'users-page-content': {\n relPath: 'app/(admin)/admin/(authenticated)/users/users-page-content.tsx',\n content: () => readTemplate('pages/users/users-page-content.tsx'),\n base: 'cwd',\n dependencies: ['users-columns', 'users-table', 'create-user-dialog']\n },\n 'users-columns': {\n relPath: 'app/(admin)/admin/(authenticated)/users/columns.tsx',\n content: () => readTemplate('pages/users/columns.tsx'),\n base: 'cwd',\n dependencies: ['user-utils', 'delete-user-dialog', 'edit-role-dialog']\n },\n 'users-table': {\n relPath: 'app/(admin)/admin/(authenticated)/users/users-table.tsx',\n content: () => readTemplate('pages/users/users-table.tsx'),\n base: 'cwd',\n dependencies: ['use-table-utils', 'data-table-pagination']\n },\n 'create-user-dialog': {\n relPath: 'app/(admin)/admin/(authenticated)/users/create-user-dialog.tsx',\n content: () => readTemplate('pages/users/create-user-dialog.tsx'),\n base: 'cwd'\n },\n 'delete-user-dialog': {\n relPath: 'app/(admin)/admin/(authenticated)/users/delete-user-dialog.tsx',\n content: () => readTemplate('pages/users/delete-user-dialog.tsx'),\n base: 'cwd'\n },\n 'edit-role-dialog': {\n relPath: 'app/(admin)/admin/(authenticated)/users/edit-role-dialog.tsx',\n content: () => readTemplate('pages/users/edit-role-dialog.tsx'),\n base: 'cwd'\n },\n // Lib\n 'email-index': {\n relPath: 'lib/actions/email/index.ts',\n content: (context) =>\n context\n ? renderCoreEmailProviderIndex(context.config)\n : readTemplate('lib/actions/email/index.ts')\n },\n 'email-provider': {\n relPath: 'lib/actions/email/provider.ts',\n content: (context) =>\n context\n ? renderCoreEmailProvider(context.config)\n : readTemplate('lib/actions/email/provider.ts')\n },\n 'email-types': {\n relPath: 'lib/actions/email/types.ts',\n content: () => readTemplate('lib/actions/email/types.ts')\n },\n 'email-is-delivery-configured': {\n relPath: 'lib/actions/email/is-email-delivery-configured.ts',\n content: () => readTemplate('lib/actions/email/is-email-delivery-configured.ts')\n },\n 'email-send-email': {\n relPath: 'lib/actions/email/send-email.ts',\n content: () => readTemplate('lib/actions/email/send-email.ts')\n },\n 'email-send-password-reset-email': {\n relPath: 'lib/actions/email/send-password-reset-email.ts',\n content: () => readTemplate('lib/actions/email/send-password-reset-email.ts')\n },\n 'email-form-delivery': {\n relPath: 'lib/actions/email/form-delivery.ts',\n content: () => readTemplate('lib/actions/email/form-delivery.ts'),\n dependencies: ['email-form-delivery-utils']\n },\n 'email-none-provider': {\n relPath: 'lib/actions/email/none.ts',\n content: () => readTemplate('lib/actions/email/none.ts')\n },\n 'email-resend-provider': {\n relPath: 'lib/actions/resend/provider.ts',\n requiredIntegration: 'resend',\n content: () => readIntegrationTemplate('resend', 'actions/resend.ts')\n },\n 'storage-index': {\n relPath: 'lib/actions/storage/index.ts',\n content: (context) =>\n context\n ? renderCoreStorageProviderIndex(context.config)\n : readTemplate('lib/actions/storage/index.ts')\n },\n 'storage-provider': {\n relPath: 'lib/actions/storage/provider.ts',\n content: (context) =>\n context\n ? renderCoreStorageProvider(context.config)\n : readTemplate('lib/actions/storage/provider.ts')\n },\n 'storage-types': {\n relPath: 'lib/actions/storage/types.ts',\n content: () => readTemplate('lib/actions/storage/types.ts')\n },\n 'storage-save-upload': {\n relPath: 'lib/actions/storage/save-upload.ts',\n content: () => readTemplate('lib/actions/storage/save-upload.ts')\n },\n 'storage-local-provider': {\n relPath: 'lib/actions/storage/local.ts',\n content: () => readTemplate('lib/actions/storage/local.ts'),\n dependencies: ['storage-local-utils']\n },\n 'storage-r2-provider': {\n relPath: 'lib/actions/r2/provider.ts',\n requiredIntegration: 'r2',\n content: () => readIntegrationTemplate('r2', 'actions/r2.ts')\n },\n 'form-settings-action': {\n relPath: 'lib/actions/forms/index.ts',\n content: () => readTemplate('lib/actions/forms/index.ts'),\n dependencies: [\n 'form-settings-types',\n 'get-form-settings-action',\n 'upsert-form-settings-action',\n 'get-all-form-settings-action',\n 'test-form-webhook-action'\n ]\n },\n 'form-settings-types': {\n relPath: 'lib/actions/forms/types.ts',\n content: () => readTemplate('lib/actions/forms/types.ts')\n },\n 'get-form-settings-action': {\n relPath: 'lib/actions/forms/get-form-settings.ts',\n content: () => readTemplate('lib/actions/forms/get-form-settings.ts'),\n dependencies: ['form-settings-types']\n },\n 'upsert-form-settings-action': {\n relPath: 'lib/actions/forms/upsert-form-settings.ts',\n content: () => readTemplate('lib/actions/forms/upsert-form-settings.ts'),\n dependencies: ['form-settings-types']\n },\n 'get-all-form-settings-action': {\n relPath: 'lib/actions/forms/get-all-form-settings.ts',\n content: () => readTemplate('lib/actions/forms/get-all-form-settings.ts'),\n dependencies: ['form-settings-types']\n },\n 'test-form-webhook-action': {\n relPath: 'lib/actions/forms/test-form-webhook.ts',\n content: () => readTemplate('lib/actions/forms/test-form-webhook.ts')\n },\n 'entity-versions-action': {\n relPath: 'lib/actions/entity-versions/index.ts',\n content: () => readTemplate('lib/actions/entity-versions/index.ts'),\n dependencies: [\n 'entity-versions-types',\n 'get-entity-versions-action',\n 'internal-create-entity-version-action',\n 'internal-delete-entity-versions-action'\n ]\n },\n 'entity-versions-types': {\n relPath: 'lib/actions/entity-versions/types.ts',\n content: () => readTemplate('lib/actions/entity-versions/types.ts')\n },\n 'get-entity-versions-action': {\n relPath: 'lib/actions/entity-versions/get-entity-versions.ts',\n content: () => readTemplate('lib/actions/entity-versions/get-entity-versions.ts'),\n dependencies: ['entity-versions-types']\n },\n 'internal-create-entity-version-action': {\n relPath: 'lib/actions/entity-versions/internal-create-entity-version.ts',\n content: () => readTemplate('lib/actions/entity-versions/internal-create-entity-version.ts'),\n dependencies: ['entity-versions-types']\n },\n 'internal-delete-entity-versions-action': {\n relPath: 'lib/actions/entity-versions/internal-delete-entity-versions.ts',\n content: () => readTemplate('lib/actions/entity-versions/internal-delete-entity-versions.ts')\n },\n 'upload-action': {\n relPath: 'lib/actions/upload/index.ts',\n content: () => readTemplate('lib/actions/upload/index.ts'),\n dependencies: [\n 'upload-action-types',\n 'upload-remote-utils',\n 'upload-files-action',\n 'upload-file-action',\n 'upload-media-from-url-action',\n 'upload-image-from-url-action'\n ]\n },\n 'upload-action-types': {\n relPath: 'lib/actions/upload/types.ts',\n content: () => readTemplate('lib/actions/upload/types.ts')\n },\n 'upload-files-action': {\n relPath: 'lib/actions/upload/upload-files.ts',\n content: () => readTemplate('lib/actions/upload/upload-files.ts')\n },\n 'upload-file-action': {\n relPath: 'lib/actions/upload/upload-file.ts',\n content: () => readTemplate('lib/actions/upload/upload-file.ts')\n },\n 'upload-media-from-url-action': {\n relPath: 'lib/actions/upload/upload-media-from-url.ts',\n content: () => readTemplate('lib/actions/upload/upload-media-from-url.ts')\n },\n 'upload-image-from-url-action': {\n relPath: 'lib/actions/upload/upload-image-from-url.ts',\n content: () => readTemplate('lib/actions/upload/upload-image-from-url.ts')\n },\n 'users-action': {\n relPath: 'lib/actions/users/index.ts',\n content: () => readTemplate('lib/actions/users/index.ts'),\n dependencies: [\n 'users-action-types',\n 'create-user-action',\n 'get-users-action',\n 'update-user-role-action',\n 'delete-user-action'\n ]\n },\n 'users-action-types': {\n relPath: 'lib/actions/users/types.ts',\n content: () => readTemplate('lib/actions/users/types.ts')\n },\n 'create-user-action': {\n relPath: 'lib/actions/users/create-user.ts',\n content: () => readTemplate('lib/actions/users/create-user.ts'),\n dependencies: ['users-action-types']\n },\n 'get-users-action': {\n relPath: 'lib/actions/users/get-users.ts',\n content: () => readTemplate('lib/actions/users/get-users.ts'),\n dependencies: ['users-action-types']\n },\n 'update-user-role-action': {\n relPath: 'lib/actions/users/update-user-role.ts',\n content: () => readTemplate('lib/actions/users/update-user-role.ts'),\n dependencies: ['users-action-types']\n },\n 'delete-user-action': {\n relPath: 'lib/actions/users/delete-user.ts',\n content: () => readTemplate('lib/actions/users/delete-user.ts'),\n dependencies: ['users-action-types']\n },\n 'media-action': {\n relPath: 'lib/actions/media/index.ts',\n content: () => readTemplate('lib/actions/media/index.ts'),\n dependencies: [\n 'media-action-types',\n 'media-query-utils',\n 'get-media-action',\n 'get-media-by-id-action',\n 'get-media-by-ids-action',\n 'create-media-action',\n 'update-media-action',\n 'delete-media-action',\n 'delete-media-bulk-action'\n ]\n },\n 'media-action-types': {\n relPath: 'lib/actions/media/types.ts',\n content: () => readTemplate('lib/actions/media/types.ts')\n },\n 'get-media-action': {\n relPath: 'lib/actions/media/get-media.ts',\n content: () => readTemplate('lib/actions/media/get-media.ts'),\n dependencies: ['media-action-types']\n },\n 'get-media-by-id-action': {\n relPath: 'lib/actions/media/get-media-by-id.ts',\n content: () => readTemplate('lib/actions/media/get-media-by-id.ts'),\n dependencies: ['media-action-types']\n },\n 'get-media-by-ids-action': {\n relPath: 'lib/actions/media/get-media-by-ids.ts',\n content: () => readTemplate('lib/actions/media/get-media-by-ids.ts'),\n dependencies: ['media-action-types']\n },\n 'create-media-action': {\n relPath: 'lib/actions/media/create-media.ts',\n content: () => readTemplate('lib/actions/media/create-media.ts'),\n dependencies: ['media-action-types']\n },\n 'update-media-action': {\n relPath: 'lib/actions/media/update-media.ts',\n content: () => readTemplate('lib/actions/media/update-media.ts'),\n dependencies: ['media-action-types']\n },\n 'delete-media-action': {\n relPath: 'lib/actions/media/delete-media.ts',\n content: () => readTemplate('lib/actions/media/delete-media.ts'),\n dependencies: ['media-action-types']\n },\n 'delete-media-bulk-action': {\n relPath: 'lib/actions/media/delete-media-bulk.ts',\n content: () => readTemplate('lib/actions/media/delete-media-bulk.ts'),\n dependencies: ['media-action-types']\n },\n 'profile-action': {\n relPath: 'lib/actions/profile/index.ts',\n content: () => readTemplate('lib/actions/profile/index.ts'),\n dependencies: [\n 'profile-action-types',\n 'is-email-configured-action',\n 'invalidate-users-cache-action',\n 'update-email-action'\n ]\n },\n 'profile-action-types': {\n relPath: 'lib/actions/profile/types.ts',\n content: () => readTemplate('lib/actions/profile/types.ts')\n },\n 'is-email-configured-action': {\n relPath: 'lib/actions/profile/is-email-configured.ts',\n content: () => readTemplate('lib/actions/profile/is-email-configured.ts')\n },\n 'invalidate-users-cache-action': {\n relPath: 'lib/actions/profile/invalidate-users-cache.ts',\n content: () => readTemplate('lib/actions/profile/invalidate-users-cache.ts'),\n dependencies: ['users-action-types']\n },\n 'update-email-action': {\n relPath: 'lib/actions/profile/update-email.ts',\n content: () => readTemplate('lib/actions/profile/update-email.ts'),\n dependencies: ['profile-action-types', 'invalidate-users-cache-action', 'users-action-types']\n },\n // API routes\n 'auth-route': {\n relPath: 'app/(admin)/api/admin/auth/[...all]/route.ts',\n content: () => readTemplate('api/auth-route.ts'),\n base: 'cwd',\n dependencies: ['auth-server']\n },\n 'upload-route': {\n relPath: 'app/(admin)/api/admin/upload/route.ts',\n content: () => readTemplate('api/upload-route.ts'),\n base: 'cwd',\n dependencies: ['media-action-types']\n },\n 'media-page': {\n relPath: 'app/(admin)/admin/(authenticated)/media/page.tsx',\n content: () => readTemplate('pages/media/media-page.tsx'),\n base: 'cwd',\n dependencies: ['media-page-skeleton']\n },\n 'media-page-skeleton': {\n relPath: 'app/(admin)/admin/(authenticated)/media/media-page-skeleton.tsx',\n content: () => readTemplate('pages/media/media-page-skeleton.tsx'),\n base: 'cwd'\n },\n 'media-page-content': {\n relPath: 'app/(admin)/admin/(authenticated)/media/media-page-content.tsx',\n content: () => readTemplate('pages/media/media-page-content.tsx'),\n base: 'cwd',\n dependencies: ['use-media', 'media-grid-pagination']\n }\n}\n\n/**\n * Get all available static shadcn UI component names from the shared React Admin asset pack.\n */\nfunction getStaticUiComponents(): string[] {\n return getStaticAssetComponents('ui')\n}\n\nfunction getStaticUiComponentEntries(): StaticAssetComponent[] {\n return getStaticAssetComponentEntries('ui')\n}\n\n/**\n * Get all available static BetterStart custom component names from the shared React Admin asset pack.\n */\nfunction getStaticCustomComponents(): string[] {\n return getStaticAssetComponents('custom')\n}\n\nfunction getStaticCustomComponentEntries(): StaticAssetComponent[] {\n return getStaticAssetComponentEntries('custom')\n}\n\nfunction getStaticAssetComponents(assetDirectory: 'ui' | 'custom'): string[] {\n return getStaticAssetComponentEntries(assetDirectory).map((entry) => entry.name)\n}\n\nfunction getStaticAssetComponentEntries(assetDirectory: 'ui' | 'custom'): StaticAssetComponent[] {\n const assetDir = resolveCliAssetPath('shared-assets', 'react-admin', assetDirectory)\n if (!fs.existsSync(assetDir)) return []\n\n const components: StaticAssetComponent[] = []\n\n for (const entry of fs.readdirSync(assetDir, { withFileTypes: true })) {\n if (entry.isFile() && (entry.name.endsWith('.tsx') || entry.name.endsWith('.ts'))) {\n components.push({\n name: entry.name.replace(/\\.(tsx|ts)$/, ''),\n file: entry.name\n })\n continue\n }\n\n if (!entry.isDirectory()) {\n continue\n }\n\n const indexFile = ['index.tsx', 'index.ts'].find((file) =>\n fs.existsSync(path.join(assetDir, entry.name, file))\n )\n if (indexFile) {\n components.push({\n name: entry.name,\n file: path.join(entry.name, indexFile)\n })\n }\n }\n\n return components.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nfunction findStaticAssetFile(assetDir: string, componentName: string): string | undefined {\n if (!fs.existsSync(assetDir)) return undefined\n\n const isNestedComponentName = /[\\\\/]/.test(componentName)\n const nestedComponentName = componentName.split(/[\\\\/]/).filter(Boolean).join(path.sep)\n if (\n isNestedComponentName &&\n nestedComponentName &&\n !path.isAbsolute(componentName) &&\n !nestedComponentName.split(path.sep).includes('..')\n ) {\n for (const extension of ['.tsx', '.ts']) {\n const relPath = `${nestedComponentName}${extension}`\n const filePath = path.join(assetDir, relPath)\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n return relPath\n }\n }\n }\n\n if (!isNestedComponentName && !componentName.includes('..') && !path.isAbsolute(componentName)) {\n for (const extension of ['.tsx', '.ts']) {\n const relPath = path.join(componentName, `index${extension}`)\n const filePath = path.join(assetDir, relPath)\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n return relPath\n }\n }\n }\n\n return fs\n .readdirSync(assetDir, { withFileTypes: true })\n .find(\n (entry) =>\n entry.isFile() &&\n (entry.name.endsWith('.tsx') || entry.name.endsWith('.ts')) &&\n entry.name.replace(/\\.(tsx|ts)$/, '') === componentName\n )?.name\n}\n\nfunction getAllComponentNames(): string[] {\n const staticUi = getStaticUiComponents()\n const staticCustom = getStaticCustomComponents()\n const templateKeys = Object.keys(TEMPLATE_REGISTRY)\n return [...new Set([...staticUi, ...staticCustom, ...templateKeys, 'tiptap'])].sort()\n}\n\nfunction getAllComponentNamesForConfig(config: ResolvedBetterstartConfig): string[] {\n const staticUi = getStaticUiComponents()\n const staticCustom = getStaticCustomComponents()\n const templateKeys = Object.entries(TEMPLATE_REGISTRY)\n .filter(\n ([, entry]) =>\n (!entry.requiredPlugin || hasPlugin(config, entry.requiredPlugin)) &&\n (!entry.requiredIntegration || hasIntegration(config, entry.requiredIntegration))\n )\n .map(([name]) => name)\n\n return [...new Set([...staticUi, ...staticCustom, ...templateKeys, 'tiptap'])].sort()\n}\n\nexport async function runUpdateCommand(\n components: string[],\n options: UpdateCommandOptions\n): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n const normalizedOnly = normalizeShadcnPresetOnly(options.only)\n\n validateShadcnPresetOptions(components, options)\n\n if (options.list) {\n const all = getAllComponentNames()\n clack.intro('Available components')\n\n const uiComponents = getStaticUiComponentEntries()\n const customComponents = getStaticCustomComponentEntries()\n const templateKeys = Object.keys(TEMPLATE_REGISTRY).sort()\n\n // UI components table\n console.log()\n console.log(` Shadcn UI Components (${uiComponents.length})`)\n console.log(` ${'─'.repeat(50)}`)\n console.log(` ${'Name'.padEnd(28)} ${'Path'}`)\n console.log(` ${'─'.repeat(50)}`)\n for (const component of uiComponents) {\n console.log(` ${component.name.padEnd(28)} components/ui/${component.file}`)\n }\n\n // Custom components table\n console.log()\n console.log(` Custom Components (${customComponents.length})`)\n console.log(` ${'─'.repeat(56)}`)\n console.log(` ${'Name'.padEnd(28)} ${'Path'}`)\n console.log(` ${'─'.repeat(56)}`)\n for (const component of customComponents) {\n console.log(` ${component.name.padEnd(28)} components/custom/${component.file}`)\n }\n\n // Template components table\n console.log()\n console.log(` Template Components (${templateKeys.length})`)\n console.log(` ${'─'.repeat(56)}`)\n console.log(` ${'Name'.padEnd(28)} ${'Path'}`)\n console.log(` ${'─'.repeat(56)}`)\n for (const name of templateKeys) {\n const entry = TEMPLATE_REGISTRY[name]\n const relPath = entry.displayPath ?? entry.relPath\n console.log(` ${name.padEnd(28)} ${relPath}`)\n }\n\n // Special\n console.log()\n console.log(` Special`)\n console.log(` ${'─'.repeat(56)}`)\n console.log(` ${'tiptap'.padEnd(28)} components/custom/content-editor/tiptap-*/ (all files)`)\n console.log()\n\n clack.outro(`${all.length} components available`)\n return\n }\n\n const config = await resolveConfig(cwd)\n const admin = path.resolve(cwd, config.paths.admin)\n\n if (!fs.existsSync(admin)) {\n clack.cancel(\n `Admin directory not found at ${config.paths.admin}. Run 'betterstart init' first.`\n )\n process.exit(1)\n }\n\n if (options.shadcnPreset) {\n runShadcnPresetUpdate({\n cwd,\n config,\n preset: options.shadcnPreset.trim(),\n only: normalizedOnly\n })\n return\n }\n\n if (!options.all && components.length === 0) {\n clack.log.error(\n 'Provide component names or use --all. Run with --list to see available components.'\n )\n process.exit(1)\n }\n\n clack.intro('BetterStart Update Components')\n\n const toUpdate = options.all ? getAllComponentNamesForConfig(config) : components\n const uiDir = resolveCliAssetPath('shared-assets', 'react-admin', 'ui')\n const customDir = resolveCliAssetPath('shared-assets', 'react-admin', 'custom')\n let updated = 0\n let skipped = 0\n const updatedTemplateNames = new Set<string>()\n const updatedStaticNames = new Set<string>()\n const requiredPackageDependencies = new Set<string>()\n\n function trackPackageDependencies(name: string): void {\n for (const dependency of COMPONENT_PACKAGE_DEPENDENCIES[name] ?? []) {\n requiredPackageDependencies.add(dependency)\n }\n }\n\n function writeTemplateEntry(name: string, entry: TemplateEntry): boolean {\n if (updatedTemplateNames.has(name)) {\n return false\n }\n\n if (entry.requiredPlugin && !hasPlugin(config, entry.requiredPlugin)) {\n clack.log.warning(`${name} requires the ${entry.requiredPlugin} plugin and was skipped.`)\n skipped++\n return false\n }\n if (entry.requiredIntegration && !hasIntegration(config, entry.requiredIntegration)) {\n clack.log.warning(\n `${name} requires the ${entry.requiredIntegration} integration and was skipped.`\n )\n skipped++\n return false\n }\n\n const { relPath, content } = applyNamespaceToTemplateEntry(entry, config, cwd)\n const baseDir = entry.base === 'cwd' ? cwd : admin\n const destPath = path.join(baseDir, relPath)\n if (entry.preserveExisting && fs.existsSync(destPath)) {\n clack.log.info(`Preserved ${relPath}`)\n updatedTemplateNames.add(name)\n skipped++\n return false\n }\n fsExtra.ensureDirSync(path.dirname(destPath))\n fs.writeFileSync(destPath, content, 'utf-8')\n clack.log.success(`Updated ${relPath}`)\n updatedTemplateNames.add(name)\n trackPackageDependencies(name)\n updated++\n return true\n }\n\n function writeTemplateEntryWithDependencies(name: string, entry: TemplateEntry): boolean {\n const wroteEntry = writeTemplateEntry(name, entry)\n if (!wroteEntry) {\n return false\n }\n\n for (const dependencyName of entry.dependencies ?? []) {\n writeNamedDependency(dependencyName)\n }\n\n return true\n }\n\n function writeStaticAssetEntry(assetDirectory: 'ui' | 'custom', name: string): boolean {\n const key = `${assetDirectory}:${name}`\n if (updatedStaticNames.has(key)) {\n return false\n }\n\n const assetDir = assetDirectory === 'ui' ? uiDir : customDir\n const assetFile = findStaticAssetFile(assetDir, name)\n if (!assetFile) {\n return false\n }\n\n const namespace = config.frameworkConfig.next.namespace\n const namespacedAssetFile = applyAdminNamespaceToPath(assetFile, namespace)\n const destPath = path.join(admin, 'components', assetDirectory, namespacedAssetFile)\n fsExtra.ensureDirSync(path.dirname(destPath))\n writeNamespacedFile(path.join(assetDir, assetFile), destPath, namespace)\n clack.log.success(`Updated components/${assetDirectory}/${namespacedAssetFile}`)\n\n if (assetDirectory === 'custom') {\n const assetSubdir = path.join(assetDir, name)\n if (fs.existsSync(assetSubdir) && fs.statSync(assetSubdir).isDirectory()) {\n const namespacedName = applyAdminNamespaceToPath(name, namespace)\n const destSubdir = path.join(admin, 'components', assetDirectory, namespacedName)\n fsExtra.emptyDirSync(destSubdir)\n copyNamespacedDirectory(assetSubdir, destSubdir, namespace)\n clack.log.success(`Updated components/${assetDirectory}/${namespacedName}/ (all files)`)\n }\n }\n\n updatedStaticNames.add(key)\n trackPackageDependencies(name)\n updated++\n\n if (assetDirectory === 'custom') {\n for (const dependencyName of STATIC_CUSTOM_DEPENDENCIES[name] ?? []) {\n writeNamedDependency(dependencyName)\n }\n }\n\n return true\n }\n\n function writeTiptapTemplates(): boolean {\n const key = 'custom:tiptap'\n if (updatedStaticNames.has(key)) {\n return true\n }\n\n const srcBaseDir = resolveCliAssetPath(\n 'shared-assets',\n 'react-admin',\n 'custom',\n 'content-editor'\n )\n const namespace = config.frameworkConfig.next.namespace\n const destBaseDir = path.join(admin, 'components', 'custom', 'content-editor')\n if (!fs.existsSync(srcBaseDir)) {\n return false\n }\n\n let copied = false\n for (const directory of TIPTAP_CONTENT_EDITOR_DIRECTORIES) {\n const srcDir = path.join(srcBaseDir, directory)\n if (!fs.existsSync(srcDir)) {\n continue\n }\n\n const destDir = path.join(destBaseDir, applyAdminNamespaceToPath(directory, namespace))\n fsExtra.emptyDirSync(destDir)\n copyNamespacedDirectory(srcDir, destDir, namespace)\n copied = true\n }\n\n if (!copied) {\n return false\n }\n\n clack.log.success('Updated components/custom/content-editor/tiptap-*/ (all files)')\n updatedStaticNames.add(key)\n trackPackageDependencies('tiptap')\n updated++\n removeLegacyDirectory(path.join(admin, 'components', 'custom', 'tiptap'))\n for (const dependencyName of TIPTAP_TEMPLATE_DEPENDENCIES) {\n writeNamedDependency(dependencyName)\n }\n return true\n }\n\n function writeNamedDependency(name: string): void {\n const entry = TEMPLATE_REGISTRY[name]\n if (entry) {\n writeTemplateEntryWithDependencies(name, entry)\n return\n }\n\n if (writeStaticAssetEntry('ui', name)) {\n return\n }\n\n if (writeStaticAssetEntry('custom', name)) {\n return\n }\n\n if (name === 'tiptap') {\n writeTiptapTemplates()\n }\n }\n\n for (const name of toUpdate) {\n // 1. Check template registry (template functions)\n if (TEMPLATE_REGISTRY[name]) {\n const entry = TEMPLATE_REGISTRY[name]\n writeTemplateEntryWithDependencies(name, entry)\n continue\n }\n\n // 2. Check static UI templates\n if (writeStaticAssetEntry('ui', name)) {\n continue\n }\n\n // 3. Check static custom templates\n if (writeStaticAssetEntry('custom', name)) {\n continue\n }\n\n // 4. Special: TipTap support directories inside content-editor\n if (name === 'tiptap') {\n if (!writeTiptapTemplates()) {\n clack.log.warning('tiptap templates not found')\n skipped++\n }\n continue\n }\n\n clack.log.warning(`Unknown component: ${name}`)\n skipped++\n }\n\n syncInstalledPluginManifests(cwd, config)\n syncInstalledIntegrationManifests(cwd, config)\n\n const projectPackageJson = readProjectPackageJson(cwd)\n const missingPackageDependencies = Array.from(requiredPackageDependencies).filter(\n (dependency) => !hasDeclaredPackage(projectPackageJson, dependency)\n )\n if (missingPackageDependencies.length > 0) {\n clack.log.warning(\n `Updated components require package dependencies that are not declared: ${missingPackageDependencies.join(', ')}. Run 'pnpm betterstart update-deps' before building.`\n )\n }\n\n clack.outro(\n `Updated ${updated} component${updated !== 1 ? 's' : ''}${skipped > 0 ? `, ${skipped} skipped` : ''}`\n )\n}\n\nfunction removeLegacyDirectory(dirPath: string): void {\n if (fs.existsSync(dirPath)) {\n fs.rmSync(dirPath, { recursive: true, force: true })\n }\n}\n\nfunction validateShadcnPresetOptions(components: string[], options: UpdateCommandOptions): void {\n if (options.only && !options.shadcnPreset) {\n clack.cancel('--only can only be used with --shadcn-preset.')\n process.exit(1)\n }\n\n if (!options.shadcnPreset) {\n return\n }\n\n if (options.list) {\n clack.cancel('--list cannot be combined with --shadcn-preset.')\n process.exit(1)\n }\n\n if (options.all) {\n clack.cancel('--all cannot be combined with --shadcn-preset.')\n process.exit(1)\n }\n\n if (components.length > 0) {\n clack.cancel('Component names cannot be combined with --shadcn-preset.')\n process.exit(1)\n }\n}\n\nfunction normalizeShadcnPresetOnly(value: string | undefined): string | undefined {\n if (!value) {\n return undefined\n }\n\n const parts = value\n .split(',')\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean)\n\n if (parts.length !== 1 || parts[0] !== 'theme') {\n clack.cancel(\n 'Admin-only shadcn preset updates currently support --only theme. Omit --only to apply the full preset.'\n )\n process.exit(1)\n }\n\n return 'theme'\n}\n\nfunction runShadcnPresetUpdate({\n cwd,\n config,\n preset,\n only\n}: {\n cwd: string\n config: ResolvedBetterstartConfig\n preset: string\n only?: string\n}): void {\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const adminGlobalsPath = path.join(cwd, config.paths.admin, namespace.globalsFile)\n const componentsJsonPath = path.join(cwd, 'components.json')\n const shadcnBackupPath = `${componentsJsonPath}.bak`\n const restoreAfterApplyPaths = [\n componentsJsonPath,\n shadcnBackupPath,\n path.join(cwd, config.paths.admin, 'lib', 'utils.ts'),\n ...getHostProjectFilesToRestore(cwd)\n ]\n\n if (!preset) {\n clack.cancel('--shadcn-preset requires a preset code, preset name, or preset URL.')\n process.exit(1)\n }\n\n if (!fs.existsSync(adminGlobalsPath)) {\n clack.cancel(\n `Admin globals file not found at ${path.relative(cwd, adminGlobalsPath)}. Run 'betterstart update admin-globals' first.`\n )\n process.exit(1)\n }\n\n const shadcnBin = resolveLocalShadcnBin(cwd)\n const restoreSnapshots = restoreAfterApplyPaths.map((filePath) => ({\n filePath,\n snapshot: snapshotFile(filePath)\n }))\n\n clack.intro('BetterStart Shadcn Preset')\n clack.log.info(`Applying preset to ${path.join(config.paths.admin, 'components/ui')}`)\n\n let failed = false\n try {\n fs.writeFileSync(\n componentsJsonPath,\n `${JSON.stringify(createAdminShadcnComponentsJson(config), null, 2)}\\n`,\n 'utf-8'\n )\n\n const args = ['apply', '--preset', preset, '--cwd', cwd, '--yes']\n if (only) {\n args.push('--only', only)\n }\n\n execFileSync(shadcnBin, args, { cwd, stdio: 'inherit' })\n } catch {\n failed = true\n } finally {\n for (const { filePath, snapshot } of restoreSnapshots.reverse()) {\n restoreFile(filePath, snapshot)\n }\n }\n\n if (failed) {\n clack.cancel('shadcn preset application failed.')\n process.exit(1)\n }\n\n clack.outro(\n only\n ? `Applied shadcn preset parts (${only}) to the Admin.`\n : 'Applied shadcn preset to Admin UI components and styles.'\n )\n}\n\nfunction createAdminShadcnComponentsJson(\n config: ResolvedBetterstartConfig\n): AdminShadcnComponentsJson {\n const adminPath = toPosixPath(config.paths.admin)\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n\n return {\n $schema: 'https://ui.shadcn.com/schema.json',\n style: 'new-york',\n rsc: true,\n tsx: true,\n tailwind: {\n config: '',\n css: `${adminPath}/${namespace.globalsFile}`,\n baseColor: 'neutral',\n cssVariables: true,\n prefix: ''\n },\n iconLibrary: 'lucide',\n aliases: {\n components: `${namespace.alias}/components`,\n ui: `${namespace.alias}/components/ui`,\n hooks: `${namespace.alias}/hooks`,\n lib: `${namespace.alias}/lib`,\n utils: `${namespace.alias}/utils/shared/cn`\n }\n }\n}\n\nfunction toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/')\n}\n\nfunction resolveLocalShadcnBin(cwd: string): string {\n const binName = process.platform === 'win32' ? 'shadcn.cmd' : 'shadcn'\n const shadcnBin = path.join(cwd, 'node_modules', '.bin', binName)\n\n if (!fs.existsSync(shadcnBin)) {\n clack.cancel(\n `shadcn is not installed in this project. Run 'betterstart update-deps' and try again.`\n )\n process.exit(1)\n }\n\n return shadcnBin\n}\n\nfunction getHostProjectFilesToRestore(cwd: string): string[] {\n const hostRelativePaths = [\n 'app/layout.tsx',\n 'app/layout.ts',\n 'app/layout.jsx',\n 'app/layout.js',\n 'src/app/layout.tsx',\n 'src/app/layout.ts',\n 'src/app/layout.jsx',\n 'src/app/layout.js',\n 'app/globals.css',\n 'src/app/globals.css'\n ]\n\n return hostRelativePaths.map((relativePath) => path.join(cwd, relativePath))\n}\n\nfunction snapshotFile(filePath: string): FileSnapshot {\n if (!fs.existsSync(filePath)) {\n return { existed: false }\n }\n\n return { existed: true, content: fs.readFileSync(filePath, 'utf-8') }\n}\n\nfunction restoreFile(filePath: string, snapshot: FileSnapshot): void {\n if (snapshot.existed) {\n fs.writeFileSync(filePath, snapshot.content ?? '', 'utf-8')\n return\n }\n\n if (fs.existsSync(filePath)) {\n fs.rmSync(filePath, { force: true })\n }\n}\n","/**\n * update-deps command — (re-)install all required Admin dependencies.\n * Safe to run repeatedly; the package manager will skip already-installed packages.\n */\n\nimport path from 'node:path'\nimport * as clack from '@clack/prompts'\nimport type { UpdateDepsCommandOptions } from '@core-engine/commands/runtime.js'\nimport { detectPackageManager } from '@core-engine/utils/package-manager.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport {\n getCliDependencySyncPlan,\n getDependencyPlan,\n installDependenciesAsync\n} from '@next-adapter/init/scaffolders/dependencies.js'\nimport { getInstalledIntegrations } from '@next-adapter/integration-runtime.js'\nimport { getInstalledPlugins } from '@next-adapter/plugin-runtime.js'\n\nexport async function runUpdateDepsCommand(options: UpdateDepsCommandOptions): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n\n clack.intro('BetterStart Update Dependencies')\n\n const pm = detectPackageManager(cwd)\n clack.log.info(`Package manager: ${pm}`)\n\n const config = await resolveConfig(cwd)\n const dependencyPlan = getDependencyPlan(\n getInstalledPlugins(config),\n getInstalledIntegrations(config),\n false\n )\n const cliDependencyPlan = getCliDependencySyncPlan(cwd)\n\n const s = clack.spinner()\n s.start('Installing dependencies...')\n\n const result = await installDependenciesAsync({\n cwd,\n pm,\n dependencies: Array.from(\n new Set([...dependencyPlan.dependencies, ...(cliDependencyPlan?.dependencies ?? [])])\n ),\n devDependencies: Array.from(\n new Set([...dependencyPlan.devDependencies, ...(cliDependencyPlan?.devDependencies ?? [])])\n )\n })\n\n if (result.success) {\n s.stop(`Installed ${result.dependencies.length} deps + ${result.devDeps.length} dev deps`)\n } else {\n s.stop('Dependency install failed')\n clack.log.error(result.error ?? 'Unknown error')\n process.exit(1)\n }\n\n clack.outro('Dependencies updated')\n}\n","/**\n * update-styles command — replace admin-globals.css with the latest version\n */\n\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport * as clack from '@clack/prompts'\nimport type { UpdateStylesCommandOptions } from '@core-engine/commands/runtime.js'\nimport {\n applyAdminNamespaceToContent,\n resolveAdminNamespace\n} from '@next-adapter/config/namespace.js'\nimport { resolveConfig } from '@next-adapter/config.js'\nimport { readTemplate } from '@next-adapter/template-reader.js'\n\nexport async function runUpdateStylesCommand(options: UpdateStylesCommandOptions): Promise<void> {\n const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd()\n\n clack.intro('BetterStart Update Styles')\n\n const config = await resolveConfig(cwd)\n const adminDir = config.paths?.admin ?? './admin'\n const namespace = resolveAdminNamespace(config.frameworkConfig.next.namespace)\n const targetPath = path.join(cwd, adminDir, namespace.globalsFile)\n\n if (!fs.existsSync(targetPath)) {\n clack.cancel(`${namespace.globalsFile} not found at ${path.relative(cwd, targetPath)}`)\n process.exit(1)\n }\n\n fs.writeFileSync(\n targetPath,\n applyAdminNamespaceToContent(readTemplate('admin-globals.css'), namespace.segment),\n 'utf-8'\n )\n\n clack.log.success(`Updated ${path.relative(cwd, targetPath)}`)\n clack.outro('Styles updated')\n}\n","import type { BetterstartCommandRuntime } from '@core-engine/commands/runtime.js'\nimport { runAddCommand } from './commands/add.js'\nimport { runGenerateCommand } from './commands/generate.js'\nimport { runInitCommand } from './commands/init.js'\nimport { runListIntegrationsCommand } from './commands/list-integrations.js'\nimport { runListPluginsCommand } from './commands/list-plugins.js'\nimport { runRemoveCommand } from './commands/remove.js'\nimport { runRemoveSchemaCommand } from './commands/remove-schema.js'\nimport { runSeedCommand } from './commands/seed.js'\nimport { runUninstallCommand } from './commands/uninstall.js'\nimport { runUpdateCommand } from './commands/update-component.js'\nimport { runUpdateDepsCommand } from './commands/update-deps.js'\nimport { runUpdateStylesCommand } from './commands/update-styles.js'\n\nexport const nextCommandRuntime: BetterstartCommandRuntime = {\n runAdd: runAddCommand,\n runGenerate: runGenerateCommand,\n runInit: runInitCommand,\n runListIntegrations: runListIntegrationsCommand,\n runListPlugins: runListPluginsCommand,\n runRemove: runRemoveCommand,\n runRemoveSchema: runRemoveSchemaCommand,\n runSeed: runSeedCommand,\n runUninstall: runUninstallCommand,\n runUpdate: runUpdateCommand,\n runUpdateDeps: runUpdateDepsCommand,\n runUpdateStyles: runUpdateStylesCommand\n}\n"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","names":["readFileSync","path","path","path","p","fs","path","fs","path","fs","path","fs","path","path","fs","version","fs","path","execFileSync","fs","path","fs","path","path","fs","fs","fs","path","fs","path","path","fs","versionSeparator","version","spawn","path","text","path","spawn","path","fs","execFileSync","fs","path","p","fs","path","path","filePath","fs","fs","path","fs","path","path","fs","path","path","fs","path","fs","path","fs","path","path","fs","unique","path","fs","envResult","configureResult","fs","path","fs","path","path","isRecord","assertSupportedSchemaFieldTree","assertSupportedSchemaFieldType","getTabSlotFields","isRecord","assertSupportedFormFieldTree","assertSupportedFormFieldType","assertSupportedFormFieldTree","assertSupportedFormFieldType","formLabel","group","fs","path","fs","path","p","generateColumnDef","generateColumns","generateColumnDef","base","text","formItemProps","fallback","validValuesExpression","buildZodFields","buildDefaultValues","formItemProps","fillFormItemProps","formItemProps","generateFieldJSX","buildZodFields","buildDefaultValues","generateFieldJSX","options","tabsField","fieldRendersMainJSXForImports","fieldSupportsIconPostfix","hasRenderedIconPostfix","group","generateFieldJSX","buildZodFields","buildDefaultValues","generatePage","generatePageContent","generateTable","generateColumns","generateTable","generatePageContent","generatePage","fs","path","fs","path","fs","path","p","quote","path","text","fs","path","fs","path","fs","path","path","fs","fs","path","localContent","fs","path","path","fs","unique","path","flattenEnvKeys","normalizeManagedFileContent","tryReadCoreManagedTemplate","fs","toProjectAbsolutePath","isInsideDir","cleanupEmptyDirs","walkFields","path","result","conflictPaths","postGenerateResult","fs","path","p","isInteractiveSession","path","fs","packageNameFromSpec","versionSeparator","adminRoutePath","loaded","validationErrors","needsMarkdownRenderer","result","barrelSummary","conflictPaths","execFileSync","spawn","fs","path","p","execFileSync","p","p","p","pc","path","fs","path","path","path","path","path","path","fs","path","path","fs","path","namespacedDestPath","fs","path","path","fs","path","path","fs","path","readPackageJson","crypto","crypto","path","path","fs","path","fs","path","fs","path","path","fs","pc","fs","path","path","password","fs","runSeed","spinner","path","fs","pc","project","execFileSync","spawn","password","path","p","path","path","p","path","path","p","path","result","fs","path","promptConfirm","removePath","path","fs","cleanupEmptyDirs","fs","path","p","pc","fs","stripJsonComments","findMainCss","path","fs","p","pc","execFileSync","fs","path","clack","fs","path","readProjectPackageJson","hasDeclaredPackage","execFileSync","path","clack","path","fs","path","clack","path","fs","Command","readFileSync"]}