betterstart-cli 0.0.100 → 0.0.102

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 (417) hide show
  1. package/README.md +1 -5
  2. package/dist/assets/adapters/next/integrations/_shared/actions/object-key.ts +1 -4
  3. package/dist/assets/adapters/next/integrations/_shared/actions/sanitize-filename.ts +3 -0
  4. package/dist/assets/adapters/next/integrations/r2/actions/get-client.ts +22 -0
  5. package/dist/assets/adapters/next/integrations/r2/actions/get-config.ts +9 -0
  6. package/dist/assets/adapters/next/integrations/r2/actions/{r2.ts → provider.ts} +3 -31
  7. package/dist/assets/adapters/next/integrations/r2/integration.ts +13 -1
  8. package/dist/assets/adapters/next/integrations/railway-bucket/actions/get-client.ts +20 -0
  9. package/dist/assets/adapters/next/integrations/railway-bucket/actions/get-config.ts +10 -0
  10. package/dist/assets/adapters/next/integrations/railway-bucket/actions/{railway-bucket.ts → provider.ts} +4 -34
  11. package/dist/assets/adapters/next/integrations/railway-bucket/actions/stable-read-url.ts +3 -0
  12. package/dist/assets/adapters/next/integrations/railway-bucket/integration.ts +17 -1
  13. package/dist/assets/adapters/next/integrations/resend/actions/escape-html.ts +8 -0
  14. package/dist/assets/adapters/next/integrations/resend/actions/get-env-value.ts +4 -0
  15. package/dist/assets/adapters/next/integrations/resend/actions/get-from-address.ts +5 -0
  16. package/dist/assets/adapters/next/integrations/resend/actions/get-resend-client.ts +19 -0
  17. package/dist/assets/adapters/next/integrations/resend/actions/html-to-text.ts +16 -0
  18. package/dist/assets/adapters/next/integrations/resend/actions/is-configured.ts +6 -0
  19. package/dist/assets/adapters/next/integrations/resend/actions/provider.ts +17 -0
  20. package/dist/assets/adapters/next/integrations/resend/actions/render-password-reset-email.ts +25 -0
  21. package/dist/assets/adapters/next/integrations/resend/actions/send-email.ts +43 -0
  22. package/dist/assets/adapters/next/integrations/resend/integration.ts +33 -1
  23. package/dist/assets/adapters/next/integrations/vercel-blob/actions/get-token.ts +3 -0
  24. package/dist/assets/adapters/next/integrations/vercel-blob/actions/{vercel-blob.ts → provider.ts} +1 -4
  25. package/dist/assets/adapters/next/integrations/vercel-blob/integration.ts +9 -1
  26. package/dist/assets/adapters/next/templates/init/api/storage-read-route.ts +2 -14
  27. package/dist/assets/adapters/next/templates/init/api/upload-route.ts +6 -5
  28. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-version-item.tsx +1 -1
  29. package/dist/assets/adapters/next/templates/init/components/shared/entity-versions/entity-versions-current-row.tsx +1 -1
  30. package/dist/assets/adapters/next/templates/init/components/shared/media/media-url-importer.tsx +3 -2
  31. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-blockquote.ts +6 -8
  32. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-code-block.ts +6 -8
  33. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-color-highlight.ts +6 -10
  34. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-media-insertion.ts +4 -6
  35. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-slash-menu.ts +4 -6
  36. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-source-mode.tsx +22 -23
  37. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor-table-add-controls.ts +8 -9
  38. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-content-editor.ts +16 -22
  39. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-heading.ts +6 -8
  40. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-link-popover.ts +3 -1
  41. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list-dropdown-menu.ts +1 -1
  42. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-list.ts +6 -8
  43. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-mark.ts +2 -1
  44. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-table-button.ts +1 -1
  45. package/dist/assets/adapters/next/templates/init/hooks/content-editor/use-undo-redo.ts +1 -1
  46. package/dist/assets/adapters/next/templates/init/hooks/use-table-utils.ts +2 -1
  47. package/dist/assets/adapters/next/templates/init/hooks/use-upload.ts +3 -3
  48. package/dist/assets/adapters/next/templates/init/lib/actions/audit/clamp-page.ts +6 -0
  49. package/dist/assets/adapters/next/templates/init/lib/actions/audit/cleanup-audit-logs.ts +4 -9
  50. package/dist/assets/adapters/next/templates/init/lib/actions/audit/first-header-value.ts +3 -0
  51. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-audit-log-order-by.ts +25 -0
  52. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-audit-logs.ts +2 -109
  53. package/dist/assets/adapters/next/templates/init/lib/actions/audit/{request-metadata.ts → get-audit-request-metadata.ts} +3 -7
  54. package/dist/assets/adapters/next/templates/init/lib/actions/audit/get-retention-days.ts +5 -0
  55. package/dist/assets/adapters/next/templates/init/lib/actions/audit/max-ip-length.ts +1 -0
  56. package/dist/assets/adapters/next/templates/init/lib/actions/audit/max-user-agent-length.ts +1 -0
  57. package/dist/assets/adapters/next/templates/init/lib/actions/audit/normalize-changed-fields.ts +3 -0
  58. package/dist/assets/adapters/next/templates/init/lib/actions/audit/normalize-page-size.ts +12 -0
  59. package/dist/assets/adapters/next/templates/init/lib/actions/audit/query-audit-logs.ts +71 -0
  60. package/dist/assets/adapters/next/templates/init/lib/actions/audit/record-audit-event.ts +3 -6
  61. package/dist/assets/adapters/next/templates/init/lib/actions/auth/middleware.ts +2 -1
  62. package/dist/assets/adapters/next/templates/init/lib/actions/email/form-email-delivery-input.ts +1 -0
  63. package/dist/assets/adapters/next/templates/init/lib/actions/email/queued-form-email.ts +6 -0
  64. package/dist/assets/adapters/next/templates/init/lib/actions/email/{form-delivery.ts → send-form-emails.ts} +7 -34
  65. package/dist/assets/adapters/next/templates/init/lib/actions/email/send-queued-email.ts +19 -0
  66. package/dist/assets/adapters/next/templates/init/lib/actions/forms/upsert-form-settings.ts +1 -1
  67. package/dist/assets/adapters/next/templates/init/lib/actions/media/clamp-media-page-size.ts +9 -0
  68. package/dist/assets/adapters/next/templates/init/lib/actions/media/clamp-media-page.ts +9 -0
  69. package/dist/assets/adapters/next/templates/init/lib/actions/media/create-media.ts +3 -3
  70. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media-bulk.ts +2 -2
  71. package/dist/assets/adapters/next/templates/init/lib/actions/media/delete-media.ts +2 -2
  72. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-id.ts +2 -1
  73. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media-by-ids.ts +2 -1
  74. package/dist/assets/adapters/next/templates/init/lib/actions/media/get-media.ts +5 -21
  75. package/dist/assets/adapters/next/templates/init/lib/actions/media/update-media.ts +3 -3
  76. package/dist/assets/adapters/next/templates/init/lib/actions/profile/change-own-password.ts +2 -2
  77. package/dist/assets/adapters/next/templates/init/lib/actions/profile/update-email.ts +2 -2
  78. package/dist/assets/adapters/next/templates/init/lib/actions/storage/local.ts +1 -1
  79. package/dist/assets/adapters/next/templates/init/lib/actions/upload/upload-media-from-url.ts +4 -6
  80. package/dist/assets/adapters/next/templates/init/lib/actions/users/change-user-password.ts +2 -2
  81. package/dist/assets/adapters/next/templates/init/lib/actions/users/create-user.ts +3 -3
  82. package/dist/assets/adapters/next/templates/init/lib/actions/users/delete-user.ts +2 -2
  83. package/dist/assets/adapters/next/templates/init/lib/actions/users/get-cached-users.ts +40 -0
  84. package/dist/assets/adapters/next/templates/init/lib/actions/users/get-users.ts +2 -40
  85. package/dist/assets/adapters/next/templates/init/lib/actions/users/update-user-role.ts +2 -2
  86. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/create-webhook.ts +2 -2
  87. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/delete-webhook.ts +1 -1
  88. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/deliver-to-endpoint.ts +55 -0
  89. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/deliver-webhook-event.ts +19 -0
  90. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/emit-webhook-event.ts +22 -0
  91. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/entity-event-payload.ts +20 -0
  92. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-deliveries.ts +1 -1
  93. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-secret.ts +1 -1
  94. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhook-subscriptions.ts +2 -18
  95. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/get-webhooks.ts +1 -1
  96. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/prune-webhook-deliveries.ts +26 -0
  97. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/read-webhook-subscriptions.ts +18 -0
  98. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/record-webhook-delivery.ts +24 -0
  99. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/regenerate-webhook-secret.ts +2 -2
  100. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/{register.ts → register-webhook-hooks.ts} +2 -14
  101. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/send-test-webhook.ts +3 -2
  102. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/update-webhook.ts +1 -1
  103. package/dist/assets/adapters/next/templates/init/lib/lifecycle-hooks/register.ts +1 -1
  104. package/dist/assets/adapters/next/templates/init/pages/account-shell-rsc.tsx +1 -1
  105. package/dist/assets/adapters/next/templates/init/pages/login-form.tsx +1 -1
  106. package/dist/assets/adapters/next/templates/init/pages/login-page-rsc.tsx +1 -1
  107. package/dist/assets/adapters/next/templates/init/pages/users/columns.tsx +1 -1
  108. package/dist/assets/adapters/next/templates/init/pages/users/users-table.tsx +1 -1
  109. package/dist/assets/adapters/next/templates/init/utils/audit/get-changed-field-names.ts +18 -0
  110. package/dist/assets/adapters/next/templates/init/utils/audit/get-touched-field-names.ts +9 -0
  111. package/dist/assets/adapters/next/templates/init/utils/audit/normalize-comparable-value.ts +14 -0
  112. package/dist/assets/adapters/next/templates/init/utils/audit/should-track-field.ts +15 -0
  113. package/dist/assets/adapters/next/templates/init/utils/auth/can-access-admin.ts +7 -0
  114. package/dist/assets/adapters/next/templates/init/utils/auth/get-admin-post-login-path.ts +5 -0
  115. package/dist/assets/adapters/next/templates/init/utils/auth/has-required-role.ts +5 -0
  116. package/dist/assets/adapters/next/templates/init/utils/auth/is-user-role.ts +5 -0
  117. package/dist/assets/adapters/next/templates/init/utils/date/build-date-range.ts +14 -0
  118. package/dist/assets/adapters/next/templates/init/utils/date/date-range-end-time.ts +1 -0
  119. package/dist/assets/adapters/next/templates/init/utils/date/date-range-input-format.ts +1 -0
  120. package/dist/assets/adapters/next/templates/init/utils/date/date-range-start-time.ts +1 -0
  121. package/dist/assets/adapters/next/templates/init/utils/date/format-date-range-input-date.ts +6 -0
  122. package/dist/assets/adapters/next/templates/init/utils/date/format-date-range-param-date.ts +7 -0
  123. package/dist/assets/adapters/next/templates/init/utils/date/format-date-range-trigger-date.ts +5 -0
  124. package/dist/assets/adapters/next/templates/init/utils/date/get-date-range-trigger-label.ts +24 -0
  125. package/dist/assets/adapters/next/templates/init/utils/date/get-exclusive-date-upper-bound.ts +9 -0
  126. package/dist/assets/adapters/next/templates/init/utils/date/get-ordered-date-range.ts +12 -0
  127. package/dist/assets/adapters/next/templates/init/utils/date/normalize-date-range-time.ts +5 -0
  128. package/dist/assets/adapters/next/templates/init/utils/date/parse-date-input-value.ts +6 -0
  129. package/dist/assets/adapters/next/templates/init/utils/date/parse-editable-date-range-date.ts +17 -0
  130. package/dist/assets/adapters/next/templates/init/utils/editor/active-table-cell-class.ts +1 -0
  131. package/dist/assets/adapters/next/templates/init/utils/editor/active-table-cell.ts +36 -0
  132. package/dist/assets/adapters/next/templates/init/utils/editor/active-table-wrapper-class.ts +1 -0
  133. package/dist/assets/adapters/next/templates/init/utils/editor/append-column-to-table.ts +13 -0
  134. package/dist/assets/adapters/next/templates/init/utils/editor/append-row-to-table.ts +13 -0
  135. package/dist/assets/adapters/next/templates/init/utils/editor/apply-cursor-change-if-available.ts +8 -0
  136. package/dist/assets/adapters/next/templates/init/utils/editor/apply-cursor-change.ts +10 -0
  137. package/dist/assets/adapters/next/templates/init/utils/editor/can-insert-content-editor-media-placeholder.ts +10 -0
  138. package/dist/assets/adapters/next/templates/init/utils/editor/checkbox-label-factory.ts +5 -0
  139. package/dist/assets/adapters/next/templates/init/utils/editor/clear-table-part-preview.ts +11 -0
  140. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color-name-pattern.ts +3 -0
  141. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color-option.ts +6 -0
  142. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color-options.ts +68 -0
  143. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-color.ts +3 -0
  144. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight-colors.ts +12 -0
  145. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-highlight.ts +33 -0
  146. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-inline-math-delimiter.ts +1 -0
  147. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-inline-math.ts +105 -0
  148. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-keyboard.ts +5 -0
  149. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-math-kind.ts +1 -0
  150. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-math-value.ts +9 -0
  151. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-media-placeholder-node.ts +1 -0
  152. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-media-shortcut-key.ts +1 -0
  153. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-mode.ts +1 -0
  154. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-raw-content-block.ts +95 -0
  155. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-selected-math.ts +12 -0
  156. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-selection-request.ts +4 -0
  157. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-subscript.ts +5 -0
  158. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-superscript.ts +5 -0
  159. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-table-alignment.ts +1 -0
  160. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-underline.ts +26 -0
  161. package/dist/assets/adapters/next/templates/init/utils/editor/create-content-editor-table-node.ts +27 -0
  162. package/dist/assets/adapters/next/templates/init/utils/editor/create-html-mark.ts +28 -0
  163. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-image-text.ts +5 -0
  164. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-plain-text-offset-map.ts +126 -0
  165. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-table-text.ts +15 -0
  166. package/dist/assets/adapters/next/templates/init/utils/editor/create-markdown-text-from-url.ts +6 -0
  167. package/dist/assets/adapters/next/templates/init/utils/editor/default-content-editor-table-cols.ts +1 -0
  168. package/dist/assets/adapters/next/templates/init/utils/editor/default-content-editor-table-rows.ts +1 -0
  169. package/dist/assets/adapters/next/templates/init/utils/editor/doc-position-from-plain-text-offset.ts +27 -0
  170. package/dist/assets/adapters/next/templates/init/utils/editor/escape-html.ts +10 -0
  171. package/dist/assets/adapters/next/templates/init/utils/editor/find-highlight-span-range.ts +25 -0
  172. package/dist/assets/adapters/next/templates/init/utils/editor/find-inline-math-start.ts +12 -0
  173. package/dist/assets/adapters/next/templates/init/utils/editor/find-markdown-link-range.ts +40 -0
  174. package/dist/assets/adapters/next/templates/init/utils/editor/find-node-at-position.ts +15 -0
  175. package/dist/assets/adapters/next/templates/init/utils/editor/find-node-position.ts +48 -0
  176. package/dist/assets/adapters/next/templates/init/utils/editor/find-raw-content-start.ts +16 -0
  177. package/dist/assets/adapters/next/templates/init/utils/editor/find-unescaped-character.ts +13 -0
  178. package/dist/assets/adapters/next/templates/init/utils/editor/find-unescaped-sequence.ts +14 -0
  179. package/dist/assets/adapters/next/templates/init/utils/editor/focus-next-node.ts +28 -0
  180. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown-blockquote-line.ts +5 -0
  181. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown-heading-line.ts +7 -0
  182. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown-list-line.ts +14 -0
  183. package/dist/assets/adapters/next/templates/init/utils/editor/format-markdown.ts +7 -0
  184. package/dist/assets/adapters/next/templates/init/utils/editor/format-shortcut-key.ts +10 -0
  185. package/dist/assets/adapters/next/templates/init/utils/editor/get-active-table-column-alignment.ts +31 -0
  186. package/dist/assets/adapters/next/templates/init/utils/editor/get-block-math-expression.ts +15 -0
  187. package/dist/assets/adapters/next/templates/init/utils/editor/get-closest-table-cell.ts +10 -0
  188. package/dist/assets/adapters/next/templates/init/utils/editor/get-content-editor-highlight-color-name.ts +42 -0
  189. package/dist/assets/adapters/next/templates/init/utils/editor/get-content-editor-highlight-color-value.ts +6 -0
  190. package/dist/assets/adapters/next/templates/init/utils/editor/get-editor-element.ts +7 -0
  191. package/dist/assets/adapters/next/templates/init/utils/editor/get-editor-scroll-element.ts +8 -0
  192. package/dist/assets/adapters/next/templates/init/utils/editor/get-event-table-cell.ts +7 -0
  193. package/dist/assets/adapters/next/templates/init/utils/editor/get-inline-math-delimiter.ts +7 -0
  194. package/dist/assets/adapters/next/templates/init/utils/editor/get-markdown-heading-fallback.ts +5 -0
  195. package/dist/assets/adapters/next/templates/init/utils/editor/get-markdown-list-fallback.ts +7 -0
  196. package/dist/assets/adapters/next/templates/init/utils/editor/get-media-label.ts +5 -0
  197. package/dist/assets/adapters/next/templates/init/utils/editor/get-number-attr.ts +3 -0
  198. package/dist/assets/adapters/next/templates/init/utils/editor/get-plain-text-offset-before-doc-position.ts +8 -0
  199. package/dist/assets/adapters/next/templates/init/utils/editor/get-plain-text-offset-before-markdown-offset.ts +11 -0
  200. package/dist/assets/adapters/next/templates/init/utils/editor/get-raw-content-kind.ts +7 -0
  201. package/dist/assets/adapters/next/templates/init/utils/editor/get-raw-content-token.ts +13 -0
  202. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-block-nodes.ts +23 -0
  203. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-content-editor-math.ts +43 -0
  204. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-nodes-of-type.ts +50 -0
  205. package/dist/assets/adapters/next/templates/init/utils/editor/get-selected-table-column-cell-positions.ts +21 -0
  206. package/dist/assets/adapters/next/templates/init/utils/editor/get-selection-table-cell.ts +10 -0
  207. package/dist/assets/adapters/next/templates/init/utils/editor/get-selection-table-element.ts +19 -0
  208. package/dist/assets/adapters/next/templates/init/utils/editor/get-selection-table.ts +17 -0
  209. package/dist/assets/adapters/next/templates/init/utils/editor/get-slash-menu-state.ts +47 -0
  210. package/dist/assets/adapters/next/templates/init/utils/editor/get-string-attr.ts +5 -0
  211. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-element.ts +5 -0
  212. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-from-event-target.ts +19 -0
  213. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-from-wrapper.ts +15 -0
  214. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-position-for-element.ts +24 -0
  215. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-rect-at-position.ts +20 -0
  216. package/dist/assets/adapters/next/templates/init/utils/editor/get-table-wrapper-element.ts +11 -0
  217. package/dist/assets/adapters/next/templates/init/utils/editor/{task-item.ts → get-task-item-checkbox-label.ts} +1 -7
  218. package/dist/assets/adapters/next/templates/init/utils/editor/has-own-attribute.ts +3 -0
  219. package/dist/assets/adapters/next/templates/init/utils/editor/highlight-span-pattern.ts +6 -0
  220. package/dist/assets/adapters/next/templates/init/utils/editor/inline-math-delimiter.ts +3 -0
  221. package/dist/assets/adapters/next/templates/init/utils/editor/inline-math-node-view.ts +51 -0
  222. package/dist/assets/adapters/next/templates/init/utils/editor/insert-component-at-cursor.ts +28 -0
  223. package/dist/assets/adapters/next/templates/init/utils/editor/insert-content-editor-math.ts +35 -0
  224. package/dist/assets/adapters/next/templates/init/utils/editor/insert-content-editor-media-placeholder.ts +20 -0
  225. package/dist/assets/adapters/next/templates/init/utils/editor/insert-content-editor-table.ts +12 -0
  226. package/dist/assets/adapters/next/templates/init/utils/editor/insert-markdown-text-at-position.ts +14 -0
  227. package/dist/assets/adapters/next/templates/init/utils/editor/insert-result.ts +4 -0
  228. package/dist/assets/adapters/next/templates/init/utils/editor/insert-text-at-cursor.ts +37 -0
  229. package/dist/assets/adapters/next/templates/init/utils/editor/is-allowed-uri.ts +42 -0
  230. package/dist/assets/adapters/next/templates/init/utils/editor/is-content-editor-highlight-color.ts +6 -0
  231. package/dist/assets/adapters/next/templates/init/utils/editor/is-content-editor-media-placeholder-active.ts +8 -0
  232. package/dist/assets/adapters/next/templates/init/utils/editor/is-content-editor-table-alignment.ts +7 -0
  233. package/dist/assets/adapters/next/templates/init/utils/editor/is-element-visible-in-editor.ts +17 -0
  234. package/dist/assets/adapters/next/templates/init/utils/editor/is-escaped.ts +11 -0
  235. package/dist/assets/adapters/next/templates/init/utils/editor/is-extension-available.ts +22 -0
  236. package/dist/assets/adapters/next/templates/init/utils/editor/is-mac.ts +3 -0
  237. package/dist/assets/adapters/next/templates/init/utils/editor/is-mark-in-schema.ts +6 -0
  238. package/dist/assets/adapters/next/templates/init/utils/editor/is-markdown-line-start.ts +3 -0
  239. package/dist/assets/adapters/next/templates/init/utils/editor/is-node-in-schema.ts +6 -0
  240. package/dist/assets/adapters/next/templates/init/utils/editor/is-node-type-selected.ts +30 -0
  241. package/dist/assets/adapters/next/templates/init/utils/editor/is-same-slash-menu-state.ts +17 -0
  242. package/dist/assets/adapters/next/templates/init/utils/editor/is-selected-table-visible.ts +8 -0
  243. package/dist/assets/adapters/next/templates/init/utils/editor/is-task-item-checked.ts +5 -0
  244. package/dist/assets/adapters/next/templates/init/utils/editor/is-valid-dollar-inline-math.ts +13 -0
  245. package/dist/assets/adapters/next/templates/init/utils/editor/is-valid-position.ts +3 -0
  246. package/dist/assets/adapters/next/templates/init/utils/editor/is-word-character.ts +3 -0
  247. package/dist/assets/adapters/next/templates/init/utils/editor/mac-symbols.ts +15 -0
  248. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-heading-level.ts +1 -0
  249. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-heading-option.ts +6 -0
  250. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-heading-options.ts +9 -0
  251. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-image-upload-result.ts +4 -0
  252. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-list-option.ts +6 -0
  253. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-list-options.ts +7 -0
  254. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-list-type.ts +1 -0
  255. package/dist/assets/adapters/next/templates/init/utils/editor/markdown-offset-from-plain-text-offset.ts +8 -0
  256. package/dist/assets/adapters/next/templates/init/utils/editor/match-block-math.ts +54 -0
  257. package/dist/assets/adapters/next/templates/init/utils/editor/match-code-fence-start.ts +8 -0
  258. package/dist/assets/adapters/next/templates/init/utils/editor/match-html-block.ts +31 -0
  259. package/dist/assets/adapters/next/templates/init/utils/editor/match-html-mark-syntax.ts +16 -0
  260. package/dist/assets/adapters/next/templates/init/utils/editor/match-inline-math.ts +49 -0
  261. package/dist/assets/adapters/next/templates/init/utils/editor/match-markdown-block-prefix.ts +11 -0
  262. package/dist/assets/adapters/next/templates/init/utils/editor/match-markdown-mark-syntax.ts +27 -0
  263. package/dist/assets/adapters/next/templates/init/utils/editor/match-raw-content-block.ts +9 -0
  264. package/dist/assets/adapters/next/templates/init/utils/editor/mounted-editor-view.ts +3 -0
  265. package/dist/assets/adapters/next/templates/init/utils/editor/normalize-editor-markdown.ts +3 -0
  266. package/dist/assets/adapters/next/templates/init/utils/editor/parse-content-editor-math-input.ts +98 -0
  267. package/dist/assets/adapters/next/templates/init/utils/editor/parse-shortcut-keys.ts +17 -0
  268. package/dist/assets/adapters/next/templates/init/utils/editor/prepare-markdown-for-rich-mode.ts +3 -0
  269. package/dist/assets/adapters/next/templates/init/utils/editor/protocol-config.ts +7 -0
  270. package/dist/assets/adapters/next/templates/init/utils/editor/raw-content-block-node-view.ts +120 -0
  271. package/dist/assets/adapters/next/templates/init/utils/editor/raw-content-kind.ts +3 -0
  272. package/dist/assets/adapters/next/templates/init/utils/editor/raw-content-match.ts +8 -0
  273. package/dist/assets/adapters/next/templates/init/utils/editor/raw-html-block-tags.ts +14 -0
  274. package/dist/assets/adapters/next/templates/init/utils/editor/remove-highlight-span-at-cursor.ts +59 -0
  275. package/dist/assets/adapters/next/templates/init/utils/editor/remove-markdown-link-at-cursor.ts +43 -0
  276. package/dist/assets/adapters/next/templates/init/utils/editor/remove-selected-content-editor-math.ts +20 -0
  277. package/dist/assets/adapters/next/templates/init/utils/editor/render-details-preview.ts +22 -0
  278. package/dist/assets/adapters/next/templates/init/utils/editor/render-latex.ts +20 -0
  279. package/dist/assets/adapters/next/templates/init/utils/editor/render-raw-content-preview.ts +19 -0
  280. package/dist/assets/adapters/next/templates/init/utils/editor/render-simple-markdown-body.ts +46 -0
  281. package/dist/assets/adapters/next/templates/init/utils/editor/run-slash-command.ts +12 -0
  282. package/dist/assets/adapters/next/templates/init/utils/editor/runnable-slash-command.ts +5 -0
  283. package/dist/assets/adapters/next/templates/init/utils/editor/sanitize-html-preview.ts +41 -0
  284. package/dist/assets/adapters/next/templates/init/utils/editor/sanitize-url.ts +13 -0
  285. package/dist/assets/adapters/next/templates/init/utils/editor/select-current-block-content.ts +38 -0
  286. package/dist/assets/adapters/next/templates/init/utils/editor/selection-within-convertible-types.ts +29 -0
  287. package/dist/assets/adapters/next/templates/init/utils/editor/self-closing-html-block-tags.ts +3 -0
  288. package/dist/assets/adapters/next/templates/init/utils/editor/serialize-raw-content-preview.ts +12 -0
  289. package/dist/assets/adapters/next/templates/init/utils/editor/set-active-table-column-alignment.ts +39 -0
  290. package/dist/assets/adapters/next/templates/init/utils/editor/set-element-attribute.ts +13 -0
  291. package/dist/assets/adapters/next/templates/init/utils/editor/set-markdown-link-at-cursor.ts +50 -0
  292. package/dist/assets/adapters/next/templates/init/utils/editor/show-table-part-preview.ts +59 -0
  293. package/dist/assets/adapters/next/templates/init/utils/editor/slash-commands.ts +2 -1
  294. package/dist/assets/adapters/next/templates/init/utils/editor/slash-menu-state.ts +6 -0
  295. package/dist/assets/adapters/next/templates/init/utils/editor/sr-only.ts +11 -0
  296. package/dist/assets/adapters/next/templates/init/utils/editor/strip-html.ts +5 -0
  297. package/dist/assets/adapters/next/templates/init/utils/editor/strip-markdown-block-prefix.ts +6 -0
  298. package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls-state.ts +4 -0
  299. package/dist/assets/adapters/next/templates/init/utils/editor/table-part-preview-class.ts +1 -0
  300. package/dist/assets/adapters/next/templates/init/utils/editor/table-part.ts +1 -0
  301. package/dist/assets/adapters/next/templates/init/utils/editor/table-wrapper-class.ts +1 -0
  302. package/dist/assets/adapters/next/templates/init/utils/editor/transform-selected-markdown-lines.ts +38 -0
  303. package/dist/assets/adapters/next/templates/init/utils/editor/update-nodes-attr.ts +36 -0
  304. package/dist/assets/adapters/next/templates/init/utils/editor/update-selected-content-editor-math.ts +36 -0
  305. package/dist/assets/adapters/next/templates/init/utils/email/escape-html.ts +8 -0
  306. package/dist/assets/adapters/next/templates/init/utils/email/form-email-delivery-input.ts +8 -0
  307. package/dist/assets/adapters/next/templates/init/utils/email/format-email-value.ts +19 -0
  308. package/dist/assets/adapters/next/templates/init/utils/email/is-valid-email.ts +3 -0
  309. package/dist/assets/adapters/next/templates/init/utils/email/normalize-email-list.ts +5 -0
  310. package/dist/assets/adapters/next/templates/init/utils/email/render-form-submission-rows.ts +16 -0
  311. package/dist/assets/adapters/next/templates/init/utils/email/render-notification-email.ts +32 -0
  312. package/dist/assets/adapters/next/templates/init/utils/email/render-thank-you-email.ts +18 -0
  313. package/dist/assets/adapters/next/templates/init/utils/error/read-string-property.ts +5 -0
  314. package/dist/assets/adapters/next/templates/init/utils/error/{action-error.ts → recognize.ts} +3 -12
  315. package/dist/assets/adapters/next/templates/init/utils/error/to-action-error.ts +6 -0
  316. package/dist/assets/adapters/next/templates/init/utils/form/{list-field.ts → clone-default-value.ts} +0 -5
  317. package/dist/assets/adapters/next/templates/init/utils/form/create-list-item-key.ts +4 -0
  318. package/dist/assets/adapters/next/templates/init/utils/media/admin-media-type.ts +1 -0
  319. package/dist/assets/adapters/next/templates/init/utils/media/{fallback.ts → create-admin-media-from-url.ts} +1 -14
  320. package/dist/assets/adapters/next/templates/init/utils/media/create-preview-url.ts +3 -0
  321. package/dist/assets/adapters/next/templates/init/utils/media/get-filename-from-url.ts +9 -0
  322. package/dist/assets/adapters/next/templates/init/utils/media/get-media-type.ts +19 -0
  323. package/dist/assets/adapters/next/templates/init/utils/media/get-media-url-help-text.ts +10 -0
  324. package/dist/assets/adapters/next/templates/init/utils/media/get-media-url-placeholder.ts +7 -0
  325. package/dist/assets/adapters/next/templates/init/utils/media/image-extensions.ts +1 -0
  326. package/dist/assets/adapters/next/templates/init/utils/media/image-mime-types.ts +7 -0
  327. package/dist/assets/adapters/next/templates/init/utils/media/infer-media-content-type.ts +13 -0
  328. package/dist/assets/adapters/next/templates/init/utils/media/is-document-only-accept.ts +19 -0
  329. package/dist/assets/adapters/next/templates/init/utils/media/{query.ts → map-media-row.ts} +0 -39
  330. package/dist/assets/adapters/next/templates/init/utils/media/media-mime-types.ts +4 -0
  331. package/dist/assets/adapters/next/templates/init/utils/media/revoke-preview-url.ts +3 -0
  332. package/dist/assets/adapters/next/templates/init/utils/media/select-media.ts +39 -0
  333. package/dist/assets/adapters/next/templates/init/utils/media/video-extensions.ts +1 -0
  334. package/dist/assets/adapters/next/templates/init/utils/media/video-mime-types.ts +7 -0
  335. package/dist/assets/adapters/next/templates/init/utils/seo/{seo.ts → create-metadata.ts} +0 -36
  336. package/dist/assets/adapters/next/templates/init/utils/seo/generate-article-schema.ts +31 -0
  337. package/dist/assets/adapters/next/templates/init/utils/seo/schema-to-json.ts +3 -0
  338. package/dist/assets/adapters/next/templates/init/utils/storage/{local.ts → build-local-storage-key.ts} +1 -4
  339. package/dist/assets/adapters/next/templates/init/utils/storage/decode-storage-key.ts +9 -0
  340. package/dist/assets/adapters/next/templates/init/utils/storage/sanitize-filename.ts +3 -0
  341. package/dist/assets/adapters/next/templates/init/utils/storage/storage-error.ts +5 -0
  342. package/dist/assets/adapters/next/templates/init/utils/table/{table.ts → default-get-id.ts} +0 -4
  343. package/dist/assets/adapters/next/templates/init/utils/table/is-string.ts +3 -0
  344. package/dist/assets/adapters/next/templates/init/utils/upload/default-remote-accept.ts +1 -0
  345. package/dist/assets/adapters/next/templates/init/utils/upload/dropzone-accept.ts +1 -0
  346. package/dist/assets/adapters/next/templates/init/utils/upload/get-fallback-extension.ts +12 -0
  347. package/dist/assets/adapters/next/templates/init/utils/upload/get-remote-filename.ts +15 -0
  348. package/dist/assets/adapters/next/templates/init/utils/upload/is-accepted-remote-type.ts +25 -0
  349. package/dist/assets/adapters/next/templates/init/utils/upload/is-wildcard-accept.ts +4 -0
  350. package/dist/assets/adapters/next/templates/init/utils/upload/parse-accept-types.ts +7 -0
  351. package/dist/assets/adapters/next/templates/init/utils/upload/parse-dropzone-accept.ts +14 -0
  352. package/dist/assets/adapters/next/templates/init/utils/upload/remote-fetch-timeout-ms.ts +1 -0
  353. package/dist/assets/adapters/next/templates/init/utils/user/compare-user-sort-values.ts +4 -0
  354. package/dist/assets/adapters/next/templates/init/utils/user/get-user-initials.ts +11 -0
  355. package/dist/assets/adapters/next/templates/init/utils/user/get-user-sort-value.ts +8 -0
  356. package/dist/assets/adapters/next/templates/init/utils/user/{user.ts → get-users-page.ts} +3 -28
  357. package/dist/assets/adapters/next/templates/init/utils/user/normalize-user-filter-value.ts +3 -0
  358. package/dist/assets/adapters/next/templates/init/utils/validation/file-validation-config.ts +5 -0
  359. package/dist/assets/adapters/next/templates/init/utils/validation/file-validation-error.ts +4 -0
  360. package/dist/assets/adapters/next/templates/init/utils/validation/file-validation-result.ts +6 -0
  361. package/dist/assets/adapters/next/templates/init/utils/validation/format-file-size.ts +18 -0
  362. package/dist/assets/adapters/next/templates/init/utils/validation/is-file-type-allowed.ts +13 -0
  363. package/dist/assets/adapters/next/templates/init/utils/validation/is-valid-url.ts +8 -0
  364. package/dist/assets/adapters/next/templates/init/utils/validation/slugify.ts +9 -0
  365. package/dist/assets/adapters/next/templates/init/utils/validation/validate-files.ts +39 -0
  366. package/dist/assets/adapters/next/templates/init/utils/webhook/create-webhook-event-id.ts +5 -0
  367. package/dist/assets/adapters/next/templates/init/utils/webhook/generate-webhook-secret.ts +5 -0
  368. package/dist/assets/adapters/next/templates/init/utils/webhook/sign-webhook-payload.ts +5 -0
  369. package/dist/assets/shared-assets/react-admin/custom/content-editor/index.tsx +1 -1
  370. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-bubble-menu.tsx +3 -5
  371. package/dist/assets/shared-assets/react-admin/custom/content-editor/math-popover-button.tsx +1 -1
  372. package/dist/assets/shared-assets/react-admin/custom/content-editor/mobile-toolbar-content.tsx +1 -1
  373. package/dist/assets/shared-assets/react-admin/custom/content-editor/slash-command-menu.tsx +1 -1
  374. package/dist/assets/shared-assets/react-admin/custom/content-editor/source-mode.tsx +6 -4
  375. package/dist/assets/shared-assets/react-admin/custom/content-editor/table-bubble-menu.tsx +11 -15
  376. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-extension/node-background-extension.ts +2 -1
  377. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/media-gallery-placeholder-node/media-gallery-placeholder-node.tsx +3 -2
  378. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/removable-image-node/removable-image-node.tsx +5 -3
  379. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-node/task-item-node/task-item-node-extension.tsx +4 -2
  380. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/blockquote-button/blockquote-button.tsx +1 -1
  381. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/code-block-button/code-block-button.tsx +1 -1
  382. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/color-highlight-button/color-highlight-button.tsx +1 -1
  383. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/mark-button/mark-button.tsx +1 -1
  384. package/dist/assets/shared-assets/react-admin/custom/content-editor/tiptap-ui/undo-redo-button/undo-redo-button.tsx +1 -1
  385. package/dist/assets/shared-assets/react-admin/custom/date-range-picker.tsx +10 -12
  386. package/dist/assets/shared-assets/react-admin/custom/media-field.tsx +1 -1
  387. package/dist/assets/shared-assets/react-admin/custom/nested-object-list-field.tsx +2 -1
  388. package/dist/assets/shared-assets/react-admin/custom/upload-dropzone.tsx +1 -1
  389. package/dist/{chunk-45Z6XDG5.js → chunk-TIJEHWRF.js} +150 -165
  390. package/dist/chunk-TIJEHWRF.js.map +1 -0
  391. package/dist/cli.js +27813 -24313
  392. package/dist/cli.js.map +1 -1
  393. package/dist/read-namespaced-template-UXU7OCY3.js +13 -0
  394. package/dist/read-namespaced-template-UXU7OCY3.js.map +1 -0
  395. package/package.json +1 -1
  396. package/dist/assets/adapters/next/integrations/resend/actions/resend.ts +0 -138
  397. package/dist/assets/adapters/next/templates/init/lib/actions/webhooks/dispatch.ts +0 -134
  398. package/dist/assets/adapters/next/templates/init/utils/audit/audit.ts +0 -54
  399. package/dist/assets/adapters/next/templates/init/utils/auth/roles.ts +0 -17
  400. package/dist/assets/adapters/next/templates/init/utils/date/date.ts +0 -100
  401. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor-rich-extensions.ts +0 -824
  402. package/dist/assets/adapters/next/templates/init/utils/editor/content-editor.ts +0 -389
  403. package/dist/assets/adapters/next/templates/init/utils/editor/markdown.ts +0 -545
  404. package/dist/assets/adapters/next/templates/init/utils/editor/node-attrs.ts +0 -25
  405. package/dist/assets/adapters/next/templates/init/utils/editor/source-media.ts +0 -11
  406. package/dist/assets/adapters/next/templates/init/utils/editor/table-add-controls.ts +0 -91
  407. package/dist/assets/adapters/next/templates/init/utils/editor/table-bubble.ts +0 -172
  408. package/dist/assets/adapters/next/templates/init/utils/editor/tiptap.ts +0 -847
  409. package/dist/assets/adapters/next/templates/init/utils/email/form-delivery.ts +0 -104
  410. package/dist/assets/adapters/next/templates/init/utils/media/media.ts +0 -91
  411. package/dist/assets/adapters/next/templates/init/utils/upload/remote.ts +0 -55
  412. package/dist/assets/adapters/next/templates/init/utils/upload/upload.ts +0 -26
  413. package/dist/assets/adapters/next/templates/init/utils/validation/validation.ts +0 -102
  414. package/dist/assets/adapters/next/templates/init/utils/webhook/signature.ts +0 -13
  415. package/dist/chunk-45Z6XDG5.js.map +0 -1
  416. package/dist/template-reader-J6G7N5V6.js +0 -13
  417. package/dist/template-reader-J6G7N5V6.js.map +0 -1
