betterstart-cli 0.0.99 → 0.0.101

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 (450) hide show
  1. package/dist/assets/adapters/next/integrations/_shared/actions/object-key.ts +1 -4
  2. package/dist/assets/adapters/next/integrations/_shared/actions/sanitize-filename.ts +3 -0
  3. package/dist/assets/adapters/next/integrations/r2/actions/get-client.ts +22 -0
  4. package/dist/assets/adapters/next/integrations/r2/actions/get-config.ts +9 -0
  5. package/dist/assets/adapters/next/integrations/r2/actions/{r2.ts → provider.ts} +3 -31
  6. package/dist/assets/adapters/next/integrations/r2/integration.ts +13 -1
  7. package/dist/assets/adapters/next/integrations/railway-bucket/actions/get-client.ts +20 -0
  8. package/dist/assets/adapters/next/integrations/railway-bucket/actions/get-config.ts +10 -0
  9. package/dist/assets/adapters/next/integrations/railway-bucket/actions/{railway-bucket.ts → provider.ts} +4 -34
  10. package/dist/assets/adapters/next/integrations/railway-bucket/actions/stable-read-url.ts +3 -0
  11. package/dist/assets/adapters/next/integrations/railway-bucket/integration.ts +17 -1
  12. package/dist/assets/adapters/next/integrations/resend/actions/escape-html.ts +8 -0
  13. package/dist/assets/adapters/next/integrations/resend/actions/get-env-value.ts +4 -0
  14. package/dist/assets/adapters/next/integrations/resend/actions/get-from-address.ts +5 -0
  15. package/dist/assets/adapters/next/integrations/resend/actions/get-resend-client.ts +19 -0
  16. package/dist/assets/adapters/next/integrations/resend/actions/html-to-text.ts +16 -0
  17. package/dist/assets/adapters/next/integrations/resend/actions/is-configured.ts +6 -0
  18. package/dist/assets/adapters/next/integrations/resend/actions/provider.ts +17 -0
  19. package/dist/assets/adapters/next/integrations/resend/actions/render-password-reset-email.ts +25 -0
  20. package/dist/assets/adapters/next/integrations/resend/actions/send-email.ts +43 -0
  21. package/dist/assets/adapters/next/integrations/resend/integration.ts +33 -1
  22. package/dist/assets/adapters/next/integrations/vercel-blob/actions/get-token.ts +3 -0
  23. package/dist/assets/adapters/next/integrations/vercel-blob/actions/{vercel-blob.ts → provider.ts} +1 -4
  24. package/dist/assets/adapters/next/integrations/vercel-blob/integration.ts +9 -1
  25. package/dist/assets/adapters/next/templates/init/api/storage-read-route.ts +2 -14
  26. package/dist/assets/adapters/next/templates/init/api/upload-route.ts +7 -5
  27. package/dist/assets/adapters/next/templates/init/components/layouts/admin-settings-sidebar.tsx +2 -2
  28. package/dist/assets/adapters/next/templates/init/components/layouts/admin-sign-out.tsx +27 -8
  29. package/dist/assets/adapters/next/templates/init/components/shared/data-table/data-table.tsx +3 -1
  30. package/dist/assets/adapters/next/templates/init/components/shared/delete-dialog.tsx +3 -2
  31. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +1 -1
  32. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-restore-dialog.tsx +4 -3
  33. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-button.tsx +5 -2
  34. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +1 -1
  35. package/dist/assets/adapters/next/templates/init/components/shared/media/edit-media-dialog-content.tsx +11 -5
  36. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-dialog.tsx +6 -4
  37. package/dist/assets/adapters/next/templates/init/components/shared/media/media-delete-drawer.tsx +12 -8
  38. package/dist/assets/adapters/next/templates/init/components/shared/media/media-empty-state.tsx +6 -5
  39. package/dist/assets/adapters/next/templates/init/components/shared/media/media-grid-pagination.tsx +1 -1
  40. package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +8 -5
  41. package/dist/assets/adapters/next/templates/init/components/shared/search-input.tsx +2 -0
  42. package/dist/assets/adapters/next/templates/init/components/shared/sort-order-dialog.tsx +12 -7
  43. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-blockquote.ts +6 -8
  44. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-code-block.ts +6 -8
  45. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-color-highlight.ts +6 -10
  46. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-media-insertion.ts +4 -6
  47. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-slash-menu.ts +4 -6
  48. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +22 -23
  49. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-table-add-controls.ts +8 -9
  50. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +16 -22
  51. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading.ts +6 -8
  52. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-link-popover.ts +3 -1
  53. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list-dropdown-menu.ts +1 -1
  54. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list.ts +6 -8
  55. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-mark.ts +2 -1
  56. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-table-button.ts +1 -1
  57. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-undo-redo.ts +1 -1
  58. package/dist/assets/adapters/next/templates/init/hooks/use-entity-versions.ts +2 -1
  59. package/dist/assets/adapters/next/templates/init/hooks/use-table-utils.ts +2 -1
  60. package/dist/assets/adapters/next/templates/init/hooks/use-upload.ts +3 -3
  61. package/dist/assets/adapters/next/templates/init/lib/actions/audit/clamp-page.ts +6 -0
  62. package/dist/assets/adapters/next/templates/init/lib/actions/audit/cleanup-audit-logs.ts +5 -9
  63. package/dist/assets/adapters/next/templates/init/lib/actions/audit/first-header-value.ts +3 -0
  64. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-audit-log-order-by.ts +25 -0
  65. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-audit-logs.ts +2 -109
  66. package/dist/assets/adapters/next/templates/init/lib/actions/audit/{request-metadata.ts → get-audit-request-metadata.ts} +3 -7
  67. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-retention-days.ts +5 -0
  68. package/dist/assets/adapters/next/templates/init/lib/actions/audit/max-ip-length.ts +1 -0
  69. package/dist/assets/adapters/next/templates/init/lib/actions/audit/max-user-agent-length.ts +1 -0
  70. package/dist/assets/adapters/next/templates/init/lib/actions/audit/normalize-changed-fields.ts +3 -0
  71. package/dist/assets/adapters/next/templates/init/lib/actions/audit/normalize-page-size.ts +12 -0
  72. package/dist/assets/adapters/next/templates/init/lib/actions/audit/query-audit-logs.ts +71 -0
  73. package/dist/assets/adapters/next/templates/init/lib/actions/audit/record-audit-event.ts +3 -6
  74. package/dist/assets/adapters/next/templates/init/lib/actions/auth/middleware.ts +2 -1
  75. package/dist/assets/adapters/next/templates/init/lib/actions/email/form-email-delivery-input.ts +1 -0
  76. package/dist/assets/adapters/next/templates/init/lib/actions/email/queued-form-email.ts +6 -0
  77. package/dist/assets/adapters/next/templates/init/lib/actions/email/{form-delivery.ts → send-form-emails.ts} +7 -34
  78. package/dist/assets/adapters/next/templates/init/lib/actions/email/send-queued-email.ts +19 -0
  79. package/dist/assets/adapters/next/templates/init/lib/actions/forms/upsert-form-settings.ts +2 -1
  80. package/dist/assets/adapters/next/templates/init/lib/actions/media/clamp-media-page-size.ts +9 -0
  81. package/dist/assets/adapters/next/templates/init/lib/actions/media/clamp-media-page.ts +9 -0
  82. package/dist/assets/adapters/next/templates/init/lib/actions/media/create-media.ts +4 -3
  83. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media-bulk.ts +3 -2
  84. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media.ts +3 -2
  85. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-id.ts +2 -1
  86. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-ids.ts +2 -1
  87. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media.ts +5 -21
  88. package/dist/assets/adapters/next/templates/init/lib/actions/media/update-media.ts +4 -3
  89. package/dist/assets/adapters/next/templates/init/lib/actions/profile/change-own-password.ts +3 -2
  90. package/dist/assets/adapters/next/templates/init/lib/actions/profile/update-email.ts +3 -2
  91. package/dist/assets/adapters/next/templates/init/lib/actions/storage/local.ts +1 -1
  92. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-media-from-url.ts +6 -8
  93. package/dist/assets/adapters/next/templates/init/lib/actions/users/change-user-password.ts +3 -2
  94. package/dist/assets/adapters/next/templates/init/lib/actions/users/create-user.ts +4 -3
  95. package/dist/assets/adapters/next/templates/init/lib/actions/users/delete-user.ts +3 -2
  96. package/dist/assets/adapters/next/templates/init/lib/actions/users/get-cached-users.ts +40 -0
  97. package/dist/assets/adapters/next/templates/init/lib/actions/users/get-users.ts +2 -40
  98. package/dist/assets/adapters/next/templates/init/lib/actions/users/update-user-role.ts +3 -2
  99. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/create-webhook.ts +3 -2
  100. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/delete-webhook.ts +2 -1
  101. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/deliver-to-endpoint.ts +55 -0
  102. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/deliver-webhook-event.ts +19 -0
  103. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/emit-webhook-event.ts +22 -0
  104. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/entity-event-payload.ts +20 -0
  105. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-deliveries.ts +1 -1
  106. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-secret.ts +2 -1
  107. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-subscriptions.ts +2 -18
  108. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhooks.ts +1 -1
  109. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/prune-webhook-deliveries.ts +26 -0
  110. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/read-webhook-subscriptions.ts +18 -0
  111. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/record-webhook-delivery.ts +24 -0
  112. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/regenerate-webhook-secret.ts +3 -2
  113. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/{register.ts → register-webhook-hooks.ts} +2 -14
  114. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/send-test-webhook.ts +4 -2
  115. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/update-webhook.ts +2 -1
  116. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.ts +1 -1
  117. package/dist/assets/adapters/next/templates/init/pages/account-shell-rsc.tsx +1 -1
  118. package/dist/assets/adapters/next/templates/init/pages/forgot-password-form.tsx +7 -7
  119. package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +8 -8
  120. package/dist/assets/adapters/next/templates/init/pages/login-page-rsc.tsx +1 -1
  121. package/dist/assets/adapters/next/templates/init/pages/login-page.tsx +1 -1
  122. package/dist/assets/adapters/next/templates/init/pages/media/media-page-content.tsx +5 -4
  123. package/dist/assets/adapters/next/templates/init/pages/profile/profile-form.tsx +13 -10
  124. package/dist/assets/adapters/next/templates/init/pages/reset-password-form.tsx +5 -5
  125. package/dist/assets/adapters/next/templates/init/pages/settings/audit-log/audit-log-table.tsx +3 -1
  126. package/dist/assets/adapters/next/templates/init/pages/settings/forms/form-notifications-drawer.tsx +10 -5
  127. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/delete-webhook-dialog.tsx +19 -10
  128. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-actions.tsx +9 -4
  129. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhook-endpoint-dialog.tsx +26 -20
  130. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-page-content.tsx +4 -4
  131. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-logs-table.tsx +3 -1
  132. package/dist/assets/adapters/next/templates/init/pages/settings/webhooks/webhooks-table.tsx +3 -1
  133. package/dist/assets/adapters/next/templates/init/pages/users/change-password-dialog.tsx +6 -5
  134. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +1 -1
  135. package/dist/assets/adapters/next/templates/init/pages/users/create-user-dialog.tsx +5 -5
  136. package/dist/assets/adapters/next/templates/init/pages/users/delete-user-dialog.tsx +6 -4
  137. package/dist/assets/adapters/next/templates/init/pages/users/edit-role-dialog.tsx +9 -5
  138. package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +2 -2
  139. package/dist/assets/adapters/next/templates/init/utils/audit/get-changed-field-names.ts +18 -0
  140. package/dist/assets/adapters/next/templates/init/utils/audit/get-touched-field-names.ts +9 -0
  141. package/dist/assets/adapters/next/templates/init/utils/audit/normalize-comparable-value.ts +14 -0
  142. package/dist/assets/adapters/next/templates/init/utils/audit/should-track-field.ts +15 -0
  143. package/dist/assets/adapters/next/templates/init/utils/auth/can-access-admin.ts +7 -0
  144. package/dist/assets/adapters/next/templates/init/utils/auth/get-admin-post-login-path.ts +5 -0
  145. package/dist/assets/adapters/next/templates/init/utils/auth/has-required-role.ts +5 -0
  146. package/dist/assets/adapters/next/templates/init/utils/auth/is-user-role.ts +5 -0
  147. package/dist/assets/adapters/next/templates/init/utils/date/build-date-range.ts +14 -0
  148. package/dist/assets/adapters/next/templates/init/utils/date/date-range-end-time.ts +1 -0
  149. package/dist/assets/adapters/next/templates/init/utils/date/date-range-input-format.ts +1 -0
  150. package/dist/assets/adapters/next/templates/init/utils/date/date-range-start-time.ts +1 -0
  151. package/dist/assets/adapters/next/templates/init/utils/date/format-date-range-input-date.ts +6 -0
  152. package/dist/assets/adapters/next/templates/init/utils/date/format-date-range-param-date.ts +7 -0
  153. package/dist/assets/adapters/next/templates/init/utils/date/format-date-range-trigger-date.ts +5 -0
  154. package/dist/assets/adapters/next/templates/init/utils/date/get-date-range-trigger-label.ts +24 -0
  155. package/dist/assets/adapters/next/templates/init/utils/date/get-exclusive-date-upper-bound.ts +9 -0
  156. package/dist/assets/adapters/next/templates/init/utils/date/get-ordered-date-range.ts +12 -0
  157. package/dist/assets/adapters/next/templates/init/utils/date/normalize-date-range-time.ts +5 -0
  158. package/dist/assets/adapters/next/templates/init/utils/date/parse-date-input-value.ts +6 -0
  159. package/dist/assets/adapters/next/templates/init/utils/date/parse-editable-date-range-date.ts +17 -0
  160. package/dist/assets/adapters/next/templates/init/utils/editor/active-table-cell-class.ts +1 -0
  161. package/dist/assets/adapters/next/templates/init/utils/editor/active-table-cell.ts +36 -0
  162. package/dist/assets/adapters/next/templates/init/utils/editor/active-table-wrapper-class.ts +1 -0
  163. package/dist/assets/adapters/next/templates/init/utils/editor/append-column-to-table.ts +13 -0
  164. package/dist/assets/adapters/next/templates/init/utils/editor/append-row-to-table.ts +13 -0
  165. package/dist/assets/adapters/next/templates/init/utils/editor/apply-cursor-change-if-available.ts +8 -0
  166. package/dist/assets/adapters/next/templates/init/utils/editor/apply-cursor-change.ts +10 -0
  167. package/dist/assets/adapters/next/templates/init/utils/editor/can-insert-content-editor-media-placeholder.ts +10 -0
  168. package/dist/assets/adapters/next/templates/init/utils/editor/checkbox-label-factory.ts +5 -0
  169. package/dist/assets/adapters/next/templates/init/utils/editor/clear-table-part-preview.ts +11 -0
  170. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color-name-pattern.ts +3 -0
  171. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color-option.ts +6 -0
  172. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color-options.ts +68 -0
  173. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color.ts +3 -0
  174. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-colors.ts +12 -0
  175. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight.ts +33 -0
  176. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-inline-math-delimiter.ts +1 -0
  177. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-inline-math.ts +105 -0
  178. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-keyboard.ts +5 -0
  179. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-math-kind.ts +1 -0
  180. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-math-value.ts +9 -0
  181. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-media-placeholder-node.ts +1 -0
  182. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-media-shortcut-key.ts +1 -0
  183. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-mode.ts +1 -0
  184. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-raw-content-block.ts +95 -0
  185. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-selected-math.ts +12 -0
  186. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-selection-request.ts +4 -0
  187. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-subscript.ts +5 -0
  188. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-superscript.ts +5 -0
  189. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-table-alignment.ts +1 -0
  190. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-underline.ts +26 -0
  191. package/dist/assets/adapters/next/templates/init/utils/editor/create-content-editor-table-node.ts +27 -0
  192. package/dist/assets/adapters/next/templates/init/utils/editor/create-html-mark.ts +28 -0
  193. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-image-text.ts +5 -0
  194. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-plain-text-offset-map.ts +126 -0
  195. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-table-text.ts +15 -0
  196. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-text-from-url.ts +6 -0
  197. package/dist/assets/adapters/next/templates/init/utils/editor/default-content-editor-table-cols.ts +1 -0
  198. package/dist/assets/adapters/next/templates/init/utils/editor/default-content-editor-table-rows.ts +1 -0
  199. package/dist/assets/adapters/next/templates/init/utils/editor/doc-position-from-plain-text-offset.ts +27 -0
  200. package/dist/assets/adapters/next/templates/init/utils/editor/escape-html.ts +10 -0
  201. package/dist/assets/adapters/next/templates/init/utils/editor/find-highlight-span-range.ts +25 -0
  202. package/dist/assets/adapters/next/templates/init/utils/editor/find-inline-math-start.ts +12 -0
  203. package/dist/assets/adapters/next/templates/init/utils/editor/find-markdown-link-range.ts +40 -0
  204. package/dist/assets/adapters/next/templates/init/utils/editor/find-node-at-position.ts +15 -0
  205. package/dist/assets/adapters/next/templates/init/utils/editor/find-node-position.ts +48 -0
  206. package/dist/assets/adapters/next/templates/init/utils/editor/find-raw-content-start.ts +16 -0
  207. package/dist/assets/adapters/next/templates/init/utils/editor/find-unescaped-character.ts +13 -0
  208. package/dist/assets/adapters/next/templates/init/utils/editor/find-unescaped-sequence.ts +14 -0
  209. package/dist/assets/adapters/next/templates/init/utils/editor/focus-next-node.ts +28 -0
  210. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown-blockquote-line.ts +5 -0
  211. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown-heading-line.ts +7 -0
  212. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown-list-line.ts +14 -0
  213. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown.ts +7 -0
  214. package/dist/assets/adapters/next/templates/init/utils/editor/format-shortcut-key.ts +10 -0
  215. package/dist/assets/adapters/next/templates/init/utils/editor/get-active-table-column-alignment.ts +31 -0
  216. package/dist/assets/adapters/next/templates/init/utils/editor/get-block-math-expression.ts +15 -0
  217. package/dist/assets/adapters/next/templates/init/utils/editor/get-closest-table-cell.ts +10 -0
  218. package/dist/assets/adapters/next/templates/init/utils/editor/get-content-editor-highlight-color-name.ts +42 -0
  219. package/dist/assets/adapters/next/templates/init/utils/editor/get-content-editor-highlight-color-value.ts +6 -0
  220. package/dist/assets/adapters/next/templates/init/utils/editor/get-editor-element.ts +7 -0
  221. package/dist/assets/adapters/next/templates/init/utils/editor/get-editor-scroll-element.ts +8 -0
  222. package/dist/assets/adapters/next/templates/init/utils/editor/get-event-table-cell.ts +7 -0
  223. package/dist/assets/adapters/next/templates/init/utils/editor/get-inline-math-delimiter.ts +7 -0
  224. package/dist/assets/adapters/next/templates/init/utils/editor/get-markdown-heading-fallback.ts +5 -0
  225. package/dist/assets/adapters/next/templates/init/utils/editor/get-markdown-list-fallback.ts +7 -0
  226. package/dist/assets/adapters/next/templates/init/utils/editor/get-media-label.ts +5 -0
  227. package/dist/assets/adapters/next/templates/init/utils/editor/get-number-attr.ts +3 -0
  228. package/dist/assets/adapters/next/templates/init/utils/editor/get-plain-text-offset-before-doc-position.ts +8 -0
  229. package/dist/assets/adapters/next/templates/init/utils/editor/get-plain-text-offset-before-markdown-offset.ts +11 -0
  230. package/dist/assets/adapters/next/templates/init/utils/editor/get-raw-content-kind.ts +7 -0
  231. package/dist/assets/adapters/next/templates/init/utils/editor/get-raw-content-token.ts +13 -0
  232. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-block-nodes.ts +23 -0
  233. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-content-editor-math.ts +43 -0
  234. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-nodes-of-type.ts +50 -0
  235. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-table-column-cell-positions.ts +21 -0
  236. package/dist/assets/adapters/next/templates/init/utils/editor/get-selection-table-cell.ts +10 -0
  237. package/dist/assets/adapters/next/templates/init/utils/editor/get-selection-table-element.ts +19 -0
  238. package/dist/assets/adapters/next/templates/init/utils/editor/get-selection-table.ts +17 -0
  239. package/dist/assets/adapters/next/templates/init/utils/editor/get-slash-menu-state.ts +47 -0
  240. package/dist/assets/adapters/next/templates/init/utils/editor/get-string-attr.ts +5 -0
  241. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-element.ts +5 -0
  242. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-from-event-target.ts +19 -0
  243. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-from-wrapper.ts +15 -0
  244. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-position-for-element.ts +24 -0
  245. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-rect-at-position.ts +20 -0
  246. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-wrapper-element.ts +11 -0
  247. package/dist/assets/adapters/next/templates/init/utils/editor/{task-item.ts → get-task-item-checkbox-label.ts} +1 -7
  248. package/dist/assets/adapters/next/templates/init/utils/editor/has-own-attribute.ts +3 -0
  249. package/dist/assets/adapters/next/templates/init/utils/editor/highlight-span-pattern.ts +6 -0
  250. package/dist/assets/adapters/next/templates/init/utils/editor/inline-math-delimiter.ts +3 -0
  251. package/dist/assets/adapters/next/templates/init/utils/editor/inline-math-node-view.ts +51 -0
  252. package/dist/assets/adapters/next/templates/init/utils/editor/insert-component-at-cursor.ts +28 -0
  253. package/dist/assets/adapters/next/templates/init/utils/editor/insert-content-editor-math.ts +35 -0
  254. package/dist/assets/adapters/next/templates/init/utils/editor/insert-content-editor-media-placeholder.ts +20 -0
  255. package/dist/assets/adapters/next/templates/init/utils/editor/insert-content-editor-table.ts +12 -0
  256. package/dist/assets/adapters/next/templates/init/utils/editor/insert-markdown-text-at-position.ts +14 -0
  257. package/dist/assets/adapters/next/templates/init/utils/editor/insert-result.ts +4 -0
  258. package/dist/assets/adapters/next/templates/init/utils/editor/insert-text-at-cursor.ts +37 -0
  259. package/dist/assets/adapters/next/templates/init/utils/editor/is-allowed-uri.ts +42 -0
  260. package/dist/assets/adapters/next/templates/init/utils/editor/is-content-editor-highlight-color.ts +6 -0
  261. package/dist/assets/adapters/next/templates/init/utils/editor/is-content-editor-media-placeholder-active.ts +8 -0
  262. package/dist/assets/adapters/next/templates/init/utils/editor/is-content-editor-table-alignment.ts +7 -0
  263. package/dist/assets/adapters/next/templates/init/utils/editor/is-element-visible-in-editor.ts +17 -0
  264. package/dist/assets/adapters/next/templates/init/utils/editor/is-escaped.ts +11 -0
  265. package/dist/assets/adapters/next/templates/init/utils/editor/is-extension-available.ts +22 -0
  266. package/dist/assets/adapters/next/templates/init/utils/editor/is-mac.ts +3 -0
  267. package/dist/assets/adapters/next/templates/init/utils/editor/is-mark-in-schema.ts +6 -0
  268. package/dist/assets/adapters/next/templates/init/utils/editor/is-markdown-line-start.ts +3 -0
  269. package/dist/assets/adapters/next/templates/init/utils/editor/is-node-in-schema.ts +6 -0
  270. package/dist/assets/adapters/next/templates/init/utils/editor/is-node-type-selected.ts +30 -0
  271. package/dist/assets/adapters/next/templates/init/utils/editor/is-same-slash-menu-state.ts +17 -0
  272. package/dist/assets/adapters/next/templates/init/utils/editor/is-selected-table-visible.ts +8 -0
  273. package/dist/assets/adapters/next/templates/init/utils/editor/is-task-item-checked.ts +5 -0
  274. package/dist/assets/adapters/next/templates/init/utils/editor/is-valid-dollar-inline-math.ts +13 -0
  275. package/dist/assets/adapters/next/templates/init/utils/editor/is-valid-position.ts +3 -0
  276. package/dist/assets/adapters/next/templates/init/utils/editor/is-word-character.ts +3 -0
  277. package/dist/assets/adapters/next/templates/init/utils/editor/mac-symbols.ts +15 -0
  278. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-heading-level.ts +1 -0
  279. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-heading-option.ts +6 -0
  280. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-heading-options.ts +9 -0
  281. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-image-upload-result.ts +4 -0
  282. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-list-option.ts +6 -0
  283. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-list-options.ts +7 -0
  284. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-list-type.ts +1 -0
  285. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-offset-from-plain-text-offset.ts +8 -0
  286. package/dist/assets/adapters/next/templates/init/utils/editor/match-block-math.ts +54 -0
  287. package/dist/assets/adapters/next/templates/init/utils/editor/match-code-fence-start.ts +8 -0
  288. package/dist/assets/adapters/next/templates/init/utils/editor/match-html-block.ts +31 -0
  289. package/dist/assets/adapters/next/templates/init/utils/editor/match-html-mark-syntax.ts +16 -0
  290. package/dist/assets/adapters/next/templates/init/utils/editor/match-inline-math.ts +49 -0
  291. package/dist/assets/adapters/next/templates/init/utils/editor/match-markdown-block-prefix.ts +11 -0
  292. package/dist/assets/adapters/next/templates/init/utils/editor/match-markdown-mark-syntax.ts +27 -0
  293. package/dist/assets/adapters/next/templates/init/utils/editor/match-raw-content-block.ts +9 -0
  294. package/dist/assets/adapters/next/templates/init/utils/editor/mounted-editor-view.ts +3 -0
  295. package/dist/assets/adapters/next/templates/init/utils/editor/normalize-editor-markdown.ts +3 -0
  296. package/dist/assets/adapters/next/templates/init/utils/editor/parse-content-editor-math-input.ts +98 -0
  297. package/dist/assets/adapters/next/templates/init/utils/editor/parse-shortcut-keys.ts +17 -0
  298. package/dist/assets/adapters/next/templates/init/utils/editor/prepare-markdown-for-rich-mode.ts +3 -0
  299. package/dist/assets/adapters/next/templates/init/utils/editor/protocol-config.ts +7 -0
  300. package/dist/assets/adapters/next/templates/init/utils/editor/raw-content-block-node-view.ts +120 -0
  301. package/dist/assets/adapters/next/templates/init/utils/editor/raw-content-kind.ts +3 -0
  302. package/dist/assets/adapters/next/templates/init/utils/editor/raw-content-match.ts +8 -0
  303. package/dist/assets/adapters/next/templates/init/utils/editor/raw-html-block-tags.ts +14 -0
  304. package/dist/assets/adapters/next/templates/init/utils/editor/remove-highlight-span-at-cursor.ts +59 -0
  305. package/dist/assets/adapters/next/templates/init/utils/editor/remove-markdown-link-at-cursor.ts +43 -0
  306. package/dist/assets/adapters/next/templates/init/utils/editor/remove-selected-content-editor-math.ts +20 -0
  307. package/dist/assets/adapters/next/templates/init/utils/editor/render-details-preview.ts +22 -0
  308. package/dist/assets/adapters/next/templates/init/utils/editor/render-latex.ts +20 -0
  309. package/dist/assets/adapters/next/templates/init/utils/editor/render-raw-content-preview.ts +19 -0
  310. package/dist/assets/adapters/next/templates/init/utils/editor/render-simple-markdown-body.ts +46 -0
  311. package/dist/assets/adapters/next/templates/init/utils/editor/run-slash-command.ts +12 -0
  312. package/dist/assets/adapters/next/templates/init/utils/editor/runnable-slash-command.ts +5 -0
  313. package/dist/assets/adapters/next/templates/init/utils/editor/sanitize-html-preview.ts +41 -0
  314. package/dist/assets/adapters/next/templates/init/utils/editor/sanitize-url.ts +13 -0
  315. package/dist/assets/adapters/next/templates/init/utils/editor/select-current-block-content.ts +38 -0
  316. package/dist/assets/adapters/next/templates/init/utils/editor/selection-within-convertible-types.ts +29 -0
  317. package/dist/assets/adapters/next/templates/init/utils/editor/self-closing-html-block-tags.ts +3 -0
  318. package/dist/assets/adapters/next/templates/init/utils/editor/serialize-raw-content-preview.ts +12 -0
  319. package/dist/assets/adapters/next/templates/init/utils/editor/set-active-table-column-alignment.ts +39 -0
  320. package/dist/assets/adapters/next/templates/init/utils/editor/set-element-attribute.ts +13 -0
  321. package/dist/assets/adapters/next/templates/init/utils/editor/set-markdown-link-at-cursor.ts +50 -0
  322. package/dist/assets/adapters/next/templates/init/utils/editor/show-table-part-preview.ts +59 -0
  323. package/dist/assets/adapters/next/templates/init/utils/editor/slash-commands.ts +2 -1
  324. package/dist/assets/adapters/next/templates/init/utils/editor/slash-menu-state.ts +6 -0
  325. package/dist/assets/adapters/next/templates/init/utils/editor/sr-only.ts +11 -0
  326. package/dist/assets/adapters/next/templates/init/utils/editor/strip-html.ts +5 -0
  327. package/dist/assets/adapters/next/templates/init/utils/editor/strip-markdown-block-prefix.ts +6 -0
  328. package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls-state.ts +4 -0
  329. package/dist/assets/adapters/next/templates/init/utils/editor/table-part-preview-class.ts +1 -0
  330. package/dist/assets/adapters/next/templates/init/utils/editor/table-part.ts +1 -0
  331. package/dist/assets/adapters/next/templates/init/utils/editor/table-wrapper-class.ts +1 -0
  332. package/dist/assets/adapters/next/templates/init/utils/editor/transform-selected-markdown-lines.ts +38 -0
  333. package/dist/assets/adapters/next/templates/init/utils/editor/update-nodes-attr.ts +36 -0
  334. package/dist/assets/adapters/next/templates/init/utils/editor/update-selected-content-editor-math.ts +36 -0
  335. package/dist/assets/adapters/next/templates/init/utils/email/escape-html.ts +8 -0
  336. package/dist/assets/adapters/next/templates/init/utils/email/form-email-delivery-input.ts +8 -0
  337. package/dist/assets/adapters/next/templates/init/utils/email/format-email-value.ts +19 -0
  338. package/dist/assets/adapters/next/templates/init/utils/email/is-valid-email.ts +3 -0
  339. package/dist/assets/adapters/next/templates/init/utils/email/normalize-email-list.ts +5 -0
  340. package/dist/assets/adapters/next/templates/init/utils/email/render-form-submission-rows.ts +16 -0
  341. package/dist/assets/adapters/next/templates/init/utils/email/render-notification-email.ts +32 -0
  342. package/dist/assets/adapters/next/templates/init/utils/email/render-thank-you-email.ts +18 -0
  343. package/dist/assets/adapters/next/templates/init/utils/error/read-string-property.ts +5 -0
  344. package/dist/assets/adapters/next/templates/init/utils/error/recognize.ts +26 -0
  345. package/dist/assets/adapters/next/templates/init/utils/error/to-action-error.ts +6 -0
  346. package/dist/assets/adapters/next/templates/init/utils/form/{list-field.ts → clone-default-value.ts} +0 -5
  347. package/dist/assets/adapters/next/templates/init/utils/form/create-list-item-key.ts +4 -0
  348. package/dist/assets/adapters/next/templates/init/utils/media/admin-media-type.ts +1 -0
  349. package/dist/assets/adapters/next/templates/init/utils/media/{fallback.ts → create-admin-media-from-url.ts} +1 -14
  350. package/dist/assets/adapters/next/templates/init/utils/media/create-preview-url.ts +3 -0
  351. package/dist/assets/adapters/next/templates/init/utils/media/get-filename-from-url.ts +9 -0
  352. package/dist/assets/adapters/next/templates/init/utils/media/get-media-type.ts +19 -0
  353. package/dist/assets/adapters/next/templates/init/utils/media/get-media-url-help-text.ts +10 -0
  354. package/dist/assets/adapters/next/templates/init/utils/media/get-media-url-placeholder.ts +7 -0
  355. package/dist/assets/adapters/next/templates/init/utils/media/image-extensions.ts +1 -0
  356. package/dist/assets/adapters/next/templates/init/utils/media/image-mime-types.ts +7 -0
  357. package/dist/assets/adapters/next/templates/init/utils/media/infer-media-content-type.ts +13 -0
  358. package/dist/assets/adapters/next/templates/init/utils/media/is-document-only-accept.ts +19 -0
  359. package/dist/assets/adapters/next/templates/init/utils/media/{query.ts → map-media-row.ts} +0 -39
  360. package/dist/assets/adapters/next/templates/init/utils/media/media-mime-types.ts +4 -0
  361. package/dist/assets/adapters/next/templates/init/utils/media/revoke-preview-url.ts +3 -0
  362. package/dist/assets/adapters/next/templates/init/utils/media/select-media.ts +39 -0
  363. package/dist/assets/adapters/next/templates/init/utils/media/video-extensions.ts +1 -0
  364. package/dist/assets/adapters/next/templates/init/utils/media/video-mime-types.ts +7 -0
  365. package/dist/assets/adapters/next/templates/init/utils/seo/{seo.ts → create-metadata.ts} +0 -36
  366. package/dist/assets/adapters/next/templates/init/utils/seo/generate-article-schema.ts +31 -0
  367. package/dist/assets/adapters/next/templates/init/utils/seo/schema-to-json.ts +3 -0
  368. package/dist/assets/adapters/next/templates/init/utils/storage/{local.ts → build-local-storage-key.ts} +1 -4
  369. package/dist/assets/adapters/next/templates/init/utils/storage/decode-storage-key.ts +9 -0
  370. package/dist/assets/adapters/next/templates/init/utils/storage/sanitize-filename.ts +3 -0
  371. package/dist/assets/adapters/next/templates/init/utils/storage/storage-error.ts +5 -0
  372. package/dist/assets/adapters/next/templates/init/utils/table/{table.ts → default-get-id.ts} +0 -4
  373. package/dist/assets/adapters/next/templates/init/utils/table/is-string.ts +3 -0
  374. package/dist/assets/adapters/next/templates/init/utils/upload/default-remote-accept.ts +1 -0
  375. package/dist/assets/adapters/next/templates/init/utils/upload/dropzone-accept.ts +1 -0
  376. package/dist/assets/adapters/next/templates/init/utils/upload/get-fallback-extension.ts +12 -0
  377. package/dist/assets/adapters/next/templates/init/utils/upload/get-remote-filename.ts +15 -0
  378. package/dist/assets/adapters/next/templates/init/utils/upload/is-accepted-remote-type.ts +25 -0
  379. package/dist/assets/adapters/next/templates/init/utils/upload/is-wildcard-accept.ts +4 -0
  380. package/dist/assets/adapters/next/templates/init/utils/upload/parse-accept-types.ts +7 -0
  381. package/dist/assets/adapters/next/templates/init/utils/upload/parse-dropzone-accept.ts +14 -0
  382. package/dist/assets/adapters/next/templates/init/utils/upload/remote-fetch-timeout-ms.ts +1 -0
  383. package/dist/assets/adapters/next/templates/init/utils/user/compare-user-sort-values.ts +4 -0
  384. package/dist/assets/adapters/next/templates/init/utils/user/get-user-initials.ts +11 -0
  385. package/dist/assets/adapters/next/templates/init/utils/user/get-user-sort-value.ts +8 -0
  386. package/dist/assets/adapters/next/templates/init/utils/user/{user.ts → get-users-page.ts} +3 -28
  387. package/dist/assets/adapters/next/templates/init/utils/user/normalize-user-filter-value.ts +3 -0
  388. package/dist/assets/adapters/next/templates/init/utils/validation/file-validation-config.ts +5 -0
  389. package/dist/assets/adapters/next/templates/init/utils/validation/file-validation-error.ts +4 -0
  390. package/dist/assets/adapters/next/templates/init/utils/validation/file-validation-result.ts +6 -0
  391. package/dist/assets/adapters/next/templates/init/utils/validation/format-file-size.ts +18 -0
  392. package/dist/assets/adapters/next/templates/init/utils/validation/is-file-type-allowed.ts +13 -0
  393. package/dist/assets/adapters/next/templates/init/utils/validation/is-valid-url.ts +8 -0
  394. package/dist/assets/adapters/next/templates/init/utils/validation/slugify.ts +9 -0
  395. package/dist/assets/adapters/next/templates/init/utils/validation/validate-files.ts +39 -0
  396. package/dist/assets/adapters/next/templates/init/utils/webhook/create-webhook-event-id.ts +5 -0
  397. package/dist/assets/adapters/next/templates/init/utils/webhook/generate-webhook-secret.ts +5 -0
  398. package/dist/assets/adapters/next/templates/init/utils/webhook/sign-webhook-payload.ts +5 -0
  399. package/dist/assets/shared-assets/react-admin/custom/content-editor/index.tsx +1 -1
  400. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-bubble-menu.tsx +3 -5
  401. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +1 -1
  402. package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +1 -1
  403. package/dist/assets/shared-assets/react-admin/custom/content-editor/slash-command-menu.tsx +1 -1
  404. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +6 -4
  405. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +11 -15
  406. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-extension/node-background-extension.ts +2 -1
  407. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node.tsx +3 -2
  408. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node.tsx +5 -3
  409. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/task-item-node/task-item-node-extension.tsx +4 -2
  410. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +1 -1
  411. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +1 -1
  412. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +1 -1
  413. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +1 -1
  414. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +1 -1
  415. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +10 -12
  416. package/dist/assets/shared-assets/react-admin/custom/media-field.tsx +1 -1
  417. package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -1
  418. package/dist/assets/shared-assets/react-admin/custom/upload-dropzone.tsx +1 -1
  419. package/dist/assets/shared-assets/react-admin/schema.json +8 -0
  420. package/dist/assets/shared-assets/react-admin/ui/sonner.tsx +3 -8
  421. package/dist/assets/shared-assets/react-admin/ui/spinner.tsx +1 -1
  422. package/dist/{chunk-SO2CAJFC.js → chunk-TIJEHWRF.js} +563 -239
  423. package/dist/chunk-TIJEHWRF.js.map +1 -0
  424. package/dist/cli.js +27996 -24856
  425. package/dist/cli.js.map +1 -1
  426. package/dist/read-namespaced-template-UXU7OCY3.js +13 -0
  427. package/dist/read-namespaced-template-UXU7OCY3.js.map +1 -0
  428. package/package.json +1 -1
  429. package/dist/assets/adapters/next/integrations/resend/actions/resend.ts +0 -138
  430. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/dispatch.ts +0 -134
  431. package/dist/assets/adapters/next/templates/init/utils/audit/audit.ts +0 -54
  432. package/dist/assets/adapters/next/templates/init/utils/auth/roles.ts +0 -17
  433. package/dist/assets/adapters/next/templates/init/utils/date/date.ts +0 -100
  434. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-rich-extensions.ts +0 -824
  435. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor.ts +0 -389
  436. package/dist/assets/adapters/next/templates/init/utils/editor/markdown.ts +0 -545
  437. package/dist/assets/adapters/next/templates/init/utils/editor/node-attrs.ts +0 -25
  438. package/dist/assets/adapters/next/templates/init/utils/editor/source-media.ts +0 -11
  439. package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls.ts +0 -91
  440. package/dist/assets/adapters/next/templates/init/utils/editor/table-bubble.ts +0 -172
  441. package/dist/assets/adapters/next/templates/init/utils/editor/tiptap.ts +0 -847
  442. package/dist/assets/adapters/next/templates/init/utils/email/form-delivery.ts +0 -104
  443. package/dist/assets/adapters/next/templates/init/utils/media/media.ts +0 -91
  444. package/dist/assets/adapters/next/templates/init/utils/upload/remote.ts +0 -55
  445. package/dist/assets/adapters/next/templates/init/utils/upload/upload.ts +0 -26
  446. package/dist/assets/adapters/next/templates/init/utils/validation/validation.ts +0 -102
  447. package/dist/assets/adapters/next/templates/init/utils/webhook/signature.ts +0 -13
  448. package/dist/chunk-SO2CAJFC.js.map +0 -1
  449. package/dist/template-reader-XMWPFYIK.js +0 -13
  450. package/dist/template-reader-XMWPFYIK.js.map +0 -1
