@shoppexio/builder-contracts 0.1.0 → 0.1.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.
Files changed (92) hide show
  1. package/dist/builder-settings.d.ts +11 -666
  2. package/dist/builder-settings.d.ts.map +1 -1
  3. package/dist/builder-settings.js +2 -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/custom-pages.d.ts +15 -0
  8. package/dist/custom-pages.d.ts.map +1 -0
  9. package/dist/custom-pages.js +40 -0
  10. package/dist/dedicated-pages.d.ts +15 -0
  11. package/dist/dedicated-pages.d.ts.map +1 -0
  12. package/dist/dedicated-pages.js +142 -0
  13. package/dist/events.d.ts +35 -240
  14. package/dist/events.d.ts.map +1 -1
  15. package/dist/events.js +7 -0
  16. package/dist/fields.d.ts +229 -10
  17. package/dist/fields.d.ts.map +1 -1
  18. package/dist/fields.js +27 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +10 -0
  22. package/dist/legacy-manifest.d.ts +18 -0
  23. package/dist/legacy-manifest.d.ts.map +1 -1
  24. package/dist/legacy-manifest.js +137 -22
  25. package/dist/migrations.d.ts.map +1 -1
  26. package/dist/migrations.js +55 -6
  27. package/dist/persistence.d.ts +7 -0
  28. package/dist/persistence.d.ts.map +1 -0
  29. package/dist/persistence.js +58 -0
  30. package/dist/preview-boot.d.ts +68 -0
  31. package/dist/preview-boot.d.ts.map +1 -0
  32. package/dist/preview-boot.js +38 -0
  33. package/dist/preview-protocol.d.ts +227 -459
  34. package/dist/preview-protocol.d.ts.map +1 -1
  35. package/dist/preview-protocol.js +112 -0
  36. package/dist/preview-session-resolve.d.ts +115 -0
  37. package/dist/preview-session-resolve.d.ts.map +1 -0
  38. package/dist/preview-session-resolve.js +25 -0
  39. package/dist/preview-trusted-origins.d.ts +4 -0
  40. package/dist/preview-trusted-origins.d.ts.map +1 -0
  41. package/dist/preview-trusted-origins.js +28 -0
  42. package/dist/storefront-initial-data-html.d.ts +17 -0
  43. package/dist/storefront-initial-data-html.d.ts.map +1 -0
  44. package/dist/storefront-initial-data-html.js +83 -0
  45. package/dist/storefront-typography-fonts.d.ts +18 -0
  46. package/dist/storefront-typography-fonts.d.ts.map +1 -0
  47. package/dist/storefront-typography-fonts.js +89 -0
  48. package/dist/style-slots.d.ts +50 -152
  49. package/dist/style-slots.d.ts.map +1 -1
  50. package/dist/style-slots.js +80 -32
  51. package/dist/theme-manifest.d.ts +287 -456
  52. package/dist/theme-manifest.d.ts.map +1 -1
  53. package/dist/theme-manifest.js +92 -0
  54. package/dist/theme-schemes.d.ts +10 -0
  55. package/dist/theme-schemes.d.ts.map +1 -0
  56. package/dist/theme-schemes.js +25 -0
  57. package/dist/validation.d.ts +1 -1
  58. package/dist/validation.d.ts.map +1 -1
  59. package/dist/validation.js +23 -12
  60. package/package.json +43 -1
  61. package/src/builder-contracts.test.ts +416 -3
  62. package/src/builder-settings.ts +4 -1
  63. package/src/canonical-settings.ts +156 -0
  64. package/src/custom-pages.test.ts +74 -0
  65. package/src/custom-pages.ts +70 -0
  66. package/src/dedicated-pages.test.ts +88 -0
  67. package/src/dedicated-pages.ts +173 -0
  68. package/src/events.ts +8 -0
  69. package/src/fields.ts +30 -0
  70. package/src/index.ts +10 -0
  71. package/src/legacy-manifest.ts +147 -23
  72. package/src/migrations.ts +70 -6
  73. package/src/persistence.ts +77 -0
  74. package/src/preview-boot.test.ts +72 -0
  75. package/src/preview-boot.ts +49 -0
  76. package/src/preview-protocol.test.ts +132 -0
  77. package/src/preview-protocol.ts +122 -0
  78. package/src/preview-session-resolve.test.ts +37 -0
  79. package/src/preview-session-resolve.ts +34 -0
  80. package/src/preview-trusted-origins.test.ts +24 -0
  81. package/src/preview-trusted-origins.ts +35 -0
  82. package/src/storefront-initial-data-html.test.ts +73 -0
  83. package/src/storefront-initial-data-html.ts +112 -0
  84. package/src/storefront-typography-fonts.test.ts +48 -0
  85. package/src/storefront-typography-fonts.ts +108 -0
  86. package/src/style-slots.ts +102 -34
  87. package/src/theme-manifest.ts +118 -1
  88. package/src/theme-schemes.ts +34 -0
  89. package/src/validation.ts +32 -13
  90. package/dist/builder-contracts.test.d.ts +0 -2
  91. package/dist/builder-contracts.test.d.ts.map +0 -1
  92. package/dist/builder-contracts.test.js +0 -361
