@rebuy/rebuy 2.29.0 → 2.30.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/dist/gwp/getValidGwpProductIds.d.ts +8 -0
  2. package/dist/gwp/getValidGwpProductIds.d.ts.map +1 -0
  3. package/dist/gwp/hasUnsupportedRuleTypes.d.ts +7 -0
  4. package/dist/gwp/hasUnsupportedRuleTypes.d.ts.map +1 -0
  5. package/dist/gwp/index.d.ts +6 -0
  6. package/dist/gwp/index.d.ts.map +1 -0
  7. package/dist/gwp/index.js +47 -0
  8. package/dist/gwp/index.js.map +7 -0
  9. package/dist/gwp/index.mjs +24 -0
  10. package/dist/gwp/index.mjs.map +7 -0
  11. package/dist/gwp/isDefinitiveRuleAnswer.d.ts +10 -0
  12. package/dist/gwp/isDefinitiveRuleAnswer.d.ts.map +1 -0
  13. package/dist/gwp/shouldRemoveGift.d.ts +9 -0
  14. package/dist/gwp/shouldRemoveGift.d.ts.map +1 -0
  15. package/dist/gwp/types.d.ts +35 -0
  16. package/dist/gwp/types.d.ts.map +1 -0
  17. package/dist/index.js +1460 -880
  18. package/dist/index.js.map +4 -4
  19. package/dist/index.mjs +1459 -879
  20. package/dist/index.mjs.map +4 -4
  21. package/dist/pricing/amountToCents.d.ts +10 -0
  22. package/dist/pricing/amountToCents.d.ts.map +1 -0
  23. package/dist/pricing/computeCompareAtPrice.d.ts +10 -0
  24. package/dist/pricing/computeCompareAtPrice.d.ts.map +1 -0
  25. package/dist/pricing/computeDisplayPrice.d.ts +26 -0
  26. package/dist/pricing/computeDisplayPrice.d.ts.map +1 -0
  27. package/dist/pricing/currencyDecimals.d.ts +12 -0
  28. package/dist/pricing/currencyDecimals.d.ts.map +1 -0
  29. package/dist/pricing/index.d.ts +7 -0
  30. package/dist/pricing/index.d.ts.map +1 -0
  31. package/dist/pricing/index.js +128 -0
  32. package/dist/pricing/index.js.map +7 -0
  33. package/dist/pricing/index.mjs +105 -0
  34. package/dist/pricing/index.mjs.map +7 -0
  35. package/dist/pricing/priceVariant.d.ts +10 -0
  36. package/dist/pricing/priceVariant.d.ts.map +1 -0
  37. package/dist/pricing/types.d.ts +42 -0
  38. package/dist/pricing/types.d.ts.map +1 -0
  39. package/dist/schema/cabShopConfig.d.ts +131 -0
  40. package/dist/schema/cabShopConfig.d.ts.map +1 -0
  41. package/dist/schema/checkout-and-beyond/constants.js +5 -0
  42. package/dist/schema/checkout-and-beyond/constants.js.map +2 -2
  43. package/dist/schema/checkout-and-beyond/constants.mjs +5 -0
  44. package/dist/schema/checkout-and-beyond/constants.mjs.map +2 -2
  45. package/dist/schema/checkout-and-beyond/index.js +430 -50
  46. package/dist/schema/checkout-and-beyond/index.js.map +4 -4
  47. package/dist/schema/checkout-and-beyond/index.mjs +430 -50
  48. package/dist/schema/checkout-and-beyond/index.mjs.map +4 -4
  49. package/dist/schema/index.d.ts +2 -0
  50. package/dist/schema/index.d.ts.map +1 -1
  51. package/dist/schema/metadata.d.ts +12 -0
  52. package/dist/schema/metadata.d.ts.map +1 -1
  53. package/dist/schema/offerProduct.d.ts +58 -0
  54. package/dist/schema/offerProduct.d.ts.map +1 -0
  55. package/dist/schema/smartCart.d.ts +263 -0
  56. package/dist/schema/smartCart.d.ts.map +1 -0
  57. package/dist/schema/user-config.js +78 -4
  58. package/dist/schema/user-config.js.map +4 -4
  59. package/dist/schema/user-config.mjs +78 -4
  60. package/dist/schema/user-config.mjs.map +4 -4
  61. package/dist/schema/userConfig.d.ts +63 -1
  62. package/dist/schema/userConfig.d.ts.map +1 -1
  63. package/dist/schema/widget-data.js +363 -21
  64. package/dist/schema/widget-data.js.map +4 -4
  65. package/dist/schema/widget-data.mjs +363 -21
  66. package/dist/schema/widget-data.mjs.map +4 -4
  67. package/dist/schema/widgetData.d.ts +54 -0
  68. package/dist/schema/widgetData.d.ts.map +1 -1
  69. package/dist/schema/widgets/checkout-and-beyond/banner.d.ts +1 -0
  70. package/dist/schema/widgets/checkout-and-beyond/banner.d.ts.map +1 -1
  71. package/dist/schema/widgets/checkout-and-beyond/carousel.d.ts +1 -0
  72. package/dist/schema/widgets/checkout-and-beyond/carousel.d.ts.map +1 -1
  73. package/dist/schema/widgets/checkout-and-beyond/cartLine.d.ts +1 -0
  74. package/dist/schema/widgets/checkout-and-beyond/cartLine.d.ts.map +1 -1
  75. package/dist/schema/widgets/checkout-and-beyond/common.d.ts +10 -3
  76. package/dist/schema/widgets/checkout-and-beyond/common.d.ts.map +1 -1
  77. package/dist/schema/widgets/checkout-and-beyond/dataSource.d.ts +1 -0
  78. package/dist/schema/widgets/checkout-and-beyond/dataSource.d.ts.map +1 -1
  79. package/dist/schema/widgets/checkout-and-beyond/giftLabels.d.ts +121 -0
  80. package/dist/schema/widgets/checkout-and-beyond/giftLabels.d.ts.map +1 -0
  81. package/dist/schema/widgets/checkout-and-beyond/image.d.ts +1 -0
  82. package/dist/schema/widgets/checkout-and-beyond/image.d.ts.map +1 -1
  83. package/dist/schema/widgets/checkout-and-beyond/index.d.ts +3 -0
  84. package/dist/schema/widgets/checkout-and-beyond/index.d.ts.map +1 -1
  85. package/dist/schema/widgets/checkout-and-beyond/layout.d.ts +1 -0
  86. package/dist/schema/widgets/checkout-and-beyond/layout.d.ts.map +1 -1
  87. package/dist/schema/widgets/checkout-and-beyond/monetize.d.ts +1 -0
  88. package/dist/schema/widgets/checkout-and-beyond/monetize.d.ts.map +1 -1
  89. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts +57 -29
  90. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts.map +1 -1
  91. package/dist/schema/widgets/checkout-and-beyond/offers.d.ts +1 -0
  92. package/dist/schema/widgets/checkout-and-beyond/offers.d.ts.map +1 -1
  93. package/dist/schema/widgets/checkout-and-beyond/progressBar.d.ts +174 -128
  94. package/dist/schema/widgets/checkout-and-beyond/progressBar.d.ts.map +1 -1
  95. package/dist/schema/widgets/checkout-and-beyond/quantity.d.ts +1 -0
  96. package/dist/schema/widgets/checkout-and-beyond/quantity.d.ts.map +1 -1
  97. package/dist/schema/widgets/checkout-and-beyond/regex.d.ts +13 -1
  98. package/dist/schema/widgets/checkout-and-beyond/regex.d.ts.map +1 -1
  99. package/dist/schema/widgets/checkout-and-beyond/reviewLabels.d.ts +66 -0
  100. package/dist/schema/widgets/checkout-and-beyond/reviewLabels.d.ts.map +1 -0
  101. package/dist/schema/widgets/checkout-and-beyond/reviews.d.ts +4 -0
  102. package/dist/schema/widgets/checkout-and-beyond/reviews.d.ts.map +1 -1
  103. package/dist/schema/widgets/checkout-and-beyond/root.d.ts +51 -0
  104. package/dist/schema/widgets/checkout-and-beyond/root.d.ts.map +1 -1
  105. package/dist/schema/widgets/checkout-and-beyond/text.d.ts +10 -2
  106. package/dist/schema/widgets/checkout-and-beyond/text.d.ts.map +1 -1
  107. package/dist/schema/widgets/checkout-and-beyond/uiLabels.d.ts +41 -0
  108. package/dist/schema/widgets/checkout-and-beyond/uiLabels.d.ts.map +1 -0
  109. package/dist/schema/widgets/checkout-and-beyond/utils.d.ts.map +1 -1
  110. package/dist/schema/widgets/contentBlock.d.ts +18 -0
  111. package/dist/schema/widgets/contentBlock.d.ts.map +1 -1
  112. package/dist/schema/widgets/lineItemEditor.d.ts +18 -0
  113. package/dist/schema/widgets/lineItemEditor.d.ts.map +1 -1
  114. package/dist/schema/widgets/rebuyButton.d.ts +18 -0
  115. package/dist/schema/widgets/rebuyButton.d.ts.map +1 -1
  116. package/dist/server/adsEngine.d.ts +38 -0
  117. package/dist/server/adsEngine.d.ts.map +1 -0
  118. package/dist/server/analytics.d.ts +91 -0
  119. package/dist/server/analytics.d.ts.map +1 -0
  120. package/dist/server/composeOffer.d.ts +19 -0
  121. package/dist/server/composeOffer.d.ts.map +1 -0
  122. package/dist/server/dataSourceResults.d.ts.map +1 -1
  123. package/dist/server/giftValidation.d.ts +13 -0
  124. package/dist/server/giftValidation.d.ts.map +1 -0
  125. package/dist/server/index.d.ts +4 -1
  126. package/dist/server/index.d.ts.map +1 -1
  127. package/dist/server/index.js +1853 -455
  128. package/dist/server/index.js.map +4 -4
  129. package/dist/server/index.mjs +1846 -448
  130. package/dist/server/index.mjs.map +4 -4
  131. package/dist/server/monetizeOffers.d.ts +14 -0
  132. package/dist/server/monetizeOffers.d.ts.map +1 -0
  133. package/dist/server/salvageSections.d.ts +17 -0
  134. package/dist/server/salvageSections.d.ts.map +1 -0
  135. package/dist/server/shared.d.ts +58 -0
  136. package/dist/server/shared.d.ts.map +1 -1
  137. package/dist/server/userConfig.d.ts +2 -2
  138. package/dist/server/userConfig.d.ts.map +1 -1
  139. package/dist/server/widgetSettings.d.ts +4 -2
  140. package/dist/server/widgetSettings.d.ts.map +1 -1
  141. package/dist/transforms/experiments/resolveExperiment.d.ts +20 -0
  142. package/dist/transforms/experiments/resolveExperiment.d.ts.map +1 -0
  143. package/dist/transforms/index.d.ts +5 -0
  144. package/dist/transforms/index.d.ts.map +1 -1
  145. package/dist/transforms/index.js +973 -227
  146. package/dist/transforms/index.js.map +4 -4
  147. package/dist/transforms/index.mjs +973 -227
  148. package/dist/transforms/index.mjs.map +4 -4
  149. package/dist/transforms/lineItemEditorV1/convertLineItemEditorToV2.d.ts.map +1 -1
  150. package/dist/transforms/localizedContent.d.ts +10 -0
  151. package/dist/transforms/localizedContent.d.ts.map +1 -0
  152. package/dist/transforms/normalizeTokens.d.ts.map +1 -1
  153. package/dist/transforms/offerV1/convertOfferToV2.d.ts +4 -3
  154. package/dist/transforms/offerV1/convertOfferToV2.d.ts.map +1 -1
  155. package/dist/transforms/offerV1/offerCard.d.ts.map +1 -1
  156. package/dist/transforms/offerV1/offerTemplateSeed.d.ts +100 -3
  157. package/dist/transforms/offerV1/offerTemplateSeed.d.ts.map +1 -1
  158. package/dist/transforms/offerV1/types.d.ts +6 -2
  159. package/dist/transforms/offerV1/types.d.ts.map +1 -1
  160. package/dist/transforms/progressBarV1/convertProgressBarToV2.d.ts +24 -0
  161. package/dist/transforms/progressBarV1/convertProgressBarToV2.d.ts.map +1 -0
  162. package/dist/transforms/progressBarV1/types.d.ts +44 -0
  163. package/dist/transforms/progressBarV1/types.d.ts.map +1 -0
  164. package/dist/transforms/smartCart/convertSmartCartProgressBarToV2.d.ts +20 -0
  165. package/dist/transforms/smartCart/convertSmartCartProgressBarToV2.d.ts.map +1 -0
  166. package/dist/transforms/smartCart/extractSmartCartBars.d.ts +15 -0
  167. package/dist/transforms/smartCart/extractSmartCartBars.d.ts.map +1 -0
  168. package/package.json +11 -1
