create-nextblock 0.2.78 → 0.8.0
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/bin/create-nextblock.js +740 -459
- package/package.json +1 -2
- package/scripts/sync-template.js +18 -1
- package/templates/nextblock-template/.browserslistrc +11 -0
- package/templates/nextblock-template/.swcrc +30 -30
- package/templates/nextblock-template/README.md +23 -114
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -28
- package/templates/nextblock-template/app/(auth-pages)/sign-in/page.tsx +50 -25
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +111 -56
- package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -0
- package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +118 -0
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -0
- package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -0
- package/templates/nextblock-template/app/[slug]/PageClientContent.tsx +48 -28
- package/templates/nextblock-template/app/[slug]/page.tsx +63 -6
- package/templates/nextblock-template/app/[slug]/page.utils.ts +374 -157
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -0
- package/templates/nextblock-template/app/actions/consent.ts +57 -0
- package/templates/nextblock-template/app/actions/formActions.ts +130 -11
- package/templates/nextblock-template/app/actions/languageActions.ts +31 -30
- package/templates/nextblock-template/app/actions/package-actions.ts +183 -0
- package/templates/nextblock-template/app/actions/postActions.ts +146 -48
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +21 -0
- package/templates/nextblock-template/app/actions/visualEditingActions.test.ts +179 -0
- package/templates/nextblock-template/app/actions/visualEditingActions.ts +345 -0
- package/templates/nextblock-template/app/actions.ts +67 -12
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -0
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -0
- package/templates/nextblock-template/app/api/ai/global-agent/route.ts +965 -0
- package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -0
- package/templates/nextblock-template/app/api/checkout/route.ts +146 -0
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -0
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -0
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3413 -17
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +7830 -0
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +35 -0
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -0
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -0
- package/templates/nextblock-template/app/api/draft/disable/route.ts +25 -0
- package/templates/nextblock-template/app/api/draft/route.ts +93 -0
- package/templates/nextblock-template/app/api/draft/start/route.ts +77 -0
- package/templates/nextblock-template/app/api/media/library/route.ts +65 -0
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -0
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -0
- package/templates/nextblock-template/app/api/search/route.ts +43 -0
- package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -0
- package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -0
- package/templates/nextblock-template/app/api/webhooks/freemius/route.ts +34 -0
- package/templates/nextblock-template/app/api/webhooks/stripe/route.ts +27 -0
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +392 -128
- package/templates/nextblock-template/app/article/[slug]/page.tsx +179 -127
- package/templates/nextblock-template/app/article/[slug]/page.utils.ts +262 -77
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -58
- package/templates/nextblock-template/app/cart/page.tsx +7 -0
- package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -0
- package/templates/nextblock-template/app/checkout/page.tsx +52 -0
- package/templates/nextblock-template/app/checkout/success/actions.ts +136 -0
- package/templates/nextblock-template/app/checkout/success/page.tsx +186 -0
- package/templates/nextblock-template/app/cms/CmsClientLayout.tsx +163 -33
- package/templates/nextblock-template/app/cms/blocks/actions.ts +424 -235
- package/templates/nextblock-template/app/cms/blocks/components/BackgroundSelector.tsx +212 -151
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorArea.tsx +41 -20
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +152 -19
- package/templates/nextblock-template/app/cms/blocks/components/BlockTypeCard.tsx +25 -17
- package/templates/nextblock-template/app/cms/blocks/components/BlockTypeSelector.tsx +200 -18
- package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +33 -16
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -0
- package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +37 -18
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -67
- package/templates/nextblock-template/app/cms/blocks/components/SectionConfigPanel.tsx +108 -31
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -0
- package/templates/nextblock-template/app/cms/blocks/editors/FeaturedProductBlockEditor.tsx +31 -0
- package/templates/nextblock-template/app/cms/blocks/editors/FormBlockEditor.tsx +2 -2
- package/templates/nextblock-template/app/cms/blocks/editors/HeadingBlockEditor.tsx +1 -1
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
- package/templates/nextblock-template/app/cms/blocks/editors/PostsGridBlockEditor.tsx +14 -18
- package/templates/nextblock-template/app/cms/blocks/editors/ProductGridBlockEditor.tsx +41 -0
- package/templates/nextblock-template/app/cms/blocks/editors/SectionBlockEditor.tsx +318 -118
- package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +98 -21
- package/templates/nextblock-template/app/cms/blocks/editors/VideoEmbedBlockEditor.tsx +1 -1
- package/templates/nextblock-template/app/cms/components/ContentLanguageSwitcher.tsx +27 -9
- package/templates/nextblock-template/app/cms/components/CopyContentFromLanguage.tsx +1 -1
- package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -0
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -0
- package/templates/nextblock-template/app/cms/components/CortexGlobalAgentChat.tsx +1507 -0
- package/templates/nextblock-template/app/cms/components/DraftStatusActions.tsx +145 -0
- package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -0
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +38 -24
- package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -0
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -0
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -0
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -0
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -98
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -0
- package/templates/nextblock-template/app/cms/dashboard/page.tsx +182 -154
- package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +391 -0
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -0
- package/templates/nextblock-template/app/cms/layout.tsx +29 -10
- package/templates/nextblock-template/app/cms/media/UploadFolderContext.tsx +22 -22
- package/templates/nextblock-template/app/cms/media/actions.ts +45 -124
- package/templates/nextblock-template/app/cms/media/components/DeleteMediaButtonClient.tsx +1 -1
- package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -64
- package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +227 -158
- package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -89
- package/templates/nextblock-template/app/cms/media/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/navigation/components/NavigationItemForm.tsx +2 -2
- package/templates/nextblock-template/app/cms/orders/[id]/MarkPaidButton.tsx +44 -0
- package/templates/nextblock-template/app/cms/orders/[id]/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/orders/actions.ts +201 -0
- package/templates/nextblock-template/app/cms/orders/page.tsx +20 -0
- package/templates/nextblock-template/app/cms/orders/types.ts +20 -0
- package/templates/nextblock-template/app/cms/pages/[id]/edit/EditPageClient.tsx +156 -121
- package/templates/nextblock-template/app/cms/pages/[id]/edit/page.tsx +79 -26
- package/templates/nextblock-template/app/cms/pages/actions.ts +54 -38
- package/templates/nextblock-template/app/cms/pages/components/DeletePageButtonClient.tsx +1 -1
- package/templates/nextblock-template/app/cms/pages/components/PageForm.tsx +267 -116
- package/templates/nextblock-template/app/cms/pages/page.tsx +25 -18
- package/templates/nextblock-template/app/cms/payments/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/posts/[id]/edit/page.tsx +132 -90
- package/templates/nextblock-template/app/cms/posts/actions.ts +71 -72
- package/templates/nextblock-template/app/cms/posts/components/DeletePostButtonClient.tsx +1 -1
- package/templates/nextblock-template/app/cms/posts/components/PostForm.tsx +256 -245
- package/templates/nextblock-template/app/cms/posts/new/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/posts/page.tsx +20 -13
- package/templates/nextblock-template/app/cms/products/ClientNotionEditor.tsx +16 -0
- package/templates/nextblock-template/app/cms/products/ProductFormClientShell.tsx +56 -0
- package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +292 -0
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -0
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -0
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -0
- package/templates/nextblock-template/app/cms/products/new/page.tsx +143 -0
- package/templates/nextblock-template/app/cms/products/page.tsx +42 -0
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -0
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -0
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -0
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -0
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -0
- package/templates/nextblock-template/app/cms/revisions/RevisionHistoryButton.tsx +2 -2
- package/templates/nextblock-template/app/cms/revisions/actions.ts +285 -285
- package/templates/nextblock-template/app/cms/revisions/service.ts +19 -16
- package/templates/nextblock-template/app/cms/revisions/utils.ts +8 -3
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -0
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -0
- package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -0
- package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -0
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -0
- package/templates/nextblock-template/app/cms/settings/copyright/actions.ts +1 -1
- package/templates/nextblock-template/app/cms/settings/copyright/components/CopyrightForm.tsx +2 -2
- package/templates/nextblock-template/app/cms/settings/copyright/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +496 -0
- package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -0
- package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +248 -0
- package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -0
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -0
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -0
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -0
- package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +203 -44
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -242
- package/templates/nextblock-template/app/cms/settings/global-css/actions.ts +65 -0
- package/templates/nextblock-template/app/cms/settings/global-css/components/GlobalCssForm.tsx +46 -0
- package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +24 -0
- package/templates/nextblock-template/app/cms/settings/languages/components/DeleteLanguageButton.tsx +1 -1
- package/templates/nextblock-template/app/cms/settings/languages/components/LanguageForm.tsx +2 -2
- package/templates/nextblock-template/app/cms/settings/languages/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/actions.ts +82 -6
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -0
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -18
- package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -16
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -0
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/logos/page.tsx +120 -82
- package/templates/nextblock-template/app/cms/settings/logos/types.ts +8 -8
- package/templates/nextblock-template/app/cms/settings/packages/activation-form.tsx +84 -0
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -0
- package/templates/nextblock-template/app/cms/settings/packages/page.tsx +49 -0
- package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +53 -0
- package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +196 -0
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +26 -0
- package/templates/nextblock-template/app/cms/settings/security/actions.ts +251 -0
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +453 -0
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +13 -0
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -0
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -0
- package/templates/nextblock-template/app/cms/users/[id]/edit/page.tsx +28 -23
- package/templates/nextblock-template/app/cms/users/actions.ts +105 -40
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +1 -1
- package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +65 -152
- package/templates/nextblock-template/app/cms/users/page.tsx +15 -10
- package/templates/nextblock-template/app/globals.css +9 -0
- package/templates/nextblock-template/app/layout.tsx +372 -120
- package/templates/nextblock-template/app/lib/seo.test.ts +52 -0
- package/templates/nextblock-template/app/lib/seo.ts +279 -0
- package/templates/nextblock-template/app/lib/site-settings.ts +87 -0
- package/templates/nextblock-template/app/lib/sitemap-utils.ts +224 -39
- package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -0
- package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -0
- package/templates/nextblock-template/app/lib/ucp/server.ts +1914 -0
- package/templates/nextblock-template/app/page.tsx +165 -73
- package/templates/nextblock-template/app/product/[slug]/page.tsx +433 -0
- package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -0
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -0
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -0
- package/templates/nextblock-template/app/profile/account-data.ts +37 -0
- package/templates/nextblock-template/app/profile/account-links.ts +22 -0
- package/templates/nextblock-template/app/profile/account-types.ts +11 -0
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -0
- package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -0
- package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -0
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -0
- package/templates/nextblock-template/app/profile/page.tsx +51 -0
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -0
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -0
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -0
- package/templates/nextblock-template/app/providers.tsx +55 -17
- package/templates/nextblock-template/app/robots.txt/route.ts +11 -1
- package/templates/nextblock-template/app/sitemap.ts +128 -0
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -0
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -0
- package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -0
- package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -0
- package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -0
- package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -0
- package/templates/nextblock-template/components/AppShell.tsx +154 -0
- package/templates/nextblock-template/components/BlockRenderer.tsx +210 -64
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -0
- package/templates/nextblock-template/components/CartTranslator.tsx +210 -0
- package/templates/nextblock-template/components/CurrentContentSetter.tsx +25 -0
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -0
- package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -0
- package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -0
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -0
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -0
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -0
- package/templates/nextblock-template/components/GitHubLoginButton.tsx +36 -0
- package/templates/nextblock-template/components/GlobalSearch.tsx +557 -0
- package/templates/nextblock-template/components/Header.tsx +49 -41
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +55 -32
- package/templates/nextblock-template/components/ResponsiveNav.tsx +138 -43
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -8
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -55
- package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +42 -37
- package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +6 -2
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -0
- package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -0
- package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -84
- package/templates/nextblock-template/components/blocks/renderers/CartBlockRenderer.tsx +17 -0
- package/templates/nextblock-template/components/blocks/renderers/CheckoutBlockRenderer.tsx +19 -0
- package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +262 -8
- package/templates/nextblock-template/components/blocks/renderers/FeaturedProductBlockRenderer.tsx +22 -0
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +320 -37
- package/templates/nextblock-template/components/blocks/renderers/HeadingBlockRenderer.tsx +11 -8
- package/templates/nextblock-template/components/blocks/renderers/ImageBlockRenderer.tsx +12 -3
- package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +18 -13
- package/templates/nextblock-template/components/blocks/renderers/ProductDetailsBlockRenderer.tsx +90 -0
- package/templates/nextblock-template/components/blocks/renderers/ProductGridBlockRenderer.tsx +31 -0
- package/templates/nextblock-template/components/blocks/renderers/SectionBlockRenderer.tsx +424 -55
- package/templates/nextblock-template/components/blocks/renderers/SectionSlider.tsx +137 -0
- package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -0
- package/templates/nextblock-template/components/blocks/renderers/TextBlockRenderer.tsx +37 -22
- package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +23 -15
- package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +1 -3
- package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +1 -3
- package/templates/nextblock-template/components/blocks/types.ts +7 -6
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -26
- package/templates/nextblock-template/components/header-auth.tsx +69 -17
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +127 -0
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +59 -0
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -0
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -0
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -0
- package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -0
- package/templates/nextblock-template/components/visual-editing/NextblockVisualEditing.tsx +1172 -0
- package/templates/nextblock-template/context/AuthContext.tsx +23 -90
- package/templates/nextblock-template/context/CurrentContentContext.tsx +10 -4
- package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
- package/templates/nextblock-template/context/language-rest-client.ts +31 -0
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -0
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -0
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -0
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +252 -0
- package/templates/nextblock-template/docs/05-DEVELOPER-GUIDE.md +238 -0
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +125 -0
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -0
- package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -0
- package/templates/nextblock-template/docs/09-LIVE-DRAFT-MODE.md +104 -0
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -0
- package/templates/nextblock-template/docs/README.md +34 -0
- package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12507 -0
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -14
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -0
- package/templates/nextblock-template/index.d.ts +2 -0
- package/templates/nextblock-template/lib/ai-block-generation.ts +339 -0
- package/templates/nextblock-template/lib/ai-client.ts +247 -0
- package/templates/nextblock-template/lib/ai-config.ts +81 -0
- package/templates/nextblock-template/lib/ai-cortex-widget-builder.ts +125 -0
- package/templates/nextblock-template/lib/ai-global-agent-custom-block-tools.ts +363 -0
- package/templates/nextblock-template/lib/ai-global-agent-db-tools.test.ts +405 -0
- package/templates/nextblock-template/lib/ai-global-agent-db-tools.ts +1228 -0
- package/templates/nextblock-template/lib/ai-global-agent-ecommerce.ts +5 -0
- package/templates/nextblock-template/lib/ai-global-agent-tools-stats.test.ts +223 -0
- package/templates/nextblock-template/lib/ai-global-agent-tools.test.ts +2183 -0
- package/templates/nextblock-template/lib/ai-global-agent-tools.ts +4807 -0
- package/templates/nextblock-template/lib/ai-key-crypto.test.ts +70 -0
- package/templates/nextblock-template/lib/ai-key-crypto.ts +132 -0
- package/templates/nextblock-template/lib/ai-model-catalog.test.ts +49 -0
- package/templates/nextblock-template/lib/ai-model-catalog.ts +41 -0
- package/templates/nextblock-template/lib/ai-model-registry.test.ts +231 -0
- package/templates/nextblock-template/lib/ai-model-registry.ts +522 -0
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -0
- package/templates/nextblock-template/lib/auth/crypto.ts +42 -0
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -0
- package/templates/nextblock-template/lib/auth/twoFactor.ts +167 -0
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -0
- package/templates/nextblock-template/lib/blocks/FeaturedProductBlock.tsx +94 -0
- package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +137 -0
- package/templates/nextblock-template/lib/blocks/README.md +13 -670
- package/templates/nextblock-template/lib/blocks/blockRegistry.ts +138 -56
- package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -0
- package/templates/nextblock-template/lib/blocks/ecommerce-block-schemas.ts +31 -0
- package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +77 -0
- package/templates/nextblock-template/lib/cms-transfer/csv.ts +399 -0
- package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -0
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -0
- package/templates/nextblock-template/lib/cortex-widget-registry.test.ts +199 -0
- package/templates/nextblock-template/lib/cortex-widget-registry.ts +88 -0
- package/templates/nextblock-template/lib/cortex-widget-schema.test.tsx +237 -0
- package/templates/nextblock-template/lib/cortex-widget-schema.ts +393 -0
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -0
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -0
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -0
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +68 -0
- package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -0
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -0
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -0
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -0
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -0
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -0
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -0
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -0
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -0
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -0
- package/templates/nextblock-template/lib/full-backup/server.ts +743 -0
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +45 -0
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -0
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -0
- package/templates/nextblock-template/lib/privacy/settings.ts +103 -0
- package/templates/nextblock-template/lib/privacy/types.ts +67 -0
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -0
- package/templates/nextblock-template/lib/promotions/server.ts +741 -0
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -0
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -0
- package/templates/nextblock-template/lib/search/server.ts +585 -0
- package/templates/nextblock-template/lib/search/types.ts +27 -0
- package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -0
- package/templates/nextblock-template/lib/visual-editing/draft-content.ts +380 -0
- package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -0
- package/templates/nextblock-template/lib/visual-editing/draft-route.ts +82 -0
- package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -0
- package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -0
- package/templates/nextblock-template/lib/visual-editing/mutations.ts +190 -0
- package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -0
- package/templates/nextblock-template/lib/visual-editing/product-drafts.ts +511 -0
- package/templates/nextblock-template/lib/visual-editing/types.ts +122 -0
- package/templates/nextblock-template/lib/zod-config.ts +5 -0
- package/templates/nextblock-template/next.config.js +190 -66
- package/templates/nextblock-template/package.json +34 -30
- package/templates/nextblock-template/proxy.ts +435 -253
- package/templates/nextblock-template/public/images/NBcover.webp +0 -0
- package/templates/nextblock-template/public/images/cap.webp +0 -0
- package/templates/nextblock-template/public/images/commerce-plan.webp +0 -0
- package/templates/nextblock-template/public/images/commerce-square.webp +0 -0
- package/templates/nextblock-template/public/images/commerce-wide.webp +0 -0
- package/templates/nextblock-template/public/images/cortex-ai-square.webp +0 -0
- package/templates/nextblock-template/public/images/cortex-ai.webp +0 -0
- package/templates/nextblock-template/public/images/extensibility.webp +0 -0
- package/templates/nextblock-template/public/images/goals.webp +0 -0
- package/templates/nextblock-template/public/images/included.webp +0 -0
- package/templates/nextblock-template/public/images/nx-graph.webp +0 -0
- package/templates/nextblock-template/public/images/pants.webp +0 -0
- package/templates/nextblock-template/public/images/t-shirt.webp +0 -0
- package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +100 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -0
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -0
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -0
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -0
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -0
- package/templates/nextblock-template/tailwind.config.js +1 -0
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -0
- package/templates/nextblock-template/tools/deploy-supabase.js +69 -71
- package/templates/nextblock-template/tsconfig.json +52 -66
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -0
- package/templates/nextblock-template/app/force-styles.tsx +0 -31
- package/templates/nextblock-template/app/sitemap.xml/route.ts +0 -63
- package/templates/nextblock-template/components/blocks/renderers/HeroBlockRenderer.tsx +0 -273
- package/templates/nextblock-template/docs/How to Create a Custom Block.md +0 -149
- package/templates/nextblock-template/docs/cms-application-overview.md +0 -56
- package/templates/nextblock-template/docs/cms-architecture-overview.md +0 -73
- package/templates/nextblock-template/docs/files-structure.md +0 -426
- package/templates/nextblock-template/docs/tiptap-bundle-optimization-summary.md +0 -174
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# 04 Database and Auth
|
|
2
|
+
|
|
3
|
+
## Source of Truth
|
|
4
|
+
|
|
5
|
+
The database and auth implementation is spread across:
|
|
6
|
+
|
|
7
|
+
- `libs/db/src/lib/supabase/*`
|
|
8
|
+
- `libs/db/src/lib/package-validation.ts`
|
|
9
|
+
- `libs/db/src/supabase/config.toml`
|
|
10
|
+
- `libs/db/src/supabase/migrations/*`
|
|
11
|
+
- `apps/nextblock/app/auth/callback/route.ts`
|
|
12
|
+
- `apps/nextblock/app/cms/*`
|
|
13
|
+
|
|
14
|
+
When documentation and a migration disagree, the migration folder is the final
|
|
15
|
+
authority for schema, triggers, grants, and policies.
|
|
16
|
+
|
|
17
|
+
## Supabase Client Surfaces
|
|
18
|
+
|
|
19
|
+
`libs/db/src/server.ts` currently exports:
|
|
20
|
+
|
|
21
|
+
- `createClient()`: request-scoped server client using auth cookies
|
|
22
|
+
- `getProfileWithRoleServerSide()`
|
|
23
|
+
- `getActiveLanguagesServerSide()`
|
|
24
|
+
- `getServiceRoleSupabaseClient()`
|
|
25
|
+
- `getSsgSupabaseClient()`
|
|
26
|
+
- package activation helpers such as `verifyPackageOnline()`
|
|
27
|
+
|
|
28
|
+
Practical usage in the app is split by trust level:
|
|
29
|
+
|
|
30
|
+
- normal server routes and components use `createClient()`
|
|
31
|
+
- public static-ish reads often use `getSsgSupabaseClient()`
|
|
32
|
+
- admin or system workflows use `getServiceRoleSupabaseClient()`
|
|
33
|
+
|
|
34
|
+
## Auth Flow
|
|
35
|
+
|
|
36
|
+
### Session exchange
|
|
37
|
+
|
|
38
|
+
`app/auth/callback/route.ts` handles Supabase auth callback exchanges:
|
|
39
|
+
|
|
40
|
+
1. read the `code` query parameter
|
|
41
|
+
2. exchange it for a session with `supabase.auth.exchangeCodeForSession()`
|
|
42
|
+
3. load the user's profile and role
|
|
43
|
+
4. redirect through `resolvePostAuthRedirect()`
|
|
44
|
+
|
|
45
|
+
### Profile creation
|
|
46
|
+
|
|
47
|
+
The first-user and profile bootstrap logic lives in the database, not in React
|
|
48
|
+
code.
|
|
49
|
+
|
|
50
|
+
`00000000000005_setup_functions_and_triggers.sql` defines:
|
|
51
|
+
|
|
52
|
+
- `handle_new_user()`
|
|
53
|
+
- `on_auth_user_created` trigger on `auth.users`
|
|
54
|
+
|
|
55
|
+
That trigger:
|
|
56
|
+
|
|
57
|
+
- creates the first local admin automatically
|
|
58
|
+
- creates later users as `USER`
|
|
59
|
+
- inserts or updates `profiles`
|
|
60
|
+
- copies selected metadata such as `full_name`, avatar URL, and GitHub username
|
|
61
|
+
|
|
62
|
+
### CMS authorization
|
|
63
|
+
|
|
64
|
+
The CMS shell in `app/cms/CmsClientLayout.tsx` currently expects:
|
|
65
|
+
|
|
66
|
+
- an authenticated user
|
|
67
|
+
- a resolved profile role of `ADMIN` or `WRITER`
|
|
68
|
+
|
|
69
|
+
Writers and admins can enter the CMS. Admin-only navigation is used for
|
|
70
|
+
settings such as payments, shipping, users, and some branding/config surfaces.
|
|
71
|
+
|
|
72
|
+
### No live app middleware file
|
|
73
|
+
|
|
74
|
+
There is a generic Supabase middleware helper in `libs/db/src/lib/supabase`,
|
|
75
|
+
but there is no live `apps/nextblock/middleware.ts` file in the current app.
|
|
76
|
+
Document the callback, layout, and RLS model as the active auth path rather
|
|
77
|
+
than assuming middleware-based route protection is in use.
|
|
78
|
+
|
|
79
|
+
## Schema Overview
|
|
80
|
+
|
|
81
|
+
### Core platform tables
|
|
82
|
+
|
|
83
|
+
Defined primarily in `00000000000001_setup_cms_core.sql`:
|
|
84
|
+
|
|
85
|
+
- `site_settings`
|
|
86
|
+
- `profiles`
|
|
87
|
+
- `user_addresses`
|
|
88
|
+
- `languages`
|
|
89
|
+
- `media`
|
|
90
|
+
- `translations`
|
|
91
|
+
- `logos`
|
|
92
|
+
|
|
93
|
+
### Content tables
|
|
94
|
+
|
|
95
|
+
Defined primarily in `00000000000002_setup_content_tables.sql`:
|
|
96
|
+
|
|
97
|
+
- `posts`
|
|
98
|
+
- `pages`
|
|
99
|
+
- `blocks`
|
|
100
|
+
- `navigation_items`
|
|
101
|
+
- `page_revisions`
|
|
102
|
+
- `post_revisions`
|
|
103
|
+
|
|
104
|
+
### Commerce tables
|
|
105
|
+
|
|
106
|
+
Defined across `00000000000003` and `00000000000004`:
|
|
107
|
+
|
|
108
|
+
- `products`
|
|
109
|
+
- `product_media`
|
|
110
|
+
- `product_attributes`
|
|
111
|
+
- `product_attribute_terms`
|
|
112
|
+
- `product_variants`
|
|
113
|
+
- `inventory_items`
|
|
114
|
+
- `variant_attribute_mapping`
|
|
115
|
+
- `package_activations`
|
|
116
|
+
- `freemius_plans`
|
|
117
|
+
- `freemius_pricing`
|
|
118
|
+
- `orders`
|
|
119
|
+
- `order_items`
|
|
120
|
+
- `shipping_zones`
|
|
121
|
+
- `shipping_zone_locations`
|
|
122
|
+
- `shipping_zone_methods`
|
|
123
|
+
- `tax_rates`
|
|
124
|
+
- `currencies`
|
|
125
|
+
|
|
126
|
+
### Post-baseline tables
|
|
127
|
+
|
|
128
|
+
Added after the squashed baseline by later migrations:
|
|
129
|
+
|
|
130
|
+
- `categories` and `product_categories` — catalog organization
|
|
131
|
+
(migration `00000000000019`; translated via `00000000000020`)
|
|
132
|
+
- `custom_block_definitions` — data-driven custom block registry
|
|
133
|
+
(migration `00000000000023`; see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md))
|
|
134
|
+
- `ucp_cart_sessions` — persisted cart sessions (migration `00000000000024`)
|
|
135
|
+
- a `blocks` JSONB column plus `product_id` link for block-based product
|
|
136
|
+
descriptions (migration `00000000000017`)
|
|
137
|
+
|
|
138
|
+
## Row Level Security Patterns
|
|
139
|
+
|
|
140
|
+
`00000000000006_setup_rls_and_grants.sql` is the consolidated RLS file.
|
|
141
|
+
|
|
142
|
+
The high-level access model is:
|
|
143
|
+
|
|
144
|
+
- public read access for languages, media, translations, published content, and
|
|
145
|
+
several storefront commerce tables
|
|
146
|
+
- authenticated self-service access for user addresses and customer-owned
|
|
147
|
+
orders
|
|
148
|
+
- `ADMIN` or `WRITER` write access for most CMS authoring tables
|
|
149
|
+
- `ADMIN`-only write access for higher-risk configuration surfaces
|
|
150
|
+
- `service_role` full access where background jobs or system syncs need it
|
|
151
|
+
|
|
152
|
+
Commerce-specific policy highlights include:
|
|
153
|
+
|
|
154
|
+
- public read access for products, product media, product attributes, variants,
|
|
155
|
+
shipping zones, shipping methods, tax rates, and active currencies
|
|
156
|
+
- customer-scoped read access for `orders` and `order_items`
|
|
157
|
+
- service-role management access for orders, order items, inventory, taxes, and
|
|
158
|
+
currencies
|
|
159
|
+
|
|
160
|
+
## Migration Structure
|
|
161
|
+
|
|
162
|
+
### Current reality
|
|
163
|
+
|
|
164
|
+
The current padded migration sequence in
|
|
165
|
+
`libs/db/src/supabase/migrations` runs from:
|
|
166
|
+
|
|
167
|
+
- `00000000000000`
|
|
168
|
+
- through `00000000000024`
|
|
169
|
+
|
|
170
|
+
The first files (`00000000000000` through `00000000000016`) are squashed,
|
|
171
|
+
grouped baseline domains. Everything from `00000000000017` onward is an
|
|
172
|
+
append-only forward migration added after the baseline.
|
|
173
|
+
|
|
174
|
+
These files are already squashed and grouped. Several of them preserve older
|
|
175
|
+
logical migration boundaries through embedded comment headers, so you will see
|
|
176
|
+
historical section numbers inside a smaller set of physical files.
|
|
177
|
+
|
|
178
|
+
### Production migration policy
|
|
179
|
+
|
|
180
|
+
NextBlock has live Supabase data. Treat migrations as append-only for any
|
|
181
|
+
production or shared database change.
|
|
182
|
+
|
|
183
|
+
- Do not edit, recycle, squash, reorder, or delete migration files that may
|
|
184
|
+
already be recorded in a shared or production Supabase project.
|
|
185
|
+
- Add a new forward-only `.sql` file under
|
|
186
|
+
`libs/db/src/supabase/migrations` for each new schema/data change.
|
|
187
|
+
- Keep migrations non-destructive by default. Avoid dropping or rewriting data
|
|
188
|
+
that may include orders, users, payments, or customer records.
|
|
189
|
+
- Run `npm run db:migrate:check` before `npm run db:migrate`.
|
|
190
|
+
- If an existing database lists old baseline files such as
|
|
191
|
+
`00000000000000_setup_foundation_and_enums.sql` as pending, do not replay
|
|
192
|
+
them. Use `npm run db:migrate:repair-history:check`, then
|
|
193
|
+
`npm run db:migrate:repair-history`, then rerun
|
|
194
|
+
`npm run db:migrate:check`.
|
|
195
|
+
- Use `npm run db:migrate:fresh` only for a brand-new empty database.
|
|
196
|
+
|
|
197
|
+
### Category map
|
|
198
|
+
|
|
199
|
+
| Migration file | Domain | What it covers |
|
|
200
|
+
| :-- | :-- | :-- |
|
|
201
|
+
| `00000000000000_setup_foundation_and_enums.sql` | Core | Shared enums and schema-level foundation |
|
|
202
|
+
| `00000000000001_setup_cms_core.sql` | Core, CMS | settings, profiles, languages, media, translations, logos |
|
|
203
|
+
| `00000000000002_setup_content_tables.sql` | CMS | pages, posts, blocks, navigation, revisions |
|
|
204
|
+
| `00000000000003_setup_catalog_and_licensing.sql` | Commerce | catalog, variants, inventory cache tables, package activations, Freemius sync tables |
|
|
205
|
+
| `00000000000004_setup_fulfillment_shipping_taxes_and_currencies.sql` | Fulfillment, Commerce | orders, shipping, taxes, currencies, price-map sync functions |
|
|
206
|
+
| `00000000000005_setup_functions_and_triggers.sql` | Core, CMS, Fulfillment | auth/profile bootstrap, timestamps, invoice functions, inventory deduction, product upsert helpers |
|
|
207
|
+
| `00000000000006_setup_rls_and_grants.sql` | Security | grants, RLS enablement, policies |
|
|
208
|
+
| `00000000000007_setup_indexes.sql` | Core, CMS, Commerce | performance indexes across authoring and commerce tables |
|
|
209
|
+
| `00000000000008_seed_platform_defaults.sql` | Seeds | baseline site settings, default languages, default currencies |
|
|
210
|
+
| `00000000000009_seed_translations.sql` | Seeds | translation catalog |
|
|
211
|
+
| `00000000000010_seed_content_scaffold.sql` | Seeds, CMS | starter content, scaffold pages, seeded copy |
|
|
212
|
+
| `00000000000011_setup_cortex_ai_settings.sql` | AI, Settings | Cortex AI settings and provider defaults |
|
|
213
|
+
| `00000000000012_setup_commerce_coupons.sql` | Commerce | coupon tables and related commerce constraints |
|
|
214
|
+
| `00000000000013_setup_cortex_ai_db_mutation_audit.sql` | AI, Audit | Cortex AI database mutation audit support |
|
|
215
|
+
| `00000000000014_setup_content_drafts.sql` | CMS, Editor | visual-editing content draft tables |
|
|
216
|
+
| `00000000000015_setup_product_drafts.sql` | Commerce, Editor | product draft workflow support |
|
|
217
|
+
| `00000000000016_add_feature_image_to_pages.sql` | CMS | optional page feature image media relationship |
|
|
218
|
+
| `00000000000017_add_product_blocks.sql` | Commerce, Editor | block-based product descriptions (`blocks` JSONB column and `product_id` link) |
|
|
219
|
+
| `00000000000018_setup_bot_protection_settings.sql` | CMS, Security | Turnstile/reCAPTCHA bot-protection settings for forms; sensitive site-settings key protection |
|
|
220
|
+
| `00000000000019_add_product_categories.sql` | Commerce | `categories` and `product_categories` junction tables |
|
|
221
|
+
| `00000000000020_add_category_translations.sql` | Commerce, i18n | `name_translations` / `description_translations` on categories |
|
|
222
|
+
| `00000000000021_migrate_hero_blocks_to_sections.sql` | CMS, Editor | data migration converting legacy `hero` blocks into `section` blocks (`is_hero`) |
|
|
223
|
+
| `00000000000022_seed_cortex_ai_guide_post.sql` | Seeds, AI | seeds the Cortex AI guide post |
|
|
224
|
+
| `00000000000023_setup_custom_block_definitions.sql` | CMS, Editor | `custom_block_definitions` registry, validation functions, `duplicate_block_definition` RPC, and RLS (see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md)) |
|
|
225
|
+
| `00000000000024_setup_ucp_cart_sessions.sql` | Commerce | `ucp_cart_sessions` table and update trigger for persisted carts |
|
|
226
|
+
|
|
227
|
+
### How to read the folder
|
|
228
|
+
|
|
229
|
+
Read the migrations in lexical order from `00000000000000` upward.
|
|
230
|
+
|
|
231
|
+
That sequence is the cleanest under-the-hood blueprint for:
|
|
232
|
+
|
|
233
|
+
- which tables exist
|
|
234
|
+
- what triggers and functions are available
|
|
235
|
+
- what security rules are enforced
|
|
236
|
+
- what default content and configuration are seeded
|
|
237
|
+
|
|
238
|
+
If you need to understand whether the platform really supports something, check
|
|
239
|
+
the migration file first, then trace the corresponding route or library code.
|
|
240
|
+
|
|
241
|
+
## Important Site Settings in Active Use
|
|
242
|
+
|
|
243
|
+
These keys are actively referenced by the current codebase:
|
|
244
|
+
|
|
245
|
+
- `enabled_payment_providers`
|
|
246
|
+
- `ecommerce_inventory_settings`
|
|
247
|
+
- `invoice_settings`
|
|
248
|
+
- `footer_copyright`
|
|
249
|
+
- `is_admin_created`
|
|
250
|
+
|
|
251
|
+
There are many more seeded settings, but these are the most important ones for
|
|
252
|
+
understanding current runtime behavior.
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# 05 Developer Guide
|
|
2
|
+
|
|
3
|
+
## Local Setup
|
|
4
|
+
|
|
5
|
+
The root developer workflow is defined by the workspace `package.json` and the
|
|
6
|
+
setup helper in `tools/scripts/setup.mjs`.
|
|
7
|
+
|
|
8
|
+
### Prerequisites
|
|
9
|
+
|
|
10
|
+
`npm run setup` is interactive and asks for credentials from three services, so
|
|
11
|
+
create them first:
|
|
12
|
+
|
|
13
|
+
1. **Supabase project** (https://supabase.com/dashboard) — Reference ID
|
|
14
|
+
(Project Settings → General), connection string (Connect → Direct connection →
|
|
15
|
+
URI), anon + service_role keys (Project Settings → API Keys), and a Personal
|
|
16
|
+
Access Token (Account → Access Tokens → Generate new token).
|
|
17
|
+
2. **Cloudflare R2 bucket** (https://dash.cloudflare.com → R2) — create a bucket,
|
|
18
|
+
enable its Public Development URL (Bucket → Settings → General), and create an
|
|
19
|
+
Account API token (R2 → Manage API Tokens) with Object Read & Write. Copy the
|
|
20
|
+
Access Key ID and Secret Access Key (the secret is shown only once).
|
|
21
|
+
3. **SMTP credentials** (SMTP2GO works very well) — required so Supabase can send
|
|
22
|
+
the confirmation email the first admin needs to sign in.
|
|
23
|
+
|
|
24
|
+
### Run it
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install
|
|
28
|
+
npm run setup
|
|
29
|
+
npx nx serve nextblock
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
What `npm run setup` does:
|
|
33
|
+
|
|
34
|
+
- creates `.env.local` from `.env.exemple` if needed
|
|
35
|
+
- prompts for Supabase, Cloudflare R2, and SMTP details (all required)
|
|
36
|
+
- writes `NEXT_PUBLIC_URL` and auto-generates `CRON_SECRET`,
|
|
37
|
+
`DRAFT_MODE_SECRET`, and `REVALIDATE_SECRET_TOKEN`
|
|
38
|
+
- links the local Supabase CLI workdir to your project (`npm run db:link`)
|
|
39
|
+
- applies the full schema baseline to the new database
|
|
40
|
+
(`npm run db:migrate:fresh`)
|
|
41
|
+
- syncs hosted Supabase Auth — custom SMTP and branded email templates
|
|
42
|
+
(`npm run configure:supabase-auth`)
|
|
43
|
+
|
|
44
|
+
If you skip `npm run setup`, the misspelled root sample file `.env.exemple` is
|
|
45
|
+
the reference template for manual environment setup.
|
|
46
|
+
|
|
47
|
+
### First login
|
|
48
|
+
|
|
49
|
+
`npx nx serve nextblock` serves the app at **http://localhost:4200** (the
|
|
50
|
+
`@nx/next:server` default port). Open `/sign-up` and register: the **first**
|
|
51
|
+
account to sign up is automatically promoted to **ADMIN** by a database trigger
|
|
52
|
+
(`handle_new_user`). Email confirmation is enabled by default, so click the
|
|
53
|
+
confirmation link (delivered through the SMTP you configured) — or confirm the
|
|
54
|
+
user manually in Supabase → Authentication → Users. After signing in you land in
|
|
55
|
+
the CMS at `/cms/dashboard`. Every later sign-up gets the `USER` role.
|
|
56
|
+
|
|
57
|
+
## Common Commands
|
|
58
|
+
|
|
59
|
+
### App and library workflows
|
|
60
|
+
|
|
61
|
+
- `npx nx serve nextblock`: start the main app in development
|
|
62
|
+
- `npm run lint`: run Nx lint targets across the workspace
|
|
63
|
+
- `npm run nx:lint:nextblock`: lint the main app only
|
|
64
|
+
- `npm run nx:lint:create-nextblock`: lint the CLI app only
|
|
65
|
+
- `npm run all-builds`: build workspace projects except the template output
|
|
66
|
+
|
|
67
|
+
### Database workflows
|
|
68
|
+
|
|
69
|
+
- `npm run db:link`: link the Supabase CLI to the target project
|
|
70
|
+
- `npm run db:migrate:check`: preview pending remote migrations without
|
|
71
|
+
applying them
|
|
72
|
+
- `npm run db:migrate`: apply pending migration files only; this is the
|
|
73
|
+
production-safe path for live databases
|
|
74
|
+
- `npm run db:migrate:fresh`: apply the full migration baseline to a
|
|
75
|
+
brand-new empty database
|
|
76
|
+
- `npm run db:migrate:repair-history:check`: preview the migration-history
|
|
77
|
+
baseline repair for an existing database whose schema is already present
|
|
78
|
+
- `npm run db:migrate:repair-history`: mark historical baseline migrations as
|
|
79
|
+
applied without running their SQL
|
|
80
|
+
- `npm run db:push`: alias for `npm run db:migrate`
|
|
81
|
+
- `npm run db:push:sandbox`: legacy sandbox bootstrap path that pushes
|
|
82
|
+
migrations with `--include-all`, pushes Supabase config, seeds sandbox
|
|
83
|
+
images, and deploys the migration-ingest function
|
|
84
|
+
- `npm run db:reset`: reset the local/linked Supabase database from the db
|
|
85
|
+
workdir
|
|
86
|
+
- `npm run db:types`: regenerate typed Supabase definitions
|
|
87
|
+
- `npm run db:backup`
|
|
88
|
+
- `npm run db:restore`
|
|
89
|
+
- `npm run deploy:supabase`
|
|
90
|
+
|
|
91
|
+
### Sandbox and automation workflows
|
|
92
|
+
|
|
93
|
+
- `npm run generate:sandbox`: regenerate the checked-in sandbox reset payload
|
|
94
|
+
- `npm run sandbox:reset`: call the app's sandbox reset cron route locally
|
|
95
|
+
- `npm run stripe`: forward Stripe events to the local webhook route
|
|
96
|
+
|
|
97
|
+
## Environment Expectations
|
|
98
|
+
|
|
99
|
+
The exact set of env vars depends on which surfaces you use, but the current
|
|
100
|
+
repo expects at least:
|
|
101
|
+
|
|
102
|
+
- `NEXT_PUBLIC_SUPABASE_URL`
|
|
103
|
+
- `NEXT_PUBLIC_SUPABASE_ANON_KEY`
|
|
104
|
+
- `SUPABASE_SERVICE_ROLE_KEY`
|
|
105
|
+
- `SUPABASE_PROJECT_ID` for Supabase CLI migration tooling
|
|
106
|
+
- `SUPABASE_ACCESS_TOKEN` for Supabase CLI linking
|
|
107
|
+
- `POSTGRES_URL` or `DATABASE_URL` for SQL fallback paths and db tooling
|
|
108
|
+
- `NEXT_PUBLIC_URL` — written by `npm run setup`
|
|
109
|
+
- `CRON_SECRET`, `DRAFT_MODE_SECRET`, `REVALIDATE_SECRET_TOKEN` — auto-generated
|
|
110
|
+
by `npm run setup`
|
|
111
|
+
|
|
112
|
+
Captured by `npm run setup` and needed for a complete CMS:
|
|
113
|
+
|
|
114
|
+
- R2 credentials for media storage. The app builds and serves without them, but
|
|
115
|
+
uploads, image processing, and full-site backups return 500 until R2 is set.
|
|
116
|
+
- SMTP credentials for hosted auth email — required to deliver the first admin's
|
|
117
|
+
sign-up confirmation on hosted Supabase.
|
|
118
|
+
|
|
119
|
+
Optional, per feature:
|
|
120
|
+
|
|
121
|
+
- Stripe keys for physical-product checkout
|
|
122
|
+
- Freemius keys for digital-product checkout and product sync
|
|
123
|
+
|
|
124
|
+
## Running the Main App
|
|
125
|
+
|
|
126
|
+
The canonical application is `apps/nextblock`.
|
|
127
|
+
|
|
128
|
+
Useful targets:
|
|
129
|
+
|
|
130
|
+
- `nx serve nextblock`
|
|
131
|
+
- `nx build nextblock`
|
|
132
|
+
- `nx lint nextblock`
|
|
133
|
+
|
|
134
|
+
The CMS and public site share the same Next.js app, so one dev server covers:
|
|
135
|
+
|
|
136
|
+
- public pages and posts
|
|
137
|
+
- CMS routes
|
|
138
|
+
- checkout routes
|
|
139
|
+
- webhook routes
|
|
140
|
+
- cron routes
|
|
141
|
+
|
|
142
|
+
## Database and Migration Workflow
|
|
143
|
+
|
|
144
|
+
The migration source of truth is:
|
|
145
|
+
|
|
146
|
+
`libs/db/src/supabase/migrations`
|
|
147
|
+
|
|
148
|
+
Normal contributor workflow:
|
|
149
|
+
|
|
150
|
+
1. update code and migrations together
|
|
151
|
+
2. run `npm run db:migrate:check`
|
|
152
|
+
3. run `npm run db:migrate` against the intended Supabase project
|
|
153
|
+
4. regenerate db types if the schema changed
|
|
154
|
+
5. verify the app routes or server actions against the new shape
|
|
155
|
+
|
|
156
|
+
Production rule:
|
|
157
|
+
|
|
158
|
+
- NextBlock now has live data. New production/shared database changes must be
|
|
159
|
+
append-only, forward-only, and non-destructive by default.
|
|
160
|
+
- Do not edit migration files that have already been applied to production.
|
|
161
|
+
- Add a new forward-only `.sql` file under
|
|
162
|
+
`libs/db/src/supabase/migrations` for each production schema/data change.
|
|
163
|
+
- Use `npm run db:migrate:check` before `npm run db:migrate`.
|
|
164
|
+
- If `db:migrate:check` lists historical baseline migrations such as
|
|
165
|
+
`00000000000000_setup_foundation_and_enums.sql` on an existing production database, do
|
|
166
|
+
not run `db:migrate` yet. Run `npm run db:migrate:repair-history:check`,
|
|
167
|
+
then `npm run db:migrate:repair-history`, then check again. The expected
|
|
168
|
+
result after repair is that only new unapplied migrations remain.
|
|
169
|
+
- Do not use `npm run db:reset`, `npm run sandbox:reset`,
|
|
170
|
+
`npm run db:migrate:fresh`, or `npm run db:push:sandbox` against production.
|
|
171
|
+
|
|
172
|
+
Fresh local and sandbox rebuilds may still use the reset/bootstrap flow when
|
|
173
|
+
the target database is disposable.
|
|
174
|
+
|
|
175
|
+
The migration-only script:
|
|
176
|
+
|
|
177
|
+
- loads `.env.local` and `.env`
|
|
178
|
+
- links the Supabase CLI to `SUPABASE_PROJECT_ID`
|
|
179
|
+
- uses `SUPABASE_DB_PASSWORD`, `POSTGRES_PASSWORD`, `POSTGRES_URL`, or
|
|
180
|
+
`DATABASE_URL` for the database password
|
|
181
|
+
- runs `supabase db push` without `--include-all`
|
|
182
|
+
- never runs a reset, seed script, function deploy, or config push
|
|
183
|
+
|
|
184
|
+
Because the migration set started as a squashed baseline, contributors should
|
|
185
|
+
treat the existing baseline files as grouped domains. New production changes
|
|
186
|
+
after the baseline should be appended as new migrations.
|
|
187
|
+
|
|
188
|
+
## Sandbox Reset Operations
|
|
189
|
+
|
|
190
|
+
The sandbox automation is code-driven.
|
|
191
|
+
|
|
192
|
+
`npm run generate:sandbox`:
|
|
193
|
+
|
|
194
|
+
- reads the migration folder
|
|
195
|
+
- concatenates the SQL in lexical order
|
|
196
|
+
- writes the generated payload to
|
|
197
|
+
`apps/nextblock/app/api/cron/reset-sandbox/sandboxResetSql.ts`
|
|
198
|
+
|
|
199
|
+
`npm run sandbox:reset`:
|
|
200
|
+
|
|
201
|
+
- loads `.env.local`
|
|
202
|
+
- refuses to run unless `NEXT_PUBLIC_IS_SANDBOX=true`
|
|
203
|
+
- reads `NEXT_PUBLIC_URL` and `CRON_SECRET`
|
|
204
|
+
- calls `GET /api/cron/reset-sandbox`
|
|
205
|
+
|
|
206
|
+
The cron route then:
|
|
207
|
+
|
|
208
|
+
- returns 404 immediately unless `NEXT_PUBLIC_IS_SANDBOX=true`
|
|
209
|
+
- executes the generated reset SQL
|
|
210
|
+
- reseeds media assets
|
|
211
|
+
- reseeds commerce content
|
|
212
|
+
- triggers Freemius sync helpers for sandbox data
|
|
213
|
+
|
|
214
|
+
## Deployment Notes
|
|
215
|
+
|
|
216
|
+
The repo currently assumes:
|
|
217
|
+
|
|
218
|
+
- the app is deployed as a Next.js application
|
|
219
|
+
- Supabase remains the database/auth backend
|
|
220
|
+
- cron routes are protected with `Authorization: Bearer ${CRON_SECRET}`
|
|
221
|
+
- package activation and several system workflows require working server-side
|
|
222
|
+
environment variables, not only public client keys
|
|
223
|
+
|
|
224
|
+
If you are configuring hosted Supabase auth email settings, use:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
npm run configure:supabase-auth
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
## Current Repo Notes
|
|
231
|
+
|
|
232
|
+
Two repo facts are worth keeping in mind while contributing:
|
|
233
|
+
|
|
234
|
+
- the workspace import path is `@nextblock-cms/ecommerce`, but the current
|
|
235
|
+
`libs/ecommerce/package.json` name is still `@nextblock-cms/ecom`
|
|
236
|
+
- a standalone `npx nx run ecommerce:build --skip-nx-cache` check is currently
|
|
237
|
+
not green, so use app-level validation and targeted tracing until that build
|
|
238
|
+
target is repaired
|
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
Inside the monorepo, CLI release work is still tied to the source workspace:
|
|
119
|
+
|
|
120
|
+
- library builds and publishes happen from the workspace
|
|
121
|
+
- template sync happens before CLI packaging
|
|
122
|
+
- the CLI package itself is versioned in `apps/create-nextblock/package.json`
|
|
123
|
+
|
|
124
|
+
If a generated project looks stale, check the sync script and template output
|
|
125
|
+
before assuming the source app is missing the feature.
|