@rechargeapps/storefront-client 1.91.1 → 2.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 (42) hide show
  1. package/dist/cjs/api/auth.js +1 -1
  2. package/dist/cjs/api/auth.js.map +1 -1
  3. package/dist/cjs/api/bundle.js +2 -2
  4. package/dist/cjs/api/bundle.js.map +1 -1
  5. package/dist/cjs/api/bundleData.js +1 -1
  6. package/dist/cjs/api/bundleData.js.map +1 -1
  7. package/dist/cjs/api/subscription.js +3 -5
  8. package/dist/cjs/api/subscription.js.map +1 -1
  9. package/dist/cjs/mappers/cdn.js +1 -2
  10. package/dist/cjs/mappers/cdn.js.map +1 -1
  11. package/dist/cjs/mappers/subscription.js +2 -3
  12. package/dist/cjs/mappers/subscription.js.map +1 -1
  13. package/dist/cjs/mappers/utils.js +11 -0
  14. package/dist/cjs/mappers/utils.js.map +1 -1
  15. package/dist/cjs/utils/bundle.js +57 -59
  16. package/dist/cjs/utils/bundle.js.map +1 -1
  17. package/dist/cjs/utils/id.js +13 -0
  18. package/dist/cjs/utils/id.js.map +1 -0
  19. package/dist/cjs/utils/request.js +6 -11
  20. package/dist/cjs/utils/request.js.map +1 -1
  21. package/dist/esm/api/auth.js +1 -1
  22. package/dist/esm/api/auth.js.map +1 -1
  23. package/dist/esm/api/bundle.js +1 -1
  24. package/dist/esm/api/bundle.js.map +1 -1
  25. package/dist/esm/api/bundleData.js +1 -1
  26. package/dist/esm/api/bundleData.js.map +1 -1
  27. package/dist/esm/api/subscription.js +3 -5
  28. package/dist/esm/api/subscription.js.map +1 -1
  29. package/dist/esm/mappers/cdn.js +1 -2
  30. package/dist/esm/mappers/cdn.js.map +1 -1
  31. package/dist/esm/mappers/subscription.js +1 -2
  32. package/dist/esm/mappers/subscription.js.map +1 -1
  33. package/dist/esm/mappers/utils.js +11 -1
  34. package/dist/esm/mappers/utils.js.map +1 -1
  35. package/dist/esm/utils/bundle.js +57 -59
  36. package/dist/esm/utils/bundle.js.map +1 -1
  37. package/dist/esm/utils/id.js +11 -0
  38. package/dist/esm/utils/id.js.map +1 -0
  39. package/dist/esm/utils/request.js +5 -10
  40. package/dist/esm/utils/request.js.map +1 -1
  41. package/dist/umd/recharge-client.min.js +2 -26
  42. package/package.json +2 -10
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var jsXdr = require('js-xdr');
3
+ var jsXdr = require('@stellar/js-xdr');
4
4
 
