@rebuy/rebuy 2.28.0 → 2.29.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/index.js +75 -15
  2. package/dist/index.js.map +2 -2
  3. package/dist/index.mjs +75 -15
  4. package/dist/index.mjs.map +2 -2
  5. package/dist/pricing/amountToCents.d.ts +10 -0
  6. package/dist/pricing/amountToCents.d.ts.map +1 -0
  7. package/dist/pricing/computeCompareAtPrice.d.ts +10 -0
  8. package/dist/pricing/computeCompareAtPrice.d.ts.map +1 -0
  9. package/dist/pricing/computeDisplayPrice.d.ts +17 -0
  10. package/dist/pricing/computeDisplayPrice.d.ts.map +1 -0
  11. package/dist/pricing/currencyDecimals.d.ts +12 -0
  12. package/dist/pricing/currencyDecimals.d.ts.map +1 -0
  13. package/dist/pricing/index.d.ts +7 -0
  14. package/dist/pricing/index.d.ts.map +1 -0
  15. package/dist/pricing/index.js +109 -0
  16. package/dist/pricing/index.js.map +7 -0
  17. package/dist/pricing/index.mjs +86 -0
  18. package/dist/pricing/index.mjs.map +7 -0
  19. package/dist/pricing/priceVariant.d.ts +10 -0
  20. package/dist/pricing/priceVariant.d.ts.map +1 -0
  21. package/dist/pricing/types.d.ts +30 -0
  22. package/dist/pricing/types.d.ts.map +1 -0
  23. package/dist/schema/checkout-and-beyond/constants.js +3 -2
  24. package/dist/schema/checkout-and-beyond/constants.js.map +2 -2
  25. package/dist/schema/checkout-and-beyond/constants.mjs +3 -2
  26. package/dist/schema/checkout-and-beyond/constants.mjs.map +2 -2
  27. package/dist/schema/checkout-and-beyond/index.js +35 -4
  28. package/dist/schema/checkout-and-beyond/index.js.map +2 -2
  29. package/dist/schema/checkout-and-beyond/index.mjs +35 -4
  30. package/dist/schema/checkout-and-beyond/index.mjs.map +2 -2
  31. package/dist/schema/widget-data.js +7 -4
  32. package/dist/schema/widget-data.js.map +2 -2
  33. package/dist/schema/widget-data.mjs +7 -4
  34. package/dist/schema/widget-data.mjs.map +2 -2
  35. package/dist/schema/widgetData.d.ts +6 -3
  36. package/dist/schema/widgetData.d.ts.map +1 -1
  37. package/dist/schema/widgets/checkout-and-beyond/banner.d.ts +2 -1
  38. package/dist/schema/widgets/checkout-and-beyond/banner.d.ts.map +1 -1
  39. package/dist/schema/widgets/checkout-and-beyond/button.d.ts +1 -1
  40. package/dist/schema/widgets/checkout-and-beyond/carousel.d.ts +2 -1
  41. package/dist/schema/widgets/checkout-and-beyond/carousel.d.ts.map +1 -1
  42. package/dist/schema/widgets/checkout-and-beyond/cartLine.d.ts +2 -1
  43. package/dist/schema/widgets/checkout-and-beyond/cartLine.d.ts.map +1 -1
  44. package/dist/schema/widgets/checkout-and-beyond/common.d.ts +5 -4
  45. package/dist/schema/widgets/checkout-and-beyond/common.d.ts.map +1 -1
  46. package/dist/schema/widgets/checkout-and-beyond/dataSource.d.ts +1 -0
  47. package/dist/schema/widgets/checkout-and-beyond/dataSource.d.ts.map +1 -1
  48. package/dist/schema/widgets/checkout-and-beyond/image.d.ts +2 -1
  49. package/dist/schema/widgets/checkout-and-beyond/image.d.ts.map +1 -1
  50. package/dist/schema/widgets/checkout-and-beyond/layout.d.ts +2 -1
  51. package/dist/schema/widgets/checkout-and-beyond/layout.d.ts.map +1 -1
  52. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts +28 -0
  53. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts.map +1 -1
  54. package/dist/schema/widgets/checkout-and-beyond/offers.d.ts +2 -1
  55. package/dist/schema/widgets/checkout-and-beyond/offers.d.ts.map +1 -1
  56. package/dist/schema/widgets/checkout-and-beyond/progressBar.d.ts +2 -1
  57. package/dist/schema/widgets/checkout-and-beyond/progressBar.d.ts.map +1 -1
  58. package/dist/schema/widgets/checkout-and-beyond/regex.d.ts +13 -1
  59. package/dist/schema/widgets/checkout-and-beyond/regex.d.ts.map +1 -1
  60. package/dist/schema/widgets/checkout-and-beyond/root.d.ts +2 -1
  61. package/dist/schema/widgets/checkout-and-beyond/root.d.ts.map +1 -1
  62. package/dist/schema/widgets/checkout-and-beyond/text.d.ts +2 -1
  63. package/dist/schema/widgets/checkout-and-beyond/text.d.ts.map +1 -1
  64. package/dist/schema/widgets/checkout-and-beyond/utils.d.ts.map +1 -1
  65. package/dist/schema/widgets/contentBlock.d.ts +2 -1
  66. package/dist/schema/widgets/contentBlock.d.ts.map +1 -1
  67. package/dist/schema/widgets/lineItemEditor.d.ts +2 -1
  68. package/dist/schema/widgets/lineItemEditor.d.ts.map +1 -1
  69. package/dist/schema/widgets/rebuyButton.d.ts +2 -1
  70. package/dist/schema/widgets/rebuyButton.d.ts.map +1 -1
  71. package/dist/server/dataSourceResults.d.ts.map +1 -1
  72. package/dist/server/index.js +70 -23
  73. package/dist/server/index.js.map +3 -3
  74. package/dist/server/index.mjs +70 -23
  75. package/dist/server/index.mjs.map +3 -3
  76. package/dist/transforms/index.js +247 -187
  77. package/dist/transforms/index.js.map +3 -3
  78. package/dist/transforms/index.mjs +247 -187
  79. package/dist/transforms/index.mjs.map +3 -3
  80. package/dist/transforms/offerV1/convertOfferToV2.d.ts.map +1 -1
  81. package/dist/transforms/offerV1/offerCard.d.ts.map +1 -1
  82. package/dist/transforms/offerV1/offerTemplateSeed.d.ts +100 -3
  83. package/dist/transforms/offerV1/offerTemplateSeed.d.ts.map +1 -1
  84. package/dist/transforms/offerV1/types.d.ts +4 -1
  85. package/dist/transforms/offerV1/types.d.ts.map +1 -1
  86. package/package.json +6 -1
