@kotao/storefront 0.2.0

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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -0
  3. package/dist/cart-documents-CwwRTvm8.d.ts +21 -0
  4. package/dist/cart-documents.d.ts +2 -0
  5. package/dist/cart-documents.js +3 -0
  6. package/dist/cart-documents.js.map +1 -0
  7. package/dist/chunk-2IWNUDSZ.js +104 -0
  8. package/dist/chunk-2IWNUDSZ.js.map +1 -0
  9. package/dist/chunk-3YQXJNR7.js +70 -0
  10. package/dist/chunk-3YQXJNR7.js.map +1 -0
  11. package/dist/chunk-5QOFKGKD.js +51 -0
  12. package/dist/chunk-5QOFKGKD.js.map +1 -0
  13. package/dist/chunk-GCQI6OKH.js +239 -0
  14. package/dist/chunk-GCQI6OKH.js.map +1 -0
  15. package/dist/chunk-ISAFEOR2.js +214 -0
  16. package/dist/chunk-ISAFEOR2.js.map +1 -0
  17. package/dist/chunk-MYDKIJRH.js +81 -0
  18. package/dist/chunk-MYDKIJRH.js.map +1 -0
  19. package/dist/chunk-OGWYTYYS.js +72 -0
  20. package/dist/chunk-OGWYTYYS.js.map +1 -0
  21. package/dist/chunk-PXZ737N3.js +439 -0
  22. package/dist/chunk-PXZ737N3.js.map +1 -0
  23. package/dist/chunk-QOEEUTHQ.js +110 -0
  24. package/dist/chunk-QOEEUTHQ.js.map +1 -0
  25. package/dist/chunk-U5677AEA.js +1690 -0
  26. package/dist/chunk-U5677AEA.js.map +1 -0
  27. package/dist/chunk-XMTWFJCZ.js +138 -0
  28. package/dist/chunk-XMTWFJCZ.js.map +1 -0
  29. package/dist/client-D9YYA2w6.d.ts +159 -0
  30. package/dist/customer-account-api-types.d.ts +144 -0
  31. package/dist/customer-account-api-types.js +3 -0
  32. package/dist/customer-account-api-types.js.map +1 -0
  33. package/dist/editor.d.ts +112 -0
  34. package/dist/editor.js +3 -0
  35. package/dist/editor.js.map +1 -0
  36. package/dist/image.d.ts +89 -0
  37. package/dist/image.js +3 -0
  38. package/dist/image.js.map +1 -0
  39. package/dist/index.d.ts +183 -0
  40. package/dist/index.js +208 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/pagination-CPgH3fAa.d.ts +77 -0
  43. package/dist/product.d.ts +105 -0
  44. package/dist/product.js +4 -0
  45. package/dist/product.js.map +1 -0
  46. package/dist/react-router.d.ts +29 -0
  47. package/dist/react-router.js +33 -0
  48. package/dist/react-router.js.map +1 -0
  49. package/dist/react.d.ts +299 -0
  50. package/dist/react.js +1813 -0
  51. package/dist/react.js.map +1 -0
  52. package/dist/routing-BfUp49o8.d.ts +302 -0
  53. package/dist/seo.d.ts +155 -0
  54. package/dist/seo.js +4 -0
  55. package/dist/seo.js.map +1 -0
  56. package/dist/settings.d.ts +87 -0
  57. package/dist/settings.js +3 -0
  58. package/dist/settings.js.map +1 -0
  59. package/dist/shop-DkQmro-Y.d.ts +202 -0
  60. package/dist/store-DQK1nhob.d.ts +67 -0
  61. package/dist/storefront-api-types.d.ts +312 -0
  62. package/dist/storefront-api-types.js +3 -0
  63. package/dist/storefront-api-types.js.map +1 -0
  64. package/dist/types-BDhHWZsP.d.ts +77 -0
  65. package/dist/types-Df3bGbKU.d.ts +167 -0
  66. package/package.json +82 -0
