@rechargeapps/storefront-client 2.6.0 → 2.7.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.
- package/dist/cjs/api/address.js.map +1 -1
- package/dist/cjs/api/auth.js +1 -1
- package/dist/cjs/api/auth.js.map +1 -1
- package/dist/cjs/api/bundle.js +0 -1
- package/dist/cjs/api/bundle.js.map +1 -1
- package/dist/cjs/api/bundleData.js +1 -1
- package/dist/cjs/api/bundleData.js.map +1 -1
- package/dist/cjs/api/cdn.js.map +1 -1
- package/dist/cjs/api/charge.js.map +1 -1
- package/dist/cjs/api/collection.js.map +1 -1
- package/dist/cjs/api/credit.js.map +1 -1
- package/dist/cjs/api/customer.js +8 -7
- package/dist/cjs/api/customer.js.map +1 -1
- package/dist/cjs/api/customerSurveys.js.map +1 -1
- package/dist/cjs/api/flow.js.map +1 -1
- package/dist/cjs/api/gift.js.map +1 -1
- package/dist/cjs/api/membership.js.map +1 -1
- package/dist/cjs/api/membershipProgram.js.map +1 -1
- package/dist/cjs/api/metafield.js.map +1 -1
- package/dist/cjs/api/onetime.js.map +1 -1
- package/dist/cjs/api/order.js.map +1 -1
- package/dist/cjs/api/paymentMethod.js.map +1 -1
- package/dist/cjs/api/plan.js.map +1 -1
- package/dist/cjs/api/product.js.map +1 -1
- package/dist/cjs/api/store.js.map +1 -1
- package/dist/cjs/api/subscription.js.map +1 -1
- package/dist/cjs/api/tieredDiscount.js +0 -6
- package/dist/cjs/api/tieredDiscount.js.map +1 -1
- package/dist/cjs/constants/api.js.map +1 -1
- package/dist/cjs/mappers/cdn.js.map +1 -1
- package/dist/cjs/mappers/subscription.js.map +1 -1
- package/dist/cjs/mappers/utils.js.map +1 -1
- package/dist/cjs/utils/bundle.js +28 -51
- package/dist/cjs/utils/bundle.js.map +1 -1
- package/dist/cjs/utils/bundleData.js +4 -8
- package/dist/cjs/utils/bundleData.js.map +1 -1
- package/dist/cjs/utils/error.js.map +1 -1
- package/dist/cjs/utils/id.js.map +1 -1
- package/dist/cjs/utils/init.js.map +1 -1
- package/dist/cjs/utils/loadSpreedlyScript.js +34 -20
- package/dist/cjs/utils/loadSpreedlyScript.js.map +1 -1
- package/dist/cjs/utils/options.js.map +1 -1
- package/dist/cjs/utils/request.js +1 -1
- package/dist/cjs/utils/request.js.map +1 -1
- package/dist/cjs/utils/url.js.map +1 -1
- package/dist/esm/api/address.js +1 -1
- package/dist/esm/api/address.js.map +1 -1
- package/dist/esm/api/auth.js +1 -1
- package/dist/esm/api/auth.js.map +1 -1
- package/dist/esm/api/bundle.js +1 -2
- package/dist/esm/api/bundle.js.map +1 -1
- package/dist/esm/api/bundleData.js +1 -1
- package/dist/esm/api/bundleData.js.map +1 -1
- package/dist/esm/api/cdn.js.map +1 -1
- package/dist/esm/api/charge.js.map +1 -1
- package/dist/esm/api/collection.js.map +1 -1
- package/dist/esm/api/credit.js.map +1 -1
- package/dist/esm/api/customer.js +9 -8
- package/dist/esm/api/customer.js.map +1 -1
- package/dist/esm/api/customerSurveys.js.map +1 -1
- package/dist/esm/api/flow.js.map +1 -1
- package/dist/esm/api/gift.js.map +1 -1
- package/dist/esm/api/membership.js.map +1 -1
- package/dist/esm/api/membershipProgram.js.map +1 -1
- package/dist/esm/api/metafield.js.map +1 -1
- package/dist/esm/api/onetime.js.map +1 -1
- package/dist/esm/api/order.js.map +1 -1
- package/dist/esm/api/paymentMethod.js.map +1 -1
- package/dist/esm/api/plan.js.map +1 -1
- package/dist/esm/api/product.js.map +1 -1
- package/dist/esm/api/store.js.map +1 -1
- package/dist/esm/api/subscription.js.map +1 -1
- package/dist/esm/api/tieredDiscount.js +0 -6
- package/dist/esm/api/tieredDiscount.js.map +1 -1
- package/dist/esm/constants/api.js.map +1 -1
- package/dist/esm/mappers/cdn.js.map +1 -1
- package/dist/esm/mappers/subscription.js.map +1 -1
- package/dist/esm/mappers/utils.js.map +1 -1
- package/dist/esm/utils/bundle.js +29 -52
- package/dist/esm/utils/bundle.js.map +1 -1
- package/dist/esm/utils/bundleData.js +4 -8
- package/dist/esm/utils/bundleData.js.map +1 -1
- package/dist/esm/utils/error.js.map +1 -1
- package/dist/esm/utils/id.js.map +1 -1
- package/dist/esm/utils/init.js.map +1 -1
- package/dist/esm/utils/loadSpreedlyScript.js +34 -20
- package/dist/esm/utils/loadSpreedlyScript.js.map +1 -1
- package/dist/esm/utils/options.js.map +1 -1
- package/dist/esm/utils/request.js +2 -2
- package/dist/esm/utils/request.js.map +1 -1
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/index.d.ts +3 -7
- package/dist/umd/recharge-client.min.js +2 -2
- package/package.json +11 -10
package/dist/cjs/utils/bundle.js
CHANGED
|
@@ -2,29 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
var jsXdr = require('@stellar/js-xdr');
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
throw TypeError("Cannot " + msg);
|
|
5
|
+
var __typeError = (msg) => {
|
|
6
|
+
throw TypeError(msg);
|
|
8
7
|
};
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
16
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
17
|
-
};
|
|
18
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
19
|
-
__accessCheck(obj, member, "write to private field");
|
|
20
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
21
|
-
return value;
|
|
22
|
-
};
|
|
23
|
-
var __privateMethod = (obj, member, method) => {
|
|
24
|
-
__accessCheck(obj, member, "access private method");
|
|
25
|
-
return method;
|
|
26
|
-
};
|
|
27
|
-
var _bundleSettings, _items, _bundleData, _formatBundleSettings, formatBundleSettings_fn, _formatBundleData, formatBundleData_fn, _isValueInRange, isValueInRange_fn, _unique, unique_fn, _hasOwn, hasOwn_fn;
|
|
8
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
9
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
|
|
10
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
11
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
12
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
13
|
+
var _bundleSettings, _items, _bundleData, _BundleSelectionValidator_instances, formatBundleSettings_fn, formatBundleData_fn, isValueInRange_fn, unique_fn, hasOwn_fn;
|
|
28
14
|
const textEncoder = new TextEncoder();
|
|
29
15
|
const emptyExt = { v: 0 };
|
|
30
16
|
function toBase64(bytes) {
|
|
@@ -79,7 +65,7 @@ function toLineItemProperty(bundle) {
|
|
|
79
65
|
quantity: item.quantity,
|
|
80
66
|
ext: emptyExt
|
|
81
67
|
})),
|
|
82
|
-
version:
|
|
68
|
+
version: Math.floor(Date.now() / 1e3),
|
|
83
69
|
ext: emptyExt
|
|
84
70
|
}
|
|
85
71
|
};
|
|
@@ -87,18 +73,12 @@ function toLineItemProperty(bundle) {
|
|
|
87
73
|
}
|
|
88
74
|
class BundleSelectionValidator {
|
|
89
75
|
constructor(selectionItems, bundleData) {
|
|
90
|
-
__privateAdd(this,
|
|
91
|
-
__privateAdd(this,
|
|
92
|
-
__privateAdd(this,
|
|
93
|
-
__privateAdd(this,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
__privateAdd(this, _hasOwn);
|
|
97
|
-
__privateAdd(this, _bundleSettings, void 0);
|
|
98
|
-
__privateAdd(this, _items, void 0);
|
|
99
|
-
__privateAdd(this, _bundleData, void 0);
|
|
100
|
-
__privateSet(this, _bundleSettings, __privateMethod(this, _formatBundleSettings, formatBundleSettings_fn).call(this, bundleData));
|
|
101
|
-
__privateSet(this, _bundleData, __privateMethod(this, _formatBundleData, formatBundleData_fn).call(this, bundleData));
|
|
76
|
+
__privateAdd(this, _BundleSelectionValidator_instances);
|
|
77
|
+
__privateAdd(this, _bundleSettings);
|
|
78
|
+
__privateAdd(this, _items);
|
|
79
|
+
__privateAdd(this, _bundleData);
|
|
80
|
+
__privateSet(this, _bundleSettings, __privateMethod(this, _BundleSelectionValidator_instances, formatBundleSettings_fn).call(this, bundleData));
|
|
81
|
+
__privateSet(this, _bundleData, __privateMethod(this, _BundleSelectionValidator_instances, formatBundleData_fn).call(this, bundleData));
|
|
102
82
|
__privateSet(this, _items, selectionItems);
|
|
103
83
|
}
|
|
104
84
|
isInitialDataValid() {
|
|
@@ -122,7 +102,7 @@ class BundleSelectionValidator {
|
|
|
122
102
|
isSelectionInVariantRange(externalVariantId) {
|
|
123
103
|
const total = __privateGet(this, _items).reduce((acc, current) => acc + current.quantity, 0);
|
|
124
104
|
const ranges = __privateGet(this, _bundleSettings)?.variantsSettings[externalVariantId].ranges || [];
|
|
125
|
-
if (!__privateMethod(this,
|
|
105
|
+
if (!__privateMethod(this, _BundleSelectionValidator_instances, isValueInRange_fn).call(this, ranges, total)) {
|
|
126
106
|
throw "The total number of products does not fall within the required variant range.";
|
|
127
107
|
}
|
|
128
108
|
return true;
|
|
@@ -131,7 +111,7 @@ class BundleSelectionValidator {
|
|
|
131
111
|
const maxPerItem = __privateGet(this, _bundleSettings)?.bundleSettings.maxPerItem || 0;
|
|
132
112
|
const invalidProducts = __privateGet(this, _items).filter(({ quantity }) => quantity > maxPerItem);
|
|
133
113
|
if (maxPerItem && invalidProducts.length) {
|
|
134
|
-
const invalidIds = __privateMethod(this,
|
|
114
|
+
const invalidIds = __privateMethod(this, _BundleSelectionValidator_instances, unique_fn).call(this, invalidProducts.map(({ externalProductId }) => externalProductId)).join(", ");
|
|
135
115
|
throw `The selected products (${invalidIds}) exceed the maximum limit of ${maxPerItem} items per product.`;
|
|
136
116
|
}
|
|
137
117
|
return true;
|
|
@@ -140,10 +120,10 @@ class BundleSelectionValidator {
|
|
|
140
120
|
const variantSettings = __privateGet(this, _bundleSettings)?.variantsSettings[externalVariantId];
|
|
141
121
|
const optionSources = variantSettings?.optionSources;
|
|
142
122
|
const invalidCollections = __privateGet(this, _items).filter(
|
|
143
|
-
({ collectionId }) => !optionSources || !__privateMethod(this,
|
|
123
|
+
({ collectionId }) => !optionSources || !__privateMethod(this, _BundleSelectionValidator_instances, hasOwn_fn).call(this, optionSources, collectionId)
|
|
144
124
|
);
|
|
145
125
|
if (invalidCollections.length) {
|
|
146
|
-
const invalidIds = __privateMethod(this,
|
|
126
|
+
const invalidIds = __privateMethod(this, _BundleSelectionValidator_instances, unique_fn).call(this, invalidCollections.map(({ collectionId }) => collectionId)).join(", ");
|
|
147
127
|
throw `The collections (${invalidIds}) are no longer valid for the bundle variant (${externalVariantId}).`;
|
|
148
128
|
}
|
|
149
129
|
return true;
|
|
@@ -156,10 +136,10 @@ class BundleSelectionValidator {
|
|
|
156
136
|
const variantSettings = __privateGet(this, _bundleSettings)?.variantsSettings[externalVariantId];
|
|
157
137
|
const invalidItems = Object.values(variantSettings?.optionSources || {}).filter((collection) => {
|
|
158
138
|
const quantity = totalSelectedByCollection[collection.collectionId] || 0;
|
|
159
|
-
return !__privateMethod(this,
|
|
139
|
+
return !__privateMethod(this, _BundleSelectionValidator_instances, isValueInRange_fn).call(this, [collection], quantity);
|
|
160
140
|
});
|
|
161
141
|
if (!variantSettings || invalidItems.length) {
|
|
162
|
-
const invalidIds = __privateMethod(this,
|
|
142
|
+
const invalidIds = __privateMethod(this, _BundleSelectionValidator_instances, unique_fn).call(this, invalidItems.map(({ collectionId }) => collectionId)).join(", ");
|
|
163
143
|
throw `The selection exceeds the limits for the collections (${invalidIds}).`;
|
|
164
144
|
}
|
|
165
145
|
return true;
|
|
@@ -180,13 +160,13 @@ class BundleSelectionValidator {
|
|
|
180
160
|
throw `No collections found for the bundle variant (${externalVariantId}).`;
|
|
181
161
|
}
|
|
182
162
|
const missingProducts = __privateGet(this, _items).filter(({ externalProductId, collectionId }) => {
|
|
183
|
-
if (!__privateMethod(this,
|
|
163
|
+
if (!__privateMethod(this, _BundleSelectionValidator_instances, hasOwn_fn).call(this, variantCollections, collectionId)) {
|
|
184
164
|
return true;
|
|
185
165
|
}
|
|
186
|
-
return !__privateMethod(this,
|
|
166
|
+
return !__privateMethod(this, _BundleSelectionValidator_instances, hasOwn_fn).call(this, variantCollections[collectionId].products, externalProductId);
|
|
187
167
|
});
|
|
188
168
|
if (missingProducts.length) {
|
|
189
|
-
const invalidIds = __privateMethod(this,
|
|
169
|
+
const invalidIds = __privateMethod(this, _BundleSelectionValidator_instances, unique_fn).call(this, missingProducts.map(({ externalProductId }) => externalProductId)).join(", ");
|
|
190
170
|
throw `The products (${invalidIds}) are no longer valid for the bundle product.`;
|
|
191
171
|
}
|
|
192
172
|
return true;
|
|
@@ -205,7 +185,7 @@ class BundleSelectionValidator {
|
|
|
205
185
|
_bundleSettings = new WeakMap();
|
|
206
186
|
_items = new WeakMap();
|
|
207
187
|
_bundleData = new WeakMap();
|
|
208
|
-
|
|
188
|
+
_BundleSelectionValidator_instances = new WeakSet();
|
|
209
189
|
formatBundleSettings_fn = function(bundleData) {
|
|
210
190
|
try {
|
|
211
191
|
const bundleSettings = bundleData.bundle_settings;
|
|
@@ -216,8 +196,7 @@ formatBundleSettings_fn = function(bundleData) {
|
|
|
216
196
|
},
|
|
217
197
|
// null-proto seeds so external variant/option-source ids become real own keys, not prototype pollution
|
|
218
198
|
variantsSettings: bundleSettings.variants.reduce((acc, variant) => {
|
|
219
|
-
if (!variant.enabled)
|
|
220
|
-
return acc;
|
|
199
|
+
if (!variant.enabled) return acc;
|
|
221
200
|
let ranges = [{ min: variant.items_count, max: variant.items_count }];
|
|
222
201
|
if (!variant.items_count) {
|
|
223
202
|
ranges = variant.ranges.map(({ quantity_max, quantity_min }) => ({
|
|
@@ -244,7 +223,6 @@ formatBundleSettings_fn = function(bundleData) {
|
|
|
244
223
|
return null;
|
|
245
224
|
}
|
|
246
225
|
};
|
|
247
|
-
_formatBundleData = new WeakSet();
|
|
248
226
|
formatBundleData_fn = function(bundleData) {
|
|
249
227
|
try {
|
|
250
228
|
const collections = Object.values(bundleData.collections).reduce((acc, current) => {
|
|
@@ -262,7 +240,6 @@ formatBundleData_fn = function(bundleData) {
|
|
|
262
240
|
return null;
|
|
263
241
|
}
|
|
264
242
|
};
|
|
265
|
-
_isValueInRange = new WeakSet();
|
|
266
243
|
isValueInRange_fn = function(ranges, value) {
|
|
267
244
|
const matchedRanges = ranges.filter(({ min, max }) => {
|
|
268
245
|
const minValue = min ?? value;
|
|
@@ -271,11 +248,11 @@ isValueInRange_fn = function(ranges, value) {
|
|
|
271
248
|
});
|
|
272
249
|
return !!matchedRanges.length;
|
|
273
250
|
};
|
|
274
|
-
_unique = new WeakSet();
|
|
275
251
|
unique_fn = function(ids) {
|
|
276
252
|
return Array.from(new Set(ids));
|
|
277
253
|
};
|
|
278
|
-
|
|
254
|
+
// Own-property membership check. Guards against inherited keys (e.g. `__proto__`,
|
|
255
|
+
// `constructor`, `toString`) resolving to truthy values on plain-object maps.
|
|
279
256
|
hasOwn_fn = function(target, key) {
|
|
280
257
|
return Object.prototype.hasOwnProperty.call(target, key);
|
|
281
258
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundle.js","sources":["../../../src/utils/bundle.ts"],"sourcesContent":["import {\n array,\n enumType,\n field,\n int32,\n string as xdrString,\n struct,\n uint32,\n uint64,\n union,\n unionCase,\n voidType,\n UNBOUNDED_MAX_LENGTH,\n} from '@stellar/js-xdr';\nimport { BundleData as StorefrontBundleData, CDNBundleSettings } from '../types';\n\nconst textEncoder = new TextEncoder();\n\nconst emptyExt = { v: 0 } as const;\n\nfunction toBase64(bytes: Uint8Array) {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nconst EnvelopeType = enumType('EnvelopeType', {\n envelopeTypeBundle: 0,\n});\n\nconst BundleItemExt = union('BundleItemExt', {\n switchOn: int32(),\n switchKey: 'v',\n cases: [unionCase('v0', 0, voidType())],\n});\n\nconst BundleItem = struct('BundleItem', {\n collectionId: uint64(),\n productId: uint64(),\n variantId: uint64(),\n sku: xdrString(UNBOUNDED_MAX_LENGTH),\n quantity: uint32(),\n ext: BundleItemExt,\n});\n\nconst BundleExt = union('BundleExt', {\n switchOn: int32(),\n switchKey: 'v',\n cases: [unionCase('v0', 0, voidType())],\n});\n\nconst Bundle = struct('Bundle', {\n variantId: uint64(),\n items: array(BundleItem, 500),\n version: uint32(),\n ext: BundleExt,\n});\n\nconst BundleEnvelope = union('BundleEnvelope', {\n switchOn: EnvelopeType,\n switchKey: 'type',\n cases: [unionCase('envelopeTypeBundle', EnvelopeType.envelopeTypeBundle, field('v1', Bundle))],\n});\n\nexport function toLineItemProperty(bundle: { variantId: string; version: number; items: any[] }) {\n const value = {\n type: EnvelopeType.envelopeTypeBundle,\n v1: {\n variantId: BigInt(bundle.variantId.toString()),\n items: bundle.items.map(item => ({\n collectionId: BigInt(item.collectionId.toString()),\n productId: BigInt(item.productId.toString()),\n variantId: BigInt(item.variantId.toString()),\n sku: textEncoder.encode(item.sku || ''),\n quantity: item.quantity as number,\n ext: emptyExt,\n })),\n version: bundle.version || Math.floor(Date.now() / 1000),\n ext: emptyExt,\n },\n };\n\n return toBase64(BundleEnvelope.encode(value));\n}\n\nexport interface BundleSelectionItems {\n collectionId: string;\n externalProductId: string;\n externalVariantId: string;\n quantity: number;\n}\n\ninterface VariantSettings {\n externalVariantId: string;\n optionSources: Record<string, { collectionId: string; min: number | null; max: number | null }>;\n ranges: { min: number; max: number | null }[];\n}\n\ninterface BundleSettings {\n bundleSettings: { maxPerItem: number | null; isCustomizable: boolean };\n variantsSettings: Record<string, VariantSettings>;\n}\n\ntype BundleDataCollection = StorefrontBundleData['collections'][string];\n\ninterface BundleData extends Omit<StorefrontBundleData, 'collections'> {\n collections: Record<\n string,\n Omit<BundleDataCollection, 'products'> & {\n products: Record<string, BundleDataCollection['products'][number]>;\n }\n >;\n}\n\nexport class BundleSelectionValidator {\n #bundleSettings: BundleSettings | null;\n #items: BundleSelectionItems[];\n #bundleData: BundleData | null;\n\n constructor(selectionItems: BundleSelectionItems[], bundleData: StorefrontBundleData) {\n this.#bundleSettings = this.#formatBundleSettings(bundleData);\n this.#bundleData = this.#formatBundleData(bundleData);\n this.#items = selectionItems;\n }\n\n #formatBundleSettings(bundleData: StorefrontBundleData) {\n try {\n const bundleSettings = bundleData.bundle_settings;\n return {\n bundleSettings: {\n maxPerItem: bundleSettings.max_quantity_per_variant,\n isCustomizable: bundleSettings.is_customizable,\n },\n // null-proto seeds so external variant/option-source ids become real own keys, not prototype pollution\n variantsSettings: bundleSettings.variants.reduce<BundleSettings['variantsSettings']>((acc, variant) => {\n if (!variant.enabled) return acc;\n\n let ranges: VariantSettings['ranges'] = [{ min: variant.items_count, max: variant.items_count }];\n if (!variant.items_count) {\n ranges = variant.ranges.map(({ quantity_max, quantity_min }) => ({\n min: quantity_min,\n max: quantity_max,\n }));\n }\n\n acc[variant.external_variant_id] = {\n externalVariantId: variant.external_variant_id,\n optionSources: variant.option_sources.reduce<VariantSettings['optionSources']>((acc, optionSource) => {\n acc[optionSource.option_source_id] = {\n min: optionSource.quantity_min,\n max: optionSource.quantity_max,\n collectionId: optionSource.option_source_id,\n };\n return acc;\n }, Object.create(null)),\n ranges,\n };\n return acc;\n }, Object.create(null)),\n };\n } catch (error) {\n return null;\n }\n }\n\n #formatBundleData(bundleData: StorefrontBundleData) {\n try {\n // null-proto seeds so external collection/product ids become real own keys, not prototype pollution\n const collections = Object.values(bundleData.collections).reduce<BundleData['collections']>((acc, current) => {\n acc[current.id] = {\n ...current,\n products: current.products.reduce<BundleData['collections'][string]['products']>((productAcc, product) => {\n productAcc[product.id] = product;\n return productAcc;\n }, Object.create(null)),\n };\n\n return acc;\n }, Object.create(null));\n\n return { ...bundleData, collections };\n } catch (error) {\n return null;\n }\n }\n\n #isValueInRange(ranges: { min: number | null; max: number | null }[], value: number) {\n const matchedRanges = ranges.filter(({ min, max }) => {\n const minValue = min ?? value;\n const maxValue = max ?? value;\n\n return minValue <= value && value <= maxValue;\n });\n\n return !!matchedRanges.length;\n }\n\n #unique(ids: string[]) {\n return Array.from(new Set(ids));\n }\n\n // Own-property membership check. Guards against inherited keys (e.g. `__proto__`,\n // `constructor`, `toString`) resolving to truthy values on plain-object maps.\n #hasOwn(target: object, key: string) {\n return Object.prototype.hasOwnProperty.call(target, key);\n }\n\n isInitialDataValid() {\n if (!this.#bundleData) {\n throw 'Bundle data does not exist for the given product.';\n }\n\n if (!this.#bundleSettings) {\n throw 'Bundle settings do not exist for the given product.';\n }\n\n if (!Array.isArray(this.#items) || !this.#items.length) {\n throw 'No bundle selection items provided.';\n }\n\n return true;\n }\n\n isValidVariant(externalVariantId: string) {\n if (!this.#bundleSettings?.variantsSettings[externalVariantId]) {\n throw `The ${externalVariantId} bundle variant is invalid.`;\n }\n\n return true;\n }\n\n isSelectionInVariantRange(externalVariantId: string) {\n const total = this.#items.reduce((acc, current) => acc + current.quantity, 0);\n const ranges = this.#bundleSettings?.variantsSettings[externalVariantId].ranges || [];\n\n if (!this.#isValueInRange(ranges, total)) {\n throw 'The total number of products does not fall within the required variant range.';\n }\n\n return true;\n }\n\n areItemsInMaxPerItemBound() {\n const maxPerItem = this.#bundleSettings?.bundleSettings.maxPerItem || 0;\n const invalidProducts = this.#items.filter(({ quantity }) => quantity > maxPerItem);\n\n if (maxPerItem && invalidProducts.length) {\n const invalidIds = this.#unique(invalidProducts.map(({ externalProductId }) => externalProductId)).join(', ');\n throw `The selected products (${invalidIds}) exceed the maximum limit of ${maxPerItem} items per product.`;\n }\n\n return true;\n }\n\n areSelectedCollectionsValid(externalVariantId: string) {\n const variantSettings = this.#bundleSettings?.variantsSettings[externalVariantId];\n const optionSources = variantSettings?.optionSources;\n const invalidCollections = this.#items.filter(\n ({ collectionId }) => !optionSources || !this.#hasOwn(optionSources, collectionId)\n );\n if (invalidCollections.length) {\n const invalidIds = this.#unique(invalidCollections.map(({ collectionId }) => collectionId)).join(', ');\n throw `The collections (${invalidIds}) are no longer valid for the bundle variant (${externalVariantId}).`;\n }\n\n return true;\n }\n\n areItemsQuantitiesValidForTheCollection(externalVariantId: string) {\n // null-proto seed so a `__proto__` collectionId becomes a real own key, not prototype pollution\n const totalSelectedByCollection = this.#items.reduce<Record<string, number>>((acc, current) => {\n acc[current.collectionId] = current.quantity + (acc[current.collectionId] || 0);\n return acc;\n }, Object.create(null));\n\n const variantSettings = this.#bundleSettings?.variantsSettings[externalVariantId];\n const invalidItems = Object.values(variantSettings?.optionSources || {}).filter(collection => {\n const quantity = totalSelectedByCollection[collection.collectionId] || 0;\n return !this.#isValueInRange([collection], quantity);\n });\n\n if (!variantSettings || invalidItems.length) {\n const invalidIds = this.#unique(invalidItems.map(({ collectionId }) => collectionId)).join(', ');\n throw `The selection exceeds the limits for the collections (${invalidIds}).`;\n }\n\n return true;\n }\n\n areSelectedProductsValid(externalVariantId: string) {\n const bundleVariantCollections = this.#bundleSettings?.variantsSettings[externalVariantId]?.optionSources || {};\n // null-proto seed so a `__proto__` collectionId becomes a real own key, not prototype pollution\n const variantCollections = Object.values(bundleVariantCollections).reduce<BundleData['collections']>(\n (acc, optionSource) => {\n const collection = this.#bundleData?.collections[optionSource.collectionId];\n if (collection) {\n acc[optionSource.collectionId] = collection;\n }\n return acc;\n },\n Object.create(null)\n );\n\n if (!Object.values(variantCollections).length) {\n throw `No collections found for the bundle variant (${externalVariantId}).`;\n }\n\n const missingProducts = this.#items.filter(({ externalProductId, collectionId }) => {\n if (!this.#hasOwn(variantCollections, collectionId)) {\n return true;\n }\n return !this.#hasOwn(variantCollections[collectionId].products, externalProductId);\n });\n\n if (missingProducts.length) {\n const invalidIds = this.#unique(missingProducts.map(({ externalProductId }) => externalProductId)).join(', ');\n throw `The products (${invalidIds}) are no longer valid for the bundle product.`;\n }\n\n return true;\n }\n\n isBundleSelectionValid(externalVariantId: string) {\n this.isInitialDataValid();\n this.isValidVariant(externalVariantId);\n this.isSelectionInVariantRange(externalVariantId);\n this.areItemsInMaxPerItemBound();\n this.areSelectedCollectionsValid(externalVariantId);\n this.areItemsQuantitiesValidForTheCollection(externalVariantId);\n this.areSelectedProductsValid(externalVariantId);\n\n return true;\n }\n}\n"],"names":["enumType","union","int32","unionCase","voidType","struct","uint64","xdrString","UNBOUNDED_MAX_LENGTH","uint32","array","field","acc"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bundle.js","sources":["../../../src/utils/bundle.ts"],"sourcesContent":["import {\n array,\n enumType,\n field,\n int32,\n string as xdrString,\n struct,\n uint32,\n uint64,\n union,\n unionCase,\n voidType,\n UNBOUNDED_MAX_LENGTH,\n} from '@stellar/js-xdr';\nimport { BundleData as StorefrontBundleData, CDNBundleSettings } from '../types';\n\nconst textEncoder = new TextEncoder();\n\nconst emptyExt = { v: 0 } as const;\n\nfunction toBase64(bytes: Uint8Array) {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nconst EnvelopeType = enumType('EnvelopeType', {\n envelopeTypeBundle: 0,\n});\n\nconst BundleItemExt = union('BundleItemExt', {\n switchOn: int32(),\n switchKey: 'v',\n cases: [unionCase('v0', 0, voidType())],\n});\n\nconst BundleItem = struct('BundleItem', {\n collectionId: uint64(),\n productId: uint64(),\n variantId: uint64(),\n sku: xdrString(UNBOUNDED_MAX_LENGTH),\n quantity: uint32(),\n ext: BundleItemExt,\n});\n\nconst BundleExt = union('BundleExt', {\n switchOn: int32(),\n switchKey: 'v',\n cases: [unionCase('v0', 0, voidType())],\n});\n\nconst Bundle = struct('Bundle', {\n variantId: uint64(),\n items: array(BundleItem, 500),\n version: uint32(),\n ext: BundleExt,\n});\n\nconst BundleEnvelope = union('BundleEnvelope', {\n switchOn: EnvelopeType,\n switchKey: 'type',\n cases: [unionCase('envelopeTypeBundle', EnvelopeType.envelopeTypeBundle, field('v1', Bundle))],\n});\n\nexport function toLineItemProperty(bundle: { variantId: string; version: number; items: any[] }) {\n const value = {\n type: EnvelopeType.envelopeTypeBundle,\n v1: {\n variantId: BigInt(bundle.variantId.toString()),\n items: bundle.items.map(item => ({\n collectionId: BigInt(item.collectionId.toString()),\n productId: BigInt(item.productId.toString()),\n variantId: BigInt(item.variantId.toString()),\n sku: textEncoder.encode(item.sku || ''),\n quantity: item.quantity as number,\n ext: emptyExt,\n })),\n version: bundle.version || Math.floor(Date.now() / 1000),\n ext: emptyExt,\n },\n };\n\n return toBase64(BundleEnvelope.encode(value));\n}\n\nexport interface BundleSelectionItems {\n collectionId: string;\n externalProductId: string;\n externalVariantId: string;\n quantity: number;\n}\n\ninterface VariantSettings {\n externalVariantId: string;\n optionSources: Record<string, { collectionId: string; min: number | null; max: number | null }>;\n ranges: { min: number; max: number | null }[];\n}\n\ninterface BundleSettings {\n bundleSettings: { maxPerItem: number | null; isCustomizable: boolean };\n variantsSettings: Record<string, VariantSettings>;\n}\n\ntype BundleDataCollection = StorefrontBundleData['collections'][string];\n\ninterface BundleData extends Omit<StorefrontBundleData, 'collections'> {\n collections: Record<\n string,\n Omit<BundleDataCollection, 'products'> & {\n products: Record<string, BundleDataCollection['products'][number]>;\n }\n >;\n}\n\nexport class BundleSelectionValidator {\n #bundleSettings: BundleSettings | null;\n #items: BundleSelectionItems[];\n #bundleData: BundleData | null;\n\n constructor(selectionItems: BundleSelectionItems[], bundleData: StorefrontBundleData) {\n this.#bundleSettings = this.#formatBundleSettings(bundleData);\n this.#bundleData = this.#formatBundleData(bundleData);\n this.#items = selectionItems;\n }\n\n #formatBundleSettings(bundleData: StorefrontBundleData) {\n try {\n const bundleSettings = bundleData.bundle_settings;\n return {\n bundleSettings: {\n maxPerItem: bundleSettings.max_quantity_per_variant,\n isCustomizable: bundleSettings.is_customizable,\n },\n // null-proto seeds so external variant/option-source ids become real own keys, not prototype pollution\n variantsSettings: bundleSettings.variants.reduce<BundleSettings['variantsSettings']>((acc, variant) => {\n if (!variant.enabled) return acc;\n\n let ranges: VariantSettings['ranges'] = [{ min: variant.items_count, max: variant.items_count }];\n if (!variant.items_count) {\n ranges = variant.ranges.map(({ quantity_max, quantity_min }) => ({\n min: quantity_min,\n max: quantity_max,\n }));\n }\n\n acc[variant.external_variant_id] = {\n externalVariantId: variant.external_variant_id,\n optionSources: variant.option_sources.reduce<VariantSettings['optionSources']>((acc, optionSource) => {\n acc[optionSource.option_source_id] = {\n min: optionSource.quantity_min,\n max: optionSource.quantity_max,\n collectionId: optionSource.option_source_id,\n };\n return acc;\n }, Object.create(null)),\n ranges,\n };\n return acc;\n }, Object.create(null)),\n };\n } catch (error) {\n return null;\n }\n }\n\n #formatBundleData(bundleData: StorefrontBundleData) {\n try {\n // null-proto seeds so external collection/product ids become real own keys, not prototype pollution\n const collections = Object.values(bundleData.collections).reduce<BundleData['collections']>((acc, current) => {\n acc[current.id] = {\n ...current,\n products: current.products.reduce<BundleData['collections'][string]['products']>((productAcc, product) => {\n productAcc[product.id] = product;\n return productAcc;\n }, Object.create(null)),\n };\n\n return acc;\n }, Object.create(null));\n\n return { ...bundleData, collections };\n } catch (error) {\n return null;\n }\n }\n\n #isValueInRange(ranges: { min: number | null; max: number | null }[], value: number) {\n const matchedRanges = ranges.filter(({ min, max }) => {\n const minValue = min ?? value;\n const maxValue = max ?? value;\n\n return minValue <= value && value <= maxValue;\n });\n\n return !!matchedRanges.length;\n }\n\n #unique(ids: string[]) {\n return Array.from(new Set(ids));\n }\n\n // Own-property membership check. Guards against inherited keys (e.g. `__proto__`,\n // `constructor`, `toString`) resolving to truthy values on plain-object maps.\n #hasOwn(target: object, key: string) {\n return Object.prototype.hasOwnProperty.call(target, key);\n }\n\n isInitialDataValid() {\n if (!this.#bundleData) {\n throw 'Bundle data does not exist for the given product.';\n }\n\n if (!this.#bundleSettings) {\n throw 'Bundle settings do not exist for the given product.';\n }\n\n if (!Array.isArray(this.#items) || !this.#items.length) {\n throw 'No bundle selection items provided.';\n }\n\n return true;\n }\n\n isValidVariant(externalVariantId: string) {\n if (!this.#bundleSettings?.variantsSettings[externalVariantId]) {\n throw `The ${externalVariantId} bundle variant is invalid.`;\n }\n\n return true;\n }\n\n isSelectionInVariantRange(externalVariantId: string) {\n const total = this.#items.reduce((acc, current) => acc + current.quantity, 0);\n const ranges = this.#bundleSettings?.variantsSettings[externalVariantId].ranges || [];\n\n if (!this.#isValueInRange(ranges, total)) {\n throw 'The total number of products does not fall within the required variant range.';\n }\n\n return true;\n }\n\n areItemsInMaxPerItemBound() {\n const maxPerItem = this.#bundleSettings?.bundleSettings.maxPerItem || 0;\n const invalidProducts = this.#items.filter(({ quantity }) => quantity > maxPerItem);\n\n if (maxPerItem && invalidProducts.length) {\n const invalidIds = this.#unique(invalidProducts.map(({ externalProductId }) => externalProductId)).join(', ');\n throw `The selected products (${invalidIds}) exceed the maximum limit of ${maxPerItem} items per product.`;\n }\n\n return true;\n }\n\n areSelectedCollectionsValid(externalVariantId: string) {\n const variantSettings = this.#bundleSettings?.variantsSettings[externalVariantId];\n const optionSources = variantSettings?.optionSources;\n const invalidCollections = this.#items.filter(\n ({ collectionId }) => !optionSources || !this.#hasOwn(optionSources, collectionId)\n );\n if (invalidCollections.length) {\n const invalidIds = this.#unique(invalidCollections.map(({ collectionId }) => collectionId)).join(', ');\n throw `The collections (${invalidIds}) are no longer valid for the bundle variant (${externalVariantId}).`;\n }\n\n return true;\n }\n\n areItemsQuantitiesValidForTheCollection(externalVariantId: string) {\n // null-proto seed so a `__proto__` collectionId becomes a real own key, not prototype pollution\n const totalSelectedByCollection = this.#items.reduce<Record<string, number>>((acc, current) => {\n acc[current.collectionId] = current.quantity + (acc[current.collectionId] || 0);\n return acc;\n }, Object.create(null));\n\n const variantSettings = this.#bundleSettings?.variantsSettings[externalVariantId];\n const invalidItems = Object.values(variantSettings?.optionSources || {}).filter(collection => {\n const quantity = totalSelectedByCollection[collection.collectionId] || 0;\n return !this.#isValueInRange([collection], quantity);\n });\n\n if (!variantSettings || invalidItems.length) {\n const invalidIds = this.#unique(invalidItems.map(({ collectionId }) => collectionId)).join(', ');\n throw `The selection exceeds the limits for the collections (${invalidIds}).`;\n }\n\n return true;\n }\n\n areSelectedProductsValid(externalVariantId: string) {\n const bundleVariantCollections = this.#bundleSettings?.variantsSettings[externalVariantId]?.optionSources || {};\n // null-proto seed so a `__proto__` collectionId becomes a real own key, not prototype pollution\n const variantCollections = Object.values(bundleVariantCollections).reduce<BundleData['collections']>(\n (acc, optionSource) => {\n const collection = this.#bundleData?.collections[optionSource.collectionId];\n if (collection) {\n acc[optionSource.collectionId] = collection;\n }\n return acc;\n },\n Object.create(null)\n );\n\n if (!Object.values(variantCollections).length) {\n throw `No collections found for the bundle variant (${externalVariantId}).`;\n }\n\n const missingProducts = this.#items.filter(({ externalProductId, collectionId }) => {\n if (!this.#hasOwn(variantCollections, collectionId)) {\n return true;\n }\n return !this.#hasOwn(variantCollections[collectionId].products, externalProductId);\n });\n\n if (missingProducts.length) {\n const invalidIds = this.#unique(missingProducts.map(({ externalProductId }) => externalProductId)).join(', ');\n throw `The products (${invalidIds}) are no longer valid for the bundle product.`;\n }\n\n return true;\n }\n\n isBundleSelectionValid(externalVariantId: string) {\n this.isInitialDataValid();\n this.isValidVariant(externalVariantId);\n this.isSelectionInVariantRange(externalVariantId);\n this.areItemsInMaxPerItemBound();\n this.areSelectedCollectionsValid(externalVariantId);\n this.areItemsQuantitiesValidForTheCollection(externalVariantId);\n this.areSelectedProductsValid(externalVariantId);\n\n return true;\n }\n}\n"],"names":["enumType","union","int32","unionCase","voidType","struct","uint64","xdrString","UNBOUNDED_MAX_LENGTH","uint32","array","field","acc"],"mappings":"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"}
|
|
@@ -29,8 +29,7 @@ const mapBundleSettings = (bundleSettings) => {
|
|
|
29
29
|
};
|
|
30
30
|
};
|
|
31
31
|
const mapIncentives = (incentives) => {
|
|
32
|
-
if (incentives.tiered_discounts.length === 0)
|
|
33
|
-
return null;
|
|
32
|
+
if (incentives.tiered_discounts.length === 0) return null;
|
|
34
33
|
return {
|
|
35
34
|
tiered_discounts: incentives.tiered_discounts
|
|
36
35
|
};
|
|
@@ -59,10 +58,8 @@ const mapBasicVariant = (variant) => ({
|
|
|
59
58
|
available_for_sale: variant.available
|
|
60
59
|
});
|
|
61
60
|
const formatFeaturedImage = (featuredImage) => {
|
|
62
|
-
if (featuredImage == null || typeof featuredImage === "string")
|
|
63
|
-
|
|
64
|
-
if ("src" in featuredImage)
|
|
65
|
-
return featuredImage["src"];
|
|
61
|
+
if (featuredImage == null || typeof featuredImage === "string") return featuredImage;
|
|
62
|
+
if ("src" in featuredImage) return featuredImage["src"];
|
|
66
63
|
return null;
|
|
67
64
|
};
|
|
68
65
|
const mapBasicProduct = (product) => {
|
|
@@ -124,8 +121,7 @@ const productSellingPlansGroupLookup = (sellingPlanGroups) => sellingPlanGroups.
|
|
|
124
121
|
return acc;
|
|
125
122
|
}, {});
|
|
126
123
|
const mapFilters = (filters) => {
|
|
127
|
-
if (!Array.isArray(filters))
|
|
128
|
-
return [];
|
|
124
|
+
if (!Array.isArray(filters)) return [];
|
|
129
125
|
return filters;
|
|
130
126
|
};
|
|
131
127
|
function mapOnlineStoreToPublicBundleData(bundleData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundleData.js","sources":["../../../src/utils/bundleData.ts"],"sourcesContent":["import { PublicBundleData, PriceRule } from '../types/bundleData';\nimport { BaseProduct, BaseProductVariant, BundleData as StorefrontBundleData } from '../types/bundle';\n\nconst mapBundleSettings = (bundleSettings: StorefrontBundleData['bundle_settings']) => {\n const addons = bundleSettings.layout_settings.addons;\n const crossSells = bundleSettings.layout_settings.crossSells;\n const customizationWindow = bundleSettings.customization_window;\n const defaultVariantId = bundleSettings.layout_settings?.defaultVariantId ?? bundleSettings.default_bundle_variant_id;\n const defaultFrequency = bundleSettings.layout_settings.defaultFrequency;\n const addToCartBehavior = bundleSettings.layout_settings.addToCartCallback;\n\n return {\n default_variant_id: defaultVariantId ? String(defaultVariantId) : null,\n is_customizable: bundleSettings.is_customizable,\n price_rule: String(bundleSettings.price_rule).toUpperCase(),\n customization_window: customizationWindow\n ? {\n active_days: customizationWindow,\n disabled_message: bundleSettings.customization_window_disabled_message || '',\n }\n : null,\n addons: addons.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n cross_sells: crossSells.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n default_selling_plan_id: defaultFrequency || null,\n collapsible_collections: bundleSettings.layout_settings.collapsibleSections,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n show_product_variants: bundleSettings.layout_settings.showVariants,\n product_details_modal_enabled: bundleSettings.layout_settings.learnMoreModal,\n addToCartBehavior: {\n type: addToCartBehavior.type === 'none' ? ('cart_page' as const) : addToCartBehavior.type,\n value: addToCartBehavior.value,\n },\n };\n};\n\nconst mapIncentives = (incentives: StorefrontBundleData['incentives']): PublicBundleData['incentives'] => {\n if (incentives.tiered_discounts.length === 0) return null;\n\n return {\n tiered_discounts: incentives.tiered_discounts,\n };\n};\n\nconst mapSellingPlan = (\n sellingPlan: StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]\n): PublicBundleData['selling_plan_groups'][number]['selling_plans'][number] => ({\n id: sellingPlan.id,\n name: sellingPlan.name,\n options: sellingPlan.options.map(option => ({ name: option.name, value: option.value })),\n recurring_deliveries: sellingPlan.recurring_deliveries,\n price_adjustments: sellingPlan.price_adjustments.map(({ value, value_type }) => ({\n value,\n value_type,\n })),\n});\n\nconst mapSellingPlanGroups = (\n sellingPlanGroup: StorefrontBundleData['selling_plan_groups'][number]\n): PublicBundleData['selling_plan_groups'][number] => ({\n name: sellingPlanGroup.name,\n options: sellingPlanGroup.options.map(option => ({ name: option.name, values: option.values })),\n selling_plans: sellingPlanGroup.selling_plans.map(mapSellingPlan),\n});\n\nconst mapBasicVariant = (variant: BaseProductVariant) => ({\n id: String(variant.id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n options: variant.options,\n available_for_sale: variant.available,\n});\n\nconst formatFeaturedImage = (featuredImage: BaseProduct['featured_image']): string | null => {\n if (featuredImage == null || typeof featuredImage === 'string') return featuredImage;\n\n if ('src' in featuredImage) return featuredImage['src'];\n\n return null;\n};\n\nconst mapBasicProduct = (product: BaseProduct) => {\n return {\n id: String(product.id),\n title: product.title,\n description: product.description,\n available_for_sale: product.available,\n featured_image: formatFeaturedImage(product.featured_image),\n images: product.images,\n requires_selling_plan: product.requires_selling_plan,\n selling_plan_groups: product.selling_plan_groups.map(mapSellingPlanGroups),\n };\n};\n\nconst mapProduct = (product: StorefrontBundleData['collections'][number]['products'][number]) => {\n const productPlansLookup = productSellingPlansGroupLookup(product.selling_plan_groups);\n\n return {\n ...mapBasicProduct(product),\n handle: product.handle,\n tags: product.tags,\n price_range: { min: product.price_min, max: product.price_max },\n compare_at_price_range: { min: product.compare_at_price_min, max: product.compare_at_price_max },\n options: product.options,\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(\n productPlansLookup[`${sellingPlan.selling_plan_group_id}-${sellingPlan.selling_plan_id}`]\n ),\n })),\n option1: variant.option1,\n option2: variant.option2,\n option3: variant.option3,\n sku: variant.sku || '',\n requires_shipping: variant.requires_shipping,\n taxable: variant.taxable,\n featured_image: formatFeaturedImage(variant.featured_image),\n public_title: variant.public_title,\n requires_selling_plan: variant.requires_selling_plan,\n })),\n };\n};\n\nconst mapBundleVariantRanges = ({\n items_count,\n ranges,\n}: Pick<StorefrontBundleData['bundle_settings']['variants'][number], 'items_count' | 'ranges'>) => {\n if (ranges.length > 0) {\n return ranges.map(({ quantity_max, quantity_min }) => ({ min: quantity_min, max: quantity_max }));\n }\n\n return [{ min: items_count, max: items_count }];\n};\n\nconst productSellingPlansGroupLookup = (sellingPlanGroups: BaseProduct['selling_plan_groups']) =>\n sellingPlanGroups.reduce<\n Record<string, StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]>\n >((acc, current) => {\n current.selling_plans.forEach(sellingPlan => {\n const key = `${current.id}-${sellingPlan.id}`;\n acc[key] = sellingPlan;\n });\n\n return acc;\n }, {});\n\nconst mapFilters = (filters: StorefrontBundleData['filters']): PublicBundleData['filters'] => {\n if (!Array.isArray(filters)) return [];\n return filters;\n};\n\nexport function mapOnlineStoreToPublicBundleData(bundleData: StorefrontBundleData): PublicBundleData {\n const bundleSettings = mapBundleSettings(bundleData.bundle_settings);\n const variantsLookup = bundleData.variants.reduce<Record<string, StorefrontBundleData['variants'][number]>>(\n (acc, variant) => {\n acc[variant.id] = variant;\n return acc;\n },\n {}\n );\n\n return {\n id: String(bundleData.id),\n title: bundleData.title,\n description: bundleData.description || null,\n handle: bundleData.handle,\n options: bundleData.options.map(option => ({\n name: option.name,\n position: option.position,\n values: option.values,\n })),\n default_variant_id: bundleSettings.default_variant_id,\n default_selling_plan_id: bundleSettings.default_selling_plan_id\n ? Number(bundleSettings.default_selling_plan_id)\n : null,\n available_for_sale: bundleData.available,\n requires_selling_plan: bundleData.requires_selling_plan,\n bundle_settings: {\n is_customizable: bundleSettings.is_customizable,\n price_rule: bundleSettings.price_rule as PriceRule,\n customization_window: bundleSettings.customization_window,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n collapsible_collections: bundleSettings.collapsible_collections,\n show_product_variants: bundleSettings.show_product_variants,\n product_details_modal_enabled: bundleSettings.product_details_modal_enabled,\n show_variants_as_individual_products:\n bundleData.bundle_settings.settings.display_variants_as_separate_products_in_list,\n post_add_to_cart_behavior: bundleSettings.addToCartBehavior,\n },\n variants: bundleData.bundle_settings.variants\n .filter(({ enabled }) => enabled)\n .map((item, index) => {\n const variant = variantsLookup[String(item.external_variant_id)];\n\n return {\n id: String(item.external_variant_id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n image: variant.image || '',\n available_for_sale: variant.available,\n options: variant.options,\n requires_selling_plan: variant.requires_selling_plan,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n ranges: mapBundleVariantRanges(item),\n collections: item.option_sources.map(source => ({\n id: source.option_source_id,\n source_platform: 'shopify',\n min: source.quantity_min || 0,\n max: source.quantity_max,\n position: source.position,\n })),\n default_selections: item.selection_defaults.map(selectionDefault => ({\n quantity: selectionDefault.quantity,\n product: {\n id: String(selectionDefault.product.id),\n handle: selectionDefault.handle,\n title: selectionDefault.product.title,\n description: selectionDefault.product.description,\n images: selectionDefault.product.images,\n },\n variant: {\n id: selectionDefault.external_variant_id,\n title: selectionDefault.variant.title,\n featured_image: formatFeaturedImage(selectionDefault.variant.featured_image),\n sku: selectionDefault.sku || '',\n },\n })),\n position: index,\n };\n }),\n selling_plan_groups: bundleData.selling_plan_groups.map(mapSellingPlanGroups),\n collections: Object.values(bundleData.collections).reduce<PublicBundleData['collections']>((acc, current) => {\n if (!Array.isArray(current.products)) {\n /* If a collection is not published in Online store, it is included \n as _1:{ handle: \"<collection-handle\"} in the collections object.\n We need to skip these collections.\n */\n return acc;\n }\n\n acc[String(current.id)] = {\n id: String(current.id),\n title: current.title,\n handle: current.handle,\n products: current.products.map(mapProduct),\n };\n\n return acc;\n }, {}),\n addons: bundleData.addons.products.length\n ? {\n collection_id: bundleSettings.addons?.collection_id || '',\n collection_handle: bundleSettings.addons?.collection_handle || '',\n products: bundleData.addons.products.map(product => ({\n ...mapBasicProduct(product),\n price_range: { min: product.price, max: product.price },\n compare_at_price_range: { min: product.compare_at_price || 0, max: product.compare_at_price },\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n image: variant.image,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n })),\n })),\n }\n : null,\n cross_sells: bundleData.cross_sells.products.length\n ? {\n collection_id: bundleSettings.cross_sells?.collection_id || '',\n collection_handle: bundleSettings.cross_sells?.collection_handle || '',\n products: bundleData.cross_sells.products.map(mapProduct),\n }\n : null,\n incentives: mapIncentives(bundleData.incentives),\n filters: mapFilters(bundleData.filters),\n templates: bundleData.bundle_settings.layout_settings.templates || null,\n globalStyles: bundleData.bundle_settings.layout_settings.globalStyles || null,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bundleData.js","sources":["../../../src/utils/bundleData.ts"],"sourcesContent":["import { PublicBundleData, PriceRule } from '../types/bundleData';\nimport { BaseProduct, BaseProductVariant, BundleData as StorefrontBundleData } from '../types/bundle';\n\nconst mapBundleSettings = (bundleSettings: StorefrontBundleData['bundle_settings']) => {\n const addons = bundleSettings.layout_settings.addons;\n const crossSells = bundleSettings.layout_settings.crossSells;\n const customizationWindow = bundleSettings.customization_window;\n const defaultVariantId = bundleSettings.layout_settings?.defaultVariantId ?? bundleSettings.default_bundle_variant_id;\n const defaultFrequency = bundleSettings.layout_settings.defaultFrequency;\n const addToCartBehavior = bundleSettings.layout_settings.addToCartCallback;\n\n return {\n default_variant_id: defaultVariantId ? String(defaultVariantId) : null,\n is_customizable: bundleSettings.is_customizable,\n price_rule: String(bundleSettings.price_rule).toUpperCase(),\n customization_window: customizationWindow\n ? {\n active_days: customizationWindow,\n disabled_message: bundleSettings.customization_window_disabled_message || '',\n }\n : null,\n addons: addons.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n cross_sells: crossSells.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n default_selling_plan_id: defaultFrequency || null,\n collapsible_collections: bundleSettings.layout_settings.collapsibleSections,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n show_product_variants: bundleSettings.layout_settings.showVariants,\n product_details_modal_enabled: bundleSettings.layout_settings.learnMoreModal,\n addToCartBehavior: {\n type: addToCartBehavior.type === 'none' ? ('cart_page' as const) : addToCartBehavior.type,\n value: addToCartBehavior.value,\n },\n };\n};\n\nconst mapIncentives = (incentives: StorefrontBundleData['incentives']): PublicBundleData['incentives'] => {\n if (incentives.tiered_discounts.length === 0) return null;\n\n return {\n tiered_discounts: incentives.tiered_discounts,\n };\n};\n\nconst mapSellingPlan = (\n sellingPlan: StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]\n): PublicBundleData['selling_plan_groups'][number]['selling_plans'][number] => ({\n id: sellingPlan.id,\n name: sellingPlan.name,\n options: sellingPlan.options.map(option => ({ name: option.name, value: option.value })),\n recurring_deliveries: sellingPlan.recurring_deliveries,\n price_adjustments: sellingPlan.price_adjustments.map(({ value, value_type }) => ({\n value,\n value_type,\n })),\n});\n\nconst mapSellingPlanGroups = (\n sellingPlanGroup: StorefrontBundleData['selling_plan_groups'][number]\n): PublicBundleData['selling_plan_groups'][number] => ({\n name: sellingPlanGroup.name,\n options: sellingPlanGroup.options.map(option => ({ name: option.name, values: option.values })),\n selling_plans: sellingPlanGroup.selling_plans.map(mapSellingPlan),\n});\n\nconst mapBasicVariant = (variant: BaseProductVariant) => ({\n id: String(variant.id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n options: variant.options,\n available_for_sale: variant.available,\n});\n\nconst formatFeaturedImage = (featuredImage: BaseProduct['featured_image']): string | null => {\n if (featuredImage == null || typeof featuredImage === 'string') return featuredImage;\n\n if ('src' in featuredImage) return featuredImage['src'];\n\n return null;\n};\n\nconst mapBasicProduct = (product: BaseProduct) => {\n return {\n id: String(product.id),\n title: product.title,\n description: product.description,\n available_for_sale: product.available,\n featured_image: formatFeaturedImage(product.featured_image),\n images: product.images,\n requires_selling_plan: product.requires_selling_plan,\n selling_plan_groups: product.selling_plan_groups.map(mapSellingPlanGroups),\n };\n};\n\nconst mapProduct = (product: StorefrontBundleData['collections'][number]['products'][number]) => {\n const productPlansLookup = productSellingPlansGroupLookup(product.selling_plan_groups);\n\n return {\n ...mapBasicProduct(product),\n handle: product.handle,\n tags: product.tags,\n price_range: { min: product.price_min, max: product.price_max },\n compare_at_price_range: { min: product.compare_at_price_min, max: product.compare_at_price_max },\n options: product.options,\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(\n productPlansLookup[`${sellingPlan.selling_plan_group_id}-${sellingPlan.selling_plan_id}`]\n ),\n })),\n option1: variant.option1,\n option2: variant.option2,\n option3: variant.option3,\n sku: variant.sku || '',\n requires_shipping: variant.requires_shipping,\n taxable: variant.taxable,\n featured_image: formatFeaturedImage(variant.featured_image),\n public_title: variant.public_title,\n requires_selling_plan: variant.requires_selling_plan,\n })),\n };\n};\n\nconst mapBundleVariantRanges = ({\n items_count,\n ranges,\n}: Pick<StorefrontBundleData['bundle_settings']['variants'][number], 'items_count' | 'ranges'>) => {\n if (ranges.length > 0) {\n return ranges.map(({ quantity_max, quantity_min }) => ({ min: quantity_min, max: quantity_max }));\n }\n\n return [{ min: items_count, max: items_count }];\n};\n\nconst productSellingPlansGroupLookup = (sellingPlanGroups: BaseProduct['selling_plan_groups']) =>\n sellingPlanGroups.reduce<\n Record<string, StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]>\n >((acc, current) => {\n current.selling_plans.forEach(sellingPlan => {\n const key = `${current.id}-${sellingPlan.id}`;\n acc[key] = sellingPlan;\n });\n\n return acc;\n }, {});\n\nconst mapFilters = (filters: StorefrontBundleData['filters']): PublicBundleData['filters'] => {\n if (!Array.isArray(filters)) return [];\n return filters;\n};\n\nexport function mapOnlineStoreToPublicBundleData(bundleData: StorefrontBundleData): PublicBundleData {\n const bundleSettings = mapBundleSettings(bundleData.bundle_settings);\n const variantsLookup = bundleData.variants.reduce<Record<string, StorefrontBundleData['variants'][number]>>(\n (acc, variant) => {\n acc[variant.id] = variant;\n return acc;\n },\n {}\n );\n\n return {\n id: String(bundleData.id),\n title: bundleData.title,\n description: bundleData.description || null,\n handle: bundleData.handle,\n options: bundleData.options.map(option => ({\n name: option.name,\n position: option.position,\n values: option.values,\n })),\n default_variant_id: bundleSettings.default_variant_id,\n default_selling_plan_id: bundleSettings.default_selling_plan_id\n ? Number(bundleSettings.default_selling_plan_id)\n : null,\n available_for_sale: bundleData.available,\n requires_selling_plan: bundleData.requires_selling_plan,\n bundle_settings: {\n is_customizable: bundleSettings.is_customizable,\n price_rule: bundleSettings.price_rule as PriceRule,\n customization_window: bundleSettings.customization_window,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n collapsible_collections: bundleSettings.collapsible_collections,\n show_product_variants: bundleSettings.show_product_variants,\n product_details_modal_enabled: bundleSettings.product_details_modal_enabled,\n show_variants_as_individual_products:\n bundleData.bundle_settings.settings.display_variants_as_separate_products_in_list,\n post_add_to_cart_behavior: bundleSettings.addToCartBehavior,\n },\n variants: bundleData.bundle_settings.variants\n .filter(({ enabled }) => enabled)\n .map((item, index) => {\n const variant = variantsLookup[String(item.external_variant_id)];\n\n return {\n id: String(item.external_variant_id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n image: variant.image || '',\n available_for_sale: variant.available,\n options: variant.options,\n requires_selling_plan: variant.requires_selling_plan,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n ranges: mapBundleVariantRanges(item),\n collections: item.option_sources.map(source => ({\n id: source.option_source_id,\n source_platform: 'shopify',\n min: source.quantity_min || 0,\n max: source.quantity_max,\n position: source.position,\n })),\n default_selections: item.selection_defaults.map(selectionDefault => ({\n quantity: selectionDefault.quantity,\n product: {\n id: String(selectionDefault.product.id),\n handle: selectionDefault.handle,\n title: selectionDefault.product.title,\n description: selectionDefault.product.description,\n images: selectionDefault.product.images,\n },\n variant: {\n id: selectionDefault.external_variant_id,\n title: selectionDefault.variant.title,\n featured_image: formatFeaturedImage(selectionDefault.variant.featured_image),\n sku: selectionDefault.sku || '',\n },\n })),\n position: index,\n };\n }),\n selling_plan_groups: bundleData.selling_plan_groups.map(mapSellingPlanGroups),\n collections: Object.values(bundleData.collections).reduce<PublicBundleData['collections']>((acc, current) => {\n if (!Array.isArray(current.products)) {\n /* If a collection is not published in Online store, it is included \n as _1:{ handle: \"<collection-handle\"} in the collections object.\n We need to skip these collections.\n */\n return acc;\n }\n\n acc[String(current.id)] = {\n id: String(current.id),\n title: current.title,\n handle: current.handle,\n products: current.products.map(mapProduct),\n };\n\n return acc;\n }, {}),\n addons: bundleData.addons.products.length\n ? {\n collection_id: bundleSettings.addons?.collection_id || '',\n collection_handle: bundleSettings.addons?.collection_handle || '',\n products: bundleData.addons.products.map(product => ({\n ...mapBasicProduct(product),\n price_range: { min: product.price, max: product.price },\n compare_at_price_range: { min: product.compare_at_price || 0, max: product.compare_at_price },\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n image: variant.image,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n })),\n })),\n }\n : null,\n cross_sells: bundleData.cross_sells.products.length\n ? {\n collection_id: bundleSettings.cross_sells?.collection_id || '',\n collection_handle: bundleSettings.cross_sells?.collection_handle || '',\n products: bundleData.cross_sells.products.map(mapProduct),\n }\n : null,\n incentives: mapIncentives(bundleData.incentives),\n filters: mapFilters(bundleData.filters),\n templates: bundleData.bundle_settings.layout_settings.templates || null,\n globalStyles: bundleData.bundle_settings.layout_settings.globalStyles || null,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sources":["../../../src/utils/error.ts"],"sourcesContent":["export class RechargeRequestError implements Error {\n name = 'RechargeRequestError';\n message: string;\n status?: number;\n\n constructor(message: string, status?: number) {\n this.message = message;\n this.status = status;\n }\n}\n"],"names":[],"mappings":";;AAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"error.js","sources":["../../../src/utils/error.ts"],"sourcesContent":["export class RechargeRequestError implements Error {\n name = 'RechargeRequestError';\n message: string;\n status?: number;\n\n constructor(message: string, status?: number) {\n this.message = message;\n this.status = status;\n }\n}\n"],"names":[],"mappings":";;AAAO,MAAM,oBAAA,CAAsC;AAAA,EAKjD,WAAA,CAAY,SAAiB,MAAA,EAAiB;AAJ9C,IAAA,IAAA,CAAA,IAAA,GAAO,sBAAA;AAKL,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AACF;;"}
|
package/dist/cjs/utils/id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sources":["../../../src/utils/id.ts"],"sourcesContent":["const ALPHABET = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';\n\n/**\n * Generates a random URL-safe id.\n *\n * Uses `Math.random`, so it is NOT cryptographically secure. Only used for\n * internal request/telemetry ids where uniqueness matters.\n *\n * Reference: nanoid/non-secure\n */\nexport function nanoid(size = 21): string {\n let id = '';\n for (let i = 0; i < size; i++) {\n id += ALPHABET[(Math.random() * 64) | 0];\n }\n return id;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"id.js","sources":["../../../src/utils/id.ts"],"sourcesContent":["const ALPHABET = 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict';\n\n/**\n * Generates a random URL-safe id.\n *\n * Uses `Math.random`, so it is NOT cryptographically secure. Only used for\n * internal request/telemetry ids where uniqueness matters.\n *\n * Reference: nanoid/non-secure\n */\nexport function nanoid(size = 21): string {\n let id = '';\n for (let i = 0; i < size; i++) {\n id += ALPHABET[(Math.random() * 64) | 0];\n }\n return id;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,QAAA,GAAW,kEAAA;AAUV,SAAS,MAAA,CAAO,OAAO,EAAA,EAAY;AACxC,EAAA,IAAI,EAAA,GAAK,EAAA;AACT,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,EAAA,IAAM,QAAA,CAAU,IAAA,CAAK,MAAA,EAAO,GAAI,KAAM,CAAC,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,EAAA;AACT;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sources":["../../../src/utils/init.ts"],"sourcesContent":["import { resetCDNCache } from '../api/cdn';\nimport { StorefrontOptions, CRUDRequestOptions, GetRequestOptions, InitOptions } from '../types';\nimport { setOptions } from './options';\nimport { request } from './request';\n\n/**\n * @internal\n * @deprecated will be removed in next version\n */\nexport const api = {\n get<T>(url: string, requestOptions?: GetRequestOptions): Promise<T> {\n return request<T>('get', url, requestOptions);\n },\n post<T>(url: string, requestOptions?: CRUDRequestOptions): Promise<T> {\n return request<T>('post', url, requestOptions);\n },\n put<T>(url: string, requestOptions?: CRUDRequestOptions): Promise<T> {\n return request<T>('put', url, requestOptions);\n },\n delete<T>(url: string, requestOptions?: CRUDRequestOptions): Promise<T> {\n return request<T>('delete', url, requestOptions);\n },\n};\n\n/**\n * Uses passed in storeIdentifier, but if it's not passed in will try to infer it.\n * Currently it will only infer if we are in the context of a Shopify store. This will not infer headless or hosted yet.\n */\nfunction getStoreIdentifier(storeIdentifier?: string): string {\n if (storeIdentifier) {\n return storeIdentifier;\n }\n\n // Infer's when on Shopify store (non headless)\n if (window?.Shopify?.shop) {\n return window.Shopify.shop;\n }\n\n // Domain exists on hosted themes. If it doesn't for some reason, get the subdomain and create the identifier\n let domain = window?.domain;\n if (!domain) {\n const subdomain = location?.href\n .match(/(?:http[s]*:\\/\\/)*(.*?)\\.(?=admin\\.rechargeapps\\.com)/i)?.[1]\n .replace(/-sp$/, '');\n if (subdomain) {\n domain = `${subdomain}.myshopify.com`;\n }\n }\n\n // Infer's when on Recharge hosted\n if (domain) {\n return domain;\n }\n\n throw new Error(`No storeIdentifier was passed into init.`);\n}\n\nexport function initRecharge(opt: InitOptions = {}) {\n const hiddenOpts = opt as StorefrontOptions;\n const { storefrontAccessToken } = opt;\n if (storefrontAccessToken && !storefrontAccessToken.startsWith('strfnt')) {\n throw new Error(\n 'Incorrect storefront access token used. See https://storefront.rechargepayments.com/client/docs/getting_started/package_setup/#initialization-- for more information.'\n );\n }\n setOptions({\n storeIdentifier: getStoreIdentifier(opt.storeIdentifier),\n loginRetryFn: opt.loginRetryFn,\n __unstable_twoFactorRetryFn: opt.__unstable_twoFactorRetryFn,\n storefrontAccessToken,\n appName: opt.appName,\n appVersion: opt.appVersion,\n environment: hiddenOpts.environment ? hiddenOpts.environment : 'prod',\n environmentUri: hiddenOpts.environmentUri,\n customerHash: hiddenOpts.customerHash,\n });\n\n // When init is called again, reset the cache to make sure we don't have the old cache around\n resetCDNCache();\n}\n"],"names":["request","setOptions","resetCDNCache"],"mappings":";;;;;;AASO,MAAM,GAAM
|
|
1
|
+
{"version":3,"file":"init.js","sources":["../../../src/utils/init.ts"],"sourcesContent":["import { resetCDNCache } from '../api/cdn';\nimport { StorefrontOptions, CRUDRequestOptions, GetRequestOptions, InitOptions } from '../types';\nimport { setOptions } from './options';\nimport { request } from './request';\n\n/**\n * @internal\n * @deprecated will be removed in next version\n */\nexport const api = {\n get<T>(url: string, requestOptions?: GetRequestOptions): Promise<T> {\n return request<T>('get', url, requestOptions);\n },\n post<T>(url: string, requestOptions?: CRUDRequestOptions): Promise<T> {\n return request<T>('post', url, requestOptions);\n },\n put<T>(url: string, requestOptions?: CRUDRequestOptions): Promise<T> {\n return request<T>('put', url, requestOptions);\n },\n delete<T>(url: string, requestOptions?: CRUDRequestOptions): Promise<T> {\n return request<T>('delete', url, requestOptions);\n },\n};\n\n/**\n * Uses passed in storeIdentifier, but if it's not passed in will try to infer it.\n * Currently it will only infer if we are in the context of a Shopify store. This will not infer headless or hosted yet.\n */\nfunction getStoreIdentifier(storeIdentifier?: string): string {\n if (storeIdentifier) {\n return storeIdentifier;\n }\n\n // Infer's when on Shopify store (non headless)\n if (window?.Shopify?.shop) {\n return window.Shopify.shop;\n }\n\n // Domain exists on hosted themes. If it doesn't for some reason, get the subdomain and create the identifier\n let domain = window?.domain;\n if (!domain) {\n const subdomain = location?.href\n .match(/(?:http[s]*:\\/\\/)*(.*?)\\.(?=admin\\.rechargeapps\\.com)/i)?.[1]\n .replace(/-sp$/, '');\n if (subdomain) {\n domain = `${subdomain}.myshopify.com`;\n }\n }\n\n // Infer's when on Recharge hosted\n if (domain) {\n return domain;\n }\n\n throw new Error(`No storeIdentifier was passed into init.`);\n}\n\nexport function initRecharge(opt: InitOptions = {}) {\n const hiddenOpts = opt as StorefrontOptions;\n const { storefrontAccessToken } = opt;\n if (storefrontAccessToken && !storefrontAccessToken.startsWith('strfnt')) {\n throw new Error(\n 'Incorrect storefront access token used. See https://storefront.rechargepayments.com/client/docs/getting_started/package_setup/#initialization-- for more information.'\n );\n }\n setOptions({\n storeIdentifier: getStoreIdentifier(opt.storeIdentifier),\n loginRetryFn: opt.loginRetryFn,\n __unstable_twoFactorRetryFn: opt.__unstable_twoFactorRetryFn,\n storefrontAccessToken,\n appName: opt.appName,\n appVersion: opt.appVersion,\n environment: hiddenOpts.environment ? hiddenOpts.environment : 'prod',\n environmentUri: hiddenOpts.environmentUri,\n customerHash: hiddenOpts.customerHash,\n });\n\n // When init is called again, reset the cache to make sure we don't have the old cache around\n resetCDNCache();\n}\n"],"names":["request","setOptions","resetCDNCache"],"mappings":";;;;;;AASO,MAAM,GAAA,GAAM;AAAA,EACjB,GAAA,CAAO,KAAa,cAAA,EAAgD;AAClE,IAAA,OAAOA,eAAA,CAAW,KAAA,EAAO,GAAA,EAAK,cAAc,CAAA;AAAA,EAC9C,CAAA;AAAA,EACA,IAAA,CAAQ,KAAa,cAAA,EAAiD;AACpE,IAAA,OAAOA,eAAA,CAAW,MAAA,EAAQ,GAAA,EAAK,cAAc,CAAA;AAAA,EAC/C,CAAA;AAAA,EACA,GAAA,CAAO,KAAa,cAAA,EAAiD;AACnE,IAAA,OAAOA,eAAA,CAAW,KAAA,EAAO,GAAA,EAAK,cAAc,CAAA;AAAA,EAC9C,CAAA;AAAA,EACA,MAAA,CAAU,KAAa,cAAA,EAAiD;AACtE,IAAA,OAAOA,eAAA,CAAW,QAAA,EAAU,GAAA,EAAK,cAAc,CAAA;AAAA,EACjD;AACF;AAMA,SAAS,mBAAmB,eAAA,EAAkC;AAC5D,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,eAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,EAAQ,SAAS,IAAA,EAAM;AACzB,IAAA,OAAO,OAAO,OAAA,CAAQ,IAAA;AAAA,EACxB;AAGA,EAAA,IAAI,SAAS,MAAA,EAAQ,MAAA;AACrB,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,SAAA,GAAY,QAAA,EAAU,IAAA,CACzB,KAAA,CAAM,wDAAwD,IAAI,CAAC,CAAA,CACnE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACrB,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAA,GAAS,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,MAAM,CAAA,wCAAA,CAA0C,CAAA;AAC5D;AAEO,SAAS,YAAA,CAAa,GAAA,GAAmB,EAAC,EAAG;AAClD,EAAA,MAAM,UAAA,GAAa,GAAA;AACnB,EAAA,MAAM,EAAE,uBAAsB,GAAI,GAAA;AAClC,EAAA,IAAI,qBAAA,IAAyB,CAAC,qBAAA,CAAsB,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAAC,kBAAA,CAAW;AAAA,IACT,eAAA,EAAiB,kBAAA,CAAmB,GAAA,CAAI,eAAe,CAAA;AAAA,IACvD,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,6BAA6B,GAAA,CAAI,2BAAA;AAAA,IACjC,qBAAA;AAAA,IACA,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,WAAA,EAAa,UAAA,CAAW,WAAA,GAAc,UAAA,CAAW,WAAA,GAAc,MAAA;AAAA,IAC/D,gBAAgB,UAAA,CAAW,cAAA;AAAA,IAC3B,cAAc,UAAA,CAAW;AAAA,GAC1B,CAAA;AAGD,EAAAC,iBAAA,EAAc;AAChB;;;"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const LOAD_TIMEOUT_MS = 3e4;
|
|
4
|
+
const POLL_INTERVAL_MS = 50;
|
|
5
|
+
function parseSpreedlyUrl(scriptSrc) {
|
|
6
|
+
try {
|
|
7
|
+
const url = new URL(scriptSrc);
|
|
8
|
+
const isSpreedlyHost = url.hostname === "spreedly.com" || url.hostname.endsWith(".spreedly.com");
|
|
9
|
+
return url.protocol === "https:" && isSpreedlyHost ? url : null;
|
|
10
|
+
} catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
3
14
|
async function loadSpreedlyScript(scriptSrc, integrity) {
|
|
4
15
|
if (typeof window !== "undefined" && window.Spreedly) {
|
|
5
16
|
return Promise.resolve();
|
|
@@ -9,36 +20,39 @@ async function loadSpreedlyScript(scriptSrc, integrity) {
|
|
|
9
20
|
reject(new Error("Document is not available. This function must be called in a browser environment."));
|
|
10
21
|
return;
|
|
11
22
|
}
|
|
12
|
-
const
|
|
23
|
+
const url = parseSpreedlyUrl(scriptSrc);
|
|
24
|
+
if (!url) {
|
|
25
|
+
reject(new Error("Payment iFrame script must be served over https from spreedly.com"));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const deadline = Date.now() + LOAD_TIMEOUT_MS;
|
|
29
|
+
let pollTimer;
|
|
30
|
+
const waitForSpreedly = () => {
|
|
31
|
+
if (window.Spreedly) {
|
|
32
|
+
resolve();
|
|
33
|
+
} else if (Date.now() >= deadline) {
|
|
34
|
+
reject(new Error("Timed out loading payment iFrame script"));
|
|
35
|
+
} else {
|
|
36
|
+
pollTimer = setTimeout(waitForSpreedly, POLL_INTERVAL_MS);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const existingScript = Array.from(document.scripts).find(
|
|
40
|
+
(script2) => script2.src === url.href && script2.integrity === integrity
|
|
41
|
+
);
|
|
13
42
|
if (existingScript) {
|
|
14
|
-
|
|
15
|
-
if (window.Spreedly) {
|
|
16
|
-
resolve();
|
|
17
|
-
} else {
|
|
18
|
-
setTimeout(checkLoaded, 50);
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
checkLoaded();
|
|
43
|
+
waitForSpreedly();
|
|
22
44
|
return;
|
|
23
45
|
}
|
|
24
46
|
const script = document.createElement("script");
|
|
25
|
-
script.src =
|
|
47
|
+
script.src = url.href;
|
|
26
48
|
script.integrity = integrity;
|
|
27
49
|
script.crossOrigin = "anonymous";
|
|
28
|
-
script.addEventListener("load", () => {
|
|
29
|
-
const checkLoaded = () => {
|
|
30
|
-
if (window.Spreedly) {
|
|
31
|
-
resolve();
|
|
32
|
-
} else {
|
|
33
|
-
setTimeout(checkLoaded, 50);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
checkLoaded();
|
|
37
|
-
});
|
|
38
50
|
script.addEventListener("error", () => {
|
|
51
|
+
clearTimeout(pollTimer);
|
|
39
52
|
reject(new Error("Failed to load payment iFrame script"));
|
|
40
53
|
});
|
|
41
54
|
document.head.appendChild(script);
|
|
55
|
+
waitForSpreedly();
|
|
42
56
|
});
|
|
43
57
|
}
|
|
44
58
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadSpreedlyScript.js","sources":["../../../src/utils/loadSpreedlyScript.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"loadSpreedlyScript.js","sources":["../../../src/utils/loadSpreedlyScript.ts"],"sourcesContent":["const LOAD_TIMEOUT_MS = 30_000;\nconst POLL_INTERVAL_MS = 50;\n\nfunction parseSpreedlyUrl(scriptSrc: string): URL | null {\n try {\n const url = new URL(scriptSrc);\n const isSpreedlyHost = url.hostname === 'spreedly.com' || url.hostname.endsWith('.spreedly.com');\n return url.protocol === 'https:' && isSpreedlyHost ? url : null;\n } catch {\n return null;\n }\n}\n\nexport async function loadSpreedlyScript(scriptSrc: string, integrity: string): Promise<void> {\n // Check if already loaded\n if (typeof window !== 'undefined' && window.Spreedly) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n if (typeof document === 'undefined') {\n reject(new Error('Document is not available. This function must be called in a browser environment.'));\n return;\n }\n\n const url = parseSpreedlyUrl(scriptSrc);\n if (!url) {\n reject(new Error('Payment iFrame script must be served over https from spreedly.com'));\n return;\n }\n\n const deadline = Date.now() + LOAD_TIMEOUT_MS;\n let pollTimer: ReturnType<typeof setTimeout> | undefined;\n const waitForSpreedly = () => {\n if (window.Spreedly) {\n resolve();\n } else if (Date.now() >= deadline) {\n reject(new Error('Timed out loading payment iFrame script'));\n } else {\n pollTimer = setTimeout(waitForSpreedly, POLL_INTERVAL_MS);\n }\n };\n\n // A tag already on the page is only trusted if the browser verified it against the same hash\n const existingScript = Array.from(document.scripts).find(\n script => script.src === url.href && script.integrity === integrity\n );\n if (existingScript) {\n waitForSpreedly();\n return;\n }\n\n const script = document.createElement('script');\n script.src = url.href;\n script.integrity = integrity;\n script.crossOrigin = 'anonymous';\n\n script.addEventListener('error', () => {\n clearTimeout(pollTimer);\n reject(new Error('Failed to load payment iFrame script'));\n });\n\n document.head.appendChild(script);\n // Poll from the start rather than on load so a request that stalls still hits the deadline\n waitForSpreedly();\n });\n}\n"],"names":["script"],"mappings":";;AAAA,MAAM,eAAA,GAAkB,GAAA;AACxB,MAAM,gBAAA,GAAmB,EAAA;AAEzB,SAAS,iBAAiB,SAAA,EAA+B;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAC7B,IAAA,MAAM,iBAAiB,GAAA,CAAI,QAAA,KAAa,kBAAkB,GAAA,CAAI,QAAA,CAAS,SAAS,eAAe,CAAA;AAC/F,IAAA,OAAO,GAAA,CAAI,QAAA,KAAa,QAAA,IAAY,cAAA,GAAiB,GAAA,GAAM,IAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,kBAAA,CAAmB,WAAmB,SAAA,EAAkC;AAE5F,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,QAAA,EAAU;AACpD,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAEA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mFAAmF,CAAC,CAAA;AACrG,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,iBAAiB,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,mEAAmE,CAAC,CAAA;AACrF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,eAAA;AAC9B,IAAA,IAAI,SAAA;AACJ,IAAA,MAAM,kBAAkB,MAAM;AAC5B,MAAA,IAAI,OAAO,QAAA,EAAU;AACnB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAA,IAAW,IAAA,CAAK,GAAA,EAAI,IAAK,QAAA,EAAU;AACjC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,yCAAyC,CAAC,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,SAAA,GAAY,UAAA,CAAW,iBAAiB,gBAAgB,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA;AAAA,MAClD,CAAAA,OAAAA,KAAUA,OAAAA,CAAO,QAAQ,GAAA,CAAI,IAAA,IAAQA,QAAO,SAAA,KAAc;AAAA,KAC5D;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,eAAA,EAAgB;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAM,GAAA,CAAI,IAAA;AACjB,IAAA,MAAA,CAAO,SAAA,GAAY,SAAA;AACnB,IAAA,MAAA,CAAO,WAAA,GAAc,WAAA;AAErB,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,sCAAsC,CAAC,CAAA;AAAA,IAC1D,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA;AAEhC,IAAA,eAAA,EAAgB;AAAA,EAClB,CAAC,CAAA;AACH;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.js","sources":["../../../src/utils/options.ts"],"sourcesContent":["import { StorefrontOptions } from '../types';\n\nlet options: StorefrontOptions = {\n storeIdentifier: '',\n environment: 'prod',\n};\n\nexport function setOptions(opts: StorefrontOptions) {\n options = opts;\n}\n\nexport function getOptions() {\n return options;\n}\n"],"names":[],"mappings":";;AAEA,IAAI,
|
|
1
|
+
{"version":3,"file":"options.js","sources":["../../../src/utils/options.ts"],"sourcesContent":["import { StorefrontOptions } from '../types';\n\nlet options: StorefrontOptions = {\n storeIdentifier: '',\n environment: 'prod',\n};\n\nexport function setOptions(opts: StorefrontOptions) {\n options = opts;\n}\n\nexport function getOptions() {\n return options;\n}\n"],"names":[],"mappings":";;AAEA,IAAI,OAAA,GAA6B;AAAA,EAC/B,eAAA,EAAiB,EAAA;AAAA,EACjB,WAAA,EAAa;AACf,CAAA;AAEO,SAAS,WAAW,IAAA,EAAyB;AAClD,EAAA,OAAA,GAAU,IAAA;AACZ;AAEO,SAAS,UAAA,GAAa;AAC3B,EAAA,OAAO,OAAA;AACT;;;"}
|
|
@@ -46,7 +46,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
|
|
|
46
46
|
"X-Recharge-Sdk-Fn": session.internalFnCall,
|
|
47
47
|
...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
|
|
48
48
|
...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
|
|
49
|
-
"X-Recharge-Sdk-Version": "2.
|
|
49
|
+
"X-Recharge-Sdk-Version": "2.7.0",
|
|
50
50
|
"X-Request-Id": session.internalRequestId,
|
|
51
51
|
...session.tmp_fn_identifier ? { "X-Recharge-Sdk-Fn-Identifier": session.tmp_fn_identifier } : {},
|
|
52
52
|
...headers ? headers : {}
|