package/dist/index.js CHANGED
@@ -1323,7 +1323,7 @@ var buttonActions = [
1323
1323
  "goToNextPage",
1324
1324
  "goToPrevPage",
1325
1325
  "goToURL",
1326
- "removeFromCart",
1326
+ "removeFromOrder",
1327
1327
  "selectVariant",
1328
1328
  "showPagination",
1329
1329
  "switchToSubscription",
@@ -1344,7 +1344,8 @@ var buttonFields = [
1344
1344
  "payNow",
1345
1345
  "progressReached",
1346
1346
  "progressRemaining",
1347
- "removeFromCart",
1347
+ "redirectToCheckout",
1348
+ "removeFromOrder",
1348
1349
  "showVariant",
1349
1350
  "showVariants",
1350
1351
  "soldOut",
@@ -1640,7 +1641,7 @@ var import_v49 = require("zod/v4");
1640
1641
  var ARRAY_INDEX_STRING = /^(0|[1-9]\d*)$/;
1641
1642
  var DYNAMIC_TOKEN_REGEX = /^\{\{\s*[A-Za-z]+\s*\}\}$/;
1642
1643
  var HEX_COLOR_REGEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
1643
- var HTML_TAGS_REGEX = /<\/?[^>]+>/g;
1644
+ var HTML_TAGS_REGEX = /<\/?[a-zA-Z][^>]*>/g;
1644
1645
 
1645
1646
  // src/schema/widgets/checkout-and-beyond/utils.ts
1646
1647
  var import_es_toolkit2 = require("es-toolkit");
@@ -1652,7 +1653,7 @@ var isHTML = (html = "") => {
1652
1653
  const hasHTML = (nodeList) => Array.from(nodeList).some((node) => node.nodeType === 1);
1653
1654
  return hasHTML(doc.body.childNodes) || hasHTML(doc.head.childNodes);
1654
1655
  }
1655
- return HTML_TAGS_REGEX.test(html);
1656
+ return html.search(HTML_TAGS_REGEX) !== -1;
1656
1657
  };
1657
1658
  var hasHTMLInDoc = (doc) => doc.content.some(({ content = [] }) => content.some(({ text }) => isHTML(text)));
1658
1659
  var checkForHTML = (input) => !((0, import_compat.isString)(input) && isHTML(input) || (0, import_es_toolkit2.isPlainObject)(input) && hasHTMLInDoc(input));
@@ -1862,6 +1863,8 @@ var CABDataSourceSection = import_v412.z.object({
1862
1863
  productType: import_v412.z.enum(productTypes).optional(),
1863
1864
  sectionId: import_v412.z.uuid().default(() => (0, import_uuid4.v7)()),
1864
1865
  sectionType: import_v412.z.literal(SectionType.dataSource).default(SectionType.dataSource),
1866
+ /** Default subscribe-vs-one-time for `productType: both` (legacy `subscription_is_default`). */
1867
+ subscriptionIsDefault: import_v412.z.boolean().default(false),
1865
1868
  treatAsGwp: import_v412.z.boolean().default(false)
1866
1869
  });
1867
1870
 
@@ -2344,6 +2347,34 @@ var OFFER_LABELS = {
2344
2347
  vi: "\u0110ang th\xEAm...",
2345
2348
  zh: "\u6B63\u5728\u6DFB\u52A0..."
2346
2349
  },
2350
+ redirectToCheckout: {
2351
+ ar: "\u0627\u0644\u062F\u0641\u0639",
2352
+ cs: "Pokladna",
2353
+ da: "Til kassen",
2354
+ de: "Zur Kasse",
2355
+ en: "Checkout",
2356
+ es: "Finalizar compra",
2357
+ fi: "Kassalle",
2358
+ fr: "Paiement",
2359
+ ga: "Seice\xE1il amach",
2360
+ he: "\u05DC\u05EA\u05E9\u05DC\u05D5\u05DD",
2361
+ hi: "\u091A\u0947\u0915\u0906\u0909\u091F",
2362
+ id: "Checkout",
2363
+ it: "Cassa",
2364
+ ja: "\u30C1\u30A7\u30C3\u30AF\u30A2\u30A6\u30C8",
2365
+ ko: "\uACB0\uC81C\uD558\uAE30",
2366
+ nl: "Afrekenen",
2367
+ no: "Til kassen",
2368
+ pl: "Do kasy",
2369
+ pt: "Finalizar compra",
2370
+ ru: "\u041E\u0444\u043E\u0440\u043C\u0438\u0442\u044C \u0437\u0430\u043A\u0430\u0437",
2371
+ sv: "Till kassan",
2372
+ th: "\u0E0A\u0E33\u0E23\u0E30\u0E40\u0E07\u0E34\u0E19",
2373
+ tr: "\xD6deme",
2374
+ uk: "\u041E\u0444\u043E\u0440\u043C\u0438\u0442\u0438 \u0437\u0430\u043C\u043E\u0432\u043B\u0435\u043D\u043D\u044F",
2375
+ vi: "Thanh to\xE1n",
2376
+ zh: "\u7ED3\u8D26"
2377
+ },
2347
2378
  soldOut: {
2348
2379
  ar: "\u0646\u0641\u062F\u062A \u0627\u0644\u0643\u0645\u064A\u0629",
2349
2380
  cs: "Vyprod\xE1no",
@@ -3300,6 +3331,21 @@ var OFFER_TEMPLATE_SEED = {
3300
3331
  zh: "\u52A0\u5165\u8D2D\u7269\u8F66"
3301
3332
  },
3302
3333
  sectionType: "text"
3334
+ },
3335
+ {
3336
+ buttonField: "addedToCart",
3337
+ content: OFFER_LABELS.addedToCart,
3338
+ sectionType: "text"
3339
+ },
3340
+ {
3341
+ buttonField: "soldOut",
3342
+ content: OFFER_LABELS.soldOut,
3343
+ sectionType: "text"
3344
+ },
3345
+ {
3346
+ buttonField: "redirectToCheckout",
3347
+ content: OFFER_LABELS.redirectToCheckout,
3348
+ sectionType: "text"
3303
3349
  }
3304
3350
  ],
