@rebuy/rebuy 2.27.0 → 2.28.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 (58) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1352 -366
  4. package/dist/index.js.map +4 -4
  5. package/dist/index.mjs +1351 -365
  6. package/dist/index.mjs.map +4 -4
  7. package/dist/schema/checkout-and-beyond/constants.js +1 -0
  8. package/dist/schema/checkout-and-beyond/constants.js.map +2 -2
  9. package/dist/schema/checkout-and-beyond/constants.mjs +1 -0
  10. package/dist/schema/checkout-and-beyond/constants.mjs.map +2 -2
  11. package/dist/schema/checkout-and-beyond/index.js +285 -92
  12. package/dist/schema/checkout-and-beyond/index.js.map +4 -4
  13. package/dist/schema/checkout-and-beyond/index.mjs +285 -92
  14. package/dist/schema/checkout-and-beyond/index.mjs.map +4 -4
  15. package/dist/schema/widget-data.js +165 -148
  16. package/dist/schema/widget-data.js.map +4 -4
  17. package/dist/schema/widget-data.mjs +165 -148
  18. package/dist/schema/widget-data.mjs.map +4 -4
  19. package/dist/schema/widgets/checkout-and-beyond/common.d.ts +2 -1
  20. package/dist/schema/widgets/checkout-and-beyond/common.d.ts.map +1 -1
  21. package/dist/schema/widgets/checkout-and-beyond/discount.d.ts +30 -0
  22. package/dist/schema/widgets/checkout-and-beyond/discount.d.ts.map +1 -0
  23. package/dist/schema/widgets/checkout-and-beyond/index.d.ts +2 -0
  24. package/dist/schema/widgets/checkout-and-beyond/index.d.ts.map +1 -1
  25. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts +178 -0
  26. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts.map +1 -0
  27. package/dist/schema/widgets/checkout-and-beyond/shared.d.ts +2 -1
  28. package/dist/schema/widgets/checkout-and-beyond/shared.d.ts.map +1 -1
  29. package/dist/schema/widgets/checkout-and-beyond/utils.d.ts +2 -0
  30. package/dist/schema/widgets/checkout-and-beyond/utils.d.ts.map +1 -1
  31. package/dist/server/dataSourceResults.d.ts +18 -0
  32. package/dist/server/dataSourceResults.d.ts.map +1 -0
  33. package/dist/server/index.d.ts +6 -2
  34. package/dist/server/index.d.ts.map +1 -1
  35. package/dist/server/index.js +1162 -435
  36. package/dist/server/index.js.map +4 -4
  37. package/dist/server/index.mjs +1161 -434
  38. package/dist/server/index.mjs.map +4 -4
  39. package/dist/server/userConfig.d.ts +8 -0
  40. package/dist/server/userConfig.d.ts.map +1 -0
  41. package/dist/server/widgetSettings.d.ts.map +1 -1
  42. package/dist/transforms/index.d.ts +4 -0
  43. package/dist/transforms/index.d.ts.map +1 -1
  44. package/dist/transforms/index.js +1004 -81
  45. package/dist/transforms/index.js.map +4 -4
  46. package/dist/transforms/index.mjs +1004 -81
  47. package/dist/transforms/index.mjs.map +4 -4
  48. package/dist/transforms/offerV1/buildOfferTemplate.d.ts +13 -0
  49. package/dist/transforms/offerV1/buildOfferTemplate.d.ts.map +1 -0
  50. package/dist/transforms/offerV1/convertOfferToV2.d.ts +18 -0
  51. package/dist/transforms/offerV1/convertOfferToV2.d.ts.map +1 -0
  52. package/dist/transforms/offerV1/offerCard.d.ts +17 -0
  53. package/dist/transforms/offerV1/offerCard.d.ts.map +1 -0
  54. package/dist/transforms/offerV1/offerTemplateSeed.d.ts +339 -0
  55. package/dist/transforms/offerV1/offerTemplateSeed.d.ts.map +1 -0
  56. package/dist/transforms/offerV1/types.d.ts +145 -0
  57. package/dist/transforms/offerV1/types.d.ts.map +1 -0
  58. package/package.json +1 -1
@@ -23,12 +23,127 @@ __export(server_exports, {
23
23
  NotFoundError: () => NotFoundError,
24
24
  REBUY_ENGINE_HOST: () => REBUY_ENGINE_HOST,
25
25
  UpstreamError: () => UpstreamError,
26
- convertWidgetSettings: () => convertWidgetSettings
26
+ buildEngineParams: () => buildEngineParams,
27
+ convertWidgetSettings: () => convertWidgetSettings,
28
+ fetchDataSourceResults: () => fetchDataSourceResults,
29
+ fetchUserConfig: () => fetchUserConfig
27
30
  });
28
31
  module.exports = __toCommonJS(server_exports);
29
32
 
30
- // src/schema/widgets/checkout-and-beyond/banner.ts
31
- var import_v418 = require("zod/v4");
33
+ // src/server/shared.ts
34
+ var REBUY_ENGINE_HOST = "rebuyengine.com";
35
+ var UpstreamError = class extends Error {
36
+ constructor(status, body, message) {
37
+ super(message ?? `Upstream returned ${status}`);
38
+ this.body = body;
39
+ this.name = "UpstreamError";
40
+ this.status = status;
41
+ }
42
+ };
43
+ var NotFoundError = class extends Error {
44
+ constructor(message) {
45
+ super(message);
46
+ this.name = "NotFoundError";
47
+ }
48
+ };
49
+
50
+ // src/schema/userConfig.ts
51
+ var import_v42 = require("zod/v4");
52
+
53
+ // src/schema/shopConfig.ts
54
+ var import_v4 = require("zod/v4");
55
+ var ShopConfig = import_v4.z.object({
56
+ activeExperiments: import_v4.z.array(
57
+ import_v4.z.object({
58
+ data: import_v4.z.array(
59
+ import_v4.z.object({
60
+ aliasName: import_v4.z.string(),
61
+ cssInput: import_v4.z.string().nullish(),
62
+ elementId: import_v4.z.coerce.number(),
63
+ id: import_v4.z.coerce.number(),
64
+ javascriptInput: import_v4.z.string().nullish(),
65
+ traffic: import_v4.z.coerce.number()
66
+ })
67
+ ),
68
+ id: import_v4.z.coerce.number(),
69
+ name: import_v4.z.string(),
70
+ pageTarget: import_v4.z.string().nullable(),
71
+ pageTargetUrl: import_v4.z.string().nullable(),
72
+ placeholderId: import_v4.z.coerce.number().nullable(),
73
+ type: import_v4.z.string()
74
+ })
75
+ ),
76
+ activePackages: import_v4.z.array(
77
+ import_v4.z.object({
78
+ cancelledAt: import_v4.z.string().nullable(),
79
+ id: import_v4.z.number(),
80
+ installedAt: import_v4.z.string().nullable(),
81
+ isActive: import_v4.z.boolean(),
82
+ isBillable: import_v4.z.boolean(),
83
+ packageId: import_v4.z.number(),
84
+ packageName: import_v4.z.string(),
85
+ shortName: import_v4.z.string(),
86
+ trialDays: import_v4.z.number(),
87
+ uninstalledAt: import_v4.z.string().nullable()
88
+ })
89
+ ),
90
+ apiKey: import_v4.z.string(),
91
+ billingVersion: import_v4.z.string().nullable(),
92
+ cacheKey: import_v4.z.coerce.number(),
93
+ carousel: import_v4.z.enum(["flickity", "splide"]),
94
+ currency: import_v4.z.string(),
95
+ currencySymbol: import_v4.z.string(),
96
+ domain: import_v4.z.string(),
97
+ enabledJquery: import_v4.z.boolean(),
98
+ enabledPresentmentCurrencies: import_v4.z.array(import_v4.z.string()),
99
+ hasSmartCollectionsEnabled: import_v4.z.boolean(),
100
+ hasSmartSearchEnabled: import_v4.z.boolean(),
101
+ id: import_v4.z.coerce.number(),
102
+ integrations: import_v4.z.record(
103
+ import_v4.z.enum([
104
+ "attentive",
105
+ "judgeme",
106
+ "junip",
107
+ "klaviyo",
108
+ "loox",
109
+ "okendo",
110
+ "opinew",
111
+ "recharge",
112
+ "reviewsio",
113
+ "stamped",
114
+ "yotpo"
115
+ ]),
116
+ import_v4.z.union([import_v4.z.boolean(), import_v4.z.unknown()])
117
+ ),
118
+ markets: import_v4.z.object({
119
+ enabled: import_v4.z.boolean()
120
+ }),
121
+ monetize: import_v4.z.object({
122
+ publisherKey: import_v4.z.string().nullable()
123
+ }).nullish(),
124
+ moneyFormat: import_v4.z.string(),
125
+ myshopifyDomain: import_v4.z.string(),
126
+ primaryLocale: import_v4.z.string(),
127
+ productGroupsEnabled: import_v4.z.enum(["no", "yes"]).transform((value) => value === "yes"),
128
+ rechargeCustomDomain: import_v4.z.string().nullable(),
129
+ sellingPlansEnabled: import_v4.z.boolean(),
130
+ shopId: import_v4.z.number(),
131
+ shopifySellingPlansEnabled: import_v4.z.boolean(),
132
+ shopName: import_v4.z.string(),
133
+ storefrontAccessToken: import_v4.z.string().nullable(),
134
+ useRebuyIcons: import_v4.z.boolean()
135
+ });
136
+
137
+ // src/schema/userConfig.ts
138
+ var UserConfig = import_v42.z.object({
139
+ shop: ShopConfig,
140
+ smartCart: import_v42.z.unknown(),
141
+ smartFlows: import_v42.z.array(import_v42.z.unknown())
142
+ });
143
+
144
+ // src/schema/widgets/checkout-and-beyond/image.ts
145
+ var import_uuid13 = require("uuid");
146
+ var import_v421 = require("zod/v4");
32
147
 
33
148
  // src/schema/widgets/checkout-and-beyond/common.ts
34
149
  var freezeEnum = (values) => Object.freeze(Object.fromEntries(values.map((v) => [v, v])));