@@ -1,79 +1,468 @@
1
- // adapters/next/template-reader.ts
1
+ // adapters/next/template-reader/read-template.ts
2
+ import fs3 from "fs";
3
+ import path3 from "path";
4
+
5
+ // utils/paths.ts
2
6
  import fs2 from "fs";
3
7
  import path2 from "path";
4
-
5
- // core-engine/utils/cli-root.ts
6
- import fs from "fs";
7
- import path from "path";
8
8
  import { fileURLToPath } from "url";
9
9
 
10
10
  // constants/cli.ts
11
11
  var CLI_PACKAGE_NAME = "betterstart-cli";
12
12
  var REDACTED = "[redacted]";
13
13
 
14
- // core-engine/utils/cli-root.ts
15
- function findCliPackage() {
16
- let dir = path.dirname(fileURLToPath(import.meta.url));
14
+ // constants/paths.ts
15
+ var BETTERSTART_DIR = ".betterstart";
16
+ var CONFIG_FILE_NAME = "betterstart.config.ts";
17
+ var DEVELOPMENT_ENV_FILES = [
18
+ ".env.development.local",
19
+ ".env.local",
20
+ ".env.development",
21
+ ".env"
22
+ ];
23
+ var LOCKFILE_MAP = {
24
+ "pnpm-lock.yaml": "pnpm",
25
+ "package-lock.json": "npm",
26
+ "yarn.lock": "yarn",
27
+ "bun.lockb": "bun",
28
+ "bun.lock": "bun"
29
+ };
30
+
31
+ // utils/files.ts
32
+ import crypto from "crypto";
33
+ import fs from "fs";
34
+ import path from "path";
35
+ import { parseEnv } from "util";
36
+
37
+ // utils/text.ts
38
+ import { stripVTControlCharacters } from "util";
39
+ function stripAnsi(text, options = {}) {
40
+ const stripped = stripVTControlCharacters(text);
41
+ return options.stripCarriageReturns ? stripped.replaceAll("\r", "") : stripped;
42
+ }
43
+ function toPascalCase(str) {
44
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join("");
45
+ }
46
+ function toCamelCase(str) {
47
+ const p = toPascalCase(str);
48
+ return p.charAt(0).toLowerCase() + p.slice(1);
49
+ }
50
+ function singularize(str) {
51
+ if (str.endsWith("ies")) return `${str.slice(0, -3)}y`;
52
+ if (str.endsWith("ves")) return `${str.slice(0, -3)}f`;
53
+ if (str.endsWith("sses") || str.endsWith("xes") || str.endsWith("ches") || str.endsWith("shes") || str.endsWith("zes"))
54
+ return str.slice(0, -2);
55
+ if (str.endsWith("s") && !str.endsWith("ss")) return str.slice(0, -1);
56
+ return str;
57
+ }
58
+ function pluralize(str) {
59
+ if (str.endsWith("s") && !str.endsWith("ss")) return str;
60
+ if (str.endsWith("y") && !["ay", "ey", "iy", "oy", "uy"].some((v) => str.endsWith(v)))
61
+ return `${str.slice(0, -1)}ies`;
62
+ if (str.endsWith("s") || str.endsWith("x") || str.endsWith("ch") || str.endsWith("sh"))
63
+ return `${str}es`;
64
+ return `${str}s`;
65
+ }
66
+ function toKebabCase(str) {
67
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
68
+ }
69
+ function toScreamingSnake(str) {
70
+ return str.replace(/([a-z])([A-Z])/g, "$1_$2").replace(/[\s-]+/g, "_").toUpperCase();
71
+ }
72
+ function quotePropertyName(name) {
73
+ return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`;
74
+ }
75
+ function humanizeName(name) {
76
+ return name.replace(/([a-z])([A-Z])/g, "$1 $2").replace(/[_-]+/g, " ").trim().split(/\s+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
77
+ }
78
+ function singularizeLabel(label) {
79
+ const words = label.split(" ");
80
+ const lastWord = words[words.length - 1];
81
+ words[words.length - 1] = singularize(lastWord.toLowerCase());
82
+ words[words.length - 1] = words[words.length - 1].charAt(0).toUpperCase() + words[words.length - 1].slice(1);
83
+ return words.join(" ");
84
+ }
85
+ function quoteLiteral(value, quote = "'") {
86
+ const escaped = value.replace(/\\/g, "\\\\").replace(new RegExp(escapeRegExp(quote), "g"), `\\${quote}`).replace(/\r/g, "\\r").replace(/\n/g, "\\n");
87
+ return `${quote}${escaped}${quote}`;
88
+ }
89
+ function escapeTemplateText(value) {
90
+ return value.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
91
+ }
92
+ function normalizeLineEndings(content) {
93
+ return content.replace(/\r\n/g, "\n");
94
+ }
95
+ function escapeRegExp(value) {
96
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
97
+ }
98
+ function hasConflictMarkers(content) {
99
+ return /^(<{7}|={7}|>{7})( |$)/m.test(content);
100
+ }
101
+ function splitLines(content) {
102
+ return normalizeLineEndings(content).split("\n");
103
+ }
104
+ function normalizeWhitespace(value) {
105
+ return value.trim().replace(/\s+/g, " ");
106
+ }
107
+ function escapeJsx(str) {
108
+ return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
109
+ }
110
+ function escapeAttribute(str) {
111
+ return escapeJsx(str).replace(/"/g, "&quot;");
112
+ }
113
+ function findNextNonEmptyLine(lines, startIndex) {
114
+ for (let i = startIndex; i < lines.length; i++) {
115
+ const trimmed = lines[i].trim();
116
+ if (trimmed !== "") return trimmed;
117
+ }
118
+ return null;
119
+ }
120
+ function levenshtein(a, b) {
121
+ const matrix = Array.from({ length: a.length + 1 }, () => new Array(b.length + 1).fill(0));
122
+ for (let i = 0; i <= a.length; i++) matrix[i][0] = i;
123
+ for (let j = 0; j <= b.length; j++) matrix[0][j] = j;
124
+ for (let i = 1; i <= a.length; i++) {
125
+ for (let j = 1; j <= b.length; j++) {
126
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
127
+ matrix[i][j] = Math.min(
128
+ matrix[i - 1][j] + 1,
129
+ matrix[i][j - 1] + 1,
130
+ matrix[i - 1][j - 1] + cost
131
+ );
132
+ }
133
+ }
134
+ return matrix[a.length][b.length];
135
+ }
136
+ function toTitleCase(value) {
137
+ return normalizeWhitespace(value).split(" ").map((word) => word ? `${word.charAt(0).toUpperCase()}${word.slice(1).toLowerCase()}` : word).join(" ");
138
+ }
139
+ function slugify(value) {
140
+ return value.trim().toLowerCase().replace(/['"]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").replace(/-+/g, "-");
141
+ }
142
+ function usesIdentifier(source, identifier) {
143
+ return new RegExp(`\\b${escapeRegExp(identifier)}\\b`).test(source);
144
+ }
145
+ function detectIndent(raw) {
146
+ const indentMatch = raw.match(/^[ \t]+(?=")/m);
147
+ return indentMatch?.[0] ?? 2;
148
+ }
149
+ function jsString(value) {
150
+ return JSON.stringify(value);
151
+ }
152
+ function safeIdentifier(value, fallback) {
153
+ const pascal = toPascalCase(value).replace(/[^A-Za-z0-9_$]/g, "");
154
+ const base = pascal ? `${pascal.charAt(0).toLowerCase()}${pascal.slice(1)}` : fallback;
155
+ return /^[A-Za-z_$]/.test(base) ? base : fallback;
156
+ }
157
+
158
+ // utils/files.ts
159
+ import fse from "fs-extra";
160
+ function findUpwards(startDir, visit) {
161
+ let dir = path.resolve(startDir);
17
162
  for (; ; ) {
18
- const pkgPath = path.join(dir, "package.json");
19
- if (fs.existsSync(pkgPath)) {
20
- try {
21
- const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
22
- if (pkg.name === CLI_PACKAGE_NAME) {
23
- return { dir, pkg };
163
+ const found = visit(dir);
164
+ if (found !== void 0) return found;
165
+ const parent = path.dirname(dir);
166
+ if (parent === dir) return void 0;
167
+ dir = parent;
168
+ }
169
+ }
170
+ function hashContent(content) {
171
+ return `sha256-${crypto.createHash("sha256").update(normalizeLineEndings(content)).digest("hex")}`;
172
+ }
173
+ function ensureDir(dirPath) {
174
+ fse.ensureDirSync(dirPath);
175
+ }
176
+ function safeWriteFile(filePath, content, force = false) {
177
+ if (!force && fs.existsSync(filePath)) {
178
+ return false;
179
+ }
180
+ ensureDir(path.dirname(filePath));
181
+ fs.writeFileSync(filePath, content, "utf-8");
182
+ return true;
183
+ }
184
+ function createGeneratedFile(filePath, content) {
185
+ return {
186
+ path: filePath.split(path.sep).join("/"),
187
+ content
188
+ };
189
+ }
190
+ function stripJsonComments(input) {
191
+ let result = "";
192
+ let i = 0;
193
+ while (i < input.length) {
194
+ if (input[i] === '"') {
195
+ let j = i + 1;
196
+ while (j < input.length) {
197
+ if (input[j] === "\\") {
198
+ j += 2;
199
+ continue;
200
+ }
201
+ if (input[j] === '"') {
202
+ j++;
203
+ break;
204
+ }
205
+ j++;
206
+ }
207
+ result += input.slice(i, j);
208
+ i = j;
209
+ } else if (input[i] === "/" && input[i + 1] === "/") {
210
+ const nl = input.indexOf("\n", i);
211
+ i = nl === -1 ? input.length : nl;
212
+ } else if (input[i] === "/" && input[i + 1] === "*") {
213
+ const end = input.indexOf("*/", i + 2);
214
+ i = end === -1 ? input.length : end + 2;
215
+ } else {
216
+ result += input[i];
217
+ i++;
218
+ }
219
+ }
220
+ return result;
221
+ }
222
+ function toStrictJson(input) {
223
+ return stripJsonComments(input).replace(/,\s*([\]}])/g, "$1");
224
+ }
225
+ function parseDotenvFile(filePath) {
226
+ if (!fs.existsSync(filePath)) return /* @__PURE__ */ new Map();
227
+ try {
228
+ const parsed = Object.entries(parseEnv(fs.readFileSync(filePath, "utf-8")));
229
+ return new Map(
230
+ parsed.filter((entry) => typeof entry[1] === "string")
231
+ );
232
+ } catch {
233
+ return /* @__PURE__ */ new Map();
234
+ }
235
+ }
236
+ function readEnvVar(cwd, key) {
237
+ return parseDotenvFile(path.join(cwd, ".env.local")).get(key);
238
+ }
239
+ function resolveProjectEnvVar(cwd, key) {
240
+ for (const envFile of DEVELOPMENT_ENV_FILES) {
241
+ const value = parseDotenvFile(path.join(cwd, envFile)).get(key)?.trim();
242
+ if (value) return { source: envFile, value };
243
+ }
244
+ return void 0;
245
+ }
246
+ function readProjectEnvVar(cwd, key) {
247
+ return resolveProjectEnvVar(cwd, key)?.value;
248
+ }
249
+ function appendEnvVars(cwd, sections, overwrite) {
250
+ const envPath = path.join(cwd, ".env.local");
251
+ let existing = fs.existsSync(envPath) ? fs.readFileSync(envPath, "utf-8") : "";
252
+ const existingKeys = new Set(
253
+ existing.split("\n").filter((line) => line.trim() && !line.trim().startsWith("#")).map((line) => line.split("=")[0]?.trim()).filter(Boolean)
254
+ );
255
+ const added = [];
256
+ const skipped = [];
257
+ const updated = [];
258
+ const lines = [];
259
+ if (overwrite) {
260
+ for (const section of sections) {
261
+ for (const v of section.vars) {
262
+ if (overwrite.has(v.key) && existingKeys.has(v.key)) {
263
+ const pattern = new RegExp(`^${v.key}=.*$`, "m");
264
+ const replacement = v.comment ? `${v.key}="${v.value}" # ${v.comment}` : `${v.key}="${v.value}"`;
265
+ existing = existing.replace(pattern, replacement);
266
+ updated.push(v.key);
24
267
  }
25
- } catch {
26
268
  }
