create-nextblock 0.12.9 → 0.12.12

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 (293) hide show
  1. package/docker-template/.dockerignore +23 -23
  2. package/docker-template/.env.docker.example +69 -69
  3. package/docker-template/docker/db/init/99-jwt.sql +6 -6
  4. package/docker-template/docker/db/init/99-roles.sql +25 -25
  5. package/docker-template/docker/kong/kong.yml +112 -112
  6. package/docker-template/scripts/docker-setup.mjs +310 -310
  7. package/libs/db/tsconfig.lib.json +3 -3
  8. package/libs/editor/tsconfig.lib.json +3 -3
  9. package/libs/ui/tsconfig.lib.json +3 -3
  10. package/libs/utils/tsconfig.json +3 -3
  11. package/package.json +1 -1
  12. package/project.json +19 -19
  13. package/templates/nextblock-template/.browserslistrc +11 -11
  14. package/templates/nextblock-template/.dockerignore +23 -23
  15. package/templates/nextblock-template/README.md +34 -34
  16. package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
  17. package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
  18. package/templates/nextblock-template/app/(auth-pages)/sign-up/SignUpForm.tsx +141 -141
  19. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
  20. package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -91
  21. package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +123 -123
  22. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  23. package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
  24. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
  25. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  26. package/templates/nextblock-template/app/actions/interactions.test.ts +301 -301
  27. package/templates/nextblock-template/app/actions/interactions.ts +373 -373
  28. package/templates/nextblock-template/app/actions/postActions.ts +146 -146
  29. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  30. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  31. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  32. package/templates/nextblock-template/app/api/ai/global-agent/route.ts +964 -964
  33. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  34. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  35. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  36. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  37. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  38. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5597 -5597
  39. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  40. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  41. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  42. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  43. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  44. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  45. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  46. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  47. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  48. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  49. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  50. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  51. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  52. package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
  53. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  54. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  55. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  56. package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -244
  57. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  58. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  59. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  60. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  61. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  62. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  63. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  64. package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -1522
  65. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  66. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  67. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  68. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  69. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  70. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  71. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  72. package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +431 -391
  73. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  74. package/templates/nextblock-template/app/cms/interactions/InteractionsModerationClient.tsx +408 -408
  75. package/templates/nextblock-template/app/cms/interactions/page.tsx +51 -51
  76. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  77. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  78. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  79. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  80. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  81. package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +149 -158
  82. package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -101
  83. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  84. package/templates/nextblock-template/app/cms/pages/page.tsx +18 -17
  85. package/templates/nextblock-template/app/cms/posts/page.tsx +19 -18
  86. package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +12 -0
  87. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  88. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  89. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  90. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  91. package/templates/nextblock-template/app/cms/products/page.tsx +39 -27
  92. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  93. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  94. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  95. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  96. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  97. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  98. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  99. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  100. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  101. package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -93
  102. package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -129
  103. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  104. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
  105. package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -410
  106. package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +246 -246
  107. package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -80
  108. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  109. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  110. package/templates/nextblock-template/app/cms/settings/email/actions.ts +64 -64
  111. package/templates/nextblock-template/app/cms/settings/email/components/EmailForm.tsx +181 -181
  112. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  113. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  114. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  115. package/templates/nextblock-template/app/cms/settings/google-analytics/actions.ts +60 -60
  116. package/templates/nextblock-template/app/cms/settings/google-analytics/components/GoogleAnalyticsForm.tsx +129 -129
  117. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  118. package/templates/nextblock-template/app/cms/settings/languages/actions.ts +16 -16
  119. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  120. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  121. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  122. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  123. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  124. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  125. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  126. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  127. package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +52 -52
  128. package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +148 -148
  129. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  130. package/templates/nextblock-template/app/cms/settings/registration/actions.ts +44 -44
  131. package/templates/nextblock-template/app/cms/settings/registration/components/RegistrationForm.tsx +65 -65
  132. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  133. package/templates/nextblock-template/app/cms/settings/security/actions.ts +284 -284
  134. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +522 -522
  135. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  136. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  137. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  138. package/templates/nextblock-template/app/cms/users/actions.ts +222 -222
  139. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  140. package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +44 -44
  141. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  142. package/templates/nextblock-template/app/lib/sitemap-utils.ts +253 -253
  143. package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -73
  144. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  145. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  146. package/templates/nextblock-template/app/profile/account-data.ts +37 -37
  147. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  148. package/templates/nextblock-template/app/profile/account-types.ts +11 -11
  149. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  150. package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -79
  151. package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -32
  152. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  153. package/templates/nextblock-template/app/profile/page.tsx +42 -42
  154. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  155. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  156. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  157. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  158. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  159. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  160. package/templates/nextblock-template/app/sitemap.ts +130 -130
  161. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  162. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  163. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  164. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  165. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  166. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  167. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  168. package/templates/nextblock-template/components/GitHubLoginButton.tsx +15 -15
  169. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  170. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  171. package/templates/nextblock-template/components/PostCommentsSection.tsx +369 -369
  172. package/templates/nextblock-template/components/ProductReviewsSection.tsx +419 -419
  173. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  174. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  175. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  176. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  177. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  178. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  179. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  180. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  181. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  182. package/templates/nextblock-template/components/form-message.tsx +32 -32
  183. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  184. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  185. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  186. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  187. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -464
  188. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  189. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  190. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  191. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  192. package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
  193. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  194. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  195. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  196. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  197. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  198. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  199. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  200. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  201. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  202. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  203. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -1319
  204. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  205. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  206. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  207. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  208. package/templates/nextblock-template/docs/README.md +39 -39
  209. package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12505 -12505
  210. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  211. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  212. package/templates/nextblock-template/index.d.ts +7 -7
  213. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  214. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  215. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  216. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  217. package/templates/nextblock-template/lib/auth/twoFactor.ts +208 -208
  218. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  219. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  220. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +6 -6
  221. package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -18
  222. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  223. package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +100 -77
  224. package/templates/nextblock-template/lib/cms-transfer/csv.ts +403 -399
  225. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  226. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  227. package/templates/nextblock-template/lib/config/email-settings.ts +217 -217
  228. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  229. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  230. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  231. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  232. package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -256
  233. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  234. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  235. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  236. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  237. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  238. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  239. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  240. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  241. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  242. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  243. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  244. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  245. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  246. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  247. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  248. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  249. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  250. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  251. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  252. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  253. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  254. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  255. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  256. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  257. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  258. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  259. package/templates/nextblock-template/lib/search/server.ts +585 -585
  260. package/templates/nextblock-template/lib/search/types.ts +27 -27
  261. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  262. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  263. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  264. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +37 -37
  265. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  266. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  267. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  268. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  269. package/templates/nextblock-template/lib/site-url.ts +48 -48
  270. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  271. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  272. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  273. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  274. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  275. package/templates/nextblock-template/package.json +1 -1
  276. package/templates/nextblock-template/postcss.config.js +6 -6
  277. package/templates/nextblock-template/scripts/backup.js +115 -115
  278. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  279. package/templates/nextblock-template/scripts/restore.js +385 -385
  280. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  281. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  282. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  283. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  284. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  285. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  286. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  287. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  288. package/templates/nextblock-template/tailwind.config.js +25 -25
  289. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  290. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  291. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  292. package/tsconfig.base.json +3 -3
  293. package/templates/nextblock-template/tsconfig.tsbuildinfo +0 -1