@@ -148,6 +263,7 @@ var sectionTypes = [
148
263
  "carousel",
149
264
  "cartLine",
150
265
  "dataSource",
266
+ "discount",
151
267
  "image",
152
268
  "layout",
153
269
  "monetize",
@@ -176,12 +292,13 @@ var VariantSelector = freezeEnum(variantSelectors);
176
292
  var verticalAlignments = ["top", "middle", "bottom"];
177
293
  var VerticalAlignment = freezeEnum(verticalAlignments);
178
294
 
179
- // src/schema/widgets/checkout-and-beyond/layout.ts
180
- var import_uuid12 = require("uuid");
181
- var import_v417 = require("zod/v4");
295
+ // src/schema/widgets/checkout-and-beyond/regex.ts
296
+ var DYNAMIC_TOKEN_REGEX = /^\{\{\s*[A-Za-z]+\s*\}\}$/;
297
+ var HEX_COLOR_REGEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
298
+ var HTML_TAGS_REGEX = /<\/?[^>]+>/g;
182
299
 
183
300
  // src/schema/widgets/checkout-and-beyond/rule.ts
184
- var import_v4 = require("zod/v4");
301
+ var import_v43 = require("zod/v4");
185
302
  var ruleTypes = [
186
303
  "cart",
187
304
  "cart_count",
@@ -200,7 +317,7 @@ var ruleTypes = [
200
317
  "product_type",
201
318
  "product_vendor"
202
319
  ];
203
- var ruleType = import_v4.z.enum(ruleTypes);
320
+ var ruleType = import_v43.z.enum(ruleTypes);
204
321
  var RuleType = ruleType.enum;
205
322
  var ruleOperators = [
206
323
  "after",
@@ -215,53 +332,93 @@ var ruleOperators = [
215
332
  "greater_than",
216
333
  "less_than"
217
334
  ];
218
- var ruleOperator = import_v4.z.enum(ruleOperators);
335
+ var ruleOperator = import_v43.z.enum(ruleOperators);
219
336
  var RuleOperator = ruleOperator.enum;
220
- var RuleCondition = import_v4.z.object({
221
- operator: import_v4.z.enum(ruleOperators).default(RuleOperator.anything),
222
- products: import_v4.z.union([import_v4.z.array(import_v4.z.unknown()), import_v4.z.strictObject({}).transform(() => [])]).default(() => []),
223
- type: import_v4.z.enum(ruleTypes).default(RuleType.cart_subtotal),
224
- value: import_v4.z.coerce.string().default("")
337
+ var RuleCondition = import_v43.z.object({
338
+ operator: import_v43.z.enum(ruleOperators).default(RuleOperator.anything),
339
+ products: import_v43.z.union([import_v43.z.array(import_v43.z.unknown()), import_v43.z.strictObject({}).transform(() => [])]).default(() => []),
340
+ type: import_v43.z.enum(ruleTypes).default(RuleType.cart_subtotal),
341
+ value: import_v43.z.coerce.string().default("")
225
342
  });
226
- var RuleLogicBlock = import_v4.z.object({
227
- rules: import_v4.z.array(RuleCondition).default(() => [])
343
+ var RuleLogicBlock = import_v43.z.object({
344
+ rules: import_v43.z.array(RuleCondition).default(() => [])
228
345
  });
229
- var CABRule = import_v4.z.object({
230
- dataSourceId: import_v4.z.number().nullable().default(null),
231
- enabled: import_v4.z.boolean().default(false),
232
- ruleset: import_v4.z.union([
233
- import_v4.z.array(
234
- import_v4.z.object({
235
- exitIfMatched: import_v4.z.boolean().default(true),
236
- logic: import_v4.z.array(RuleLogicBlock).default(() => []),
237
- output: import_v4.z.array(
238
- import_v4.z.object({
239
- key: import_v4.z.string().default("should_show"),
240
- type: import_v4.z.literal("data_json").default("data_json"),
241
- value: import_v4.z.string().default("true")
346
+ var CABRule = import_v43.z.object({
347
+ dataSourceId: import_v43.z.number().nullable().default(null),
348
+ enabled: import_v43.z.boolean().default(false),
349
+ ruleset: import_v43.z.union([
350
+ import_v43.z.array(
351
+ import_v43.z.object({
352
+ exitIfMatched: import_v43.z.boolean().default(true),
353
+ logic: import_v43.z.array(RuleLogicBlock).default(() => []),
354
+ output: import_v43.z.array(
355
+ import_v43.z.object({
356
+ key: import_v43.z.string().default("should_show"),
357
+ type: import_v43.z.literal("data_json").default("data_json"),
358
+ value: import_v43.z.string().default("true")
242
359
  })
243
360
  ).default(() => [{ key: "should_show", type: "data_json", value: "true" }])
244
361
  })
245
362
  ),
246
- import_v4.z.strictObject({}).transform(() => [])
363
+ import_v43.z.strictObject({}).transform(() => [])
247
364
  ]).default(() => [])
248
365
  });
249
366
 
250
367
  // src/schema/widgets/checkout-and-beyond/shared.ts
251
- var import_v416 = require("zod/v4");
368
+ var import_v420 = require("zod/v4");
252
369
 
253
- // src/schema/widgets/checkout-and-beyond/button.ts
254
- var import_uuid3 = require("uuid");
255
- var import_v44 = require("zod/v4");
370
+ // src/schema/widgets/checkout-and-beyond/banner.ts
371
+ var import_v45 = require("zod/v4");
256
372
 
257
- // src/schema/widgets/checkout-and-beyond/image.ts
373
+ // src/schema/widgets/checkout-and-beyond/layout.ts
258
374
  var import_uuid = require("uuid");
259
- var import_v42 = require("zod/v4");
375
+ var import_v44 = require("zod/v4");
376
+ var GridItem = import_v44.z.union([import_v44.z.literal("auto"), import_v44.z.literal("fill"), import_v44.z.string().regex(/^\d+%$/), import_v44.z.number()]);
377
+ var CABLayoutSection = import_v44.z.object({
378
+ alignment: import_v44.z.object({
379
+ horizontal: import_v44.z.enum(horizontalAlignments).default(HorizontalAlignment.start),
380
+ vertical: import_v44.z.enum(verticalAlignments).default(VerticalAlignment.top)
381
+ }).default({
382
+ horizontal: HorizontalAlignment.start,
383
+ vertical: VerticalAlignment.top
384
+ }),
385
+ border: import_v44.z.lazy(() => CABBorder),
386
+ buttonField: import_v44.z.enum(buttonFields).optional(),
387
+ direction: import_v44.z.enum(directions).default(Direction.rows),
388
+ grid: import_v44.z.object({
389
+ columns: import_v44.z.union([import_v44.z.array(GridItem), import_v44.z.undefined()]).default(() => ["auto"]),
390
+ rows: import_v44.z.union([import_v44.z.array(GridItem), import_v44.z.undefined()]).default(() => ["auto"])
391
+ }).default({ columns: ["auto"], rows: ["auto"] }).optional(),
392
+ name: import_v44.z.string().optional(),
393
+ padding: import_v44.z.enum(spacings).default(Spacing.none),
394
+ rule: CABRule.optional(),
395
+ sectionId: import_v44.z.uuid().default(() => (0, import_uuid.v7)()),
396
+ sections: import_v44.z.union([import_v44.z.array(import_v44.z.lazy(() => CABSection)), import_v44.z.strictObject({}).transform(() => [])]).default(() => []),
397
+ sectionType: import_v44.z.literal(SectionType.layout).default(SectionType.layout),
398
+ spacing: import_v44.z.enum(spacings).default(Spacing.base),
399
+ /** Fire-and-forget impression pixel POSTed once when the section is shown (e.g. a Monetize offer view). */
400
+ viewUrl: import_v44.z.string().optional(),
401
+ width: import_v44.z.number().default(100)
402
+ });
260
403
 
261
- // src/schema/widgets/checkout-and-beyond/regex.ts
262
- var DYNAMIC_TOKEN_REGEX = /^\{\{\s*[A-Za-z]+\s*\}\}$/;
263
- var HEX_COLOR_REGEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
264
- var HTML_TAGS_REGEX = /<\/?[^>]+>/g;
404
+ // src/schema/widgets/checkout-and-beyond/banner.ts
405
+ var CABBannerSection = import_v45.z.lazy(
406
+ () => CABLayoutSection.omit({ sectionType: true }).extend({
407
+ buttonField: import_v45.z.enum(buttonFields).optional(),
408
+ color: import_v45.z.enum(bannerColors).default("info"),
409
+ dismissible: import_v45.z.boolean().default(true),
410
+ sectionType: import_v45.z.literal(SectionType.banner).default(SectionType.banner)
411
+ })
412
+ );
413
+
414
+ // src/schema/widgets/checkout-and-beyond/button.ts
415
+ var import_uuid3 = require("uuid");
416
+ var import_v47 = require("zod/v4");
417
+
418
+ // src/schema/widgets/checkout-and-beyond/text.ts
419
+ var import_compat2 = require("es-toolkit/compat");
420
+ var import_uuid2 = require("uuid");
421
+ var import_v46 = require("zod/v4");
265
422
 
266
423
  // src/schema/widgets/checkout-and-beyond/utils.ts
267
424
  var import_es_toolkit = require("es-toolkit");
@@ -279,90 +436,65 @@ var hasHTMLInDoc = (doc) => doc.content.some(({ content = [] }) => content.some(
279
436
  var checkForHTML = (input) => !((0, import_compat.isString)(input) && isHTML(input) || (0, import_es_toolkit.isPlainObject)(input) && hasHTMLInDoc(input));
280
437
  var NO_HTML = { message: "HTML is not supported" };
281
438
 
282
- // src/schema/widgets/checkout-and-beyond/image.ts
283
- var CABImageSection = import_v42.z.object({
284
- altText: import_v42.z.string().refine(checkForHTML, NO_HTML).default(""),
285
- aspectRatio: import_v42.z.literal(1).nullable().default(null),
286
- border: import_v42.z.lazy(() => CABBorder),
287
- buttonField: import_v42.z.enum(buttonFields).optional(),
288
- category: import_v42.z.enum(["gallery", "icons", "payment-methods", "secure-checkout"]).nullable().default(null),
289
- name: import_v42.z.string().optional(),
290
- naturalHeight: import_v42.z.number().default(0),
291
- naturalWidth: import_v42.z.number().default(0),
292
- /**
293
- * `contain` (the component default): dimensionless images render in s-image's 1/1 default frame, and
294
- * `cover` would crop non-square art (payment badges lost their edges — 15993); `contain` letterboxes.
295
- */
296
- objectFit: import_v42.z.enum(objectFits).default(ObjectFit.contain),
297
- rule: CABRule.optional(),
298
- sectionId: import_v42.z.uuid().default(() => (0, import_uuid.v7)()),
299
- sectionType: import_v42.z.literal(SectionType.image).default(SectionType.image),
300
- source: import_v42.z.union([import_v42.z.url(), import_v42.z.literal(""), import_v42.z.string().regex(DYNAMIC_TOKEN_REGEX)]).default(""),
301
- width: import_v42.z.number().default(100)
302
- });
303
-
304
439
  // src/schema/widgets/checkout-and-beyond/text.ts
305
- var import_compat2 = require("es-toolkit/compat");
306
- var import_uuid2 = require("uuid");
307
- var import_v43 = require("zod/v4");
308
- var enumOrOmit = (...vals) => import_v43.z.string().transform((val) => vals.includes(val) ? val : void 0).optional();
309
- var TiptapText = import_v43.z.object({
310
- marks: import_v43.z.union([
311
- import_v43.z.array(
312
- import_v43.z.discriminatedUnion("type", [
313
- import_v43.z.object({ type: import_v43.z.literal("bold") }),
314
- import_v43.z.object({ type: import_v43.z.literal("italic") }),
315
- import_v43.z.object({
316
- attrs: import_v43.z.object({
317
- class: import_v43.z.string().nullable(),
318
- href: import_v43.z.union([import_v43.z.url(), import_v43.z.literal("#"), import_v43.z.string().regex(DYNAMIC_TOKEN_REGEX)]),
319
- rel: import_v43.z.string().default("noopener noreferrer nofollow"),
320
- target: import_v43.z.string().default("_blank")
440
+ var enumOrOmit = (...vals) => import_v46.z.string().transform((val) => vals.includes(val) ? val : void 0).optional();
441
+ var TiptapText = import_v46.z.object({
442
+ marks: import_v46.z.union([
443
+ import_v46.z.array(
444
+ import_v46.z.discriminatedUnion("type", [
445
+ import_v46.z.object({ type: import_v46.z.literal("bold") }),
446
+ import_v46.z.object({ type: import_v46.z.literal("italic") }),
447
+ import_v46.z.object({
448
+ attrs: import_v46.z.object({
449
+ class: import_v46.z.string().nullable(),
450
+ href: import_v46.z.union([import_v46.z.url(), import_v46.z.literal("#"), import_v46.z.string().regex(DYNAMIC_TOKEN_REGEX)]),
451
+ rel: import_v46.z.string().default("noopener noreferrer nofollow"),
452
+ target: import_v46.z.string().default("_blank")
321
453
  }),
322
- type: import_v43.z.literal("link")
454
+ type: import_v46.z.literal("link")
323
455
  }),
324
- import_v43.z.object({ type: import_v43.z.literal("strike") }),
325
- import_v43.z.object({
326
- attrs: import_v43.z.object({
456
+ import_v46.z.object({ type: import_v46.z.literal("strike") }),
457
+ import_v46.z.object({
458
+ attrs: import_v46.z.object({
327
459
  color: enumOrOmit(...textColorNames).default(TextColorName.base),
328
460
  fontSize: enumOrOmit(...textSizeNames).default(TextSizeName.base)
329
461
  }),
330
- type: import_v43.z.literal("textStyle")
462
+ type: import_v46.z.literal("textStyle")
331
463
  })
332
464
  ])
333
465
  ),
334
- import_v43.z.strictObject({}).transform(() => [])
466
+ import_v46.z.strictObject({}).transform(() => [])
335
467
  ]).optional(),
336
- text: import_v43.z.string().default(""),
337
- type: import_v43.z.literal("text").default("text")
468
+ text: import_v46.z.string().default(""),
469
+ type: import_v46.z.literal("text").default("text")
338
470
  });
339
- var TiptapParagraph = import_v43.z.object({
340
- attrs: import_v43.z.object({
471
+ var TiptapParagraph = import_v46.z.object({
472
+ attrs: import_v46.z.object({
341
473
  textAlign: enumOrOmit(...textAlignments)
342
474
  }).default({ textAlign: TextAlignment.start }),
343
- content: import_v43.z.union([import_v43.z.array(TiptapText), import_v43.z.strictObject({}).transform(() => [])]).default(() => []),
344
- type: import_v43.z.literal("paragraph").default("paragraph")
475
+ content: import_v46.z.union([import_v46.z.array(TiptapText), import_v46.z.strictObject({}).transform(() => [])]).default(() => []),
476
+ type: import_v46.z.literal("paragraph").default("paragraph")
345
477
  });
346
- var TiptapDocument = import_v43.z.object({
347
- attrs: import_v43.z.object({
478
+ var TiptapDocument = import_v46.z.object({
479
+ attrs: import_v46.z.object({
348
480
  blockSpacing: enumOrOmit(...spacings)
349
481
  }).default({ blockSpacing: Spacing.base }),
350
- content: import_v43.z.union([import_v43.z.array(TiptapParagraph), import_v43.z.strictObject({}).transform(() => [])]).default(() => [TiptapParagraph.parse({})]),
351
- type: import_v43.z.literal("doc").default("doc")
482
+ content: import_v46.z.union([import_v46.z.array(TiptapParagraph), import_v46.z.strictObject({}).transform(() => [])]).default(() => [TiptapParagraph.parse({})]),
483
+ type: import_v46.z.literal("doc").default("doc")
352
484
  });
353
- var CABProgressTier = import_v43.z.object({
354
- threshold: import_v43.z.number().int().nonnegative(),
355
- thresholds: import_v43.z.record(import_v43.z.string(), import_v43.z.number().int().nonnegative()).default(() => ({})),
356
- tierType: import_v43.z.enum(progressTierTypes).default(ProgressTierType.shipping)
485
+ var CABProgressTier = import_v46.z.object({
486
+ threshold: import_v46.z.number().int().nonnegative(),
487
+ thresholds: import_v46.z.record(import_v46.z.string(), import_v46.z.number().int().nonnegative()).default(() => ({})),
488
+ tierType: import_v46.z.enum(progressTierTypes).default(ProgressTierType.shipping)
357
489
  });
358
- var CABTextSection = import_v43.z.object({
359
- buttonField: import_v43.z.enum(buttonFields).optional(),
360
- content: import_v43.z.record(import_v43.z.string(), import_v43.z.union([import_v43.z.string(), TiptapDocument]).refine(checkForHTML, NO_HTML).optional()).default({ en: TiptapDocument.parse({}) }).optional(),
361
- name: import_v43.z.string().optional(),
362
- optionId: import_v43.z.number().optional(),
490
+ var CABTextSection = import_v46.z.object({
491
+ buttonField: import_v46.z.enum(buttonFields).optional(),
492
+ content: import_v46.z.record(import_v46.z.string(), import_v46.z.union([import_v46.z.string(), TiptapDocument]).refine(checkForHTML, NO_HTML).optional()).default({ en: TiptapDocument.parse({}) }).optional(),
493
+ name: import_v46.z.string().optional(),
494
+ optionId: import_v46.z.number().optional(),
363
495
  rule: CABRule.optional(),
364
- sectionId: import_v43.z.uuid().default(() => (0, import_uuid2.v7)()),
365
- sectionType: import_v43.z.literal(SectionType.text).default(SectionType.text),
496
+ sectionId: import_v46.z.uuid().default(() => (0, import_uuid2.v7)()),
497
+ sectionType: import_v46.z.literal(SectionType.text).default(SectionType.text),
366
498
  tier: CABProgressTier.optional()
367
499
  }).superRefine(({ buttonField, content }, ctx) => {
368
500
  if (buttonField === ButtonField.destinationUrl && content) {
@@ -384,48 +516,48 @@ var CABTextSection = import_v43.z.object({
384
516
  });
385
517
 
386
518
  // src/schema/widgets/checkout-and-beyond/button.ts
387
- var CABButtonContent = import_v44.z.lazy(
388
- () => import_v44.z.discriminatedUnion("sectionType", [CABImageSection, CABLayoutSection, CABTextSection])
519
+ var CABButtonContent = import_v47.z.lazy(
520
+ () => import_v47.z.discriminatedUnion("sectionType", [CABImageSection, CABLayoutSection, CABTextSection])
389
521
  );
390
- var CABButtonSection = import_v44.z.object({
391
- action: import_v44.z.union([import_v44.z.literal(""), import_v44.z.enum(buttonActions)]).default(""),
392
- buttonStyle: import_v44.z.enum(buttonStyles).default(ButtonStyle.primary),
393
- custom: import_v44.z.object({
394
- color: import_v44.z.string().regex(HEX_COLOR_REGEX).default("#005bd3"),
395
- height: import_v44.z.number().default(52),
396
- width: import_v44.z.number().default(300)
522
+ var CABButtonSection = import_v47.z.object({
523
+ action: import_v47.z.union([import_v47.z.literal(""), import_v47.z.enum(buttonActions)]).default(""),
524
+ buttonStyle: import_v47.z.enum(buttonStyles).default(ButtonStyle.primary),
525
+ custom: import_v47.z.object({
526
+ color: import_v47.z.string().regex(HEX_COLOR_REGEX).default("#005bd3"),
527
+ height: import_v47.z.number().default(52),
528
+ width: import_v47.z.number().default(300)
397
529
  }).default({
398
530
  color: "#005bd3",
399
531
  height: 52,
400
532
  width: 300
401
533
  }),
402
- disableDowngrade: import_v44.z.boolean().default(false),
403
- name: import_v44.z.string().optional(),
404
- optionId: import_v44.z.number().optional(),
405
- popover: import_v44.z.object({
406
- alignment: import_v44.z.enum(textAlignments).default(TextAlignment.center),
407
- position: import_v44.z.enum(popoverPositions).default(PopoverPosition.blockStart)
534
+ disableDowngrade: import_v47.z.boolean().default(false),
535
+ name: import_v47.z.string().optional(),
536
+ optionId: import_v47.z.number().optional(),
537
+ popover: import_v47.z.object({
538
+ alignment: import_v47.z.enum(textAlignments).default(TextAlignment.center),
539
+ position: import_v47.z.enum(popoverPositions).default(PopoverPosition.blockStart)
408
540
  }).optional().default(() => ({
409
541
  alignment: TextAlignment.center,
410
542
  position: PopoverPosition.blockStart
411
543
  })),
412
544
  rule: CABRule.optional(),
413
- sectionId: import_v44.z.uuid().default(() => (0, import_uuid3.v7)()),
414
- sections: import_v44.z.union([import_v44.z.array(CABButtonContent), import_v44.z.strictObject({}).transform(() => [])]).default(() => []),
415
- sectionType: import_v44.z.literal(SectionType.button).default(SectionType.button),
545
+ sectionId: import_v47.z.uuid().default(() => (0, import_uuid3.v7)()),
546
+ sections: import_v47.z.union([import_v47.z.array(CABButtonContent), import_v47.z.strictObject({}).transform(() => [])]).default(() => []),
547
+ sectionType: import_v47.z.literal(SectionType.button).default(SectionType.button),
416
548
  /** Fire-and-forget pixel POSTed when the button is clicked (e.g. a Monetize decline). */
417
- trackingUrl: import_v44.z.string().optional()
549
+ trackingUrl: import_v47.z.string().optional()
418
550
  });
419
551
 
420
552
  // src/schema/widgets/checkout-and-beyond/carousel.ts
421
- var import_v49 = require("zod/v4");
553
+ var import_v412 = require("zod/v4");
422
554
 
423
555
  // src/schema/widgets/checkout-and-beyond/offers.ts
424
- var import_v48 = require("zod/v4");
556
+ var import_v411 = require("zod/v4");
425
557
 
426
558
  // src/schema/widgets/checkout-and-beyond/dataSource.ts
427
559
  var import_uuid4 = require("uuid");
428
- var import_v45 = require("zod/v4");
560
+ var import_v48 = require("zod/v4");
429
561
 
430
562
  // src/schema/widgets/checkout-and-beyond/constants.ts
431
563
  var import_es_toolkit2 = require("es-toolkit");
@@ -504,70 +636,70 @@ var widgetTypes = [
504
636
  var WidgetType = freezeEnum(widgetTypes);
505
637
 
506
638
  // src/schema/widgets/checkout-and-beyond/dataSource.ts
507
- var CABDiscount = import_v45.z.object({
508
- amount: import_v45.z.union([import_v45.z.number(), import_v45.z.string()]).catch(0),
509
- discountedBy: import_v45.z.string().optional(),
510
- discountedFrom: import_v45.z.enum(discountSources).optional().catch(void 0),
511
- type: import_v45.z.enum(discountTypes).catch("none")
639
+ var CABDiscount = import_v48.z.object({
640
+ amount: import_v48.z.union([import_v48.z.number(), import_v48.z.string()]).catch(0),
641
+ discountedBy: import_v48.z.string().optional(),
642
+ discountedFrom: import_v48.z.enum(discountSources).optional().catch(void 0),
643
+ type: import_v48.z.enum(discountTypes).catch("none")
512
644
  });
513
- var CABIntegrations = import_v45.z.object({
514
- judgeme: import_v45.z.boolean().default(false),
515
- junip: import_v45.z.boolean().default(false),
516
- klaviyo: import_v45.z.boolean().default(false),
517
- loox: import_v45.z.boolean().default(false),
518
- okendo: import_v45.z.boolean().default(false),
519
- opinew: import_v45.z.boolean().default(false),
520
- reviewsio: import_v45.z.boolean().default(false),
521
- stamped: import_v45.z.boolean().default(false),
522
- yotpo: import_v45.z.boolean().default(false)
645
+ var CABIntegrations = import_v48.z.object({
646
+ judgeme: import_v48.z.boolean().default(false),
647
+ junip: import_v48.z.boolean().default(false),
648
+ klaviyo: import_v48.z.boolean().default(false),
649
+ loox: import_v48.z.boolean().default(false),
650
+ okendo: import_v48.z.boolean().default(false),
651
+ opinew: import_v48.z.boolean().default(false),
652
+ reviewsio: import_v48.z.boolean().default(false),
653
+ stamped: import_v48.z.boolean().default(false),
654
+ yotpo: import_v48.z.boolean().default(false)
523
655
  });
524
- var CABDataSourceSection = import_v45.z.object({
525
- dataSourceId: import_v45.z.number().nullable().default(null),
526
- dataSourcePath: import_v45.z.string().default(DEFAULT_ENDPOINTS[0].value),
656
+ var CABDataSourceSection = import_v48.z.object({
657
+ dataSourceId: import_v48.z.number().nullable().default(null),
658
+ dataSourcePath: import_v48.z.string().default(DEFAULT_ENDPOINTS[0].value),
527
659
  discount: CABDiscount.optional(),
528
660
  integrations: CABIntegrations.optional(),
529
- limit: import_v45.z.number().default(1),
530
- matchVariant: import_v45.z.boolean().default(false),
531
- matchVariantOutOfStock: import_v45.z.boolean().default(false),
532
- name: import_v45.z.string().default(DEFAULT_ENDPOINTS[0].label),
533
- productType: import_v45.z.enum(productTypes).optional(),
534
- sectionId: import_v45.z.uuid().default(() => (0, import_uuid4.v7)()),
535
- sectionType: import_v45.z.literal(SectionType.dataSource).default(SectionType.dataSource),
536
- treatAsGwp: import_v45.z.boolean().default(false)
661
+ limit: import_v48.z.number().default(1),
662
+ matchVariant: import_v48.z.boolean().default(false),
663
+ matchVariantOutOfStock: import_v48.z.boolean().default(false),
664
+ name: import_v48.z.string().default(DEFAULT_ENDPOINTS[0].label),
665
+ productType: import_v48.z.enum(productTypes).optional(),
666
+ sectionId: import_v48.z.uuid().default(() => (0, import_uuid4.v7)()),
667
+ sectionType: import_v48.z.literal(SectionType.dataSource).default(SectionType.dataSource),
668
+ treatAsGwp: import_v48.z.boolean().default(false)
537
669
  });
538
670
 
539
671
  // src/schema/widgets/checkout-and-beyond/products.ts
540
672
  var import_uuid6 = require("uuid");
541
- var import_v47 = require("zod/v4");
673
+ var import_v410 = require("zod/v4");
542
674
 
543
675
  // src/schema/widgets/checkout-and-beyond/product.ts
544
676
  var import_uuid5 = require("uuid");
545
- var import_v46 = require("zod/v4");
546
- var CABVariantContent = import_v46.z.lazy(
547
- () => import_v46.z.discriminatedUnion("sectionType", [CABButtonSection, CABTextSection])
677
+ var import_v49 = require("zod/v4");
678
+ var CABVariantContent = import_v49.z.lazy(
679
+ () => import_v49.z.discriminatedUnion("sectionType", [CABButtonSection, CABTextSection])
548
680
  );
549
- var CABProductSection = import_v46.z.object({
550
- name: import_v46.z.string().optional(),
551
- productId: import_v46.z.number().nullable().default(null),
552
- sectionId: import_v46.z.uuid().default(() => (0, import_uuid5.v7)()),
553
- sections: import_v46.z.union([import_v46.z.array(CABVariantContent), import_v46.z.strictObject({}).transform(() => [])]).default(() => []),
554
- sectionType: import_v46.z.literal(SectionType.product).default(SectionType.product),
555
- selectors: import_v46.z.record(import_v46.z.string(), import_v46.z.enum(variantSelectors).default(VariantSelector.menu)).default(() => ({})),
556
- variantMode: import_v46.z.enum(variantModes).default(VariantMode.multiple)
681
+ var CABProductSection = import_v49.z.object({
682
+ name: import_v49.z.string().optional(),
683
+ productId: import_v49.z.number().nullable().default(null),
684
+ sectionId: import_v49.z.uuid().default(() => (0, import_uuid5.v7)()),
685
+ sections: import_v49.z.union([import_v49.z.array(CABVariantContent), import_v49.z.strictObject({}).transform(() => [])]).default(() => []),
686
+ sectionType: import_v49.z.literal(SectionType.product).default(SectionType.product),
687
+ selectors: import_v49.z.record(import_v49.z.string(), import_v49.z.enum(variantSelectors).default(VariantSelector.menu)).default(() => ({})),
688
+ variantMode: import_v49.z.enum(variantModes).default(VariantMode.multiple)
557
689
  });
558
690
 
559
691
  // src/schema/widgets/checkout-and-beyond/products.ts
560
- var CABProductsSection = import_v47.z.object({
561
- name: import_v47.z.string().optional(),
562
- sectionId: import_v47.z.uuid().default(() => (0, import_uuid6.v7)()),
563
- sections: import_v47.z.union([import_v47.z.array(import_v47.z.lazy(() => CABProductSection)), import_v47.z.strictObject({}).transform(() => [])]).default(() => []),
564
- sectionType: import_v47.z.literal(SectionType.products).default(SectionType.products)
692
+ var CABProductsSection = import_v410.z.object({
693
+ name: import_v410.z.string().optional(),
694
+ sectionId: import_v410.z.uuid().default(() => (0, import_uuid6.v7)()),
695
+ sections: import_v410.z.union([import_v410.z.array(import_v410.z.lazy(() => CABProductSection)), import_v410.z.strictObject({}).transform(() => [])]).default(() => []),
696
+ sectionType: import_v410.z.literal(SectionType.products).default(SectionType.products)
565
697
  });
566
698
 
567
699
  // src/schema/widgets/checkout-and-beyond/offers.ts
568
- var CABOffersSection = import_v48.z.lazy(
700
+ var CABOffersSection = import_v411.z.lazy(
569
701
  () => CABLayoutSection.omit({ sections: true, sectionType: true }).extend({
570
- sections: import_v48.z.union([import_v48.z.array(import_v48.z.lazy(() => CABSection)), import_v48.z.strictObject({}).transform(() => [])]).default(() => [
702
+ sections: import_v411.z.union([import_v411.z.array(import_v411.z.lazy(() => CABSection)), import_v411.z.strictObject({}).transform(() => [])]).default(() => [
571
703
  CABBannerSection.parse({
572
704
  buttonField: "undoAddToOrder",
573
705
  color: "success",
@@ -581,62 +713,77 @@ var CABOffersSection = import_v48.z.lazy(
581
713
  CABDataSourceSection.parse({}),
582
714
  CABProductsSection.parse({})
583
715
  ]),
584
- sectionType: import_v48.z.literal(SectionType.offers).default(SectionType.offers)
716
+ sectionType: import_v411.z.literal(SectionType.offers).default(SectionType.offers)
585
717
  })
586
718
  );
587
719
 
588
720
  // src/schema/widgets/checkout-and-beyond/carousel.ts
589
- var CABCarouselSection = import_v49.z.lazy(
721
+ var CABCarouselSection = import_v412.z.lazy(
590
722
  () => CABLayoutSection.omit({ sections: true, sectionType: true }).extend({
591
- autoAdvanceInterval: import_v49.z.number().default(0),
592
- itemsAtOnce: import_v49.z.number().min(1).default(1),
593
- sections: import_v49.z.union([import_v49.z.array(import_v49.z.lazy(() => CABSection)), import_v49.z.strictObject({}).transform(() => [])]).default(() => [CABOffersSection.parse({})]),
594
- sectionType: import_v49.z.literal(SectionType.carousel).default(SectionType.carousel)
723
+ autoAdvanceInterval: import_v412.z.number().default(0),
724
+ itemsAtOnce: import_v412.z.number().min(1).default(1),
725
+ sections: import_v412.z.union([import_v412.z.array(import_v412.z.lazy(() => CABSection)), import_v412.z.strictObject({}).transform(() => [])]).default(() => [CABOffersSection.parse({})]),
726
+ sectionType: import_v412.z.literal(SectionType.carousel).default(SectionType.carousel)
595
727
  })
596
728
  );
597
729
 
598
730
  // src/schema/widgets/checkout-and-beyond/cartLine.ts
599
- var import_v410 = require("zod/v4");
600
- var CABCartLineSection = import_v410.z.lazy(
731
+ var import_v413 = require("zod/v4");
732
+ var CABCartLineSection = import_v413.z.lazy(
601
733
  () => CABLayoutSection.omit({ sections: true, sectionType: true }).extend({
602
- sections: import_v410.z.union([import_v410.z.array(import_v410.z.lazy(() => CABSection)), import_v410.z.strictObject({}).transform(() => [])]).default(() => [CABButtonSection.parse({ action: ButtonAction.switchToSubscription })]),
603
- sectionType: import_v410.z.literal(SectionType.cartLine).default(SectionType.cartLine)
734
+ sections: import_v413.z.union([import_v413.z.array(import_v413.z.lazy(() => CABSection)), import_v413.z.strictObject({}).transform(() => [])]).default(() => [CABButtonSection.parse({ action: ButtonAction.switchToSubscription })]),
735
+ sectionType: import_v413.z.literal(SectionType.cartLine).default(SectionType.cartLine)
604
736
  })
605
737
  );
606
738
 
607
- // src/schema/widgets/checkout-and-beyond/monetize.ts
739
+ // src/schema/widgets/checkout-and-beyond/discount.ts
608
740
  var import_uuid7 = require("uuid");
609
- var import_v411 = require("zod/v4");
610
- var CABMonetizeSection = import_v411.z.object({
611
- name: import_v411.z.string().optional(),
741
+ var import_v414 = require("zod/v4");
742
+ var CABDiscountSection = import_v414.z.object({
743
+ amount: import_v414.z.union([import_v414.z.number(), import_v414.z.string()]).catch(0),
744
+ discountedBy: import_v414.z.string().optional(),
745
+ discountedFrom: import_v414.z.enum(discountSources).optional().catch(void 0),
746
+ message: import_v414.z.string().optional(),
747
+ name: import_v414.z.string().optional(),
748
+ quantity: import_v414.z.number().default(1),
749
+ sectionId: import_v414.z.uuid().default(() => (0, import_uuid7.v7)()),
750
+ sectionType: import_v414.z.literal(SectionType.discount).default(SectionType.discount),
751
+ type: import_v414.z.enum(discountTypes).catch("none")
752
+ });
753
+
754
+ // src/schema/widgets/checkout-and-beyond/monetize.ts
755
+ var import_uuid8 = require("uuid");
756
+ var import_v415 = require("zod/v4");
757
+ var CABMonetizeSection = import_v415.z.object({
758
+ name: import_v415.z.string().optional(),
612
759
  rule: CABRule.optional(),
613
- sectionId: import_v411.z.uuid().default(() => (0, import_uuid7.v7)()),
614
- sectionType: import_v411.z.literal(SectionType.monetize).default(SectionType.monetize)
760
+ sectionId: import_v415.z.uuid().default(() => (0, import_uuid8.v7)()),
761
+ sectionType: import_v415.z.literal(SectionType.monetize).default(SectionType.monetize)
615
762
  });
616
763
 
617
764
  // src/schema/widgets/checkout-and-beyond/progressBar.ts
618
- var import_uuid8 = require("uuid");
619
- var import_v412 = require("zod/v4");
620
- var CABProgressBarSection = import_v412.z.object({
765
+ var import_uuid9 = require("uuid");
766
+ var import_v416 = require("zod/v4");
767
+ var CABProgressBarSection = import_v416.z.object({
621
768
  /** Empty = shown everywhere; otherwise uppercase ISO country codes. */
622
- countryCodes: import_v412.z.array(import_v412.z.string()).default(() => []),
623
- name: import_v412.z.string().optional(),
769
+ countryCodes: import_v416.z.array(import_v416.z.string()).default(() => []),
770
+ name: import_v416.z.string().optional(),
624
771
  rule: CABRule.optional(),
625
- sectionId: import_v412.z.uuid().default(() => (0, import_uuid8.v7)()),
626
- sections: import_v412.z.union([import_v412.z.array(CABTextSection), import_v412.z.strictObject({}).transform(() => [])]).default(() => []),
627
- sectionType: import_v412.z.literal(SectionType.progressBar).default(SectionType.progressBar)
772
+ sectionId: import_v416.z.uuid().default(() => (0, import_uuid9.v7)()),
773
+ sections: import_v416.z.union([import_v416.z.array(CABTextSection), import_v416.z.strictObject({}).transform(() => [])]).default(() => []),
774
+ sectionType: import_v416.z.literal(SectionType.progressBar).default(SectionType.progressBar)
628
775
  });
629
776
 
630
777
  // src/schema/widgets/checkout-and-beyond/quantity.ts
631
- var import_uuid9 = require("uuid");
632
- var import_v413 = require("zod/v4");
633
- var CABQuantitySection = import_v413.z.object({
634
- errorMessages: import_v413.z.record(
635
- import_v413.z.string(),
636
- import_v413.z.object({
637
- max: import_v413.z.string().optional(),
638
- min: import_v413.z.string().optional(),
639
- neg: import_v413.z.string().optional()
778
+ var import_uuid10 = require("uuid");
779
+ var import_v417 = require("zod/v4");
780
+ var CABQuantitySection = import_v417.z.object({
781
+ errorMessages: import_v417.z.record(
782
+ import_v417.z.string(),
783
+ import_v417.z.object({
784
+ max: import_v417.z.string().optional(),
785
+ min: import_v417.z.string().optional(),
786
+ neg: import_v417.z.string().optional()
640
787
  })
641
788
  ).default({
642
789
  en: {
@@ -645,58 +792,59 @@ var CABQuantitySection = import_v413.z.object({
645
792
  neg: "Quantity cannot be negative"
646
793
  }
647
794
  }),
648
- inputType: import_v413.z.enum(quantityInputs).default(QuantityInput.select),
649
- max: import_v413.z.number().min(1).max(100).default(10),
650
- min: import_v413.z.number().min(1).default(1),
651
- name: import_v413.z.string().optional(),
795
+ inputType: import_v417.z.enum(quantityInputs).default(QuantityInput.select),
796
+ max: import_v417.z.number().min(1).max(100).default(10),
797
+ min: import_v417.z.number().min(1).default(1),
798
+ name: import_v417.z.string().optional(),
652
799
  rule: CABRule.optional(),
653
- sectionId: import_v413.z.uuid().default(() => (0, import_uuid9.v7)()),
654
- sectionType: import_v413.z.literal(SectionType.quantity).default(SectionType.quantity)
800
+ sectionId: import_v417.z.uuid().default(() => (0, import_uuid10.v7)()),
801
+ sectionType: import_v417.z.literal(SectionType.quantity).default(SectionType.quantity)
655
802
  });
656
803
 
657
804
  // src/schema/widgets/checkout-and-beyond/reviews.ts
658
- var import_uuid10 = require("uuid");
659
- var import_v414 = require("zod/v4");
660
- var CABReviewsSection = import_v414.z.object({
661
- color: import_v414.z.string().default("#fadb14"),
662
- name: import_v414.z.string().optional(),
805
+ var import_uuid11 = require("uuid");
806
+ var import_v418 = require("zod/v4");
807
+ var CABReviewsSection = import_v418.z.object({
808
+ color: import_v418.z.string().default("#fadb14"),
809
+ name: import_v418.z.string().optional(),
663
810
  rule: CABRule.optional(),
664
- sectionId: import_v414.z.uuid().default(() => (0, import_uuid10.v7)()),
665
- sectionType: import_v414.z.literal(SectionType.reviews).default(SectionType.reviews),
666
- size: import_v414.z.enum(reviewsSizes).default(ReviewsSize.default)
811
+ sectionId: import_v418.z.uuid().default(() => (0, import_uuid11.v7)()),
812
+ sectionType: import_v418.z.literal(SectionType.reviews).default(SectionType.reviews),
813
+ size: import_v418.z.enum(reviewsSizes).default(ReviewsSize.default)
667
814
  });
668
815
 
669
816
  // src/schema/widgets/checkout-and-beyond/variants.ts
670
817
  var import_compat3 = require("es-toolkit/compat");
671
- var import_uuid11 = require("uuid");
672
- var import_v415 = require("zod/v4");
673
- var CABVariantsSection = import_v415.z.object({
674
- hideOutOfStockVariants: import_v415.z.boolean().default(false),
675
- name: import_v415.z.string().optional(),
818
+ var import_uuid12 = require("uuid");
819
+ var import_v419 = require("zod/v4");
820
+ var CABVariantsSection = import_v419.z.object({
821
+ hideOutOfStockVariants: import_v419.z.boolean().default(false),
822
+ name: import_v419.z.string().optional(),
676
823
  rule: CABRule.optional(),
677
- sectionId: import_v415.z.uuid().default(() => (0, import_uuid11.v7)()),
678
- sectionType: import_v415.z.literal(SectionType.variants).default(SectionType.variants),
679
- selector: import_v415.z.enum((0, import_compat3.slice)(variantSelectors, 0, 3)).default(VariantSelector.menu),
680
- variantMode: import_v415.z.enum(variantModes).default(VariantMode.multiple)
824
+ sectionId: import_v419.z.uuid().default(() => (0, import_uuid12.v7)()),
825
+ sectionType: import_v419.z.literal(SectionType.variants).default(SectionType.variants),
826
+ selector: import_v419.z.enum((0, import_compat3.slice)(variantSelectors, 0, 3)).default(VariantSelector.menu),
827
+ variantMode: import_v419.z.enum(variantModes).default(VariantMode.multiple)
681
828
  });
682
829
 
683
830
  // src/schema/widgets/checkout-and-beyond/shared.ts
684
- var CABBorder = import_v416.z.object({
685
- radius: import_v416.z.enum(borderRadii).default(BorderRadius.base),
686
- style: import_v416.z.enum(borderStyles).default(BorderStyle.none),
687
- width: import_v416.z.enum(borderWidths).default(BorderWidth.base)
831
+ var CABBorder = import_v420.z.object({
832
+ radius: import_v420.z.enum(borderRadii).default(BorderRadius.base),
833
+ style: import_v420.z.enum(borderStyles).default(BorderStyle.none),
834
+ width: import_v420.z.enum(borderWidths).default(BorderWidth.base)
688
835
  }).default({
689
836
  radius: BorderRadius.base,
690
837
  style: BorderStyle.none,
691
838
  width: BorderWidth.base
692
839
  });
693
- var CABSection = import_v416.z.lazy(
694
- () => import_v416.z.discriminatedUnion("sectionType", [
840
+ var CABSection = import_v420.z.lazy(
841
+ () => import_v420.z.discriminatedUnion("sectionType", [
695
842
  CABBannerSection,
696
843
  CABButtonSection,
697
844
  CABCarouselSection,
698
845
  CABCartLineSection,
699
846
  CABDataSourceSection,
847
+ CABDiscountSection,
700
848
  CABImageSection,
701
849
  CABLayoutSection,
702
850
  CABMonetizeSection,
@@ -708,205 +856,30 @@ var CABSection = import_v416.z.lazy(
708
856
  CABReviewsSection,
709
857
  CABTextSection,
710
858
  CABVariantsSection
711
- ])
712
- );
713
-
714
- // src/schema/widgets/checkout-and-beyond/layout.ts
715
- var GridItem = import_v417.z.union([import_v417.z.literal("auto"), import_v417.z.literal("fill"), import_v417.z.string().regex(/^\d+%$/), import_v417.z.number()]);
716
- var CABLayoutSection = import_v417.z.object({
717
- alignment: import_v417.z.object({
718
- horizontal: import_v417.z.enum(horizontalAlignments).default(HorizontalAlignment.start),
719
- vertical: import_v417.z.enum(verticalAlignments).default(VerticalAlignment.top)
720
- }).default({
721
- horizontal: HorizontalAlignment.start,
722
- vertical: VerticalAlignment.top
723
- }),
724
- border: import_v417.z.lazy(() => CABBorder),
725
- buttonField: import_v417.z.enum(buttonFields).optional(),
726
- direction: import_v417.z.enum(directions).default(Direction.rows),
727
- grid: import_v417.z.object({
728
- columns: import_v417.z.union([import_v417.z.array(GridItem), import_v417.z.undefined()]).default(() => ["auto"]),
729
- rows: import_v417.z.union([import_v417.z.array(GridItem), import_v417.z.undefined()]).default(() => ["auto"])
730
- }).default({ columns: ["auto"], rows: ["auto"] }).optional(),
731
- name: import_v417.z.string().optional(),
732
- padding: import_v417.z.enum(spacings).default(Spacing.none),
733
- rule: CABRule.optional(),
734
- sectionId: import_v417.z.uuid().default(() => (0, import_uuid12.v7)()),
735
- sections: import_v417.z.union([import_v417.z.array(import_v417.z.lazy(() => CABSection)), import_v417.z.strictObject({}).transform(() => [])]).default(() => []),
736
- sectionType: import_v417.z.literal(SectionType.layout).default(SectionType.layout),
737
- spacing: import_v417.z.enum(spacings).default(Spacing.base),
738
- /** Fire-and-forget impression pixel POSTed once when the section is shown (e.g. a Monetize offer view). */
739
- viewUrl: import_v417.z.string().optional(),
740
- width: import_v417.z.number().default(100)
741
- });
742
-
743
- // src/schema/widgets/checkout-and-beyond/banner.ts
744
- var CABBannerSection = import_v418.z.lazy(
745
- () => CABLayoutSection.omit({ sectionType: true }).extend({
746
- buttonField: import_v418.z.enum(buttonFields).optional(),
747
- color: import_v418.z.enum(bannerColors).default("info"),
748
- dismissible: import_v418.z.boolean().default(true),
749
- sectionType: import_v418.z.literal(SectionType.banner).default(SectionType.banner)
750
- })
751
- );
752
-
753
- // src/schema/widgets/checkout-and-beyond/root.ts
754
- var import_v419 = require("zod/v4");
755
- var TargetArea = import_v419.z.object({
756
- fill: import_v419.z.boolean().optional(),
757
- flip: import_v419.z.enum(["both", "horizontal", "vertical"]).optional(),
758
- icon: import_v419.z.string(),
759
- label: import_v419.z.string(),
760
- width: import_v419.z.string()
761
- }).default(targetAreas[EditorMode.checkoutExtension][1]);
762
- var CABTracking = import_v419.z.object({
763
- enableAttribution: import_v419.z.boolean().default(true),
764
- enableSource: import_v419.z.boolean().default(true),
765
- enableWidget: import_v419.z.boolean().default(true)
766
- }).default({ enableAttribution: true, enableSource: true, enableWidget: true });
767
- var CABRootSection = CABLayoutSection.extend({
768
- editorMode: import_v419.z.enum(editorModes).default(EditorMode.checkoutExtension),
769
- previewMode: import_v419.z.boolean().default(false),
770
- storeId: import_v419.z.number().nullable().default(null),
771
- targetArea: TargetArea.nullable(),
772
- tracking: CABTracking,
773
- type: import_v419.z.enum(widgetTypes).default(WidgetType.ui_extension_content_block),
774
- version: import_v419.z.literal(2).default(2),
775
- widgetId: import_v419.z.number().nullable().default(null)
776
- });
777
-
778
- // src/schema/widgets/checkout-and-beyond/switchLabels.ts
779
- var SWITCH_LABELS = {
780
- subscriptionOption: {
781
- ar: "\u064A\u062A\u0645 \u0627\u0644\u062A\u0648\u0635\u064A\u0644 \u0643\u0644 {{frequency}} {{interval}}",
782
- cs: "Doru\u010Den\xED ka\u017Ed\xFDch {{frequency}} {{interval}}",
783
- da: "Leveres hver {{frequency}} {{interval}}",
784
- de: "Lieferung alle {{frequency}} {{interval}}",
785
- en: "Delivers every {{frequency}} {{interval}}",
786
- es: "Entrega cada {{frequency}} {{interval}}",
787
- fi: "Toimitus {{frequency}} {{interval}} v\xE4lein",
788
- fr: "Livraison tous les {{frequency}} {{interval}}",
789
- ga: "Seachadtar gach {{frequency}} {{interval}}",
790
- he: "\u05DE\u05E9\u05DC\u05D5\u05D7 \u05DB\u05DC {{frequency}} {{interval}}",
791
- hi: "\u0939\u0930 {{frequency}} {{interval}} \u092E\u0947\u0902 \u0921\u093F\u0932\u0940\u0935\u0930\u0940",
792
- id: "Dikirim setiap {{frequency}} {{interval}}",
793
- it: "Consegna ogni {{frequency}} {{interval}}",
794
- ja: "{{frequency}} {{interval}}\u3054\u3068\u306B\u304A\u5C4A\u3051",
795
- ko: "{{frequency}} {{interval}}\uB9C8\uB2E4 \uBC30\uC1A1",
796
- nl: "Wordt elke {{frequency}} {{interval}} geleverd",
797
- no: "Leveres hver {{frequency}} {{interval}}",
798
- pl: "Dostawa co {{frequency}} {{interval}}",
799
- pt: "Entrega a cada {{frequency}} {{interval}}",
800
- ru: "\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u0430\u0436\u0434\u044B\u0435 {{frequency}} {{interval}}",
801
- sv: "Levereras var {{frequency}} {{interval}}",
802
- th: "\u0E08\u0E31\u0E14\u0E2A\u0E48\u0E07\u0E17\u0E38\u0E01 {{frequency}} {{interval}}",
803
- tr: "Her {{frequency}} {{interval}} aral\u0131\u011F\u0131nda teslimat",
804
- uk: "\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u043E\u0436\u043D\u0456 {{frequency}} {{interval}}",
805
- vi: "Giao h\xE0ng m\u1ED7i {{frequency}} {{interval}}",
806
- zh: "\u6BCF {{frequency}} {{interval}} \u914D\u9001\u4E00\u6B21"
807
- },
808
- switchToOneTimePurchase: {
809
- ar: "\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0634\u0631\u0627\u0621 \u0644\u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629",
810
- cs: "P\u0159epnout na jednor\xE1zov\xFD n\xE1kup",
811
- da: "Skift til engangsk\xF8b",
812
- de: "Zu einmaligem Kauf wechseln",
813
- en: "Switch to One-time Purchase",
814
- es: "Cambiar a compra \xFAnica",
815
- fi: "Vaihda kertaluonteiseen ostoon",
816
- fr: "Passer \xE0 un achat unique",
817
- ga: "Athraigh go ceannach aonuaire",
818
- he: "\u05E2\u05D1\u05D5\u05E8 \u05DC\u05E8\u05DB\u05D9\u05E9\u05D4 \u05D7\u05D3-\u05E4\u05E2\u05DE\u05D9\u05EA",
819
- hi: "\u090F\u0915 \u092C\u093E\u0930 \u0915\u0940 \u0916\u0930\u0940\u0926 \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902",
820
- id: "Beralih ke pembelian satu kali",
821
- it: "Passa all\u2019acquisto una tantum",
822
- ja: "1\u56DE\u9650\u308A\u306E\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B",
823
- ko: "\uC77C\uD68C\uC131 \uAD6C\uB9E4\uB85C \uC804\uD658",
824
- nl: "Overschakelen naar eenmalige aankoop",
825
- no: "Bytt til engangskj\xF8p",
826
- pl: "Prze\u0142\u0105cz na jednorazowy zakup",
827
- pt: "Mudar para compra \xFAnica",
828
- ru: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u0440\u0430\u0437\u043E\u0432\u0443\u044E \u043F\u043E\u043A\u0443\u043F\u043A\u0443",
829
- sv: "Byt till eng\xE5ngsk\xF6p",
830
- th: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E04\u0E23\u0E31\u0E49\u0E07\u0E40\u0E14\u0E35\u0E22\u0E27",
831
- tr: "Tek seferlik sat\u0131n almaya ge\xE7",
832
- uk: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0443 \u043F\u043E\u043A\u0443\u043F\u043A\u0443",
833
- vi: "Chuy\u1EC3n sang mua m\u1ED9t l\u1EA7n",
834
- zh: "\u5207\u6362\u4E3A\u4E00\u6B21\u6027\u8D2D\u4E70"
835
- },
836
- switchToSubscriptionNoDiscount: {
837
- ar: "\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643",
838
- cs: "P\u0159epnout na p\u0159edplatn\xE9",
839
- da: "Skift til abonnement",
840
- de: "Zu einem Abonnement wechseln",
841
- en: "Switch to Subscription",
842
- es: "Cambiar a suscripci\xF3n",
843
- fi: "Vaihda tilaukseen",
844
- fr: "Passer \xE0 un abonnement",
845
- ga: "Athraigh go s\xEDnti\xFAs",
846
- he: "\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9",
847
- hi: "\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902",
848
- id: "Beralih ke langganan",
849
- it: "Passa all\u2019abbonamento",
850
- ja: "\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B",
851
- ko: "\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658",
852
- nl: "Overschakelen naar abonnement",
853
- no: "Bytt til abonnement",
854
- pl: "Prze\u0142\u0105cz na subskrypcj\u0119",
855
- pt: "Mudar para assinatura",
856
- ru: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443",
857
- sv: "Byt till prenumeration",
858
- th: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01",
859
- tr: "Aboneli\u011Fe ge\xE7",
860
- uk: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443",
861
- vi: "Chuy\u1EC3n sang \u0111\u0103ng k\xFD",
862
- zh: "\u5207\u6362\u4E3A\u8BA2\u9605"
863
- },
864
- switchToSubscriptionWithDiscount: {
865
- ar: "\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643 \u0648\u062A\u0648\u0641\u064A\u0631 {{subscriptionDiscount}}%",
866
- cs: "P\u0159epnout na p\u0159edplatn\xE9 a u\u0161et\u0159it {{subscriptionDiscount}} %",
867
- da: "Skift til abonnement og spar {{subscriptionDiscount}}%",
868
- de: "Zu einem Abonnement wechseln und {{subscriptionDiscount}} % sparen",
869
- en: "Switch to Subscription & Save {{subscriptionDiscount}}%",
870
- es: "Cambiar a suscripci\xF3n y ahorrar {{subscriptionDiscount}}%",
871
- fi: "Vaihda tilaukseen ja s\xE4\xE4st\xE4 {{subscriptionDiscount}} %",
872
- fr: "Passer \xE0 un abonnement et \xE9conomiser {{subscriptionDiscount}} %",
873
- ga: "Athraigh go s\xEDnti\xFAs agus s\xE1bh\xE1il {{subscriptionDiscount}}%",
874
- he: "\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9 \u05D5\u05D7\u05E1\u05D5\u05DA {{subscriptionDiscount}}%",
875
- hi: "\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902 \u0914\u0930 {{subscriptionDiscount}}% \u092C\u091A\u093E\u090F\u0902",
876
- id: "Beralih ke langganan dan hemat {{subscriptionDiscount}}%",
877
- it: "Passa all\u2019abbonamento e risparmia {{subscriptionDiscount}}%",
878
- ja: "\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u3066{{subscriptionDiscount}}%\u304A\u5F97",
879
- ko: "\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658\uD558\uACE0 {{subscriptionDiscount}}% \uC808\uC57D",
880
- nl: "Overschakelen naar abonnement en {{subscriptionDiscount}}% besparen",
881
- no: "Bytt til abonnement og spar {{subscriptionDiscount}}%",
882
- pl: "Prze\u0142\u0105cz na subskrypcj\u0119 i oszcz\u0119d\u017A {{subscriptionDiscount}}%",
883
- pt: "Mudar para assinatura e economizar {{subscriptionDiscount}}%",
884
- ru: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443 \u0438 \u0441\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442\u044C {{subscriptionDiscount}}%",
885
- sv: "Byt till prenumeration och spara {{subscriptionDiscount}}%",
886
- th: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E41\u0E25\u0E30\u0E1B\u0E23\u0E30\u0E2B\u0E22\u0E31\u0E14 {{subscriptionDiscount}}%",
887
- tr: "Aboneli\u011Fe ge\xE7 ve {{subscriptionDiscount}}% tasarruf et",
888
- uk: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443 \u0442\u0430 \u0437\u0430\u043E\u0449\u0430\u0434\u0438\u0442\u0438 {{subscriptionDiscount}}%",
889
- vi: "Chuy\u1EC3n sang \u0111\u0103ng k\xFD v\xE0 ti\u1EBFt ki\u1EC7m {{subscriptionDiscount}}%",
890
- zh: "\u5207\u6362\u4E3A\u8BA2\u9605\u5E76\u8282\u7701 {{subscriptionDiscount}}%"
891
- }
892
- };
893
-
894
- // src/server/shared.ts
895
- var REBUY_ENGINE_HOST = "rebuyengine.com";
896
- var UpstreamError = class extends Error {
897
- constructor(status, body, message) {
898
- super(message ?? `Upstream returned ${status}`);
899
- this.body = body;
900
- this.name = "UpstreamError";
901
- this.status = status;
902
- }
903
- };
904
- var NotFoundError = class extends Error {
905
- constructor(message) {
906
- super(message);
907
- this.name = "NotFoundError";
908
- }
909
- };
859
+ ])
860
+ );
861
+
862
+ // src/schema/widgets/checkout-and-beyond/image.ts
863
+ var CABImageSection = import_v421.z.object({
864
+ altText: import_v421.z.string().refine(checkForHTML, NO_HTML).default(""),
865
+ aspectRatio: import_v421.z.literal(1).nullable().default(null),
866
+ border: import_v421.z.lazy(() => CABBorder),
867
+ buttonField: import_v421.z.enum(buttonFields).optional(),
868
+ category: import_v421.z.enum(["gallery", "icons", "payment-methods", "secure-checkout"]).nullable().default(null),
869
+ name: import_v421.z.string().optional(),
870
+ naturalHeight: import_v421.z.number().default(0),
871
+ naturalWidth: import_v421.z.number().default(0),
872
+ /**
873
+ * `contain` (the component default): dimensionless images render in s-image's 1/1 default frame, and
874
+ * `cover` would crop non-square art (payment badges lost their edges — 15993); `contain` letterboxes.
875
+ */
876
+ objectFit: import_v421.z.enum(objectFits).default(ObjectFit.contain),
877
+ rule: CABRule.optional(),
878
+ sectionId: import_v421.z.uuid().default(() => (0, import_uuid13.v7)()),
879
+ sectionType: import_v421.z.literal(SectionType.image).default(SectionType.image),
880
+ source: import_v421.z.union([import_v421.z.url(), import_v421.z.literal(""), import_v421.z.string().regex(DYNAMIC_TOKEN_REGEX)]).default(""),
881
+ width: import_v421.z.number().default(100)
882
+ });
910
883
 
911
884
  // src/transforms/contentBlockV1/stripContentBlockHtml.ts
912
885
  var HTML_COMMENT_RE = /<!--[\s\S]*?-->/g;
@@ -1023,6 +996,31 @@ var convertContentBlockTextToV2 = (language) => {
1023
996
  });
1024
997
  };
1025
998
 
999
+ // src/schema/widgets/checkout-and-beyond/root.ts
1000
+ var import_v422 = require("zod/v4");
1001
+ var TargetArea = import_v422.z.object({
1002
+ fill: import_v422.z.boolean().optional(),
1003
+ flip: import_v422.z.enum(["both", "horizontal", "vertical"]).optional(),
1004
+ icon: import_v422.z.string(),
1005
+ label: import_v422.z.string(),
1006
+ width: import_v422.z.string()
1007
+ }).default(targetAreas[EditorMode.checkoutExtension][1]);
1008
+ var CABTracking = import_v422.z.object({
1009
+ enableAttribution: import_v422.z.boolean().default(true),
1010
+ enableSource: import_v422.z.boolean().default(true),
1011
+ enableWidget: import_v422.z.boolean().default(true)
1012
+ }).default({ enableAttribution: true, enableSource: true, enableWidget: true });
1013
+ var CABRootSection = CABLayoutSection.extend({
1014
+ editorMode: import_v422.z.enum(editorModes).default(EditorMode.checkoutExtension),
1015
+ previewMode: import_v422.z.boolean().default(false),
1016
+ storeId: import_v422.z.number().nullable().default(null),
1017
+ targetArea: TargetArea.nullable(),
1018
+ tracking: CABTracking,
1019
+ type: import_v422.z.enum(widgetTypes).default(WidgetType.ui_extension_content_block),
1020
+ version: import_v422.z.literal(2).default(2),
1021
+ widgetId: import_v422.z.number().nullable().default(null)
1022
+ });
1023
+
1026
1024
  // src/transforms/contentBlockV1/convertContentBlockToV2.ts
1027
1025
  var LOCATION_TO_EDITOR_MODE = {
1028
1026
  checkout: "checkoutExtension",
@@ -1364,6 +1362,122 @@ var isCABRootSection = (input) => {
1364
1362
  return input.version === 2;
1365
1363
  };
1366
1364
 
1365
+ // src/schema/widgets/checkout-and-beyond/switchLabels.ts
1366
+ var SWITCH_LABELS = {
1367
+ subscriptionOption: {
1368
+ ar: "\u064A\u062A\u0645 \u0627\u0644\u062A\u0648\u0635\u064A\u0644 \u0643\u0644 {{frequency}} {{interval}}",
1369
+ cs: "Doru\u010Den\xED ka\u017Ed\xFDch {{frequency}} {{interval}}",
1370
+ da: "Leveres hver {{frequency}} {{interval}}",
1371
+ de: "Lieferung alle {{frequency}} {{interval}}",
1372
+ en: "Delivers every {{frequency}} {{interval}}",
1373
+ es: "Entrega cada {{frequency}} {{interval}}",
1374
+ fi: "Toimitus {{frequency}} {{interval}} v\xE4lein",
1375
+ fr: "Livraison tous les {{frequency}} {{interval}}",
1376
+ ga: "Seachadtar gach {{frequency}} {{interval}}",
1377
+ he: "\u05DE\u05E9\u05DC\u05D5\u05D7 \u05DB\u05DC {{frequency}} {{interval}}",
1378
+ hi: "\u0939\u0930 {{frequency}} {{interval}} \u092E\u0947\u0902 \u0921\u093F\u0932\u0940\u0935\u0930\u0940",
1379
+ id: "Dikirim setiap {{frequency}} {{interval}}",
1380
+ it: "Consegna ogni {{frequency}} {{interval}}",
1381
+ ja: "{{frequency}} {{interval}}\u3054\u3068\u306B\u304A\u5C4A\u3051",
1382
+ ko: "{{frequency}} {{interval}}\uB9C8\uB2E4 \uBC30\uC1A1",
1383
+ nl: "Wordt elke {{frequency}} {{interval}} geleverd",
1384
+ no: "Leveres hver {{frequency}} {{interval}}",
1385
+ pl: "Dostawa co {{frequency}} {{interval}}",
1386
+ pt: "Entrega a cada {{frequency}} {{interval}}",
1387
+ ru: "\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u0430\u0436\u0434\u044B\u0435 {{frequency}} {{interval}}",
1388
+ sv: "Levereras var {{frequency}} {{interval}}",
1389
+ th: "\u0E08\u0E31\u0E14\u0E2A\u0E48\u0E07\u0E17\u0E38\u0E01 {{frequency}} {{interval}}",
1390
+ tr: "Her {{frequency}} {{interval}} aral\u0131\u011F\u0131nda teslimat",
1391
+ uk: "\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u043E\u0436\u043D\u0456 {{frequency}} {{interval}}",
1392
+ vi: "Giao h\xE0ng m\u1ED7i {{frequency}} {{interval}}",
1393
+ zh: "\u6BCF {{frequency}} {{interval}} \u914D\u9001\u4E00\u6B21"
1394
+ },
1395
+ switchToOneTimePurchase: {
1396
+ ar: "\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0634\u0631\u0627\u0621 \u0644\u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629",
1397
+ cs: "P\u0159epnout na jednor\xE1zov\xFD n\xE1kup",
1398
+ da: "Skift til engangsk\xF8b",
1399
+ de: "Zu einmaligem Kauf wechseln",
1400
+ en: "Switch to One-time Purchase",
1401
+ es: "Cambiar a compra \xFAnica",
1402
+ fi: "Vaihda kertaluonteiseen ostoon",
1403
+ fr: "Passer \xE0 un achat unique",
1404
+ ga: "Athraigh go ceannach aonuaire",
1405
+ he: "\u05E2\u05D1\u05D5\u05E8 \u05DC\u05E8\u05DB\u05D9\u05E9\u05D4 \u05D7\u05D3-\u05E4\u05E2\u05DE\u05D9\u05EA",
1406
+ hi: "\u090F\u0915 \u092C\u093E\u0930 \u0915\u0940 \u0916\u0930\u0940\u0926 \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902",
1407
+ id: "Beralih ke pembelian satu kali",
1408
+ it: "Passa all\u2019acquisto una tantum",
1409
+ ja: "1\u56DE\u9650\u308A\u306E\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B",
1410
+ ko: "\uC77C\uD68C\uC131 \uAD6C\uB9E4\uB85C \uC804\uD658",
1411
+ nl: "Overschakelen naar eenmalige aankoop",
1412
+ no: "Bytt til engangskj\xF8p",
1413
+ pl: "Prze\u0142\u0105cz na jednorazowy zakup",
1414
+ pt: "Mudar para compra \xFAnica",
1415
+ ru: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u0440\u0430\u0437\u043E\u0432\u0443\u044E \u043F\u043E\u043A\u0443\u043F\u043A\u0443",
1416
+ sv: "Byt till eng\xE5ngsk\xF6p",
1417
+ th: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E04\u0E23\u0E31\u0E49\u0E07\u0E40\u0E14\u0E35\u0E22\u0E27",
1418
+ tr: "Tek seferlik sat\u0131n almaya ge\xE7",
1419
+ uk: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0443 \u043F\u043E\u043A\u0443\u043F\u043A\u0443",
1420
+ vi: "Chuy\u1EC3n sang mua m\u1ED9t l\u1EA7n",
1421
+ zh: "\u5207\u6362\u4E3A\u4E00\u6B21\u6027\u8D2D\u4E70"
1422
+ },
1423
+ switchToSubscriptionNoDiscount: {
1424
+ ar: "\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643",
1425
+ cs: "P\u0159epnout na p\u0159edplatn\xE9",
1426
+ da: "Skift til abonnement",
1427
+ de: "Zu einem Abonnement wechseln",
1428
+ en: "Switch to Subscription",
1429
+ es: "Cambiar a suscripci\xF3n",
1430
+ fi: "Vaihda tilaukseen",
1431
+ fr: "Passer \xE0 un abonnement",
1432
+ ga: "Athraigh go s\xEDnti\xFAs",
1433
+ he: "\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9",
1434
+ hi: "\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902",
1435
+ id: "Beralih ke langganan",
1436
+ it: "Passa all\u2019abbonamento",
1437
+ ja: "\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B",
1438
+ ko: "\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658",
1439
+ nl: "Overschakelen naar abonnement",
1440
+ no: "Bytt til abonnement",
1441
+ pl: "Prze\u0142\u0105cz na subskrypcj\u0119",
1442
+ pt: "Mudar para assinatura",
1443
+ ru: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443",
1444
+ sv: "Byt till prenumeration",
1445
+ th: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01",
1446
+ tr: "Aboneli\u011Fe ge\xE7",
1447
+ uk: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443",
1448
+ vi: "Chuy\u1EC3n sang \u0111\u0103ng k\xFD",
1449
+ zh: "\u5207\u6362\u4E3A\u8BA2\u9605"
1450
+ },
1451
+ switchToSubscriptionWithDiscount: {
1452
+ ar: "\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643 \u0648\u062A\u0648\u0641\u064A\u0631 {{subscriptionDiscount}}%",
1453
+ cs: "P\u0159epnout na p\u0159edplatn\xE9 a u\u0161et\u0159it {{subscriptionDiscount}} %",
1454
+ da: "Skift til abonnement og spar {{subscriptionDiscount}}%",
1455
+ de: "Zu einem Abonnement wechseln und {{subscriptionDiscount}} % sparen",
1456
+ en: "Switch to Subscription & Save {{subscriptionDiscount}}%",
1457
+ es: "Cambiar a suscripci\xF3n y ahorrar {{subscriptionDiscount}}%",
1458
+ fi: "Vaihda tilaukseen ja s\xE4\xE4st\xE4 {{subscriptionDiscount}} %",
1459
+ fr: "Passer \xE0 un abonnement et \xE9conomiser {{subscriptionDiscount}} %",
1460
+ ga: "Athraigh go s\xEDnti\xFAs agus s\xE1bh\xE1il {{subscriptionDiscount}}%",
1461
+ he: "\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9 \u05D5\u05D7\u05E1\u05D5\u05DA {{subscriptionDiscount}}%",
1462
+ hi: "\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902 \u0914\u0930 {{subscriptionDiscount}}% \u092C\u091A\u093E\u090F\u0902",
1463
+ id: "Beralih ke langganan dan hemat {{subscriptionDiscount}}%",
1464
+ it: "Passa all\u2019abbonamento e risparmia {{subscriptionDiscount}}%",
1465
+ ja: "\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u3066{{subscriptionDiscount}}%\u304A\u5F97",
1466
+ ko: "\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658\uD558\uACE0 {{subscriptionDiscount}}% \uC808\uC57D",
1467
+ nl: "Overschakelen naar abonnement en {{subscriptionDiscount}}% besparen",
1468
+ no: "Bytt til abonnement og spar {{subscriptionDiscount}}%",
1469
+ pl: "Prze\u0142\u0105cz na subskrypcj\u0119 i oszcz\u0119d\u017A {{subscriptionDiscount}}%",
1470
+ pt: "Mudar para assinatura e economizar {{subscriptionDiscount}}%",
1471
+ ru: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443 \u0438 \u0441\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442\u044C {{subscriptionDiscount}}%",
1472
+ sv: "Byt till prenumeration och spara {{subscriptionDiscount}}%",
1473
+ th: "\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E41\u0E25\u0E30\u0E1B\u0E23\u0E30\u0E2B\u0E22\u0E31\u0E14 {{subscriptionDiscount}}%",
1474
+ tr: "Aboneli\u011Fe ge\xE7 ve {{subscriptionDiscount}}% tasarruf et",
1475
+ uk: "\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443 \u0442\u0430 \u0437\u0430\u043E\u0449\u0430\u0434\u0438\u0442\u0438 {{subscriptionDiscount}}%",
1476
+ vi: "Chuy\u1EC3n sang \u0111\u0103ng k\xFD v\xE0 ti\u1EBFt ki\u1EC7m {{subscriptionDiscount}}%",
1477
+ zh: "\u5207\u6362\u4E3A\u8BA2\u9605\u5E76\u8282\u7701 {{subscriptionDiscount}}%"
1478
+ }
1479
+ };
1480
+
1367
1481
  // src/transforms/lineItemEditorV1/convertLineItemEditorToV2.ts
1368
1482
  var OVERRIDE_KEY = {
1369
1483
  subscriptionOption: "subscriptionOptionLabel",
@@ -1455,13 +1569,626 @@ var normalizeTextContent = (node) => {
1455
1569
  return node;
1456
1570
  };
1457
1571
 
1458
- // src/server/widgetSettings.ts
1572
+ // src/transforms/offerV1/types.ts
1573
+ var SHOPIFY_CHECKOUT_EXTENSION = "shopify_checkout_extension";
1574
+ var isOfferV1 = (data) => {
1575
+ if (!data || typeof data !== "object") return false;
1576
+ return data.type === SHOPIFY_CHECKOUT_EXTENSION;
1577
+ };
1578
+
1579
+ // src/schema/widgets/checkout-and-beyond/offerLabels.ts
1580
+ var OFFER_LABELS = {
1581
+ addToCart: {
1582
+ ar: "\u0623\u0636\u0641 \u0625\u0644\u0649 \u0627\u0644\u0633\u0644\u0629",
1583
+ cs: "P\u0159idat do ko\u0161\xEDku",
1584
+ da: "L\xE6g i kurv",
1585
+ de: "In den Warenkorb",
1586
+ en: "Add to cart",
1587
+ es: "A\xF1adir al carrito",
1588
+ fi: "Lis\xE4\xE4 ostoskoriin",
1589
+ fr: "Ajouter au panier",
1590
+ ga: "Cuir sa chairt",
1591
+ he: "\u05D4\u05D5\u05E1\u05E3 \u05DC\u05E2\u05D2\u05DC\u05D4",
1592
+ hi: "\u0915\u093E\u0930\u094D\u091F \u092E\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902",
1593
+ id: "Tambahkan ke keranjang",
1594
+ it: "Aggiungi al carrello",
1595
+ ja: "\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0",
1596
+ ko: "\uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uCD94\uAC00",
1597
+ nl: "In winkelwagen",
1598
+ no: "Legg i handlekurven",
1599
+ pl: "Dodaj do koszyka",
1600
+ pt: "Adicionar ao carrinho",
1601
+ ru: "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443",
1602
+ sv: "L\xE4gg i varukorgen",
1603
+ th: "\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E25\u0E07\u0E15\u0E30\u0E01\u0E23\u0E49\u0E32",
1604
+ tr: "Sepete ekle",
1605
+ uk: "\u0414\u043E\u0434\u0430\u0442\u0438 \u0432 \u043A\u043E\u0448\u0438\u043A",
1606
+ vi: "Th\xEAm v\xE0o gi\u1ECF h\xE0ng",
1607
+ zh: "\u52A0\u5165\u8D2D\u7269\u8F66"
1608
+ },
1609
+ addedToCart: {
1610
+ ar: "\u062A\u0645\u062A \u0627\u0644\u0625\u0636\u0627\u0641\u0629!",
1611
+ cs: "P\u0159id\xE1no!",
1612
+ da: "Tilf\xF8jet!",
1613
+ de: "Hinzugef\xFCgt!",
1614
+ en: "Added!",
1615
+ es: "\xA1A\xF1adido!",
1616
+ fi: "Lis\xE4tty!",
1617
+ fr: "Ajout\xE9 !",
1618
+ ga: "Curtha leis!",
1619
+ he: "\u05E0\u05D5\u05E1\u05E3!",
1620
+ hi: "\u091C\u094B\u0921\u093C\u093E \u0917\u092F\u093E!",
1621
+ id: "Ditambahkan!",
1622
+ it: "Aggiunto!",
1623
+ ja: "\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF01",
1624
+ ko: "\uCD94\uAC00\uB428!",
1625
+ nl: "Toegevoegd!",
1626
+ no: "Lagt til!",
1627
+ pl: "Dodano!",
1628
+ pt: "Adicionado!",
1629
+ ru: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043E!",
1630
+ sv: "Tillagd!",
1631
+ th: "\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E41\u0E25\u0E49\u0E27!",
1632
+ tr: "Eklendi!",
1633
+ uk: "\u0414\u043E\u0434\u0430\u043D\u043E!",
1634
+ vi: "\u0110\xE3 th\xEAm!",
1635
+ zh: "\u5DF2\u6DFB\u52A0\uFF01"
1636
+ },
1637
+ addedToCartMessage: {
1638
+ ar: "\u062A\u0645\u062A \u0625\u0636\u0627\u0641\u0629 {{quantity}} {{productTitle}} \u0625\u0644\u0649 \u0627\u0644\u0633\u0644\u0629.",
1639
+ cs: "{{quantity}} {{productTitle}} p\u0159id\xE1no do ko\u0161\xEDku.",
1640
+ da: "{{quantity}} {{productTitle}} lagt i kurven.",
1641
+ de: "{{quantity}} {{productTitle}} zum Warenkorb hinzugef\xFCgt.",
1642
+ en: "{{quantity}} {{productTitle}} added to cart.",
1643
+ es: "{{quantity}} {{productTitle}} a\xF1adido al carrito.",
1644
+ fi: "{{quantity}} {{productTitle}} lis\xE4tty ostoskoriin.",
1645
+ fr: "{{quantity}} {{productTitle}} ajout\xE9 au panier.",
1646
+ ga: "Cuireadh {{quantity}} {{productTitle}} sa chairt.",
1647
+ he: "{{quantity}} {{productTitle}} \u05E0\u05D5\u05E1\u05E3 \u05DC\u05E2\u05D2\u05DC\u05D4.",
1648
+ hi: "{{quantity}} {{productTitle}} \u0915\u093E\u0930\u094D\u091F \u092E\u0947\u0902 \u091C\u094B\u0921\u093C\u093E \u0917\u092F\u093E\u0964",
1649
+ id: "{{quantity}} {{productTitle}} ditambahkan ke keranjang.",
1650
+ it: "{{quantity}} {{productTitle}} aggiunto al carrello.",
1651
+ ja: "{{quantity}} {{productTitle}}\u3092\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\u3002",
1652
+ ko: "{{quantity}} {{productTitle}}\uC774(\uAC00) \uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4.",
1653
+ nl: "{{quantity}} {{productTitle}} toegevoegd aan winkelwagen.",
1654
+ no: "{{quantity}} {{productTitle}} lagt i handlekurven.",
1655
+ pl: "{{quantity}} {{productTitle}} dodano do koszyka.",
1656
+ pt: "{{quantity}} {{productTitle}} adicionado ao carrinho.",
1657
+ ru: "{{quantity}} {{productTitle}} \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043E \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443.",
1658
+ sv: "{{quantity}} {{productTitle}} har lagts i varukorgen.",
1659
+ th: "\u0E40\u0E1E\u0E34\u0E48\u0E21 {{quantity}} {{productTitle}} \u0E25\u0E07\u0E15\u0E30\u0E01\u0E23\u0E49\u0E32\u0E41\u0E25\u0E49\u0E27",
1660
+ tr: "{{quantity}} {{productTitle}} sepete eklendi.",
1661
+ uk: "{{quantity}} {{productTitle}} \u0434\u043E\u0434\u0430\u043D\u043E \u0434\u043E \u043A\u043E\u0448\u0438\u043A\u0430.",
1662
+ vi: "\u0110\xE3 th\xEAm {{quantity}} {{productTitle}} v\xE0o gi\u1ECF h\xE0ng.",
1663
+ zh: "{{quantity}} {{productTitle}} \u5DF2\u52A0\u5165\u8D2D\u7269\u8F66\u3002"
1664
+ },
1665
+ addingToCart: {
1666
+ ar: "\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0636\u0627\u0641\u0629...",
1667
+ cs: "P\u0159id\xE1v\xE1n\xED...",
1668
+ da: "Tilf\xF8jer...",
1669
+ de: "Wird hinzugef\xFCgt...",
1670
+ en: "Adding...",
1671
+ es: "A\xF1adiendo...",
1672
+ fi: "Lis\xE4t\xE4\xE4n...",
1673
+ fr: "Ajout en cours...",
1674
+ ga: "\xC1 chur leis...",
1675
+ he: "\u05DE\u05D5\u05E1\u05D9\u05E3...",
1676
+ hi: "\u091C\u094B\u0921\u093C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948...",
1677
+ id: "Menambahkan...",
1678
+ it: "Aggiunta in corso...",
1679
+ ja: "\u8FFD\u52A0\u4E2D...",
1680
+ ko: "\uCD94\uAC00 \uC911...",
1681
+ nl: "Toevoegen...",
1682
+ no: "Legger til...",
1683
+ pl: "Dodawanie...",
1684
+ pt: "Adicionando...",
1685
+ ru: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435...",
1686
+ sv: "L\xE4gger till...",
1687
+ th: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E40\u0E1E\u0E34\u0E48\u0E21...",
1688
+ tr: "Ekleniyor...",
1689
+ uk: "\u0414\u043E\u0434\u0430\u0432\u0430\u043D\u043D\u044F...",
1690
+ vi: "\u0110ang th\xEAm...",
1691
+ zh: "\u6B63\u5728\u6DFB\u52A0..."
1692
+ },
1693
+ soldOut: {
1694
+ ar: "\u0646\u0641\u062F\u062A \u0627\u0644\u0643\u0645\u064A\u0629",
1695
+ cs: "Vyprod\xE1no",
1696
+ da: "Udsolgt",
1697
+ de: "Ausverkauft",
1698
+ en: "Sold out",
1699
+ es: "Agotado",
1700
+ fi: "Loppuunmyyty",
1701
+ fr: "\xC9puis\xE9",
1702
+ ga: "D\xEDolta amach",
1703
+ he: "\u05D0\u05D6\u05DC \u05DE\u05D4\u05DE\u05DC\u05D0\u05D9",
1704
+ hi: "\u0938\u094D\u091F\u0949\u0915 \u0916\u093C\u0924\u094D\u092E",
1705
+ id: "Habis terjual",
1706
+ it: "Esaurito",
1707
+ ja: "\u58F2\u308A\u5207\u308C",
1708
+ ko: "\uD488\uC808",
1709
+ nl: "Uitverkocht",
1710
+ no: "Utsolgt",
1711
+ pl: "Wyprzedane",
1712
+ pt: "Esgotado",
1713
+ ru: "\u0420\u0430\u0441\u043F\u0440\u043E\u0434\u0430\u043D\u043E",
1714
+ sv: "Sluts\xE5ld",
1715
+ th: "\u0E2A\u0E34\u0E19\u0E04\u0E49\u0E32\u0E2B\u0E21\u0E14",
1716
+ tr: "T\xFCkendi",
1717
+ uk: "\u0420\u043E\u0437\u043F\u0440\u043E\u0434\u0430\u043D\u043E",
1718
+ vi: "H\u1EBFt h\xE0ng",
1719
+ zh: "\u5DF2\u552E\u7F44"
1720
+ },
1721
+ undo: {
1722
+ ar: "\u062A\u0631\u0627\u062C\u0639",
1723
+ cs: "Zp\u011Bt",
1724
+ da: "Fortryd",
1725
+ de: "R\xFCckg\xE4ngig",
1726
+ en: "Undo",
1727
+ es: "Deshacer",
1728
+ fi: "Kumoa",
1729
+ fr: "Annuler",
1730
+ ga: "Cealaigh",
1731
+ he: "\u05D1\u05D8\u05DC",
1732
+ hi: "\u092A\u0942\u0930\u094D\u0935\u0935\u0924 \u0915\u0930\u0947\u0902",
1733
+ id: "Urungkan",
1734
+ it: "Annulla",
1735
+ ja: "\u5143\u306B\u623B\u3059",
1736
+ ko: "\uC2E4\uD589 \uCDE8\uC18C",
1737
+ nl: "Ongedaan maken",
1738
+ no: "Angre",
1739
+ pl: "Cofnij",
1740
+ pt: "Desfazer",
1741
+ ru: "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C",
1742
+ sv: "\xC5ngra",
1743
+ th: "\u0E40\u0E25\u0E34\u0E01\u0E17\u0E33",
1744
+ tr: "Geri al",
1745
+ uk: "\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
1746
+ vi: "Ho\xE0n t\xE1c",
1747
+ zh: "\u64A4\u9500"
1748
+ }
1749
+ };
1750
+
1751
+ // src/transforms/offerV1/offerCard.ts
1752
+ var VARIANT_SELECTOR = { button: "button", radio: "radio", select: "menu" };
1753
+ var localizedContent = (defaults, override) => {
1754
+ const trimmed = override?.trim();
1755
+ return trimmed ? { ...defaults, en: trimmed } : defaults;
1756
+ };
1757
+ var buildStyledText = (token, style, color = "base") => {
1758
+ const marks = [
1759
+ { attrs: { color, fontSize: style?.textSize ?? "base" }, type: "textStyle" }
1760
+ ];
1761
+ if (style?.textEmphasis === "bold") marks.push({ type: "bold" });
1762
+ if (style?.textEmphasis === "italic") marks.push({ type: "italic" });
1763
+ return { content: [{ content: [{ marks, text: token, type: "text" }], type: "paragraph" }], type: "doc" };
1764
+ };
1765
+ var buildPriceContent = (settings) => {
1766
+ const content = [{ text: "{{variantPrice}}", type: "text" }];
1767
+ if (settings.discount?.showSavingAmount !== false) {
1768
+ content.push(
1769
+ { text: " ", type: "text" },
1770
+ {
1771
+ marks: [{ type: "strike" }, { attrs: { color: "subdued" }, type: "textStyle" }],
1772
+ text: "{{variantCompareAtPrice}}",
1773
+ type: "text"
1774
+ }
1775
+ );
1776
+ }
1777
+ return { content: [{ content, type: "paragraph" }], type: "doc" };
1778
+ };
1779
+ var buildReviews = (settings) => {
1780
+ if (!settings.integrations || !Object.values(settings.integrations).some(Boolean)) return [];
1781
+ const reviews = settings.displaySettings?.reviews;
1782
+ return [
1783
+ {
1784
+ ...reviews?.color && { color: reviews.color },
1785
+ sectionType: "reviews",
1786
+ ...reviews?.size && { size: reviews.size }
1787
+ }
1788
+ ];
1789
+ };
1790
+ var buildImage = (settings) => ({
1791
+ ...settings.displaySettings?.image?.imageFit && {
1792
+ objectFit: settings.displaySettings.image.imageFit
1793
+ },
1794
+ sectionType: "image",
1795
+ source: settings.images?.source === "product" ? "{{productImage}}" : "{{variantImage}}",
1796
+ width: 100
1797
+ });
1798
+ var buildTitle = (settings) => ({
1799
+ content: { en: buildStyledText("{{productTitle}}", settings.displaySettings?.product) },
1800
+ sectionType: "text"
1801
+ });
1802
+ var buildPrice = (settings) => ({
1803
+ content: { en: buildPriceContent(settings) },
1804
+ sectionType: "text"
1805
+ });
1806
+ var buildVariantTitle = (settings) => {
1807
+ const show = settings.productOptions?.showVariantTitle;
1808
+ if (!show || show === "hide") return [];
1809
+ return [
1810
+ {
1811
+ content: { en: buildStyledText("{{variantTitle}}", settings.displaySettings?.variant) },
1812
+ sectionType: "text"
1813
+ }
1814
+ ];
1815
+ };
1816
+ var buildDescription = (settings) => {
1817
+ const show = settings.productOptions?.showProductDescription;
1818
+ if (!show || show === "hide") return [];
1819
+ return [{ content: { en: buildStyledText("{{productDescription}}", void 0) }, sectionType: "text" }];
1820
+ };
1821
+ var buildVariants = (settings) => {
1822
+ if (settings.productOptions?.showVariantOptions === "never") return [];
1823
+ const selector = settings.viewOptions?.variantSelector;
1824
+ return [
1825
+ {
1826
+ hideOutOfStockVariants: !!settings.productOptions?.hideOutOfStockVariants,
1827
+ ...selector && { selector: VARIANT_SELECTOR[selector] },
1828
+ sectionType: "variants"
1829
+ }
1830
+ ];
1831
+ };
1832
+ var QUANTITY_INPUT_TYPE = {
1833
+ "buttons-manual-input": "number",
1834
+ "dropdown-select": "select"
1835
+ };
1836
+ var buildQuantityErrors = (quantity) => {
1837
+ const en = {
1838
+ ...quantity.maxError && { max: quantity.maxError },
1839
+ ...quantity.minError && { min: quantity.minError },
1840
+ ...quantity.negativeError && { neg: quantity.negativeError }
1841
+ };
1842
+ return Object.keys(en).length ? { errorMessages: { en } } : {};
1843
+ };
1844
+ var buildQuantity = (settings) => {
1845
+ const quantity = settings.quantityInputs;
1846
+ if (!quantity?.enabled) return [];
1847
+ const inputType = quantity.type ? QUANTITY_INPUT_TYPE[quantity.type] : void 0;
1848
+ return [
1849
+ {
1850
+ ...buildQuantityErrors(quantity),
1851
+ ...inputType && { inputType },
1852
+ max: quantity.maxValue ?? 10,
1853
+ min: quantity.minValue ?? 1,
1854
+ sectionType: "quantity"
1855
+ }
1856
+ ];
1857
+ };
1858
+ var buildSubscriptionButton = (settings) => {
1859
+ if (settings.productType !== "both" && settings.productType !== "subscription") return [];
1860
+ const language = settings.language;
1861
+ const slot = (buttonField, override) => ({
1862
+ buttonField,
1863
+ content: localizedContent(SWITCH_LABELS[buttonField], override),
1864
+ sectionType: "text"
1865
+ });
1866
+ return [
1867
+ {
1868
+ action: "switchToSubscription",
1869
+ buttonStyle: "plain",
1870
+ sections: [
1871
+ slot("subscriptionOption", void 0),
1872
+ slot("switchToOneTimePurchase", language?.cartSwitchToOnetime),
1873
+ slot("switchToSubscriptionNoDiscount", language?.cartSwitchToSubscription),
1874
+ slot("switchToSubscriptionWithDiscount", language?.upgradeToSubscription)
1875
+ ],
1876
+ sectionType: "button"
1877
+ }
1878
+ ];
1879
+ };
1880
+ var BUTTON_KINDS2 = ["plain", "primary", "secondary"];
1881
+ var buildAddButton = (settings) => {
1882
+ const kind = settings.button?.kind;
1883
+ const slot = (buttonField, override) => ({
1884
+ buttonField,
1885
+ content: localizedContent(OFFER_LABELS[buttonField], override),
1886
+ sectionType: "text"
1887
+ });
1888
+ return {
1889
+ action: "addToOrder",
1890
+ buttonStyle: BUTTON_KINDS2.includes(kind) ? kind : "primary",
1891
+ sections: [
1892
+ slot("addToCart", settings.language?.addToCart),
1893
+ slot("addingToCart", settings.language?.addingToCart),
1894
+ slot("addedToCart", settings.language?.addedToCart),
1895
+ slot("soldOut", settings.language?.soldOutLabel)
1896
+ ],
1897
+ sectionType: "button"
1898
+ };
1899
+ };
1900
+ var rowsLayout = (sections) => ({
1901
+ direction: "rows",
1902
+ sections,
1903
+ sectionType: "layout"
1904
+ });
1905
+ var buildOfferCard = (settings, horizontal) => {
1906
+ const image = buildImage(settings);
1907
+ const title = buildTitle(settings);
1908
+ const variantTitle = buildVariantTitle(settings);
1909
+ const price = buildPrice(settings);
1910
+ const description = buildDescription(settings);
1911
+ const reviews = buildReviews(settings);
1912
+ const variants = buildVariants(settings);
1913
+ const quantity = buildQuantity(settings);
1914
+ const subscription = buildSubscriptionButton(settings);
1915
+ const addButton = buildAddButton(settings);
1916
+ if (!horizontal) {
1917
+ return [
1918
+ image,
1919
+ title,
1920
+ ...variantTitle,
1921
+ price,
1922
+ ...description,
1923
+ ...reviews,
1924
+ ...variants,
1925
+ ...quantity,
1926
+ ...subscription,
1927
+ addButton
1928
+ ];
1929
+ }
1930
+ const info = rowsLayout([title, ...variantTitle, price, ...description, ...reviews, ...variants]);
1931
+ const actions = [...subscription, addButton];
1932
+ const actionsCell = actions.length === 1 ? actions[0] : rowsLayout(actions);
1933
+ const card = {
1934
+ direction: "grid",
1935
+ grid: { columns: ["15%", "fill", "auto"], rows: ["auto"] },
1936
+ sections: [image, info, actionsCell],
1937
+ sectionType: "layout"
1938
+ };
1939
+ return [card, ...quantity];
1940
+ };
1941
+
1942
+ // src/transforms/offerV1/convertOfferToV2.ts
1943
+ var LOCATION_TO_EDITOR_MODE2 = {
1944
+ checkout: "checkoutExtension",
1945
+ "order-status": "orderStatusPage",
1946
+ "thank-you": "thankYouPage"
1947
+ };
1948
+ var STYLE_TO_DIRECTION = {
1949
+ grid: "grid",
1950
+ line: "columns",
1951
+ list: "rows",
1952
+ none: "rows"
1953
+ };
1954
+ var directionForStyle = (style) => style ? STYLE_TO_DIRECTION[style] : "rows";
1955
+ var buildProductListLayout = (direction, columns) => direction === "grid" ? { direction, grid: { columns: Array.from({ length: Math.max(columns, 1) }, () => "fill"), rows: ["auto"] } } : { direction };
1956
+ var hasHeaderText = (language) => !!(language?.title || language?.superTitle || language?.description);
1957
+ var DISCOUNTED_FROM = {
1958
+ compare_at_price: "compare_at_price",
1959
+ original_price: "price",
1960
+ price: "price"
1961
+ };
1962
+ var buildDiscountSection = (discount) => {
1963
+ if (!discount?.type || discount.type === "none") return [];
1964
+ const discountedFrom = discount.discountedFrom ? DISCOUNTED_FROM[discount.discountedFrom] : void 0;
1965
+ return [
1966
+ {
1967
+ amount: discount.amount ?? 0,
1968
+ ...discount.discountedBy && { discountedBy: discount.discountedBy },
1969
+ ...discountedFrom && { discountedFrom },
1970
+ ...discount.message && { message: discount.message },
1971
+ ...discount.quantity != null && { quantity: discount.quantity },
1972
+ sectionType: "discount",
1973
+ type: discount.type
1974
+ }
1975
+ ];
1976
+ };
1977
+ var buildBanner = (language) => language?.successBannerEnabled ? [
1978
+ {
1979
+ color: "success",
1980
+ dismissible: true,
1981
+ sections: [
1982
+ {
1983
+ /**
1984
+ * A defined v1 message (RTE doc or string) passes through verbatim as `en`;
1985
+ * absent falls back to the localized defaults (P4 language policy).
1986
+ */
1987
+ content: language.successBannerMessageRte ? { ...OFFER_LABELS.addedToCartMessage, en: language.successBannerMessageRte } : OFFER_LABELS.addedToCartMessage,
1988
+ sectionType: "text"
1989
+ },
1990
+ {
1991
+ action: "undoAddToOrder",
1992
+ buttonStyle: "plain",
1993
+ sections: [{ buttonField: "buttonLabel", content: OFFER_LABELS.undo, sectionType: "text" }],
1994
+ sectionType: "button"
1995
+ }
1996
+ ],
1997
+ sectionType: "banner"
1998
+ }
1999
+ ] : [];
2000
+ var convertOfferToV2 = ({ id, name, settings }) => {
2001
+ const layout = settings.layout?.large ?? settings.layout?.medium ?? settings.layout?.small;
2002
+ const columns = layout?.columns ?? 1;
2003
+ const direction = directionForStyle(layout?.style);
2004
+ const listLayout = buildProductListLayout(direction, columns);
2005
+ const horizontalCard = direction === "rows";
2006
+ const dataSource = {
2007
+ ...settings.endpoint && { dataSourcePath: settings.endpoint },
2008
+ ...settings.integrations && { integrations: settings.integrations },
2009
+ ...settings.limit !== void 0 && { limit: settings.limit },
2010
+ matchVariant: !!settings.productOptions?.matchVariant,
2011
+ matchVariantOutOfStock: !!settings.productOptions?.matchVariantOutOfStock,
2012
+ ...settings.productType && { productType: settings.productType },
2013
+ sectionType: "dataSource",
2014
+ ...settings.treatAsGwp && { treatAsGwp: true }
2015
+ };
2016
+ const offers = {
2017
+ sections: [
2018
+ ...buildOfferCard(settings, horizontalCard),
2019
+ dataSource,
2020
+ ...buildDiscountSection(settings.discount),
2021
+ ...buildBanner(settings.language)
2022
+ ],
2023
+ sectionType: "offers"
2024
+ };
2025
+ const display = {
2026
+ autoAdvanceInterval: 0,
2027
+ itemsAtOnce: layout?.carousel ? columns : settings.limit ?? columns,
2028
+ ...listLayout,
2029
+ sections: [offers],
2030
+ sectionType: "carousel"
2031
+ };
2032
+ return CABRootSection.parse({
2033
+ direction: "rows",
2034
+ editorMode: LOCATION_TO_EDITOR_MODE2[settings.location ?? "checkout"],
2035
+ // The widget name is required by the admin save schema; carry the legacy widget's name through.
2036
+ ...name && { name },
2037
+ previewMode: settings.previewMode,
2038
+ sections: [
2039
+ ...hasHeaderText(settings.language) ? [{ content: { en: convertContentBlockTextToV2(settings.language) }, sectionType: "text" }] : [],
2040
+ display
2041
+ ],
2042
+ tracking: {
2043
+ enableAttribution: settings.tracking?.enableAttribution ?? true,
2044
+ enableSource: settings.tracking?.enableSource ?? true,
2045
+ enableWidget: settings.tracking?.enableWidget ?? true
2046
+ },
2047
+ type: SHOPIFY_CHECKOUT_EXTENSION,
2048
+ version: 2,
2049
+ widgetId: id
2050
+ });
2051
+ };
2052
+
2053
+ // src/transforms/parseShielded.ts
2054
+ var parseShielded = (schema, raw, transform = (input) => input) => schema.parse(transform(convertNumericObjects(deepCamelCase(raw))));
2055
+
2056
+ // src/server/userConfig.ts
1459
2057
  var unwrapData = (body) => body && typeof body === "object" && "data" in body ? body.data : body;
2058
+ var isEmptyObject = (x) => x == null || typeof x === "object" && !Array.isArray(x) && Object.keys(x).length === 0;
2059
+ var isMissingShopPayload = (data) => {
2060
+ if (data == null || typeof data !== "object" || Array.isArray(data)) return true;
2061
+ return isEmptyObject(data.shop);
2062
+ };
2063
+ var fetchUserConfig = async (input, ctx) => {
2064
+ let upstream;
2065
+ try {
2066
+ upstream = await ctx.fetchUpstream("/api/v1/user/config", { shop: input.shop }, { host: ctx.host });
2067
+ } catch (err) {
2068
+ if (err instanceof UpstreamError && (err.status === 404 || err.status === 410)) {
2069
+ throw new NotFoundError(`Shop config not found: ${input.shop}`);
2070
+ }
2071
+ throw err;
2072
+ }
2073
+ const data = unwrapData(upstream);
2074
+ if (isMissingShopPayload(data)) throw new NotFoundError(`Shop config not found: ${input.shop}`);
2075
+ return parseShielded(UserConfig, data);
2076
+ };
2077
+
2078
+ // src/utilities.ts
2079
+ function serialize(obj) {
2080
+ const serialized = [];
2081
+ const add = (key, value) => {
2082
+ value = typeof value === "function" ? value() : value;
2083
+ value = value === null ? "" : value === void 0 ? "" : value;
2084
+ serialized[serialized.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
2085
+ };
2086
+ const buildParameters = (prefix, obj2) => {
2087
+ let i, key, len;
2088
+ if (prefix) {
2089
+ if (Array.isArray(obj2)) {
2090
+ for (i = 0, len = obj2.length; i < len; i++) {
2091
+ buildParameters(prefix + "[" + (typeof obj2[i] === "object" && obj2[i] ? i : "") + "]", obj2[i]);
2092
+ }
2093
+ } else if (Object.prototype.toString.call(obj2) === "[object Object]") {
2094
+ for (key in obj2) {
2095
+ buildParameters(prefix + "[" + key + "]", obj2[key]);
2096
+ }
2097
+ } else {
2098
+ add(prefix, obj2);
2099
+ }
2100
+ } else if (Array.isArray(obj2)) {
2101
+ for (i = 0, len = obj2.length; i < len; i++) {
2102
+ add(obj2[i].name, obj2[i].value);
2103
+ }
2104
+ } else {
2105
+ for (key in obj2) {
2106
+ buildParameters(key, obj2[key]);
2107
+ }
2108
+ }
2109
+ return serialized;
2110
+ };
2111
+ return buildParameters("", obj).join("&");
2112
+ }
2113
+
2114
+ // src/server/dataSourceResults.ts
2115
+ var encodeAttributes = (pairs = []) => encodeURIComponent(JSON.stringify(Object.fromEntries(pairs.map(({ key, value }) => [key, value ?? ""]))));
2116
+ var buildEngineParams = (input, key) => {
2117
+ const { cart, customerId, integrations, limit, productType, shop, visitorId } = input;
2118
+ const items = cart.items.map(({ productId, properties, quantity, subscriptionId, variantId }) => ({
2119
+ product_id: productId,
2120
+ properties: encodeAttributes(properties),
2121
+ quantity,
2122
+ ...subscriptionId && { subscription_id: subscriptionId },
2123
+ variant_id: variantId
2124
+ }));
2125
+ const itemCount = cart.items.reduce((total, { quantity }) => total + quantity, 0);
2126
+ const subtotal = cart.subtotal - (cart.discountTotal ?? 0);
2127
+ return {
2128
+ cart: {
2129
+ attributes: encodeAttributes(cart.attributes),
2130
+ /** `discount_code` rules match against this; React sends raw `useDiscountCodes()` as `[{code}]`. */
2131
+ ...cart.discountCodes?.length && { discount_codes: cart.discountCodes.map((code) => ({ code })) },
2132
+ item_count: itemCount,
2133
+ items,
2134
+ line_count: items.length,
2135
+ subtotal
2136
+ },
2137
+ cart_count: items.length,
2138
+ cart_item_count: itemCount,
2139
+ cart_line_count: items.length,
2140
+ cart_subtotal: subtotal,
2141
+ key,
2142
+ limit,
2143
+ metafields: Object.values(integrations ?? {}).some(Boolean) ? "yes" : "no",
2144
+ selling_plans: productType === "one-time" ? "no" : "yes",
2145
+ shop,
2146
+ ...customerId && { shopify_customer_id: customerId },
2147
+ shopify_product_ids: items.map(({ product_id: id }) => id).join(","),
2148
+ shopify_variant_ids: items.map(({ variant_id: id }) => id).join(","),
2149
+ ...visitorId && { uuid: visitorId }
2150
+ };
2151
+ };
2152
+ var dedupeById = (products) => {
2153
+ const seen = /* @__PURE__ */ new Set();
2154
+ return products.filter((product) => {
2155
+ const id = product.id;
2156
+ if (seen.has(id)) return false;
2157
+ seen.add(id);
2158
+ return true;
2159
+ });
2160
+ };
2161
+ var fetchDataSourceResults = async (input, ctx) => {
2162
+ const { shop } = await fetchUserConfig({ shop: input.shop }, ctx);
2163
+ let upstream;
2164
+ try {
2165
+ upstream = await ctx.fetchUpstream(
2166
+ `/api/v1${input.dataSourcePath}`,
2167
+ {},
2168
+ { host: ctx.host, search: serialize(buildEngineParams(input, shop.apiKey)) }
2169
+ );
2170
+ } catch (err) {
2171
+ if (err instanceof UpstreamError && (err.status === 404 || err.status === 410)) {
2172
+ throw new NotFoundError(`Data source not found: ${input.dataSourcePath}`);
2173
+ }
2174
+ throw err;
2175
+ }
2176
+ const raw = upstream && typeof upstream === "object" ? upstream : {};
2177
+ const products = Array.isArray(raw.data) ? deepCamelCase(raw.data) : [];
2178
+ return {
2179
+ metadata: raw.metadata == null ? null : deepCamelCase(raw.metadata),
2180
+ products: dedupeById(products)
2181
+ };
2182
+ };
2183
+
2184
+ // src/server/widgetSettings.ts
2185
+ var unwrapData2 = (body) => body && typeof body === "object" && "data" in body ? body.data : body;
1460
2186
  var isMissingUpstreamPayload = (data) => data == null || typeof data === "object" && !Array.isArray(data) && Object.keys(data).length === 0;
1461
2187
  var dispatchWidgetTransform = (id, normalized) => {
1462
2188
  if (isCABRootSection(normalized)) return CABRootSection.parse(normalizeTextContent(normalized));
1463
2189
  if (isContentBlockV1(normalized)) return convertContentBlockToV2({ id, settings: normalized });
1464
2190
  if (isLineItemEditorV1(normalized)) return convertLineItemEditorToV2({ id, settings: normalized });
2191
+ if (isOfferV1(normalized)) return convertOfferToV2({ id, name: normalized.name, settings: normalized });
1465
2192
  return normalized;
1466
2193
  };
1467
2194
  var convertWidgetSettings = async (input, ctx) => {
@@ -1477,7 +2204,7 @@ var convertWidgetSettings = async (input, ctx) => {
1477
2204
  }
1478
2205
  throw err;
1479
2206
  }
1480
- const data = unwrapData(upstream);
2207
+ const data = unwrapData2(upstream);
1481
2208
  if (isMissingUpstreamPayload(data)) throw new NotFoundError(`Widget not found: ${input.id}`);
1482
2209
  return dispatchWidgetTransform(input.id, convertNumericObjects(deepCamelCase(data)));
1483
2210
  };