@shoppexio/builder-contracts 0.1.0 → 0.1.1
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/dist/builder-contracts.test.js +71 -1
- package/dist/builder-settings.d.ts +9 -666
- package/dist/builder-settings.d.ts.map +1 -1
- package/dist/canonical-settings.d.ts +18 -0
- package/dist/canonical-settings.d.ts.map +1 -0
- package/dist/canonical-settings.js +106 -0
- package/dist/events.d.ts +35 -240
- package/dist/events.d.ts.map +1 -1
- package/dist/events.js +7 -0
- package/dist/fields.d.ts +169 -8
- package/dist/fields.d.ts.map +1 -1
- package/dist/fields.js +27 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/legacy-manifest.d.ts +11 -0
- package/dist/legacy-manifest.d.ts.map +1 -1
- package/dist/legacy-manifest.js +106 -16
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +50 -4
- package/dist/persistence.d.ts +7 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +58 -0
- package/dist/preview-boot.d.ts +68 -0
- package/dist/preview-boot.d.ts.map +1 -0
- package/dist/preview-boot.js +36 -0
- package/dist/preview-protocol.d.ts +227 -459
- package/dist/preview-protocol.d.ts.map +1 -1
- package/dist/preview-protocol.js +112 -0
- package/dist/preview-session-resolve.d.ts +115 -0
- package/dist/preview-session-resolve.d.ts.map +1 -0
- package/dist/preview-session-resolve.js +25 -0
- package/dist/preview-trusted-origins.d.ts +4 -0
- package/dist/preview-trusted-origins.d.ts.map +1 -0
- package/dist/preview-trusted-origins.js +26 -0
- package/dist/storefront-initial-data-html.d.ts +17 -0
- package/dist/storefront-initial-data-html.d.ts.map +1 -0
- package/dist/storefront-initial-data-html.js +83 -0
- package/dist/style-slots.d.ts +49 -151
- package/dist/style-slots.d.ts.map +1 -1
- package/dist/style-slots.js +75 -29
- package/dist/theme-manifest.d.ts +229 -454
- package/dist/theme-manifest.d.ts.map +1 -1
- package/dist/theme-manifest.js +92 -0
- package/dist/theme-schemes.d.ts +10 -0
- package/dist/theme-schemes.d.ts.map +1 -0
- package/dist/theme-schemes.js +24 -0
- package/dist/validation.d.ts +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +18 -9
- package/package.json +43 -1
- package/src/builder-contracts.test.ts +398 -3
- package/src/canonical-settings.ts +156 -0
- package/src/events.ts +8 -0
- package/src/fields.ts +30 -0
- package/src/index.ts +7 -0
- package/src/legacy-manifest.ts +107 -16
- package/src/migrations.ts +65 -4
- package/src/persistence.ts +77 -0
- package/src/preview-boot.ts +47 -0
- package/src/preview-protocol.test.ts +132 -0
- package/src/preview-protocol.ts +122 -0
- package/src/preview-session-resolve.ts +34 -0
- package/src/preview-trusted-origins.test.ts +24 -0
- package/src/preview-trusted-origins.ts +35 -0
- package/src/storefront-initial-data-html.test.ts +63 -0
- package/src/storefront-initial-data-html.ts +112 -0
- package/src/style-slots.ts +96 -31
- package/src/theme-manifest.ts +118 -1
- package/src/theme-schemes.ts +33 -0
- package/src/validation.ts +27 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-manifest.d.ts","sourceRoot":"","sources":["../src/theme-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"theme-manifest.d.ts","sourceRoot":"","sources":["../src/theme-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/theme-manifest.js
CHANGED
|
@@ -49,20 +49,63 @@ export const ThemePresetSchema = z
|
|
|
49
49
|
.object({
|
|
50
50
|
label: z.string().min(1),
|
|
51
51
|
description: z.string().min(1).optional(),
|
|
52
|
+
preview: z.string().min(1).optional(),
|
|
52
53
|
content: z.record(z.string().min(1), z.unknown()).default({}),
|
|
53
54
|
layout: z.record(z.string().min(1), z.unknown()).default({}),
|
|
54
55
|
style_slots: StyleSlotDefaultsSchema.default({}),
|
|
55
56
|
})
|
|
56
57
|
.strict();
|
|
58
|
+
export const ThemeManifestMetadataSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
author: z.string().min(1).optional(),
|
|
61
|
+
description: z.string().min(1).optional(),
|
|
62
|
+
preview: z.string().min(1).optional(),
|
|
63
|
+
features: z.array(z.string().min(1)).optional(),
|
|
64
|
+
techStack: z.array(z.string().min(1)).optional(),
|
|
65
|
+
templates: z.array(z.string().min(1)).optional(),
|
|
66
|
+
createdAt: z.string().min(1).optional(),
|
|
67
|
+
demoUrl: z.string().min(1).optional(),
|
|
68
|
+
audience: z.string().min(1).optional(),
|
|
69
|
+
tags: z.array(z.string().min(1)).optional(),
|
|
70
|
+
hotfixPaths: z.array(z.string().min(1)).optional(),
|
|
71
|
+
})
|
|
72
|
+
.strict();
|
|
73
|
+
export const ThemeManifestLinkGroupSchema = z
|
|
74
|
+
.object({
|
|
75
|
+
path: z.string().min(1),
|
|
76
|
+
label: z.string().min(1),
|
|
77
|
+
description: z.string().min(1).optional(),
|
|
78
|
+
pageIds: z.array(z.string().min(1)).optional(),
|
|
79
|
+
})
|
|
80
|
+
.strict();
|
|
81
|
+
export const ThemeManifestLinkItemSchema = z
|
|
82
|
+
.object({
|
|
83
|
+
label: z.string().min(1),
|
|
84
|
+
href: z.string().min(1),
|
|
85
|
+
})
|
|
86
|
+
.strict();
|
|
57
87
|
export const ThemeManifestSchema = z
|
|
58
88
|
.object({
|
|
59
89
|
id: ThemeIdSchema,
|
|
60
90
|
name: z.string().min(1),
|
|
61
91
|
version: z.string().min(1),
|
|
92
|
+
author: ThemeManifestMetadataSchema.shape.author,
|
|
93
|
+
description: ThemeManifestMetadataSchema.shape.description,
|
|
94
|
+
preview: ThemeManifestMetadataSchema.shape.preview,
|
|
95
|
+
features: ThemeManifestMetadataSchema.shape.features,
|
|
96
|
+
techStack: ThemeManifestMetadataSchema.shape.techStack,
|
|
97
|
+
templates: ThemeManifestMetadataSchema.shape.templates,
|
|
98
|
+
createdAt: ThemeManifestMetadataSchema.shape.createdAt,
|
|
99
|
+
demoUrl: ThemeManifestMetadataSchema.shape.demoUrl,
|
|
100
|
+
audience: ThemeManifestMetadataSchema.shape.audience,
|
|
101
|
+
tags: ThemeManifestMetadataSchema.shape.tags,
|
|
102
|
+
hotfixPaths: ThemeManifestMetadataSchema.shape.hotfixPaths,
|
|
62
103
|
pages: z.record(z.string().min(1), ManifestPageSchema),
|
|
63
104
|
blocks: z.record(z.string().min(1), ManifestBlockSchema),
|
|
64
105
|
styleSlots: StyleSlotDefaultsSchema.default({}),
|
|
65
106
|
presets: z.record(z.string().min(1), ThemePresetSchema).default({}),
|
|
107
|
+
linkGroups: z.array(ThemeManifestLinkGroupSchema).optional(),
|
|
108
|
+
defaultLinkItems: z.record(z.string().min(1), z.array(ThemeManifestLinkItemSchema)).optional(),
|
|
66
109
|
})
|
|
67
110
|
.strict()
|
|
68
111
|
.superRefine((manifest, ctx) => {
|
|
@@ -117,3 +160,52 @@ export const ThemeManifestSchema = z
|
|
|
117
160
|
export function parseThemeManifest(input) {
|
|
118
161
|
return ThemeManifestSchema.parse(input);
|
|
119
162
|
}
|
|
163
|
+
export function listThemeManifestPresets(input) {
|
|
164
|
+
if (!isRecord(input) || !isRecord(input.presets)) {
|
|
165
|
+
if (isRecord(input) && Array.isArray(input.presets)) {
|
|
166
|
+
return input.presets.flatMap((preset) => normalizeLegacyPresetListItem(preset));
|
|
167
|
+
}
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
const manifest = ThemeManifestSchema.safeParse(input);
|
|
171
|
+
if (!manifest.success) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
return Object.entries(manifest.data.presets).map(([id, preset]) => ({
|
|
175
|
+
id,
|
|
176
|
+
name: preset.label,
|
|
177
|
+
...(preset.description ? { description: preset.description } : {}),
|
|
178
|
+
...(preset.preview ? { preview: preset.preview } : {}),
|
|
179
|
+
overrides: {
|
|
180
|
+
...(Object.keys(preset.content).length > 0 ? { content: preset.content } : {}),
|
|
181
|
+
...(Object.keys(preset.layout).length > 0 ? { layout: preset.layout } : {}),
|
|
182
|
+
...(Object.keys(preset.style_slots).length > 0 ? { style_slots: preset.style_slots } : {}),
|
|
183
|
+
},
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
function normalizeLegacyPresetListItem(input) {
|
|
187
|
+
if (!isRecord(input) || typeof input.id !== 'string') {
|
|
188
|
+
return [];
|
|
189
|
+
}
|
|
190
|
+
const overrides = isRecord(input.overrides) ? input.overrides : {};
|
|
191
|
+
const styleSlots = StyleSlotDefaultsSchema.safeParse(overrides.style_slots ?? overrides.styleSlots);
|
|
192
|
+
return [{
|
|
193
|
+
id: input.id,
|
|
194
|
+
name: typeof input.name === 'string'
|
|
195
|
+
? input.name
|
|
196
|
+
: typeof input.label === 'string'
|
|
197
|
+
? input.label
|
|
198
|
+
: input.id,
|
|
199
|
+
...(typeof input.description === 'string' ? { description: input.description } : {}),
|
|
200
|
+
...(typeof input.preview === 'string' ? { preview: input.preview } : {}),
|
|
201
|
+
overrides: {
|
|
202
|
+
...(isRecord(overrides.content) ? { content: overrides.content } : {}),
|
|
203
|
+
...(isRecord(overrides.layout) ? { layout: overrides.layout } : {}),
|
|
204
|
+
...(isRecord(overrides.tokens) ? { tokens: overrides.tokens } : {}),
|
|
205
|
+
...(styleSlots.success && Object.keys(styleSlots.data).length > 0 ? { style_slots: styleSlots.data } : {}),
|
|
206
|
+
},
|
|
207
|
+
}];
|
|
208
|
+
}
|
|
209
|
+
function isRecord(value) {
|
|
210
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
211
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare const PUBLIC_BUILDER_THEME_SCHEMES: readonly ["default", "classic", "nebula", "pulse", "phantom", "starlight", "apex", "vault"];
|
|
2
|
+
export declare const STARTER_BUILDER_THEME_SCHEMES: readonly ["blank"];
|
|
3
|
+
export declare const BUILDER_READY_THEME_SCHEMES: readonly ["blank", "default", "classic", "nebula", "pulse", "phantom", "starlight", "apex", "vault"];
|
|
4
|
+
export type PublicBuilderThemeScheme = (typeof PUBLIC_BUILDER_THEME_SCHEMES)[number];
|
|
5
|
+
export type StarterBuilderThemeScheme = (typeof STARTER_BUILDER_THEME_SCHEMES)[number];
|
|
6
|
+
export type BuilderReadyThemeScheme = (typeof BUILDER_READY_THEME_SCHEMES)[number];
|
|
7
|
+
export declare function isPublicBuilderThemeScheme(value: string): value is PublicBuilderThemeScheme;
|
|
8
|
+
export declare function isStarterBuilderThemeScheme(value: string): value is StarterBuilderThemeScheme;
|
|
9
|
+
export declare function isBuilderReadyThemeScheme(value: string): value is BuilderReadyThemeScheme;
|
|
10
|
+
//# sourceMappingURL=theme-schemes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-schemes.d.ts","sourceRoot":"","sources":["../src/theme-schemes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,6FAS/B,CAAC;AAEX,eAAO,MAAM,6BAA6B,oBAAqB,CAAC;AAEhE,eAAO,MAAM,2BAA2B,sGAG9B,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AACrF,MAAM,MAAM,yBAAyB,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AACvF,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,wBAAwB,CAE3F;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,yBAAyB,CAE7F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,uBAAuB,CAEzF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const PUBLIC_BUILDER_THEME_SCHEMES = [
|
|
2
|
+
'default',
|
|
3
|
+
'classic',
|
|
4
|
+
'nebula',
|
|
5
|
+
'pulse',
|
|
6
|
+
'phantom',
|
|
7
|
+
'starlight',
|
|
8
|
+
'apex',
|
|
9
|
+
'vault',
|
|
10
|
+
];
|
|
11
|
+
export const STARTER_BUILDER_THEME_SCHEMES = ['blank'];
|
|
12
|
+
export const BUILDER_READY_THEME_SCHEMES = [
|
|
13
|
+
...STARTER_BUILDER_THEME_SCHEMES,
|
|
14
|
+
...PUBLIC_BUILDER_THEME_SCHEMES,
|
|
15
|
+
];
|
|
16
|
+
export function isPublicBuilderThemeScheme(value) {
|
|
17
|
+
return PUBLIC_BUILDER_THEME_SCHEMES.includes(value);
|
|
18
|
+
}
|
|
19
|
+
export function isStarterBuilderThemeScheme(value) {
|
|
20
|
+
return STARTER_BUILDER_THEME_SCHEMES.includes(value);
|
|
21
|
+
}
|
|
22
|
+
export function isBuilderReadyThemeScheme(value) {
|
|
23
|
+
return BUILDER_READY_THEME_SCHEMES.includes(value);
|
|
24
|
+
}
|
package/dist/validation.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { BuilderSettings } from './builder-settings.ts';
|
|
2
2
|
import type { ThemeManifest } from './theme-manifest.ts';
|
|
3
|
-
export type BuilderManifestValidationIssueCode = 'unknown_page' | 'duplicate_block_id' | 'unknown_block_type' | 'block_not_allowed' | 'too_many_block_instances' | 'unknown_block_variant' | 'unknown_block_setting' | 'unexposed_style_slot';
|
|
3
|
+
export type BuilderManifestValidationIssueCode = 'unknown_page' | 'duplicate_block_id' | 'unknown_block_type' | 'block_not_allowed' | 'too_many_block_instances' | 'unknown_block_variant' | 'unknown_block_setting' | 'unknown_style_slot' | 'unexposed_style_slot';
|
|
4
4
|
export type BuilderManifestValidationIssue = {
|
|
5
5
|
code: BuilderManifestValidationIssueCode;
|
|
6
6
|
path: string;
|
package/dist/validation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,MAAM,kCAAkC,GAC1C,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,GACnB,0BAA0B,GAC1B,uBAAuB,GACvB,uBAAuB,GACvB,oBAAoB,GACpB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,8BAA8B,GAAG;IAC3C,IAAI,EAAE,kCAAkC,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,QAAQ,CAAC,MAAM,EAAE,8BAA8B,EAAE,CAAC;gBAEtC,MAAM,EAAE,8BAA8B,EAAE;CAKrD;AAED,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,aAAa,GACtB,8BAA8B,EAAE,CAoElC;AAwBD,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,aAAa,GACtB,IAAI,CAKN;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,8BAA8B,EAAE,GACvC,MAAM,CAQR"}
|
package/dist/validation.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ThemeStyleSlotIdSchema } from "./style-slots.js";
|
|
1
2
|
export class BuilderManifestValidationError extends Error {
|
|
2
3
|
issues;
|
|
3
4
|
constructor(issues) {
|
|
@@ -8,6 +9,7 @@ export class BuilderManifestValidationError extends Error {
|
|
|
8
9
|
}
|
|
9
10
|
export function validateBuilderSettingsAgainstManifest(settings, manifest) {
|
|
10
11
|
const issues = [];
|
|
12
|
+
validateGlobalStyleSlots(settings, manifest, issues);
|
|
11
13
|
for (const [pageId, layout] of Object.entries(settings.theme.layout)) {
|
|
12
14
|
const page = manifest.pages[pageId];
|
|
13
15
|
if (!page) {
|
|
@@ -64,6 +66,21 @@ export function validateBuilderSettingsAgainstManifest(settings, manifest) {
|
|
|
64
66
|
}
|
|
65
67
|
return issues;
|
|
66
68
|
}
|
|
69
|
+
function validateGlobalStyleSlots(settings, manifest, issues) {
|
|
70
|
+
const declaredThemeSlots = new Set(Object.keys(manifest.styleSlots));
|
|
71
|
+
for (const slotId of Object.keys(settings.theme.style_slots)) {
|
|
72
|
+
if (!ThemeStyleSlotIdSchema.safeParse(slotId).success) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (!declaredThemeSlots.has(slotId)) {
|
|
76
|
+
issues.push({
|
|
77
|
+
code: 'unknown_style_slot',
|
|
78
|
+
path: `theme.style_slots.${slotId}`,
|
|
79
|
+
message: `Theme style slot "${slotId}" is not declared by the manifest`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
67
84
|
export function assertBuilderSettingsMatchManifest(settings, manifest) {
|
|
68
85
|
const issues = validateBuilderSettingsAgainstManifest(settings, manifest);
|
|
69
86
|
if (issues.length > 0) {
|
|
@@ -82,11 +99,7 @@ function validateBlockSettings(block, settingPaths, blockPath, issues) {
|
|
|
82
99
|
if (settingPaths.length === 0 && Object.keys(block.settings).length === 0) {
|
|
83
100
|
return;
|
|
84
101
|
}
|
|
85
|
-
const allowedSettings = new Set();
|
|
86
|
-
for (const path of settingPaths) {
|
|
87
|
-
allowedSettings.add(path);
|
|
88
|
-
allowedSettings.add(getShortSettingKey(path));
|
|
89
|
-
}
|
|
102
|
+
const allowedSettings = new Set(settingPaths);
|
|
90
103
|
for (const key of Object.keys(block.settings)) {
|
|
91
104
|
if (allowedSettings.has(key)) {
|
|
92
105
|
continue;
|
|
@@ -110,10 +123,6 @@ function validateBlockVariant(block, variants, blockPath, issues) {
|
|
|
110
123
|
});
|
|
111
124
|
}
|
|
112
125
|
}
|
|
113
|
-
function getShortSettingKey(path) {
|
|
114
|
-
const parts = path.split('.').filter(Boolean);
|
|
115
|
-
return parts.at(-1) ?? path;
|
|
116
|
-
}
|
|
117
126
|
function validateBlockStyleOverrides(block, exposedStyleSlots, blockPath, issues) {
|
|
118
127
|
if (!block.style_overrides) {
|
|
119
128
|
return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shoppexio/builder-contracts",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Shared Builder v2 contracts for Shoppex dashboard, backend, preview runtime, and themes",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -25,6 +25,12 @@
|
|
|
25
25
|
"import": "./dist/index.js",
|
|
26
26
|
"default": "./dist/index.js"
|
|
27
27
|
},
|
|
28
|
+
"./canonical-settings": {
|
|
29
|
+
"bun": "./src/canonical-settings.ts",
|
|
30
|
+
"types": "./dist/canonical-settings.d.ts",
|
|
31
|
+
"import": "./dist/canonical-settings.js",
|
|
32
|
+
"default": "./dist/canonical-settings.js"
|
|
33
|
+
},
|
|
28
34
|
"./builder-settings": {
|
|
29
35
|
"bun": "./src/builder-settings.ts",
|
|
30
36
|
"types": "./dist/builder-settings.d.ts",
|
|
@@ -55,12 +61,42 @@
|
|
|
55
61
|
"import": "./dist/migrations.js",
|
|
56
62
|
"default": "./dist/migrations.js"
|
|
57
63
|
},
|
|
64
|
+
"./persistence": {
|
|
65
|
+
"bun": "./src/persistence.ts",
|
|
66
|
+
"types": "./dist/persistence.d.ts",
|
|
67
|
+
"import": "./dist/persistence.js",
|
|
68
|
+
"default": "./dist/persistence.js"
|
|
69
|
+
},
|
|
58
70
|
"./preview-protocol": {
|
|
59
71
|
"bun": "./src/preview-protocol.ts",
|
|
60
72
|
"types": "./dist/preview-protocol.d.ts",
|
|
61
73
|
"import": "./dist/preview-protocol.js",
|
|
62
74
|
"default": "./dist/preview-protocol.js"
|
|
63
75
|
},
|
|
76
|
+
"./preview-boot": {
|
|
77
|
+
"bun": "./src/preview-boot.ts",
|
|
78
|
+
"types": "./dist/preview-boot.d.ts",
|
|
79
|
+
"import": "./dist/preview-boot.js",
|
|
80
|
+
"default": "./dist/preview-boot.js"
|
|
81
|
+
},
|
|
82
|
+
"./preview-session-resolve": {
|
|
83
|
+
"bun": "./src/preview-session-resolve.ts",
|
|
84
|
+
"types": "./dist/preview-session-resolve.d.ts",
|
|
85
|
+
"import": "./dist/preview-session-resolve.js",
|
|
86
|
+
"default": "./dist/preview-session-resolve.js"
|
|
87
|
+
},
|
|
88
|
+
"./preview-trusted-origins": {
|
|
89
|
+
"bun": "./src/preview-trusted-origins.ts",
|
|
90
|
+
"types": "./dist/preview-trusted-origins.d.ts",
|
|
91
|
+
"import": "./dist/preview-trusted-origins.js",
|
|
92
|
+
"default": "./dist/preview-trusted-origins.js"
|
|
93
|
+
},
|
|
94
|
+
"./storefront-initial-data-html": {
|
|
95
|
+
"bun": "./src/storefront-initial-data-html.ts",
|
|
96
|
+
"types": "./dist/storefront-initial-data-html.d.ts",
|
|
97
|
+
"import": "./dist/storefront-initial-data-html.js",
|
|
98
|
+
"default": "./dist/storefront-initial-data-html.js"
|
|
99
|
+
},
|
|
64
100
|
"./style-slots": {
|
|
65
101
|
"bun": "./src/style-slots.ts",
|
|
66
102
|
"types": "./dist/style-slots.d.ts",
|
|
@@ -72,6 +108,12 @@
|
|
|
72
108
|
"types": "./dist/theme-manifest.d.ts",
|
|
73
109
|
"import": "./dist/theme-manifest.js",
|
|
74
110
|
"default": "./dist/theme-manifest.js"
|
|
111
|
+
},
|
|
112
|
+
"./theme-schemes": {
|
|
113
|
+
"bun": "./src/theme-schemes.ts",
|
|
114
|
+
"types": "./dist/theme-schemes.d.ts",
|
|
115
|
+
"import": "./dist/theme-schemes.js",
|
|
116
|
+
"default": "./dist/theme-schemes.js"
|
|
75
117
|
}
|
|
76
118
|
},
|
|
77
119
|
"files": [
|