@replohq/sdk 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 (280) hide show
  1. package/LICENSE +11 -0
  2. package/_vendor/replo-utils/lib/crypto.d.ts +30 -0
  3. package/_vendor/replo-utils/lib/errors.d.ts +83 -0
  4. package/_vendor/replo-utils/lib/json.d.ts +6 -0
  5. package/_vendor/replo-utils/lib/json.mjs +43 -0
  6. package/_vendor/replo-utils/lib/misc.d.ts +145 -0
  7. package/_vendor/replo-utils/lib/object.d.ts +31 -0
  8. package/_vendor/schemas/errors.d.ts +459 -0
  9. package/_vendor/schemas/generated/consent.d.ts +55 -0
  10. package/_vendor/schemas/generated/errors.d.ts +61 -0
  11. package/_vendor/schemas/loaderKeys.d.ts +1 -0
  12. package/_vendor/schemas/loaderKeys.mjs +27 -0
  13. package/_vendor/schemas/money.d.ts +60 -0
  14. package/_vendor/schemas/money.mjs +2051 -0
  15. package/analytics/analytics-provider.d.ts +16 -0
  16. package/analytics/analytics-provider.js +113 -0
  17. package/analytics/analytics-provider.js.map +7 -0
  18. package/analytics/analytics-sink.d.ts +26 -0
  19. package/analytics/analytics-sink.js +1 -0
  20. package/analytics/analytics-sink.js.map +7 -0
  21. package/analytics/get-analytics-sinks.d.ts +27 -0
  22. package/analytics/get-analytics-sinks.js +52 -0
  23. package/analytics/get-analytics-sinks.js.map +7 -0
  24. package/analytics/hooks/use-product-viewed-analytics.d.ts +23 -0
  25. package/analytics/hooks/use-product-viewed-analytics.js +34 -0
  26. package/analytics/hooks/use-product-viewed-analytics.js.map +7 -0
  27. package/analytics/replo-first-party-pixel.d.ts +12 -0
  28. package/analytics/replo-first-party-pixel.js +31 -0
  29. package/analytics/replo-first-party-pixel.js.map +7 -0
  30. package/analytics/replo-pixel-script.d.ts +13 -0
  31. package/analytics/replo-pixel-script.js +30 -0
  32. package/analytics/replo-pixel-script.js.map +7 -0
  33. package/analytics/sinks/ga4-sink.d.ts +15 -0
  34. package/analytics/sinks/ga4-sink.js +60 -0
  35. package/analytics/sinks/ga4-sink.js.map +7 -0
  36. package/analytics/sinks/meta-sink.d.ts +14 -0
  37. package/analytics/sinks/meta-sink.js +56 -0
  38. package/analytics/sinks/meta-sink.js.map +7 -0
  39. package/analytics/sinks/pinterest-sink.d.ts +14 -0
  40. package/analytics/sinks/pinterest-sink.js +76 -0
  41. package/analytics/sinks/pinterest-sink.js.map +7 -0
  42. package/analytics/sinks/reddit-sink.d.ts +14 -0
  43. package/analytics/sinks/reddit-sink.js +80 -0
  44. package/analytics/sinks/reddit-sink.js.map +7 -0
  45. package/analytics/sinks/replo-sink.d.ts +14 -0
  46. package/analytics/sinks/replo-sink.js +57 -0
  47. package/analytics/sinks/replo-sink.js.map +7 -0
  48. package/analytics/sinks/snapchat-sink.d.ts +14 -0
  49. package/analytics/sinks/snapchat-sink.js +67 -0
  50. package/analytics/sinks/snapchat-sink.js.map +7 -0
  51. package/analytics/sinks/tiktok-sink.d.ts +14 -0
  52. package/analytics/sinks/tiktok-sink.js +79 -0
  53. package/analytics/sinks/tiktok-sink.js.map +7 -0
  54. package/analytics/sinks/window-sink.d.ts +18 -0
  55. package/analytics/sinks/window-sink.js +46 -0
  56. package/analytics/sinks/window-sink.js.map +7 -0
  57. package/analytics/utils/analytics-utils.d.ts +7 -0
  58. package/analytics/utils/analytics-utils.js +130 -0
  59. package/analytics/utils/analytics-utils.js.map +7 -0
  60. package/analytics/utils/navigation-tracker.d.ts +16 -0
  61. package/analytics/utils/navigation-tracker.js +44 -0
  62. package/analytics/utils/navigation-tracker.js.map +7 -0
  63. package/analytics/utils/shopify-funnel-gate.d.ts +8 -0
  64. package/analytics/utils/shopify-funnel-gate.js +22 -0
  65. package/analytics/utils/shopify-funnel-gate.js.map +7 -0
  66. package/cart/buy-now-action.d.ts +21 -0
  67. package/cart/buy-now-action.js +104 -0
  68. package/cart/buy-now-action.js.map +7 -0
  69. package/cart/cart-actions.d.ts +63 -0
  70. package/cart/cart-actions.js +90 -0
  71. package/cart/cart-actions.js.map +7 -0
  72. package/cart/cart-loader.d.ts +9 -0
  73. package/cart/cart-loader.js +11 -0
  74. package/cart/cart-loader.js.map +7 -0
  75. package/cart/cart-provider.d.ts +85 -0
  76. package/cart/cart-provider.js +372 -0
  77. package/cart/cart-provider.js.map +7 -0
  78. package/cart/cart-schema.d.ts +74 -0
  79. package/cart/cart-schema.js +69 -0
  80. package/cart/cart-schema.js.map +7 -0
  81. package/cart/cart-types.d.ts +132 -0
  82. package/cart/cart-types.js +8 -0
  83. package/cart/cart-types.js.map +7 -0
  84. package/cart/gateways/cart-constants.d.ts +1 -0
  85. package/cart/gateways/cart-constants.js +5 -0
  86. package/cart/gateways/cart-constants.js.map +7 -0
  87. package/cart/gateways/cart-gateway.d.ts +10 -0
  88. package/cart/gateways/cart-gateway.js +19 -0
  89. package/cart/gateways/cart-gateway.js.map +7 -0
  90. package/cart/gateways/cookie-cart-gateway.d.ts +28 -0
  91. package/cart/gateways/cookie-cart-gateway.js +109 -0
  92. package/cart/gateways/cookie-cart-gateway.js.map +7 -0
  93. package/cart/gateways/default-cart-gateway.d.ts +19 -0
  94. package/cart/gateways/default-cart-gateway.js +30 -0
  95. package/cart/gateways/default-cart-gateway.js.map +7 -0
  96. package/cart/gateways/resolver-cart-gateway.d.ts +2 -0
  97. package/cart/gateways/resolver-cart-gateway.js +109 -0
  98. package/cart/gateways/resolver-cart-gateway.js.map +7 -0
  99. package/cart/gateways/stripe-cart-gateway.d.ts +19 -0
  100. package/cart/gateways/stripe-cart-gateway.js +28 -0
  101. package/cart/gateways/stripe-cart-gateway.js.map +7 -0
  102. package/cart/hooks/use-add-to-cart.d.ts +63 -0
  103. package/cart/hooks/use-add-to-cart.js +124 -0
  104. package/cart/hooks/use-add-to-cart.js.map +7 -0
  105. package/cart/hooks/use-buy-now.d.ts +49 -0
  106. package/cart/hooks/use-buy-now.js +62 -0
  107. package/cart/hooks/use-buy-now.js.map +7 -0
  108. package/cart/utils/cart-utils.d.ts +43 -0
  109. package/cart/utils/cart-utils.js +46 -0
  110. package/cart/utils/cart-utils.js.map +7 -0
  111. package/cart/utils/cookie-cart-persistence.d.ts +55 -0
  112. package/cart/utils/cookie-cart-persistence.js +166 -0
  113. package/cart/utils/cookie-cart-persistence.js.map +7 -0
  114. package/cart/utils/variant-to-cart-line.d.ts +74 -0
  115. package/cart/utils/variant-to-cart-line.js +162 -0
  116. package/cart/utils/variant-to-cart-line.js.map +7 -0
  117. package/chunk-UJCSKKID.mjs +27 -0
  118. package/consent/consent-action.d.ts +9 -0
  119. package/consent/consent-action.js +25 -0
  120. package/consent/consent-action.js.map +7 -0
  121. package/consent/consent-actions.d.ts +28 -0
  122. package/consent/consent-actions.js +36 -0
  123. package/consent/consent-actions.js.map +7 -0
  124. package/consent/consent-store.d.ts +69 -0
  125. package/consent/consent-store.js +194 -0
  126. package/consent/consent-store.js.map +7 -0
  127. package/consent/cookie.d.ts +36 -0
  128. package/consent/cookie.js +82 -0
  129. package/consent/cookie.js.map +7 -0
  130. package/consent/replo-scripts.d.ts +23 -0
  131. package/consent/replo-scripts.js +102 -0
  132. package/consent/replo-scripts.js.map +7 -0
  133. package/consent/script-registration-store.d.ts +25 -0
  134. package/consent/script-registration-store.js +61 -0
  135. package/consent/script-registration-store.js.map +7 -0
  136. package/consent/script-snippets.d.ts +24 -0
  137. package/consent/script-snippets.js +122 -0
  138. package/consent/script-snippets.js.map +7 -0
  139. package/consent/types.d.ts +34 -0
  140. package/consent/types.js +1 -0
  141. package/consent/types.js.map +7 -0
  142. package/consent/window-api.d.ts +41 -0
  143. package/consent/window-api.js +73 -0
  144. package/consent/window-api.js.map +7 -0
  145. package/env.d.ts +9 -0
  146. package/env.js +42 -0
  147. package/env.js.map +7 -0
  148. package/gateways/canopy-api.d.ts +83 -0
  149. package/gateways/canopy-api.js +197 -0
  150. package/gateways/canopy-api.js.map +7 -0
  151. package/hooks/use-client-value.d.ts +10 -0
  152. package/hooks/use-client-value.js +12 -0
  153. package/hooks/use-client-value.js.map +7 -0
  154. package/hooks/use-formatted-price.d.ts +15 -0
  155. package/hooks/use-formatted-price.js +20 -0
  156. package/hooks/use-formatted-price.js.map +7 -0
  157. package/lib/canopy-error.d.ts +25 -0
  158. package/lib/canopy-error.js +24 -0
  159. package/lib/canopy-error.js.map +7 -0
  160. package/lib/get-query-client.d.ts +2 -0
  161. package/lib/get-query-client.js +34 -0
  162. package/lib/get-query-client.js.map +7 -0
  163. package/lib/integration-utils.d.ts +2 -0
  164. package/lib/integration-utils.js +9 -0
  165. package/lib/integration-utils.js.map +7 -0
  166. package/lib/shopify-utils.d.ts +10 -0
  167. package/lib/shopify-utils.js +7 -0
  168. package/lib/shopify-utils.js.map +7 -0
  169. package/lib/url-utils.d.ts +4 -0
  170. package/lib/url-utils.js +8 -0
  171. package/lib/url-utils.js.map +7 -0
  172. package/loaders/collection-loader.d.ts +11 -0
  173. package/loaders/collection-loader.js +55 -0
  174. package/loaders/collection-loader.js.map +7 -0
  175. package/loaders/collection-products-loader.d.ts +12 -0
  176. package/loaders/collection-products-loader.js +58 -0
  177. package/loaders/collection-products-loader.js.map +7 -0
  178. package/loaders/contentful-entries-loader.d.ts +17 -0
  179. package/loaders/contentful-entries-loader.js +78 -0
  180. package/loaders/contentful-entries-loader.js.map +7 -0
  181. package/loaders/contentful-entry-loader.d.ts +14 -0
  182. package/loaders/contentful-entry-loader.js +60 -0
  183. package/loaders/contentful-entry-loader.js.map +7 -0
  184. package/loaders/invoke-loader-action.d.ts +11 -0
  185. package/loaders/invoke-loader-action.js +14 -0
  186. package/loaders/invoke-loader-action.js.map +7 -0
  187. package/loaders/invoke-loader-server.d.ts +18 -0
  188. package/loaders/invoke-loader-server.js +40 -0
  189. package/loaders/invoke-loader-server.js.map +7 -0
  190. package/loaders/invoke-loader.d.ts +16 -0
  191. package/loaders/invoke-loader.js +37 -0
  192. package/loaders/invoke-loader.js.map +7 -0
  193. package/loaders/levanta-product-loader.d.ts +11 -0
  194. package/loaders/levanta-product-loader.js +53 -0
  195. package/loaders/levanta-product-loader.js.map +7 -0
  196. package/loaders/loader-error-boundary.d.ts +25 -0
  197. package/loaders/loader-error-boundary.js +24 -0
  198. package/loaders/loader-error-boundary.js.map +7 -0
  199. package/loaders/loader-keys.d.ts +34 -0
  200. package/loaders/loader-keys.js +26 -0
  201. package/loaders/loader-keys.js.map +7 -0
  202. package/loaders/loader-schemas.d.ts +946 -0
  203. package/loaders/loader-schemas.js +353 -0
  204. package/loaders/loader-schemas.js.map +7 -0
  205. package/loaders/metaobject-loader.d.ts +12 -0
  206. package/loaders/metaobject-loader.js +54 -0
  207. package/loaders/metaobject-loader.js.map +7 -0
  208. package/loaders/metaobjects-loader.d.ts +14 -0
  209. package/loaders/metaobjects-loader.js +60 -0
  210. package/loaders/metaobjects-loader.js.map +7 -0
  211. package/loaders/okendo-review-aggregate-loader.d.ts +17 -0
  212. package/loaders/okendo-review-aggregate-loader.js +56 -0
  213. package/loaders/okendo-review-aggregate-loader.js.map +7 -0
  214. package/loaders/okendo-reviews-loader.d.ts +23 -0
  215. package/loaders/okendo-reviews-loader.js +54 -0
  216. package/loaders/okendo-reviews-loader.js.map +7 -0
  217. package/loaders/prefetch-loaders.d.ts +33 -0
  218. package/loaders/prefetch-loaders.js +46 -0
  219. package/loaders/prefetch-loaders.js.map +7 -0
  220. package/loaders/preview-placeholder.d.ts +25 -0
  221. package/loaders/preview-placeholder.js +222 -0
  222. package/loaders/preview-placeholder.js.map +7 -0
  223. package/loaders/product-loader-args.d.ts +21 -0
  224. package/loaders/product-loader-args.js +17 -0
  225. package/loaders/product-loader-args.js.map +7 -0
  226. package/loaders/product-loader.d.ts +10 -0
  227. package/loaders/product-loader.js +52 -0
  228. package/loaders/product-loader.js.map +7 -0
  229. package/loaders/rebuy-recommendations-loader.d.ts +165 -0
  230. package/loaders/rebuy-recommendations-loader.js +57 -0
  231. package/loaders/rebuy-recommendations-loader.js.map +7 -0
  232. package/loaders/reviews-io-review-aggregate-loader.d.ts +12 -0
  233. package/loaders/reviews-io-review-aggregate-loader.js +43 -0
  234. package/loaders/reviews-io-review-aggregate-loader.js.map +7 -0
  235. package/loaders/reviews-io-reviews-loader.d.ts +14 -0
  236. package/loaders/reviews-io-reviews-loader.js +65 -0
  237. package/loaders/reviews-io-reviews-loader.js.map +7 -0
  238. package/loaders/smile-earning-rules-loader.d.ts +19 -0
  239. package/loaders/smile-earning-rules-loader.js +44 -0
  240. package/loaders/smile-earning-rules-loader.js.map +7 -0
  241. package/loaders/smile-rewards-loader.d.ts +19 -0
  242. package/loaders/smile-rewards-loader.js +44 -0
  243. package/loaders/smile-rewards-loader.js.map +7 -0
  244. package/loaders/smile-vip-tiers-loader.d.ts +18 -0
  245. package/loaders/smile-vip-tiers-loader.js +43 -0
  246. package/loaders/smile-vip-tiers-loader.js.map +7 -0
  247. package/loaders/statsig-experiment-loader.d.ts +20 -0
  248. package/loaders/statsig-experiment-loader.js +81 -0
  249. package/loaders/statsig-experiment-loader.js.map +7 -0
  250. package/loaders/yotpo-review-aggregate-loader.d.ts +12 -0
  251. package/loaders/yotpo-review-aggregate-loader.js +50 -0
  252. package/loaders/yotpo-review-aggregate-loader.js.map +7 -0
  253. package/loaders/yotpo-reviews-loader.d.ts +14 -0
  254. package/loaders/yotpo-reviews-loader.js +65 -0
  255. package/loaders/yotpo-reviews-loader.js.map +7 -0
  256. package/money.d.ts +9 -0
  257. package/money.js +13 -0
  258. package/money.js.map +7 -0
  259. package/next/config.d.ts +4 -0
  260. package/next/config.js +91 -0
  261. package/next/config.js.map +7 -0
  262. package/next/image-loader.d.ts +2 -0
  263. package/next/image-loader.js +52 -0
  264. package/next/image-loader.js.map +7 -0
  265. package/next/open-next.d.ts +2 -0
  266. package/next/open-next.js +24 -0
  267. package/next/open-next.js.map +7 -0
  268. package/orders/order-status-schema.d.ts +161 -0
  269. package/orders/order-status-schema.js +83 -0
  270. package/orders/order-status-schema.js.map +7 -0
  271. package/orders/order-status.d.ts +11 -0
  272. package/orders/order-status.js +41 -0
  273. package/orders/order-status.js.map +7 -0
  274. package/package.json +216 -0
  275. package/providers/query-provider.d.ts +1 -0
  276. package/providers/query-provider.js +12 -0
  277. package/providers/query-provider.js.map +7 -0
  278. package/providers/replo-provider.d.ts +1 -0
  279. package/providers/replo-provider.js +22 -0
  280. package/providers/replo-provider.js.map +7 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * TypeScript types for cart data structures. Use these types when working with cart data, but don't import from this module directly in components - use the cart hooks instead.
