create-nextblock 0.14.1 → 0.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docker-template/.dockerignore +23 -23
- package/docker-template/.env.docker.example +69 -69
- package/docker-template/docker/db/init/99-jwt.sql +6 -6
- package/docker-template/docker/db/init/99-roles.sql +25 -25
- package/docker-template/docker/kong/kong.yml +112 -112
- package/docker-template/scripts/docker-setup.mjs +310 -310
- package/libs/db/tsconfig.lib.json +3 -3
- package/libs/editor/tsconfig.lib.json +3 -3
- package/libs/ui/tsconfig.lib.json +3 -3
- package/libs/utils/tsconfig.json +3 -3
- package/package.json +1 -1
- package/project.json +19 -19
- package/templates/nextblock-template/.browserslistrc +11 -11
- package/templates/nextblock-template/.dockerignore +23 -23
- package/templates/nextblock-template/README.md +34 -34
- package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
- package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
- package/templates/nextblock-template/app/actions/consent.ts +57 -57
- package/templates/nextblock-template/app/actions/postActions.ts +146 -146
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
- package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
- package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5749
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
- package/templates/nextblock-template/app/api/search/route.ts +43 -43
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
- package/templates/nextblock-template/app/cart/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +4 -2
- package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
- package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
- package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
- package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
- package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
- package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/layout.tsx +73 -73
- package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
- package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
- package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
- package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
- package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
- package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
- package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +688 -688
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
- package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +23 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +9 -7
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
- package/templates/nextblock-template/app/profile/account-links.ts +22 -22
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
- package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
- package/templates/nextblock-template/app/setup/layout.tsx +13 -13
- package/templates/nextblock-template/app/setup/page.tsx +111 -111
- package/templates/nextblock-template/app/sitemap.ts +130 -130
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
- package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
- package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
- package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
- package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
- package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
- package/templates/nextblock-template/components/blocks/types.ts +7 -7
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -32
- package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
- package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
- package/templates/nextblock-template/components/submit-button.tsx +23 -23
- package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/AuthContext.tsx +23 -23
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
- package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
- package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
- package/templates/nextblock-template/docs/README.md +39 -39
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
- package/templates/nextblock-template/index.d.ts +7 -7
- package/templates/nextblock-template/lib/app-secrets.ts +39 -39
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
- package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
- package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
- package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
- package/templates/nextblock-template/lib/email/branding.ts +76 -76
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
- package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
- package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
- package/templates/nextblock-template/lib/media/youtube.ts +99 -99
- package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
- package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
- package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
- package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
- package/templates/nextblock-template/lib/privacy/types.ts +69 -69
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
- package/templates/nextblock-template/lib/promotions/server.ts +741 -741
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
- package/templates/nextblock-template/lib/search/types.ts +27 -27
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -87
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/site-url.ts +48 -48
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/postcss.config.js +6 -6
- package/templates/nextblock-template/scripts/backup.js +115 -115
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/restore.js +385 -385
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tailwind.config.js +25 -25
- package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
- package/tsconfig.base.json +3 -3
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
import type { Json } from "@nextblock-cms/db";
|
|
2
|
-
|
|
3
|
-
export type CmsContentType = "pages" | "posts" | "products";
|
|
4
|
-
export type CmsImportConflictMode = "create_new" | "overwrite_existing";
|
|
5
|
-
export type CmsImportApplyMode = "draft" | "live";
|
|
6
|
-
|
|
7
|
-
export interface CmsImportOptions {
|
|
8
|
-
conflictMode: CmsImportConflictMode;
|
|
9
|
-
applyMode: CmsImportApplyMode;
|
|
10
|
-
ignoreBlankFields?: boolean;
|
|
11
|
-
skipUnavailableProductContent?: boolean;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface CmsImportMessage {
|
|
15
|
-
row: number;
|
|
16
|
-
type: "error" | "warning";
|
|
17
|
-
message: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface CmsImportPreviewItem {
|
|
21
|
-
row: number;
|
|
22
|
-
action: "create" | "update" | "skip";
|
|
23
|
-
identifier: string;
|
|
24
|
-
contentType: CmsContentType;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface CmsImportSummary {
|
|
28
|
-
success: boolean;
|
|
29
|
-
totalRows: number;
|
|
30
|
-
created: number;
|
|
31
|
-
updated: number;
|
|
32
|
-
skipped: number;
|
|
33
|
-
errors: CmsImportMessage[];
|
|
34
|
-
warnings: CmsImportMessage[];
|
|
35
|
-
preview: CmsImportPreviewItem[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface CmsTransferActionResult {
|
|
39
|
-
success: boolean;
|
|
40
|
-
error?: string;
|
|
41
|
-
fileName?: string;
|
|
42
|
-
mimeType?: string;
|
|
43
|
-
content?: string;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface CmsBackupBundleV1 {
|
|
47
|
-
version: 1;
|
|
48
|
-
exported_at: string;
|
|
49
|
-
languages: Array<{
|
|
50
|
-
id: number;
|
|
51
|
-
code: string;
|
|
52
|
-
name: string | null;
|
|
53
|
-
}>;
|
|
54
|
-
content: {
|
|
55
|
-
pages: BackupPageRecord[];
|
|
56
|
-
posts: BackupPostRecord[];
|
|
57
|
-
products: BackupProductRecord[];
|
|
58
|
-
};
|
|
59
|
-
// Optional for backward compatibility with bundles exported before the
|
|
60
|
-
// Blocks Library was added to the content backup.
|
|
61
|
-
custom_blocks?: BackupCustomBlockRecord[];
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export interface BackupBlockRecord {
|
|
65
|
-
language_id?: number;
|
|
66
|
-
block_type: string;
|
|
67
|
-
content: Json;
|
|
68
|
-
order?: number;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface BackupCustomBlockRecord {
|
|
72
|
-
slug: string;
|
|
73
|
-
name: string;
|
|
74
|
-
description?: string;
|
|
75
|
-
fields: Json;
|
|
76
|
-
layout_schema: Json;
|
|
77
|
-
is_original?: boolean;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export interface BackupPageRecord {
|
|
81
|
-
id?: number | string | null;
|
|
82
|
-
translation_group_id?: string | null;
|
|
83
|
-
language_code: string;
|
|
84
|
-
title: string;
|
|
85
|
-
slug: string;
|
|
86
|
-
status: string;
|
|
87
|
-
meta_title?: string | null;
|
|
88
|
-
meta_description?: string | null;
|
|
89
|
-
feature_image_id?: string | null;
|
|
90
|
-
feature_image_object_key?: string | null;
|
|
91
|
-
blocks: BackupBlockRecord[];
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export interface BackupPostRecord extends BackupPageRecord {
|
|
95
|
-
label?: string | null;
|
|
96
|
-
excerpt?: string | null;
|
|
97
|
-
subtitle?: string | null;
|
|
98
|
-
published_at?: string | null;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export interface BackupProductVariantRecord {
|
|
102
|
-
id?: string | null;
|
|
103
|
-
sku: string;
|
|
104
|
-
upc?: string | null;
|
|
105
|
-
price: number;
|
|
106
|
-
prices?: Record<string, number>;
|
|
107
|
-
sale_price?: number | null;
|
|
108
|
-
sale_prices?: Record<string, number | null> | null;
|
|
109
|
-
stock_quantity: number;
|
|
110
|
-
main_media_id?: string | null;
|
|
111
|
-
main_media_object_key?: string | null;
|
|
112
|
-
attribute_term_ids?: string[];
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export interface BackupProductRecord {
|
|
116
|
-
id?: string | null;
|
|
117
|
-
translation_group_id?: string | null;
|
|
118
|
-
language_code: string;
|
|
119
|
-
product_type: string;
|
|
120
|
-
payment_provider: string;
|
|
121
|
-
title: string;
|
|
122
|
-
slug: string;
|
|
123
|
-
sku: string;
|
|
124
|
-
upc?: string | null;
|
|
125
|
-
status: string;
|
|
126
|
-
price: number;
|
|
127
|
-
prices?: Record<string, number>;
|
|
128
|
-
sale_price?: number | null;
|
|
129
|
-
sale_prices?: Record<string, number | null> | null;
|
|
130
|
-
stock: number;
|
|
131
|
-
is_taxable: boolean;
|
|
132
|
-
meta_title?: string | null;
|
|
133
|
-
meta_description?: string | null;
|
|
134
|
-
short_description?: string | null;
|
|
135
|
-
description_json?: Json;
|
|
136
|
-
description_blocks: BackupBlockRecord[];
|
|
137
|
-
category_slugs?: string[];
|
|
138
|
-
media_ids?: string[];
|
|
139
|
-
media_object_keys?: string[];
|
|
140
|
-
variants?: BackupProductVariantRecord[];
|
|
141
|
-
freemius_product_id?: string | null;
|
|
142
|
-
freemius_plan_id?: string | null;
|
|
143
|
-
trial_period_days?: number;
|
|
144
|
-
trial_requires_payment_method?: boolean;
|
|
145
|
-
}
|
|
1
|
+
import type { Json } from "@nextblock-cms/db";
|
|
2
|
+
|
|
3
|
+
export type CmsContentType = "pages" | "posts" | "products";
|
|
4
|
+
export type CmsImportConflictMode = "create_new" | "overwrite_existing";
|
|
5
|
+
export type CmsImportApplyMode = "draft" | "live";
|
|
6
|
+
|
|
7
|
+
export interface CmsImportOptions {
|
|
8
|
+
conflictMode: CmsImportConflictMode;
|
|
9
|
+
applyMode: CmsImportApplyMode;
|
|
10
|
+
ignoreBlankFields?: boolean;
|
|
11
|
+
skipUnavailableProductContent?: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface CmsImportMessage {
|
|
15
|
+
row: number;
|
|
16
|
+
type: "error" | "warning";
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface CmsImportPreviewItem {
|
|
21
|
+
row: number;
|
|
22
|
+
action: "create" | "update" | "skip";
|
|
23
|
+
identifier: string;
|
|
24
|
+
contentType: CmsContentType;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface CmsImportSummary {
|
|
28
|
+
success: boolean;
|
|
29
|
+
totalRows: number;
|
|
30
|
+
created: number;
|
|
31
|
+
updated: number;
|
|
32
|
+
skipped: number;
|
|
33
|
+
errors: CmsImportMessage[];
|
|
34
|
+
warnings: CmsImportMessage[];
|
|
35
|
+
preview: CmsImportPreviewItem[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface CmsTransferActionResult {
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
fileName?: string;
|
|
42
|
+
mimeType?: string;
|
|
43
|
+
content?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface CmsBackupBundleV1 {
|
|
47
|
+
version: 1;
|
|
48
|
+
exported_at: string;
|
|
49
|
+
languages: Array<{
|
|
50
|
+
id: number;
|
|
51
|
+
code: string;
|
|
52
|
+
name: string | null;
|
|
53
|
+
}>;
|
|
54
|
+
content: {
|
|
55
|
+
pages: BackupPageRecord[];
|
|
56
|
+
posts: BackupPostRecord[];
|
|
57
|
+
products: BackupProductRecord[];
|
|
58
|
+
};
|
|
59
|
+
// Optional for backward compatibility with bundles exported before the
|
|
60
|
+
// Blocks Library was added to the content backup.
|
|
61
|
+
custom_blocks?: BackupCustomBlockRecord[];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface BackupBlockRecord {
|
|
65
|
+
language_id?: number;
|
|
66
|
+
block_type: string;
|
|
67
|
+
content: Json;
|
|
68
|
+
order?: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface BackupCustomBlockRecord {
|
|
72
|
+
slug: string;
|
|
73
|
+
name: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
fields: Json;
|
|
76
|
+
layout_schema: Json;
|
|
77
|
+
is_original?: boolean;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export interface BackupPageRecord {
|
|
81
|
+
id?: number | string | null;
|
|
82
|
+
translation_group_id?: string | null;
|
|
83
|
+
language_code: string;
|
|
84
|
+
title: string;
|
|
85
|
+
slug: string;
|
|
86
|
+
status: string;
|
|
87
|
+
meta_title?: string | null;
|
|
88
|
+
meta_description?: string | null;
|
|
89
|
+
feature_image_id?: string | null;
|
|
90
|
+
feature_image_object_key?: string | null;
|
|
91
|
+
blocks: BackupBlockRecord[];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface BackupPostRecord extends BackupPageRecord {
|
|
95
|
+
label?: string | null;
|
|
96
|
+
excerpt?: string | null;
|
|
97
|
+
subtitle?: string | null;
|
|
98
|
+
published_at?: string | null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface BackupProductVariantRecord {
|
|
102
|
+
id?: string | null;
|
|
103
|
+
sku: string;
|
|
104
|
+
upc?: string | null;
|
|
105
|
+
price: number;
|
|
106
|
+
prices?: Record<string, number>;
|
|
107
|
+
sale_price?: number | null;
|
|
108
|
+
sale_prices?: Record<string, number | null> | null;
|
|
109
|
+
stock_quantity: number;
|
|
110
|
+
main_media_id?: string | null;
|
|
111
|
+
main_media_object_key?: string | null;
|
|
112
|
+
attribute_term_ids?: string[];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export interface BackupProductRecord {
|
|
116
|
+
id?: string | null;
|
|
117
|
+
translation_group_id?: string | null;
|
|
118
|
+
language_code: string;
|
|
119
|
+
product_type: string;
|
|
120
|
+
payment_provider: string;
|
|
121
|
+
title: string;
|
|
122
|
+
slug: string;
|
|
123
|
+
sku: string;
|
|
124
|
+
upc?: string | null;
|
|
125
|
+
status: string;
|
|
126
|
+
price: number;
|
|
127
|
+
prices?: Record<string, number>;
|
|
128
|
+
sale_price?: number | null;
|
|
129
|
+
sale_prices?: Record<string, number | null> | null;
|
|
130
|
+
stock: number;
|
|
131
|
+
is_taxable: boolean;
|
|
132
|
+
meta_title?: string | null;
|
|
133
|
+
meta_description?: string | null;
|
|
134
|
+
short_description?: string | null;
|
|
135
|
+
description_json?: Json;
|
|
136
|
+
description_blocks: BackupBlockRecord[];
|
|
137
|
+
category_slugs?: string[];
|
|
138
|
+
media_ids?: string[];
|
|
139
|
+
media_object_keys?: string[];
|
|
140
|
+
variants?: BackupProductVariantRecord[];
|
|
141
|
+
freemius_product_id?: string | null;
|
|
142
|
+
freemius_plan_id?: string | null;
|
|
143
|
+
trial_period_days?: number;
|
|
144
|
+
trial_requires_payment_method?: boolean;
|
|
145
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
import 'server-only';
|
|
2
|
-
|
|
3
|
-
import { getSsgSupabaseClient } from '@nextblock-cms/db/server';
|
|
4
|
-
import {
|
|
5
|
-
customBlockDefinitionRowSchema,
|
|
6
|
-
type CustomBlockDefinition,
|
|
7
|
-
} from '@nextblock-cms/utils';
|
|
8
|
-
import { unstable_cache } from 'next/cache';
|
|
9
|
-
|
|
10
|
-
export const CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG = 'custom-block-definitions';
|
|
11
|
-
const CUSTOM_BLOCK_SELECT = 'id, slug, name, description, fields, layout_schema, is_original';
|
|
12
|
-
|
|
13
|
-
export function getCustomBlockDefinitionCacheTag(idOrSlug: string) {
|
|
14
|
-
return `${CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG}:${idOrSlug}`;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function parseCustomBlockDefinitionRows(rows: unknown[]): CustomBlockDefinition[] {
|
|
18
|
-
return rows.map((row) => customBlockDefinitionRowSchema.parse(row));
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
async function queryCustomBlockDefinitions() {
|
|
22
|
-
const supabase = getSsgSupabaseClient();
|
|
23
|
-
const { data, error } = await supabase
|
|
24
|
-
.from('custom_block_definitions')
|
|
25
|
-
.select(CUSTOM_BLOCK_SELECT)
|
|
26
|
-
.order('name', { ascending: true });
|
|
27
|
-
|
|
28
|
-
if (error) {
|
|
29
|
-
throw new Error(`Failed to load custom block definitions: ${error.message}`);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return parseCustomBlockDefinitionRows(data ?? []);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export const getCachedCustomBlockDefinitions = unstable_cache(
|
|
36
|
-
queryCustomBlockDefinitions,
|
|
37
|
-
[CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG],
|
|
38
|
-
{
|
|
39
|
-
revalidate: 60,
|
|
40
|
-
tags: [CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG],
|
|
41
|
-
}
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const getCachedCustomBlockDefinitionBySlugInternal = unstable_cache(
|
|
45
|
-
async (slug: string) => {
|
|
46
|
-
const definitions = await queryCustomBlockDefinitions();
|
|
47
|
-
return definitions.find((definition) => definition.slug === slug) ?? null;
|
|
48
|
-
},
|
|
49
|
-
[`${CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG}:by-slug`],
|
|
50
|
-
{
|
|
51
|
-
revalidate: 60,
|
|
52
|
-
tags: [CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG],
|
|
53
|
-
}
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
async function queryCustomBlockDefinitionBySlug(slug: string): Promise<CustomBlockDefinition | null> {
|
|
57
|
-
const supabase = getSsgSupabaseClient();
|
|
58
|
-
const { data, error } = await supabase
|
|
59
|
-
.from('custom_block_definitions')
|
|
60
|
-
.select(CUSTOM_BLOCK_SELECT)
|
|
61
|
-
.eq('slug', slug)
|
|
62
|
-
.maybeSingle();
|
|
63
|
-
|
|
64
|
-
if (error) {
|
|
65
|
-
throw new Error(`Failed to load custom block definition "${slug}": ${error.message}`);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return data ? customBlockDefinitionRowSchema.parse(data) : null;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export async function getCachedCustomBlockDefinitionBySlug(slug: string) {
|
|
72
|
-
const cached = await getCachedCustomBlockDefinitionBySlugInternal(slug);
|
|
73
|
-
if (cached) {
|
|
74
|
-
return cached;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// The cached lookup can hold a stale "not found" result for a definition that
|
|
78
|
-
// was created or edited within the last revalidation window. Fall back to a
|
|
79
|
-
// direct read so a freshly saved custom block renders on the front end
|
|
80
|
-
// immediately instead of showing "Unsupported block type".
|
|
81
|
-
try {
|
|
82
|
-
return await queryCustomBlockDefinitionBySlug(slug);
|
|
83
|
-
} catch (error) {
|
|
84
|
-
console.error('[custom-block-definitions] Live definition fallback failed:', error);
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
1
|
+
import 'server-only';
|
|
2
|
+
|
|
3
|
+
import { getSsgSupabaseClient } from '@nextblock-cms/db/server';
|
|
4
|
+
import {
|
|
5
|
+
customBlockDefinitionRowSchema,
|
|
6
|
+
type CustomBlockDefinition,
|
|
7
|
+
} from '@nextblock-cms/utils';
|
|
8
|
+
import { unstable_cache } from 'next/cache';
|
|
9
|
+
|
|
10
|
+
export const CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG = 'custom-block-definitions';
|
|
11
|
+
const CUSTOM_BLOCK_SELECT = 'id, slug, name, description, fields, layout_schema, is_original';
|
|
12
|
+
|
|
13
|
+
export function getCustomBlockDefinitionCacheTag(idOrSlug: string) {
|
|
14
|
+
return `${CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG}:${idOrSlug}`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function parseCustomBlockDefinitionRows(rows: unknown[]): CustomBlockDefinition[] {
|
|
18
|
+
return rows.map((row) => customBlockDefinitionRowSchema.parse(row));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function queryCustomBlockDefinitions() {
|
|
22
|
+
const supabase = getSsgSupabaseClient();
|
|
23
|
+
const { data, error } = await supabase
|
|
24
|
+
.from('custom_block_definitions')
|
|
25
|
+
.select(CUSTOM_BLOCK_SELECT)
|
|
26
|
+
.order('name', { ascending: true });
|
|
27
|
+
|
|
28
|
+
if (error) {
|
|
29
|
+
throw new Error(`Failed to load custom block definitions: ${error.message}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return parseCustomBlockDefinitionRows(data ?? []);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const getCachedCustomBlockDefinitions = unstable_cache(
|
|
36
|
+
queryCustomBlockDefinitions,
|
|
37
|
+
[CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG],
|
|
38
|
+
{
|
|
39
|
+
revalidate: 60,
|
|
40
|
+
tags: [CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG],
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const getCachedCustomBlockDefinitionBySlugInternal = unstable_cache(
|
|
45
|
+
async (slug: string) => {
|
|
46
|
+
const definitions = await queryCustomBlockDefinitions();
|
|
47
|
+
return definitions.find((definition) => definition.slug === slug) ?? null;
|
|
48
|
+
},
|
|
49
|
+
[`${CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG}:by-slug`],
|
|
50
|
+
{
|
|
51
|
+
revalidate: 60,
|
|
52
|
+
tags: [CUSTOM_BLOCK_DEFINITIONS_CACHE_TAG],
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
async function queryCustomBlockDefinitionBySlug(slug: string): Promise<CustomBlockDefinition | null> {
|
|
57
|
+
const supabase = getSsgSupabaseClient();
|
|
58
|
+
const { data, error } = await supabase
|
|
59
|
+
.from('custom_block_definitions')
|
|
60
|
+
.select(CUSTOM_BLOCK_SELECT)
|
|
61
|
+
.eq('slug', slug)
|
|
62
|
+
.maybeSingle();
|
|
63
|
+
|
|
64
|
+
if (error) {
|
|
65
|
+
throw new Error(`Failed to load custom block definition "${slug}": ${error.message}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return data ? customBlockDefinitionRowSchema.parse(data) : null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function getCachedCustomBlockDefinitionBySlug(slug: string) {
|
|
72
|
+
const cached = await getCachedCustomBlockDefinitionBySlugInternal(slug);
|
|
73
|
+
if (cached) {
|
|
74
|
+
return cached;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// The cached lookup can hold a stale "not found" result for a definition that
|
|
78
|
+
// was created or edited within the last revalidation window. Fall back to a
|
|
79
|
+
// direct read so a freshly saved custom block renders on the front end
|
|
80
|
+
// immediately instead of showing "Unsupported block type".
|
|
81
|
+
try {
|
|
82
|
+
return await queryCustomBlockDefinitionBySlug(slug);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.error('[custom-block-definitions] Live definition fallback failed:', error);
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|