27
269
  }
28
- const parentDir = path.dirname(dir);
29
- if (parentDir === dir) {
30
- return null;
270
+ }
271
+ if (existing.trim()) {
272
+ lines.push("");
273
+ }
274
+ for (const section of sections) {
275
+ const sectionVars = section.vars.filter((v) => {
276
+ if (existingKeys.has(v.key)) {
277
+ if (!updated.includes(v.key)) skipped.push(v.key);
278
+ return false;
279
+ }
280
+ added.push(v.key);
281
+ return true;
282
+ });
283
+ if (sectionVars.length === 0) continue;
284
+ lines.push(`# ${section.header}`);
285
+ for (const v of sectionVars) {
286
+ const line = v.comment ? `${v.key}="${v.value}" # ${v.comment}` : `${v.key}="${v.value}"`;
287
+ lines.push(line);
288
+ }
289
+ lines.push("");
290
+ }
291
+ if (added.length > 0 || updated.length > 0) {
292
+ const header = existing.trim() ? "" : "# ============================================\n# BetterStart Admin\n# ============================================\n";
293
+ const content = existing.trim() ? `${existing.trimEnd()}
294
+ ${lines.join("\n")}` : header + lines.join("\n");
295
+ fs.writeFileSync(envPath, content);
296
+ }
297
+ return { added, skipped, updated };
298
+ }
299
+ function removeEnvVars(cwd, keys) {
300
+ const envPath = path.join(cwd, ".env.local");
301
+ if (!fs.existsSync(envPath) || keys.length === 0) {
302
+ return [];
303
+ }
304
+ const keySet = new Set(keys);
305
+ const removed = [];
306
+ const filteredLines = fs.readFileSync(envPath, "utf-8").split("\n").filter((line) => {
307
+ const trimmed = line.trim();
308
+ if (!trimmed || trimmed.startsWith("#") || !trimmed.includes("=")) {
309
+ return true;
310
+ }
311
+ const [key] = trimmed.split("=");
312
+ const normalizedKey = key?.trim();
313
+ if (normalizedKey && keySet.has(normalizedKey)) {
314
+ removed.push(normalizedKey);
315
+ return false;
31
316
  }
32
- dir = parentDir;
317
+ return true;
318
+ });
319
+ fs.writeFileSync(envPath, `${filteredLines.join("\n").trimEnd()}
320
+ `, "utf-8");
321
+ return removed;
322
+ }
323
+ function captureFile(filePath) {
324
+ if (!fs.existsSync(filePath)) {
325
+ return { existed: false };
33
326
  }
327
+ return { existed: true, content: fs.readFileSync(filePath, "utf-8") };
328
+ }
329
+ function restoreFile(filePath, snapshot) {
330
+ if (snapshot.existed) {
331
+ fs.writeFileSync(filePath, snapshot.content ?? "", "utf-8");
332
+ return;
333
+ }
334
+ if (fs.existsSync(filePath)) {
335
+ fs.rmSync(filePath, { force: true });
336
+ }
337
+ }
338
+ function readNonEmptyEnvVar(cwd, key) {
339
+ const value = readProjectEnvVar(cwd, key)?.trim();
340
+ return value ? value : void 0;
341
+ }
342
+
343
+ // utils/paths.ts
344
+ function betterstartDir(cwd, ...segments) {
345
+ return path2.join(cwd, BETTERSTART_DIR, ...segments);
346
+ }
347
+ function toPosixPath(value) {
348
+ return value.replace(/\\/g, "/");
349
+ }
350
+ function trimDotSlash(value) {
351
+ return value.replace(/^[.][/\\]/, "");
352
+ }
353
+ function normalizePosixDir(value) {
354
+ return trimDotSlash(toPosixPath(value)).replace(/\/+$/, "");
355
+ }
356
+ function toProjectAbsolutePath(cwd, filePath) {
357
+ return path2.isAbsolute(filePath) ? filePath : path2.join(cwd, ...filePath.split("/"));
358
+ }
359
+ function readLocalProjectFile(cwd, filePath) {
360
+ const fullPath = toProjectAbsolutePath(cwd, filePath);
361
+ return fs2.existsSync(fullPath) ? fs2.readFileSync(fullPath, "utf-8") : null;
362
+ }
363
+ function isInsideDir(child, parent) {
364
+ const relative = path2.relative(parent, child);
365
+ return relative === "" || !relative.startsWith("..") && !path2.isAbsolute(relative);
366
+ }
367
+ function removePath(cwd, filePath) {
368
+ const fullPath = toProjectAbsolutePath(cwd, filePath);
369
+ const existed = fs2.existsSync(fullPath);
370
+ fs2.rmSync(fullPath, { recursive: true, force: true });
371
+ return existed;
372
+ }
373
+ function cleanupEmptyDirs(cwd, deletedPaths, stopRoots) {
374
+ const projectRoot = path2.resolve(cwd);
375
+ const stops = /* @__PURE__ */ new Set([projectRoot, ...stopRoots]);
376
+ for (const deletedPath of deletedPaths) {
377
+ let currentDir = path2.dirname(toProjectAbsolutePath(cwd, deletedPath));
378
+ while (isInsideDir(currentDir, projectRoot) && !stops.has(currentDir)) {
379
+ if (!fs2.existsSync(currentDir)) {
380
+ currentDir = path2.dirname(currentDir);
381
+ continue;
382
+ }
383
+ if (fs2.readdirSync(currentDir).length > 0) {
384
+ break;
385
+ }
386
+ fs2.rmdirSync(currentDir);
387
+ currentDir = path2.dirname(currentDir);
388
+ }
389
+ }
390
+ }
391
+ function findCliPackage() {
392
+ const start = path2.dirname(fileURLToPath(import.meta.url));
393
+ return findUpwards(start, (dir) => {
394
+ const pkgPath = path2.join(dir, "package.json");
395
+ if (!fs2.existsSync(pkgPath)) return void 0;
396
+ try {
397
+ const pkg = JSON.parse(fs2.readFileSync(pkgPath, "utf-8"));
398
+ return pkg.name === CLI_PACKAGE_NAME ? { dir, pkg } : void 0;
399
+ } catch {
400
+ return void 0;
401
+ }
402
+ }) ?? null;
34
403
  }
