@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.
Files changed (71) hide show
  1. package/dist/builder-contracts.test.js +71 -1
  2. package/dist/builder-settings.d.ts +9 -666
  3. package/dist/builder-settings.d.ts.map +1 -1
  4. package/dist/canonical-settings.d.ts +18 -0
  5. package/dist/canonical-settings.d.ts.map +1 -0
  6. package/dist/canonical-settings.js +106 -0
  7. package/dist/events.d.ts +35 -240
  8. package/dist/events.d.ts.map +1 -1
  9. package/dist/events.js +7 -0
  10. package/dist/fields.d.ts +169 -8
  11. package/dist/fields.d.ts.map +1 -1
  12. package/dist/fields.js +27 -0
  13. package/dist/index.d.ts +7 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +7 -0
  16. package/dist/legacy-manifest.d.ts +11 -0
  17. package/dist/legacy-manifest.d.ts.map +1 -1
  18. package/dist/legacy-manifest.js +106 -16
  19. package/dist/migrations.d.ts.map +1 -1
  20. package/dist/migrations.js +50 -4
  21. package/dist/persistence.d.ts +7 -0
  22. package/dist/persistence.d.ts.map +1 -0
  23. package/dist/persistence.js +58 -0
  24. package/dist/preview-boot.d.ts +68 -0
  25. package/dist/preview-boot.d.ts.map +1 -0
  26. package/dist/preview-boot.js +36 -0
  27. package/dist/preview-protocol.d.ts +227 -459
  28. package/dist/preview-protocol.d.ts.map +1 -1
  29. package/dist/preview-protocol.js +112 -0
  30. package/dist/preview-session-resolve.d.ts +115 -0
  31. package/dist/preview-session-resolve.d.ts.map +1 -0
  32. package/dist/preview-session-resolve.js +25 -0
  33. package/dist/preview-trusted-origins.d.ts +4 -0
  34. package/dist/preview-trusted-origins.d.ts.map +1 -0
  35. package/dist/preview-trusted-origins.js +26 -0
  36. package/dist/storefront-initial-data-html.d.ts +17 -0
  37. package/dist/storefront-initial-data-html.d.ts.map +1 -0
  38. package/dist/storefront-initial-data-html.js +83 -0
  39. package/dist/style-slots.d.ts +49 -151
  40. package/dist/style-slots.d.ts.map +1 -1
  41. package/dist/style-slots.js +75 -29
  42. package/dist/theme-manifest.d.ts +229 -454
  43. package/dist/theme-manifest.d.ts.map +1 -1
  44. package/dist/theme-manifest.js +92 -0
  45. package/dist/theme-schemes.d.ts +10 -0
  46. package/dist/theme-schemes.d.ts.map +1 -0
  47. package/dist/theme-schemes.js +24 -0
  48. package/dist/validation.d.ts +1 -1
  49. package/dist/validation.d.ts.map +1 -1
  50. package/dist/validation.js +18 -9
  51. package/package.json +43 -1
  52. package/src/builder-contracts.test.ts +398 -3
  53. package/src/canonical-settings.ts +156 -0
  54. package/src/events.ts +8 -0
  55. package/src/fields.ts +30 -0
  56. package/src/index.ts +7 -0
  57. package/src/legacy-manifest.ts +107 -16
  58. package/src/migrations.ts +65 -4
  59. package/src/persistence.ts +77 -0
  60. package/src/preview-boot.ts +47 -0
  61. package/src/preview-protocol.test.ts +132 -0
  62. package/src/preview-protocol.ts +122 -0
  63. package/src/preview-session-resolve.ts +34 -0
  64. package/src/preview-trusted-origins.test.ts +24 -0
  65. package/src/preview-trusted-origins.ts +35 -0
  66. package/src/storefront-initial-data-html.test.ts +63 -0
  67. package/src/storefront-initial-data-html.ts +112 -0
  68. package/src/style-slots.ts +96 -31
  69. package/src/theme-manifest.ts +118 -1
  70. package/src/theme-schemes.ts +33 -0
  71. 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;AAI5B,eAAO,MAAM,aAAa,aAAoD,CAAC;AAC/E,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEpD,eAAO,MAAM,kBAAkB;;;;kBAMpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,kBAAkB;;;;kBAMpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,kBAAkB;;;;;;;;;kBAOpB,CAAC;AACZ,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAQnB,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAWrB,CAAC;AACZ,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAQnB,CAAC;AACZ,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA+D5B,CAAC;AACL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAEhE"}
1
+ {"version":3,"file":"theme-manifest.d.ts","sourceRoot":"","sources":["../src/theme-manifest.ts"],"names":[],"mappings":"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"}
@@ -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
+ }
@@ -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;
@@ -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;AAC5E,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,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,CAkElC;AAED,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,aAAa,GACtB,IAAI,CAKN;AAED,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,8BAA8B,EAAE,GACvC,MAAM,CAQR"}
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"}
@@ -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.0",
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": [