@@ -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", "clean-minimal"];
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", "clean-minimal"];
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,8GAU/B,CAAC;AAEX,eAAO,MAAM,6BAA6B,oBAAqB,CAAC;AAEhE,eAAO,MAAM,2BAA2B,uHAG9B,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,25 @@
1
+ export const PUBLIC_BUILDER_THEME_SCHEMES = [
2
+ 'default',
3
+ 'classic',
4
+ 'nebula',
5
+ 'pulse',
6
+ 'phantom',
7
+ 'starlight',
8
+ 'apex',
9
+ 'vault',
10
+ 'clean-minimal',
11
+ ];
12
+ export const STARTER_BUILDER_THEME_SCHEMES = ['blank'];
13
+ export const BUILDER_READY_THEME_SCHEMES = [
14
+ ...STARTER_BUILDER_THEME_SCHEMES,
15
+ ...PUBLIC_BUILDER_THEME_SCHEMES,
16
+ ];
17
+ export function isPublicBuilderThemeScheme(value) {
18
+ return PUBLIC_BUILDER_THEME_SCHEMES.includes(value);
19
+ }
20
+ export function isStarterBuilderThemeScheme(value) {
21
+ return STARTER_BUILDER_THEME_SCHEMES.includes(value);
22
+ }
23
+ export function isBuilderReadyThemeScheme(value) {
24
+ return BUILDER_READY_THEME_SCHEMES.includes(value);
25
+ }
@@ -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;AAG5E,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,CAqElC;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,5 @@
1
+ import { mergeCustomPagesIntoManifest } from "./custom-pages.js";
2
+ import { ThemeStyleSlotIdSchema } from "./style-slots.js";
1
3
  export class BuilderManifestValidationError extends Error {
2
4
  issues;
3
5
  constructor(issues) {
@@ -7,9 +9,11 @@ export class BuilderManifestValidationError extends Error {
7
9
  }
8
10
  }
9
11
  export function validateBuilderSettingsAgainstManifest(settings, manifest) {
12
+ const effectiveManifest = mergeCustomPagesIntoManifest(manifest, settings);
10
13
  const issues = [];
14
+ validateGlobalStyleSlots(settings, effectiveManifest, issues);
11
15
  for (const [pageId, layout] of Object.entries(settings.theme.layout)) {
12
- const page = manifest.pages[pageId];
16
+ const page = effectiveManifest.pages[pageId];
13
17
  if (!page) {
14
18
  issues.push({
15
19
  code: 'unknown_page',
@@ -30,7 +34,7 @@ export function validateBuilderSettingsAgainstManifest(settings, manifest) {
30
34
  });
31
35
  }
32
36
  blockIds.add(block.id);
33
- const blockDefinition = manifest.blocks[block.type];
37
+ const blockDefinition = effectiveManifest.blocks[block.type];
34
38
  if (!blockDefinition) {
35
39
  issues.push({
36
40
  code: 'unknown_block_type',
@@ -52,7 +56,7 @@ export function validateBuilderSettingsAgainstManifest(settings, manifest) {
52
56
  validateBlockStyleOverrides(block, blockDefinition.exposedStyleSlots, blockPath, issues);
53
57
  }
54
58
  for (const [blockType, count] of blockTypeCounts.entries()) {
55
- const maxInstances = manifest.blocks[blockType]?.maxInstances;
59
+ const maxInstances = effectiveManifest.blocks[blockType]?.maxInstances;
56
60
  if (maxInstances !== undefined && count > maxInstances) {
57
61
  issues.push({
58
62
  code: 'too_many_block_instances',
@@ -64,6 +68,21 @@ export function validateBuilderSettingsAgainstManifest(settings, manifest) {
64
68
  }
65
69
  return issues;
66
70
  }
71
+ function validateGlobalStyleSlots(settings, manifest, issues) {
72
+ const declaredThemeSlots = new Set(Object.keys(manifest.styleSlots));
73
+ for (const slotId of Object.keys(settings.theme.style_slots)) {
74
+ if (!ThemeStyleSlotIdSchema.safeParse(slotId).success) {
75
+ continue;
76
+ }
77
+ if (!declaredThemeSlots.has(slotId)) {
78
+ issues.push({
79
+ code: 'unknown_style_slot',
80
+ path: `theme.style_slots.${slotId}`,
81
+ message: `Theme style slot "${slotId}" is not declared by the manifest`,
82
+ });
83
+ }
84
+ }
85
+ }
67
86
  export function assertBuilderSettingsMatchManifest(settings, manifest) {
68
87
  const issues = validateBuilderSettingsAgainstManifest(settings, manifest);
69
88
  if (issues.length > 0) {
@@ -82,11 +101,7 @@ function validateBlockSettings(block, settingPaths, blockPath, issues) {
82
101
  if (settingPaths.length === 0 && Object.keys(block.settings).length === 0) {
83
102
  return;
84
103
  }
85
- const allowedSettings = new Set();
86
- for (const path of settingPaths) {
87
- allowedSettings.add(path);
88
- allowedSettings.add(getShortSettingKey(path));
89
- }
104
+ const allowedSettings = new Set(settingPaths);
90
105
  for (const key of Object.keys(block.settings)) {
91
106
  if (allowedSettings.has(key)) {
92
107
  continue;
@@ -110,10 +125,6 @@ function validateBlockVariant(block, variants, blockPath, issues) {
110
125
  });
111
126
  }
112
127
  }
113
- function getShortSettingKey(path) {
114
- const parts = path.split('.').filter(Boolean);
115
- return parts.at(-1) ?? path;
116
- }
117
128
  function validateBlockStyleOverrides(block, exposedStyleSlots, blockPath, issues) {
118
129
  if (!block.style_overrides) {
119
130
  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.2",
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": [