35
404
  function findCliRoot() {
36
405
  const found = findCliPackage();
37
406
  if (found) {
38
407
  return found.dir;
39
408
  }
40
- return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
409
+ return path2.resolve(path2.dirname(fileURLToPath(import.meta.url)), "..", "..");
41
410
  }
42
411
  function getCurrentCliVersion() {
43
412
  return findCliPackage()?.pkg.version ?? "0.0.0";
44
413
  }
45
414
  function resolveCliAssetPath(...segments) {
46
415
  const root = findCliRoot();
47
- const builtPath = path.join(root, "dist", "assets", ...segments);
48
- if (fs.existsSync(builtPath)) {
416
+ const builtPath = path2.join(root, "dist", "assets", ...segments);
417
+ if (fs2.existsSync(builtPath)) {
49
418
  return builtPath;
50
419
  }
51
- return path.join(root, ...segments);
420
+ return path2.join(root, ...segments);
421
+ }
422
+ function resolveCommandCwd(command) {
423
+ const options = command.opts();
424
+ return typeof options.cwd === "string" ? path2.resolve(options.cwd) : process.cwd();
52
425
  }
53
426
 
54
- // constants/patterns.ts
55
- var ANSI_ESCAPE_PATTERN = /\u001B\[[0-?]*[ -/]*[@-~]/g;
56
- var REMOVABLE_NAMESPACE_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
57
- var SCHEMA_NAME_PATTERN = /^[a-z][a-zA-Z0-9-]*$/;
58
- var NAMESPACE_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
59
- var MODULE_SPECIFIER_PATTERN = /(\bfrom\s*|\bimport\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)(['"])([^'"\n]+)\2/g;
60
- var EXTERNAL_PACKAGE_PATTERN = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(?:\/[^'"]*)?$/;
61
- var DEV_PORT_FLAG_PATTERN = /(?:^|\s)(?:--port(?:=|\s+)|-p(?:=|\s+)?)(\d+)(?=\s|$)/;
62
- var DEV_PORT_ENV_PATTERN = /(?:^|\s)PORT=(\d+)(?=\s|$)/;
63
- var LOCAL_PROTOCOL_PATTERN = /^(workspace|link|file|portal):/;
64
- var CONFIG_IMPORT_PATTERN = /^import\s+\{[^}]*\bdefineConfig\b[^}]*\}\s+from\s+['"]betterstart-cli['"];?[^\S\n]*$/m;
65
- var CONFIG_OBJECT_PATTERNS = [
66
- /\b(?:const|let|var)\s+\w+\s*:\s*NextConfig\s*=\s*\{/g,
67
- /\b(?:const|let|var)\s+nextConfig\s*=\s*\{/g,
68
- /\b(?:const|let|var)\s+\w+\s*:\s*NextConfig\s*=\s*(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g,
69
- /\b(?:const|let|var)\s+nextConfig\s*=\s*(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g,
70
- /export\s+default\s+\{/g,
71
- /export\s+default\s+(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g,
72
- /module\.exports\s*=\s*\{/g,
73
- /module\.exports\s*=\s*(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g
74
- ];
75
- var ACCEPT_TERMS_URL_PATTERN = /https:\/\/vercel\.com\/\S+\/integrations\/accept-terms\/\S+/i;
76
- var TERMS_ACCEPTED_PATTERN = /terms accepted/i;
427
+ // adapters/next/template-reader/read-template.ts
428
+ function readTemplate(relativePath) {
429
+ return fs3.readFileSync(
430
+ path3.join(resolveCliAssetPath("adapters", "next", "templates", "init"), relativePath),
431
+ "utf-8"
432
+ );
433
+ }
434
+
435
+ // adapters/next/config/namespace/protect-admin-role-literals.ts
436
+ function protectAdminRoleLiterals(content) {
437
+ const protectedValues = [
438
+ "UserRole.ADMIN",
439
+ "'admin'",
440
+ '"admin"',
441
+ "`admin`",
442
+ ">Admin</SelectItem>",
443
+ "Manage admin users and roles"
444
+ ];
445
+ const replacements = [];
446
+ let protectedContent = content;
447
+ for (const [index, value] of protectedValues.entries()) {
448
+ if (!protectedContent.includes(value)) {
449
+ continue;
450
+ }
451
+ const token = `__BETTERSTART_NAMESPACE_PROTECTED_${index}__`;
452
+ protectedContent = protectedContent.replaceAll(value, token);
453
+ replacements.push([token, value]);
454
+ }
455
+ return {
456
+ content: protectedContent,
457
+ restore(value) {
458
+ let restored = value;
459
+ for (const [token, original] of replacements) {
460
+ restored = restored.replaceAll(token, original);
461
+ }
462
+ return restored;
463
+ }
464
+ };
465
+ }
77
466
 
78
467
  // constants/scaffolding.ts
79
468
  var DEFAULT_ADMIN_NAMESPACE = "admin";
@@ -157,122 +546,7 @@ var R2_ENV_KEYS = [
157
546
  "BETTERSTART_R2_PUBLIC_URL"
158
547
  ];
159
548
 
160
- // core-engine/utils/string.ts
161
- function toPascalCase(str) {
162
- return str.replace(/([a-z])([A-Z])/g, "$1-$2").split(/[-_\s]+/).map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join("");
163
- }
164
- function toCamelCase(str) {
165
- const p = toPascalCase(str);
166
- return p.charAt(0).toLowerCase() + p.slice(1);
167
- }
168
- function singularize(str) {
169
- if (str.endsWith("ies")) return `${str.slice(0, -3)}y`;
170
- if (str.endsWith("ves")) return `${str.slice(0, -3)}f`;
171
- if (str.endsWith("sses") || str.endsWith("xes") || str.endsWith("ches") || str.endsWith("shes") || str.endsWith("zes"))
172
- return str.slice(0, -2);
173
- if (str.endsWith("s") && !str.endsWith("ss")) return str.slice(0, -1);
174
- return str;
175
- }
176
- function pluralize(str) {
177
- if (str.endsWith("s") && !str.endsWith("ss")) return str;
178
- if (str.endsWith("y") && !["ay", "ey", "iy", "oy", "uy"].some((v) => str.endsWith(v)))
179
- return `${str.slice(0, -1)}ies`;
180
- if (str.endsWith("s") || str.endsWith("x") || str.endsWith("ch") || str.endsWith("sh"))
181
- return `${str}es`;
182
- return `${str}s`;
183
- }
184
- function toKebabCase(str) {
185
- return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase();
186
- }
187
- function toScreamingSnake(str) {
188
- return str.replace(/([a-z])([A-Z])/g, "$1_$2").replace(/[\s-]+/g, "_").toUpperCase();
189
- }
190
- function quotePropertyName(name) {
191
- return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`;
192
- }
193
- function singularizeLabel(label) {
194
- const words = label.split(" ");
195
- const lastWord = words[words.length - 1];
196
- words[words.length - 1] = singularize(lastWord.toLowerCase());
197
- words[words.length - 1] = words[words.length - 1].charAt(0).toUpperCase() + words[words.length - 1].slice(1);
198
- return words.join(" ");
199
- }
200
- function singleQuote(value) {
201
- return `'${value.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`;
202
- }
203
- function escapeTemplateText(value) {
204
- return value.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$\{/g, "\\${");
205
- }
206
-
207
- // adapters/next/config/namespace.ts
208
- function validateAdminNamespace(value) {
209
- const segment = value.trim();
210
- if (!NAMESPACE_PATTERN.test(segment)) {
211
- throw new Error(
212
- 'Namespace must be one lowercase kebab-case segment starting with a letter, for example "admin" or "admin-panel".'
213
- );
214
- }
215
- return segment;
216
- }
217
- function validateAdminDashboardPath(value) {
218
- const input = value.trim();
219
- const segment = input.startsWith("/") ? input.slice(1) : input;
220
- if (input.startsWith("/") && input !== `/${segment}`) {
221
- throw new Error(
222
- 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example "/admin" or "/admin-panel".'
223
- );
224
- }
225
- try {
226
- return validateAdminNamespace(segment);
227
- } catch {
228
- throw new Error(
229
- 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example "/admin" or "/admin-panel".'
230
- );
231
- }
232
- }
233
- function resolveAdminNamespace(value = DEFAULT_ADMIN_NAMESPACE) {
234
- const segment = validateAdminNamespace(value);
235
- const pascal = toPascalCase(segment);
236
- return {
237
- segment,
238
- alias: `@${segment}`,
239
- camel: toCamelCase(segment),
240
- pascal,
241
- screaming: toScreamingSnake(segment),
242
- routePath: `/${segment}`,
243
- apiPath: `/api/${segment}`,
244
- cssRootClass: `${segment}-root`,
245
- globalsFile: `${segment}-globals.css`,
246
- routeGroup: `(${segment})`
247
- };
248
- }
249
- function deriveNamespacePaths(namespaceValue, srcDir) {
250
- const namespace = resolveAdminNamespace(namespaceValue);
251
- const appBase = srcDir ? "./src/app" : "./app";
252
- return {
253
- admin: `./${namespace.segment}`,
254
- schemas: `./${namespace.segment}/schemas`,
255
- pages: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(authenticated)`,
256
- login: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(auth)/login`,
257
- api: `${appBase}/${namespace.routeGroup}/api/${namespace.segment}`
258
- };
259
- }
260
- function deriveMigrationsDir(namespaceValue) {
261
- const namespace = resolveAdminNamespace(namespaceValue);
262
- return `./${namespace.segment}/lib/db/migrations`;
263
- }
264
- function replaceAdminDashToken(value, namespace) {
265
- return value.replaceAll("admin-", `${namespace.segment}-`);
266
- }
267
- function replaceAdminScreamingToken(value, namespace) {
268
- return value.replaceAll("ADMIN_", `${namespace.screaming}_`);
269
- }
270
- function replaceAdminPascalToken(value, namespace) {
271
- return value.replaceAll("Admin", namespace.pascal);
272
- }
273
- function replaceAdminCamelToken(value, namespace) {
274
- return value.replace(/\badmin(?=[A-Z])/g, namespace.camel);
275
- }
549
+ // adapters/next/config/namespace/protect-existing-namespace-literals.ts
276
550
  function protectExistingNamespaceLiterals(value, namespace) {
277
551
  if (namespace.segment === DEFAULT_ADMIN_NAMESPACE) {
278
552
  return {
@@ -318,16 +592,31 @@ function protectExistingNamespaceLiterals(value, namespace) {
318
592
  }
319
593
  };
320
594
  }
321
- function applyAdminNamespaceToPath(filePath, namespaceValue) {
322
- const namespace = resolveAdminNamespace(namespaceValue);
323
- const canonicalPath = filePath.replaceAll("lib/actions/auth/middleware.ts", "lib/actions/auth/session.ts").replaceAll("lib/actions/auth/auth.ts", "lib/actions/auth/server.ts").replaceAll("lib/actions/r2/r2.ts", "lib/actions/r2/provider.ts").replaceAll("lib/actions/resend/resend.ts", "lib/actions/resend/provider.ts").replaceAll(
324
- "lib/actions/mailchimp/mailchimp.ts",
325
- "lib/actions/mailchimp/add-to-mailchimp-audience.ts"
326
- ).replaceAll("(admin)", namespace.routeGroup).replace(/@admin(?=\/|$)/g, namespace.alias).replace(/\/api\/admin(?=\/|$)/g, namespace.apiPath).replace(/(^|\/)admin(?=\/|$)/g, `$1${namespace.segment}`);
327
- const protectedNamespace = protectExistingNamespaceLiterals(canonicalPath, namespace);
328
- const namespacedPath = replaceAdminDashToken(protectedNamespace.value, namespace);
329
- return protectedNamespace.restore(namespacedPath);
330
- }
595
+
596
+ // constants/patterns.ts
597
+ var REMOVABLE_NAMESPACE_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
598
+ var SCHEMA_NAME_PATTERN = /^[a-z][a-zA-Z0-9-]*$/;
599
+ var NAMESPACE_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;
600
+ var MODULE_SPECIFIER_PATTERN = /(\bfrom\s*|\bimport\s*|\brequire\s*\(\s*|\bimport\s*\(\s*)(['"])([^'"\n]+)\2/g;
601
+ var EXTERNAL_PACKAGE_PATTERN = /^(?:@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*(?:\/[^'"]*)?$/;
602
+ var DEV_PORT_FLAG_PATTERN = /(?:^|\s)(?:--port(?:=|\s+)|-p(?:=|\s+)?)(\d+)(?=\s|$)/;
603
+ var DEV_PORT_ENV_PATTERN = /(?:^|\s)PORT=(\d+)(?=\s|$)/;
604
+ var LOCAL_PROTOCOL_PATTERN = /^(workspace|link|file|portal):/;
605
+ var CONFIG_IMPORT_PATTERN = /^import\s+\{[^}]*\bdefineConfig\b[^}]*\}\s+from\s+['"]betterstart-cli['"];?[^\S\n]*$/m;
606
+ var CONFIG_OBJECT_PATTERNS = [
607
+ /\b(?:const|let|var)\s+\w+\s*:\s*NextConfig\s*=\s*\{/g,
608
+ /\b(?:const|let|var)\s+nextConfig\s*=\s*\{/g,
609
+ /\b(?:const|let|var)\s+\w+\s*:\s*NextConfig\s*=\s*(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g,
610
+ /\b(?:const|let|var)\s+nextConfig\s*=\s*(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g,
611
+ /export\s+default\s+\{/g,
612
+ /export\s+default\s+(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g,
613
+ /module\.exports\s*=\s*\{/g,
614
+ /module\.exports\s*=\s*(?:[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(\s*)+\{/g
615
+ ];
616
+ var ACCEPT_TERMS_URL_PATTERN = /https:\/\/vercel\.com\/\S+\/integrations\/accept-terms\/\S+/i;
617
+ var TERMS_ACCEPTED_PATTERN = /terms accepted/i;
618
+
619
+ // adapters/next/config/namespace/is-external-module-specifier.ts
331
620
  function isExternalModuleSpecifier(specifier) {
332
621
  if (specifier.startsWith(".") || specifier.startsWith("/")) {
333
622
  return false;
@@ -337,6 +626,8 @@ function isExternalModuleSpecifier(specifier) {
337
626
  }
338
627
  return EXTERNAL_PACKAGE_PATTERN.test(specifier);
339
628
  }
629
+
630
+ // adapters/next/config/namespace/protect-external-module-specifiers.ts
340
631
  function protectExternalModuleSpecifiers(content) {
341
632
  const replacements = [];
342
633
  const protectedContent = content.replace(
@@ -361,36 +652,57 @@ function protectExternalModuleSpecifiers(content) {
361
652
  }
362
653
  };
363
654
  }
364
- function protectAdminRoleLiterals(content) {
365
- const protectedValues = [
366
- "UserRole.ADMIN",
367
- "'admin'",
368
- '"admin"',
369
- "`admin`",
370
- ">Admin</SelectItem>",
371
- "Manage admin users and roles"
372
- ];
373
- const replacements = [];
374
- let protectedContent = content;
375
- for (const [index, value] of protectedValues.entries()) {
376
- if (!protectedContent.includes(value)) {
377
- continue;
378
- }
379
- const token = `__BETTERSTART_NAMESPACE_PROTECTED_${index}__`;
380
- protectedContent = protectedContent.replaceAll(value, token);
381
- replacements.push([token, value]);
655
+
656
+ // adapters/next/config/namespace/replace-admin-camel-token.ts
657
+ function replaceAdminCamelToken(value, namespace) {
658
+ return value.replace(/\badmin(?=[A-Z])/g, namespace.camel);
659
+ }
660
+
661
+ // adapters/next/config/namespace/replace-admin-dash-token.ts
662
+ function replaceAdminDashToken(value, namespace) {
663
+ return value.replaceAll("admin-", `${namespace.segment}-`);
664
+ }
665
+
666
+ // adapters/next/config/namespace/replace-admin-pascal-token.ts
667
+ function replaceAdminPascalToken(value, namespace) {
668
+ return value.replaceAll("Admin", namespace.pascal);
669
+ }
670
+
671
+ // adapters/next/config/namespace/replace-admin-screaming-token.ts
672
+ function replaceAdminScreamingToken(value, namespace) {
673
+ return value.replaceAll("ADMIN_", `${namespace.screaming}_`);
674
+ }
675
+
676
+ // adapters/next/config/namespace/validate-admin-namespace.ts
677
+ function validateAdminNamespace(value) {
678
+ const segment = value.trim();
679
+ if (!NAMESPACE_PATTERN.test(segment)) {
680
+ throw new Error(
681
+ 'Namespace must be one lowercase kebab-case segment starting with a letter, for example "admin" or "admin-panel".'
682
+ );
382
683
  }
684
+ return segment;
685
+ }
686
+
687
+ // adapters/next/config/namespace/resolve-admin-namespace.ts
688
+ function resolveAdminNamespace(value = DEFAULT_ADMIN_NAMESPACE) {
689
+ const segment = validateAdminNamespace(value);
690
+ const pascal = toPascalCase(segment);
383
691
  return {
384
- content: protectedContent,
385
- restore(value) {
386
- let restored = value;
387
- for (const [token, original] of replacements) {
388
- restored = restored.replaceAll(token, original);
389
- }
390
- return restored;
391
- }
692
+ segment,
693
+ alias: `@${segment}`,
694
+ camel: toCamelCase(segment),
695
+ pascal,
696
+ screaming: toScreamingSnake(segment),
697
+ routePath: `/${segment}`,
698
+ apiPath: `/api/${segment}`,
699
+ cssRootClass: `${segment}-root`,
700
+ globalsFile: `${segment}-globals.css`,
701
+ routeGroup: `(${segment})`
392
702
  };
393
703
  }
704
+
705
+ // adapters/next/config/namespace/apply-admin-namespace-to-content.ts
394
706
  function applyAdminNamespaceToContent(content, namespaceValue) {
395
707
  const namespace = resolveAdminNamespace(namespaceValue);
396
708
  const { content: externalSafeContent, restore: restoreExternalModules } = protectExternalModuleSpecifiers(content);
@@ -416,42 +728,64 @@ function applyAdminNamespaceToContent(content, namespaceValue) {
416
728
  return restoreExternalModules(restore(protectedNamespace.restore(namespacedContent)));
417
729
  }
418
730
 
419
- // adapters/next/template-reader.ts
420
- function readTemplate(relativePath) {
421
- return fs2.readFileSync(
422
- path2.join(resolveCliAssetPath("adapters", "next", "templates", "init"), relativePath),
423
- "utf-8"
424
- );
425
- }
426
- function applyNextCacheApiForVersion(content, nextMajorVersion) {
427
- if (nextMajorVersion >= 16) {
428
- return content;
429
- }
430
- return content.replace(
431
- /import \{ cacheLife, cacheTag \} from 'next\/cache'\n/g,
432
- "import { unstable_cacheTag as cacheTag } from 'next/cache'\n"
433
- ).replace(/\n {2}cacheLife\('max'\)/g, "").replace(
434
- /import \{ updateTag \} from 'next\/cache'\n/g,
435
- "import { revalidateTag } from 'next/cache'\n"
436
- ).replace(/revalidateTag\(([^,\n]+), \{ expire: 0 \}\)/g, "revalidateTag($1)").replace(/\bupdateTag\(/g, "revalidateTag(");
437
- }
438
- function readNamespacedTemplate(relativePath, namespace) {
439
- return applyAdminNamespaceToContent(readTemplate(relativePath), namespace);
440
- }
441
- function namespacedTemplatePath(relativePath, namespace) {
442
- return applyAdminNamespaceToPath(relativePath, namespace);
443
- }
444
-
445
731
  export {
732
+ BETTERSTART_DIR,
733
+ CONFIG_FILE_NAME,
734
+ LOCKFILE_MAP,
735
+ CLI_PACKAGE_NAME,
736
+ REDACTED,
737
+ stripAnsi,
446
738
  toPascalCase,
447
739
  toCamelCase,
448
740
  singularize,
449
741
  pluralize,
450
742
  toKebabCase,
451
743
  quotePropertyName,
744
+ humanizeName,
452
745
  singularizeLabel,
453
- singleQuote,
746
+ quoteLiteral,
454
747
  escapeTemplateText,
748
+ normalizeLineEndings,
749
+ escapeRegExp,
750
+ hasConflictMarkers,
751
+ splitLines,
752
+ normalizeWhitespace,
753
+ escapeJsx,
754
+ escapeAttribute,
755
+ findNextNonEmptyLine,
756
+ levenshtein,
757
+ toTitleCase,
758
+ slugify,
759
+ usesIdentifier,
760
+ detectIndent,
761
+ jsString,
762
+ safeIdentifier,
763
+ findUpwards,
764
+ hashContent,
765
+ ensureDir,
766
+ safeWriteFile,
767
+ createGeneratedFile,
768
+ toStrictJson,
769
+ parseDotenvFile,
770
+ readEnvVar,
771
+ resolveProjectEnvVar,
772
+ readProjectEnvVar,
773
+ appendEnvVars,
774
+ removeEnvVars,
775
+ captureFile,
776
+ restoreFile,
777
+ readNonEmptyEnvVar,
778
+ betterstartDir,
779
+ toPosixPath,
780
+ trimDotSlash,
781
+ normalizePosixDir,
782
+ toProjectAbsolutePath,
783
+ readLocalProjectFile,
784
+ removePath,
785
+ cleanupEmptyDirs,
786
+ getCurrentCliVersion,
787
+ resolveCliAssetPath,
788
+ resolveCommandCwd,
455
789
  DEFAULT_ADMIN_NAMESPACE,
456
790
  ADMIN_THEME_BLOCK,
457
791
  ADMIN_SHADOW_INPUT_UTILITY,
@@ -465,7 +799,6 @@ export {
465
799
  TIPTAP_CONTENT_EDITOR_DIRECTORIES,
466
800
  RAILWAY_BUCKET_ENV_KEYS,
467
801
  R2_ENV_KEYS,
468
- ANSI_ESCAPE_PATTERN,
469
802
  REMOVABLE_NAMESPACE_PATTERN,
470
803
  SCHEMA_NAME_PATTERN,
471
804
  DEV_PORT_FLAG_PATTERN,
@@ -476,19 +809,10 @@ export {
476
809
  ACCEPT_TERMS_URL_PATTERN,
477
810
  TERMS_ACCEPTED_PATTERN,
478
811
  validateAdminNamespace,
479
- validateAdminDashboardPath,
480
812
  resolveAdminNamespace,
481
- deriveNamespacePaths,
482
- deriveMigrationsDir,
483
- applyAdminNamespaceToPath,
484
- applyAdminNamespaceToContent,
485
- CLI_PACKAGE_NAME,
486
- REDACTED,
487
- getCurrentCliVersion,
488
- resolveCliAssetPath,
489
813
  readTemplate,
490
- applyNextCacheApiForVersion,
491
- readNamespacedTemplate,
492
- namespacedTemplatePath
814
+ protectExistingNamespaceLiterals,
815
+ replaceAdminDashToken,
816
+ applyAdminNamespaceToContent
493
817
  };
494
- //# sourceMappingURL=chunk-SO2CAJFC.js.map
818
+ //# sourceMappingURL=chunk-TIJEHWRF.js.map