create-nextblock 0.2.78 → 0.8.0

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 (413) hide show
  1. package/bin/create-nextblock.js +740 -459
  2. package/package.json +1 -2
  3. package/scripts/sync-template.js +18 -1
  4. package/templates/nextblock-template/.browserslistrc +11 -0
  5. package/templates/nextblock-template/.swcrc +30 -30
  6. package/templates/nextblock-template/README.md +23 -114
  7. package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -28
  8. package/templates/nextblock-template/app/(auth-pages)/sign-in/page.tsx +50 -25
  9. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +111 -56
  10. package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -0
  11. package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +118 -0
  12. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -0
  13. package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -0
  14. package/templates/nextblock-template/app/[slug]/PageClientContent.tsx +48 -28
  15. package/templates/nextblock-template/app/[slug]/page.tsx +63 -6
  16. package/templates/nextblock-template/app/[slug]/page.utils.ts +374 -157
  17. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -0
  18. package/templates/nextblock-template/app/actions/consent.ts +57 -0
  19. package/templates/nextblock-template/app/actions/formActions.ts +130 -11
  20. package/templates/nextblock-template/app/actions/languageActions.ts +31 -30
  21. package/templates/nextblock-template/app/actions/package-actions.ts +183 -0
  22. package/templates/nextblock-template/app/actions/postActions.ts +146 -48
  23. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +21 -0
  24. package/templates/nextblock-template/app/actions/visualEditingActions.test.ts +179 -0
  25. package/templates/nextblock-template/app/actions/visualEditingActions.ts +345 -0
  26. package/templates/nextblock-template/app/actions.ts +67 -12
  27. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -0
  28. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -0
  29. package/templates/nextblock-template/app/api/ai/global-agent/route.ts +965 -0
  30. package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -0
  31. package/templates/nextblock-template/app/api/checkout/route.ts +146 -0
  32. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -0
  33. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -0
  34. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3413 -17
  35. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +7830 -0
  36. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +35 -0
  37. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -0
  38. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -0
  39. package/templates/nextblock-template/app/api/draft/disable/route.ts +25 -0
  40. package/templates/nextblock-template/app/api/draft/route.ts +93 -0
  41. package/templates/nextblock-template/app/api/draft/start/route.ts +77 -0
  42. package/templates/nextblock-template/app/api/media/library/route.ts +65 -0
  43. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -0
  44. package/templates/nextblock-template/app/api/media/record/route.ts +160 -0
  45. package/templates/nextblock-template/app/api/search/route.ts +43 -0
  46. package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -0
  47. package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -0
  48. package/templates/nextblock-template/app/api/webhooks/freemius/route.ts +34 -0
  49. package/templates/nextblock-template/app/api/webhooks/stripe/route.ts +27 -0
  50. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +392 -128
  51. package/templates/nextblock-template/app/article/[slug]/page.tsx +179 -127
  52. package/templates/nextblock-template/app/article/[slug]/page.utils.ts +262 -77
  53. package/templates/nextblock-template/app/auth/callback/route.ts +31 -58
  54. package/templates/nextblock-template/app/cart/page.tsx +7 -0
  55. package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -0
  56. package/templates/nextblock-template/app/checkout/page.tsx +52 -0
  57. package/templates/nextblock-template/app/checkout/success/actions.ts +136 -0
  58. package/templates/nextblock-template/app/checkout/success/page.tsx +186 -0
  59. package/templates/nextblock-template/app/cms/CmsClientLayout.tsx +163 -33
  60. package/templates/nextblock-template/app/cms/blocks/actions.ts +424 -235
  61. package/templates/nextblock-template/app/cms/blocks/components/BackgroundSelector.tsx +212 -151
  62. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorArea.tsx +41 -20
  63. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +152 -19
  64. package/templates/nextblock-template/app/cms/blocks/components/BlockTypeCard.tsx +25 -17
  65. package/templates/nextblock-template/app/cms/blocks/components/BlockTypeSelector.tsx +200 -18
  66. package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +33 -16
  67. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -0
  68. package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +37 -18
  69. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -67
  70. package/templates/nextblock-template/app/cms/blocks/components/SectionConfigPanel.tsx +108 -31
  71. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -0
  72. package/templates/nextblock-template/app/cms/blocks/editors/FeaturedProductBlockEditor.tsx +31 -0
  73. package/templates/nextblock-template/app/cms/blocks/editors/FormBlockEditor.tsx +2 -2
  74. package/templates/nextblock-template/app/cms/blocks/editors/HeadingBlockEditor.tsx +1 -1
  75. package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
  76. package/templates/nextblock-template/app/cms/blocks/editors/PostsGridBlockEditor.tsx +14 -18
  77. package/templates/nextblock-template/app/cms/blocks/editors/ProductGridBlockEditor.tsx +41 -0
  78. package/templates/nextblock-template/app/cms/blocks/editors/SectionBlockEditor.tsx +318 -118
  79. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +98 -21
  80. package/templates/nextblock-template/app/cms/blocks/editors/VideoEmbedBlockEditor.tsx +1 -1
  81. package/templates/nextblock-template/app/cms/components/ContentLanguageSwitcher.tsx +27 -9
  82. package/templates/nextblock-template/app/cms/components/CopyContentFromLanguage.tsx +1 -1
  83. package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -0
  84. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -0
  85. package/templates/nextblock-template/app/cms/components/CortexGlobalAgentChat.tsx +1507 -0
  86. package/templates/nextblock-template/app/cms/components/DraftStatusActions.tsx +145 -0
  87. package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -0
  88. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +38 -24
  89. package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -0
  90. package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -0
  91. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -0
  92. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -0
  93. package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -0
  94. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -0
  95. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -0
  96. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -0
  97. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -0
  98. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -0
  99. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -98
  100. package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -0
  101. package/templates/nextblock-template/app/cms/dashboard/page.tsx +182 -154
  102. package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +391 -0
  103. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -0
  104. package/templates/nextblock-template/app/cms/layout.tsx +29 -10
  105. package/templates/nextblock-template/app/cms/media/UploadFolderContext.tsx +22 -22
  106. package/templates/nextblock-template/app/cms/media/actions.ts +45 -124
  107. package/templates/nextblock-template/app/cms/media/components/DeleteMediaButtonClient.tsx +1 -1
  108. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  109. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -64
  110. package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +227 -158
  111. package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -89
  112. package/templates/nextblock-template/app/cms/media/page.tsx +1 -1
  113. package/templates/nextblock-template/app/cms/navigation/components/NavigationItemForm.tsx +2 -2
  114. package/templates/nextblock-template/app/cms/orders/[id]/MarkPaidButton.tsx +44 -0
  115. package/templates/nextblock-template/app/cms/orders/[id]/page.tsx +16 -0
  116. package/templates/nextblock-template/app/cms/orders/actions.ts +201 -0
  117. package/templates/nextblock-template/app/cms/orders/page.tsx +20 -0
  118. package/templates/nextblock-template/app/cms/orders/types.ts +20 -0
  119. package/templates/nextblock-template/app/cms/pages/[id]/edit/EditPageClient.tsx +156 -121
  120. package/templates/nextblock-template/app/cms/pages/[id]/edit/page.tsx +79 -26
  121. package/templates/nextblock-template/app/cms/pages/actions.ts +54 -38
  122. package/templates/nextblock-template/app/cms/pages/components/DeletePageButtonClient.tsx +1 -1
  123. package/templates/nextblock-template/app/cms/pages/components/PageForm.tsx +267 -116
  124. package/templates/nextblock-template/app/cms/pages/page.tsx +25 -18
  125. package/templates/nextblock-template/app/cms/payments/page.tsx +16 -0
  126. package/templates/nextblock-template/app/cms/posts/[id]/edit/page.tsx +132 -90
  127. package/templates/nextblock-template/app/cms/posts/actions.ts +71 -72
  128. package/templates/nextblock-template/app/cms/posts/components/DeletePostButtonClient.tsx +1 -1
  129. package/templates/nextblock-template/app/cms/posts/components/PostForm.tsx +256 -245
  130. package/templates/nextblock-template/app/cms/posts/new/page.tsx +1 -1
  131. package/templates/nextblock-template/app/cms/posts/page.tsx +20 -13
  132. package/templates/nextblock-template/app/cms/products/ClientNotionEditor.tsx +16 -0
  133. package/templates/nextblock-template/app/cms/products/ProductFormClientShell.tsx +56 -0
  134. package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +292 -0
  135. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -0
  136. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -0
  137. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -0
  138. package/templates/nextblock-template/app/cms/products/new/page.tsx +143 -0
  139. package/templates/nextblock-template/app/cms/products/page.tsx +42 -0
  140. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -0
  141. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -0
  142. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -0
  143. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -0
  144. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -0
  145. package/templates/nextblock-template/app/cms/revisions/RevisionHistoryButton.tsx +2 -2
  146. package/templates/nextblock-template/app/cms/revisions/actions.ts +285 -285
  147. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -16
  148. package/templates/nextblock-template/app/cms/revisions/utils.ts +8 -3
  149. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -0
  150. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -0
  151. package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -0
  152. package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -0
  153. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -0
  154. package/templates/nextblock-template/app/cms/settings/copyright/actions.ts +1 -1
  155. package/templates/nextblock-template/app/cms/settings/copyright/components/CopyrightForm.tsx +2 -2
  156. package/templates/nextblock-template/app/cms/settings/copyright/page.tsx +1 -1
  157. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +496 -0
  158. package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -0
  159. package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +248 -0
  160. package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -0
  161. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -0
  162. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -0
  163. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -0
  164. package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +203 -44
  165. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -242
  166. package/templates/nextblock-template/app/cms/settings/global-css/actions.ts +65 -0
  167. package/templates/nextblock-template/app/cms/settings/global-css/components/GlobalCssForm.tsx +46 -0
  168. package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +24 -0
  169. package/templates/nextblock-template/app/cms/settings/languages/components/DeleteLanguageButton.tsx +1 -1
  170. package/templates/nextblock-template/app/cms/settings/languages/components/LanguageForm.tsx +2 -2
  171. package/templates/nextblock-template/app/cms/settings/languages/page.tsx +1 -1
  172. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  173. package/templates/nextblock-template/app/cms/settings/logos/actions.ts +82 -6
  174. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -0
  175. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -18
  176. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -16
  177. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -0
  178. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  179. package/templates/nextblock-template/app/cms/settings/logos/page.tsx +120 -82
  180. package/templates/nextblock-template/app/cms/settings/logos/types.ts +8 -8
  181. package/templates/nextblock-template/app/cms/settings/packages/activation-form.tsx +84 -0
  182. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -0
  183. package/templates/nextblock-template/app/cms/settings/packages/page.tsx +49 -0
  184. package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +53 -0
  185. package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +196 -0
  186. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +26 -0
  187. package/templates/nextblock-template/app/cms/settings/security/actions.ts +251 -0
  188. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +453 -0
  189. package/templates/nextblock-template/app/cms/settings/security/page.tsx +13 -0
  190. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -0
  191. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -0
  192. package/templates/nextblock-template/app/cms/users/[id]/edit/page.tsx +28 -23
  193. package/templates/nextblock-template/app/cms/users/actions.ts +105 -40
  194. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +1 -1
  195. package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +65 -152
  196. package/templates/nextblock-template/app/cms/users/page.tsx +15 -10
  197. package/templates/nextblock-template/app/globals.css +9 -0
  198. package/templates/nextblock-template/app/layout.tsx +372 -120
  199. package/templates/nextblock-template/app/lib/seo.test.ts +52 -0
  200. package/templates/nextblock-template/app/lib/seo.ts +279 -0
  201. package/templates/nextblock-template/app/lib/site-settings.ts +87 -0
  202. package/templates/nextblock-template/app/lib/sitemap-utils.ts +224 -39
  203. package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -0
  204. package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -0
  205. package/templates/nextblock-template/app/lib/ucp/server.ts +1914 -0
  206. package/templates/nextblock-template/app/page.tsx +165 -73
  207. package/templates/nextblock-template/app/product/[slug]/page.tsx +433 -0
  208. package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -0
  209. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -0
  210. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -0
  211. package/templates/nextblock-template/app/profile/account-data.ts +37 -0
  212. package/templates/nextblock-template/app/profile/account-links.ts +22 -0
  213. package/templates/nextblock-template/app/profile/account-types.ts +11 -0
  214. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -0
  215. package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -0
  216. package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -0
  217. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -0
  218. package/templates/nextblock-template/app/profile/page.tsx +51 -0
  219. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -0
  220. package/templates/nextblock-template/app/profile/password/actions.ts +59 -0
  221. package/templates/nextblock-template/app/profile/password/page.tsx +27 -0
  222. package/templates/nextblock-template/app/providers.tsx +55 -17
  223. package/templates/nextblock-template/app/robots.txt/route.ts +11 -1
  224. package/templates/nextblock-template/app/sitemap.ts +128 -0
  225. package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -0
  226. package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -0
  227. package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -0
  228. package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -0
  229. package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -0
  230. package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -0
  231. package/templates/nextblock-template/components/AppShell.tsx +154 -0
  232. package/templates/nextblock-template/components/BlockRenderer.tsx +210 -64
  233. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -0
  234. package/templates/nextblock-template/components/CartTranslator.tsx +210 -0
  235. package/templates/nextblock-template/components/CurrentContentSetter.tsx +25 -0
  236. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -0
  237. package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -0
  238. package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -0
  239. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -0
  240. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -0
  241. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -0
  242. package/templates/nextblock-template/components/GitHubLoginButton.tsx +36 -0
  243. package/templates/nextblock-template/components/GlobalSearch.tsx +557 -0
  244. package/templates/nextblock-template/components/Header.tsx +49 -41
  245. package/templates/nextblock-template/components/LanguageSwitcher.tsx +55 -32
  246. package/templates/nextblock-template/components/ResponsiveNav.tsx +138 -43
  247. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -8
  248. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -55
  249. package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +42 -37
  250. package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +6 -2
  251. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -0
  252. package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -0
  253. package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -84
  254. package/templates/nextblock-template/components/blocks/renderers/CartBlockRenderer.tsx +17 -0
  255. package/templates/nextblock-template/components/blocks/renderers/CheckoutBlockRenderer.tsx +19 -0
  256. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +262 -8
  257. package/templates/nextblock-template/components/blocks/renderers/FeaturedProductBlockRenderer.tsx +22 -0
  258. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +320 -37
  259. package/templates/nextblock-template/components/blocks/renderers/HeadingBlockRenderer.tsx +11 -8
  260. package/templates/nextblock-template/components/blocks/renderers/ImageBlockRenderer.tsx +12 -3
  261. package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +18 -13
  262. package/templates/nextblock-template/components/blocks/renderers/ProductDetailsBlockRenderer.tsx +90 -0
  263. package/templates/nextblock-template/components/blocks/renderers/ProductGridBlockRenderer.tsx +31 -0
  264. package/templates/nextblock-template/components/blocks/renderers/SectionBlockRenderer.tsx +424 -55
  265. package/templates/nextblock-template/components/blocks/renderers/SectionSlider.tsx +137 -0
  266. package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -0
  267. package/templates/nextblock-template/components/blocks/renderers/TextBlockRenderer.tsx +37 -22
  268. package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +23 -15
  269. package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +1 -3
  270. package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +1 -3
  271. package/templates/nextblock-template/components/blocks/types.ts +7 -6
  272. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  273. package/templates/nextblock-template/components/form-message.tsx +32 -26
  274. package/templates/nextblock-template/components/header-auth.tsx +69 -17
  275. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +127 -0
  276. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +59 -0
  277. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -0
  278. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -0
  279. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -0
  280. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  281. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -0
  282. package/templates/nextblock-template/components/visual-editing/NextblockVisualEditing.tsx +1172 -0
  283. package/templates/nextblock-template/context/AuthContext.tsx +23 -90
  284. package/templates/nextblock-template/context/CurrentContentContext.tsx +10 -4
  285. package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
  286. package/templates/nextblock-template/context/language-rest-client.ts +31 -0
  287. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -0
  288. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -0
  289. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -0
  290. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +252 -0
  291. package/templates/nextblock-template/docs/05-DEVELOPER-GUIDE.md +238 -0
  292. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +125 -0
  293. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -0
  294. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -0
  295. package/templates/nextblock-template/docs/09-LIVE-DRAFT-MODE.md +104 -0
  296. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -0
  297. package/templates/nextblock-template/docs/README.md +34 -0
  298. package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12507 -0
  299. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -14
  300. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -0
  301. package/templates/nextblock-template/index.d.ts +2 -0
  302. package/templates/nextblock-template/lib/ai-block-generation.ts +339 -0
  303. package/templates/nextblock-template/lib/ai-client.ts +247 -0
  304. package/templates/nextblock-template/lib/ai-config.ts +81 -0
  305. package/templates/nextblock-template/lib/ai-cortex-widget-builder.ts +125 -0
  306. package/templates/nextblock-template/lib/ai-global-agent-custom-block-tools.ts +363 -0
  307. package/templates/nextblock-template/lib/ai-global-agent-db-tools.test.ts +405 -0
  308. package/templates/nextblock-template/lib/ai-global-agent-db-tools.ts +1228 -0
  309. package/templates/nextblock-template/lib/ai-global-agent-ecommerce.ts +5 -0
  310. package/templates/nextblock-template/lib/ai-global-agent-tools-stats.test.ts +223 -0
  311. package/templates/nextblock-template/lib/ai-global-agent-tools.test.ts +2183 -0
  312. package/templates/nextblock-template/lib/ai-global-agent-tools.ts +4807 -0
  313. package/templates/nextblock-template/lib/ai-key-crypto.test.ts +70 -0
  314. package/templates/nextblock-template/lib/ai-key-crypto.ts +132 -0
  315. package/templates/nextblock-template/lib/ai-model-catalog.test.ts +49 -0
  316. package/templates/nextblock-template/lib/ai-model-catalog.ts +41 -0
  317. package/templates/nextblock-template/lib/ai-model-registry.test.ts +231 -0
  318. package/templates/nextblock-template/lib/ai-model-registry.ts +522 -0
  319. package/templates/nextblock-template/lib/auth/cookies.ts +47 -0
  320. package/templates/nextblock-template/lib/auth/crypto.ts +42 -0
  321. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -0
  322. package/templates/nextblock-template/lib/auth/twoFactor.ts +167 -0
  323. package/templates/nextblock-template/lib/auth-redirects.ts +46 -0
  324. package/templates/nextblock-template/lib/blocks/FeaturedProductBlock.tsx +94 -0
  325. package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +137 -0
  326. package/templates/nextblock-template/lib/blocks/README.md +13 -670
  327. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +138 -56
  328. package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -0
  329. package/templates/nextblock-template/lib/blocks/ecommerce-block-schemas.ts +31 -0
  330. package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +77 -0
  331. package/templates/nextblock-template/lib/cms-transfer/csv.ts +399 -0
  332. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -0
  333. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -0
  334. package/templates/nextblock-template/lib/cortex-widget-registry.test.ts +199 -0
  335. package/templates/nextblock-template/lib/cortex-widget-registry.ts +88 -0
  336. package/templates/nextblock-template/lib/cortex-widget-schema.test.tsx +237 -0
  337. package/templates/nextblock-template/lib/cortex-widget-schema.ts +393 -0
  338. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -0
  339. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -0
  340. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -0
  341. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +68 -0
  342. package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -0
  343. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -0
  344. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -0
  345. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -0
  346. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -0
  347. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -0
  348. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -0
  349. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -0
  350. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -0
  351. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -0
  352. package/templates/nextblock-template/lib/full-backup/server.ts +743 -0
  353. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +45 -0
  354. package/templates/nextblock-template/lib/posts/readTime.ts +60 -0
  355. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -0
  356. package/templates/nextblock-template/lib/privacy/settings.ts +103 -0
  357. package/templates/nextblock-template/lib/privacy/types.ts +67 -0
  358. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -0
  359. package/templates/nextblock-template/lib/promotions/server.ts +741 -0
  360. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -0
  361. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -0
  362. package/templates/nextblock-template/lib/search/server.ts +585 -0
  363. package/templates/nextblock-template/lib/search/types.ts +27 -0
  364. package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -0
  365. package/templates/nextblock-template/lib/visual-editing/draft-content.ts +380 -0
  366. package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -0
  367. package/templates/nextblock-template/lib/visual-editing/draft-route.ts +82 -0
  368. package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -0
  369. package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -0
  370. package/templates/nextblock-template/lib/visual-editing/mutations.ts +190 -0
  371. package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -0
  372. package/templates/nextblock-template/lib/visual-editing/product-drafts.ts +511 -0
  373. package/templates/nextblock-template/lib/visual-editing/types.ts +122 -0
  374. package/templates/nextblock-template/lib/zod-config.ts +5 -0
  375. package/templates/nextblock-template/next.config.js +190 -66
  376. package/templates/nextblock-template/package.json +34 -30
  377. package/templates/nextblock-template/proxy.ts +435 -253
  378. package/templates/nextblock-template/public/images/NBcover.webp +0 -0
  379. package/templates/nextblock-template/public/images/cap.webp +0 -0
  380. package/templates/nextblock-template/public/images/commerce-plan.webp +0 -0
  381. package/templates/nextblock-template/public/images/commerce-square.webp +0 -0
  382. package/templates/nextblock-template/public/images/commerce-wide.webp +0 -0
  383. package/templates/nextblock-template/public/images/cortex-ai-square.webp +0 -0
  384. package/templates/nextblock-template/public/images/cortex-ai.webp +0 -0
  385. package/templates/nextblock-template/public/images/extensibility.webp +0 -0
  386. package/templates/nextblock-template/public/images/goals.webp +0 -0
  387. package/templates/nextblock-template/public/images/included.webp +0 -0
  388. package/templates/nextblock-template/public/images/nx-graph.webp +0 -0
  389. package/templates/nextblock-template/public/images/pants.webp +0 -0
  390. package/templates/nextblock-template/public/images/t-shirt.webp +0 -0
  391. package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -0
  392. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +100 -0
  393. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -0
  394. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -0
  395. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -0
  396. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -0
  397. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -0
  398. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -0
  399. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -0
  400. package/templates/nextblock-template/tailwind.config.js +1 -0
  401. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -0
  402. package/templates/nextblock-template/tools/deploy-supabase.js +69 -71
  403. package/templates/nextblock-template/tsconfig.json +52 -66
  404. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  405. package/templates/nextblock-template/types/jsdom.d.ts +6 -0
  406. package/templates/nextblock-template/app/force-styles.tsx +0 -31
  407. package/templates/nextblock-template/app/sitemap.xml/route.ts +0 -63
  408. package/templates/nextblock-template/components/blocks/renderers/HeroBlockRenderer.tsx +0 -273
  409. package/templates/nextblock-template/docs/How to Create a Custom Block.md +0 -149
  410. package/templates/nextblock-template/docs/cms-application-overview.md +0 -56
  411. package/templates/nextblock-template/docs/cms-architecture-overview.md +0 -73
  412. package/templates/nextblock-template/docs/files-structure.md +0 -426
  413. package/templates/nextblock-template/docs/tiptap-bundle-optimization-summary.md +0 -174
