create-nextblock 0.12.8 → 0.12.11

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 -149
  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/attributes/page.tsx +12 -12
  87. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  88. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  89. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  90. package/templates/nextblock-template/app/cms/products/page.tsx +39 -27
  91. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  92. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  93. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  94. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  95. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  96. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  97. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  98. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  99. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  100. package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -93
  101. package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -129
  102. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  103. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
  104. package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -410
  105. package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +246 -246
  106. package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -80
  107. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  108. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  109. package/templates/nextblock-template/app/cms/settings/email/actions.ts +64 -64
  110. package/templates/nextblock-template/app/cms/settings/email/components/EmailForm.tsx +181 -181
  111. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  112. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  113. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  114. package/templates/nextblock-template/app/cms/settings/google-analytics/actions.ts +60 -60
  115. package/templates/nextblock-template/app/cms/settings/google-analytics/components/GoogleAnalyticsForm.tsx +129 -129
  116. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  117. package/templates/nextblock-template/app/cms/settings/languages/actions.ts +16 -16
  118. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  119. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  120. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  121. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  122. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  123. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  124. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  125. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  126. package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +52 -52
  127. package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +148 -148
  128. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  129. package/templates/nextblock-template/app/cms/settings/registration/actions.ts +44 -44
  130. package/templates/nextblock-template/app/cms/settings/registration/components/RegistrationForm.tsx +65 -65
  131. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  132. package/templates/nextblock-template/app/cms/settings/security/actions.ts +284 -284
  133. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +522 -522
  134. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  135. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  136. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  137. package/templates/nextblock-template/app/cms/users/actions.ts +222 -222
  138. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  139. package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +44 -44
  140. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  141. package/templates/nextblock-template/app/lib/sitemap-utils.ts +253 -253
  142. package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -73
  143. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  144. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  145. package/templates/nextblock-template/app/profile/account-data.ts +37 -37
  146. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  147. package/templates/nextblock-template/app/profile/account-types.ts +11 -11
  148. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  149. package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -79
  150. package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -32
  151. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  152. package/templates/nextblock-template/app/profile/page.tsx +42 -42
  153. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  154. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  155. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  156. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  157. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  158. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  159. package/templates/nextblock-template/app/sitemap.ts +130 -130
  160. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  161. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  162. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  163. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  164. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  165. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  166. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  167. package/templates/nextblock-template/components/GitHubLoginButton.tsx +15 -15
  168. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  169. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  170. package/templates/nextblock-template/components/PostCommentsSection.tsx +369 -369
  171. package/templates/nextblock-template/components/ProductReviewsSection.tsx +419 -419
  172. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  173. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  174. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  175. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  176. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  177. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  178. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  179. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  180. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  181. package/templates/nextblock-template/components/form-message.tsx +32 -32
  182. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  183. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  184. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  185. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  186. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -464
  187. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  188. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  189. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  190. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  191. package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
  192. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  193. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  194. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  195. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  196. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  197. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  198. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  199. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  200. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  201. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  202. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -1319
  203. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  204. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  205. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  206. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  207. package/templates/nextblock-template/docs/README.md +39 -39
  208. package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12505 -12505
  209. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  210. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  211. package/templates/nextblock-template/index.d.ts +7 -7
  212. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  213. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  214. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  215. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  216. package/templates/nextblock-template/lib/auth/twoFactor.ts +208 -208
  217. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  218. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  219. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +6 -6
  220. package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -18
  221. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  222. package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +100 -77
  223. package/templates/nextblock-template/lib/cms-transfer/csv.ts +403 -399
  224. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  225. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  226. package/templates/nextblock-template/lib/config/email-settings.ts +217 -217
  227. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  228. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  229. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  230. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  231. package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -256
  232. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  233. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  234. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  235. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  236. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  237. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  238. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  239. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  240. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  241. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  242. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  243. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  244. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  245. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  246. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  247. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  248. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  249. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  250. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  251. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  252. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  253. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  254. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  255. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  256. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  257. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  258. package/templates/nextblock-template/lib/search/server.ts +585 -585
  259. package/templates/nextblock-template/lib/search/types.ts +27 -27
  260. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  261. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  262. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  263. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +37 -37
  264. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  265. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  266. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  267. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  268. package/templates/nextblock-template/lib/site-url.ts +48 -48
  269. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  270. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  271. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  272. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  273. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  274. package/templates/nextblock-template/next.config.js +6 -0
  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.