create-nextblock 0.14.1 → 0.14.2
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.
- package/docker-template/.dockerignore +23 -23
- package/docker-template/.env.docker.example +69 -69
- package/docker-template/docker/db/init/99-jwt.sql +6 -6
- package/docker-template/docker/db/init/99-roles.sql +25 -25
- package/docker-template/docker/kong/kong.yml +112 -112
- package/docker-template/scripts/docker-setup.mjs +310 -310
- package/libs/db/tsconfig.lib.json +3 -3
- package/libs/editor/tsconfig.lib.json +3 -3
- package/libs/ui/tsconfig.lib.json +3 -3
- package/libs/utils/tsconfig.json +3 -3
- package/package.json +1 -1
- package/project.json +19 -19
- package/templates/nextblock-template/.browserslistrc +11 -11
- package/templates/nextblock-template/.dockerignore +23 -23
- package/templates/nextblock-template/README.md +34 -34
- package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
- package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
- package/templates/nextblock-template/app/actions/consent.ts +57 -57
- package/templates/nextblock-template/app/actions/postActions.ts +146 -146
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
- package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
- package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5749
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
- package/templates/nextblock-template/app/api/search/route.ts +43 -43
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
- package/templates/nextblock-template/app/cart/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +4 -2
- package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
- package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
- package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
- package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
- package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
- package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/layout.tsx +73 -73
- package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
- package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
- package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
- package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
- package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
- package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
- package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +688 -688
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
- package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +23 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +9 -7
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
- package/templates/nextblock-template/app/profile/account-links.ts +22 -22
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
- package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
- package/templates/nextblock-template/app/setup/layout.tsx +13 -13
- package/templates/nextblock-template/app/setup/page.tsx +111 -111
- package/templates/nextblock-template/app/sitemap.ts +130 -130
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
- package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
- package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
- package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
- package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
- package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
- package/templates/nextblock-template/components/blocks/types.ts +7 -7
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -32
- package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
- package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
- package/templates/nextblock-template/components/submit-button.tsx +23 -23
- package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/AuthContext.tsx +23 -23
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
- package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
- package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
- package/templates/nextblock-template/docs/README.md +39 -39
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
- package/templates/nextblock-template/index.d.ts +7 -7
- package/templates/nextblock-template/lib/app-secrets.ts +39 -39
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
- package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
- package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
- package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
- package/templates/nextblock-template/lib/email/branding.ts +76 -76
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
- package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
- package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
- package/templates/nextblock-template/lib/media/youtube.ts +99 -99
- package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
- package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
- package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
- package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
- package/templates/nextblock-template/lib/privacy/types.ts +69 -69
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
- package/templates/nextblock-template/lib/promotions/server.ts +741 -741
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
- package/templates/nextblock-template/lib/search/types.ts +27 -27
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -87
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/site-url.ts +48 -48
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/postcss.config.js +6 -6
- package/templates/nextblock-template/scripts/backup.js +115 -115
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/restore.js +385 -385
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tailwind.config.js +25 -25
- package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
- 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.
|