create-nextblock 0.13.9 → 0.13.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 (260) 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/page.tsx +46 -46
  19. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  20. package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
  21. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
  22. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  23. package/templates/nextblock-template/app/actions/postActions.ts +146 -146
  24. package/templates/nextblock-template/app/actions/productGridActions.ts +40 -40
  25. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  26. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  27. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  28. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  29. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  30. package/templates/nextblock-template/app/api/cms/ecommerce/product-picker/route.ts +151 -151
  31. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  32. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  33. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  34. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5609
  35. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  36. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  37. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  38. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  39. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  40. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  41. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  42. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  43. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  44. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  45. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorArea.tsx +10 -1
  46. package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +5 -1
  47. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  48. package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +55 -24
  49. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  50. package/templates/nextblock-template/app/cms/blocks/components/MultiEntityPicker.tsx +263 -251
  51. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  52. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  53. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  54. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  55. package/templates/nextblock-template/app/cms/components/EcommerceActiveContext.tsx +27 -27
  56. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  57. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  58. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  59. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  60. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  61. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  62. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  63. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  64. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  65. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  66. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  67. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  68. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  69. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  70. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  71. package/templates/nextblock-template/app/cms/interactions/EmailRecipientsInput.tsx +189 -189
  72. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  73. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  74. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  75. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  76. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  77. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  78. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  79. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  80. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  81. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  82. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  83. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  84. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  85. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  86. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  87. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  88. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  89. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  90. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  91. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  92. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
  93. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  94. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  95. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  96. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  97. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  98. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  99. package/templates/nextblock-template/app/cms/settings/languages/components/LanguageDetectionPanel.tsx +188 -188
  100. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  101. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  102. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  103. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  104. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  105. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  106. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  107. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  108. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  109. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  110. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  111. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  112. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  113. package/templates/nextblock-template/app/cms/users/components/CreateUserForm.tsx +217 -217
  114. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  115. package/templates/nextblock-template/app/cms/users/new/page.tsx +44 -44
  116. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  117. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  118. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  119. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  120. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  121. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  122. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  123. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  124. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  125. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  126. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  127. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  128. package/templates/nextblock-template/app/sitemap.ts +130 -130
  129. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  130. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  131. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  132. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  133. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  134. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  135. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  136. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  137. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  138. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  139. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  140. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  141. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  142. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  143. package/templates/nextblock-template/components/blocks/ProductGridClient.tsx +114 -114
  144. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  145. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +8 -1
  146. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  147. package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +29 -23
  148. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  149. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  150. package/templates/nextblock-template/components/form-message.tsx +32 -32
  151. package/templates/nextblock-template/components/media/YouTubeFacade.tsx +69 -0
  152. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -0
  153. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  154. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  155. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  156. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  157. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -464
  158. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  159. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  160. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  161. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  162. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  163. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  164. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  165. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  166. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  167. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  168. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  169. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  170. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  171. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  172. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  173. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  174. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  175. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  176. package/templates/nextblock-template/docs/README.md +39 -39
  177. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  178. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  179. package/templates/nextblock-template/index.d.ts +7 -7
  180. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  181. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  182. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  183. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  184. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  185. package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +78 -78
  186. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  187. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +21 -1
  188. package/templates/nextblock-template/lib/blocks/product-grid-data.ts +210 -210
  189. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  190. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  191. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  192. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  193. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  194. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  195. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  196. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  197. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  198. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  199. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  200. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  201. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  202. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  203. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  204. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  205. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  206. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  207. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  208. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  209. package/templates/nextblock-template/lib/i18n/country-languages.ts +247 -247
  210. package/templates/nextblock-template/lib/i18n/detection.test.ts +197 -197
  211. package/templates/nextblock-template/lib/i18n/detection.ts +192 -192
  212. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  213. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  214. package/templates/nextblock-template/lib/media/youtube.ts +81 -0
  215. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  216. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  217. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  218. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  219. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  220. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  221. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  222. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  223. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  224. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  225. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  226. package/templates/nextblock-template/lib/search/types.ts +27 -27
  227. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  228. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  229. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  230. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -82
  231. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  232. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  233. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  234. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  235. package/templates/nextblock-template/lib/site-url.ts +48 -48
  236. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  237. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  238. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  239. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  240. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  241. package/templates/nextblock-template/next-env.d.ts +1 -1
  242. package/templates/nextblock-template/package.json +1 -1
  243. package/templates/nextblock-template/postcss.config.js +6 -6
  244. package/templates/nextblock-template/scripts/backup.js +115 -115
  245. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  246. package/templates/nextblock-template/scripts/restore.js +385 -385
  247. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  248. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  249. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  250. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  251. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  252. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  253. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  254. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  255. package/templates/nextblock-template/tailwind.config.js +25 -25
  256. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  257. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  258. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  259. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  260. package/tsconfig.base.json +3 -3
@@ -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.