@zoxllc/shopify-checkout-extensions 0.0.7 → 0.1.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 (161) hide show
  1. package/CLAUDE.md +136 -0
  2. package/EXAMPLES.md +384 -0
  3. package/INTEGRATION.md +482 -0
  4. package/README.md +5 -1
  5. package/dist/common/AndSelector.d.ts +11 -0
  6. package/dist/common/AndSelector.d.ts.map +1 -0
  7. package/dist/common/AndSelector.js +30 -0
  8. package/dist/common/Campaign.d.ts +24 -0
  9. package/dist/common/Campaign.d.ts.map +1 -0
  10. package/dist/common/Campaign.js +41 -0
  11. package/dist/common/CampaignConfiguration.d.ts +10 -0
  12. package/dist/common/CampaignConfiguration.d.ts.map +1 -0
  13. package/dist/common/CampaignConfiguration.js +7 -0
  14. package/dist/common/CampaignFactory.d.ts +22 -0
  15. package/dist/common/CampaignFactory.d.ts.map +1 -0
  16. package/dist/common/CampaignFactory.js +95 -0
  17. package/dist/common/CartAmountQualifier.d.ts +22 -0
  18. package/dist/common/CartAmountQualifier.d.ts.map +1 -0
  19. package/dist/common/CartAmountQualifier.js +46 -0
  20. package/dist/common/CartHasItemQualifier.d.ts +21 -0
  21. package/dist/common/CartHasItemQualifier.d.ts.map +1 -0
  22. package/dist/common/CartHasItemQualifier.js +54 -0
  23. package/dist/common/CartQuantityQualifier.d.ts +22 -0
  24. package/dist/common/CartQuantityQualifier.d.ts.map +1 -0
  25. package/dist/common/CartQuantityQualifier.js +62 -0
  26. package/dist/common/ConfigSchema.d.ts +71 -0
  27. package/dist/common/ConfigSchema.d.ts.map +1 -0
  28. package/dist/common/ConfigSchema.js +69 -0
  29. package/dist/common/ConfigValidator.d.ts +29 -0
  30. package/dist/common/ConfigValidator.d.ts.map +1 -0
  31. package/dist/common/ConfigValidator.js +84 -0
  32. package/dist/common/CountryCodeQualifier.d.ts +15 -0
  33. package/dist/common/CountryCodeQualifier.d.ts.map +1 -0
  34. package/dist/common/CountryCodeQualifier.js +30 -0
  35. package/dist/common/CustomerEmailQualifier.d.ts +16 -0
  36. package/dist/common/CustomerEmailQualifier.d.ts.map +1 -0
  37. package/dist/common/CustomerEmailQualifier.js +52 -0
  38. package/dist/common/CustomerSubscriberQualifier.d.ts +18 -0
  39. package/dist/common/CustomerSubscriberQualifier.d.ts.map +1 -0
  40. package/dist/common/CustomerSubscriberQualifier.js +28 -0
  41. package/dist/common/CustomerTagQualifier.d.ts +16 -0
  42. package/dist/common/CustomerTagQualifier.d.ts.map +1 -0
  43. package/dist/common/CustomerTagQualifier.js +45 -0
  44. package/dist/common/DiscountCart.d.ts +23 -0
  45. package/dist/common/DiscountCart.d.ts.map +1 -0
  46. package/dist/common/DiscountCart.js +103 -0
  47. package/dist/common/DiscountInterface.d.ts +17 -0
  48. package/dist/common/DiscountInterface.d.ts.map +1 -0
  49. package/dist/common/DiscountInterface.js +2 -0
  50. package/dist/common/OrSelector.d.ts +11 -0
  51. package/dist/common/OrSelector.d.ts.map +1 -0
  52. package/dist/common/OrSelector.js +30 -0
  53. package/dist/common/PostCartAmountQualifier.d.ts +9 -0
  54. package/dist/common/PostCartAmountQualifier.d.ts.map +1 -0
  55. package/dist/common/PostCartAmountQualifier.js +17 -0
  56. package/dist/common/ProductHandleSelector.d.ts +8 -0
  57. package/dist/common/ProductHandleSelector.d.ts.map +1 -0
  58. package/dist/common/ProductHandleSelector.js +22 -0
  59. package/dist/common/ProductIdSelector.d.ts +8 -0
  60. package/dist/common/ProductIdSelector.d.ts.map +1 -0
  61. package/dist/common/ProductIdSelector.js +22 -0
  62. package/dist/common/ProductTagSelector.d.ts +10 -0
  63. package/dist/common/ProductTagSelector.d.ts.map +1 -0
  64. package/dist/common/ProductTagSelector.js +39 -0
  65. package/dist/common/ProductTypeSelector.d.ts +8 -0
  66. package/dist/common/ProductTypeSelector.d.ts.map +1 -0
  67. package/dist/common/ProductTypeSelector.js +25 -0
  68. package/dist/common/Qualifier.d.ts +30 -0
  69. package/dist/common/Qualifier.d.ts.map +1 -0
  70. package/dist/common/Qualifier.js +61 -0
  71. package/dist/common/SaleItemSelector.d.ts +11 -0
  72. package/dist/common/SaleItemSelector.d.ts.map +1 -0
  73. package/dist/common/SaleItemSelector.js +30 -0
  74. package/dist/common/Selector.d.ts +27 -0
  75. package/dist/common/Selector.d.ts.map +1 -0
  76. package/dist/common/Selector.js +51 -0
  77. package/dist/common/SubscriptionItemSelector.d.ts +7 -0
  78. package/dist/common/SubscriptionItemSelector.d.ts.map +1 -0
  79. package/dist/common/SubscriptionItemSelector.js +19 -0
  80. package/dist/form/CampaignForm.d.ts +1 -0
  81. package/dist/form/CampaignForm.d.ts.map +1 -0
  82. package/dist/form/CampaignForm.js +1 -0
  83. package/{src/index.ts → dist/index.d.ts} +22 -27
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +78 -0
  86. package/dist/lineItem/BuyXGetY.d.ts +18 -0
  87. package/dist/lineItem/BuyXGetY.d.ts.map +1 -0
  88. package/dist/lineItem/BuyXGetY.js +85 -0
  89. package/dist/lineItem/ConditionalDiscount.d.ts +14 -0
  90. package/dist/lineItem/ConditionalDiscount.d.ts.map +1 -0
  91. package/dist/lineItem/ConditionalDiscount.js +81 -0
  92. package/dist/lineItem/FixedItemDiscount.d.ts +9 -0
  93. package/dist/lineItem/FixedItemDiscount.d.ts.map +1 -0
  94. package/dist/lineItem/FixedItemDiscount.js +35 -0
  95. package/dist/lineItem/PercentageDiscount.d.ts +8 -0
  96. package/dist/lineItem/PercentageDiscount.d.ts.map +1 -0
  97. package/dist/lineItem/PercentageDiscount.js +32 -0
  98. package/dist/lineItem/api.d.ts +2026 -0
  99. package/dist/lineItem/api.d.ts.map +1 -0
  100. package/dist/lineItem/api.js +1157 -0
  101. package/dist/shipping/FixedDiscount.d.ts +8 -0
  102. package/dist/shipping/FixedDiscount.d.ts.map +1 -0
  103. package/dist/shipping/FixedDiscount.js +30 -0
  104. package/dist/shipping/RateNameSelector.d.ts +10 -0
  105. package/dist/shipping/RateNameSelector.d.ts.map +1 -0
  106. package/dist/shipping/RateNameSelector.js +45 -0
  107. package/dist/shipping/ShippingDiscount.d.ts +14 -0
  108. package/dist/shipping/ShippingDiscount.d.ts.map +1 -0
  109. package/dist/shipping/ShippingDiscount.js +48 -0
  110. package/dist/shipping/api.d.ts +2019 -0
  111. package/dist/shipping/api.d.ts.map +1 -0
  112. package/dist/shipping/api.js +1147 -0
  113. package/package.json +26 -7
  114. package/migrate.ts +0 -64
  115. package/src/common/AndSelector.ts +0 -42
  116. package/src/common/Campaign.ts +0 -70
  117. package/src/common/CampaignConfiguration.ts +0 -10
  118. package/src/common/CampaignFactory.ts +0 -234
  119. package/src/common/CartAmountQualifier.ts +0 -64
  120. package/src/common/CartHasItemQualifier.ts +0 -80
  121. package/src/common/CartQuantityQualifier.ts +0 -94
  122. package/src/common/CountryCodeQualifier.ts +0 -49
  123. package/src/common/CustomerEmailQualifier.ts +0 -67
  124. package/src/common/CustomerSubscriberQualifier.ts +0 -32
  125. package/src/common/CustomerTagQualifier.ts +0 -69
  126. package/src/common/DiscountCart.ts +0 -161
  127. package/src/common/DiscountInterface.ts +0 -26
  128. package/src/common/OrSelector.ts +0 -40
  129. package/src/common/PostCartAmountQualifier.ts +0 -21
  130. package/src/common/ProductHandleSelector.ts +0 -31
  131. package/src/common/ProductIdSelector.ts +0 -34
  132. package/src/common/ProductTagSelector.ts +0 -63
  133. package/src/common/ProductTypeSelector.ts +0 -40
  134. package/src/common/Qualifier.ts +0 -67
  135. package/src/common/SaleItemSelector.ts +0 -36
  136. package/src/common/Selector.ts +0 -66
  137. package/src/common/SubscriptionItemSelector.ts +0 -23
  138. package/src/lineItem/BuyXGetY.ts +0 -131
  139. package/src/lineItem/ConditionalDiscount.ts +0 -102
  140. package/src/lineItem/FixedItemDiscount.ts +0 -51
  141. package/src/lineItem/PercentageDiscount.ts +0 -44
  142. package/src/lineItem/api.ts +0 -2103
  143. package/src/shipping/FixedDiscount.ts +0 -37
  144. package/src/shipping/RateNameSelector.ts +0 -54
  145. package/src/shipping/ShippingDiscount.ts +0 -75
  146. package/src/shipping/api.ts +0 -2014
  147. package/tests/AndSelector.test.ts +0 -27
  148. package/tests/CartQuantityQualifier.test.ts +0 -381
  149. package/tests/CountryCodeQualifier.test.ts +0 -55
  150. package/tests/CustomerSubscriberQualifier.test.ts +0 -101
  151. package/tests/CustomerTagQualifier.test.ts +0 -71
  152. package/tests/DiscountCart.test.ts +0 -115
  153. package/tests/OrSelector.test.ts +0 -27
  154. package/tests/ProductIdSelector.test.ts +0 -83
  155. package/tests/ProductTagSelector.test.ts +0 -75
  156. package/tests/Qualifier.test.ts +0 -193
  157. package/tests/RateNameSelector.test.ts +0 -107
  158. package/tests/SaleItemSelector.test.ts +0 -113
  159. package/tests/Selector.test.ts +0 -83
  160. package/tests/ShippingDiscount.test.ts +0 -147
  161. package/tsconfig.json +0 -25