3
+ * @module
4
+ */
5
+ import type { SellingPlanGroup } from "../loaders/loader-schemas";
6
+ export interface Image {
7
+ url: string;
8
+ altText: string | null;
9
+ }
10
+ export interface CartLineMerchandise {
11
+ id: string;
12
+ product: {
13
+ id: string;
14
+ title: string;
15
+ sellingPlanGroups?: SellingPlanGroup[];
16
+ };
17
+ title: string;
18
+ /** Integer minor units (Stripe convention): 1999 = $19.99 USD */
19
+ price: number;
20
+ compareAtPrice?: number | null;
21
+ image: Image | null;
22
+ selectedOptions: {
23
+ name: string;
24
+ value: string;
25
+ }[];
26
+ }
27
+ export interface CartLineAttribute {
28
+ key: string;
29
+ value: string | number | boolean;
30
+ }
31
+ /** Replo attribution property added to cart/buy-now line items for order attribution in Shopify. */
32
+ export declare const REPLO_ATTRIBUTION_PROPERTY: CartLineAttribute;
33
+ export interface SellingPlanPriceAdjustment {
34
+ compareAtPrice: {
35
+ amount: number;
36
+ currencyCode: string;
37
+ };
38
+ perDeliveryPrice: {
39
+ amount: number;
40
+ currencyCode: string;
41
+ };
42
+ price: {
43
+ amount: number;
44
+ currencyCode: string;
45
+ };
46
+ unitPrice: {
47
+ amount: number;
48
+ currencyCode: string;
49
+ } | null;
50
+ }
51
+ export interface SellingPlanAllocation {
52
+ sellingPlan: {
53
+ id: string;
54
+ name: string;
55
+ description: string | null;
56
+ };
57
+ priceAdjustments: SellingPlanPriceAdjustment[];
58
+ checkoutChargeAmount: {
59
+ amount: number;
60
+ currencyCode: string;
61
+ };
62
+ remainingBalanceChargeAmount: {
63
+ amount: number;
64
+ currencyCode: string;
65
+ };
66
+ }
67
+ export interface CartLine {
68
+ id: string;
69
+ quantity: number;
70
+ /**
71
+ * Null when this is an optimistic line whose merchandise couldn't be
72
+ * resolved from the query cache or passed explicitly. Consumers should
73
+ * render a skeleton/loading state in that case; the line is replaced
74
+ * with real merchandise once the server roundtrip lands.
75
+ */
76
+ merchandise: CartLineMerchandise | null;
77
+ attributes: CartLineAttribute[];
78
+ sellingPlanAllocation?: SellingPlanAllocation | null;
79
+ }
80
+ export interface CartCost {
81
+ /** Integer minor units (Stripe convention) in currencyCode */
82
+ subtotalAmount: number;
83
+ totalAmount: number;
84
+ currencyCode: string;
85
+ }
86
+ /**
87
+ * Represents a discount code applied to a cart.
88
+ */
89
+ export interface CartDiscountCode {
90
+ /** The discount code string */
91
+ code: string;
92
+ /**
93
+ * Whether the discount code is applicable to the current cart.
94
+ * A code may not be applicable due to:
95
+ * - Cart contents not meeting product/collection eligibility
96
+ * - Minimum purchase amount not met
97
+ * - Code expired or usage limits reached
98
+ * - Customer restrictions
99
+ * - Conflicting discount rules
100
+ */
101
+ applicable: boolean;
102
+ }
103
+ export interface Cart {
104
+ id: string;
105
+ lines: CartLine[];
106
+ cost: CartCost;
107
+ checkoutUrl?: string;
108
+ discountCodes?: CartDiscountCode[];
109
+ }
110
+ export interface CartLinePayload {
111
+ id: string;
112
+ quantity: number;
113
+ merchandise?: CartLineMerchandise;
114
+ properties?: CartLineAttribute[];
115
+ sellingPlanId?: string | null;
116
+ }
117
+ export interface AddToCartPayload {
118
+ lines: CartLinePayload[];
119
+ cartId: string;
120
+ }
121
+ export interface UpdateCartLineItemPayload {
122
+ line: CartLinePayload;
123
+ cartId: string;
124
+ }
125
+ export interface RemoveFromCartPayload {
126
+ lineIds: string[];
127
+ cartId: string;
128
+ }
129
+ export interface UpdateCartDiscountCodesPayload {
130
+ cartId: string;
131
+ discountCodes: string[];
132
+ }
@@ -0,0 +1,8 @@
1
+ const REPLO_ATTRIBUTION_PROPERTY = {
2
+ key: "_replo",
3
+ value: "true"
4
+ };
5
+ export {
6
+ REPLO_ATTRIBUTION_PROPERTY
7
+ };
8
+ //# sourceMappingURL=cart-types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../cart/cart-types.ts"],
4
+ "sourcesContent": ["/**\n * TypeScript types for cart data structures. Use these types when working with cart data, but don't import from this module directly in components - use the cart hooks instead.\n * @module\n */\n\nimport type { SellingPlanGroup } from \"../loaders/loader-schemas\";\n\nexport interface Image {\n url: string;\n altText: string | null;\n}\n\nexport interface CartLineMerchandise {\n id: string;\n product: {\n id: string;\n title: string;\n sellingPlanGroups?: SellingPlanGroup[];\n };\n title: string;\n /** Integer minor units (Stripe convention): 1999 = $19.99 USD */\n price: number;\n compareAtPrice?: number | null;\n image: Image | null;\n selectedOptions: {\n name: string;\n value: string;\n }[];\n}\n\nexport interface CartLineAttribute {\n key: string;\n value: string | number | boolean;\n}\n\n/** Replo attribution property added to cart/buy-now line items for order attribution in Shopify. */\nexport const REPLO_ATTRIBUTION_PROPERTY: CartLineAttribute = {\n key: \"_replo\",\n value: \"true\",\n};\n\nexport interface SellingPlanPriceAdjustment {\n compareAtPrice: {\n amount: number;\n currencyCode: string;\n };\n perDeliveryPrice: {\n amount: number;\n currencyCode: string;\n };\n price: {\n amount: number;\n currencyCode: string;\n };\n unitPrice: {\n amount: number;\n currencyCode: string;\n } | null;\n}\n\nexport interface SellingPlanAllocation {\n sellingPlan: {\n id: string;\n name: string;\n description: string | null;\n };\n priceAdjustments: SellingPlanPriceAdjustment[];\n checkoutChargeAmount: {\n amount: number;\n currencyCode: string;\n };\n remainingBalanceChargeAmount: {\n amount: number;\n currencyCode: string;\n };\n}\n\nexport interface CartLine {\n id: string;\n quantity: number;\n /**\n * Null when this is an optimistic line whose merchandise couldn't be\n * resolved from the query cache or passed explicitly. Consumers should\n * render a skeleton/loading state in that case; the line is replaced\n * with real merchandise once the server roundtrip lands.\n */\n merchandise: CartLineMerchandise | null;\n attributes: CartLineAttribute[];\n sellingPlanAllocation?: SellingPlanAllocation | null;\n}\n\nexport interface CartCost {\n /** Integer minor units (Stripe convention) in currencyCode */\n subtotalAmount: number;\n totalAmount: number;\n currencyCode: string;\n}\n\n/**\n * Represents a discount code applied to a cart.\n */\nexport interface CartDiscountCode {\n /** The discount code string */\n code: string;\n /**\n * Whether the discount code is applicable to the current cart.\n * A code may not be applicable due to:\n * - Cart contents not meeting product/collection eligibility\n * - Minimum purchase amount not met\n * - Code expired or usage limits reached\n * - Customer restrictions\n * - Conflicting discount rules\n */\n applicable: boolean;\n}\n\nexport interface Cart {\n id: string;\n lines: CartLine[];\n cost: CartCost;\n checkoutUrl?: string;\n discountCodes?: CartDiscountCode[];\n}\n\nexport interface CartLinePayload {\n id: string;\n quantity: number;\n merchandise?: CartLineMerchandise;\n properties?: CartLineAttribute[];\n sellingPlanId?: string | null;\n}\n\nexport interface AddToCartPayload {\n lines: CartLinePayload[];\n cartId: string;\n}\n\nexport interface UpdateCartLineItemPayload {\n line: CartLinePayload;\n cartId: string;\n}\n\nexport interface RemoveFromCartPayload {\n lineIds: string[];\n cartId: string;\n}\n\nexport interface UpdateCartDiscountCodesPayload {\n cartId: string;\n discountCodes: string[];\n}\n"],
5
+ "mappings": "AAoCO,MAAM,6BAAgD;AAAA,EAC3D,KAAK;AAAA,EACL,OAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1 @@
1
+ export declare const REPLO_CART_COOKIE_NAME = "replo_cart_v2";
@@ -0,0 +1,5 @@
1
+ const REPLO_CART_COOKIE_NAME = "replo_cart_v2";
2
+ export {
3
+ REPLO_CART_COOKIE_NAME
4
+ };
5
+ //# sourceMappingURL=cart-constants.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../cart/gateways/cart-constants.ts"],
4
+ "sourcesContent": ["// NOTE (Max, 2026-07-21): the cookie holds the native Replo cart \u2014 the Stripe and\n// default gateways both use it, so the checkout provider is incidental to the name.\n// NOTE (Max, 2026-07-31): the `_v2` suffix retires cookies written before the\n// integer-minor-units flip (REPL-30044). A pre-flip cookie holds decimal\n// major-unit prices; reading it under the new SDK would reinterpret 19.99 as 19\n// minor units. The persisted cart carries no schema version, so the name is the\n// version \u2014 a bumped name abandons stale carts (they expire in 30d) instead of\n// silently rescaling them.\nexport const REPLO_CART_COOKIE_NAME = \"replo_cart_v2\";\n"],
5
+ "mappings": "AAQO,MAAM,yBAAyB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { AddToCartPayload, Cart, CartLinePayload, RemoveFromCartPayload, UpdateCartDiscountCodesPayload, UpdateCartLineItemPayload } from "../cart-types";
2
+ export interface CartGateway {
3
+ getCart(cartId: string): Promise<Cart | null>;
4
+ createCart(lines?: CartLinePayload[], discountCodes?: string[]): Promise<Cart | null>;
5
+ addToCart(cartPayload: AddToCartPayload): Promise<Cart | null>;
6
+ updateCartLineItem(cartPayload: UpdateCartLineItemPayload): Promise<Cart | null>;
7
+ removeCartLineItems(cartPayload: RemoveFromCartPayload): Promise<Cart | null>;
8
+ updateCartDiscountCodes(cartPayload: UpdateCartDiscountCodesPayload): Promise<Cart | null>;
9
+ }
10
+ export declare function getCartGateway(): Promise<CartGateway>;
@@ -0,0 +1,19 @@
1
+ "use server";
2
+ import { getCheckoutProvider } from "../../lib/integration-utils";
3
+ import { createDefaultCartGateway } from "./default-cart-gateway";
4
+ import { createResolverCartGateway } from "./resolver-cart-gateway";
5
+ import { createStripeCartGateway } from "./stripe-cart-gateway";
6
+ async function getCartGateway() {
7
+ const checkoutProvider = await getCheckoutProvider();
8
+ if (checkoutProvider === "stripe") {
9
+ return await createStripeCartGateway();
10
+ } else if (checkoutProvider === "shopify") {
11
+ return await createResolverCartGateway();
12
+ } else {
13
+ return await createDefaultCartGateway();
14
+ }
15
+ }
16
+ export {
17
+ getCartGateway
18
+ };
19
+ //# sourceMappingURL=cart-gateway.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../cart/gateways/cart-gateway.ts"],
4
+ "sourcesContent": ["\"use server\";\n\nimport type {\n AddToCartPayload,\n Cart,\n CartLinePayload,\n RemoveFromCartPayload,\n UpdateCartDiscountCodesPayload,\n UpdateCartLineItemPayload,\n} from \"../cart-types\";\n\nimport { getCheckoutProvider } from \"../../lib/integration-utils\";\nimport { createDefaultCartGateway } from \"./default-cart-gateway\";\nimport { createResolverCartGateway } from \"./resolver-cart-gateway\";\nimport { createStripeCartGateway } from \"./stripe-cart-gateway\";\n\nexport interface CartGateway {\n getCart(cartId: string): Promise<Cart | null>;\n createCart(\n lines?: CartLinePayload[],\n discountCodes?: string[],\n ): Promise<Cart | null>;\n addToCart(cartPayload: AddToCartPayload): Promise<Cart | null>;\n updateCartLineItem(\n cartPayload: UpdateCartLineItemPayload,\n ): Promise<Cart | null>;\n removeCartLineItems(cartPayload: RemoveFromCartPayload): Promise<Cart | null>;\n updateCartDiscountCodes(\n cartPayload: UpdateCartDiscountCodesPayload,\n ): Promise<Cart | null>;\n}\n\nexport async function getCartGateway(): Promise<CartGateway> {\n const checkoutProvider = await getCheckoutProvider();\n\n if (checkoutProvider === \"stripe\") {\n return await createStripeCartGateway();\n } else if (checkoutProvider === \"shopify\") {\n return await createResolverCartGateway();\n } else {\n return await createDefaultCartGateway();\n }\n}\n"],
5
+ "mappings": ";AAWA,SAAS,2BAA2B;AACpC,SAAS,gCAAgC;AACzC,SAAS,iCAAiC;AAC1C,SAAS,+BAA+B;AAkBxC,eAAsB,iBAAuC;AAC3D,QAAM,mBAAmB,MAAM,oBAAoB;AAEnD,MAAI,qBAAqB,UAAU;AACjC,WAAO,MAAM,wBAAwB;AAAA,EACvC,WAAW,qBAAqB,WAAW;AACzC,WAAO,MAAM,0BAA0B;AAAA,EACzC,OAAO;AACL,WAAO,MAAM,yBAAyB;AAAA,EACxC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,28 @@
1
+ import type { AddToCartPayload, Cart, CartLinePayload, RemoveFromCartPayload, UpdateCartDiscountCodesPayload, UpdateCartLineItemPayload } from "../cart-types";
2
+ import type { LineMergeFn } from "../utils/cookie-cart-persistence";
3
+ import type { CartGateway } from "./cart-gateway";
4
+ /**
5
+ * Configuration for cookie-based cart gateways
6
+ */
7
+ interface CookieCartConfig {
8
+ cookieName: string;
9
+ lineMergeFn: LineMergeFn;
10
+ lineIdGenerator: () => string;
11
+ cartIdGenerator: () => string;
12
+ gatewayName: string;
13
+ }
14
+ /**
15
+ * Abstract base class for cookie-based cart gateways.
16
+ * Provides common error handling, logging, and cart operations.
17
+ * Subclasses must provide gateway-specific configuration.
18
+ */
19
+ export declare abstract class CookieBasedCartGateway implements CartGateway {
20
+ protected abstract readonly config: CookieCartConfig;
21
+ getCart(cartId: string): Promise<Cart | null>;
22
+ createCart(lines?: CartLinePayload[], _discountCodes?: string[]): Promise<Cart | null>;
23
+ addToCart(cartPayload: AddToCartPayload): Promise<Cart | null>;
24
+ updateCartLineItem(cartPayload: UpdateCartLineItemPayload): Promise<Cart | null>;
25
+ removeCartLineItems(cartPayload: RemoveFromCartPayload): Promise<Cart | null>;
26
+ updateCartDiscountCodes(cartPayload: UpdateCartDiscountCodesPayload): Promise<Cart | null>;
27
+ }
28
+ export {};
@@ -0,0 +1,109 @@
1
+ import {
2
+ addToCartWithPersistence,
3
+ createCartWithPersistence,
4
+ loadCartFromCookie,
5
+ removeCartLineItemsWithPersistence,
6
+ updateCartLineItemWithPersistence
7
+ } from "../utils/cookie-cart-persistence";
8
+ class CookieBasedCartGateway {
9
+ async getCart(cartId) {
10
+ try {
11
+ const cart = await loadCartFromCookie(this.config.cookieName);
12
+ return cart?.id === cartId ? cart : null;
13
+ } catch (error) {
14
+ console.warn(
15
+ `${this.config.gatewayName} cart ${cartId} not found, could not fetch cart:`,
16
+ error
17
+ );
18
+ return null;
19
+ }
20
+ }
21
+ async createCart(lines, _discountCodes) {
22
+ try {
23
+ const cart = await createCartWithPersistence({
24
+ cookieName: this.config.cookieName,
25
+ lines,
26
+ lineIdGenerator: this.config.lineIdGenerator,
27
+ cartIdGenerator: this.config.cartIdGenerator
28
+ });
29
+ return cart;
30
+ } catch (createCartError) {
31
+ console.warn(
32
+ `Failed to create ${this.config.gatewayName} cart${lines?.length ? " with lines" : ""}:`,
33
+ createCartError
34
+ );
35
+ return null;
36
+ }
37
+ }
38
+ async addToCart(cartPayload) {
39
+ try {
40
+ const cartData = await addToCartWithPersistence(cartPayload, {
41
+ cookieName: this.config.cookieName,
42
+ mergeFn: this.config.lineMergeFn,
43
+ lineIdGenerator: this.config.lineIdGenerator
44
+ });
45
+ return cartData;
46
+ } catch (error) {
47
+ console.warn(`Failed to add items to ${this.config.gatewayName} cart:`, {
48
+ error: error instanceof Error ? error.message : String(error),
49
+ cartId: cartPayload.cartId,
50
+ itemCount: cartPayload.lines.length
51
+ });
52
+ return null;
53
+ }
54
+ }
55
+ async updateCartLineItem(cartPayload) {
56
+ try {
57
+ const cartData = await updateCartLineItemWithPersistence(
58
+ cartPayload,
59
+ this.config.cookieName
60
+ );
61
+ return cartData;
62
+ } catch (error) {
63
+ console.warn(
64
+ `Failed to update ${this.config.gatewayName} cart line item:`,
65
+ {
66
+ error: error instanceof Error ? error.message : String(error),
67
+ cartId: cartPayload.cartId,
68
+ lineId: cartPayload.line.id,
69
+ quantity: cartPayload.line.quantity
70
+ }
71
+ );
72
+ return null;
73
+ }
74
+ }
75
+ async removeCartLineItems(cartPayload) {
76
+ try {
77
+ const cartData = await removeCartLineItemsWithPersistence(
78
+ cartPayload,
79
+ this.config.cookieName
80
+ );
81
+ return cartData;
82
+ } catch (error) {
83
+ console.warn(
84
+ `Failed to remove ${this.config.gatewayName} cart line items:`,
85
+ {
86
+ error: error instanceof Error ? error.message : String(error),
87
+ cartId: cartPayload.cartId,
88
+ lineIds: cartPayload.lineIds
89
+ }
90
+ );
91
+ return null;
92
+ }
93
+ }
94
+ async updateCartDiscountCodes(cartPayload) {
95
+ console.warn(
96
+ `${this.config.gatewayName} cart gateway does not yet support discount codes`
97
+ );
98
+ try {
99
+ return await this.getCart(cartPayload.cartId);
100
+ } catch (error) {
101
+ console.warn("Failed to fetch cart for discount code update:", error);
102
+ return null;
103
+ }
104
+ }
105
+ }
106
+ export {
107
+ CookieBasedCartGateway
108
+ };
109
+ //# sourceMappingURL=cookie-cart-gateway.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../cart/gateways/cookie-cart-gateway.ts"],
4
+ "sourcesContent": ["import type {\n AddToCartPayload,\n Cart,\n CartLinePayload,\n RemoveFromCartPayload,\n UpdateCartDiscountCodesPayload,\n UpdateCartLineItemPayload,\n} from \"../cart-types\";\nimport type { LineMergeFn } from \"../utils/cookie-cart-persistence\";\nimport type { CartGateway } from \"./cart-gateway\";\n\nimport {\n addToCartWithPersistence,\n createCartWithPersistence,\n loadCartFromCookie,\n removeCartLineItemsWithPersistence,\n updateCartLineItemWithPersistence,\n} from \"../utils/cookie-cart-persistence\";\n\n/**\n * Configuration for cookie-based cart gateways\n */\ninterface CookieCartConfig {\n cookieName: string;\n lineMergeFn: LineMergeFn;\n lineIdGenerator: () => string;\n cartIdGenerator: () => string;\n gatewayName: string; // For logging (e.g., \"Stripe\", \"Default\")\n}\n\n/**\n * Abstract base class for cookie-based cart gateways.\n * Provides common error handling, logging, and cart operations.\n * Subclasses must provide gateway-specific configuration.\n */\nexport abstract class CookieBasedCartGateway implements CartGateway {\n protected abstract readonly config: CookieCartConfig;\n\n async getCart(cartId: string): Promise<Cart | null> {\n try {\n const cart = await loadCartFromCookie(this.config.cookieName);\n return cart?.id === cartId ? cart : null;\n } catch (error) {\n console.warn(\n `${this.config.gatewayName} cart ${cartId} not found, could not fetch cart:`,\n error,\n );\n return null;\n }\n }\n\n async createCart(\n lines?: CartLinePayload[],\n _discountCodes?: string[],\n ): Promise<Cart | null> {\n try {\n const cart = await createCartWithPersistence({\n cookieName: this.config.cookieName,\n lines,\n lineIdGenerator: this.config.lineIdGenerator,\n cartIdGenerator: this.config.cartIdGenerator,\n });\n return cart;\n } catch (createCartError) {\n console.warn(\n `Failed to create ${this.config.gatewayName} cart${lines?.length ? \" with lines\" : \"\"}:`,\n createCartError,\n );\n return null;\n }\n }\n\n async addToCart(cartPayload: AddToCartPayload): Promise<Cart | null> {\n try {\n const cartData = await addToCartWithPersistence(cartPayload, {\n cookieName: this.config.cookieName,\n mergeFn: this.config.lineMergeFn,\n lineIdGenerator: this.config.lineIdGenerator,\n });\n return cartData;\n } catch (error) {\n console.warn(`Failed to add items to ${this.config.gatewayName} cart:`, {\n error: error instanceof Error ? error.message : String(error),\n cartId: cartPayload.cartId,\n itemCount: cartPayload.lines.length,\n });\n return null;\n }\n }\n\n async updateCartLineItem(\n cartPayload: UpdateCartLineItemPayload,\n ): Promise<Cart | null> {\n try {\n const cartData = await updateCartLineItemWithPersistence(\n cartPayload,\n this.config.cookieName,\n );\n return cartData;\n } catch (error) {\n console.warn(\n `Failed to update ${this.config.gatewayName} cart line item:`,\n {\n error: error instanceof Error ? error.message : String(error),\n cartId: cartPayload.cartId,\n lineId: cartPayload.line.id,\n quantity: cartPayload.line.quantity,\n },\n );\n return null;\n }\n }\n\n async removeCartLineItems(\n cartPayload: RemoveFromCartPayload,\n ): Promise<Cart | null> {\n try {\n const cartData = await removeCartLineItemsWithPersistence(\n cartPayload,\n this.config.cookieName,\n );\n return cartData;\n } catch (error) {\n console.warn(\n `Failed to remove ${this.config.gatewayName} cart line items:`,\n {\n error: error instanceof Error ? error.message : String(error),\n cartId: cartPayload.cartId,\n lineIds: cartPayload.lineIds,\n },\n );\n return null;\n }\n }\n\n async updateCartDiscountCodes(\n cartPayload: UpdateCartDiscountCodesPayload,\n ): Promise<Cart | null> {\n console.warn(\n `${this.config.gatewayName} cart gateway does not yet support discount codes`,\n );\n // Return existing cart without changes\n try {\n return await this.getCart(cartPayload.cartId);\n } catch (error) {\n console.warn(\"Failed to fetch cart for discount code update:\", error);\n return null;\n }\n }\n}\n"],
5
+ "mappings": "AAWA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAkBA,MAAe,uBAA8C;AAAA,EAGlE,MAAM,QAAQ,QAAsC;AAClD,QAAI;AACF,YAAM,OAAO,MAAM,mBAAmB,KAAK,OAAO,UAAU;AAC5D,aAAO,MAAM,OAAO,SAAS,OAAO;AAAA,IACtC,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,GAAG,KAAK,OAAO,WAAW,SAAS,MAAM;AAAA,QACzC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,OACA,gBACsB;AACtB,QAAI;AACF,YAAM,OAAO,MAAM,0BAA0B;AAAA,QAC3C,YAAY,KAAK,OAAO;AAAA,QACxB;AAAA,QACA,iBAAiB,KAAK,OAAO;AAAA,QAC7B,iBAAiB,KAAK,OAAO;AAAA,MAC/B,CAAC;AACD,aAAO;AAAA,IACT,SAAS,iBAAiB;AACxB,cAAQ;AAAA,QACN,oBAAoB,KAAK,OAAO,WAAW,QAAQ,OAAO,SAAS,gBAAgB,EAAE;AAAA,QACrF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,aAAqD;AACnE,QAAI;AACF,YAAM,WAAW,MAAM,yBAAyB,aAAa;AAAA,QAC3D,YAAY,KAAK,OAAO;AAAA,QACxB,SAAS,KAAK,OAAO;AAAA,QACrB,iBAAiB,KAAK,OAAO;AAAA,MAC/B,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ,KAAK,0BAA0B,KAAK,OAAO,WAAW,UAAU;AAAA,QACtE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,QAAQ,YAAY;AAAA,QACpB,WAAW,YAAY,MAAM;AAAA,MAC/B,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,aACsB;AACtB,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA,KAAK,OAAO;AAAA,MACd;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,oBAAoB,KAAK,OAAO,WAAW;AAAA,QAC3C;AAAA,UACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D,QAAQ,YAAY;AAAA,UACpB,QAAQ,YAAY,KAAK;AAAA,UACzB,UAAU,YAAY,KAAK;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,oBACJ,aACsB;AACtB,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB;AAAA,QACA,KAAK,OAAO;AAAA,MACd;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,oBAAoB,KAAK,OAAO,WAAW;AAAA,QAC3C;AAAA,UACE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC5D,QAAQ,YAAY;AAAA,UACpB,SAAS,YAAY;AAAA,QACvB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,wBACJ,aACsB;AACtB,YAAQ;AAAA,MACN,GAAG,KAAK,OAAO,WAAW;AAAA,IAC5B;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,YAAY,MAAM;AAAA,IAC9C,SAAS,OAAO;AACd,cAAQ,KAAK,kDAAkD,KAAK;AACpE,aAAO;AAAA,IACT;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ import type { CartLine, CartLinePayload } from "../cart-types";
2
+ import { CookieBasedCartGateway } from "./cookie-cart-gateway";
3
+ /**
4
+ * Merges lines by merchandise ID and selling plan
5
+ */
6
+ declare function defaultLineMergeFn(existingLines: CartLine[], newLine: CartLinePayload): number;
7
+ declare function defaultLineIdGenerator(): string;
8
+ declare function defaultCartIdGenerator(): string;
9
+ declare class DefaultCartGateway extends CookieBasedCartGateway {
10
+ protected readonly config: {
11
+ cookieName: string;
12
+ lineMergeFn: typeof defaultLineMergeFn;
13
+ lineIdGenerator: typeof defaultLineIdGenerator;
14
+ cartIdGenerator: typeof defaultCartIdGenerator;
15
+ gatewayName: string;
16
+ };
17
+ }
18
+ export declare function createDefaultCartGateway(): Promise<DefaultCartGateway>;
19
+ export {};
@@ -0,0 +1,30 @@
1
+ "use server";
2
+ import { CookieBasedCartGateway } from "./cookie-cart-gateway";
3
+ const DEFAULT_CART_COOKIE_NAME = "replo_default_cart_v2";
4
+ function defaultLineMergeFn(existingLines, newLine) {
5
+ return existingLines.findIndex((line) => {
6
+ return line.merchandise?.id === newLine.id && (newLine.sellingPlanId ?? null) === (line.sellingPlanAllocation?.sellingPlan.id ?? null);
7
+ });
8
+ }
9
+ function defaultLineIdGenerator() {
10
+ return crypto.randomUUID();
11
+ }
12
+ function defaultCartIdGenerator() {
13
+ return crypto.randomUUID();
14
+ }
15
+ class DefaultCartGateway extends CookieBasedCartGateway {
16
+ config = {
17
+ cookieName: DEFAULT_CART_COOKIE_NAME,
18
+ lineMergeFn: defaultLineMergeFn,
19
+ lineIdGenerator: defaultLineIdGenerator,
20
+ cartIdGenerator: defaultCartIdGenerator,
21
+ gatewayName: "Default"
22
+ };
23
+ }
24
+ async function createDefaultCartGateway() {
25
+ return new DefaultCartGateway();
26
+ }
27
+ export {
28
+ createDefaultCartGateway
29
+ };
30
+ //# sourceMappingURL=default-cart-gateway.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../cart/gateways/default-cart-gateway.ts"],
4
+ "sourcesContent": ["\"use server\";\n\nimport type { CartLine, CartLinePayload } from \"../cart-types\";\n\nimport { CookieBasedCartGateway } from \"./cookie-cart-gateway\";\n\n// NOTE (Max, 2026-07-31): `_v2` retires pre-integer-minor-units cookies\n// (REPL-30044) \u2014 see REPLO_CART_COOKIE_NAME in cart-constants.ts.\nconst DEFAULT_CART_COOKIE_NAME = \"replo_default_cart_v2\";\n\n/**\n * Merges lines by merchandise ID and selling plan\n */\nfunction defaultLineMergeFn(\n existingLines: CartLine[],\n newLine: CartLinePayload,\n): number {\n return existingLines.findIndex((line) => {\n return (\n line.merchandise?.id === newLine.id &&\n (newLine.sellingPlanId ?? null) ===\n (line.sellingPlanAllocation?.sellingPlan.id ?? null)\n );\n });\n}\n\nfunction defaultLineIdGenerator(): string {\n return crypto.randomUUID();\n}\n\nfunction defaultCartIdGenerator(): string {\n return crypto.randomUUID();\n}\n\nclass DefaultCartGateway extends CookieBasedCartGateway {\n protected readonly config = {\n cookieName: DEFAULT_CART_COOKIE_NAME,\n lineMergeFn: defaultLineMergeFn,\n lineIdGenerator: defaultLineIdGenerator,\n cartIdGenerator: defaultCartIdGenerator,\n gatewayName: \"Default\",\n };\n}\n\nexport async function createDefaultCartGateway(): Promise<DefaultCartGateway> {\n return new DefaultCartGateway();\n}\n"],
5
+ "mappings": ";AAIA,SAAS,8BAA8B;AAIvC,MAAM,2BAA2B;AAKjC,SAAS,mBACP,eACA,SACQ;AACR,SAAO,cAAc,UAAU,CAAC,SAAS;AACvC,WACE,KAAK,aAAa,OAAO,QAAQ,OAChC,QAAQ,iBAAiB,WACvB,KAAK,uBAAuB,YAAY,MAAM;AAAA,EAErD,CAAC;AACH;AAEA,SAAS,yBAAiC;AACxC,SAAO,OAAO,WAAW;AAC3B;AAEA,SAAS,yBAAiC;AACxC,SAAO,OAAO,WAAW;AAC3B;AAEA,MAAM,2BAA2B,uBAAuB;AAAA,EACnC,SAAS;AAAA,IAC1B,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEA,eAAsB,2BAAwD;AAC5E,SAAO,IAAI,mBAAmB;AAChC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import type { CartGateway } from "./cart-gateway";
2
+ export declare function createResolverCartGateway(): Promise<CartGateway>;
@@ -0,0 +1,109 @@
1
+ "use server";
2
+ import { getCanopyApiGateway } from "../../gateways/canopy-api";
3
+ class ResolverCartGateway {
4
+ // Returns the gateway's wire-parsed Cart where the client Cart is expected.
5
+ // Safe because client = wire + widenings only — enforced by the widening
6
+ // assertions in cart-schema.spec.ts.
7
+ async getCart(cartId) {
8
+ try {
9
+ const gateway = await getCanopyApiGateway();
10
+ return await gateway.cartGet({ cartId });
11
+ } catch (error) {
12
+ console.warn(`Cart ${cartId} not found via canopy-api:`, error);
13
+ return null;
14
+ }
15
+ }
16
+ async createCart(lines, discountCodes) {
17
+ try {
18
+ const gateway = await getCanopyApiGateway();
19
+ return await gateway.cartCreate({
20
+ lines: lines?.map((line) => ({
21
+ merchandiseId: line.id,
22
+ quantity: line.quantity,
23
+ attributes: line.properties?.map((prop) => ({
24
+ key: prop.key,
25
+ value: String(prop.value)
26
+ })),
27
+ sellingPlanId: line.sellingPlanId
28
+ })),
29
+ discountCodes
30
+ });
31
+ } catch (error) {
32
+ console.warn("Failed to create cart via canopy-api:", error);
33
+ return null;
34
+ }
35
+ }
36
+ async addToCart(cartPayload) {
37
+ try {
38
+ const gateway = await getCanopyApiGateway();
39
+ return await gateway.cartAddLines({
40
+ cartId: cartPayload.cartId,
41
+ lines: cartPayload.lines.map((line) => ({
42
+ merchandiseId: line.id,
43
+ quantity: line.quantity,
44
+ attributes: line.properties?.map((prop) => ({
45
+ key: prop.key,
46
+ value: String(prop.value)
47
+ })),
48
+ sellingPlanId: line.sellingPlanId
49
+ }))
50
+ });
51
+ } catch (error) {
52
+ console.warn("Failed to add to cart via canopy-api:", error);
53
+ return null;
54
+ }
55
+ }
56
+ async updateCartLineItem(cartPayload) {
57
+ try {
58
+ const gateway = await getCanopyApiGateway();
59
+ return await gateway.cartUpdateLines({
60
+ cartId: cartPayload.cartId,
61
+ lines: [
62
+ {
63
+ lineId: cartPayload.line.id,
64
+ quantity: cartPayload.line.quantity,
65
+ attributes: cartPayload.line.properties?.map((prop) => ({
66
+ key: prop.key,
67
+ value: String(prop.value)
68
+ })),
69
+ sellingPlanId: cartPayload.line.sellingPlanId
70
+ }
71
+ ]
72
+ });
73
+ } catch (error) {
74
+ console.warn("Failed to update cart line via canopy-api:", error);
75
+ return null;
76
+ }
77
+ }
78
+ async removeCartLineItems(cartPayload) {
79
+ try {
80
+ const gateway = await getCanopyApiGateway();
81
+ return await gateway.cartRemoveLines({
82
+ cartId: cartPayload.cartId,
83
+ lineIds: cartPayload.lineIds
84
+ });
85
+ } catch (error) {
86
+ console.warn("Failed to remove cart lines via canopy-api:", error);
87
+ return null;
88
+ }
89
+ }
90
+ async updateCartDiscountCodes(cartPayload) {
91
+ try {
92
+ const gateway = await getCanopyApiGateway();
93
+ return await gateway.cartUpdateDiscountCodes({
94
+ cartId: cartPayload.cartId,
95
+ discountCodes: cartPayload.discountCodes
96
+ });
97
+ } catch (error) {
98
+ console.warn("Failed to update discount codes via canopy-api:", error);
99
+ return null;
100
+ }
101
+ }
102
+ }
103
+ async function createResolverCartGateway() {
104
+ return new ResolverCartGateway();
105
+ }
106
+ export {
107
+ createResolverCartGateway
108
+ };
109
+ //# sourceMappingURL=resolver-cart-gateway.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../cart/gateways/resolver-cart-gateway.ts"],
4
+ "sourcesContent": ["\"use server\";\n\nimport type {\n AddToCartPayload,\n Cart,\n CartLinePayload,\n RemoveFromCartPayload,\n UpdateCartDiscountCodesPayload,\n UpdateCartLineItemPayload,\n} from \"../cart-types\";\nimport type { CartGateway } from \"./cart-gateway\";\n\nimport { getCanopyApiGateway } from \"../../gateways/canopy-api\";\n\n/**\n * @author Ryan\n * CartGateway that delegates all mutations to the canopy-api's cart\n * endpoints. Used for \"externalCart\" integrations (Shopify). canopy-api\n * handles credential resolution and upstream API calls.\n */\nclass ResolverCartGateway implements CartGateway {\n // Returns the gateway's wire-parsed Cart where the client Cart is expected.\n // Safe because client = wire + widenings only \u2014 enforced by the widening\n // assertions in cart-schema.spec.ts.\n async getCart(cartId: string): Promise<Cart | null> {\n try {\n const gateway = await getCanopyApiGateway();\n return await gateway.cartGet({ cartId });\n } catch (error) {\n console.warn(`Cart ${cartId} not found via canopy-api:`, error);\n return null;\n }\n }\n\n async createCart(\n lines?: CartLinePayload[],\n discountCodes?: string[],\n ): Promise<Cart | null> {\n try {\n const gateway = await getCanopyApiGateway();\n return await gateway.cartCreate({\n lines: lines?.map((line) => ({\n merchandiseId: line.id,\n quantity: line.quantity,\n attributes: line.properties?.map((prop) => ({\n key: prop.key,\n value: String(prop.value),\n })),\n sellingPlanId: line.sellingPlanId,\n })),\n discountCodes,\n });\n } catch (error) {\n console.warn(\"Failed to create cart via canopy-api:\", error);\n return null;\n }\n }\n\n async addToCart(cartPayload: AddToCartPayload): Promise<Cart | null> {\n try {\n const gateway = await getCanopyApiGateway();\n return await gateway.cartAddLines({\n cartId: cartPayload.cartId,\n lines: cartPayload.lines.map((line) => ({\n merchandiseId: line.id,\n quantity: line.quantity,\n attributes: line.properties?.map((prop) => ({\n key: prop.key,\n value: String(prop.value),\n })),\n sellingPlanId: line.sellingPlanId,\n })),\n });\n } catch (error) {\n console.warn(\"Failed to add to cart via canopy-api:\", error);\n return null;\n }\n }\n\n async updateCartLineItem(\n cartPayload: UpdateCartLineItemPayload,\n ): Promise<Cart | null> {\n try {\n const gateway = await getCanopyApiGateway();\n return await gateway.cartUpdateLines({\n cartId: cartPayload.cartId,\n lines: [\n {\n lineId: cartPayload.line.id,\n quantity: cartPayload.line.quantity,\n attributes: cartPayload.line.properties?.map((prop) => ({\n key: prop.key,\n value: String(prop.value),\n })),\n sellingPlanId: cartPayload.line.sellingPlanId,\n },\n ],\n });\n } catch (error) {\n console.warn(\"Failed to update cart line via canopy-api:\", error);\n return null;\n }\n }\n\n async removeCartLineItems(\n cartPayload: RemoveFromCartPayload,\n ): Promise<Cart | null> {\n try {\n const gateway = await getCanopyApiGateway();\n return await gateway.cartRemoveLines({\n cartId: cartPayload.cartId,\n lineIds: cartPayload.lineIds,\n });\n } catch (error) {\n console.warn(\"Failed to remove cart lines via canopy-api:\", error);\n return null;\n }\n }\n\n async updateCartDiscountCodes(\n cartPayload: UpdateCartDiscountCodesPayload,\n ): Promise<Cart | null> {\n try {\n const gateway = await getCanopyApiGateway();\n return await gateway.cartUpdateDiscountCodes({\n cartId: cartPayload.cartId,\n discountCodes: cartPayload.discountCodes,\n });\n } catch (error) {\n console.warn(\"Failed to update discount codes via canopy-api:\", error);\n return null;\n }\n }\n}\n\nexport async function createResolverCartGateway(): Promise<CartGateway> {\n return new ResolverCartGateway();\n}\n"],
5
+ "mappings": ";AAYA,SAAS,2BAA2B;AAQpC,MAAM,oBAA2C;AAAA;AAAA;AAAA;AAAA,EAI/C,MAAM,QAAQ,QAAsC;AAClD,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB;AAC1C,aAAO,MAAM,QAAQ,QAAQ,EAAE,OAAO,CAAC;AAAA,IACzC,SAAS,OAAO;AACd,cAAQ,KAAK,QAAQ,MAAM,8BAA8B,KAAK;AAC9D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,WACJ,OACA,eACsB;AACtB,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB;AAC1C,aAAO,MAAM,QAAQ,WAAW;AAAA,QAC9B,OAAO,OAAO,IAAI,CAAC,UAAU;AAAA,UAC3B,eAAe,KAAK;AAAA,UACpB,UAAU,KAAK;AAAA,UACf,YAAY,KAAK,YAAY,IAAI,CAAC,UAAU;AAAA,YAC1C,KAAK,KAAK;AAAA,YACV,OAAO,OAAO,KAAK,KAAK;AAAA,UAC1B,EAAE;AAAA,UACF,eAAe,KAAK;AAAA,QACtB,EAAE;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,yCAAyC,KAAK;AAC3D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,aAAqD;AACnE,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB;AAC1C,aAAO,MAAM,QAAQ,aAAa;AAAA,QAChC,QAAQ,YAAY;AAAA,QACpB,OAAO,YAAY,MAAM,IAAI,CAAC,UAAU;AAAA,UACtC,eAAe,KAAK;AAAA,UACpB,UAAU,KAAK;AAAA,UACf,YAAY,KAAK,YAAY,IAAI,CAAC,UAAU;AAAA,YAC1C,KAAK,KAAK;AAAA,YACV,OAAO,OAAO,KAAK,KAAK;AAAA,UAC1B,EAAE;AAAA,UACF,eAAe,KAAK;AAAA,QACtB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,yCAAyC,KAAK;AAC3D,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,mBACJ,aACsB;AACtB,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB;AAC1C,aAAO,MAAM,QAAQ,gBAAgB;AAAA,QACnC,QAAQ,YAAY;AAAA,QACpB,OAAO;AAAA,UACL;AAAA,YACE,QAAQ,YAAY,KAAK;AAAA,YACzB,UAAU,YAAY,KAAK;AAAA,YAC3B,YAAY,YAAY,KAAK,YAAY,IAAI,CAAC,UAAU;AAAA,cACtD,KAAK,KAAK;AAAA,cACV,OAAO,OAAO,KAAK,KAAK;AAAA,YAC1B,EAAE;AAAA,YACF,eAAe,YAAY,KAAK;AAAA,UAClC;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,8CAA8C,KAAK;AAChE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,oBACJ,aACsB;AACtB,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB;AAC1C,aAAO,MAAM,QAAQ,gBAAgB;AAAA,QACnC,QAAQ,YAAY;AAAA,QACpB,SAAS,YAAY;AAAA,MACvB,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,+CAA+C,KAAK;AACjE,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,wBACJ,aACsB;AACtB,QAAI;AACF,YAAM,UAAU,MAAM,oBAAoB;AAC1C,aAAO,MAAM,QAAQ,wBAAwB;AAAA,QAC3C,QAAQ,YAAY;AAAA,QACpB,eAAe,YAAY;AAAA,MAC7B,CAAC;AAAA,IACH,SAAS,OAAO;AACd,cAAQ,KAAK,mDAAmD,KAAK;AACrE,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAsB,4BAAkD;AACtE,SAAO,IAAI,oBAAoB;AACjC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ import type { CartLine, CartLinePayload } from "../cart-types";
2
+ import { CookieBasedCartGateway } from "./cookie-cart-gateway";
3
+ /**
4
+ * Merges lines by merchandise ID only (unlike default which also checks selling plan)
5
+ */
6
+ declare function stripeLineMergeFn(existingLines: CartLine[], newLine: CartLinePayload): number;
7
+ declare function stripeLineIdGenerator(): string;
8
+ declare function stripeCartIdGenerator(): string;
9
+ declare class StripeCartGateway extends CookieBasedCartGateway {
10
+ protected readonly config: {
11
+ cookieName: string;
12
+ lineMergeFn: typeof stripeLineMergeFn;
13
+ lineIdGenerator: typeof stripeLineIdGenerator;
14
+ cartIdGenerator: typeof stripeCartIdGenerator;
15
+ gatewayName: string;
16
+ };
17
+ }
18
+ export declare function createStripeCartGateway(): Promise<StripeCartGateway>;
19
+ export {};
@@ -0,0 +1,28 @@
1
+ "use server";
2
+ import { REPLO_CART_COOKIE_NAME } from "./cart-constants";
3
+ import { CookieBasedCartGateway } from "./cookie-cart-gateway";
4
+ function stripeLineMergeFn(existingLines, newLine) {
5
+ return existingLines.findIndex((line) => line.merchandise?.id === newLine.id);
6
+ }
7
+ function stripeLineIdGenerator() {
8
+ return crypto.randomUUID();
9
+ }
10
+ function stripeCartIdGenerator() {
11
+ return crypto.randomUUID();
12
+ }
13
+ class StripeCartGateway extends CookieBasedCartGateway {
14
+ config = {
15
+ cookieName: REPLO_CART_COOKIE_NAME,
16
+ lineMergeFn: stripeLineMergeFn,
17
+ lineIdGenerator: stripeLineIdGenerator,
18
+ cartIdGenerator: stripeCartIdGenerator,
19
+ gatewayName: "Stripe"
20
+ };
21
+ }
22
+ async function createStripeCartGateway() {
23
+ return new StripeCartGateway();
24
+ }
25
+ export {
26
+ createStripeCartGateway
27
+ };
28
+ //# sourceMappingURL=stripe-cart-gateway.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../cart/gateways/stripe-cart-gateway.ts"],
4
+ "sourcesContent": ["\"use server\";\n\nimport type { CartLine, CartLinePayload } from \"../cart-types\";\n\nimport { REPLO_CART_COOKIE_NAME } from \"./cart-constants\";\nimport { CookieBasedCartGateway } from \"./cookie-cart-gateway\";\n\n/**\n * Merges lines by merchandise ID only (unlike default which also checks selling plan)\n */\nfunction stripeLineMergeFn(\n existingLines: CartLine[],\n newLine: CartLinePayload,\n): number {\n return existingLines.findIndex((line) => line.merchandise?.id === newLine.id);\n}\n\nfunction stripeLineIdGenerator(): string {\n return crypto.randomUUID();\n}\n\nfunction stripeCartIdGenerator(): string {\n return crypto.randomUUID();\n}\n\nclass StripeCartGateway extends CookieBasedCartGateway {\n protected readonly config = {\n cookieName: REPLO_CART_COOKIE_NAME,\n lineMergeFn: stripeLineMergeFn,\n lineIdGenerator: stripeLineIdGenerator,\n cartIdGenerator: stripeCartIdGenerator,\n gatewayName: \"Stripe\",\n };\n}\n\nexport async function createStripeCartGateway(): Promise<StripeCartGateway> {\n return new StripeCartGateway();\n}\n"],
5
+ "mappings": ";AAIA,SAAS,8BAA8B;AACvC,SAAS,8BAA8B;AAKvC,SAAS,kBACP,eACA,SACQ;AACR,SAAO,cAAc,UAAU,CAAC,SAAS,KAAK,aAAa,OAAO,QAAQ,EAAE;AAC9E;AAEA,SAAS,wBAAgC;AACvC,SAAO,OAAO,WAAW;AAC3B;AAEA,SAAS,wBAAgC;AACvC,SAAO,OAAO,WAAW;AAC3B;AAEA,MAAM,0BAA0B,uBAAuB;AAAA,EAClC,SAAS;AAAA,IAC1B,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEA,eAAsB,0BAAsD;AAC1E,SAAO,IAAI,kBAAkB;AAC/B;",
6
+ "names": []
7
+ }