@@ -0,0 +1,8 @@
1
+ import { type MatchedRule } from '../gwp/types';
2
+ /**
3
+ * The product ids a widget's matched rules currently qualify — ported from the React
4
+ * extension's `getValidGwpProductIds` (camelCased engine shape). A gift whose product is
5
+ * not in this set no longer qualifies and should be removed.
6
+ */
7
+ export declare const getValidGwpProductIds: (matchedRules?: MatchedRule[]) => Set<number>;
8
+ //# sourceMappingURL=getValidGwpProductIds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getValidGwpProductIds.d.ts","sourceRoot":"","sources":["../../src/gwp/getValidGwpProductIds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,eAAc,WAAW,EAAO,KAAG,GAAG,CAAC,MAAM,CAO9E,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type GwpMetadata } from '../gwp/types';
2
+ /**
3
+ * Whether any matched OR unmatched rule uses an unsupported type — the bail signal: the gift's
4
+ * qualification can't be trusted, so keep it (never remove on uncertainty).
5
+ */
6
+ export declare const hasUnsupportedRuleTypes: (metadata?: GwpMetadata | null) => boolean;
7
+ //# sourceMappingURL=hasUnsupportedRuleTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasUnsupportedRuleTypes.d.ts","sourceRoot":"","sources":["../../src/gwp/hasUnsupportedRuleTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAoB,MAAM,aAAa,CAAC;AAcjE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,WAAW,WAAW,GAAG,IAAI,KAAG,OACiC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from '../gwp/getValidGwpProductIds';
2
+ export * from '../gwp/hasUnsupportedRuleTypes';
3
+ export * from '../gwp/isDefinitiveRuleAnswer';
4
+ export * from '../gwp/shouldRemoveGift';
5
+ export * from '../gwp/types';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gwp/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/gwp/index.ts
21
+ var gwp_exports = {};
22
+ __export(gwp_exports, {
23
+ getValidGwpProductIds: () => getValidGwpProductIds,
24
+ hasUnsupportedRuleTypes: () => hasUnsupportedRuleTypes,
25
+ isDefinitiveRuleAnswer: () => isDefinitiveRuleAnswer,
26
+ shouldRemoveGift: () => shouldRemoveGift
27
+ });
28
+ module.exports = __toCommonJS(gwp_exports);
29
+
30
+ // src/gwp/getValidGwpProductIds.ts
31
+ var getValidGwpProductIds = (matchedRules = []) => new Set(
32
+ matchedRules.flatMap((rule) => rule.output ?? []).flatMap((output) => output.products ?? []).map((product) => Number(product.productId)).filter((id) => Number.isFinite(id))
33
+ );
34
+
35
+ // src/gwp/hasUnsupportedRuleTypes.ts
36
+ var UNSUPPORTED_RULE_TYPES = ["url", "order_tag"];
37
+ var ruleHasUnsupportedType = (rule) => (rule.logic ?? []).some(
38
+ (group) => (group.rules ?? []).some((item) => UNSUPPORTED_RULE_TYPES.includes(item.type ?? ""))
39
+ );
40
+ var hasUnsupportedRuleTypes = (metadata) => [...metadata?.matchedRules ?? [], ...metadata?.unmatchedRules ?? []].some(ruleHasUnsupportedType);
41
+
42
+ // src/gwp/isDefinitiveRuleAnswer.ts
43
+ var isDefinitiveRuleAnswer = (metadata) => metadata != null && (metadata.matchedRules != null || metadata.unmatchedRules != null);
44
+
45
+ // src/gwp/shouldRemoveGift.ts
46
+ var shouldRemoveGift = (gift, validIds) => !validIds.has(gift.productId) || !gift.discounted && gift.cost > 0;
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/gwp/index.ts", "../../src/gwp/getValidGwpProductIds.ts", "../../src/gwp/hasUnsupportedRuleTypes.ts", "../../src/gwp/isDefinitiveRuleAnswer.ts", "../../src/gwp/shouldRemoveGift.ts"],
4
+ "sourcesContent": ["export * from '~/gwp/getValidGwpProductIds';\nexport * from '~/gwp/hasUnsupportedRuleTypes';\nexport * from '~/gwp/isDefinitiveRuleAnswer';\nexport * from '~/gwp/shouldRemoveGift';\nexport * from '~/gwp/types';\n", "import { type MatchedRule } from '~/gwp/types';\n\n/**\n * The product ids a widget's matched rules currently qualify \u2014 ported from the React\n * extension's `getValidGwpProductIds` (camelCased engine shape). A gift whose product is\n * not in this set no longer qualifies and should be removed.\n */\nexport const getValidGwpProductIds = (matchedRules: MatchedRule[] = []): Set<number> =>\n new Set(\n matchedRules\n .flatMap((rule) => rule.output ?? [])\n .flatMap((output) => output.products ?? [])\n .map((product) => Number(product.productId))\n .filter((id) => Number.isFinite(id))\n );\n", "import { type GwpMetadata, type MatchedRule } from '~/gwp/types';\n\n/**\n * Rule types the engine can't evaluate correctly in the cart/data-source context (no page URL,\n * no order) \u2014 ported from the React extension. When a widget's rules use these, the matched output\n * is unreliable, so the validator must NOT remove the gift.\n */\nconst UNSUPPORTED_RULE_TYPES = ['url', 'order_tag'];\n\nconst ruleHasUnsupportedType = (rule: MatchedRule): boolean =>\n (rule.logic ?? []).some((group) =>\n (group.rules ?? []).some((item) => UNSUPPORTED_RULE_TYPES.includes(item.type ?? ''))\n );\n\n/**\n * Whether any matched OR unmatched rule uses an unsupported type \u2014 the bail signal: the gift's\n * qualification can't be trusted, so keep it (never remove on uncertainty).\n */\nexport const hasUnsupportedRuleTypes = (metadata?: GwpMetadata | null): boolean =>\n [...(metadata?.matchedRules ?? []), ...(metadata?.unmatchedRules ?? [])].some(ruleHasUnsupportedType);\n", "import { type GwpMetadata } from '~/gwp/types';\n\n/**\n * Whether the engine metadata is a definitive rule answer the validator may act on. Removal is only\n * safe downstream of a parsed 2xx that actually evaluated rules (onsite-js standard: every degraded\n * path is a no-op): metadata missing entirely \u2014 the tolerated-empty-2xx path \u2014 or carrying NEITHER\n * `matchedRules` NOR `unmatchedRules` is uncertainty, so keep the gifts. `matchedRules: []` alongside\n * `unmatchedRules` IS definitive \u2014 the engine answered and nothing qualifies.\n */\nexport const isDefinitiveRuleAnswer = (metadata?: GwpMetadata | null): metadata is GwpMetadata =>\n metadata != null && (metadata.matchedRules != null || metadata.unmatchedRules != null);\n", "import { type GwpGift } from '~/gwp/types';\n\n/**\n * Whether a gift line should be removed: either its product no longer qualifies (\u2209 `validIds`),\n * OR it lost its Shopify Function discount (`!discounted && cost > 0`). The Function can't remove\n * a line it failed to discount, so the client must \u2014 this is the complete removal decision the\n * server returns as a receipt (see the rebuy-discount-architecture / GWP E2 notes).\n */\nexport const shouldRemoveGift = (\n gift: Pick<GwpGift, 'cost' | 'discounted' | 'productId'>,\n validIds: Set<number>\n): boolean => !validIds.has(gift.productId) || (!gift.discounted && gift.cost > 0);\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACOO,IAAM,wBAAwB,CAAC,eAA8B,CAAC,MACjE,IAAI;AAAA,EACA,aACK,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,EACnC,QAAQ,CAAC,WAAW,OAAO,YAAY,CAAC,CAAC,EACzC,IAAI,CAAC,YAAY,OAAO,QAAQ,SAAS,CAAC,EAC1C,OAAO,CAAC,OAAO,OAAO,SAAS,EAAE,CAAC;AAC3C;;;ACPJ,IAAM,yBAAyB,CAAC,OAAO,WAAW;AAElD,IAAM,yBAAyB,CAAC,UAC3B,KAAK,SAAS,CAAC,GAAG;AAAA,EAAK,CAAC,WACpB,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,uBAAuB,SAAS,KAAK,QAAQ,EAAE,CAAC;AACvF;AAMG,IAAM,0BAA0B,CAAC,aACpC,CAAC,GAAI,UAAU,gBAAgB,CAAC,GAAI,GAAI,UAAU,kBAAkB,CAAC,CAAE,EAAE,KAAK,sBAAsB;;;ACVjG,IAAM,yBAAyB,CAAC,aACnC,YAAY,SAAS,SAAS,gBAAgB,QAAQ,SAAS,kBAAkB;;;ACF9E,IAAM,mBAAmB,CAC5B,MACA,aACU,CAAC,SAAS,IAAI,KAAK,SAAS,KAAM,CAAC,KAAK,cAAc,KAAK,OAAO;",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ // src/gwp/getValidGwpProductIds.ts
2
+ var getValidGwpProductIds = (matchedRules = []) => new Set(
3
+ matchedRules.flatMap((rule) => rule.output ?? []).flatMap((output) => output.products ?? []).map((product) => Number(product.productId)).filter((id) => Number.isFinite(id))
4
+ );
5
+
6
+ // src/gwp/hasUnsupportedRuleTypes.ts
7
+ var UNSUPPORTED_RULE_TYPES = ["url", "order_tag"];
8
+ var ruleHasUnsupportedType = (rule) => (rule.logic ?? []).some(
9
+ (group) => (group.rules ?? []).some((item) => UNSUPPORTED_RULE_TYPES.includes(item.type ?? ""))
10
+ );
11
+ var hasUnsupportedRuleTypes = (metadata) => [...metadata?.matchedRules ?? [], ...metadata?.unmatchedRules ?? []].some(ruleHasUnsupportedType);
12
+
13
+ // src/gwp/isDefinitiveRuleAnswer.ts
14
+ var isDefinitiveRuleAnswer = (metadata) => metadata != null && (metadata.matchedRules != null || metadata.unmatchedRules != null);
15
+
16
+ // src/gwp/shouldRemoveGift.ts
17
+ var shouldRemoveGift = (gift, validIds) => !validIds.has(gift.productId) || !gift.discounted && gift.cost > 0;
18
+ export {
19
+ getValidGwpProductIds,
20
+ hasUnsupportedRuleTypes,
21
+ isDefinitiveRuleAnswer,
22
+ shouldRemoveGift
23
+ };
24
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/gwp/getValidGwpProductIds.ts", "../../src/gwp/hasUnsupportedRuleTypes.ts", "../../src/gwp/isDefinitiveRuleAnswer.ts", "../../src/gwp/shouldRemoveGift.ts"],
4
+ "sourcesContent": ["import { type MatchedRule } from '~/gwp/types';\n\n/**\n * The product ids a widget's matched rules currently qualify \u2014 ported from the React\n * extension's `getValidGwpProductIds` (camelCased engine shape). A gift whose product is\n * not in this set no longer qualifies and should be removed.\n */\nexport const getValidGwpProductIds = (matchedRules: MatchedRule[] = []): Set<number> =>\n new Set(\n matchedRules\n .flatMap((rule) => rule.output ?? [])\n .flatMap((output) => output.products ?? [])\n .map((product) => Number(product.productId))\n .filter((id) => Number.isFinite(id))\n );\n", "import { type GwpMetadata, type MatchedRule } from '~/gwp/types';\n\n/**\n * Rule types the engine can't evaluate correctly in the cart/data-source context (no page URL,\n * no order) \u2014 ported from the React extension. When a widget's rules use these, the matched output\n * is unreliable, so the validator must NOT remove the gift.\n */\nconst UNSUPPORTED_RULE_TYPES = ['url', 'order_tag'];\n\nconst ruleHasUnsupportedType = (rule: MatchedRule): boolean =>\n (rule.logic ?? []).some((group) =>\n (group.rules ?? []).some((item) => UNSUPPORTED_RULE_TYPES.includes(item.type ?? ''))\n );\n\n/**\n * Whether any matched OR unmatched rule uses an unsupported type \u2014 the bail signal: the gift's\n * qualification can't be trusted, so keep it (never remove on uncertainty).\n */\nexport const hasUnsupportedRuleTypes = (metadata?: GwpMetadata | null): boolean =>\n [...(metadata?.matchedRules ?? []), ...(metadata?.unmatchedRules ?? [])].some(ruleHasUnsupportedType);\n", "import { type GwpMetadata } from '~/gwp/types';\n\n/**\n * Whether the engine metadata is a definitive rule answer the validator may act on. Removal is only\n * safe downstream of a parsed 2xx that actually evaluated rules (onsite-js standard: every degraded\n * path is a no-op): metadata missing entirely \u2014 the tolerated-empty-2xx path \u2014 or carrying NEITHER\n * `matchedRules` NOR `unmatchedRules` is uncertainty, so keep the gifts. `matchedRules: []` alongside\n * `unmatchedRules` IS definitive \u2014 the engine answered and nothing qualifies.\n */\nexport const isDefinitiveRuleAnswer = (metadata?: GwpMetadata | null): metadata is GwpMetadata =>\n metadata != null && (metadata.matchedRules != null || metadata.unmatchedRules != null);\n", "import { type GwpGift } from '~/gwp/types';\n\n/**\n * Whether a gift line should be removed: either its product no longer qualifies (\u2209 `validIds`),\n * OR it lost its Shopify Function discount (`!discounted && cost > 0`). The Function can't remove\n * a line it failed to discount, so the client must \u2014 this is the complete removal decision the\n * server returns as a receipt (see the rebuy-discount-architecture / GWP E2 notes).\n */\nexport const shouldRemoveGift = (\n gift: Pick<GwpGift, 'cost' | 'discounted' | 'productId'>,\n validIds: Set<number>\n): boolean => !validIds.has(gift.productId) || (!gift.discounted && gift.cost > 0);\n"],
5
+ "mappings": ";AAOO,IAAM,wBAAwB,CAAC,eAA8B,CAAC,MACjE,IAAI;AAAA,EACA,aACK,QAAQ,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,EACnC,QAAQ,CAAC,WAAW,OAAO,YAAY,CAAC,CAAC,EACzC,IAAI,CAAC,YAAY,OAAO,QAAQ,SAAS,CAAC,EAC1C,OAAO,CAAC,OAAO,OAAO,SAAS,EAAE,CAAC;AAC3C;;;ACPJ,IAAM,yBAAyB,CAAC,OAAO,WAAW;AAElD,IAAM,yBAAyB,CAAC,UAC3B,KAAK,SAAS,CAAC,GAAG;AAAA,EAAK,CAAC,WACpB,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,SAAS,uBAAuB,SAAS,KAAK,QAAQ,EAAE,CAAC;AACvF;AAMG,IAAM,0BAA0B,CAAC,aACpC,CAAC,GAAI,UAAU,gBAAgB,CAAC,GAAI,GAAI,UAAU,kBAAkB,CAAC,CAAE,EAAE,KAAK,sBAAsB;;;ACVjG,IAAM,yBAAyB,CAAC,aACnC,YAAY,SAAS,SAAS,gBAAgB,QAAQ,SAAS,kBAAkB;;;ACF9E,IAAM,mBAAmB,CAC5B,MACA,aACU,CAAC,SAAS,IAAI,KAAK,SAAS,KAAM,CAAC,KAAK,cAAc,KAAK,OAAO;",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ import { type GwpMetadata } from '../gwp/types';
2
+ /**
3
+ * Whether the engine metadata is a definitive rule answer the validator may act on. Removal is only
4
+ * safe downstream of a parsed 2xx that actually evaluated rules (onsite-js standard: every degraded
5
+ * path is a no-op): metadata missing entirely — the tolerated-empty-2xx path — or carrying NEITHER
6
+ * `matchedRules` NOR `unmatchedRules` is uncertainty, so keep the gifts. `matchedRules: []` alongside
7
+ * `unmatchedRules` IS definitive — the engine answered and nothing qualifies.
8
+ */
9
+ export declare const isDefinitiveRuleAnswer: (metadata?: GwpMetadata | null) => metadata is GwpMetadata;
10
+ //# sourceMappingURL=isDefinitiveRuleAnswer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isDefinitiveRuleAnswer.d.ts","sourceRoot":"","sources":["../../src/gwp/isDefinitiveRuleAnswer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,WAAW,WAAW,GAAG,IAAI,KAAG,QAAQ,IAAI,WACO,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type GwpGift } from '../gwp/types';
2
+ /**
3
+ * Whether a gift line should be removed: either its product no longer qualifies (∉ `validIds`),
4
+ * OR it lost its Shopify Function discount (`!discounted && cost > 0`). The Function can't remove
5
+ * a line it failed to discount, so the client must — this is the complete removal decision the
6
+ * server returns as a receipt (see the rebuy-discount-architecture / GWP E2 notes).
7
+ */
8
+ export declare const shouldRemoveGift: (gift: Pick<GwpGift, "cost" | "discounted" | "productId">, validIds: Set<number>) => boolean;
9
+ //# sourceMappingURL=shouldRemoveGift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shouldRemoveGift.d.ts","sourceRoot":"","sources":["../../src/gwp/shouldRemoveGift.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GACzB,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,CAAC,EACxD,UAAU,GAAG,CAAC,MAAM,CAAC,KACtB,OAA+E,CAAC"}
@@ -0,0 +1,35 @@
1
+ /** A gift-with-purchase cart line the client asks the server to validate. */
2
+ export type GwpGift = {
3
+ /** The line's total amount (market currency); a discounted gift is 0. */
4
+ cost: number;
5
+ /** Whether the Shopify Function discount is currently allocated to the line. */
6
+ discounted: boolean;
7
+ /** Shopify cart-line id to remove. */
8
+ lineId: string;
9
+ productId: number;
10
+ /** The Rebuy widget that added the gift (`_widget_id`). */
11
+ widgetId: number;
12
+ };
13
+ /**
14
+ * A rule the engine evaluated for a widget (`metadata.matchedRules` / `unmatchedRules`, camelCased).
15
+ * `output` carries the products that currently qualify; `logic` carries the rule conditions (used to
16
+ * detect unsupported types). Loosely typed because the engine payload varies.
17
+ */
18
+ export type MatchedRule = {
19
+ logic?: {
20
+ rules?: {
21
+ type?: string;
22
+ }[];
23
+ }[];
24
+ output?: {
25
+ products?: {
26
+ productId?: number | string;
27
+ }[];
28
+ }[];
29
+ };
30
+ /** The engine metadata block the GWP validator reads. */
31
+ export type GwpMetadata = {
32
+ matchedRules?: MatchedRule[];
33
+ unmatchedRules?: MatchedRule[];
34
+ };
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gwp/types.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,MAAM,OAAO,GAAG;IAClB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,UAAU,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG;IACtB,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,EAAE,CAAC;IAC1C,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,EAAE,CAAC;CAC/D,CAAC;AAEF,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG;IACtB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;CAClC,CAAC"}