package/package.json CHANGED
@@ -1,12 +1,30 @@
1
1
  {
2
2
  "name": "@zoxllc/shopify-checkout-extensions",
3
- "version": "0.0.7",
4
- "description": "ZOX helper lib for shopify checkout extensions",
5
- "main": "src/index.ts",
3
+ "version": "0.1.0",
4
+ "description": "Configuration-driven runtime engine for Shopify checkout extensions - campaigns, discounts, qualifiers, and selectors",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md",
10
+ "EXAMPLES.md",
11
+ "INTEGRATION.md",
12
+ "CLAUDE.md"
13
+ ],
14
+ "keywords": [
15
+ "shopify",
16
+ "checkout",
17
+ "extensions",
18
+ "discounts",
19
+ "campaigns",
20
+ "functions"
21
+ ],
6
22
  "directories": {
7
23
  "test": "tests"
8
24
  },
9
25
  "scripts": {
26
+ "build": "rm -rf dist && tsc",
27
+ "prepublishOnly": "npm run build",
10
28
  "test": "vitest"
11
29
  },
12
30
  "repository": {
@@ -20,13 +38,14 @@
20
38
  },
21
39
  "homepage": "https://github.com/zoxllc/shopify-checkout-extensions#readme",
22
40
  "dependencies": {
23
- "@shopify/app-bridge-types": "^0.0.7",
24
- "@shopify/shopify_function": "0.1.0",
41
+ "@shopify/app-bridge-types": "^0.0.17",
42
+ "@shopify/shopify_function": "^1.0.5",
25
43
  "@types/lodash": "^4.14.202",
26
- "javy": "0.1.1",
44
+ "javy": "^0.1.2",
27
45
  "lodash": "^4.17.21"
28
46
  },