@@ -1,104 +0,0 @@
1
- export interface FormEmailDeliveryInput {
2
- formName: string
3
- formLabel: string
4
- notificationEmails: string[]
5
- submitterEmail?: string | null
6
- submissionData: Record<string, unknown>
7
- submittedAt: string
8
- }
9
-
10
- export function escapeHtml(value: string): string {
11
- return value
12
- .replace(/&/g, '&amp;')
13
- .replace(/</g, '&lt;')
14
- .replace(/>/g, '&gt;')
15
- .replace(/"/g, '&quot;')
16
- .replace(/'/g, '&#39;')
17
- }
18
-
19
- export function formatEmailValue(value: unknown): string {
20
- if (value === null || value === undefined || value === '') {
21
- return 'N/A'
22
- }
23
-
24
- if (value instanceof Date) {
25
- return value.toISOString()
26
- }
27
-
28
- if (Array.isArray(value)) {
29
- return value.length > 0 ? value.map(formatEmailValue).join(', ') : 'N/A'
30
- }
31
-
32
- if (typeof value === 'object') {
33
- return JSON.stringify(value)
34
- }
35
-
36
- return String(value)
37
- }
38
-
39
- export function isValidEmail(value: string): boolean {
40
- return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)
41
- }
42
-
43
- export function normalizeEmailList(values: string[]): string[] {
44
- return Array.from(new Set(values.map((value) => value.trim()).filter(isValidEmail)))
45
- }
46
-
47
- export function renderFormSubmissionRows(submissionData: Record<string, unknown>): string {
48
- return Object.entries(submissionData)
49
- .map(([key, value]) => {
50
- const label = escapeHtml(key)
51
- const displayValue = escapeHtml(formatEmailValue(value))
52
-
53
- return `<tr>
54
- <th style="border-bottom:1px solid #e2e8f0;color:#475569;font-size:12px;font-weight:600;padding:12px;text-align:left;text-transform:uppercase;vertical-align:top;width:36%;">${label}</th>
55
- <td style="border-bottom:1px solid #e2e8f0;color:#0f172a;font-size:14px;line-height:20px;padding:12px;vertical-align:top;">${displayValue}</td>
56
- </tr>`
57
- })
58
- .join('\n')
59
- }
60
-
61
- export function renderNotificationEmail(input: FormEmailDeliveryInput): string {
62
- const formLabel = escapeHtml(input.formLabel)
63
- const formName = escapeHtml(input.formName)
64
- const submittedAt = escapeHtml(new Date(input.submittedAt).toLocaleString())
65
- const rows = renderFormSubmissionRows(input.submissionData)
66
-
67
- return `<!doctype html>
68
- <html>
69
- <body style="margin:0;background:#f8fafc;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#0f172a;">
70
- <div style="margin:0 auto;max-width:640px;padding:40px 20px;">
71
- <div style="border-radius:12px;background:#ffffff;border:1px solid #e2e8f0;overflow:hidden;">
72
- <div style="background:#0f172a;color:#ffffff;padding:24px 28px;">
73
- <p style="margin:0;color:#cbd5e1;font-size:13px;line-height:20px;">${formName}</p>
74
- <h1 style="margin:4px 0 0;font-size:24px;line-height:32px;">New ${formLabel} submission</h1>
75
- </div>
76
- <div style="padding:24px 28px;">
77
- <p style="margin:0 0 20px;color:#475569;font-size:14px;line-height:20px;">Submitted at ${submittedAt}</p>
78
- <table cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;width:100%;">
79
- <tbody>
80
- ${rows}
81
- </tbody>
82
- </table>
83
- </div>
84
- </div>
85
- </div>
86
- </body>
87
- </html>`
88
- }
89
-
90
- export function renderThankYouEmail(input: FormEmailDeliveryInput): string {
91
- const formLabel = escapeHtml(input.formLabel.toLowerCase())
92
-
93
- return `<!doctype html>
94
- <html>
95
- <body style="margin:0;background:#f8fafc;font-family:Inter,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#0f172a;">
96
- <div style="margin:0 auto;max-width:560px;padding:40px 20px;">
97
- <div style="border-radius:12px;background:#ffffff;padding:32px;border:1px solid #e2e8f0;">
98
- <h1 style="margin:0 0 16px;font-size:24px;line-height:32px;">Thank you</h1>
99
- <p style="margin:0;color:#334155;font-size:16px;line-height:24px;">We received your ${formLabel} submission and will get back to you shortly.</p>
100
- </div>
101
- </div>
102
- </body>
103
- </html>`
104
- }
@@ -1,91 +0,0 @@
1
- import { parseAcceptTypes } from '@admin/utils/upload/upload'
2
-
3
- export type AdminMediaType = 'image' | 'video' | 'document'
4
-
5
- export const IMAGE_MIME_TYPES = [
6
- 'image/jpeg',
7
- 'image/png',
8
- 'image/gif',
9
- 'image/webp',
10
- 'image/svg+xml'
11
- ]
12
-
13
- export const VIDEO_MIME_TYPES = [
14
- 'video/mp4',
15
- 'video/webm',
16
- 'video/ogg',
17
- 'video/quicktime',
18
- 'video/x-msvideo'
19
- ]
20
-
21
- export const MEDIA_MIME_TYPES = [...IMAGE_MIME_TYPES, ...VIDEO_MIME_TYPES]
22
-
23
- const IMAGE_EXTENSIONS = /\.(jpg|jpeg|png|gif|webp|svg|avif|ico|bmp|tiff?)($|\?)/i
24
- const VIDEO_EXTENSIONS = /\.(mp4|webm|ogg|mov|avi|mkv|m4v)($|\?)/i
25
-
26
- export function createPreviewUrl(file: File): string {
27
- return URL.createObjectURL(file)
28
- }
29
-
30
- export function revokePreviewUrl(url?: string | null): void {
31
- if (url?.startsWith('blob:')) URL.revokeObjectURL(url)
32
- }
33
-
34
- export function isDocumentOnlyAccept(accept: string): boolean {
35
- if (!accept || accept === 'image/*,video/*' || accept === '*/*' || accept === '*') {
36
- return false
37
- }
38
-
39
- const types = parseAcceptTypes(accept, { lowercase: true })
40
-
41
- return types.every(
42
- (type) =>
43
- !type.startsWith('image/') &&
44
- !type.startsWith('video/') &&
45
- !IMAGE_EXTENSIONS.test(type) &&
46
- !VIDEO_EXTENSIONS.test(type)
47
- )
48
- }
49
-
50
- export function getMediaType(urlOrMime: string): AdminMediaType {
51
- const lower = urlOrMime.toLowerCase()
52
-
53
- if (VIDEO_MIME_TYPES.some((type) => lower.includes(type)) || VIDEO_EXTENSIONS.test(lower)) {
54
- return 'video'
55
- }
56
-
57
- if (IMAGE_MIME_TYPES.some((type) => lower.includes(type)) || IMAGE_EXTENSIONS.test(lower)) {
58
- return 'image'
59
- }
60
-
61
- return 'document'
62
- }
63
-
64
- export function getFilenameFromUrl(url: string, fallback: string): string {
65
- try {
66
- const parsed = new URL(url)
67
- const parts = parsed.pathname.split('/').filter(Boolean)
68
- return parts[parts.length - 1] || fallback
69
- } catch {
70
- return url.split('/').pop()?.split('?')[0] || fallback
71
- }
72
- }
73
-
74
- export function getMediaUrlHelpText(accept?: string): string {
75
- if (!accept) return 'Paste a direct image or video URL from a public source.'
76
- if (accept.startsWith('image/')) {
77
- return 'Paste a direct image URL from a public source.'
78
- }
79
- if (accept.startsWith('video/')) {
80
- return 'Paste a direct video URL from a public source.'
81
- }
82
- return 'Paste a direct media URL from a public source.'
83
- }
84
-
85
- export function getMediaUrlPlaceholder(accept?: string): string {
86
- if (accept?.startsWith('image/')) return 'https://example.com/cover-image.jpg'
87
- if (accept?.startsWith('video/')) {
88
- return 'https://example.com/launch-video.mp4'
89
- }
90
- return 'https://example.com/media-file'
91
- }
@@ -1,55 +0,0 @@
1
- import { parseAcceptTypes } from '@admin/utils/upload/upload'
2
-
3
- export const DEFAULT_REMOTE_ACCEPT = 'image/*,video/*'
4
- export const REMOTE_FETCH_TIMEOUT_MS = 30_000
5
-
6
- export function isAcceptedRemoteType(
7
- contentType: string,
8
- filename: string,
9
- accept?: string
10
- ): boolean {
11
- const allowedTypes = parseAcceptTypes(accept, { lowercase: true })
12
-
13
- if (allowedTypes.length === 0) {
14
- return contentType.startsWith('image/') || contentType.startsWith('video/')
15
- }
16
-
17
- return allowedTypes.some((type) => {
18
- if (type.endsWith('/*')) {
19
- return contentType.startsWith(type.slice(0, -1))
20
- }
21
-
22
- if (type.startsWith('.')) {
23
- return filename.toLowerCase().endsWith(type)
24
- }
25
-
26
- return contentType === type
27
- })
28
- }
29
-
30
- export function getFallbackExtension(contentType: string): string {
31
- if (contentType === 'image/jpeg') return 'jpg'
32
- if (contentType === 'image/png') return 'png'
33
- if (contentType === 'image/webp') return 'webp'
34
- if (contentType === 'image/gif') return 'gif'
35
- if (contentType === 'image/svg+xml') return 'svg'
36
- if (contentType === 'video/mp4') return 'mp4'
37
- if (contentType === 'video/webm') return 'webm'
38
- if (contentType === 'video/quicktime') return 'mov'
39
- if (contentType === 'video/ogg') return 'ogg'
40
- return contentType.startsWith('video/') ? 'mp4' : 'jpg'
41
- }
42
-
43
- export function getRemoteFilename(url: URL, contentType: string): string {
44
- const rawFilename = url.pathname.split('/').pop() ?? ''
45
-
46
- try {
47
- const decodedFilename = decodeURIComponent(rawFilename).split('?')[0]
48
- if (decodedFilename) return decodedFilename
49
- } catch {
50
- if (rawFilename) return rawFilename
51
- }
52
-
53
- const baseName = contentType.startsWith('video/') ? 'remote-video' : 'remote-image'
54
- return `${baseName}.${getFallbackExtension(contentType)}`
55
- }
@@ -1,26 +0,0 @@
1
- export type DropzoneAccept = Record<string, string[]>
2
-
3
- export function parseAcceptTypes(accept?: string, options: { lowercase?: boolean } = {}): string[] {
4
- return (accept ?? '')
5
- .split(',')
6
- .map((type) => type.trim())
7
- .filter(Boolean)
8
- .map((type) => (options.lowercase ? type.toLowerCase() : type))
9
- }
10
-
11
- export function isWildcardAccept(accept?: string): boolean {
12
- const normalized = accept?.trim()
13
- return normalized === '*' || normalized === '*/*'
14
- }
15
-
16
- export function parseDropzoneAccept(accept?: string): DropzoneAccept | undefined {
17
- const acceptTypes = parseAcceptTypes(accept)
18
- if (acceptTypes.length === 0) return undefined
19
-
20
- const entries: DropzoneAccept = {}
21
- for (const type of acceptTypes) {
22
- entries[type] = []
23
- }
24
-
25
- return Object.keys(entries).length > 0 ? entries : undefined
26
- }
@@ -1,102 +0,0 @@
1
- export interface FileValidationConfig {
2
- maxSizeInBytes?: number
3
- allowedTypes?: string[]
4
- maxFiles?: number
5
- }
6
-
7
- export interface FileValidationError {
8
- filename: string
9
- error: string
10
- }
11
-
12
- export interface FileValidationResult {
13
- valid: boolean
14
- errors: FileValidationError[]
15
- }
16
-
17
- function isFileTypeAllowed(file: File, allowedTypes: string[]): boolean {
18
- for (const type of allowedTypes) {
19
- if (type.endsWith('/*')) {
20
- const prefix = type.slice(0, -1)
21
- if (file.type.startsWith(prefix)) return true
22
- } else if (type.startsWith('.')) {
23
- if (file.name.toLowerCase().endsWith(type.toLowerCase())) return true
24
- } else {
25
- if (file.type === type) return true
26
- }
27
- }
28
- return false
29
- }
30
-
31
- export function validateFiles(
32
- files: File[],
33
- config: FileValidationConfig = {}
34
- ): FileValidationResult {
35
- const { maxSizeInBytes, allowedTypes, maxFiles } = config
36
-
37
- const errors: FileValidationError[] = []
38
-
39
- if (typeof maxFiles === 'number' && maxFiles > 0 && files.length > maxFiles) {
40
- errors.push({
41
- filename: '',
42
- error: `Too many files. Maximum is ${maxFiles}.`
43
- })
44
- }
45
-
46
- for (const file of files) {
47
- if (typeof maxSizeInBytes === 'number' && maxSizeInBytes > 0 && file.size > maxSizeInBytes) {
48
- const maxMB = Math.round(maxSizeInBytes / (1024 * 1024))
49
- errors.push({
50
- filename: file.name,
51
- error: `File exceeds maximum size of ${maxMB}MB.`
52
- })
53
- }
54
-
55
- if (allowedTypes && allowedTypes.length > 0 && !isFileTypeAllowed(file, allowedTypes)) {
56
- errors.push({
57
- filename: file.name,
58
- error: `File type "${file.type || 'unknown'}" is not allowed.`
59
- })
60
- }
61
- }
62
-
63
- return { valid: errors.length === 0, errors }
64
- }
65
-
66
- export function formatFileSize(
67
- bytes: number,
68
- options: {
69
- bytesUnit?: 'B' | 'Bytes'
70
- precision?: number
71
- trimTrailingZeros?: boolean
72
- } = {}
73
- ): string {
74
- const { bytesUnit = 'B', precision = 1, trimTrailingZeros = false } = options
75
-
76
- if (bytes === 0) return `0 ${bytesUnit}`
77
- const units = ['B', 'KB', 'MB', 'GB']
78
- const i = Math.floor(Math.log(bytes) / Math.log(1024))
79
- units[0] = bytesUnit
80
-
81
- const value = (bytes / 1024 ** i).toFixed(i === 0 ? 0 : precision)
82
- return `${trimTrailingZeros ? Number.parseFloat(value) : value} ${units[i]}`
83
- }
84
-
85
- export function isValidUrl(str: string): boolean {
86
- try {
87
- new URL(str)
88
- return true
89
- } catch {
90
- return false
91
- }
92
- }
93
-
94
- export function slugify(text: string): string {
95
- return text
96
- .toLowerCase()
97
- .trim()
98
- .replace(/[^\w\s-]/g, '')
99
- .replace(/[\s_]+/g, '-')
100
- .replace(/-+/g, '-')
101
- .replace(/^-|-$/g, '')
102
- }
@@ -1,13 +0,0 @@
1
- import { createHmac, randomBytes, randomUUID } from 'node:crypto'
2
-
3
- export function generateWebhookSecret(): string {
4
- return `whsec_${randomBytes(32).toString('hex')}`
5
- }
6
-
7
- export function createWebhookEventId(): string {
8
- return `evt_${randomUUID()}`
9
- }
10
-
11
- export function signWebhookPayload(secret: string, timestamp: string, body: string): string {
12
- return `sha256=${createHmac('sha256', secret).update(`${timestamp}.${body}`).digest('hex')}`
13
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../adapters/next/template-reader.ts","../utils/paths.ts","../constants/cli.ts","../constants/paths.ts","../utils/files.ts","../utils/text.ts","../constants/patterns.ts","../constants/scaffolding.ts","../adapters/next/config/namespace.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport { resolveCliAssetPath } from '@cli-utils/paths.js'\nimport {\n applyAdminNamespaceToContent,\n applyAdminNamespaceToPath\n} from '@next-adapter/config/namespace.js'\n\nexport function readTemplate(relativePath: string): string {\n return fs.readFileSync(\n path.join(resolveCliAssetPath('adapters', 'next', 'templates', 'init'), relativePath),\n 'utf-8'\n )\n}\n\nexport function applyNextCacheApiForVersion(content: string, nextMajorVersion: number): string {\n if (nextMajorVersion >= 16) {\n return content\n }\n\n return content\n .replace(\n /import \\{ cacheLife, cacheTag \\} from 'next\\/cache'\\n/g,\n \"import { unstable_cacheTag as cacheTag } from 'next/cache'\\n\"\n )\n .replace(/\\n {2}cacheLife\\('max'\\)/g, '')\n .replace(\n /import \\{ updateTag \\} from 'next\\/cache'\\n/g,\n \"import { revalidateTag } from 'next/cache'\\n\"\n )\n .replace(/revalidateTag\\(([^,\\n]+), \\{ expire: 0 \\}\\)/g, 'revalidateTag($1)')\n .replace(/\\bupdateTag\\(/g, 'revalidateTag(')\n}\n\nexport function readNamespacedTemplate(relativePath: string, namespace: string): string {\n return applyAdminNamespaceToContent(readTemplate(relativePath), namespace)\n}\n\nexport function namespacedTemplatePath(relativePath: string, namespace: string): string {\n return applyAdminNamespaceToPath(relativePath, namespace)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport type { CliPackageJson } from '@cli-types/core-engine/utils.js'\nimport { CLI_PACKAGE_NAME } from '@cli-constants/cli.js'\nimport { BETTERSTART_DIR } from '@cli-constants/paths.js'\nimport { findUpwards } from '@cli-utils/files.js'\n\nexport function betterstartDir(cwd: string, ...segments: string[]): string {\n return path.join(cwd, BETTERSTART_DIR, ...segments)\n}\n\nexport function toPosixPath(value: string): string {\n return value.replace(/\\\\/g, '/')\n}\n\nexport function trimDotSlash(value: string): string {\n return value.replace(/^[.][/\\\\]/, '')\n}\n\nexport function normalizePosixDir(value: string): string {\n return trimDotSlash(toPosixPath(value)).replace(/\\/+$/, '')\n}\n\nexport function toProjectAbsolutePath(cwd: string, filePath: string): string {\n return path.isAbsolute(filePath) ? filePath : path.join(cwd, ...filePath.split('/'))\n}\n\nexport function readLocalProjectFile(cwd: string, filePath: string): string | null {\n const fullPath = toProjectAbsolutePath(cwd, filePath)\n return fs.existsSync(fullPath) ? fs.readFileSync(fullPath, 'utf-8') : null\n}\n\nexport function isInsideDir(child: string, parent: string): boolean {\n const relative = path.relative(parent, child)\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative))\n}\n\nexport function 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\nexport function cleanupEmptyDirs(\n cwd: string,\n deletedPaths: string[],\n stopRoots: Iterable<string>\n): void {\n const projectRoot = path.resolve(cwd)\n const stops = new Set<string>([projectRoot, ...stopRoots])\n\n for (const deletedPath of deletedPaths) {\n let currentDir = path.dirname(toProjectAbsolutePath(cwd, deletedPath))\n\n while (isInsideDir(currentDir, projectRoot) && !stops.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 findCliPackage(): { dir: string; pkg: CliPackageJson } | null {\n const start = path.dirname(fileURLToPath(import.meta.url))\n\n return (\n findUpwards(start, (dir) => {\n const pkgPath = path.join(dir, 'package.json')\n if (!fs.existsSync(pkgPath)) return undefined\n\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')) as CliPackageJson\n return pkg.name === CLI_PACKAGE_NAME ? { dir, pkg } : undefined\n } catch {\n return undefined\n }\n }) ?? null\n )\n}\n\nexport function findCliRoot(): string {\n const found = findCliPackage()\n if (found) {\n return found.dir\n }\n\n // Fallback: assume 2 levels up from dist/\n return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..')\n}\n\nexport function getCurrentCliVersion(): string {\n return findCliPackage()?.pkg.version ?? '0.0.0'\n}\n\nexport function resolveCliAssetPath(...segments: string[]): string {\n const root = findCliRoot()\n const builtPath = path.join(root, 'dist', 'assets', ...segments)\n if (fs.existsSync(builtPath)) {\n return builtPath\n }\n\n return path.join(root, ...segments)\n}\n","export const CLI_PACKAGE_NAME = 'betterstart-cli'\nexport const REDACTED = '[redacted]'\n","import type { PackageManager } from '@cli-types/core-engine/utils.js'\n\nexport const BETTERSTART_DIR = '.betterstart'\nexport const CONFIG_FILE_NAME = 'betterstart.config.ts'\nexport const DEVELOPMENT_ENV_FILES = [\n '.env.development.local',\n '.env.local',\n '.env.development',\n '.env'\n] as const\nexport const 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","import crypto from 'node:crypto'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { parseEnv } from 'node:util'\nimport type { EnvSection, ProjectEnvValue } from '@cli-types/core-engine/env.js'\nimport type { GeneratedFile } from '@cli-types/core-engine/schema.js'\nimport type { FileSnapshot } from '@cli-types/core-engine/utils.js'\nimport { DEVELOPMENT_ENV_FILES } from '@cli-constants/paths.js'\nimport { normalizeLineEndings } from '@cli-utils/text.js'\nimport fse from 'fs-extra'\n\n/**\n * Walks from `startDir` to the filesystem root inclusive, returning the first\n * defined `visit` result. Inclusive matters: a walk that stops one level early\n * silently ignores a `package.json` or lockfile sitting at the root.\n */\nexport function findUpwards<T>(\n startDir: string,\n visit: (dir: string) => T | undefined\n): T | undefined {\n let dir = path.resolve(startDir)\n\n for (;;) {\n const found = visit(dir)\n if (found !== undefined) return found\n\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nexport function hashContent(content: string): string {\n return `sha256-${crypto.createHash('sha256').update(normalizeLineEndings(content)).digest('hex')}`\n}\n\nexport function ensureDir(dirPath: string): void {\n fse.ensureDirSync(dirPath)\n}\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\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\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\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\n/**\n * Snapshot manifests, skip lists, and conflict paths are all keyed by these\n * strings, so a Windows `\\` here would make a project's snapshots unreadable on\n * any other machine.\n */\nexport function createGeneratedFile(filePath: string, content: string): GeneratedFile {\n return {\n path: filePath.split(path.sep).join('/'),\n content\n }\n}\n\n// Next.js and TypeScript both emit `tsconfig.json` with comments and trailing commas.\nexport function 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\nexport function toStrictJson(input: string): string {\n return stripJsonComments(input).replace(/,\\s*([\\]}])/g, '$1')\n}\n\n/**\n * `node:util`'s parseEnv is the single owner of .env syntax here. A hand-rolled\n * splitter previously read `KEY=\"value\" # comment` back as `value\" # comment`\n * and understood neither `export` prefixes nor multi-line values.\n */\nexport function parseDotenvFile(filePath: string): Map<string, string> {\n if (!fs.existsSync(filePath)) return new Map()\n\n try {\n const parsed = Object.entries(parseEnv(fs.readFileSync(filePath, 'utf-8')))\n return new Map(\n parsed.filter((entry): entry is [string, string] => typeof entry[1] === 'string')\n )\n } catch {\n return new Map()\n }\n}\n\nexport function readEnvVar(cwd: string, key: string): string | undefined {\n return parseDotenvFile(path.join(cwd, '.env.local')).get(key)\n}\n\n/** Reads DEVELOPMENT_ENV_FILES in Next.js's development-file precedence order. */\nexport function resolveProjectEnvVar(cwd: string, key: string): ProjectEnvValue | undefined {\n for (const envFile of DEVELOPMENT_ENV_FILES) {\n const value = parseDotenvFile(path.join(cwd, envFile)).get(key)?.trim()\n if (value) return { source: envFile, value }\n }\n\n return undefined\n}\n\nexport function readProjectEnvVar(cwd: string, key: string): string | undefined {\n return resolveProjectEnvVar(cwd, key)?.value\n}\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 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\nexport function captureFile(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\nexport function 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","import { stripVTControlCharacters } from 'node:util'\n/**\n * `stripVTControlCharacters` also removes OSC and other C1 sequences, which a\n * CSI-only regex leaves behind on CLIs that emit terminal hyperlinks.\n * `stripCarriageReturns` additionally flattens the `\\r` a progress-spinner child\n * process uses to repaint one line, so line-based filters see a single line.\n */\nexport function stripAnsi(text: string, options: { stripCarriageReturns?: boolean } = {}): string {\n const stripped = stripVTControlCharacters(text)\n return options.stripCarriageReturns ? stripped.replaceAll('\\r', '') : stripped\n}\n\nexport function toPascalCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .split(/[-_\\s]+/)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join('')\n}\n\nexport function toCamelCase(str: string): string {\n const p = toPascalCase(str)\n return p.charAt(0).toLowerCase() + p.slice(1)\n}\n\nexport function singularize(str: string): string {\n if (str.endsWith('ies')) return `${str.slice(0, -3)}y`\n if (str.endsWith('ves')) return `${str.slice(0, -3)}f`\n if (\n str.endsWith('sses') ||\n str.endsWith('xes') ||\n str.endsWith('ches') ||\n str.endsWith('shes') ||\n str.endsWith('zes')\n )\n return str.slice(0, -2)\n if (str.endsWith('s') && !str.endsWith('ss')) return str.slice(0, -1)\n return str\n}\n\nexport function pluralize(str: string): string {\n if (str.endsWith('s') && !str.endsWith('ss')) return str\n if (str.endsWith('y') && !['ay', 'ey', 'iy', 'oy', 'uy'].some((v) => str.endsWith(v)))\n return `${str.slice(0, -1)}ies`\n if (str.endsWith('s') || str.endsWith('x') || str.endsWith('ch') || str.endsWith('sh'))\n return `${str}es`\n return `${str}s`\n}\n\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n}\n\nexport function toScreamingSnake(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toUpperCase()\n}\n\nexport function quotePropertyName(name: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`\n}\n\nexport function humanizeName(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ')\n}\n\nexport function singularizeLabel(label: string): string {\n const words = label.split(' ')\n const lastWord = words[words.length - 1]\n words[words.length - 1] = singularize(lastWord.toLowerCase())\n words[words.length - 1] =\n words[words.length - 1].charAt(0).toUpperCase() + words[words.length - 1].slice(1)\n return words.join(' ')\n}\n\n/**\n * Escapes `\\r` and `\\n` as well as the quote character: a raw newline inside an\n * emitted single- or double-quoted literal is a syntax error, so a schema label\n * containing one would otherwise emit a file that does not parse.\n */\nexport function quoteLiteral(value: string, quote = \"'\"): string {\n const escaped = value\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(new RegExp(escapeRegExp(quote), 'g'), `\\\\${quote}`)\n .replace(/\\r/g, '\\\\r')\n .replace(/\\n/g, '\\\\n')\n\n return `${quote}${escaped}${quote}`\n}\n\nexport function escapeTemplateText(value: string): string {\n return value.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$\\{/g, '\\\\${')\n}\n\nexport function normalizeLineEndings(content: string): string {\n return content.replace(/\\r\\n/g, '\\n')\n}\n\nexport function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nexport function hasConflictMarkers(content: string): boolean {\n return /^(<{7}|={7}|>{7})( |$)/m.test(content)\n}\n\nexport function splitLines(content: string): string[] {\n return normalizeLineEndings(content).split('\\n')\n}\n\nexport function normalizeWhitespace(value: string): string {\n return value.trim().replace(/\\s+/g, ' ')\n}\n\nexport function escapeJsx(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\nexport function escapeAttribute(str: string): string {\n return escapeJsx(str).replace(/\"/g, '&quot;')\n}\n\nexport function 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\nexport function 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 toTitleCase(value: string): string {\n return normalizeWhitespace(value)\n .split(' ')\n .map((word) => (word ? `${word.charAt(0).toUpperCase()}${word.slice(1).toLowerCase()}` : word))\n .join(' ')\n}\n\nexport function slugify(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/['\"]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .replace(/-+/g, '-')\n}\n","export const REMOVABLE_NAMESPACE_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\nexport const SCHEMA_NAME_PATTERN = /^[a-z][a-zA-Z0-9-]*$/\nexport const NAMESPACE_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/\nexport const MODULE_SPECIFIER_PATTERN =\n /(\\bfrom\\s*|\\bimport\\s*|\\brequire\\s*\\(\\s*|\\bimport\\s*\\(\\s*)(['\"])([^'\"\\n]+)\\2/g\nexport const EXTERNAL_PACKAGE_PATTERN =\n /^(?:@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*(?:\\/[^'\"]*)?$/\nexport const DEV_PORT_FLAG_PATTERN = /(?:^|\\s)(?:--port(?:=|\\s+)|-p(?:=|\\s+)?)(\\d+)(?=\\s|$)/\nexport const DEV_PORT_ENV_PATTERN = /(?:^|\\s)PORT=(\\d+)(?=\\s|$)/\nexport const LOCAL_PROTOCOL_PATTERN = /^(workspace|link|file|portal):/\nexport const CONFIG_IMPORT_PATTERN =\n /^import\\s+\\{[^}]*\\bdefineConfig\\b[^}]*\\}\\s+from\\s+['\"]betterstart-cli['\"];?[^\\S\\n]*$/m\nexport const 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/**\n * On accounts without the Neon integration installed, the piped (non-TTY) `integration add` opens\n * the accept-terms page in a browser and polls until the user accepts, printing the URL in a\n * \"Visit this URL if the browser does not open\" line — the only signal that it is waiting.\n */\nexport const ACCEPT_TERMS_URL_PATTERN =\n /https:\\/\\/vercel\\.com\\/\\S+\\/integrations\\/accept-terms\\/\\S+/i\n/** Printed by the Vercel CLI once its accept-terms polling succeeds. */\nexport const TERMS_ACCEPTED_PATTERN = /terms accepted/i\n","export const DEFAULT_ADMIN_NAMESPACE = 'admin'\nexport const 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}`\nexport const 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}`\nexport const DEPRECATED_ADMIN_PATH_ALIAS_SUFFIXES = ['/data/*', '/auth', '/auth/middleware']\nexport const BETTERSTART_ASSET_HOST = 'assets.betterstart.dev'\nexport const LEGACY_DEFAULT_AUTH_URL = 'http://localhost:3000'\nexport const DATABASE_URL_PLACEHOLDER = 'postgresql://...'\nexport const DEFAULT_DEV_PORT = 4242\nexport const MAIN_CSS_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]\nexport const CONFIG_IMPORT_SHIM = 'const defineConfig = <T>(config: T): T => config'\nexport const TIPTAP_CONTENT_EDITOR_DIRECTORIES = ['tiptap-extension', 'tiptap-node', 'tiptap-ui']\nexport const RAILWAY_BUCKET_ENV_KEYS = [\n 'BETTERSTART_RAILWAY_BUCKET_ENDPOINT',\n 'BETTERSTART_RAILWAY_BUCKET_ACCESS_KEY_ID',\n 'BETTERSTART_RAILWAY_BUCKET_SECRET_ACCESS_KEY',\n 'BETTERSTART_RAILWAY_BUCKET_NAME',\n 'BETTERSTART_RAILWAY_BUCKET_REGION',\n 'BETTERSTART_RAILWAY_BUCKET_URL_STYLE'\n] as const\nexport const R2_ENV_KEYS = [\n 'BETTERSTART_R2_ACCOUNT_ID',\n 'BETTERSTART_R2_ACCESS_KEY_ID',\n 'BETTERSTART_R2_SECRET_ACCESS_KEY',\n 'BETTERSTART_R2_BUCKET_NAME',\n 'BETTERSTART_R2_PUBLIC_URL'\n] as const\n","import type { BetterstartNextPaths } from '@cli-types/core-engine/config.js'\nimport type { AdminNamespace } from '@cli-types/next-adapter/config.js'\nimport {\n EXTERNAL_PACKAGE_PATTERN,\n MODULE_SPECIFIER_PATTERN,\n NAMESPACE_PATTERN\n} from '@cli-constants/patterns.js'\nimport { DEFAULT_ADMIN_NAMESPACE } from '@cli-constants/scaffolding.js'\nimport { toCamelCase, toPascalCase, toScreamingSnake } from '@cli-utils/text.js'\nexport function validateAdminNamespace(value: string): string {\n const segment = value.trim()\n\n if (!NAMESPACE_PATTERN.test(segment)) {\n throw new Error(\n 'Namespace must be one lowercase kebab-case segment starting with a letter, for example \"admin\" or \"admin-panel\".'\n )\n }\n\n return segment\n}\n\nexport function validateAdminDashboardPath(value: string): string {\n const input = value.trim()\n const segment = input.startsWith('/') ? input.slice(1) : input\n\n if (input.startsWith('/') && input !== `/${segment}`) {\n throw new Error(\n 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example \"/admin\" or \"/admin-panel\".'\n )\n }\n\n try {\n return validateAdminNamespace(segment)\n } catch {\n throw new Error(\n 'Dashboard path must be one lowercase kebab-case segment starting with a letter, for example \"/admin\" or \"/admin-panel\".'\n )\n }\n}\n\nexport function resolveAdminNamespace(value = DEFAULT_ADMIN_NAMESPACE): AdminNamespace {\n const segment = validateAdminNamespace(value)\n const pascal = toPascalCase(segment)\n\n return {\n segment,\n alias: `@${segment}`,\n camel: toCamelCase(segment),\n pascal,\n screaming: toScreamingSnake(segment),\n routePath: `/${segment}`,\n apiPath: `/api/${segment}`,\n cssRootClass: `${segment}-root`,\n globalsFile: `${segment}-globals.css`,\n routeGroup: `(${segment})`\n }\n}\n\nexport function deriveNamespacePaths(\n namespaceValue: string,\n srcDir: boolean\n): BetterstartNextPaths {\n const namespace = resolveAdminNamespace(namespaceValue)\n const appBase = srcDir ? './src/app' : './app'\n\n return {\n admin: `./${namespace.segment}`,\n schemas: `./${namespace.segment}/schemas`,\n pages: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(authenticated)`,\n login: `${appBase}/${namespace.routeGroup}/${namespace.segment}/(auth)/login`,\n api: `${appBase}/${namespace.routeGroup}/api/${namespace.segment}`\n }\n}\n\nexport function deriveMigrationsDir(namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n return `./${namespace.segment}/lib/db/migrations`\n}\n\nfunction replaceAdminDashToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('admin-', `${namespace.segment}-`)\n}\n\nfunction replaceAdminScreamingToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('ADMIN_', `${namespace.screaming}_`)\n}\n\nfunction replaceAdminPascalToken(value: string, namespace: AdminNamespace): string {\n return value.replaceAll('Admin', namespace.pascal)\n}\n\nfunction replaceAdminCamelToken(value: string, namespace: AdminNamespace): string {\n return value.replace(/\\badmin(?=[A-Z])/g, namespace.camel)\n}\n\nfunction protectExistingNamespaceLiterals(\n value: string,\n namespace: AdminNamespace\n): {\n value: string\n restore: (output: string) => string\n} {\n if (namespace.segment === DEFAULT_ADMIN_NAMESPACE) {\n return {\n value,\n restore(output: string): string {\n return output\n }\n }\n }\n\n const literals = Array.from(\n new Set([\n namespace.alias,\n namespace.apiPath,\n namespace.routePath,\n namespace.routeGroup,\n namespace.cssRootClass,\n namespace.globalsFile,\n `${namespace.segment}/`,\n `${namespace.segment}-`,\n namespace.screaming,\n namespace.pascal,\n namespace.camel\n ])\n ).sort((a, b) => b.length - a.length)\n\n const replacements: Array<[string, string]> = []\n let protectedValue = value\n\n for (const [index, literal] of literals.entries()) {\n if (!protectedValue.includes(literal)) {\n continue\n }\n\n const token = `__BSTART_NS_${index}__`\n protectedValue = protectedValue.replaceAll(literal, token)\n replacements.push([token, literal])\n }\n\n return {\n value: protectedValue,\n restore(output: string): string {\n let restored = output\n for (const [token, literal] of replacements) {\n restored = restored.replaceAll(token, literal)\n }\n return restored\n }\n }\n}\n\nexport function applyAdminNamespaceToPath(filePath: string, namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n\n const canonicalPath = filePath\n .replaceAll('lib/actions/auth/middleware.ts', 'lib/actions/auth/session.ts')\n .replaceAll('lib/actions/auth/auth.ts', 'lib/actions/auth/server.ts')\n .replaceAll('lib/actions/r2/r2.ts', 'lib/actions/r2/provider.ts')\n .replaceAll('lib/actions/resend/resend.ts', 'lib/actions/resend/provider.ts')\n .replaceAll(\n 'lib/actions/mailchimp/mailchimp.ts',\n 'lib/actions/mailchimp/add-to-mailchimp-audience.ts'\n )\n .replaceAll('(admin)', namespace.routeGroup)\n .replace(/@admin(?=\\/|$)/g, namespace.alias)\n .replace(/\\/api\\/admin(?=\\/|$)/g, namespace.apiPath)\n .replace(/(^|\\/)admin(?=\\/|$)/g, `$1${namespace.segment}`)\n\n const protectedNamespace = protectExistingNamespaceLiterals(canonicalPath, namespace)\n const namespacedPath = replaceAdminDashToken(protectedNamespace.value, namespace)\n\n return protectedNamespace.restore(namespacedPath)\n}\n\nfunction isExternalModuleSpecifier(specifier: string): boolean {\n if (specifier.startsWith('.') || specifier.startsWith('/')) {\n return false\n }\n\n if (new RegExp(`^@${DEFAULT_ADMIN_NAMESPACE}(?:/|$)`).test(specifier)) {\n return false\n }\n\n return EXTERNAL_PACKAGE_PATTERN.test(specifier)\n}\n\nfunction protectExternalModuleSpecifiers(content: string): {\n content: string\n restore: (value: string) => string\n} {\n const replacements: Array<[string, string]> = []\n\n const protectedContent = content.replace(\n MODULE_SPECIFIER_PATTERN,\n (match, prefix: string, quote: string, specifier: string) => {\n if (!isExternalModuleSpecifier(specifier)) {\n return match\n }\n\n const token = `__BETTERSTART_EXTERNAL_MODULE_${replacements.length}__`\n replacements.push([token, specifier])\n return `${prefix}${quote}${token}${quote}`\n }\n )\n\n return {\n content: protectedContent,\n restore(value: string): string {\n let restored = value\n for (const [token, specifier] of replacements) {\n restored = restored.replaceAll(token, specifier)\n }\n return restored\n }\n }\n}\n\nfunction protectAdminRoleLiterals(content: string): {\n content: string\n restore: (value: string) => string\n} {\n const protectedValues = [\n 'UserRole.ADMIN',\n \"'admin'\",\n '\"admin\"',\n '`admin`',\n '>Admin</SelectItem>',\n 'Manage admin users and roles'\n ]\n\n const replacements: Array<[string, string]> = []\n let protectedContent = content\n\n for (const [index, value] of protectedValues.entries()) {\n if (!protectedContent.includes(value)) {\n continue\n }\n\n const token = `__BETTERSTART_NAMESPACE_PROTECTED_${index}__`\n protectedContent = protectedContent.replaceAll(value, token)\n replacements.push([token, value])\n }\n\n return {\n content: protectedContent,\n restore(value: string): string {\n let restored = value\n for (const [token, original] of replacements) {\n restored = restored.replaceAll(token, original)\n }\n return restored\n }\n }\n}\n\nexport function applyAdminNamespaceToContent(content: string, namespaceValue: string): string {\n const namespace = resolveAdminNamespace(namespaceValue)\n const { content: externalSafeContent, restore: restoreExternalModules } =\n protectExternalModuleSpecifiers(content)\n const { content: protectedContent, restore } = protectAdminRoleLiterals(externalSafeContent)\n\n const canonicalContent = protectedContent\n .replaceAll('MediaListParams', `${namespace.pascal}MediaQuery`)\n .replaceAll('MediaListResult', `${namespace.pascal}MediaPage`)\n .replaceAll(\n `${namespace.pascal}MediaQuery, ${namespace.pascal}MediaPage`,\n `${namespace.pascal}MediaPage, ${namespace.pascal}MediaQuery`\n )\n .replaceAll('UserData', 'User')\n .replaceAll('UsersResponse', 'UsersPage')\n .replaceAll('SettingData', 'Setting')\n .replaceAll('UpsertSettingInput', 'SettingUpsertInput')\n .replaceAll('UpsertSettingResult', 'SettingUpsertResult')\n .replace(/\\bAdminThemeProvider\\b/g, `${namespace.pascal}ThemeProvider`)\n .replace(/\\bAdminThemeContext\\b/g, `${namespace.pascal}ThemeContext`)\n .replace(\n /import\\s+\\{\\s*admin\\s*\\}\\s+from\\s+(['\"])@admin\\/utils\\/app\\/admin\\1/g,\n (_match, quote: string) =>\n `import { ${namespace.camel} } from ${quote}${namespace.alias}/utils/app/${namespace.camel}${quote}`\n )\n .replace(/\\badmin(?=\\.name\\b)/g, namespace.camel)\n .replaceAll('@admin/auth/middleware', `${namespace.alias}/auth/session`)\n .replaceAll('@admin/auth/auth', `${namespace.alias}/auth/server`)\n .replaceAll('@admin/auth/client', `${namespace.alias}/auth/client`)\n .replace(/@admin\\/auth(?=['\"`\\s)]|$)/g, `${namespace.alias}/auth/server`)\n .replace(/(\\bimport\\b[^\\n]*\\bfrom\\s+)'\\.\\/auth'/g, \"$1'./server'\")\n .replace(/@admin(?=\\/|$)/g, namespace.alias)\n .replace(/\\/api\\/admin(?=\\/|['\"`]|$)/g, namespace.apiPath)\n .replace(/(^|\\/)admin(?=\\/|['\"`]|$)/g, `$1${namespace.segment}`)\n .replaceAll('(admin)', namespace.routeGroup)\n\n const protectedNamespace = protectExistingNamespaceLiterals(canonicalContent, namespace)\n const namespacedContent = replaceAdminCamelToken(\n replaceAdminPascalToken(\n replaceAdminScreamingToken(\n replaceAdminDashToken(protectedNamespace.value, namespace),\n namespace\n ),\n namespace\n ),\n namespace\n )\n\n return restoreExternalModules(restore(protectedNamespace.restore(namespacedContent)))\n}\n"],"mappings":"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","names":["fs","path","fs","path","path","fs","fs","path"]}
@@ -1,13 +0,0 @@
1
- import {
2
- applyNextCacheApiForVersion,
3
- namespacedTemplatePath,
4
- readNamespacedTemplate,
5
- readTemplate
6
- } from "./chunk-45Z6XDG5.js";
7
- export {
8
- applyNextCacheApiForVersion,
9
- namespacedTemplatePath,
10
- readNamespacedTemplate,
11
- readTemplate
12
- };
13
- //# sourceMappingURL=template-reader-J6G7N5V6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}