@@ -0,0 +1,252 @@
1
+ # 04 Database and Auth
2
+
3
+ ## Source of Truth
4
+
5
+ The database and auth implementation is spread across:
6
+
7
+ - `libs/db/src/lib/supabase/*`
8
+ - `libs/db/src/lib/package-validation.ts`
9
+ - `libs/db/src/supabase/config.toml`
10
+ - `libs/db/src/supabase/migrations/*`
11
+ - `apps/nextblock/app/auth/callback/route.ts`
12
+ - `apps/nextblock/app/cms/*`
13
+
14
+ When documentation and a migration disagree, the migration folder is the final
15
+ authority for schema, triggers, grants, and policies.
16
+
17
+ ## Supabase Client Surfaces
18
+
19
+ `libs/db/src/server.ts` currently exports:
20
+
21
+ - `createClient()`: request-scoped server client using auth cookies
22
+ - `getProfileWithRoleServerSide()`
23
+ - `getActiveLanguagesServerSide()`
24
+ - `getServiceRoleSupabaseClient()`
25
+ - `getSsgSupabaseClient()`
26
+ - package activation helpers such as `verifyPackageOnline()`
27
+
28
+ Practical usage in the app is split by trust level:
29
+
30
+ - normal server routes and components use `createClient()`
31
+ - public static-ish reads often use `getSsgSupabaseClient()`
32
+ - admin or system workflows use `getServiceRoleSupabaseClient()`
33
+
34
+ ## Auth Flow
35
+
36
+ ### Session exchange
37
+
38
+ `app/auth/callback/route.ts` handles Supabase auth callback exchanges:
39
+
40
+ 1. read the `code` query parameter
41
+ 2. exchange it for a session with `supabase.auth.exchangeCodeForSession()`
42
+ 3. load the user's profile and role
43
+ 4. redirect through `resolvePostAuthRedirect()`
44
+
45
+ ### Profile creation
46
+
47
+ The first-user and profile bootstrap logic lives in the database, not in React
48
+ code.
49
+
50
+ `00000000000005_setup_functions_and_triggers.sql` defines:
51
+
52
+ - `handle_new_user()`
53
+ - `on_auth_user_created` trigger on `auth.users`
54
+
55
+ That trigger:
56
+
57
+ - creates the first local admin automatically
58
+ - creates later users as `USER`
59
+ - inserts or updates `profiles`
60
+ - copies selected metadata such as `full_name`, avatar URL, and GitHub username
61
+
62
+ ### CMS authorization
63
+
64
+ The CMS shell in `app/cms/CmsClientLayout.tsx` currently expects:
65
+
66
+ - an authenticated user
67
+ - a resolved profile role of `ADMIN` or `WRITER`
68
+
69
+ Writers and admins can enter the CMS. Admin-only navigation is used for
70
+ settings such as payments, shipping, users, and some branding/config surfaces.
71
+
72
+ ### No live app middleware file
73
+
74
+ There is a generic Supabase middleware helper in `libs/db/src/lib/supabase`,
75
+ but there is no live `apps/nextblock/middleware.ts` file in the current app.
76
+ Document the callback, layout, and RLS model as the active auth path rather
77
+ than assuming middleware-based route protection is in use.
78
+
79
+ ## Schema Overview
80
+
81
+ ### Core platform tables
82
+
83
+ Defined primarily in `00000000000001_setup_cms_core.sql`:
84
+
85
+ - `site_settings`
86
+ - `profiles`
87
+ - `user_addresses`
88
+ - `languages`
89
+ - `media`
90
+ - `translations`
91
+ - `logos`
92
+
93
+ ### Content tables
94
+
95
+ Defined primarily in `00000000000002_setup_content_tables.sql`:
96
+
97
+ - `posts`
98
+ - `pages`
99
+ - `blocks`
100
+ - `navigation_items`
101
+ - `page_revisions`
102
+ - `post_revisions`
103
+
104
+ ### Commerce tables
105
+
106
+ Defined across `00000000000003` and `00000000000004`:
107
+
108
+ - `products`
109
+ - `product_media`
110
+ - `product_attributes`
111
+ - `product_attribute_terms`
112
+ - `product_variants`
113
+ - `inventory_items`
114
+ - `variant_attribute_mapping`
115
+ - `package_activations`
116
+ - `freemius_plans`
117
+ - `freemius_pricing`
118
+ - `orders`
119
+ - `order_items`
120
+ - `shipping_zones`
121
+ - `shipping_zone_locations`
122
+ - `shipping_zone_methods`
123
+ - `tax_rates`
124
+ - `currencies`
125
+
126
+ ### Post-baseline tables
127
+
128
+ Added after the squashed baseline by later migrations:
129
+
130
+ - `categories` and `product_categories` — catalog organization
131
+ (migration `00000000000019`; translated via `00000000000020`)
132
+ - `custom_block_definitions` — data-driven custom block registry
133
+ (migration `00000000000023`; see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md))
134
+ - `ucp_cart_sessions` — persisted cart sessions (migration `00000000000024`)
135
+ - a `blocks` JSONB column plus `product_id` link for block-based product
136
+ descriptions (migration `00000000000017`)
137
+
138
+ ## Row Level Security Patterns
139
+
140
+ `00000000000006_setup_rls_and_grants.sql` is the consolidated RLS file.
141
+
142
+ The high-level access model is:
143
+
144
+ - public read access for languages, media, translations, published content, and
145
+ several storefront commerce tables
146
+ - authenticated self-service access for user addresses and customer-owned
147
+ orders
148
+ - `ADMIN` or `WRITER` write access for most CMS authoring tables
149
+ - `ADMIN`-only write access for higher-risk configuration surfaces
150
+ - `service_role` full access where background jobs or system syncs need it
151
+
152
+ Commerce-specific policy highlights include:
153
+
154
+ - public read access for products, product media, product attributes, variants,
155
+ shipping zones, shipping methods, tax rates, and active currencies
156
+ - customer-scoped read access for `orders` and `order_items`
157
+ - service-role management access for orders, order items, inventory, taxes, and
158
+ currencies
159
+
160
+ ## Migration Structure
161
+
162
+ ### Current reality
163
+
164
+ The current padded migration sequence in
165
+ `libs/db/src/supabase/migrations` runs from:
166
+
167
+ - `00000000000000`
168
+ - through `00000000000024`
169
+
170
+ The first files (`00000000000000` through `00000000000016`) are squashed,
171
+ grouped baseline domains. Everything from `00000000000017` onward is an
172
+ append-only forward migration added after the baseline.
173
+
174
+ These files are already squashed and grouped. Several of them preserve older
175
+ logical migration boundaries through embedded comment headers, so you will see
176
+ historical section numbers inside a smaller set of physical files.
177
+
178
+ ### Production migration policy
179
+
180
+ NextBlock has live Supabase data. Treat migrations as append-only for any
181
+ production or shared database change.
182
+
183
+ - Do not edit, recycle, squash, reorder, or delete migration files that may
184
+ already be recorded in a shared or production Supabase project.
185
+ - Add a new forward-only `.sql` file under
186
+ `libs/db/src/supabase/migrations` for each new schema/data change.
187
+ - Keep migrations non-destructive by default. Avoid dropping or rewriting data
188
+ that may include orders, users, payments, or customer records.
189
+ - Run `npm run db:migrate:check` before `npm run db:migrate`.
190
+ - If an existing database lists old baseline files such as
191
+ `00000000000000_setup_foundation_and_enums.sql` as pending, do not replay
192
+ them. Use `npm run db:migrate:repair-history:check`, then
193
+ `npm run db:migrate:repair-history`, then rerun
194
+ `npm run db:migrate:check`.
195
+ - Use `npm run db:migrate:fresh` only for a brand-new empty database.
196
+
197
+ ### Category map
198
+
199
+ | Migration file | Domain | What it covers |
200
+ | :-- | :-- | :-- |
201
+ | `00000000000000_setup_foundation_and_enums.sql` | Core | Shared enums and schema-level foundation |
202
+ | `00000000000001_setup_cms_core.sql` | Core, CMS | settings, profiles, languages, media, translations, logos |
203
+ | `00000000000002_setup_content_tables.sql` | CMS | pages, posts, blocks, navigation, revisions |
204
+ | `00000000000003_setup_catalog_and_licensing.sql` | Commerce | catalog, variants, inventory cache tables, package activations, Freemius sync tables |
205
+ | `00000000000004_setup_fulfillment_shipping_taxes_and_currencies.sql` | Fulfillment, Commerce | orders, shipping, taxes, currencies, price-map sync functions |
206
+ | `00000000000005_setup_functions_and_triggers.sql` | Core, CMS, Fulfillment | auth/profile bootstrap, timestamps, invoice functions, inventory deduction, product upsert helpers |
207
+ | `00000000000006_setup_rls_and_grants.sql` | Security | grants, RLS enablement, policies |
208
+ | `00000000000007_setup_indexes.sql` | Core, CMS, Commerce | performance indexes across authoring and commerce tables |
209
+ | `00000000000008_seed_platform_defaults.sql` | Seeds | baseline site settings, default languages, default currencies |
210
+ | `00000000000009_seed_translations.sql` | Seeds | translation catalog |
211
+ | `00000000000010_seed_content_scaffold.sql` | Seeds, CMS | starter content, scaffold pages, seeded copy |
212
+ | `00000000000011_setup_cortex_ai_settings.sql` | AI, Settings | Cortex AI settings and provider defaults |
213
+ | `00000000000012_setup_commerce_coupons.sql` | Commerce | coupon tables and related commerce constraints |
214
+ | `00000000000013_setup_cortex_ai_db_mutation_audit.sql` | AI, Audit | Cortex AI database mutation audit support |
215
+ | `00000000000014_setup_content_drafts.sql` | CMS, Editor | visual-editing content draft tables |
216
+ | `00000000000015_setup_product_drafts.sql` | Commerce, Editor | product draft workflow support |
217
+ | `00000000000016_add_feature_image_to_pages.sql` | CMS | optional page feature image media relationship |
218
+ | `00000000000017_add_product_blocks.sql` | Commerce, Editor | block-based product descriptions (`blocks` JSONB column and `product_id` link) |
219
+ | `00000000000018_setup_bot_protection_settings.sql` | CMS, Security | Turnstile/reCAPTCHA bot-protection settings for forms; sensitive site-settings key protection |
220
+ | `00000000000019_add_product_categories.sql` | Commerce | `categories` and `product_categories` junction tables |
221
+ | `00000000000020_add_category_translations.sql` | Commerce, i18n | `name_translations` / `description_translations` on categories |
222
+ | `00000000000021_migrate_hero_blocks_to_sections.sql` | CMS, Editor | data migration converting legacy `hero` blocks into `section` blocks (`is_hero`) |
223
+ | `00000000000022_seed_cortex_ai_guide_post.sql` | Seeds, AI | seeds the Cortex AI guide post |
224
+ | `00000000000023_setup_custom_block_definitions.sql` | CMS, Editor | `custom_block_definitions` registry, validation functions, `duplicate_block_definition` RPC, and RLS (see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md)) |
225
+ | `00000000000024_setup_ucp_cart_sessions.sql` | Commerce | `ucp_cart_sessions` table and update trigger for persisted carts |
226
+
227
+ ### How to read the folder
228
+
229
+ Read the migrations in lexical order from `00000000000000` upward.
230
+
231
+ That sequence is the cleanest under-the-hood blueprint for:
232
+
233
+ - which tables exist
234
+ - what triggers and functions are available
235
+ - what security rules are enforced
236
+ - what default content and configuration are seeded
237
+
238
+ If you need to understand whether the platform really supports something, check
239
+ the migration file first, then trace the corresponding route or library code.
240
+
241
+ ## Important Site Settings in Active Use
242
+
243
+ These keys are actively referenced by the current codebase:
244
+
245
+ - `enabled_payment_providers`
246
+ - `ecommerce_inventory_settings`
247
+ - `invoice_settings`
248
+ - `footer_copyright`
249
+ - `is_admin_created`
250
+
251
+ There are many more seeded settings, but these are the most important ones for
252
+ understanding current runtime behavior.
@@ -0,0 +1,238 @@
1
+ # 05 Developer Guide
2
+
3
+ ## Local Setup
4
+
5
+ The root developer workflow is defined by the workspace `package.json` and the
6
+ setup helper in `tools/scripts/setup.mjs`.
7
+
8
+ ### Prerequisites
9
+
10
+ `npm run setup` is interactive and asks for credentials from three services, so
11
+ create them first:
12
+
13
+ 1. **Supabase project** (https://supabase.com/dashboard) — Reference ID
14
+ (Project Settings → General), connection string (Connect → Direct connection →
15
+ URI), anon + service_role keys (Project Settings → API Keys), and a Personal
16
+ Access Token (Account → Access Tokens → Generate new token).
17
+ 2. **Cloudflare R2 bucket** (https://dash.cloudflare.com → R2) — create a bucket,
18
+ enable its Public Development URL (Bucket → Settings → General), and create an
19
+ Account API token (R2 → Manage API Tokens) with Object Read & Write. Copy the
20
+ Access Key ID and Secret Access Key (the secret is shown only once).
21
+ 3. **SMTP credentials** (SMTP2GO works very well) — required so Supabase can send
22
+ the confirmation email the first admin needs to sign in.
23
+
24
+ ### Run it
25
+
26
+ ```bash
27
+ npm install
28
+ npm run setup
29
+ npx nx serve nextblock
30
+ ```
31
+
32
+ What `npm run setup` does:
33
+
34
+ - creates `.env.local` from `.env.exemple` if needed
35
+ - prompts for Supabase, Cloudflare R2, and SMTP details (all required)
36
+ - writes `NEXT_PUBLIC_URL` and auto-generates `CRON_SECRET`,
37
+ `DRAFT_MODE_SECRET`, and `REVALIDATE_SECRET_TOKEN`
38
+ - links the local Supabase CLI workdir to your project (`npm run db:link`)
39
+ - applies the full schema baseline to the new database
40
+ (`npm run db:migrate:fresh`)
41
+ - syncs hosted Supabase Auth — custom SMTP and branded email templates
42
+ (`npm run configure:supabase-auth`)
43
+
44
+ If you skip `npm run setup`, the misspelled root sample file `.env.exemple` is
45
+ the reference template for manual environment setup.
46
+
47
+ ### First login
48
+
49
+ `npx nx serve nextblock` serves the app at **http://localhost:4200** (the
50
+ `@nx/next:server` default port). Open `/sign-up` and register: the **first**
51
+ account to sign up is automatically promoted to **ADMIN** by a database trigger
52
+ (`handle_new_user`). Email confirmation is enabled by default, so click the
53
+ confirmation link (delivered through the SMTP you configured) — or confirm the
54
+ user manually in Supabase → Authentication → Users. After signing in you land in
55
+ the CMS at `/cms/dashboard`. Every later sign-up gets the `USER` role.
56
+
57
+ ## Common Commands
58
+
59
+ ### App and library workflows
60
+
61
+ - `npx nx serve nextblock`: start the main app in development
62
+ - `npm run lint`: run Nx lint targets across the workspace
63
+ - `npm run nx:lint:nextblock`: lint the main app only
64
+ - `npm run nx:lint:create-nextblock`: lint the CLI app only
65
+ - `npm run all-builds`: build workspace projects except the template output
66
+
67
+ ### Database workflows
68
+
69
+ - `npm run db:link`: link the Supabase CLI to the target project
70
+ - `npm run db:migrate:check`: preview pending remote migrations without
71
+ applying them
72
+ - `npm run db:migrate`: apply pending migration files only; this is the
73
+ production-safe path for live databases
74
+ - `npm run db:migrate:fresh`: apply the full migration baseline to a
75
+ brand-new empty database
76
+ - `npm run db:migrate:repair-history:check`: preview the migration-history
77
+ baseline repair for an existing database whose schema is already present
78
+ - `npm run db:migrate:repair-history`: mark historical baseline migrations as
79
+ applied without running their SQL
80
+ - `npm run db:push`: alias for `npm run db:migrate`
81
+ - `npm run db:push:sandbox`: legacy sandbox bootstrap path that pushes
82
+ migrations with `--include-all`, pushes Supabase config, seeds sandbox
83
+ images, and deploys the migration-ingest function
84
+ - `npm run db:reset`: reset the local/linked Supabase database from the db
85
+ workdir
86
+ - `npm run db:types`: regenerate typed Supabase definitions
87
+ - `npm run db:backup`
88
+ - `npm run db:restore`
89
+ - `npm run deploy:supabase`
90
+
91
+ ### Sandbox and automation workflows
92
+
93
+ - `npm run generate:sandbox`: regenerate the checked-in sandbox reset payload
94
+ - `npm run sandbox:reset`: call the app's sandbox reset cron route locally
95
+ - `npm run stripe`: forward Stripe events to the local webhook route
96
+
97
+ ## Environment Expectations
98
+
99
+ The exact set of env vars depends on which surfaces you use, but the current
100
+ repo expects at least:
101
+
102
+ - `NEXT_PUBLIC_SUPABASE_URL`
103
+ - `NEXT_PUBLIC_SUPABASE_ANON_KEY`
104
+ - `SUPABASE_SERVICE_ROLE_KEY`
105
+ - `SUPABASE_PROJECT_ID` for Supabase CLI migration tooling
106
+ - `SUPABASE_ACCESS_TOKEN` for Supabase CLI linking
107
+ - `POSTGRES_URL` or `DATABASE_URL` for SQL fallback paths and db tooling
108
+ - `NEXT_PUBLIC_URL` — written by `npm run setup`
109
+ - `CRON_SECRET`, `DRAFT_MODE_SECRET`, `REVALIDATE_SECRET_TOKEN` — auto-generated
110
+ by `npm run setup`
111
+
112
+ Captured by `npm run setup` and needed for a complete CMS:
113
+
114
+ - R2 credentials for media storage. The app builds and serves without them, but
115
+ uploads, image processing, and full-site backups return 500 until R2 is set.
116
+ - SMTP credentials for hosted auth email — required to deliver the first admin's
117
+ sign-up confirmation on hosted Supabase.
118
+
119
+ Optional, per feature:
120
+
121
+ - Stripe keys for physical-product checkout
122
+ - Freemius keys for digital-product checkout and product sync
123
+
124
+ ## Running the Main App
125
+
126
+ The canonical application is `apps/nextblock`.
127
+
128
+ Useful targets:
129
+
130
+ - `nx serve nextblock`
131
+ - `nx build nextblock`
132
+ - `nx lint nextblock`
133
+
134
+ The CMS and public site share the same Next.js app, so one dev server covers:
135
+
136
+ - public pages and posts
137
+ - CMS routes
138
+ - checkout routes
139
+ - webhook routes
140
+ - cron routes
141
+
142
+ ## Database and Migration Workflow
143
+
144
+ The migration source of truth is:
145
+
146
+ `libs/db/src/supabase/migrations`
147
+
148
+ Normal contributor workflow:
149
+
150
+ 1. update code and migrations together
151
+ 2. run `npm run db:migrate:check`
152
+ 3. run `npm run db:migrate` against the intended Supabase project
153
+ 4. regenerate db types if the schema changed
154
+ 5. verify the app routes or server actions against the new shape
155
+
156
+ Production rule:
157
+
158
+ - NextBlock now has live data. New production/shared database changes must be
159
+ append-only, forward-only, and non-destructive by default.
160
+ - Do not edit migration files that have already been applied to production.
161
+ - Add a new forward-only `.sql` file under
162
+ `libs/db/src/supabase/migrations` for each production schema/data change.
163
+ - Use `npm run db:migrate:check` before `npm run db:migrate`.
164
+ - If `db:migrate:check` lists historical baseline migrations such as
165
+ `00000000000000_setup_foundation_and_enums.sql` on an existing production database, do
166
+ not run `db:migrate` yet. Run `npm run db:migrate:repair-history:check`,
167
+ then `npm run db:migrate:repair-history`, then check again. The expected
168
+ result after repair is that only new unapplied migrations remain.
169
+ - Do not use `npm run db:reset`, `npm run sandbox:reset`,
170
+ `npm run db:migrate:fresh`, or `npm run db:push:sandbox` against production.
171
+
172
+ Fresh local and sandbox rebuilds may still use the reset/bootstrap flow when
173
+ the target database is disposable.
174
+
175
+ The migration-only script:
176
+
177
+ - loads `.env.local` and `.env`
178
+ - links the Supabase CLI to `SUPABASE_PROJECT_ID`
179
+ - uses `SUPABASE_DB_PASSWORD`, `POSTGRES_PASSWORD`, `POSTGRES_URL`, or
180
+ `DATABASE_URL` for the database password
181
+ - runs `supabase db push` without `--include-all`
182
+ - never runs a reset, seed script, function deploy, or config push
183
+
184
+ Because the migration set started as a squashed baseline, contributors should
185
+ treat the existing baseline files as grouped domains. New production changes
186
+ after the baseline should be appended as new migrations.
187
+
188
+ ## Sandbox Reset Operations
189
+
190
+ The sandbox automation is code-driven.
191
+
192
+ `npm run generate:sandbox`:
193
+
194
+ - reads the migration folder
195
+ - concatenates the SQL in lexical order
196
+ - writes the generated payload to
197
+ `apps/nextblock/app/api/cron/reset-sandbox/sandboxResetSql.ts`
198
+
199
+ `npm run sandbox:reset`:
200
+
201
+ - loads `.env.local`
202
+ - refuses to run unless `NEXT_PUBLIC_IS_SANDBOX=true`
203
+ - reads `NEXT_PUBLIC_URL` and `CRON_SECRET`
204
+ - calls `GET /api/cron/reset-sandbox`
205
+
206
+ The cron route then:
207
+
208
+ - returns 404 immediately unless `NEXT_PUBLIC_IS_SANDBOX=true`
209
+ - executes the generated reset SQL
210
+ - reseeds media assets
211
+ - reseeds commerce content
212
+ - triggers Freemius sync helpers for sandbox data
213
+
214
+ ## Deployment Notes
215
+
216
+ The repo currently assumes:
217
+
218
+ - the app is deployed as a Next.js application
219
+ - Supabase remains the database/auth backend
220
+ - cron routes are protected with `Authorization: Bearer ${CRON_SECRET}`
221
+ - package activation and several system workflows require working server-side
222
+ environment variables, not only public client keys
223
+
224
+ If you are configuring hosted Supabase auth email settings, use:
225
+
226
+ ```bash
227
+ npm run configure:supabase-auth
228
+ ```
229
+
230
+ ## Current Repo Notes
231
+
232
+ Two repo facts are worth keeping in mind while contributing:
233
+
234
+ - the workspace import path is `@nextblock-cms/ecommerce`, but the current
235
+ `libs/ecommerce/package.json` name is still `@nextblock-cms/ecom`
236
+ - a standalone `npx nx run ecommerce:build --skip-nx-cache` check is currently
237
+ not green, so use app-level validation and targeted tracing until that build
238
+ target is repaired
@@ -0,0 +1,125 @@
1
+ # 06 CLI and Scaffolding
2
+
3
+ ## Purpose
4
+
5
+ `apps/create-nextblock` is the onboarding surface for developers who want a
6
+ standalone NextBlock project without cloning the full monorepo.
7
+
8
+ The CLI does two main jobs:
9
+
10
+ - scaffold a package-based project from the current app template
11
+ - activate premium ecommerce routes and dependencies in generated projects
12
+
13
+ ## Source Application vs Template Output
14
+
15
+ The canonical application is still `apps/nextblock`.
16
+
17
+ The scaffold template under
18
+ `apps/create-nextblock/templates/nextblock-template` is copied output, not the
19
+ authoritative source. The sync pipeline refreshes that template by copying the
20
+ source app and applying a series of post-copy adjustments.
21
+
22
+ That means contributor workflow should be:
23
+
24
+ 1. change the source app or shared libraries
25
+ 2. update root docs and README entrypoints
26
+ 3. run the template sync when you want the generated project to catch up
27
+
28
+ ## CLI Entry Points
29
+
30
+ `apps/create-nextblock/bin/create-nextblock.js` currently defines:
31
+
32
+ - `create [project-directory]`
33
+ - `activate [module]`
34
+
35
+ The default create flow is what powers:
36
+
37
+ ```bash
38
+ npm create nextblock@latest
39
+ ```
40
+
41
+ ## What the Create Flow Actually Does
42
+
43
+ When the CLI creates a project it currently:
44
+
45
+ 1. prompts for a project name unless `--yes` is used
46
+ 2. copies `templates/nextblock-template` into the new directory
47
+ 3. removes backup artifacts
48
+ 4. applies client component and provider adjustments
49
+ 5. normalizes block-editor and UI imports
50
+ 6. generates UI proxy modules
51
+ 7. copies editor utility shims when needed
52
+ 8. ensures `.gitignore`, `.env.example`, layout files, and config files are in
53
+ the expected generated-project shape
54
+ 9. rewrites `package.json` away from workspace dependencies and toward published
55
+ packages
56
+ 10. writes a project-level `.npmrc` for public package resolution
57
+ 11. optionally installs dependencies
58
+ 12. optionally runs the generated-project setup wizard
59
+ 13. initializes git
60
+
61
+ ## Package Version Sources
62
+
63
+ The CLI resolves published package versions from the local monorepo package
64
+ metadata for:
65
+
66
+ - `@nextblock-cms/ui`
67
+ - `@nextblock-cms/utils`
68
+ - `@nextblock-cms/db`
69
+ - `@nextblock-cms/editor`
70
+ - `@nextblock-cms/sdk`
71
+
72
+ The ecommerce module is special because activation installs the alias:
73
+
74
+ ```bash
75
+ @nextblock-cms/ecommerce@npm:@nextblock-cms/ecom@latest
76
+ ```
77
+
78
+ That alias matches the current package-name discrepancy documented elsewhere.
79
+
80
+ ## Template Sync Workflow
81
+
82
+ `apps/create-nextblock/scripts/sync-template.js` is the authoritative source for
83
+ template generation inside the monorepo.
84
+
85
+ It currently:
86
+
87
+ - copies `apps/nextblock` into `templates/nextblock-template`
88
+ - skips `node_modules`, `.next`, backups, and other generated folders
89
+ - copies the root `docs/` folder into the template docs directory
90
+ - copies `.env.example` or `.env.exemple`
91
+ - rewrites imports for packaged library consumption
92
+ - removes the copied `project.json`
93
+ - syncs package versions
94
+ - normalizes global styles and UI proxy files
95
+
96
+ This is why the root docs and root/app README surfaces matter first: the
97
+ template inherits from them later through the sync step.
98
+
99
+ ## Premium Ecommerce Activation
100
+
101
+ The `activate ecommerce` command does more than add a dependency. It also
102
+ injects route wrappers and supporting files into the generated project so the
103
+ premium module appears as a coherent extension rather than a bare npm install.
104
+
105
+ The injected surfaces include wrappers for routes such as:
106
+
107
+ - `/cms/orders`
108
+ - `/cms/products`
109
+ - `/cms/payments`
110
+ - `/checkout/success`
111
+ - `/api/checkout`
112
+
113
+ Those wrappers use `verifyPackageOnline()` so premium routes stay aligned with
114
+ package activation state.
115
+
116
+ ## Publishing and Release Notes
117
+
118
+ Inside the monorepo, CLI release work is still tied to the source workspace:
119
+
120
+ - library builds and publishes happen from the workspace
121
+ - template sync happens before CLI packaging
122
+ - the CLI package itself is versioned in `apps/create-nextblock/package.json`
123
+
124
+ If a generated project looks stale, check the sync script and template output
125
+ before assuming the source app is missing the feature.