@@ -0,0 +1,439 @@
1
+ // src/editor/bridge.ts
2
+ var HOST_SOURCE = "kotao:workspaces-editor";
3
+ var PREVIEW_SOURCE = "kotao:storefront-preview";
4
+ function isReservedSectionId(sectionId) {
5
+ return sectionId.startsWith("theme:");
6
+ }
7
+ function isRecord(value) {
8
+ return typeof value === "object" && value !== null && !Array.isArray(value);
9
+ }
10
+ function isSettings(value) {
11
+ return isRecord(value);
12
+ }
13
+ function isOptionalSettings(value) {
14
+ return value === void 0 || isSettings(value);
15
+ }
16
+ function isBlockId(value) {
17
+ return typeof value === "string" && value.length > 0;
18
+ }
19
+ function isResolvedBlock(value) {
20
+ return isRecord(value) && (value.id === void 0 || isBlockId(value.id)) && typeof value.type === "string" && isSettings(value.settings);
21
+ }
22
+ function isResolvedSection(value) {
23
+ if (!isRecord(value)) return false;
24
+ return typeof value.id === "string" && typeof value.type === "string" && isSettings(value.settings) && Array.isArray(value.blocks) && value.blocks.every(isResolvedBlock);
25
+ }
26
+ function isValuesDocument(value) {
27
+ return isRecord(value) && typeof value.shopId === "string" && isResolvedSectionArray(value.sections);
28
+ }
29
+ function isSettingOption(value) {
30
+ return isRecord(value) && typeof value.value === "string" && typeof value.label === "string";
31
+ }
32
+ function isOptionalString(value) {
33
+ return value === void 0 || typeof value === "string";
34
+ }
35
+ function isOptionalFiniteNumber(value) {
36
+ return value === void 0 || typeof value === "number" && Number.isFinite(value);
37
+ }
38
+ function isSettingInput(value) {
39
+ if (!isRecord(value) || typeof value.type !== "string" || typeof value.name !== "string" || typeof value.label !== "string") {
40
+ return false;
41
+ }
42
+ return isOptionalString(value.placeholder) && isOptionalString(value.helpText) && isOptionalString(value.unit) && isOptionalFiniteNumber(value.min) && isOptionalFiniteNumber(value.max) && isOptionalFiniteNumber(value.step) && (value.options === void 0 || Array.isArray(value.options) && value.options.every(isSettingOption));
43
+ }
44
+ function isBlockSchema(value) {
45
+ return isRecord(value) && typeof value.type === "string" && typeof value.label === "string" && Array.isArray(value.settings) && value.settings.every(isSettingInput);
46
+ }
47
+ function isSectionPresetBlock(value) {
48
+ return isRecord(value) && typeof value.type === "string" && isOptionalSettings(value.settings);
49
+ }
50
+ function isSectionPreset(value) {
51
+ return isRecord(value) && typeof value.name === "string" && isOptionalSettings(value.settings) && (value.blocks === void 0 || Array.isArray(value.blocks) && value.blocks.every(isSectionPresetBlock));
52
+ }
53
+ function isSectionSchema(value) {
54
+ return isRecord(value) && typeof value.type === "string" && typeof value.label === "string" && Array.isArray(value.settings) && value.settings.every(isSettingInput) && (value.blocks === void 0 || Array.isArray(value.blocks) && value.blocks.every(isBlockSchema)) && (value.presets === void 0 || Array.isArray(value.presets) && value.presets.every(isSectionPreset));
55
+ }
56
+ function isResolvedSectionArray(value) {
57
+ return Array.isArray(value) && value.every(isResolvedSection);
58
+ }
59
+ function isSectionSchemaRecord(value) {
60
+ return isRecord(value) && Object.values(value).every(isSectionSchema);
61
+ }
62
+ function isSettingInputArray(value) {
63
+ return Array.isArray(value) && value.every(isSettingInput);
64
+ }
65
+ function isValuesDocumentRecord(value) {
66
+ return isRecord(value) && Object.values(value).every(isValuesDocument);
67
+ }
68
+ function parseHostMessage(data, shopId) {
69
+ if (!isRecord(data) || data.source !== HOST_SOURCE || data.shopId !== shopId) return null;
70
+ switch (data.type) {
71
+ case "settings.patchSection":
72
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) && isSettings(data.settings) ? {
73
+ source: HOST_SOURCE,
74
+ type: "settings.patchSection",
75
+ shopId,
76
+ sectionId: data.sectionId,
77
+ settings: data.settings
78
+ } : null;
79
+ case "settings.patchGlobal":
80
+ return isSettings(data.settings) ? { source: HOST_SOURCE, type: "settings.patchGlobal", shopId, settings: data.settings } : null;
81
+ case "sections.insert":
82
+ return isResolvedSection(data.section) && !isReservedSectionId(data.section.id) ? {
83
+ source: HOST_SOURCE,
84
+ type: "sections.insert",
85
+ shopId,
86
+ section: data.section,
87
+ ...typeof data.index === "number" ? { index: data.index } : {}
88
+ } : null;
89
+ case "sections.remove":
90
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) ? {
91
+ source: HOST_SOURCE,
92
+ type: "sections.remove",
93
+ shopId,
94
+ sectionId: data.sectionId
95
+ } : null;
96
+ case "sections.reorder":
97
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) && typeof data.index === "number" ? {
98
+ source: HOST_SOURCE,
99
+ type: "sections.reorder",
100
+ shopId,
101
+ sectionId: data.sectionId,
102
+ index: data.index
103
+ } : null;
104
+ case "settings.patchBlock":
105
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) && isBlockId(data.blockId) && isSettings(data.settings) ? {
106
+ source: HOST_SOURCE,
107
+ type: "settings.patchBlock",
108
+ shopId,
109
+ sectionId: data.sectionId,
110
+ blockId: data.blockId,
111
+ settings: data.settings
112
+ } : null;
113
+ case "blocks.insert":
114
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) && isResolvedBlock(data.block) ? {
115
+ source: HOST_SOURCE,
116
+ type: "blocks.insert",
117
+ shopId,
118
+ sectionId: data.sectionId,
119
+ block: data.block,
120
+ ...typeof data.index === "number" ? { index: data.index } : {}
121
+ } : null;
122
+ case "blocks.remove":
123
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) && isBlockId(data.blockId) ? {
124
+ source: HOST_SOURCE,
125
+ type: "blocks.remove",
126
+ shopId,
127
+ sectionId: data.sectionId,
128
+ blockId: data.blockId
129
+ } : null;
130
+ case "blocks.reorder":
131
+ return typeof data.sectionId === "string" && !isReservedSectionId(data.sectionId) && isBlockId(data.blockId) && typeof data.index === "number" ? {
132
+ source: HOST_SOURCE,
133
+ type: "blocks.reorder",
134
+ shopId,
135
+ sectionId: data.sectionId,
136
+ blockId: data.blockId,
137
+ index: data.index
138
+ } : null;
139
+ case "template.replace":
140
+ return typeof data.handle === "string" && isValuesDocument(data.document) ? {
141
+ source: HOST_SOURCE,
142
+ type: "template.replace",
143
+ shopId,
144
+ handle: data.handle,
145
+ document: data.document
146
+ } : null;
147
+ case "sectionGroup.replace":
148
+ return typeof data.handle === "string" && data.handle.trim() !== "" && isValuesDocument(data.document) ? {
149
+ source: HOST_SOURCE,
150
+ type: "sectionGroup.replace",
151
+ shopId,
152
+ handle: data.handle,
153
+ document: data.document
154
+ } : null;
155
+ default:
156
+ return null;
157
+ }
158
+ }
159
+ function parsePreviewSelection(data, shopId) {
160
+ if (!isRecord(data) || data.source !== PREVIEW_SOURCE || data.shopId !== shopId) return null;
161
+ if (data.type !== "section.select" || typeof data.sectionId !== "string") return null;
162
+ if (data.section !== void 0 && !isResolvedSection(data.section)) return null;
163
+ if (data.sections !== void 0 && !isResolvedSectionArray(data.sections)) return null;
164
+ if (data.schema !== void 0 && !isSectionSchema(data.schema)) return null;
165
+ if (data.schemas !== void 0 && !isSectionSchemaRecord(data.schemas)) return null;
166
+ return {
167
+ source: PREVIEW_SOURCE,
168
+ type: "section.select",
169
+ shopId,
170
+ sectionId: data.sectionId,
171
+ ...data.section !== void 0 ? { section: data.section } : {},
172
+ ...data.sections !== void 0 ? { sections: data.sections } : {},
173
+ ...data.schema !== void 0 ? { schema: data.schema } : {},
174
+ ...data.schemas !== void 0 ? { schemas: data.schemas } : {}
175
+ };
176
+ }
177
+ function parsePreviewReady(data, shopId) {
178
+ if (!isRecord(data) || data.source !== PREVIEW_SOURCE || data.shopId !== shopId) return null;
179
+ if (data.type !== "editor.ready" || !isResolvedSectionArray(data.sections)) return null;
180
+ if (data.schemas !== void 0 && !isSectionSchemaRecord(data.schemas)) return null;
181
+ if (data.globalInputs !== void 0 && !isSettingInputArray(data.globalInputs)) return null;
182
+ if (data.templates !== void 0 && !isValuesDocumentRecord(data.templates)) return null;
183
+ if (data.sectionGroups !== void 0 && !isValuesDocumentRecord(data.sectionGroups)) return null;
184
+ return {
185
+ source: PREVIEW_SOURCE,
186
+ type: "editor.ready",
187
+ shopId,
188
+ sections: data.sections,
189
+ ...data.schemas !== void 0 ? { schemas: data.schemas } : {},
190
+ ...data.globalInputs !== void 0 ? { globalInputs: data.globalInputs } : {},
191
+ ...data.templates !== void 0 ? { templates: data.templates } : {},
192
+ ...data.sectionGroups !== void 0 ? { sectionGroups: data.sectionGroups } : {}
193
+ };
194
+ }
195
+ function postHostMessage(target, previewOrigin, message) {
196
+ target.postMessage(message, previewOrigin);
197
+ }
198
+ function createStorefrontEditorBridge({
199
+ adminOrigin,
200
+ globalInputs,
201
+ schemas,
202
+ sectionGroups,
203
+ shopId,
204
+ store,
205
+ target,
206
+ templates,
207
+ transport
208
+ }) {
209
+ const onMessage = (event) => {
210
+ if (event.origin !== adminOrigin) return;
211
+ if (event.source !== void 0 && event.source !== null && event.source !== target) return;
212
+ const message = parseHostMessage(event.data, shopId);
213
+ if (message === null) return;
214
+ switch (message.type) {
215
+ case "settings.patchSection":
216
+ store.patchSection(message.sectionId, message.settings);
217
+ break;
218
+ case "settings.patchGlobal":
219
+ store.patchGlobal(message.settings);
220
+ break;
221
+ case "sections.insert":
222
+ store.insertSection(message.section, message.index);
223
+ break;
224
+ case "sections.remove":
225
+ store.removeSection(message.sectionId);
226
+ break;
227
+ case "sections.reorder":
228
+ store.moveSection(message.sectionId, message.index);
229
+ break;
230
+ case "settings.patchBlock":
231
+ store.patchBlock(message.sectionId, message.blockId, message.settings);
232
+ break;
233
+ case "blocks.insert":
234
+ store.insertBlock(message.sectionId, message.block, message.index);
235
+ break;
236
+ case "blocks.remove":
237
+ store.removeBlock(message.sectionId, message.blockId);
238
+ break;
239
+ case "blocks.reorder":
240
+ store.moveBlock(message.sectionId, message.blockId, message.index);
241
+ break;
242
+ case "template.replace":
243
+ store.replaceSections(message.document.sections);
244
+ break;
245
+ case "sectionGroup.replace":
246
+ store.replaceSectionGroup(message.handle, message.document);
247
+ break;
248
+ }
249
+ };
250
+ transport.addEventListener("message", onMessage);
251
+ return {
252
+ ready: () => {
253
+ const snapshot = store.getSnapshot();
254
+ const message = {
255
+ source: PREVIEW_SOURCE,
256
+ type: "editor.ready",
257
+ shopId,
258
+ sections: snapshot.sections,
259
+ ...schemas !== void 0 ? { schemas } : {},
260
+ ...globalInputs !== void 0 ? { globalInputs } : {},
261
+ ...templates !== void 0 ? { templates } : {},
262
+ ...sectionGroups !== void 0 ? { sectionGroups } : {}
263
+ };
264
+ target.postMessage(message, adminOrigin);
265
+ },
266
+ selectSection: (sectionId) => {
267
+ if (isReservedSectionId(sectionId)) return;
268
+ const snapshot = store.getSnapshot();
269
+ const section = snapshot.sections.find((candidate) => candidate.id === sectionId);
270
+ const schema = section !== void 0 ? schemas?.[section.type] : void 0;
271
+ const message = {
272
+ source: PREVIEW_SOURCE,
273
+ type: "section.select",
274
+ shopId,
275
+ sectionId,
276
+ ...section !== void 0 ? { section } : {},
277
+ sections: snapshot.sections,
278
+ ...schema !== void 0 ? { schema } : {},
279
+ ...schemas !== void 0 ? { schemas } : {}
280
+ };
281
+ target.postMessage(message, adminOrigin);
282
+ },
283
+ dispose: () => {
284
+ transport.removeEventListener("message", onMessage);
285
+ }
286
+ };
287
+ }
288
+ function createStorefrontEditorHostBridge({
289
+ onReady,
290
+ onSelectSection,
291
+ previewOrigin,
292
+ shopId,
293
+ target,
294
+ transport
295
+ }) {
296
+ const onMessage = (event) => {
297
+ if (event.origin !== previewOrigin) return;
298
+ if (event.source !== void 0 && event.source !== null && event.source !== target) return;
299
+ const ready = parsePreviewReady(event.data, shopId);
300
+ if (ready !== null) {
301
+ onReady?.({
302
+ sections: ready.sections,
303
+ ...ready.schemas !== void 0 ? { schemas: ready.schemas } : {},
304
+ ...ready.globalInputs !== void 0 ? { globalInputs: ready.globalInputs } : {},
305
+ ...ready.templates !== void 0 ? { templates: ready.templates } : {},
306
+ ...ready.sectionGroups !== void 0 ? { sectionGroups: ready.sectionGroups } : {}
307
+ });
308
+ return;
309
+ }
310
+ const message = parsePreviewSelection(event.data, shopId);
311
+ if (message === null || isReservedSectionId(message.sectionId)) return;
312
+ onSelectSection({
313
+ sectionId: message.sectionId,
314
+ ...message.section !== void 0 ? { section: message.section } : {},
315
+ ...message.sections !== void 0 ? { sections: message.sections } : {},
316
+ ...message.schema !== void 0 ? { schema: message.schema } : {},
317
+ ...message.schemas !== void 0 ? { schemas: message.schemas } : {}
318
+ });
319
+ };
320
+ transport.addEventListener("message", onMessage);
321
+ return {
322
+ patchSection: (sectionId, settings) => {
323
+ if (isReservedSectionId(sectionId)) return;
324
+ postHostMessage(target, previewOrigin, {
325
+ source: HOST_SOURCE,
326
+ type: "settings.patchSection",
327
+ shopId,
328
+ sectionId,
329
+ settings
330
+ });
331
+ },
332
+ patchGlobal: (settings) => {
333
+ postHostMessage(target, previewOrigin, {
334
+ source: HOST_SOURCE,
335
+ type: "settings.patchGlobal",
336
+ shopId,
337
+ settings
338
+ });
339
+ },
340
+ insertSection: (section, index) => {
341
+ if (isReservedSectionId(section.id)) return;
342
+ postHostMessage(target, previewOrigin, {
343
+ source: HOST_SOURCE,
344
+ type: "sections.insert",
345
+ shopId,
346
+ section,
347
+ ...index !== void 0 ? { index } : {}
348
+ });
349
+ },
350
+ removeSection: (sectionId) => {
351
+ if (isReservedSectionId(sectionId)) return;
352
+ postHostMessage(target, previewOrigin, {
353
+ source: HOST_SOURCE,
354
+ type: "sections.remove",
355
+ shopId,
356
+ sectionId
357
+ });
358
+ },
359
+ reorderSection: (sectionId, index) => {
360
+ if (isReservedSectionId(sectionId)) return;
361
+ postHostMessage(target, previewOrigin, {
362
+ source: HOST_SOURCE,
363
+ type: "sections.reorder",
364
+ shopId,
365
+ sectionId,
366
+ index
367
+ });
368
+ },
369
+ patchBlock: (sectionId, blockId, settings) => {
370
+ if (isReservedSectionId(sectionId)) return;
371
+ postHostMessage(target, previewOrigin, {
372
+ source: HOST_SOURCE,
373
+ type: "settings.patchBlock",
374
+ shopId,
375
+ sectionId,
376
+ blockId,
377
+ settings
378
+ });
379
+ },
380
+ insertBlock: (sectionId, block, index) => {
381
+ if (isReservedSectionId(sectionId)) return;
382
+ postHostMessage(target, previewOrigin, {
383
+ source: HOST_SOURCE,
384
+ type: "blocks.insert",
385
+ shopId,
386
+ sectionId,
387
+ block,
388
+ ...index !== void 0 ? { index } : {}
389
+ });
390
+ },
391
+ removeBlock: (sectionId, blockId) => {
392
+ if (isReservedSectionId(sectionId)) return;
393
+ postHostMessage(target, previewOrigin, {
394
+ source: HOST_SOURCE,
395
+ type: "blocks.remove",
396
+ shopId,
397
+ sectionId,
398
+ blockId
399
+ });
400
+ },
401
+ reorderBlock: (sectionId, blockId, index) => {
402
+ if (isReservedSectionId(sectionId)) return;
403
+ postHostMessage(target, previewOrigin, {
404
+ source: HOST_SOURCE,
405
+ type: "blocks.reorder",
406
+ shopId,
407
+ sectionId,
408
+ blockId,
409
+ index
410
+ });
411
+ },
412
+ replaceTemplate: (handle, document) => {
413
+ postHostMessage(target, previewOrigin, {
414
+ source: HOST_SOURCE,
415
+ type: "template.replace",
416
+ shopId,
417
+ handle,
418
+ document
419
+ });
420
+ },
421
+ replaceSectionGroup: (handle, document) => {
422
+ if (handle.trim() === "") return;
423
+ postHostMessage(target, previewOrigin, {
424
+ source: HOST_SOURCE,
425
+ type: "sectionGroup.replace",
426
+ shopId,
427
+ handle,
428
+ document
429
+ });
430
+ },
431
+ dispose: () => {
432
+ transport.removeEventListener("message", onMessage);
433
+ }
434
+ };
435
+ }
436
+
437
+ export { createStorefrontEditorBridge, createStorefrontEditorHostBridge };
438
+ //# sourceMappingURL=chunk-PXZ737N3.js.map
439
+ //# sourceMappingURL=chunk-PXZ737N3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/bridge.ts"],"names":[],"mappings":"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","file":"chunk-PXZ737N3.js","sourcesContent":["import type { ThemeSettingsStore } from '../settings/store'\nimport type { ResolvedBlock, ResolvedSection, ResolvedSettings } from '../settings/types'\n\nconst HOST_SOURCE = 'kotao:workspaces-editor'\nconst PREVIEW_SOURCE = 'kotao:storefront-preview'\n\nexport interface StorefrontEditorMessageTarget {\n postMessage(message: unknown, targetOrigin: string): void\n}\n\nexport interface StorefrontEditorMessageEvent {\n readonly origin: string\n readonly data: unknown\n readonly source?: StorefrontEditorMessageTarget | null\n}\n\nexport interface StorefrontEditorMessageSource {\n addEventListener(type: 'message', listener: (event: StorefrontEditorMessageEvent) => void): void\n removeEventListener(\n type: 'message',\n listener: (event: StorefrontEditorMessageEvent) => void,\n ): void\n}\n\nexport interface StorefrontEditorBridge {\n ready(): void\n selectSection(sectionId: string): void\n dispose(): void\n}\n\nexport interface StorefrontEditorSettingOption {\n readonly value: string\n readonly label: string\n}\n\nexport interface StorefrontEditorSettingInput {\n readonly type: string\n readonly name: string\n readonly label: string\n readonly defaultValue?: unknown\n readonly placeholder?: string\n readonly helpText?: string\n readonly options?: readonly StorefrontEditorSettingOption[]\n readonly min?: number\n readonly max?: number\n readonly step?: number\n readonly unit?: string\n}\n\nexport interface StorefrontEditorBlockSchema {\n readonly type: string\n readonly label: string\n readonly settings: readonly StorefrontEditorSettingInput[]\n}\n\nexport interface StorefrontEditorSectionPresetBlock {\n readonly type: string\n readonly settings?: ResolvedSettings\n}\n\nexport interface StorefrontEditorSectionPreset {\n readonly name: string\n readonly settings?: ResolvedSettings\n readonly blocks?: readonly StorefrontEditorSectionPresetBlock[]\n}\n\nexport interface StorefrontEditorSectionSchema {\n readonly type: string\n readonly label: string\n readonly settings: readonly StorefrontEditorSettingInput[]\n readonly blocks?: readonly StorefrontEditorBlockSchema[]\n readonly presets?: readonly StorefrontEditorSectionPreset[]\n}\n\nexport interface StorefrontEditorSelection {\n readonly sectionId: string\n readonly section?: ResolvedSection\n readonly sections?: readonly ResolvedSection[]\n readonly schema?: StorefrontEditorSectionSchema\n readonly schemas?: Readonly<Record<string, StorefrontEditorSectionSchema>>\n}\n\nexport interface StorefrontEditorValuesDocument {\n readonly shopId: string\n readonly sections: readonly ResolvedSection[]\n}\n\nexport interface StorefrontEditorReady {\n readonly sections: readonly ResolvedSection[]\n readonly schemas?: Readonly<Record<string, StorefrontEditorSectionSchema>>\n readonly globalInputs?: readonly StorefrontEditorSettingInput[]\n readonly templates?: Readonly<Record<string, StorefrontEditorValuesDocument>>\n readonly sectionGroups?: Readonly<Record<string, StorefrontEditorValuesDocument>>\n}\n\nexport interface StorefrontEditorHostBridge {\n patchSection(sectionId: string, settings: ResolvedSettings): void\n patchGlobal(settings: ResolvedSettings): void\n insertSection(section: ResolvedSection, index?: number): void\n removeSection(sectionId: string): void\n reorderSection(sectionId: string, index: number): void\n patchBlock(sectionId: string, blockId: string, settings: ResolvedSettings): void\n insertBlock(sectionId: string, block: ResolvedBlock, index?: number): void\n removeBlock(sectionId: string, blockId: string): void\n reorderBlock(sectionId: string, blockId: string, index: number): void\n replaceTemplate(handle: string, document: StorefrontEditorValuesDocument): void\n replaceSectionGroup(handle: string, document: StorefrontEditorValuesDocument): void\n dispose(): void\n}\n\nexport interface CreateStorefrontEditorBridgeArgs {\n readonly adminOrigin: string\n readonly shopId: string\n readonly store: ThemeSettingsStore\n readonly schemas?: Readonly<Record<string, StorefrontEditorSectionSchema>>\n readonly globalInputs?: readonly StorefrontEditorSettingInput[]\n readonly templates?: Readonly<Record<string, StorefrontEditorValuesDocument>>\n readonly sectionGroups?: Readonly<Record<string, StorefrontEditorValuesDocument>>\n readonly transport: StorefrontEditorMessageSource\n readonly target: StorefrontEditorMessageTarget\n}\n\nexport interface CreateStorefrontEditorHostBridgeArgs {\n readonly onSelectSection: (selection: StorefrontEditorSelection) => void\n readonly onReady?: (ready: StorefrontEditorReady) => void\n readonly previewOrigin: string\n readonly shopId: string\n readonly transport: StorefrontEditorMessageSource\n readonly target: StorefrontEditorMessageTarget\n}\n\ntype HostMessage =\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'settings.patchSection'\n readonly shopId: string\n readonly sectionId: string\n readonly settings: ResolvedSettings\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'settings.patchGlobal'\n readonly shopId: string\n readonly settings: ResolvedSettings\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'sections.insert'\n readonly shopId: string\n readonly section: ResolvedSection\n readonly index?: number\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'sections.remove'\n readonly shopId: string\n readonly sectionId: string\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'sections.reorder'\n readonly shopId: string\n readonly sectionId: string\n readonly index: number\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'settings.patchBlock'\n readonly shopId: string\n readonly sectionId: string\n readonly blockId: string\n readonly settings: ResolvedSettings\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'blocks.insert'\n readonly shopId: string\n readonly sectionId: string\n readonly block: ResolvedBlock\n readonly index?: number\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'blocks.remove'\n readonly shopId: string\n readonly sectionId: string\n readonly blockId: string\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'blocks.reorder'\n readonly shopId: string\n readonly sectionId: string\n readonly blockId: string\n readonly index: number\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'template.replace'\n readonly shopId: string\n readonly handle: string\n readonly document: StorefrontEditorValuesDocument\n }\n | {\n readonly source: typeof HOST_SOURCE\n readonly type: 'sectionGroup.replace'\n readonly shopId: string\n readonly handle: string\n readonly document: StorefrontEditorValuesDocument\n }\n\ninterface PreviewSelectionMessage {\n readonly source: typeof PREVIEW_SOURCE\n readonly type: 'section.select'\n readonly shopId: string\n readonly sectionId: string\n readonly section?: ResolvedSection\n readonly sections?: readonly ResolvedSection[]\n readonly schema?: StorefrontEditorSectionSchema\n readonly schemas?: Readonly<Record<string, StorefrontEditorSectionSchema>>\n}\n\ninterface PreviewReadyMessage extends StorefrontEditorReady {\n readonly source: typeof PREVIEW_SOURCE\n readonly type: 'editor.ready'\n readonly shopId: string\n}\n\nfunction isReservedSectionId(sectionId: string): boolean {\n return sectionId.startsWith('theme:')\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isSettings(value: unknown): value is ResolvedSettings {\n return isRecord(value)\n}\n\nfunction isOptionalSettings(value: unknown): value is ResolvedSettings | undefined {\n return value === undefined || isSettings(value)\n}\n\nfunction isBlockId(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0\n}\n\nfunction isResolvedBlock(value: unknown): value is ResolvedBlock {\n return (\n isRecord(value) &&\n (value.id === undefined || isBlockId(value.id)) &&\n typeof value.type === 'string' &&\n isSettings(value.settings)\n )\n}\n\nfunction isResolvedSection(value: unknown): value is ResolvedSection {\n if (!isRecord(value)) return false\n return (\n typeof value.id === 'string' &&\n typeof value.type === 'string' &&\n isSettings(value.settings) &&\n Array.isArray(value.blocks) &&\n value.blocks.every(isResolvedBlock)\n )\n}\n\nfunction isValuesDocument(value: unknown): value is StorefrontEditorValuesDocument {\n return (\n isRecord(value) && typeof value.shopId === 'string' && isResolvedSectionArray(value.sections)\n )\n}\n\nfunction isSettingOption(value: unknown): value is StorefrontEditorSettingOption {\n return isRecord(value) && typeof value.value === 'string' && typeof value.label === 'string'\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === 'string'\n}\n\nfunction isOptionalFiniteNumber(value: unknown): value is number | undefined {\n return value === undefined || (typeof value === 'number' && Number.isFinite(value))\n}\n\nfunction isSettingInput(value: unknown): value is StorefrontEditorSettingInput {\n if (\n !isRecord(value) ||\n typeof value.type !== 'string' ||\n typeof value.name !== 'string' ||\n typeof value.label !== 'string'\n ) {\n return false\n }\n\n return (\n isOptionalString(value.placeholder) &&\n isOptionalString(value.helpText) &&\n isOptionalString(value.unit) &&\n isOptionalFiniteNumber(value.min) &&\n isOptionalFiniteNumber(value.max) &&\n isOptionalFiniteNumber(value.step) &&\n (value.options === undefined ||\n (Array.isArray(value.options) && value.options.every(isSettingOption)))\n )\n}\n\nfunction isBlockSchema(value: unknown): value is StorefrontEditorBlockSchema {\n return (\n isRecord(value) &&\n typeof value.type === 'string' &&\n typeof value.label === 'string' &&\n Array.isArray(value.settings) &&\n value.settings.every(isSettingInput)\n )\n}\n\nfunction isSectionPresetBlock(value: unknown): value is StorefrontEditorSectionPresetBlock {\n return isRecord(value) && typeof value.type === 'string' && isOptionalSettings(value.settings)\n}\n\nfunction isSectionPreset(value: unknown): value is StorefrontEditorSectionPreset {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n isOptionalSettings(value.settings) &&\n (value.blocks === undefined ||\n (Array.isArray(value.blocks) && value.blocks.every(isSectionPresetBlock)))\n )\n}\n\nfunction isSectionSchema(value: unknown): value is StorefrontEditorSectionSchema {\n return (\n isRecord(value) &&\n typeof value.type === 'string' &&\n typeof value.label === 'string' &&\n Array.isArray(value.settings) &&\n value.settings.every(isSettingInput) &&\n (value.blocks === undefined ||\n (Array.isArray(value.blocks) && value.blocks.every(isBlockSchema))) &&\n (value.presets === undefined ||\n (Array.isArray(value.presets) && value.presets.every(isSectionPreset)))\n )\n}\n\nfunction isResolvedSectionArray(value: unknown): value is readonly ResolvedSection[] {\n return Array.isArray(value) && value.every(isResolvedSection)\n}\n\nfunction isSectionSchemaRecord(\n value: unknown,\n): value is Readonly<Record<string, StorefrontEditorSectionSchema>> {\n return isRecord(value) && Object.values(value).every(isSectionSchema)\n}\n\nfunction isSettingInputArray(value: unknown): value is readonly StorefrontEditorSettingInput[] {\n return Array.isArray(value) && value.every(isSettingInput)\n}\n\nfunction isValuesDocumentRecord(\n value: unknown,\n): value is Readonly<Record<string, StorefrontEditorValuesDocument>> {\n return isRecord(value) && Object.values(value).every(isValuesDocument)\n}\n\nfunction parseHostMessage(data: unknown, shopId: string): HostMessage | null {\n if (!isRecord(data) || data.source !== HOST_SOURCE || data.shopId !== shopId) return null\n\n switch (data.type) {\n case 'settings.patchSection':\n return typeof data.sectionId === 'string' &&\n !isReservedSectionId(data.sectionId) &&\n isSettings(data.settings)\n ? {\n source: HOST_SOURCE,\n type: 'settings.patchSection',\n shopId,\n sectionId: data.sectionId,\n settings: data.settings,\n }\n : null\n case 'settings.patchGlobal':\n return isSettings(data.settings)\n ? { source: HOST_SOURCE, type: 'settings.patchGlobal', shopId, settings: data.settings }\n : null\n case 'sections.insert':\n return isResolvedSection(data.section) && !isReservedSectionId(data.section.id)\n ? {\n source: HOST_SOURCE,\n type: 'sections.insert',\n shopId,\n section: data.section,\n ...(typeof data.index === 'number' ? { index: data.index } : {}),\n }\n : null\n case 'sections.remove':\n return typeof data.sectionId === 'string' && !isReservedSectionId(data.sectionId)\n ? {\n source: HOST_SOURCE,\n type: 'sections.remove',\n shopId,\n sectionId: data.sectionId,\n }\n : null\n case 'sections.reorder':\n return typeof data.sectionId === 'string' &&\n !isReservedSectionId(data.sectionId) &&\n typeof data.index === 'number'\n ? {\n source: HOST_SOURCE,\n type: 'sections.reorder',\n shopId,\n sectionId: data.sectionId,\n index: data.index,\n }\n : null\n case 'settings.patchBlock':\n return typeof data.sectionId === 'string' &&\n !isReservedSectionId(data.sectionId) &&\n isBlockId(data.blockId) &&\n isSettings(data.settings)\n ? {\n source: HOST_SOURCE,\n type: 'settings.patchBlock',\n shopId,\n sectionId: data.sectionId,\n blockId: data.blockId,\n settings: data.settings,\n }\n : null\n case 'blocks.insert':\n return typeof data.sectionId === 'string' &&\n !isReservedSectionId(data.sectionId) &&\n isResolvedBlock(data.block)\n ? {\n source: HOST_SOURCE,\n type: 'blocks.insert',\n shopId,\n sectionId: data.sectionId,\n block: data.block,\n ...(typeof data.index === 'number' ? { index: data.index } : {}),\n }\n : null\n case 'blocks.remove':\n return typeof data.sectionId === 'string' &&\n !isReservedSectionId(data.sectionId) &&\n isBlockId(data.blockId)\n ? {\n source: HOST_SOURCE,\n type: 'blocks.remove',\n shopId,\n sectionId: data.sectionId,\n blockId: data.blockId,\n }\n : null\n case 'blocks.reorder':\n return typeof data.sectionId === 'string' &&\n !isReservedSectionId(data.sectionId) &&\n isBlockId(data.blockId) &&\n typeof data.index === 'number'\n ? {\n source: HOST_SOURCE,\n type: 'blocks.reorder',\n shopId,\n sectionId: data.sectionId,\n blockId: data.blockId,\n index: data.index,\n }\n : null\n case 'template.replace':\n return typeof data.handle === 'string' && isValuesDocument(data.document)\n ? {\n source: HOST_SOURCE,\n type: 'template.replace',\n shopId,\n handle: data.handle,\n document: data.document,\n }\n : null\n case 'sectionGroup.replace':\n return typeof data.handle === 'string' &&\n data.handle.trim() !== '' &&\n isValuesDocument(data.document)\n ? {\n source: HOST_SOURCE,\n type: 'sectionGroup.replace',\n shopId,\n handle: data.handle,\n document: data.document,\n }\n : null\n default:\n return null\n }\n}\n\nfunction parsePreviewSelection(data: unknown, shopId: string): PreviewSelectionMessage | null {\n if (!isRecord(data) || data.source !== PREVIEW_SOURCE || data.shopId !== shopId) return null\n if (data.type !== 'section.select' || typeof data.sectionId !== 'string') return null\n if (data.section !== undefined && !isResolvedSection(data.section)) return null\n if (data.sections !== undefined && !isResolvedSectionArray(data.sections)) return null\n if (data.schema !== undefined && !isSectionSchema(data.schema)) return null\n if (data.schemas !== undefined && !isSectionSchemaRecord(data.schemas)) return null\n return {\n source: PREVIEW_SOURCE,\n type: 'section.select',\n shopId,\n sectionId: data.sectionId,\n ...(data.section !== undefined ? { section: data.section } : {}),\n ...(data.sections !== undefined ? { sections: data.sections } : {}),\n ...(data.schema !== undefined ? { schema: data.schema } : {}),\n ...(data.schemas !== undefined ? { schemas: data.schemas } : {}),\n }\n}\n\nfunction parsePreviewReady(data: unknown, shopId: string): PreviewReadyMessage | null {\n if (!isRecord(data) || data.source !== PREVIEW_SOURCE || data.shopId !== shopId) return null\n if (data.type !== 'editor.ready' || !isResolvedSectionArray(data.sections)) return null\n if (data.schemas !== undefined && !isSectionSchemaRecord(data.schemas)) return null\n if (data.globalInputs !== undefined && !isSettingInputArray(data.globalInputs)) return null\n if (data.templates !== undefined && !isValuesDocumentRecord(data.templates)) return null\n if (data.sectionGroups !== undefined && !isValuesDocumentRecord(data.sectionGroups)) return null\n return {\n source: PREVIEW_SOURCE,\n type: 'editor.ready',\n shopId,\n sections: data.sections,\n ...(data.schemas !== undefined ? { schemas: data.schemas } : {}),\n ...(data.globalInputs !== undefined ? { globalInputs: data.globalInputs } : {}),\n ...(data.templates !== undefined ? { templates: data.templates } : {}),\n ...(data.sectionGroups !== undefined ? { sectionGroups: data.sectionGroups } : {}),\n }\n}\n\nfunction postHostMessage(\n target: StorefrontEditorMessageTarget,\n previewOrigin: string,\n message: HostMessage,\n): void {\n target.postMessage(message, previewOrigin)\n}\n\nexport function createStorefrontEditorBridge({\n adminOrigin,\n globalInputs,\n schemas,\n sectionGroups,\n shopId,\n store,\n target,\n templates,\n transport,\n}: CreateStorefrontEditorBridgeArgs): StorefrontEditorBridge {\n const onMessage = (event: StorefrontEditorMessageEvent): void => {\n if (event.origin !== adminOrigin) return\n if (event.source !== undefined && event.source !== null && event.source !== target) return\n const message = parseHostMessage(event.data, shopId)\n if (message === null) return\n\n switch (message.type) {\n case 'settings.patchSection':\n store.patchSection(message.sectionId, message.settings)\n break\n case 'settings.patchGlobal':\n store.patchGlobal(message.settings)\n break\n case 'sections.insert':\n store.insertSection(message.section, message.index)\n break\n case 'sections.remove':\n store.removeSection(message.sectionId)\n break\n case 'sections.reorder':\n store.moveSection(message.sectionId, message.index)\n break\n case 'settings.patchBlock':\n store.patchBlock(message.sectionId, message.blockId, message.settings)\n break\n case 'blocks.insert':\n store.insertBlock(message.sectionId, message.block, message.index)\n break\n case 'blocks.remove':\n store.removeBlock(message.sectionId, message.blockId)\n break\n case 'blocks.reorder':\n store.moveBlock(message.sectionId, message.blockId, message.index)\n break\n case 'template.replace':\n store.replaceSections(message.document.sections)\n break\n case 'sectionGroup.replace':\n store.replaceSectionGroup(message.handle, message.document)\n break\n }\n }\n\n transport.addEventListener('message', onMessage)\n\n return {\n ready: () => {\n const snapshot = store.getSnapshot()\n const message: PreviewReadyMessage = {\n source: PREVIEW_SOURCE,\n type: 'editor.ready',\n shopId,\n sections: snapshot.sections,\n ...(schemas !== undefined ? { schemas } : {}),\n ...(globalInputs !== undefined ? { globalInputs } : {}),\n ...(templates !== undefined ? { templates } : {}),\n ...(sectionGroups !== undefined ? { sectionGroups } : {}),\n }\n target.postMessage(message, adminOrigin)\n },\n selectSection: (sectionId) => {\n if (isReservedSectionId(sectionId)) return\n const snapshot = store.getSnapshot()\n const section = snapshot.sections.find((candidate) => candidate.id === sectionId)\n const schema = section !== undefined ? schemas?.[section.type] : undefined\n const message: PreviewSelectionMessage = {\n source: PREVIEW_SOURCE,\n type: 'section.select',\n shopId,\n sectionId,\n ...(section !== undefined ? { section } : {}),\n sections: snapshot.sections,\n ...(schema !== undefined ? { schema } : {}),\n ...(schemas !== undefined ? { schemas } : {}),\n }\n target.postMessage(message, adminOrigin)\n },\n dispose: () => {\n transport.removeEventListener('message', onMessage)\n },\n }\n}\n\nexport function createStorefrontEditorHostBridge({\n onReady,\n onSelectSection,\n previewOrigin,\n shopId,\n target,\n transport,\n}: CreateStorefrontEditorHostBridgeArgs): StorefrontEditorHostBridge {\n const onMessage = (event: StorefrontEditorMessageEvent): void => {\n if (event.origin !== previewOrigin) return\n if (event.source !== undefined && event.source !== null && event.source !== target) return\n const ready = parsePreviewReady(event.data, shopId)\n if (ready !== null) {\n onReady?.({\n sections: ready.sections,\n ...(ready.schemas !== undefined ? { schemas: ready.schemas } : {}),\n ...(ready.globalInputs !== undefined ? { globalInputs: ready.globalInputs } : {}),\n ...(ready.templates !== undefined ? { templates: ready.templates } : {}),\n ...(ready.sectionGroups !== undefined ? { sectionGroups: ready.sectionGroups } : {}),\n })\n return\n }\n const message = parsePreviewSelection(event.data, shopId)\n if (message === null || isReservedSectionId(message.sectionId)) return\n onSelectSection({\n sectionId: message.sectionId,\n ...(message.section !== undefined ? { section: message.section } : {}),\n ...(message.sections !== undefined ? { sections: message.sections } : {}),\n ...(message.schema !== undefined ? { schema: message.schema } : {}),\n ...(message.schemas !== undefined ? { schemas: message.schemas } : {}),\n })\n }\n\n transport.addEventListener('message', onMessage)\n\n return {\n patchSection: (sectionId, settings) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'settings.patchSection',\n shopId,\n sectionId,\n settings,\n })\n },\n patchGlobal: (settings) => {\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'settings.patchGlobal',\n shopId,\n settings,\n })\n },\n insertSection: (section, index) => {\n if (isReservedSectionId(section.id)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'sections.insert',\n shopId,\n section,\n ...(index !== undefined ? { index } : {}),\n })\n },\n removeSection: (sectionId) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'sections.remove',\n shopId,\n sectionId,\n })\n },\n reorderSection: (sectionId, index) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'sections.reorder',\n shopId,\n sectionId,\n index,\n })\n },\n patchBlock: (sectionId, blockId, settings) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'settings.patchBlock',\n shopId,\n sectionId,\n blockId,\n settings,\n })\n },\n insertBlock: (sectionId, block, index) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'blocks.insert',\n shopId,\n sectionId,\n block,\n ...(index !== undefined ? { index } : {}),\n })\n },\n removeBlock: (sectionId, blockId) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'blocks.remove',\n shopId,\n sectionId,\n blockId,\n })\n },\n reorderBlock: (sectionId, blockId, index) => {\n if (isReservedSectionId(sectionId)) return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'blocks.reorder',\n shopId,\n sectionId,\n blockId,\n index,\n })\n },\n replaceTemplate: (handle, document) => {\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'template.replace',\n shopId,\n handle,\n document,\n })\n },\n replaceSectionGroup: (handle, document) => {\n if (handle.trim() === '') return\n postHostMessage(target, previewOrigin, {\n source: HOST_SOURCE,\n type: 'sectionGroup.replace',\n shopId,\n handle,\n document,\n })\n },\n dispose: () => {\n transport.removeEventListener('message', onMessage)\n },\n }\n}\n"]}
@@ -0,0 +1,110 @@
1
+ import { flattenConnection } from './chunk-5QOFKGKD.js';
2
+
3
+ // src/product/options.ts
4
+ function mapSelectedProductOptionToObject(selectedOptions) {
5
+ const map = {};
6
+ for (const option of selectedOptions) map[option.name] = option.value;
7
+ return map;
8
+ }
9
+ function variantMatches(variant, selection) {
10
+ return Object.entries(selection).every(
11
+ (entry) => variant.selectedOptions.some((o) => o.name === entry[0] && o.value === entry[1])
12
+ );
13
+ }
14
+ function isVariantArray(variants) {
15
+ return Array.isArray(variants);
16
+ }
17
+ function productVariants(product) {
18
+ return isVariantArray(product.variants) ? product.variants : flattenConnection(product.variants);
19
+ }
20
+ function optionValueEntries(option) {
21
+ if (option.optionValues !== void 0) {
22
+ return option.optionValues.flatMap((value) => {
23
+ if (typeof value === "string") return [{ name: value }];
24
+ const name = value.name ?? value.value;
25
+ return name === void 0 ? [] : [{ name, swatch: value.swatch }];
26
+ });
27
+ }
28
+ return (option.values ?? []).map((value) => ({ name: value }));
29
+ }
30
+ function variantUriQuery(selection) {
31
+ const params = new URLSearchParams();
32
+ for (const [name, value] of Object.entries(selection)) params.set(name, value);
33
+ return params.toString();
34
+ }
35
+ function variantProductHandle(variant) {
36
+ if (variant == null || !("product" in variant)) return null;
37
+ const product = variant.product;
38
+ if (product == null || typeof product !== "object" || !("handle" in product)) return null;
39
+ return typeof product.handle === "string" ? product.handle : null;
40
+ }
41
+ function getSelectedVariant(variants, selected) {
42
+ const matches = variants.filter((v) => variantMatches(v, selected));
43
+ return matches.length === 1 ? matches[0] : null;
44
+ }
45
+ function getProductOptions(product, selected = mapSelectedProductOptionToObject(
46
+ product.selectedOrFirstAvailableVariant?.selectedOptions ?? []
47
+ )) {
48
+ const variants = productVariants(product);
49
+ return product.options.map((option) => {
50
+ const values = optionValueEntries(option).map((optionValue) => {
51
+ const candidate = { ...selected, [option.name]: optionValue.name };
52
+ const variant = variants.find((v) => variantMatches(v, candidate)) ?? null;
53
+ const handle = variantProductHandle(variant) ?? product.handle ?? "";
54
+ return {
55
+ name: optionValue.name,
56
+ value: optionValue.name,
57
+ selected: selected[option.name] === optionValue.name,
58
+ exists: variant != null,
59
+ available: variant != null && (variant.availableForSale ?? true),
60
+ variant,
61
+ handle,
62
+ isDifferentProduct: product.handle !== void 0 && handle !== "" && handle !== product.handle,
63
+ ...optionValue.swatch !== void 0 ? { swatch: optionValue.swatch } : {},
64
+ variantUriQuery: variantUriQuery(candidate)
65
+ };
66
+ });
67
+ return {
68
+ name: option.name,
69
+ optionValues: values,
70
+ values
71
+ };
72
+ });
73
+ }
74
+ var NON_OPTION_SEARCH_PARAMS = /* @__PURE__ */ new Set([
75
+ "cursor",
76
+ "direction",
77
+ "page",
78
+ "q",
79
+ "sellingPlan",
80
+ "selling_plan",
81
+ "sort",
82
+ "variant"
83
+ ]);
84
+ function searchParamsFrom(input) {
85
+ if (input instanceof URLSearchParams) return input;
86
+ if (input instanceof URL) return input.searchParams;
87
+ if (typeof input === "string") return new URL(input).searchParams;
88
+ return new URL(input.url).searchParams;
89
+ }
90
+ function getSelectedProductOptions(input) {
91
+ return [...searchParamsFrom(input).entries()].flatMap(
92
+ ([name, value]) => NON_OPTION_SEARCH_PARAMS.has(name) || value.length === 0 ? [] : [{ name, value }]
93
+ );
94
+ }
95
+ function getAdjacentAndFirstAvailableVariants(product) {
96
+ const variants = product.variants;
97
+ if (variants == null) return [];
98
+ return isVariantArray(variants) ? [...variants] : flattenConnection(variants);
99
+ }
100
+ function useOptimisticVariant(selectedVariant, variants = []) {
101
+ return selectedVariant ?? getAdjacentAndFirstAvailableVariants({ variants }).find(
102
+ (variant) => variant.availableForSale ?? true
103
+ ) ?? null;
104
+ }
105
+ function useSelectedOptionInUrlParam(_selectedOptions) {
106
+ }
107
+
108
+ export { getAdjacentAndFirstAvailableVariants, getProductOptions, getSelectedProductOptions, getSelectedVariant, mapSelectedProductOptionToObject, useOptimisticVariant, useSelectedOptionInUrlParam };
109
+ //# sourceMappingURL=chunk-QOEEUTHQ.js.map
110
+ //# sourceMappingURL=chunk-QOEEUTHQ.js.map