create-nextblock 0.12.9 → 0.12.12
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/SignUpForm.tsx +141 -141
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -91
- package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +123 -123
- 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/interactions.test.ts +301 -301
- package/templates/nextblock-template/app/actions/interactions.ts +373 -373
- 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/ai/global-agent/route.ts +964 -964
- 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 +5597 -5597
- 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 +29 -29
- 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/FeatureImageField.tsx +244 -244
- 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/BlockComposer.tsx +1522 -1522
- 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/ContentTransferControls.tsx +431 -391
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/interactions/InteractionsModerationClient.tsx +408 -408
- package/templates/nextblock-template/app/cms/interactions/page.tsx +51 -51
- 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/media/components/MediaPickerDialog.tsx +149 -158
- package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -101
- package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
- package/templates/nextblock-template/app/cms/pages/page.tsx +18 -17
- package/templates/nextblock-template/app/cms/posts/page.tsx +19 -18
- package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +12 -0
- 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/page.tsx +39 -27
- 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/actions.ts +93 -93
- package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -129
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
- package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -410
- package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +246 -246
- package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -80
- 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/actions.ts +64 -64
- package/templates/nextblock-template/app/cms/settings/email/components/EmailForm.tsx +181 -181
- 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/actions.ts +60 -60
- package/templates/nextblock-template/app/cms/settings/google-analytics/components/GoogleAnalyticsForm.tsx +129 -129
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/languages/actions.ts +16 -16
- 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 +20 -20
- 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/actions.ts +52 -52
- package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +148 -148
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/actions.ts +44 -44
- package/templates/nextblock-template/app/cms/settings/registration/components/RegistrationForm.tsx +65 -65
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/actions.ts +284 -284
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +522 -522
- 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/actions.ts +222 -222
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +44 -44
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/lib/sitemap-utils.ts +253 -253
- package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -73
- 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-data.ts +37 -37
- package/templates/nextblock-template/app/profile/account-links.ts +22 -22
- package/templates/nextblock-template/app/profile/account-types.ts +11 -11
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -79
- package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -32
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- package/templates/nextblock-template/app/profile/page.tsx +42 -42
- 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/GitHubLoginButton.tsx +15 -15
- package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- package/templates/nextblock-template/components/PostCommentsSection.tsx +369 -369
- package/templates/nextblock-template/components/ProductReviewsSection.tsx +419 -419
- 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/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 +464 -464
- 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/LanguageContext.tsx +16 -16
- 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/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -1319
- 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/docs/TECHNICAL_SPECIFICATION.md +12505 -12505
- 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/twoFactor.ts +208 -208
- 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/blocks/blockRegistry.ts +6 -6
- package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -18
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +100 -77
- package/templates/nextblock-template/lib/cms-transfer/csv.ts +403 -399
- 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/config/email-settings.ts +217 -217
- 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-relation-registry.ts +256 -256
- 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/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/server.ts +585 -585
- 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 +37 -37
- 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/types/jsdom.d.ts +6 -6
- package/tsconfig.base.json +3 -3
- package/templates/nextblock-template/tsconfig.tsbuildinfo +0 -1
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
// app/cms/settings/privacy/page.tsx
|
|
2
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextblock-cms/ui';
|
|
3
|
-
import { getPrivacySettings } from './actions';
|
|
4
|
-
import PrivacyForm from './components/PrivacyForm';
|
|
5
|
-
|
|
6
|
-
export default async function PrivacySettingsPage() {
|
|
7
|
-
const settings = await getPrivacySettings();
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
<div className="max-w-4xl mx-auto">
|
|
11
|
-
<Card>
|
|
12
|
-
<CardHeader>
|
|
13
|
-
<CardTitle>Privacy & Consent (Law 25 / CASL)</CardTitle>
|
|
14
|
-
<CardDescription>
|
|
15
|
-
Control the Quebec Law 25 consent banner and the corporate identity appended
|
|
16
|
-
to the CASL-compliant footer. Analytics tags (Google Tag Manager / GA4) are
|
|
17
|
-
configured under Settings → Google Analytics and download zero bytes until
|
|
18
|
-
a visitor opts in here.
|
|
19
|
-
</CardDescription>
|
|
20
|
-
</CardHeader>
|
|
21
|
-
<CardContent>
|
|
22
|
-
<PrivacyForm initialSettings={settings} />
|
|
23
|
-
</CardContent>
|
|
24
|
-
</Card>
|
|
25
|
-
</div>
|
|
26
|
-
);
|
|
27
|
-
}
|
|
1
|
+
// app/cms/settings/privacy/page.tsx
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextblock-cms/ui';
|
|
3
|
+
import { getPrivacySettings } from './actions';
|
|
4
|
+
import PrivacyForm from './components/PrivacyForm';
|
|
5
|
+
|
|
6
|
+
export default async function PrivacySettingsPage() {
|
|
7
|
+
const settings = await getPrivacySettings();
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="max-w-4xl mx-auto">
|
|
11
|
+
<Card>
|
|
12
|
+
<CardHeader>
|
|
13
|
+
<CardTitle>Privacy & Consent (Law 25 / CASL)</CardTitle>
|
|
14
|
+
<CardDescription>
|
|
15
|
+
Control the Quebec Law 25 consent banner and the corporate identity appended
|
|
16
|
+
to the CASL-compliant footer. Analytics tags (Google Tag Manager / GA4) are
|
|
17
|
+
configured under Settings → Google Analytics and download zero bytes until
|
|
18
|
+
a visitor opts in here.
|
|
19
|
+
</CardDescription>
|
|
20
|
+
</CardHeader>
|
|
21
|
+
<CardContent>
|
|
22
|
+
<PrivacyForm initialSettings={settings} />
|
|
23
|
+
</CardContent>
|
|
24
|
+
</Card>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
// app/cms/settings/registration/actions.ts
|
|
2
|
-
'use server';
|
|
3
|
-
|
|
4
|
-
import { createClient } from '@nextblock-cms/db/server';
|
|
5
|
-
import { revalidatePath } from 'next/cache';
|
|
6
|
-
import {
|
|
7
|
-
getSystemConfiguration,
|
|
8
|
-
updateSystemConfiguration,
|
|
9
|
-
} from '../../../../lib/setup/system-config';
|
|
10
|
-
|
|
11
|
-
export async function getRegistrationSettings(): Promise<{ autoAcceptSignups: boolean }> {
|
|
12
|
-
const config = await getSystemConfiguration();
|
|
13
|
-
return { autoAcceptSignups: config.auto_accept_signups };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async function assertAdmin() {
|
|
17
|
-
const supabase = createClient();
|
|
18
|
-
const {
|
|
19
|
-
data: { user },
|
|
20
|
-
} = await supabase.auth.getUser();
|
|
21
|
-
if (!user) {
|
|
22
|
-
throw new Error('You must be logged in to update settings.');
|
|
23
|
-
}
|
|
24
|
-
const { data: profile, error } = await supabase
|
|
25
|
-
.from('profiles')
|
|
26
|
-
.select('role')
|
|
27
|
-
.eq('id', user.id)
|
|
28
|
-
.single();
|
|
29
|
-
if (error || !profile || profile.role !== 'ADMIN') {
|
|
30
|
-
throw new Error('You do not have permission to perform this action.');
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function updateRegistrationSettings(formData: FormData) {
|
|
35
|
-
await assertAdmin();
|
|
36
|
-
|
|
37
|
-
const autoAcceptSignups =
|
|
38
|
-
formData.get('autoAcceptSignups') === 'on' || formData.get('autoAcceptSignups') === 'true';
|
|
39
|
-
|
|
40
|
-
await updateSystemConfiguration({ auto_accept_signups: autoAcceptSignups });
|
|
41
|
-
|
|
42
|
-
revalidatePath('/cms/settings/registration');
|
|
43
|
-
return { success: true as const, message: 'Registration settings saved.' };
|
|
44
|
-
}
|
|
1
|
+
// app/cms/settings/registration/actions.ts
|
|
2
|
+
'use server';
|
|
3
|
+
|
|
4
|
+
import { createClient } from '@nextblock-cms/db/server';
|
|
5
|
+
import { revalidatePath } from 'next/cache';
|
|
6
|
+
import {
|
|
7
|
+
getSystemConfiguration,
|
|
8
|
+
updateSystemConfiguration,
|
|
9
|
+
} from '../../../../lib/setup/system-config';
|
|
10
|
+
|
|
11
|
+
export async function getRegistrationSettings(): Promise<{ autoAcceptSignups: boolean }> {
|
|
12
|
+
const config = await getSystemConfiguration();
|
|
13
|
+
return { autoAcceptSignups: config.auto_accept_signups };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async function assertAdmin() {
|
|
17
|
+
const supabase = createClient();
|
|
18
|
+
const {
|
|
19
|
+
data: { user },
|
|
20
|
+
} = await supabase.auth.getUser();
|
|
21
|
+
if (!user) {
|
|
22
|
+
throw new Error('You must be logged in to update settings.');
|
|
23
|
+
}
|
|
24
|
+
const { data: profile, error } = await supabase
|
|
25
|
+
.from('profiles')
|
|
26
|
+
.select('role')
|
|
27
|
+
.eq('id', user.id)
|
|
28
|
+
.single();
|
|
29
|
+
if (error || !profile || profile.role !== 'ADMIN') {
|
|
30
|
+
throw new Error('You do not have permission to perform this action.');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export async function updateRegistrationSettings(formData: FormData) {
|
|
35
|
+
await assertAdmin();
|
|
36
|
+
|
|
37
|
+
const autoAcceptSignups =
|
|
38
|
+
formData.get('autoAcceptSignups') === 'on' || formData.get('autoAcceptSignups') === 'true';
|
|
39
|
+
|
|
40
|
+
await updateSystemConfiguration({ auto_accept_signups: autoAcceptSignups });
|
|
41
|
+
|
|
42
|
+
revalidatePath('/cms/settings/registration');
|
|
43
|
+
return { success: true as const, message: 'Registration settings saved.' };
|
|
44
|
+
}
|
package/templates/nextblock-template/app/cms/settings/registration/components/RegistrationForm.tsx
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { useRef, useState, useTransition } from 'react';
|
|
4
|
-
import { Alert, AlertDescription, Button, Checkbox, Spinner } from '@nextblock-cms/ui';
|
|
5
|
-
import { updateRegistrationSettings } from '../actions';
|
|
6
|
-
import type { Message } from '../../../../../components/form-message';
|
|
7
|
-
import { useHotkeys } from '../../../../../hooks/use-hotkeys';
|
|
8
|
-
|
|
9
|
-
interface RegistrationFormProps {
|
|
10
|
-
initialSettings: { autoAcceptSignups: boolean };
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export default function RegistrationForm({ initialSettings }: RegistrationFormProps) {
|
|
14
|
-
const [isPending, startTransition] = useTransition();
|
|
15
|
-
const [message, setMessage] = useState<Message | null>(null);
|
|
16
|
-
const [autoAccept, setAutoAccept] = useState(initialSettings.autoAcceptSignups);
|
|
17
|
-
|
|
18
|
-
const formRef = useRef<HTMLFormElement>(null);
|
|
19
|
-
useHotkeys('ctrl+s', () => formRef.current?.requestSubmit());
|
|
20
|
-
|
|
21
|
-
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
|
|
22
|
-
event.preventDefault();
|
|
23
|
-
setMessage(null);
|
|
24
|
-
const formData = new FormData();
|
|
25
|
-
formData.append('autoAcceptSignups', autoAccept ? 'on' : '');
|
|
26
|
-
|
|
27
|
-
startTransition(async () => {
|
|
28
|
-
try {
|
|
29
|
-
const result = await updateRegistrationSettings(formData);
|
|
30
|
-
setMessage({ success: result.message });
|
|
31
|
-
} catch (error) {
|
|
32
|
-
setMessage({ error: error instanceof Error ? error.message : 'Failed to save settings.' });
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<form ref={formRef} onSubmit={handleSubmit} className="space-y-6">
|
|
39
|
-
<label className="flex items-start gap-3 rounded-lg border p-4">
|
|
40
|
-
<Checkbox checked={autoAccept} onCheckedChange={(c) => setAutoAccept(c === true)} className="mt-1" />
|
|
41
|
-
<span className="text-sm">
|
|
42
|
-
<span className="font-medium">Auto-approve new registrations (skip email verification)</span>
|
|
43
|
-
<span className="block text-xs text-muted-foreground">
|
|
44
|
-
New sign-ups become active immediately, even without SMTP configured. Convenient for
|
|
45
|
-
local / self-hosted use. Leave off for public production sites so new accounts must
|
|
46
|
-
confirm their email address.
|
|
47
|
-
</span>
|
|
48
|
-
</span>
|
|
49
|
-
</label>
|
|
50
|
-
|
|
51
|
-
<div className="flex items-center gap-4">
|
|
52
|
-
<Button type="submit" disabled={isPending}>
|
|
53
|
-
{isPending ? (<><Spinner className="mr-2 h-4 w-4" /> Saving…</>) : 'Save settings'}
|
|
54
|
-
</Button>
|
|
55
|
-
{message && (
|
|
56
|
-
<Alert variant={'error' in message ? 'destructive' : 'success'} className="py-2 px-4 w-auto inline-flex items-center">
|
|
57
|
-
<AlertDescription>
|
|
58
|
-
{'error' in message ? message.error : 'success' in message ? message.success : message.message}
|
|
59
|
-
</AlertDescription>
|
|
60
|
-
</Alert>
|
|
61
|
-
)}
|
|
62
|
-
</div>
|
|
63
|
-
</form>
|
|
64
|
-
);
|
|
65
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useRef, useState, useTransition } from 'react';
|
|
4
|
+
import { Alert, AlertDescription, Button, Checkbox, Spinner } from '@nextblock-cms/ui';
|
|
5
|
+
import { updateRegistrationSettings } from '../actions';
|
|
6
|
+
import type { Message } from '../../../../../components/form-message';
|
|
7
|
+
import { useHotkeys } from '../../../../../hooks/use-hotkeys';
|
|
8
|
+
|
|
9
|
+
interface RegistrationFormProps {
|
|
10
|
+
initialSettings: { autoAcceptSignups: boolean };
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export default function RegistrationForm({ initialSettings }: RegistrationFormProps) {
|
|
14
|
+
const [isPending, startTransition] = useTransition();
|
|
15
|
+
const [message, setMessage] = useState<Message | null>(null);
|
|
16
|
+
const [autoAccept, setAutoAccept] = useState(initialSettings.autoAcceptSignups);
|
|
17
|
+
|
|
18
|
+
const formRef = useRef<HTMLFormElement>(null);
|
|
19
|
+
useHotkeys('ctrl+s', () => formRef.current?.requestSubmit());
|
|
20
|
+
|
|
21
|
+
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
setMessage(null);
|
|
24
|
+
const formData = new FormData();
|
|
25
|
+
formData.append('autoAcceptSignups', autoAccept ? 'on' : '');
|
|
26
|
+
|
|
27
|
+
startTransition(async () => {
|
|
28
|
+
try {
|
|
29
|
+
const result = await updateRegistrationSettings(formData);
|
|
30
|
+
setMessage({ success: result.message });
|
|
31
|
+
} catch (error) {
|
|
32
|
+
setMessage({ error: error instanceof Error ? error.message : 'Failed to save settings.' });
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<form ref={formRef} onSubmit={handleSubmit} className="space-y-6">
|
|
39
|
+
<label className="flex items-start gap-3 rounded-lg border p-4">
|
|
40
|
+
<Checkbox checked={autoAccept} onCheckedChange={(c) => setAutoAccept(c === true)} className="mt-1" />
|
|
41
|
+
<span className="text-sm">
|
|
42
|
+
<span className="font-medium">Auto-approve new registrations (skip email verification)</span>
|
|
43
|
+
<span className="block text-xs text-muted-foreground">
|
|
44
|
+
New sign-ups become active immediately, even without SMTP configured. Convenient for
|
|
45
|
+
local / self-hosted use. Leave off for public production sites so new accounts must
|
|
46
|
+
confirm their email address.
|
|
47
|
+
</span>
|
|
48
|
+
</span>
|
|
49
|
+
</label>
|
|
50
|
+
|
|
51
|
+
<div className="flex items-center gap-4">
|
|
52
|
+
<Button type="submit" disabled={isPending}>
|
|
53
|
+
{isPending ? (<><Spinner className="mr-2 h-4 w-4" /> Saving…</>) : 'Save settings'}
|
|
54
|
+
</Button>
|
|
55
|
+
{message && (
|
|
56
|
+
<Alert variant={'error' in message ? 'destructive' : 'success'} className="py-2 px-4 w-auto inline-flex items-center">
|
|
57
|
+
<AlertDescription>
|
|
58
|
+
{'error' in message ? message.error : 'success' in message ? message.success : message.message}
|
|
59
|
+
</AlertDescription>
|
|
60
|
+
</Alert>
|
|
61
|
+
)}
|
|
62
|
+
</div>
|
|
63
|
+
</form>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
// app/cms/settings/registration/page.tsx
|
|
2
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextblock-cms/ui';
|
|
3
|
-
import { getRegistrationSettings } from './actions';
|
|
4
|
-
import RegistrationForm from './components/RegistrationForm';
|
|
5
|
-
|
|
6
|
-
export const dynamic = 'force-dynamic';
|
|
7
|
-
|
|
8
|
-
export default async function RegistrationSettingsPage() {
|
|
9
|
-
const settings = await getRegistrationSettings();
|
|
10
|
-
|
|
11
|
-
return (
|
|
12
|
-
<div className="max-w-4xl mx-auto">
|
|
13
|
-
<Card>
|
|
14
|
-
<CardHeader>
|
|
15
|
-
<CardTitle>Sign-ups & Registration</CardTitle>
|
|
16
|
-
<CardDescription>
|
|
17
|
-
Control how new public registrations are handled. Email verification requires a
|
|
18
|
-
configured SMTP server (Settings → Configuration → Email).
|
|
19
|
-
</CardDescription>
|
|
20
|
-
</CardHeader>
|
|
21
|
-
<CardContent>
|
|
22
|
-
<RegistrationForm initialSettings={settings} />
|
|
23
|
-
</CardContent>
|
|
24
|
-
</Card>
|
|
25
|
-
</div>
|
|
26
|
-
);
|
|
27
|
-
}
|
|
1
|
+
// app/cms/settings/registration/page.tsx
|
|
2
|
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextblock-cms/ui';
|
|
3
|
+
import { getRegistrationSettings } from './actions';
|
|
4
|
+
import RegistrationForm from './components/RegistrationForm';
|
|
5
|
+
|
|
6
|
+
export const dynamic = 'force-dynamic';
|
|
7
|
+
|
|
8
|
+
export default async function RegistrationSettingsPage() {
|
|
9
|
+
const settings = await getRegistrationSettings();
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<div className="max-w-4xl mx-auto">
|
|
13
|
+
<Card>
|
|
14
|
+
<CardHeader>
|
|
15
|
+
<CardTitle>Sign-ups & Registration</CardTitle>
|
|
16
|
+
<CardDescription>
|
|
17
|
+
Control how new public registrations are handled. Email verification requires a
|
|
18
|
+
configured SMTP server (Settings → Configuration → Email).
|
|
19
|
+
</CardDescription>
|
|
20
|
+
</CardHeader>
|
|
21
|
+
<CardContent>
|
|
22
|
+
<RegistrationForm initialSettings={settings} />
|
|
23
|
+
</CardContent>
|
|
24
|
+
</Card>
|
|
25
|
+
</div>
|
|
26
|
+
);
|
|
27
|
+
}
|