create-nextblock 0.14.1 → 0.14.4

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