29
47
  "devDependencies": {
30
- "vitest": "^1.3.1"
48
+ "typescript": "^5.8.2",
49
+ "vitest": "^3.0.9"
31
50
  }
32
51
  }
package/migrate.ts DELETED
@@ -1,64 +0,0 @@
1
- ShippingDiscount.new(
2
- :all,
3
- CustomerTagQualifier.new(
4
- :does,
5
- :match,
6
- ["new customer 35", "tier: Active Subscriber", "active_subscriber", "tier: Subscribers", "Active Subscriber"]
7
- ),
8
- AndSelector.new(
9
- CartAmountQualifier.new(
10
- :cart,
11
- :greater_than,
12
- 50
13
- ),
14
- ReducedCartAmountQualifier.new(
15
- :greater_than,
16
- 50
17
- ),
18
- nil
19
- ),
20
- :any,
21
- nil,
22
- RateNameSelector.new(
23
- :does,
24
- :include,
25
- ["FedEx"]
26
- ),
27
- FixedDiscount.new(
28
- 10,
29
- "ZOXPASS Discount"
30
- )
31
- ),
32
- ShippingDiscount.new(
33
- :all,
34
- nil,
35
- CountryCodeQualifier.new(
36
- :is_one,
37
- ["US"]
38
- ),
39
- :any,
40
- SubscriptionItemSelector.new(
41
- :is
42
- ),
43
- nil,
44
- FixedDiscount.new(
45
- 4,
46
- ""
47
- )
48
- ),
49
- ShippingDiscount.new(
50
- :all,
51
- nil,
52
- nil,
53
- :any,
54
- nil,
55
- RateNameSelector.new(
56
- :does,
57
- :include,
58
- ["Standard - Untracked"]
59
- ),
60
- FixedDiscount.new(
61
- 3,
62
- ""
63
- )
64
- )
@@ -1,42 +0,0 @@
1
- import type { DiscountCart } from './DiscountCart';
2
- import type { Qualifier } from './Qualifier';
3
- import type { Selector } from './Selector';
4
- import type { CartLine } from '../lineItem/api';
5
-
6
- export class AndSelector {
7
- is_a: 'AndSelector';
8
- conditions: (Qualifier | Selector)[];
9
-
10
- constructor(conditions: (Qualifier | Selector)[]) {
11
- this.is_a = 'AndSelector';
12
- this.conditions = conditions;
13
- }
14
-
15
- match(
16
- subject: CartLine | DiscountCart,
17
- selector?: Selector
18
- ) {
19
- try {
20
- const conditionsResult = this.conditions
21
- .map((condition) => {
22
- if (selector) {
23
- return (condition as Qualifier).match(
24
- subject as DiscountCart,
25
- selector
26
- );
27
- } else {
28
- return (condition as Selector).match(
29
- subject as CartLine
30
- );
31
- }
32
- })
33
- .filter((result) => result === true);
34
-
35
- return (
36
- conditionsResult.length == this.conditions.length
37
- );
38
- } catch (e) {
39
- return false;
40
- }
41
- }
42
- }
@@ -1,70 +0,0 @@
1
- import type { AndSelector } from './AndSelector';
2
- import type { DiscountCart } from './DiscountCart';
3
- import type { OrSelector } from './OrSelector';
4
- import type { Selector } from './Selector';
5
- import {
6
- type Qualifier,
7
- QualifierBehavior,
8
- } from './Qualifier';
9
-
10
- interface CampaignInterface {
11
- runWithHooks(cart: DiscountCart): DiscountCart;
12
- beforeRun?(cart: DiscountCart): DiscountCart;
13
- run?(cart: DiscountCart): DiscountCart;
14
- afterRun(cart: DiscountCart): DiscountCart;
15
- }
16
-
17
- export class Campaign implements CampaignInterface {
18
- behavior: QualifierBehavior;
19
- qualifiers?:
20
- | (AndSelector | OrSelector | Qualifier)[]
21
- | null;
22
- lineItemSelector?: Selector;
23
- message?: string;
24
-
25
- constructor(
26
- behavior: QualifierBehavior,
27
- qualifiers?:
28
- | (AndSelector | OrSelector | Qualifier)[]
29
- | null
30
- ) {
31
- this.behavior = behavior;
32
- this.qualifiers = qualifiers;
33
- }
34
-
35
- qualifies(discountCart: DiscountCart): boolean {
36
- if (this.qualifiers == undefined) return true;
37
-
38
- const qualifierResults = this.qualifiers.map(
39
- (qualifier) =>
40
- qualifier.match(discountCart, this.lineItemSelector)
41
- );
42
-
43
- if (this.behavior == QualifierBehavior.ALL) {
44
- return (
45
- qualifierResults.filter((i) => i === false)
46
- .length == 0
47
- );
48
- } else if (this.behavior == QualifierBehavior.ANY) {
49
- return (
50
- qualifierResults.filter((i) => i === true).length >
51
- 0
52
- );
53
- } else {
54
- return true;
55
- }
56
- }
57
-
58
- runWithHooks(cart: DiscountCart) {
59
- this.run(cart);
60
- return this.afterRun(cart);
61
- }
62
-
63
- run(cart: DiscountCart) {
64
- return cart;
65
- }
66
-
67
- afterRun(cart: DiscountCart) {
68
- return cart;
69
- }
70
- }
@@ -1,10 +0,0 @@
1
- export enum CampaignType {
2
- ConditionalDiscount = "ConditionalDiscount",
3
- }
4
-
5
- export type CampaignConfiguration = {
6
- priority: number;
7
- campaignType: CampaignType;
8
- name: string;
9
- arguments: string;
10
- };
@@ -1,234 +0,0 @@
1
- import { OrSelector } from './OrSelector';
2
- import type { Campaign } from './Campaign';
3
- import type { DiscountInterface } from './DiscountInterface';
4
- import type {
5
- NumericalComparisonType,
6
- Qualifier,
7
- QualifierBehavior,
8
- QualifierMatchType,
9
- StringComparisonType,
10
- } from './Qualifier';
11
- import type { MatchType, Selector } from './Selector';
12
- import { AndSelector } from './AndSelector';
13
- import {
14
- type CartAmountBehavior,
15
- CartAmountQualifier,
16
- } from './CartAmountQualifier';
17
- import {
18
- type CartQuantityBehavior,
19
- CartQuantityQualifier,
20
- } from './CartQuantityQualifier';
21
- import { CustomerEmailQualifier } from './CustomerEmailQualifier';
22
- import { CustomerSubscriberQualifier } from './CustomerSubscriberQualifier';
23
- import { CustomerTagQualifier } from './CustomerTagQualifier';
24
- import { PostCartAmountQualifier } from './PostCartAmountQualifier';
25
- import { ProductIdSelector } from './ProductIdSelector';
26
- import { ProductTagSelector } from './ProductTagSelector';
27
- import { ProductTypeSelector } from './ProductTypeSelector';
28
- import {
29
- SaleItemSelector,
30
- type SaleItemSelectorMatchType,
31
- } from './SaleItemSelector';
32
-
33
- import { ConditionalDiscount } from '../lineItem/ConditionalDiscount';
34
- import { FixedItemDiscount } from '../lineItem/FixedItemDiscount';
35
- import { PercentageDiscount } from '../lineItem/PercentageDiscount';
36
- import { BuyXGetY } from '../lineItem/BuyXGetY';
37
-
38
- import { SubscriptionItemSelector } from './SubscriptionItemSelector';
39
- import { CountryCodeQualifier } from './CountryCodeQualifier';
40
- import { RateNameSelector } from '../shipping/RateNameSelector';
41
- import { FixedDiscount } from '../shipping/FixedDiscount';
42
- import { ShippingDiscount } from '../shipping/ShippingDiscount';
43
-
44
- export type InputConfig = {
45
- __type: string;
46
- inputs: (
47
- | boolean
48
- | number
49
- | string
50
- | InputConfig
51
- | boolean[]
52
- | number[]
53
- | string[]
54
- | InputConfig[]
55
- )[];
56
- };
57
-
58
- export class CampaignFactory {
59
- static createFromConfig(config: InputConfig) {
60
- return CampaignFactory.createInputsObject(
61
- config
62
- ) as Campaign;
63
- }
64
-
65
- private static parseInputConfig(
66
- input:
67
- | boolean
68
- | number
69
- | string
70
- | InputConfig
71
- | boolean[]
72
- | number[]
73
- | string[]
74
- | InputConfig[]
75
- ) {
76
- if (
77
- typeof input == 'string' ||
78
- typeof input == 'number' ||
79
- typeof input == 'boolean' ||
80
- input === null
81
- ) {
82
- return input;
83
- } else {
84
- return CampaignFactory.createInputsObject(
85
- input as InputConfig
86
- );
87
- }
88
- }
89
-
90
- static createInputsObject(
91
- config: InputConfig
92
- ):
93
- | Campaign
94
- | Qualifier
95
- | AndSelector
96
- | OrSelector
97
- | Selector
98
- | DiscountInterface
99
- | undefined {
100
- const args = config.inputs.map((input) => {
101
- if (Array.isArray(input)) {
102
- return input.map((i) =>
103
- CampaignFactory.parseInputConfig(i)
104
- );
105
- } else {
106
- return CampaignFactory.parseInputConfig(input);
107
- }
108
- });
109
-
110
- switch (config.__type) {
111
- case 'ConditionalDiscount':
112
- return new ConditionalDiscount(
113
- args[0] as QualifierBehavior,
114
- args[1] as [AndSelector | OrSelector | Qualifier],
115
- args[2] as DiscountInterface,
116
- args[3] as Selector,
117
- args[4] as number
118
- );
119
- case 'BuyXGetY':
120
- return new BuyXGetY(
121
- args[0] as QualifierBehavior,
122
- args[1] as [AndSelector | OrSelector | Qualifier],
123
- args[2] as DiscountInterface,
124
- args[3] as Selector,
125
- args[4] as Selector,
126
- args[5] as number,
127
- args[6] as number,
128
- args[7] as number
129
- );
130
- case 'ShippingDiscount':
131
- return new ShippingDiscount(
132
- args[0] as QualifierBehavior,
133
- args[1] as [AndSelector | OrSelector | Qualifier],
134
- args[2] as DiscountInterface,
135
- args[3] as Selector
136
- );
137
- case 'AndSelector':
138
- return new AndSelector([...args] as (
139
- | Selector
140
- | Qualifier
141
- )[]);
142
- case 'OrSelector':
143
- return new OrSelector([...args] as (
144
- | Selector
145
- | Qualifier
146
- )[]);
147
- case 'PostCartAmountQualifier':
148
- return new PostCartAmountQualifier(
149
- args[0] as NumericalComparisonType,
150
- args[1] as number
151
- );
152
- case 'CartAmountQualifier':
153
- return new CartAmountQualifier(
154
- args[0] as CartAmountBehavior,
155
- args[1] as NumericalComparisonType,
156
- args[2] as number
157
- );
158
- case 'CartQuantityQualifier':
159
- return new CartQuantityQualifier(
160
- args[0] as CartQuantityBehavior,
161
- args[1] as NumericalComparisonType,
162
- args[2] as number
163
- );
164
- case 'CountryCodeQualifier':
165
- return new CountryCodeQualifier(
166
- args[0] as QualifierMatchType,
167
- args[1] as StringComparisonType,
168
- args[2] as string[]
169
- );
170
- case 'SaleItemSelector':
171
- return new SaleItemSelector(
172
- args[0] as SaleItemSelectorMatchType
173
- );
174
- case 'ProductIdSelector':
175
- return new ProductIdSelector(
176
- args[0] as MatchType.IS_ONE | MatchType.NOT_ONE,
177
- args[1] as string[]
178
- );
179
- case 'ProductTypeSelector':
180
- return new ProductTypeSelector(
181
- args[0] as MatchType,
182
- args[1] as string[]
183
- );
184
- case 'ProductTagSelector':
185
- return new ProductTagSelector(
186
- args[0] as QualifierMatchType,
187
- args[1] as StringComparisonType,
188
- args[2] as string[]
189
- );
190
- case 'PercentageDiscount':
191
- return new PercentageDiscount(
192
- args[0] as number,
193
- args[1] as string
194
- );
195
- case 'FixedItemDiscount':
196
- return new FixedItemDiscount(
197
- args[0] as number,
198
- args[1] as boolean,
199
- args[2] as string
200
- );
201
- case 'FixedDiscount':
202
- return new FixedDiscount(
203
- args[0] as number,
204
- args[1] as string
205
- );
206
- case 'SubscriptionItemSelector':
207
- return new SubscriptionItemSelector(
208
- args[0] as MatchType
209
- );
210
- case 'RateNameSelector':
211
- return new RateNameSelector(
212
- args[0] as MatchType.DOES | MatchType.DOES_NOT,
213
- args[1] as StringComparisonType,
214
- args[2] as string[]
215
- );
216
- case 'CustomerSubscriberQualifier':
217
- return new CustomerSubscriberQualifier(
218
- args[0] as QualifierMatchType
219
- );
220
- case 'CustomerEmailQualifier':
221
- return new CustomerEmailQualifier(
222
- args[0] as QualifierMatchType,
223
- args[1] as StringComparisonType,
224
- args[2] as string[]
225
- );
226
- case 'CustomerTagQualifier':
227
- return new CustomerTagQualifier(
228
- args[0] as QualifierMatchType,
229
- args[1] as StringComparisonType,
230
- args[2] as string[]
231
- );
232
- }
233
- }
234
- }
@@ -1,64 +0,0 @@
1
- import type { DiscountCart } from "./DiscountCart";
2
- import { type NumericalComparisonType, Qualifier } from "./Qualifier";
3
- import { type Selector } from "./Selector";
4
-
5
- export enum CartAmountBehavior {
6
- CART = ":cart",
7
- ITEM = ":item",
8
- DIFF_CART = ":diff_cart",
9
- DIFF_ITEM = ":diff_item",
10
- }
11
-
12
- export class CartAmountQualifier extends Qualifier {
13
- behavior: CartAmountBehavior;
14
- comparisonType: NumericalComparisonType;
15
- amount: number;
16
-
17
- constructor(
18
- behavior: CartAmountBehavior,
19
- comparisonType: NumericalComparisonType,
20
- amount: number
21
- ) {
22
- super();
23
- this.behavior = behavior;
24
- this.comparisonType = comparisonType;
25
- this.amount = amount;
26
- }
27
-
28
- /**
29
- * Determines if the carts amount
30
- * @param cart
31
- * @param selector
32
- */
33
- match(discountCart: DiscountCart, selector?: Selector) {
34
- let total =
35
- parseFloat(discountCart.cart.cost.subtotalAmount.amount) -
36
- discountCart.appliedDiscountTotal;
37
-
38
- switch (this.behavior) {
39
- case CartAmountBehavior.CART:
40
- case CartAmountBehavior.ITEM:
41
- return this.compareAmounts(total, this.comparisonType, this.amount);
42
- case CartAmountBehavior.DIFF_CART:
43
- return this.compareAmounts(
44
- parseFloat(discountCart.cart.cost.subtotalAmount.amount) -
45
- this.amount,
46
- this.comparisonType,
47
- total
48
- );
49
- case CartAmountBehavior.DIFF_ITEM:
50
- const originalLineTotal = discountCart.cart.lines.reduce(
51
- (runningTotal: number, line) => {
52
- runningTotal += parseFloat(line.cost.subtotalAmount.amount);
53
- return runningTotal;
54
- },
55
- total
56
- );
57
- return this.compareAmounts(
58
- originalLineTotal - this.amount,
59
- this.comparisonType,
60
- total
61
- );
62
- }
63
- }
64
- }
@@ -1,80 +0,0 @@
1
- import type { CartLine } from '../lineItem/api';
2
- import type { DiscountCart } from './DiscountCart';
3
- import {
4
- type NumericalComparisonType,
5
- Qualifier,
6
- } from './Qualifier';
7
- import { type Selector } from './Selector';
8
-
9
- export enum CartHasItemBehavior {
10
- QUANTITY = ':quantity',
11
- SUBTOTAL = ':subtotal',
12
- }
13
-
14
- export class CartHasItemQualifier extends Qualifier {
15
- quantityOrSubtotal: CartHasItemBehavior;
16
- comparisonType: NumericalComparisonType;
17
- amount: number;
18
- itemSelector: Selector;
19
-
20
- constructor(
21
- quantityOrSubtotal: CartHasItemBehavior,
22
- comparisonType: NumericalComparisonType,
23
- amount: number,
24
- itemSelector: Selector
25
- ) {
26
- super();
27
- this.quantityOrSubtotal = quantityOrSubtotal;
28
- this.comparisonType = comparisonType;
29
- this.amount =
30
- this.quantityOrSubtotal ==
31
- CartHasItemBehavior.SUBTOTAL
32
- ? amount
33
- : Math.floor(amount);
34
- this.itemSelector = itemSelector;
35
- }
36
-
37
- /**
38
- * Determines if the carts amount
39
- * @param cart
40
- * @param selector
41
- */
42
- match(discountCart: DiscountCart, selector?: Selector) {
43
- let total = 0;
44
-
45
- switch (this.quantityOrSubtotal) {
46
- case CartHasItemBehavior.QUANTITY:
47
- total = discountCart.cart.lines.reduce(
48
- (quantity, line) => {
49
- return (
50
- quantity +
51
- (this.itemSelector.match(line as CartLine)
52
- ? line.quantity
53
- : 0)
54
- );
55
- },
56
- 0
57
- );
58
- break;
59
- case CartHasItemBehavior.SUBTOTAL:
60
- total = discountCart.cart.lines.reduce(
61
- (amount, line) => {
62
- return (
63
- amount +
64
- (this.itemSelector.match(line as CartLine)
65
- ? line.cost.subtotalAmount.amount
66
- : 0)
67
- );
68
- },
69
- 0
70
- );
71
- break;
72
- }
73
-
74
- return this.compareAmounts(
75
- total,
76
- this.comparisonType,
77
- this.amount
78
- );
79
- }
80
- }