3305
3351
  sectionType: "button"
@@ -3398,7 +3444,7 @@ var buildOfferTemplate = ({ location: location2, name } = {}) => CABRootSection.
3398
3444
  // src/transforms/offerV1/offerCard.ts
3399
3445
  var VARIANT_SELECTOR = { button: "button", radio: "radio", select: "menu" };
3400
3446
  var localizedContent = (defaults, override) => {
3401
- const trimmed = override?.trim();
3447
+ const trimmed = stripContentBlockHtml(override ?? "").trim();
3402
3448
  return trimmed ? { ...defaults, en: trimmed } : defaults;
3403
3449
  };
3404
3450
  var buildStyledText = (token, style, color = "base") => {
@@ -3466,6 +3512,7 @@ var buildDescription = (settings) => {
3466
3512
  return [{ content: { en: buildStyledText("{{productDescription}}", void 0) }, sectionType: "text" }];
3467
3513
  };
3468
3514
  var buildVariants = (settings) => {
3515
+ if (settings.viewOptions?.displayActions === false) return [];
3469
3516
  if (settings.productOptions?.showVariantOptions === "never") return [];
3470
3517
  const selector = settings.viewOptions?.variantSelector;
3471
3518
  return [
@@ -3492,12 +3539,14 @@ var buildQuantity = (settings) => {
3492
3539
  const quantity = settings.quantityInputs;
3493
3540
  if (!quantity?.enabled) return [];
3494
3541
  const inputType = quantity.type ? QUANTITY_INPUT_TYPE[quantity.type] : void 0;
3542
+ const max = Math.min(Math.max(quantity.maxValue ?? 10, 1), 100);
3543
+ const min = Math.min(Math.max(quantity.minValue ?? 1, 1), max);
3495
3544
  return [
3496
3545
  {
3497
3546
  ...buildQuantityErrors(quantity),
3498
3547
  ...inputType && { inputType },
3499
- max: quantity.maxValue ?? 10,
3500
- min: quantity.minValue ?? 1,
3548
+ max,
3549
+ min,
3501
3550
  sectionType: "quantity"
3502
3551
  }
3503
3552
  ];
@@ -3539,7 +3588,9 @@ var buildAddButton = (settings) => {
3539
3588
  slot("addToCart", settings.language?.addToCart),
3540
3589
  slot("addingToCart", settings.language?.addingToCart),
3541
3590
  slot("addedToCart", settings.language?.addedToCart),
3542
- slot("soldOut", settings.language?.soldOutLabel)
3591
+ slot("soldOut", settings.language?.soldOutLabel),
3592
+ // Off-checkout Buy Now: the label the button shows once it links to the created checkout.
3593
+ slot("redirectToCheckout", settings.language?.redirectToCheckout)
3543
3594
  ],
3544
3595
  sectionType: "button"
3545
3596
  };
@@ -3621,23 +3672,29 @@ var buildDiscountSection = (discount) => {
3621
3672
  }
3622
3673
  ];
3623
3674
  };
3675
+ var bannerMessageContent = (message) => {
3676
+ const sanitized = typeof message === "string" ? stripContentBlockHtml(message) : message;
3677
+ return sanitized ? { ...OFFER_LABELS.addedToCartMessage, en: sanitized } : OFFER_LABELS.addedToCartMessage;
3678
+ };
3624
3679
  var buildBanner = (language) => language?.successBannerEnabled ? [
3625
3680
  {
3626
3681
  color: "success",
3627
3682
  dismissible: true,
3628
3683
  sections: [
3629
3684
  {
3630
- /**
3631
- * A defined v1 message (RTE doc or string) passes through verbatim as `en`;
3632
- * absent falls back to the localized defaults (P4 language policy).
3633
- */
3634
- content: language.successBannerMessageRte ? { ...OFFER_LABELS.addedToCartMessage, en: language.successBannerMessageRte } : OFFER_LABELS.addedToCartMessage,
3685
+ content: bannerMessageContent(language.successBannerMessageRte),
3635
3686
  sectionType: "text"
3636
3687
  },
3637
3688
  {
3638
3689
  action: "undoAddToOrder",
3639
3690
  buttonStyle: "plain",
3640
- sections: [{ buttonField: "buttonLabel", content: OFFER_LABELS.undo, sectionType: "text" }],
3691
+ /**
3692
+ * Tagged `undoAddToOrder`, never `buttonLabel` — the renderers (React CAB and
3693
+ * the Preact extension) and the schema's default offers tree resolve that slot.
3694
+ */
3695
+ sections: [
3696
+ { buttonField: "undoAddToOrder", content: OFFER_LABELS.undo, sectionType: "text" }
3697
+ ],
3641
3698
  sectionType: "button"
3642
3699
  }
3643
3700
  ],
@@ -3658,6 +3715,7 @@ var convertOfferToV2 = ({ id, name, settings }) => {
3658
3715
  matchVariantOutOfStock: !!settings.productOptions?.matchVariantOutOfStock,
3659
3716
  ...settings.productType && { productType: settings.productType },
3660
3717
  sectionType: "dataSource",
3718
+ ...settings.subscriptionIsDefault && { subscriptionIsDefault: true },
3661
3719
  ...settings.treatAsGwp && { treatAsGwp: true }
3662
3720
  };
3663
3721
  const offers = {
@@ -3671,7 +3729,9 @@ var convertOfferToV2 = ({ id, name, settings }) => {
3671
3729
  };
3672
3730
  const display = {
3673
3731
  autoAdvanceInterval: 0,
3674
- itemsAtOnce: layout?.carousel ? columns : settings.limit ?? columns,
3732
+ // `itemsAtOnce` feeds the carousel schema's `.min(1)`; a legacy `columns`/`limit` of 0 would
3733
+ // otherwise throw at parse, so floor it at 1 (the carousel still shows a product per page).
3734
+ itemsAtOnce: Math.max(layout?.carousel ? columns : settings.limit ?? columns, 1),
3675
3735
  ...listLayout,
3676
3736
  sections: [offers],
3677
3737
  sectionType: "carousel"