5
5
  var __accessCheck = (obj, member, msg) => {
6
6
  if (!member.has(obj))
@@ -25,68 +25,66 @@ var __privateMethod = (obj, member, method) => {
25
25
  return method;
26
26
  };
27
27
  var _bundleSettings, _items, _bundleData, _formatBundleSettings, formatBundleSettings_fn, _formatBundleData, formatBundleData_fn, _isValueInRange, isValueInRange_fn, _unique, unique_fn, _hasOwn, hasOwn_fn;
28
+ const textEncoder = new TextEncoder();
29
+ const emptyExt = { v: 0 };
30
+ function toBase64(bytes) {
31
+ let binary = "";
32
+ for (let i = 0; i < bytes.length; i++) {
33
+ binary += String.fromCharCode(bytes[i]);
34
+ }
35
+ return btoa(binary);
36
+ }
37
+ const EnvelopeType = jsXdr.enumType("EnvelopeType", {
38
+ envelopeTypeBundle: 0
39
+ });
40
+ const BundleItemExt = jsXdr.union("BundleItemExt", {
41
+ switchOn: jsXdr.int32(),
42
+ switchKey: "v",
43
+ cases: [jsXdr.unionCase("v0", 0, jsXdr.voidType())]
44
+ });
45
+ const BundleItem = jsXdr.struct("BundleItem", {
46
+ collectionId: jsXdr.uint64(),
47
+ productId: jsXdr.uint64(),
48
+ variantId: jsXdr.uint64(),
49
+ sku: jsXdr.string(jsXdr.UNBOUNDED_MAX_LENGTH),
50
+ quantity: jsXdr.uint32(),
51
+ ext: BundleItemExt
52
+ });
53
+ const BundleExt = jsXdr.union("BundleExt", {
54
+ switchOn: jsXdr.int32(),
55
+ switchKey: "v",
56
+ cases: [jsXdr.unionCase("v0", 0, jsXdr.voidType())]
57
+ });
58
+ const Bundle = jsXdr.struct("Bundle", {
59
+ variantId: jsXdr.uint64(),
60
+ items: jsXdr.array(BundleItem, 500),
61
+ version: jsXdr.uint32(),
62
+ ext: BundleExt
63
+ });
64
+ const BundleEnvelope = jsXdr.union("BundleEnvelope", {
65
+ switchOn: EnvelopeType,
66
+ switchKey: "type",
67
+ cases: [jsXdr.unionCase("envelopeTypeBundle", EnvelopeType.envelopeTypeBundle, jsXdr.field("v1", Bundle))]
68
+ });
28
69
  function toLineItemProperty(bundle) {
29
- const opts = {
30
- variantId: xdr.Uint64.fromString(bundle.variantId.toString()),
31
- version: bundle.version || Math.floor(Date.now() / 1e3),
32
- items: bundle.items.map((item) => {
33
- return new xdr.BundleItem({
34
- collectionId: xdr.Uint64.fromString(item.collectionId.toString()),
35
- productId: xdr.Uint64.fromString(item.productId.toString()),
36
- variantId: xdr.Uint64.fromString(item.variantId.toString()),
37
- sku: item.sku || "",
70
+ const value = {
71
+ type: EnvelopeType.envelopeTypeBundle,
72
+ v1: {
73
+ variantId: BigInt(bundle.variantId.toString()),
74
+ items: bundle.items.map((item) => ({
75
+ collectionId: BigInt(item.collectionId.toString()),
76
+ productId: BigInt(item.productId.toString()),
77
+ variantId: BigInt(item.variantId.toString()),
78
+ sku: textEncoder.encode(item.sku || ""),
38
79
  quantity: item.quantity,
39
- ext: new xdr.BundleItemExt(0)
40
- });
41
- }),
42
- ext: new xdr.BundleExt(0)
80
+ ext: emptyExt
81
+ })),
82
+ version: bundle.version || Math.floor(Date.now() / 1e3),
83
+ ext: emptyExt
84
+ }
43
85
  };
44
- const xdrBundle = new xdr.Bundle(opts);
45
- return xdr.BundleEnvelope.envelopeTypeBundle(xdrBundle).toXDR("base64");
86
+ return toBase64(BundleEnvelope.encode(value));
46
87
  }
47
- const xdr = jsXdr.config(
48
- (xdr2) => {
49
- xdr2.enum("EnvelopeType", {
50
- envelopeTypeBundle: 0
51
- });
52
- xdr2.typedef("Uint32", xdr2.uint());
53
- xdr2.typedef("Uint64", xdr2.uhyper());
54
- xdr2.union("BundleItemExt", {
55
- switchOn: xdr2.int(),
56
- switchName: "v",
57
- switches: [[0, xdr2.void()]],
58
- arms: {}
59
- });
60
- xdr2.struct("BundleItem", [
61
- ["collectionId", xdr2.lookup("Uint64")],
62
- ["productId", xdr2.lookup("Uint64")],
63
- ["variantId", xdr2.lookup("Uint64")],
64
- ["sku", xdr2.string()],
65
- ["quantity", xdr2.lookup("Uint32")],
66
- ["ext", xdr2.lookup("BundleItemExt")]
67
- ]);
68
- xdr2.union("BundleExt", {
69
- switchOn: xdr2.int(),
70
- switchName: "v",
71
- switches: [[0, xdr2.void()]],
72
- arms: {}
73
- });
74
- xdr2.struct("Bundle", [
75
- ["variantId", xdr2.lookup("Uint64")],
76
- ["items", xdr2.varArray(xdr2.lookup("BundleItem"), 500)],
77
- ["version", xdr2.lookup("Uint32")],
78
- ["ext", xdr2.lookup("BundleExt")]
79
- ]);
80
- xdr2.union("BundleEnvelope", {
81
- switchOn: xdr2.lookup("EnvelopeType"),
82
- switchName: "type",
83
- switches: [["envelopeTypeBundle", "v1"]],
84
- arms: {
85
- v1: xdr2.lookup("Bundle")
86
- }
87
- });
88
- }
89
- );
90
88
  class BundleSelectionValidator {
91
89
  constructor(selectionItems, bundleData) {
92
90
  __privateAdd(this, _formatBundleSettings);
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sources":["../../../src/utils/bundle.ts"],"sourcesContent":["import { config } from 'js-xdr';\nimport { BundleData as StorefrontBundleData, CDNBundleSettings } from '../types';\n\nexport function toLineItemProperty(bundle: { variantId: string; version: number; items: any[] }) {\n const opts = {\n variantId: xdr.Uint64.fromString(bundle.variantId.toString()),\n version: bundle.version || Math.floor(Date.now() / 1000),\n items: bundle.items.map(item => {\n return new xdr.BundleItem({\n collectionId: xdr.Uint64.fromString(item.collectionId.toString()),\n productId: xdr.Uint64.fromString(item.productId.toString()),\n variantId: xdr.Uint64.fromString(item.variantId.toString()),\n sku: item.sku || '',\n quantity: item.quantity,\n ext: new xdr.BundleItemExt(0),\n });\n }),\n ext: new xdr.BundleExt(0),\n };\n\n const xdrBundle = new xdr.Bundle(opts);\n return xdr.BundleEnvelope.envelopeTypeBundle(xdrBundle).toXDR('base64');\n}\n\nconst xdr = config(\n (xdr: {\n enum: (arg0: string, arg1: { envelopeTypeBundle: number }) => void;\n typedef: (arg0: string, arg1: any) => void;\n uint: () => any;\n uhyper: () => any;\n union: (\n arg0: string,\n arg1: {\n switchOn: any;\n switchName: string;\n switches: any[][] | string[][];\n // eslint-disable-next-line @typescript-eslint/ban-types\n arms: {} | {} | { v1: any };\n }\n ) => void;\n int: () => any;\n void: () => any;\n struct: (arg0: string, arg1: any[][]) => void;\n lookup: (arg0: string) => any;\n string: () => any;\n varArray: (arg0: any, arg1: number) => any;\n }) => {\n xdr.enum('EnvelopeType', {\n envelopeTypeBundle: 0,\n });\n xdr.typedef('Uint32', xdr.uint());\n xdr.typedef('Uint64', xdr.uhyper());\n xdr.union('BundleItemExt', {\n switchOn: xdr.int(),\n switchName: 'v',\n switches: [[0, xdr.void()]],\n arms: {},\n });\n xdr.struct('BundleItem', [\n ['collectionId', xdr.lookup('Uint64')],\n ['productId', xdr.lookup('Uint64')],\n ['variantId', xdr.lookup('Uint64')],\n ['sku', xdr.string()],\n ['quantity', xdr.lookup('Uint32')],\n ['ext', xdr.lookup('BundleItemExt')],\n ]);\n xdr.union('BundleExt', {\n switchOn: xdr.int(),\n switchName: 'v',\n switches: [[0, xdr.void()]],\n arms: {},\n });\n xdr.struct('Bundle', [\n ['variantId', xdr.lookup('Uint64')],\n ['items', xdr.varArray(xdr.lookup('BundleItem'), 500)],\n ['version', xdr.lookup('Uint32')],\n ['ext', xdr.lookup('BundleExt')],\n ]);\n xdr.union('BundleEnvelope', {\n switchOn: xdr.lookup('EnvelopeType'),\n switchName: 'type',\n switches: [['envelopeTypeBundle', 'v1']],\n arms: {\n v1: xdr.lookup('Bundle'),\n },\n });\n }\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":["config","xdr","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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"}
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const ALPHABET = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
4
+ function nanoid(size = 21) {
5
+ let id = "";
6
+ for (let i = 0; i < size; i++) {
7
+ id += ALPHABET[Math.random() * 64 | 0];
8
+ }
9
+ return id;
10
+ }
11
+
12
+ exports.nanoid = nanoid;
13
+ //# sourceMappingURL=id.js.map
@@ -0,0 +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,QAAW,GAAA,kEAAA,CAAA;AAUD,SAAA,MAAA,CAAO,OAAO,EAAY,EAAA;AACxC,EAAA,IAAI,EAAK,GAAA,EAAA,CAAA;AACT,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,EAAM,CAAK,EAAA,EAAA;AAC7B,IAAA,EAAA,IAAM,QAAU,CAAA,IAAA,CAAK,MAAO,EAAA,GAAI,KAAM,CAAC,CAAA,CAAA;AAAA,GACzC;AACA,EAAO,OAAA,EAAA,CAAA;AACT;;;;"}
@@ -1,26 +1,21 @@
1
1
  'use strict';
2
2
 
3
- require('isomorphic-fetch');
4
- var nonSecure = require('nanoid/non-secure');
5
- var stringify = require('qs/lib/stringify');
3
+ var id = require('./id.js');
6
4
  var options = require('./options.js');
7
5
  var api = require('../constants/api.js');
8
6
  var error = require('./error.js');
9
7
  var url = require('./url.js');
10
8
 
11
- function stringifyQuery(str) {
12
- return stringify(str, {
13
- encodeValuesOnly: true,
14
- indices: false,
15
- arrayFormat: "comma"
16
- });
9
+ function stringifyQuery(obj) {
10
+ const encode = (value) => encodeURIComponent(value === null ? "" : String(value));
11
+ return Object.entries(obj).filter(([, value]) => value !== void 0 && !(Array.isArray(value) && value.length === 0)).map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(",") : encode(value)}`).join("&");
17
12
  }
18
13
  const RESERVED_QUERY_KEYS = /* @__PURE__ */ new Set(["shop_url"]);
19
14
  function getInternalSession(session, fnName) {
20
15
  return {
21
16
  ...session,
22
17
  internalFnCall: session.internalFnCall ?? fnName,
23
- internalRequestId: session.internalRequestId ?? nonSecure.nanoid()
18
+ internalRequestId: session.internalRequestId ?? id.nanoid()
24
19
  };
25
20
  }
26
21
  async function cdnRequest(method, url, requestOptions = {}) {
@@ -51,7 +46,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
51
46
  "X-Recharge-Sdk-Fn": session.internalFnCall,
52
47
  ...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
53
48
  ...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
54
- "X-Recharge-Sdk-Version": "1.91.1",
49
+ "X-Recharge-Sdk-Version": "2.1.0",
55
50
  "X-Request-Id": session.internalRequestId,
56
51
  ...session.tmp_fn_identifier ? { "X-Recharge-Sdk-Fn-Identifier": session.tmp_fn_identifier } : {},
57
52
  ...headers ? headers : {}
@@ -1 +1 @@
1
- {"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import 'isomorphic-fetch';\n\nimport { nanoid } from 'nanoid/non-secure';\nimport stringify from 'qs/lib/stringify';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\nfunction stringifyQuery(str: unknown): string {\n return stringify(str, {\n encodeValuesOnly: true,\n indices: false,\n arrayFormat: 'comma',\n });\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n if (loginRetryFn && error instanceof RechargeRequestError && error.status === 401) {\n // call loginRetryFn and retry request on 401\n return loginRetryFn().then(session => {\n if (session) {\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': session.apiToken,\n },\n });\n }\n throw error;\n });\n } else if (__unstable_twoFactorRetryFn && error instanceof RechargeRequestError && error.status === 423) {\n // trigger two-factor authentication flow and retry request on 423\n return __unstable_twoFactorRetryFn().then(session => {\n if (session) {\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': session.apiToken,\n },\n });\n }\n throw error;\n });\n }\n throw error;\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":["nanoid","getOptions","RECHARGE_CDN_URL","RECHARGE_API_URL","error","RechargeRequestError","session","SHOPIFY_APP_PROXY_URL","url","encodePathSegment"],"mappings":"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"}
1
+ {"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n if (loginRetryFn && error instanceof RechargeRequestError && error.status === 401) {\n // call loginRetryFn and retry request on 401\n return loginRetryFn().then(session => {\n if (session) {\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': session.apiToken,\n },\n });\n }\n throw error;\n });\n } else if (__unstable_twoFactorRetryFn && error instanceof RechargeRequestError && error.status === 423) {\n // trigger two-factor authentication flow and retry request on 423\n return __unstable_twoFactorRetryFn().then(session => {\n if (session) {\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': session.apiToken,\n },\n });\n }\n throw error;\n });\n }\n throw error;\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":["nanoid","getOptions","RECHARGE_CDN_URL","RECHARGE_API_URL","error","RechargeRequestError","session","SHOPIFY_APP_PROXY_URL","url","encodePathSegment"],"mappings":"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"}
@@ -188,7 +188,7 @@ async function rechargeAdminRequest(method, url, { id, query, data, headers } =
188
188
  ...storefrontAccessToken ? { "X-Recharge-Storefront-Access-Token": storefrontAccessToken } : {},
189
189
  ...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
190
190
  ...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
191
- "X-Recharge-Sdk-Version": "1.91.1",
191
+ "X-Recharge-Sdk-Version": "2.1.0",
192
192
  ...headers ? headers : {}
193
193
  };
194
194
  return request(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sources":["../../../src/api/auth.ts"],"sourcesContent":["import { request as baseRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n LoginResponse,\n Method,\n PasswordlessCodeResponse,\n PasswordlessOptions,\n PasswordlessValidateResponse,\n RequestHeaders,\n RequestOptions,\n Session,\n} from '../types';\nimport { getOptions } from '../utils/options';\nimport { RECHARGE_ADMIN_URL } from '../constants/api';\n\nexport async function loginShopifyAppProxy(): Promise<Session> {\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<LoginResponse>('get', '/access', { headers });\n\n return { apiToken: response.api_token, customerId: response.customer_id, message: response.message };\n}\n\n/** @deprecated Use `loginWithShopifyStorefront` instead */\nexport async function loginShopifyApi(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n return loginWithShopifyStorefront(shopifyStorefrontToken, shopifyCustomerAccessToken);\n}\n\nexport async function loginWithShopifyStorefront(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n if (!shopifyStorefrontToken) {\n throw new Error('Shopify storefront token is required');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_storefront_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n storefront_token: shopifyStorefrontToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function loginWithShopifyCustomerAccount(shopifyCustomerAccessToken?: string): Promise<Session | null> {\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_customer_account_api_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function sendPasswordlessCode(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n // Only forward documented option keys. Spreading raw `options` after the\n // trusted `shop`/`email` fields would let a runtime caller override them or\n // inject undocumented authority fields (H1-3884986 / SEC-4002).\n const { send_email, send_sms } = options;\n const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function sendPasswordlessCodeAppProxy(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n // Only forward documented option keys (see sendPasswordlessCode above) so a\n // caller can't override `email` or inject undocumented fields (SEC-4002).\n const { send_email, send_sms } = options;\n const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function validatePasswordlessCode(email: string, session_token: string, code: string): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const response = await rechargeAdminRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n shop: storeIdentifier,\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nexport async function validatePasswordlessCodeAppProxy(\n email: string,\n session_token: string,\n code: string\n): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nfunction getCustomerParams() {\n const { customerHash: devCustomerHash } = getOptions();\n const { pathname, search } = window.location;\n const urlParams = new URLSearchParams(search);\n const token = urlParams.get('token');\n const subpaths = pathname.split('/').filter(Boolean);\n const portalIndex = subpaths.findIndex(path => path === 'portal');\n const customerHash = portalIndex !== -1 ? subpaths[portalIndex + 1] : devCustomerHash;\n\n // make sure the URL contained the data we need\n if (!token || !customerHash) {\n throw new Error('Not in context of Recharge Customer Portal or URL did not contain correct params');\n }\n return { customerHash, token };\n}\n\nexport async function loginCustomerPortal(): Promise<Session> {\n const { customerHash, token } = getCustomerParams();\n const { storeIdentifier } = getOptions();\n const response = await rechargeAdminRequest<LoginResponse>(\n 'post',\n `/customers/${encodePathSegment(customerHash)}/access`,\n {\n data: {\n token,\n shop: storeIdentifier,\n },\n }\n );\n\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nasync function rechargeAdminRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n const { environment, environmentUri, storefrontAccessToken, appName, appVersion } = getOptions();\n const rechargeBaseUrl = RECHARGE_ADMIN_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n ...(storefrontAccessToken ? { 'X-Recharge-Storefront-Access-Token': storefrontAccessToken } : {}),\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(headers ? headers : {}),\n };\n\n return baseRequest<T>(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });\n}\n"],"names":["baseRequest"],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sources":["../../../src/api/auth.ts"],"sourcesContent":["import { request as baseRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n LoginResponse,\n Method,\n PasswordlessCodeResponse,\n PasswordlessOptions,\n PasswordlessValidateResponse,\n RequestHeaders,\n RequestOptions,\n Session,\n} from '../types';\nimport { getOptions } from '../utils/options';\nimport { RECHARGE_ADMIN_URL } from '../constants/api';\n\nexport async function loginShopifyAppProxy(): Promise<Session> {\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<LoginResponse>('get', '/access', { headers });\n\n return { apiToken: response.api_token, customerId: response.customer_id, message: response.message };\n}\n\n/** @deprecated Use `loginWithShopifyStorefront` instead */\nexport async function loginShopifyApi(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n return loginWithShopifyStorefront(shopifyStorefrontToken, shopifyCustomerAccessToken);\n}\n\nexport async function loginWithShopifyStorefront(\n shopifyStorefrontToken: string,\n shopifyCustomerAccessToken?: string\n): Promise<Session | null> {\n if (!shopifyStorefrontToken) {\n throw new Error('Shopify storefront token is required');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_storefront_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n storefront_token: shopifyStorefrontToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function loginWithShopifyCustomerAccount(shopifyCustomerAccessToken?: string): Promise<Session | null> {\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const {\n api_token: apiToken,\n customer_id: customerId,\n message,\n } = await rechargeAdminRequest<LoginResponse>('post', '/shopify_customer_account_api_access', {\n data: {\n customer_token: shopifyCustomerAccessToken,\n shop_url: storeIdentifier,\n },\n });\n\n return apiToken ? { apiToken, customerId, message } : null;\n}\n\nexport async function sendPasswordlessCode(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n // Only forward documented option keys. Spreading raw `options` after the\n // trusted `shop`/`email` fields would let a runtime caller override them or\n // inject undocumented authority fields (H1-3884986 / SEC-4002).\n const { send_email, send_sms } = options;\n const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function sendPasswordlessCodeAppProxy(email: string, options: PasswordlessOptions = {}): Promise<string> {\n if (!email) {\n throw new Error('Email is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n // Only forward documented option keys (see sendPasswordlessCode above) so a\n // caller can't override `email` or inject undocumented fields (SEC-4002).\n const { send_email, send_sms } = options;\n const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...(send_email !== undefined ? { send_email } : {}),\n ...(send_sms !== undefined ? { send_sms } : {}),\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return response.session_token;\n}\n\nexport async function validatePasswordlessCode(email: string, session_token: string, code: string): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storeIdentifier } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const response = await rechargeAdminRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n shop: storeIdentifier,\n },\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nexport async function validatePasswordlessCodeAppProxy(\n email: string,\n session_token: string,\n code: string\n): Promise<Session> {\n if (!email) {\n throw new Error('Email is required.');\n }\n if (!session_token) {\n throw new Error('Session token is required.');\n }\n if (!code) {\n throw new Error('Code is required.');\n }\n const { storefrontAccessToken } = getOptions();\n const headers: RequestHeaders = {};\n if (storefrontAccessToken) {\n headers['X-Recharge-Storefront-Access-Token'] = storefrontAccessToken;\n }\n const response = await shopifyAppProxyRequest<PasswordlessValidateResponse>('post', '/validate_login', {\n data: {\n code,\n email,\n session_token,\n },\n headers,\n });\n\n if (response.errors) {\n throw new Error(response.errors);\n }\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nfunction getCustomerParams() {\n const { customerHash: devCustomerHash } = getOptions();\n const { pathname, search } = window.location;\n const urlParams = new URLSearchParams(search);\n const token = urlParams.get('token');\n const subpaths = pathname.split('/').filter(Boolean);\n const portalIndex = subpaths.findIndex(path => path === 'portal');\n const customerHash = portalIndex !== -1 ? subpaths[portalIndex + 1] : devCustomerHash;\n\n // make sure the URL contained the data we need\n if (!token || !customerHash) {\n throw new Error('Not in context of Recharge Customer Portal or URL did not contain correct params');\n }\n return { customerHash, token };\n}\n\nexport async function loginCustomerPortal(): Promise<Session> {\n const { customerHash, token } = getCustomerParams();\n const { storeIdentifier } = getOptions();\n const response = await rechargeAdminRequest<LoginResponse>(\n 'post',\n `/customers/${encodePathSegment(customerHash)}/access`,\n {\n data: {\n token,\n shop: storeIdentifier,\n },\n }\n );\n\n return { apiToken: response.api_token, customerId: response.customer_id };\n}\n\nasync function rechargeAdminRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n const { environment, environmentUri, storefrontAccessToken, appName, appVersion } = getOptions();\n const rechargeBaseUrl = RECHARGE_ADMIN_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n ...(storefrontAccessToken ? { 'X-Recharge-Storefront-Access-Token': storefrontAccessToken } : {}),\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(headers ? headers : {}),\n };\n\n return baseRequest<T>(method, `${rechargeBaseUrl}${url}`, { id, query, data, headers: reqHeaders });\n}\n"],"names":["baseRequest"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { nanoid } from 'nanoid/non-secure';
1
+ import { nanoid } from '../utils/id.js';
2
2
  import { shopifyAppProxyRequest, getInternalSession, rechargeApiRequest } from '../utils/request.js';
3
3
  import { encodePathSegment } from '../utils/url.js';
4
4
  import { getOptions } from '../utils/options.js';
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sources":["../../../src/api/bundle.ts"],"sourcesContent":["import { nanoid } from 'nanoid/non-secure';\nimport {\n BundleAppProxy,\n DynamicBundleItemAppProxy,\n BundleSelection,\n BundleSelectionListParams,\n BundleSelectionsResponse,\n CreateBundleSelectionRequest,\n Session,\n UpdateBundleSelectionRequest,\n UpdateBundlePurchaseItem,\n BundlePurchaseItem,\n BundlePurchaseItemParams,\n BundleData,\n} from '../types';\nimport { getInternalSession, rechargeApiRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { getOptions } from '../utils/options';\nimport { BundleSelectionValidator, toLineItemProperty } from '../utils/bundle';\n\nconst STORE_FRONT_MANAGER_URL = '/bundling-storefront-manager';\n\nfunction createBundleData(bundle: BundleAppProxy) {\n return toLineItemProperty({\n variantId: bundle.externalVariantId,\n version: 0, // server will replace it with the current time\n items: bundle.selections.map(item => {\n return {\n collectionId: item.collectionId,\n productId: item.externalProductId,\n variantId: item.externalVariantId,\n quantity: item.quantity,\n sku: '',\n };\n }),\n });\n}\n\nexport async function getBundleId(bundle: BundleAppProxy): Promise<string> {\n const opts = getOptions();\n const isValid = await validateBundle(bundle);\n if (isValid !== true) {\n throw new Error(isValid);\n }\n const bundleData = createBundleData(bundle);\n\n try {\n const payload = await shopifyAppProxyRequest<{ id: string; code: number; message: string }>(\n 'post',\n `${STORE_FRONT_MANAGER_URL}/api/v1/bundles`,\n {\n data: {\n bundle: bundleData,\n },\n headers: {\n Origin: `https://${opts.storeIdentifier}`,\n },\n }\n );\n\n if (!payload.id || payload.code !== 200) {\n throw new Error(`1: failed generating rb_id: ${JSON.stringify(payload)}`);\n }\n\n return payload.id;\n } catch (e) {\n // Handle NetworkError exceptions\n throw new Error(`2: failed generating rb_id ${e}`);\n }\n}\n\nexport async function getBundleSelectionId(session: Session, bundle: BundleAppProxy): Promise<string> {\n const isValid = await validateBundle(bundle);\n if (isValid !== true) {\n throw new Error(isValid);\n }\n const bundleData = createBundleData(bundle);\n\n try {\n const payload = await rechargeApiRequest<{ id: string; code: number; message: string }>(\n 'post',\n `/bundle_selections/bundle_id`,\n {\n data: {\n bundle: bundleData,\n },\n },\n getInternalSession(session, 'getBundleSelectionId')\n );\n\n if (!payload.id || payload.code !== 200) {\n throw new Error(`1: failed generating rb_id: ${JSON.stringify(payload)}`);\n }\n\n return payload.id;\n } catch (e) {\n // Handle NetworkError exceptions\n throw new Error(`2: failed generating rb_id ${e}`);\n }\n}\n\nexport function getDynamicBundleItems(bundle: BundleAppProxy, shopifyProductHandle: string) {\n const isValid = validateDynamicBundle(bundle);\n if (isValid !== true) {\n throw new Error(`Dynamic Bundle is invalid. ${isValid}`);\n }\n // generate unique id for dynamic bundle\n const bundleId = `${nanoid(9)}:${bundle.externalProductId}`;\n return bundle.selections.map(item => {\n const itemData: DynamicBundleItemAppProxy = {\n id: item.externalVariantId,\n quantity: item.quantity,\n properties: {\n _rc_bundle: bundleId,\n _rc_bundle_variant: bundle.externalVariantId,\n _rc_bundle_parent: shopifyProductHandle,\n _rc_bundle_collection_id: item.collectionId,\n },\n };\n\n if (item.sellingPlan) {\n // this is used by SCI stores\n itemData.selling_plan = item.sellingPlan;\n } else if (item.shippingIntervalFrequency) {\n // this is used by RCS stores\n itemData.properties.shipping_interval_frequency = item.shippingIntervalFrequency;\n itemData.properties.shipping_interval_unit_type = item.shippingIntervalUnitType;\n itemData.id = `${item.discountedVariantId}`;\n }\n\n return itemData;\n });\n}\n\nexport async function validateBundle(bundle: BundleAppProxy): Promise<true | string> {\n try {\n // once we implement this function, we can make it raise an exception\n // we could also have a local store relative to this function so we don't have to pass bundleProduct\n if (!bundle) {\n return 'Bundle is not defined';\n }\n if (bundle.selections.length === 0) {\n return 'No selections defined';\n }\n // Don't make bundle settings call due to merchant issues\n // const bundleSettings = await getCDNBundleSettings(bundle.externalProductId);\n // if (!bundleSettings) {\n // return 'Bundle settings do not exist for the given product';\n // }\n return true;\n } catch (e) {\n return `Error fetching bundle settings: ${e}`;\n }\n}\n\nexport async function validateBundleSelection(bundle: BundleAppProxy): Promise<{ valid: boolean; error?: string }> {\n try {\n const bundleData = await shopifyAppProxyRequest<BundleData>(\n 'get',\n `/bundle-data/${encodePathSegment(bundle.externalProductId)}`\n );\n\n const selectionValidator = new BundleSelectionValidator(bundle.selections, bundleData);\n\n return { valid: selectionValidator.isBundleSelectionValid(bundle.externalVariantId) };\n } catch (error) {\n return { valid: false, error: String(error) };\n }\n}\n\nconst intervalUnitGroups = {\n day: ['day', 'days', 'Days'],\n days: ['day', 'days', 'Days'],\n Days: ['day', 'days', 'Days'],\n week: ['week', 'weeks', 'Weeks'],\n weeks: ['week', 'weeks', 'Weeks'],\n Weeks: ['week', 'weeks', 'Weeks'],\n month: ['month', 'months', 'Months'],\n months: ['month', 'months', 'Months'],\n Months: ['month', 'months', 'Months'],\n};\n\n/**\n * Validates a dynamic bundle\n *\n * @param bundle Dynamic Bundle being validated\n * @returns true or error message\n */\nexport function validateDynamicBundle(bundle: BundleAppProxy): true | string {\n if (!bundle) {\n return 'No bundle defined.';\n }\n if (bundle.selections.length === 0) {\n return 'No selections defined.';\n }\n // validation for RCS onetimes\n const { shippingIntervalFrequency, shippingIntervalUnitType } =\n bundle.selections.find(selection => selection.shippingIntervalFrequency || selection.shippingIntervalUnitType) ||\n {};\n if (shippingIntervalFrequency || shippingIntervalUnitType) {\n // if we have shipping intervals then we should have both defined\n if (!shippingIntervalFrequency || !shippingIntervalUnitType) {\n return 'Shipping intervals do not match on selections.';\n } else {\n // if we have shipping intervals then any that are defined should match\n const shippingIntervalUnitGroup = intervalUnitGroups[shippingIntervalUnitType];\n for (let x = 0; x < bundle.selections.length; x++) {\n const { shippingIntervalFrequency: frequency, shippingIntervalUnitType: unitType } = bundle.selections[x];\n if (\n (frequency && frequency !== shippingIntervalFrequency) ||\n (unitType && !shippingIntervalUnitGroup.includes(unitType))\n ) {\n return 'Shipping intervals do not match on selections.';\n }\n }\n }\n }\n return true;\n}\n\nexport async function getBundleSelection(session: Session, id: string | number): Promise<BundleSelection> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { bundle_selection } = await rechargeApiRequest<{ bundle_selection: BundleSelection }>(\n 'get',\n `/bundle_selections`,\n {\n id,\n },\n getInternalSession(session, 'getBundleSelection')\n );\n return bundle_selection;\n}\n\nexport function listBundleSelections(\n session: Session,\n query?: BundleSelectionListParams\n): Promise<BundleSelectionsResponse> {\n return rechargeApiRequest<BundleSelectionsResponse>(\n 'get',\n `/bundle_selections`,\n { query },\n getInternalSession(session, 'listBundleSelections')\n );\n}\n\nexport async function createBundleSelection(\n session: Session,\n createRequest: CreateBundleSelectionRequest\n): Promise<BundleSelection> {\n const { bundle_selection } = await rechargeApiRequest<{ bundle_selection: BundleSelection }>(\n 'post',\n `/bundle_selections`,\n {\n data: createRequest,\n },\n getInternalSession(session, 'createBundleSelection')\n );\n return bundle_selection;\n}\n\nexport async function updateBundleSelection(\n session: Session,\n id: string | number,\n updateRequest: UpdateBundleSelectionRequest\n): Promise<BundleSelection> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { bundle_selection } = await rechargeApiRequest<{ bundle_selection: BundleSelection }>(\n 'put',\n `/bundle_selections`,\n {\n id,\n data: updateRequest,\n },\n getInternalSession(session, 'updateBundleSelection')\n );\n return bundle_selection;\n}\n\nexport function deleteBundleSelection(session: Session, id: string | number): Promise<void> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n return rechargeApiRequest<void>(\n 'delete',\n `/bundle_selections`,\n {\n id,\n },\n getInternalSession(session, 'deleteBundleSelection')\n );\n}\n\nexport async function updateBundle(\n session: Session,\n purchase_item_id: string | number,\n updateRequest: UpdateBundlePurchaseItem,\n query?: BundlePurchaseItemParams\n): Promise<BundlePurchaseItem> {\n if (purchase_item_id === undefined || purchase_item_id === '') {\n throw new Error('Purchase item ID is required');\n }\n const { subscription } = await rechargeApiRequest<{ subscription: BundlePurchaseItem }>(\n 'put',\n '/bundles',\n {\n id: purchase_item_id,\n data: updateRequest,\n query,\n },\n getInternalSession(session, 'updateBundle')\n );\n\n return subscription;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle.js","sources":["../../../src/api/bundle.ts"],"sourcesContent":["import { nanoid } from '../utils/id';\nimport {\n BundleAppProxy,\n DynamicBundleItemAppProxy,\n BundleSelection,\n BundleSelectionListParams,\n BundleSelectionsResponse,\n CreateBundleSelectionRequest,\n Session,\n UpdateBundleSelectionRequest,\n UpdateBundlePurchaseItem,\n BundlePurchaseItem,\n BundlePurchaseItemParams,\n BundleData,\n} from '../types';\nimport { getInternalSession, rechargeApiRequest, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { getOptions } from '../utils/options';\nimport { BundleSelectionValidator, toLineItemProperty } from '../utils/bundle';\n\nconst STORE_FRONT_MANAGER_URL = '/bundling-storefront-manager';\n\nfunction createBundleData(bundle: BundleAppProxy) {\n return toLineItemProperty({\n variantId: bundle.externalVariantId,\n version: 0, // server will replace it with the current time\n items: bundle.selections.map(item => {\n return {\n collectionId: item.collectionId,\n productId: item.externalProductId,\n variantId: item.externalVariantId,\n quantity: item.quantity,\n sku: '',\n };\n }),\n });\n}\n\nexport async function getBundleId(bundle: BundleAppProxy): Promise<string> {\n const opts = getOptions();\n const isValid = await validateBundle(bundle);\n if (isValid !== true) {\n throw new Error(isValid);\n }\n const bundleData = createBundleData(bundle);\n\n try {\n const payload = await shopifyAppProxyRequest<{ id: string; code: number; message: string }>(\n 'post',\n `${STORE_FRONT_MANAGER_URL}/api/v1/bundles`,\n {\n data: {\n bundle: bundleData,\n },\n headers: {\n Origin: `https://${opts.storeIdentifier}`,\n },\n }\n );\n\n if (!payload.id || payload.code !== 200) {\n throw new Error(`1: failed generating rb_id: ${JSON.stringify(payload)}`);\n }\n\n return payload.id;\n } catch (e) {\n // Handle NetworkError exceptions\n throw new Error(`2: failed generating rb_id ${e}`);\n }\n}\n\nexport async function getBundleSelectionId(session: Session, bundle: BundleAppProxy): Promise<string> {\n const isValid = await validateBundle(bundle);\n if (isValid !== true) {\n throw new Error(isValid);\n }\n const bundleData = createBundleData(bundle);\n\n try {\n const payload = await rechargeApiRequest<{ id: string; code: number; message: string }>(\n 'post',\n `/bundle_selections/bundle_id`,\n {\n data: {\n bundle: bundleData,\n },\n },\n getInternalSession(session, 'getBundleSelectionId')\n );\n\n if (!payload.id || payload.code !== 200) {\n throw new Error(`1: failed generating rb_id: ${JSON.stringify(payload)}`);\n }\n\n return payload.id;\n } catch (e) {\n // Handle NetworkError exceptions\n throw new Error(`2: failed generating rb_id ${e}`);\n }\n}\n\nexport function getDynamicBundleItems(bundle: BundleAppProxy, shopifyProductHandle: string) {\n const isValid = validateDynamicBundle(bundle);\n if (isValid !== true) {\n throw new Error(`Dynamic Bundle is invalid. ${isValid}`);\n }\n // generate unique id for dynamic bundle\n const bundleId = `${nanoid(9)}:${bundle.externalProductId}`;\n return bundle.selections.map(item => {\n const itemData: DynamicBundleItemAppProxy = {\n id: item.externalVariantId,\n quantity: item.quantity,\n properties: {\n _rc_bundle: bundleId,\n _rc_bundle_variant: bundle.externalVariantId,\n _rc_bundle_parent: shopifyProductHandle,\n _rc_bundle_collection_id: item.collectionId,\n },\n };\n\n if (item.sellingPlan) {\n // this is used by SCI stores\n itemData.selling_plan = item.sellingPlan;\n } else if (item.shippingIntervalFrequency) {\n // this is used by RCS stores\n itemData.properties.shipping_interval_frequency = item.shippingIntervalFrequency;\n itemData.properties.shipping_interval_unit_type = item.shippingIntervalUnitType;\n itemData.id = `${item.discountedVariantId}`;\n }\n\n return itemData;\n });\n}\n\nexport async function validateBundle(bundle: BundleAppProxy): Promise<true | string> {\n try {\n // once we implement this function, we can make it raise an exception\n // we could also have a local store relative to this function so we don't have to pass bundleProduct\n if (!bundle) {\n return 'Bundle is not defined';\n }\n if (bundle.selections.length === 0) {\n return 'No selections defined';\n }\n // Don't make bundle settings call due to merchant issues\n // const bundleSettings = await getCDNBundleSettings(bundle.externalProductId);\n // if (!bundleSettings) {\n // return 'Bundle settings do not exist for the given product';\n // }\n return true;\n } catch (e) {\n return `Error fetching bundle settings: ${e}`;\n }\n}\n\nexport async function validateBundleSelection(bundle: BundleAppProxy): Promise<{ valid: boolean; error?: string }> {\n try {\n const bundleData = await shopifyAppProxyRequest<BundleData>(\n 'get',\n `/bundle-data/${encodePathSegment(bundle.externalProductId)}`\n );\n\n const selectionValidator = new BundleSelectionValidator(bundle.selections, bundleData);\n\n return { valid: selectionValidator.isBundleSelectionValid(bundle.externalVariantId) };\n } catch (error) {\n return { valid: false, error: String(error) };\n }\n}\n\nconst intervalUnitGroups = {\n day: ['day', 'days', 'Days'],\n days: ['day', 'days', 'Days'],\n Days: ['day', 'days', 'Days'],\n week: ['week', 'weeks', 'Weeks'],\n weeks: ['week', 'weeks', 'Weeks'],\n Weeks: ['week', 'weeks', 'Weeks'],\n month: ['month', 'months', 'Months'],\n months: ['month', 'months', 'Months'],\n Months: ['month', 'months', 'Months'],\n};\n\n/**\n * Validates a dynamic bundle\n *\n * @param bundle Dynamic Bundle being validated\n * @returns true or error message\n */\nexport function validateDynamicBundle(bundle: BundleAppProxy): true | string {\n if (!bundle) {\n return 'No bundle defined.';\n }\n if (bundle.selections.length === 0) {\n return 'No selections defined.';\n }\n // validation for RCS onetimes\n const { shippingIntervalFrequency, shippingIntervalUnitType } =\n bundle.selections.find(selection => selection.shippingIntervalFrequency || selection.shippingIntervalUnitType) ||\n {};\n if (shippingIntervalFrequency || shippingIntervalUnitType) {\n // if we have shipping intervals then we should have both defined\n if (!shippingIntervalFrequency || !shippingIntervalUnitType) {\n return 'Shipping intervals do not match on selections.';\n } else {\n // if we have shipping intervals then any that are defined should match\n const shippingIntervalUnitGroup = intervalUnitGroups[shippingIntervalUnitType];\n for (let x = 0; x < bundle.selections.length; x++) {\n const { shippingIntervalFrequency: frequency, shippingIntervalUnitType: unitType } = bundle.selections[x];\n if (\n (frequency && frequency !== shippingIntervalFrequency) ||\n (unitType && !shippingIntervalUnitGroup.includes(unitType))\n ) {\n return 'Shipping intervals do not match on selections.';\n }\n }\n }\n }\n return true;\n}\n\nexport async function getBundleSelection(session: Session, id: string | number): Promise<BundleSelection> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { bundle_selection } = await rechargeApiRequest<{ bundle_selection: BundleSelection }>(\n 'get',\n `/bundle_selections`,\n {\n id,\n },\n getInternalSession(session, 'getBundleSelection')\n );\n return bundle_selection;\n}\n\nexport function listBundleSelections(\n session: Session,\n query?: BundleSelectionListParams\n): Promise<BundleSelectionsResponse> {\n return rechargeApiRequest<BundleSelectionsResponse>(\n 'get',\n `/bundle_selections`,\n { query },\n getInternalSession(session, 'listBundleSelections')\n );\n}\n\nexport async function createBundleSelection(\n session: Session,\n createRequest: CreateBundleSelectionRequest\n): Promise<BundleSelection> {\n const { bundle_selection } = await rechargeApiRequest<{ bundle_selection: BundleSelection }>(\n 'post',\n `/bundle_selections`,\n {\n data: createRequest,\n },\n getInternalSession(session, 'createBundleSelection')\n );\n return bundle_selection;\n}\n\nexport async function updateBundleSelection(\n session: Session,\n id: string | number,\n updateRequest: UpdateBundleSelectionRequest\n): Promise<BundleSelection> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { bundle_selection } = await rechargeApiRequest<{ bundle_selection: BundleSelection }>(\n 'put',\n `/bundle_selections`,\n {\n id,\n data: updateRequest,\n },\n getInternalSession(session, 'updateBundleSelection')\n );\n return bundle_selection;\n}\n\nexport function deleteBundleSelection(session: Session, id: string | number): Promise<void> {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n return rechargeApiRequest<void>(\n 'delete',\n `/bundle_selections`,\n {\n id,\n },\n getInternalSession(session, 'deleteBundleSelection')\n );\n}\n\nexport async function updateBundle(\n session: Session,\n purchase_item_id: string | number,\n updateRequest: UpdateBundlePurchaseItem,\n query?: BundlePurchaseItemParams\n): Promise<BundlePurchaseItem> {\n if (purchase_item_id === undefined || purchase_item_id === '') {\n throw new Error('Purchase item ID is required');\n }\n const { subscription } = await rechargeApiRequest<{ subscription: BundlePurchaseItem }>(\n 'put',\n '/bundles',\n {\n id: purchase_item_id,\n data: updateRequest,\n query,\n },\n getInternalSession(session, 'updateBundle')\n );\n\n return subscription;\n}\n"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ async function loadFromOnlineStore(id, country_code) {
14
14
  const { appName, appVersion } = getOptions();
15
15
  const headers = {
16
16
  "X-Recharge-Sdk-Fn": "loadFromOnlineStore",
17
- "X-Recharge-Sdk-Version": "1.91.1",
17
+ "X-Recharge-Sdk-Version": "2.1.0",
18
18
  ...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
19
19
  ...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {}
20
20
  };
@@ -1 +1 @@
1
- {"version":3,"file":"bundleData.js","sources":["../../../src/api/bundleData.ts"],"sourcesContent":["import { Options, PublicBundleData, ShopifyStorefrontOptions } from '../types/bundleData';\nimport { getOptions } from '../utils/options';\nimport { SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { BundleData as StorefrontBundleData } from '../types/bundle';\nimport { request, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { mapOnlineStoreToPublicBundleData } from '../utils/bundleData';\n\n/**\n * Load bundle data from the specified source\n *\n * @param id - The external product ID (Shopify product ID)\n * @param options - Configuration for data source and parameters\n * @param options.source - The source of the data (online_store or shopify_storefront)\n * @param options.country_code - The country code for the online store\n * @param options.storefront_access_token - The storefront access token for the Shopify Storefront API\n * @returns Promise resolving to bundle data result with success/error handling\n *\n * @example\n * ```typescript\n * // Load from online store\n * const result = await loadBundleData({\n * source: 'online_store',\n * external_product_id: '123456789',\n * country_code: 'US'\n * });\n *\n * if (result.success) {\n * console.log('Bundle data:', result.data);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n *\n * // Load from Shopify Storefront API\n * const result2 = await loadBundleData({\n * source: 'shopify_storefront',\n * external_product_id: '123456789',\n * country_code: 'US',\n * shopify_storefront_access_token: 'your-token-here'\n * });\n * ```\n */\nexport async function loadBundleData(id: string, options?: Options): Promise<PublicBundleData> {\n if (options?.source === 'shopify_storefront') {\n return loadFromShopifyStorefrontApi(id, options);\n }\n\n return loadFromOnlineStore(id, options?.country_code);\n}\n\n/**\n * Load bundle data from the online store endpoint\n */\nasync function loadFromOnlineStore(id: string, country_code?: string): Promise<PublicBundleData> {\n const { appName, appVersion } = getOptions();\n const headers = {\n 'X-Recharge-Sdk-Fn': 'loadFromOnlineStore',\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n };\n\n if (!country_code) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n\n const payload = new FormData();\n payload.append('form_type', 'localization');\n payload.append('_method', 'put');\n payload.append('return_to', `${SHOPIFY_APP_PROXY_URL}/bundle-data/${id}`);\n payload.append('country_code', country_code);\n\n try {\n const data = await request<StorefrontBundleData>('post', '/localization', {\n headers: { 'Content-Type': 'multipart/form-data', ...headers },\n data: payload,\n });\n return mapOnlineStoreToPublicBundleData(data);\n } catch (error) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n}\n\n/**\n * Load bundle data from Shopify Storefront API\n */\nasync function loadFromShopifyStorefrontApi(id: string, options: ShopifyStorefrontOptions): Promise<PublicBundleData> {\n const opts = getOptions();\n\n if (!opts.storeIdentifier) {\n throw new Error('Store identifier is required for Shopify Storefront API requests');\n }\n\n // Request data from Shopify Storefront API\n return {} as PublicBundleData;\n}\n"],"names":[],"mappings":";;;;;;AA0CsB,eAAA,cAAA,CAAe,IAAY,OAA8C,EAAA;AAC7F,EAAI,IAAA,OAAA,EAAS,WAAW,oBAAsB,EAAA;AAC5C,IAAO,OAAA,4BAAA,CAAwC,CAAA,CAAA;AAAA,GACjD;AAEA,EAAO,OAAA,mBAAA,CAAoB,EAAI,EAAA,OAAA,EAAS,YAAY,CAAA,CAAA;AACtD,CAAA;AAKA,eAAe,mBAAA,CAAoB,IAAY,YAAkD,EAAA;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAW,EAAA,GAAI,UAAW,EAAA,CAAA;AAC3C,EAAA,MAAM,OAAU,GAAA;AAAA,IACd,mBAAqB,EAAA,qBAAA;AAAA,IACrB,wBAA0B,EAAA,QAAA;AAAA,IAC1B,GAAI,OAAU,GAAA,EAAE,yBAA2B,EAAA,OAAA,KAAY,EAAC;AAAA,IACxD,GAAI,UAAa,GAAA,EAAE,4BAA8B,EAAA,UAAA,KAAe,EAAC;AAAA,GACnE,CAAA;AAEA,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAM,MAAA,IAAA,GAAO,MAAM,sBAA6C,CAAA,KAAA,EAAO,gBAAgB,iBAAkB,CAAA,EAAE,CAAC,CAAI,CAAA,EAAA;AAAA,MAC9G,OAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA,CAAA;AAAA,GAC9C;AAEA,EAAM,MAAA,OAAA,GAAU,IAAI,QAAS,EAAA,CAAA;AAC7B,EAAQ,OAAA,CAAA,MAAA,CAAO,aAAa,cAAc,CAAA,CAAA;AAC1C,EAAQ,OAAA,CAAA,MAAA,CAAO,WAAW,KAAK,CAAA,CAAA;AAC/B,EAAA,OAAA,CAAQ,OAAO,WAAa,EAAA,CAAA,EAAG,qBAAqB,CAAA,aAAA,EAAgB,EAAE,CAAE,CAAA,CAAA,CAAA;AACxE,EAAQ,OAAA,CAAA,MAAA,CAAO,gBAAgB,YAAY,CAAA,CAAA;AAE3C,EAAI,IAAA;AACF,IAAA,MAAM,IAAO,GAAA,MAAM,OAA8B,CAAA,MAAA,EAAQ,eAAiB,EAAA;AAAA,MACxE,OAAS,EAAA,EAAE,cAAgB,EAAA,qBAAA,EAAuB,GAAG,OAAQ,EAAA;AAAA,MAC7D,IAAM,EAAA,OAAA;AAAA,KACP,CAAA,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA,CAAA;AAAA,WACrC,KAAO,EAAA;AACd,IAAM,MAAA,IAAA,GAAO,MAAM,sBAA6C,CAAA,KAAA,EAAO,gBAAgB,iBAAkB,CAAA,EAAE,CAAC,CAAI,CAAA,EAAA;AAAA,MAC9G,OAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA,CAAA;AAAA,GAC9C;AACF,CAAA;AAKA,eAAe,4BAAA,CAA6B,IAAY,OAA8D,EAAA;AACpH,EAAA,MAAM,OAAO,UAAW,EAAA,CAAA;AAExB,EAAI,IAAA,CAAC,KAAK,eAAiB,EAAA;AACzB,IAAM,MAAA,IAAI,MAAM,kEAAkE,CAAA,CAAA;AAAA,GACpF;AAGA,EAAA,OAAO,EAAC,CAAA;AACV;;;;"}
1
+ {"version":3,"file":"bundleData.js","sources":["../../../src/api/bundleData.ts"],"sourcesContent":["import { Options, PublicBundleData, ShopifyStorefrontOptions } from '../types/bundleData';\nimport { getOptions } from '../utils/options';\nimport { SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { BundleData as StorefrontBundleData } from '../types/bundle';\nimport { request, shopifyAppProxyRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport { mapOnlineStoreToPublicBundleData } from '../utils/bundleData';\n\n/**\n * Load bundle data from the specified source\n *\n * @param id - The external product ID (Shopify product ID)\n * @param options - Configuration for data source and parameters\n * @param options.source - The source of the data (online_store or shopify_storefront)\n * @param options.country_code - The country code for the online store\n * @param options.storefront_access_token - The storefront access token for the Shopify Storefront API\n * @returns Promise resolving to bundle data result with success/error handling\n *\n * @example\n * ```typescript\n * // Load from online store\n * const result = await loadBundleData({\n * source: 'online_store',\n * external_product_id: '123456789',\n * country_code: 'US'\n * });\n *\n * if (result.success) {\n * console.log('Bundle data:', result.data);\n * } else {\n * console.error('Error:', result.error.message);\n * }\n *\n * // Load from Shopify Storefront API\n * const result2 = await loadBundleData({\n * source: 'shopify_storefront',\n * external_product_id: '123456789',\n * country_code: 'US',\n * shopify_storefront_access_token: 'your-token-here'\n * });\n * ```\n */\nexport async function loadBundleData(id: string, options?: Options): Promise<PublicBundleData> {\n if (options?.source === 'shopify_storefront') {\n return loadFromShopifyStorefrontApi(id, options);\n }\n\n return loadFromOnlineStore(id, options?.country_code);\n}\n\n/**\n * Load bundle data from the online store endpoint\n */\nasync function loadFromOnlineStore(id: string, country_code?: string): Promise<PublicBundleData> {\n const { appName, appVersion } = getOptions();\n const headers = {\n 'X-Recharge-Sdk-Fn': 'loadFromOnlineStore',\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n };\n\n if (!country_code) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n\n const payload = new FormData();\n payload.append('form_type', 'localization');\n payload.append('_method', 'put');\n payload.append('return_to', `${SHOPIFY_APP_PROXY_URL}/bundle-data/${id}`);\n payload.append('country_code', country_code);\n\n try {\n const data = await request<StorefrontBundleData>('post', '/localization', {\n headers: { 'Content-Type': 'multipart/form-data', ...headers },\n data: payload,\n });\n return mapOnlineStoreToPublicBundleData(data);\n } catch (error) {\n const data = await shopifyAppProxyRequest<StorefrontBundleData>('get', `/bundle-data/${encodePathSegment(id)}`, {\n headers,\n });\n return mapOnlineStoreToPublicBundleData(data);\n }\n}\n\n/**\n * Load bundle data from Shopify Storefront API\n */\nasync function loadFromShopifyStorefrontApi(id: string, options: ShopifyStorefrontOptions): Promise<PublicBundleData> {\n const opts = getOptions();\n\n if (!opts.storeIdentifier) {\n throw new Error('Store identifier is required for Shopify Storefront API requests');\n }\n\n // Request data from Shopify Storefront API\n return {} as PublicBundleData;\n}\n"],"names":[],"mappings":";;;;;;AA0CsB,eAAA,cAAA,CAAe,IAAY,OAA8C,EAAA;AAC7F,EAAI,IAAA,OAAA,EAAS,WAAW,oBAAsB,EAAA;AAC5C,IAAO,OAAA,4BAAA,CAAwC,CAAA,CAAA;AAAA,GACjD;AAEA,EAAO,OAAA,mBAAA,CAAoB,EAAI,EAAA,OAAA,EAAS,YAAY,CAAA,CAAA;AACtD,CAAA;AAKA,eAAe,mBAAA,CAAoB,IAAY,YAAkD,EAAA;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAW,EAAA,GAAI,UAAW,EAAA,CAAA;AAC3C,EAAA,MAAM,OAAU,GAAA;AAAA,IACd,mBAAqB,EAAA,qBAAA;AAAA,IACrB,wBAA0B,EAAA,OAAA;AAAA,IAC1B,GAAI,OAAU,GAAA,EAAE,yBAA2B,EAAA,OAAA,KAAY,EAAC;AAAA,IACxD,GAAI,UAAa,GAAA,EAAE,4BAA8B,EAAA,UAAA,KAAe,EAAC;AAAA,GACnE,CAAA;AAEA,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAM,MAAA,IAAA,GAAO,MAAM,sBAA6C,CAAA,KAAA,EAAO,gBAAgB,iBAAkB,CAAA,EAAE,CAAC,CAAI,CAAA,EAAA;AAAA,MAC9G,OAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA,CAAA;AAAA,GAC9C;AAEA,EAAM,MAAA,OAAA,GAAU,IAAI,QAAS,EAAA,CAAA;AAC7B,EAAQ,OAAA,CAAA,MAAA,CAAO,aAAa,cAAc,CAAA,CAAA;AAC1C,EAAQ,OAAA,CAAA,MAAA,CAAO,WAAW,KAAK,CAAA,CAAA;AAC/B,EAAA,OAAA,CAAQ,OAAO,WAAa,EAAA,CAAA,EAAG,qBAAqB,CAAA,aAAA,EAAgB,EAAE,CAAE,CAAA,CAAA,CAAA;AACxE,EAAQ,OAAA,CAAA,MAAA,CAAO,gBAAgB,YAAY,CAAA,CAAA;AAE3C,EAAI,IAAA;AACF,IAAA,MAAM,IAAO,GAAA,MAAM,OAA8B,CAAA,MAAA,EAAQ,eAAiB,EAAA;AAAA,MACxE,OAAS,EAAA,EAAE,cAAgB,EAAA,qBAAA,EAAuB,GAAG,OAAQ,EAAA;AAAA,MAC7D,IAAM,EAAA,OAAA;AAAA,KACP,CAAA,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA,CAAA;AAAA,WACrC,KAAO,EAAA;AACd,IAAM,MAAA,IAAA,GAAO,MAAM,sBAA6C,CAAA,KAAA,EAAO,gBAAgB,iBAAkB,CAAA,EAAE,CAAC,CAAI,CAAA,EAAA;AAAA,MAC9G,OAAA;AAAA,KACD,CAAA,CAAA;AACD,IAAA,OAAO,iCAAiC,IAAI,CAAA,CAAA;AAAA,GAC9C;AACF,CAAA;AAKA,eAAe,4BAAA,CAA6B,IAAY,OAA8D,EAAA;AACpH,EAAA,MAAM,OAAO,UAAW,EAAA,CAAA;AAExB,EAAI,IAAA,CAAC,KAAK,eAAiB,EAAA;AACzB,IAAM,MAAA,IAAI,MAAM,kEAAkE,CAAA,CAAA;AAAA,GACpF;AAGA,EAAA,OAAO,EAAC,CAAA;AACV;;;;"}