@@ -1,176 +1,176 @@
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
- A generated project installs the libraries from **npm**, so a feature only reaches
119
- scaffolds after the libs are republished. (The monorepo's own Vercel deploy builds the
120
- libs from source, so it sees changes immediately — only `npm create` scaffolds need a
121
- republish.)
122
-
123
- ### Release commands
124
-
125
- - `npm run release:all -- <version>` — build **and publish every package** at one
126
- synchronized version, in dependency order: `utils → ui → sdk → db → editor → ecom`,
127
- then `release-cli.js` (which stamps the root + template + `create-nextblock`, re-syncs
128
- the template, and publishes the CLI). Pass an explicit semver (e.g. `0.10.2`);
129
- `--dry-run` prints the plan only.
130
- - `npm run build:<lib>` (`build:utils|ui|db|editor|sdk|ecom`) and
131
- `node tools/scripts/release-lib.js <lib> <version>` — build + publish a **single** lib
132
- (`<lib>` is the nx project name, so use `ecommerce`, which maps to the published
133
- `@nextblock-cms/ecom`). `npx nx build <lib>` only *compiles*, it does not publish.
134
-
135
- ### npm 2FA / OTP (and capturing a log)
136
-
137
- Publishing requires a one-time password if the npm account has 2FA. **Piping the command
138
- output breaks the interactive OTP prompt** — `npm run release:all -- … 2>&1 | Tee-Object …`
139
- (or `| tee`) fails with `npm error code EOTP` because npm no longer has a TTY. Either:
140
-
141
- - set an npm **Automation** token (`npm config set //registry.npmjs.org/:_authToken …`),
142
- which bypasses 2FA — then piping to a log file is fine; or
143
- - capture with PowerShell `Start-Transcript -Path release.log; npm run release:all -- … ;
144
- Stop-Transcript`, which records the session while npm keeps its terminal.
145
-
146
- `release:all` has no "already published" guard: if it dies partway, re-running the same
147
- version re-publishes from the top and 403s on the first already-published lib. Finish a
148
- partial release by running the **remaining** libs individually
149
- (`node tools/scripts/release-lib.js <lib> <version>` … then `release-cli.js <version>`),
150
- or bump to a fresh version and re-run the whole thing.
151
-
152
- ### Library build gotchas (dts / tsconfig)
153
-
154
- Each lib emits its `.d.ts` via `vite-plugin-dts` running tsc on `tsconfig.lib.json`. When a
155
- lib imports a sibling (`ui`/`db` import `utils`; `ecom` imports all), how you wire the
156
- tsconfig decides whether the build log is clean:
157
-
158
- - A **composite** lib (`ui`, `db` — `db` inherits it) must **list the imported sibling's
159
- sources in `include`** (e.g. `"../utils/src/**/*.ts"`) and keep `"references": []`.
160
- Mirror `libs/editor`, which always built clean this way. A composite project
161
- `reference` to the sibling triggers `TS6305` ("output not built" — vite never produces
162
- the `tsc -b` out-tsc output); empty `references` *without* the `include` triggers
163
- `TS6307` ("file not listed"). Both are non-fatal log noise but should stay at zero.
164
- - A **non-composite** lib (`ecom`, which extends `tsconfig.base.json`) just needs
165
- `"references": []` — no `include` of siblings.
166
- - A **strict** lib (`db`/`sdk` set `noPropertyAccessFromIndexSignature`) compiles the
167
- sibling's *source* under its strict rules, so `libs/utils` must stay strict-clean
168
- (bracket-access undeclared keys, e.g. `process.env['R2_BUCKET_NAME']`).
169
-
170
- `vite-plugin-dts` `entryRoot: 'src'` keeps emission to the lib's own `src`, so listing
171
- sibling sources does **not** leak their `.d.ts` into the tarball. The published `bin` path
172
- in `apps/create-nextblock/package.json` should have **no leading `./`** (`bin/…`, not
173
- `./bin/…`) or npm "auto-corrects" it with a publish warning.
174
-
175
- If a generated project looks stale, check the sync script and template output (and whether
176
- the libs were actually republished) before assuming the source app is missing the feature.
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
+ A generated project installs the libraries from **npm**, so a feature only reaches
119
+ scaffolds after the libs are republished. (The monorepo's own Vercel deploy builds the
120
+ libs from source, so it sees changes immediately — only `npm create` scaffolds need a
121
+ republish.)
122
+
123
+ ### Release commands
124
+
125
+ - `npm run release:all -- <version>` — build **and publish every package** at one
126
+ synchronized version, in dependency order: `utils → ui → sdk → db → editor → ecom`,
127
+ then `release-cli.js` (which stamps the root + template + `create-nextblock`, re-syncs
128
+ the template, and publishes the CLI). Pass an explicit semver (e.g. `0.10.2`);
129
+ `--dry-run` prints the plan only.
130
+ - `npm run build:<lib>` (`build:utils|ui|db|editor|sdk|ecom`) and
131
+ `node tools/scripts/release-lib.js <lib> <version>` — build + publish a **single** lib
132
+ (`<lib>` is the nx project name, so use `ecommerce`, which maps to the published
133
+ `@nextblock-cms/ecom`). `npx nx build <lib>` only *compiles*, it does not publish.
134
+
135
+ ### npm 2FA / OTP (and capturing a log)
136
+
137
+ Publishing requires a one-time password if the npm account has 2FA. **Piping the command
138
+ output breaks the interactive OTP prompt** — `npm run release:all -- … 2>&1 | Tee-Object …`
139
+ (or `| tee`) fails with `npm error code EOTP` because npm no longer has a TTY. Either:
140
+
141
+ - set an npm **Automation** token (`npm config set //registry.npmjs.org/:_authToken …`),
142
+ which bypasses 2FA — then piping to a log file is fine; or
143
+ - capture with PowerShell `Start-Transcript -Path release.log; npm run release:all -- … ;
144
+ Stop-Transcript`, which records the session while npm keeps its terminal.
145
+
146
+ `release:all` has no "already published" guard: if it dies partway, re-running the same
147
+ version re-publishes from the top and 403s on the first already-published lib. Finish a
148
+ partial release by running the **remaining** libs individually
149
+ (`node tools/scripts/release-lib.js <lib> <version>` … then `release-cli.js <version>`),
150
+ or bump to a fresh version and re-run the whole thing.
151
+
152
+ ### Library build gotchas (dts / tsconfig)
153
+
154
+ Each lib emits its `.d.ts` via `vite-plugin-dts` running tsc on `tsconfig.lib.json`. When a
155
+ lib imports a sibling (`ui`/`db` import `utils`; `ecom` imports all), how you wire the
156
+ tsconfig decides whether the build log is clean:
157
+
158
+ - A **composite** lib (`ui`, `db` — `db` inherits it) must **list the imported sibling's
159
+ sources in `include`** (e.g. `"../utils/src/**/*.ts"`) and keep `"references": []`.
160
+ Mirror `libs/editor`, which always built clean this way. A composite project
161
+ `reference` to the sibling triggers `TS6305` ("output not built" — vite never produces
162
+ the `tsc -b` out-tsc output); empty `references` *without* the `include` triggers
163
+ `TS6307` ("file not listed"). Both are non-fatal log noise but should stay at zero.
164
+ - A **non-composite** lib (`ecom`, which extends `tsconfig.base.json`) just needs
165
+ `"references": []` — no `include` of siblings.
166
+ - A **strict** lib (`db`/`sdk` set `noPropertyAccessFromIndexSignature`) compiles the
167
+ sibling's *source* under its strict rules, so `libs/utils` must stay strict-clean
168
+ (bracket-access undeclared keys, e.g. `process.env['R2_BUCKET_NAME']`).
169
+
170
+ `vite-plugin-dts` `entryRoot: 'src'` keeps emission to the lib's own `src`, so listing
171
+ sibling sources does **not** leak their `.d.ts` into the tarball. The published `bin` path
172
+ in `apps/create-nextblock/package.json` should have **no leading `./`** (`bin/…`, not
173
+ `./bin/…`) or npm "auto-corrects" it with a publish warning.
174
+
175
+ If a generated project looks stale, check the sync script and template output (and whether
176
+ the libs were actually republished) before assuming the source app is missing the feature.
@@ -1,146 +1,146 @@
1
- # 07 Block SDK and Extensibility
2
-
3
- ## What the SDK Is
4
-
5
- `libs/sdk` is the typed contract for block-style extensibility. It is much
6
- smaller than the in-app block registry because it defines an external authoring
7
- interface, not the full CMS implementation.
8
-
9
- The main export is:
10
-
11
- - `@nextblock-cms/sdk`
12
-
13
- ## Current SDK Surface
14
-
15
- `libs/sdk/src/lib/sdk.ts` currently exports the following core types:
16
-
17
- - `BlockContentSchema`
18
- - `BlockData<TSchema>`
19
- - `BlockProps<TSchema>`
20
- - `BlockEditorProps<TSchema>`
21
- - `BlockConfig<TSchema>`
22
- - `LucideIcon`
23
-
24
- ## Contract Shape
25
-
26
- ### Schema
27
-
28
- Every block is defined around a Zod object schema:
29
-
30
- ```ts
31
- type BlockContentSchema = z.ZodObject<any>;
32
- ```
33
-
34
- The runtime content type is inferred from that schema through `BlockData`.
35
-
36
- ### Renderer contract
37
-
38
- The public rendering contract is:
39
-
40
- - `content`
41
- - optional `className`
42
- - `isInEditor`
43
- - `languageKey`
44
-
45
- ### Editor contract
46
-
47
- The editing contract is:
48
-
49
- - `content`
50
- - `block`
51
- - `onChange`
52
-
53
- ### Registration contract
54
-
55
- A block registration object currently requires:
56
-
57
- - `type`
58
- - `label`
59
- - optional `icon`
60
- - `schema`
61
- - `initialContent`
62
- - `RendererComponent`
63
- - `EditorComponent`
64
-
65
- ## Relationship to the App Block Registry
66
-
67
- The app already has an internal registry in
68
- `apps/nextblock/lib/blocks/blockRegistry.ts`.
69
-
70
- That registry is richer than the SDK because it also includes:
71
-
72
- - filename-based editor loading
73
- - filename-based renderer loading
74
- - CMS-specific helper metadata
75
- - in-repo block defaults for built-in block types
76
-
77
- The important distinction is:
78
-
79
- - `libs/sdk` defines the reusable contract
80
- - `apps/nextblock/lib/blocks/blockRegistry.ts` defines the current built-in
81
- implementation
82
-
83
- They are related, but they are not the same file or the same level of
84
- abstraction.
85
-
86
- ## Current Built-In Extensibility Pattern
87
-
88
- Today, adding a built-in block to the app usually means updating:
89
-
90
- - the app block registry
91
- - a CMS editor component
92
- - a front-end renderer component
93
- - any supporting schemas or helpers
94
-
95
- The existing registry already exposes enough information to support:
96
-
97
- - runtime validation
98
- - default content generation
99
- - block label lookup
100
- - block picker rendering
101
-
102
- ## Commerce-Aware Extensibility
103
-
104
- The built-in block registry already contains ecommerce-aware blocks:
105
-
106
- - `product_grid`
107
- - `featured_product`
108
- - `cart`
109
- - `checkout`
110
- - `product_details`
111
-
112
- That means the current extensibility surface is not limited to editorial
113
- content. It already supports block types that render premium commerce
114
- components.
115
-
116
- ## Data-Driven Custom Blocks
117
-
118
- There is now a third extensibility path that needs no code deploy at all.
119
- Editors can define block types at runtime from the CMS; each definition is a
120
- `custom_block_definitions` row (typed fields plus a recursive layout schema)
121
- rendered on the public site by a dynamic layout engine rather than a compiled
122
- React component.
123
-
124
- So the extensibility surface has three layers:
125
-
126
- - **Code-defined built-ins** — the app block registry plus React
127
- editor/renderer files. Most flexible, requires a deploy.
128
- - **The typed SDK contract** (`libs/sdk`) — a small, typed authoring interface
129
- for reusable or external blocks.
130
- - **Data-defined custom blocks** (`custom_block_definitions`) — full CRUD from
131
- the CMS, no deploy, rendered from stored JSONB.
132
-
133
- Custom blocks are documented in detail in
134
- [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md).
135
-
136
- ## Practical Guidance
137
-
138
- - If you are building or refactoring built-in CMS blocks, start with the app
139
- registry and editor/renderer files.
140
- - If you are shaping an external or reusable authoring contract, start with
141
- `libs/sdk`.
142
- - If you need both, keep the SDK contract small and typed, and let the app
143
- registry stay responsible for CMS-specific loading behavior.
144
- - If you want editors to create block types without a deploy, reach for
145
- data-driven custom blocks (`custom_block_definitions`) instead of either of
146
- the above.
1
+ # 07 Block SDK and Extensibility
2
+
3
+ ## What the SDK Is
4
+
5
+ `libs/sdk` is the typed contract for block-style extensibility. It is much
6
+ smaller than the in-app block registry because it defines an external authoring
7
+ interface, not the full CMS implementation.
8
+
9
+ The main export is:
10
+
11
+ - `@nextblock-cms/sdk`
12
+
13
+ ## Current SDK Surface
14
+
15
+ `libs/sdk/src/lib/sdk.ts` currently exports the following core types:
16
+
17
+ - `BlockContentSchema`
18
+ - `BlockData<TSchema>`
19
+ - `BlockProps<TSchema>`
20
+ - `BlockEditorProps<TSchema>`
21
+ - `BlockConfig<TSchema>`
22
+ - `LucideIcon`
23
+
24
+ ## Contract Shape
25
+
26
+ ### Schema
27
+
28
+ Every block is defined around a Zod object schema:
29
+
30
+ ```ts
31
+ type BlockContentSchema = z.ZodObject<any>;
32
+ ```
33
+
34
+ The runtime content type is inferred from that schema through `BlockData`.
35
+
36
+ ### Renderer contract
37
+
38
+ The public rendering contract is:
39
+
40
+ - `content`
41
+ - optional `className`
42
+ - `isInEditor`
43
+ - `languageKey`
44
+
45
+ ### Editor contract
46
+
47
+ The editing contract is:
48
+
49
+ - `content`
50
+ - `block`
51
+ - `onChange`
52
+
53
+ ### Registration contract
54
+
55
+ A block registration object currently requires:
56
+
57
+ - `type`
58
+ - `label`
59
+ - optional `icon`
60
+ - `schema`
61
+ - `initialContent`
62
+ - `RendererComponent`
63
+ - `EditorComponent`
64
+
65
+ ## Relationship to the App Block Registry
66
+
67
+ The app already has an internal registry in
68
+ `apps/nextblock/lib/blocks/blockRegistry.ts`.
69
+
70
+ That registry is richer than the SDK because it also includes:
71
+
72
+ - filename-based editor loading
73
+ - filename-based renderer loading
74
+ - CMS-specific helper metadata
75
+ - in-repo block defaults for built-in block types
76
+
77
+ The important distinction is:
78
+
79
+ - `libs/sdk` defines the reusable contract
80
+ - `apps/nextblock/lib/blocks/blockRegistry.ts` defines the current built-in
81
+ implementation
82
+
83
+ They are related, but they are not the same file or the same level of
84
+ abstraction.
85
+
86
+ ## Current Built-In Extensibility Pattern
87
+
88
+ Today, adding a built-in block to the app usually means updating:
89
+
90
+ - the app block registry
91
+ - a CMS editor component
92
+ - a front-end renderer component
93
+ - any supporting schemas or helpers
94
+
95
+ The existing registry already exposes enough information to support:
96
+
97
+ - runtime validation
98
+ - default content generation
99
+ - block label lookup
100
+ - block picker rendering
101
+
102
+ ## Commerce-Aware Extensibility
103
+
104
+ The built-in block registry already contains ecommerce-aware blocks:
105
+
106
+ - `product_grid`
107
+ - `featured_product`
108
+ - `cart`
109
+ - `checkout`
110
+ - `product_details`
111
+
112
+ That means the current extensibility surface is not limited to editorial
113
+ content. It already supports block types that render premium commerce
114
+ components.
115
+
116
+ ## Data-Driven Custom Blocks
117
+
118
+ There is now a third extensibility path that needs no code deploy at all.
119
+ Editors can define block types at runtime from the CMS; each definition is a
120
+ `custom_block_definitions` row (typed fields plus a recursive layout schema)
121
+ rendered on the public site by a dynamic layout engine rather than a compiled
122
+ React component.
123
+
124
+ So the extensibility surface has three layers:
125
+
126
+ - **Code-defined built-ins** — the app block registry plus React
127
+ editor/renderer files. Most flexible, requires a deploy.
128
+ - **The typed SDK contract** (`libs/sdk`) — a small, typed authoring interface
129
+ for reusable or external blocks.
130
+ - **Data-defined custom blocks** (`custom_block_definitions`) — full CRUD from
131
+ the CMS, no deploy, rendered from stored JSONB.
132
+
133
+ Custom blocks are documented in detail in
134
+ [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md).
135
+
136
+ ## Practical Guidance
137
+
138
+ - If you are building or refactoring built-in CMS blocks, start with the app
139
+ registry and editor/renderer files.
140
+ - If you are shaping an external or reusable authoring contract, start with
141
+ `libs/sdk`.
142
+ - If you need both, keep the SDK contract small and typed, and let the app
143
+ registry stay responsible for CMS-specific loading behavior.
144
+ - If you want editors to create block types without a deploy, reach for
145
+ data-driven custom blocks (`custom_block_definitions`) instead of either of
146
+ the above.