@rechargeapps/storefront-client 1.88.0 → 1.90.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 (75) hide show
  1. package/dist/cjs/api/address.js +2 -1
  2. package/dist/cjs/api/address.js.map +1 -1
  3. package/dist/cjs/api/auth.js +17 -8
  4. package/dist/cjs/api/auth.js.map +1 -1
  5. package/dist/cjs/api/bundle.js +5 -1
  6. package/dist/cjs/api/bundle.js.map +1 -1
  7. package/dist/cjs/api/bundleData.js +6 -3
  8. package/dist/cjs/api/bundleData.js.map +1 -1
  9. package/dist/cjs/api/cdn.js +2 -1
  10. package/dist/cjs/api/cdn.js.map +1 -1
  11. package/dist/cjs/api/charge.js +7 -6
  12. package/dist/cjs/api/charge.js.map +1 -1
  13. package/dist/cjs/api/credit.js +4 -2
  14. package/dist/cjs/api/credit.js.map +1 -1
  15. package/dist/cjs/api/customer.js +5 -4
  16. package/dist/cjs/api/customer.js.map +1 -1
  17. package/dist/cjs/api/customerSurveys.js +2 -1
  18. package/dist/cjs/api/customerSurveys.js.map +1 -1
  19. package/dist/cjs/api/membership.js +4 -3
  20. package/dist/cjs/api/membership.js.map +1 -1
  21. package/dist/cjs/api/order.js +2 -1
  22. package/dist/cjs/api/order.js.map +1 -1
  23. package/dist/cjs/api/subscription.js +10 -9
  24. package/dist/cjs/api/subscription.js.map +1 -1
  25. package/dist/cjs/api/tieredDiscount.js +2 -1
  26. package/dist/cjs/api/tieredDiscount.js.map +1 -1
  27. package/dist/cjs/mappers/cdn.js +6 -1
  28. package/dist/cjs/mappers/cdn.js.map +1 -1
  29. package/dist/cjs/utils/bundle.js +25 -11
  30. package/dist/cjs/utils/bundle.js.map +1 -1
  31. package/dist/cjs/utils/bundleData.js +1 -1
  32. package/dist/cjs/utils/bundleData.js.map +1 -1
  33. package/dist/cjs/utils/request.js +5 -4
  34. package/dist/cjs/utils/request.js.map +1 -1
  35. package/dist/cjs/utils/url.js +8 -0
  36. package/dist/cjs/utils/url.js.map +1 -0
  37. package/dist/esm/api/address.js +2 -1
  38. package/dist/esm/api/address.js.map +1 -1
  39. package/dist/esm/api/auth.js +17 -8
  40. package/dist/esm/api/auth.js.map +1 -1
  41. package/dist/esm/api/bundle.js +5 -1
  42. package/dist/esm/api/bundle.js.map +1 -1
  43. package/dist/esm/api/bundleData.js +6 -3
  44. package/dist/esm/api/bundleData.js.map +1 -1
  45. package/dist/esm/api/cdn.js +2 -1
  46. package/dist/esm/api/cdn.js.map +1 -1
  47. package/dist/esm/api/charge.js +7 -6
  48. package/dist/esm/api/charge.js.map +1 -1
  49. package/dist/esm/api/credit.js +4 -2
  50. package/dist/esm/api/credit.js.map +1 -1
  51. package/dist/esm/api/customer.js +5 -4
  52. package/dist/esm/api/customer.js.map +1 -1
  53. package/dist/esm/api/customerSurveys.js +2 -1
  54. package/dist/esm/api/customerSurveys.js.map +1 -1
  55. package/dist/esm/api/membership.js +4 -3
  56. package/dist/esm/api/membership.js.map +1 -1
  57. package/dist/esm/api/order.js +2 -1
  58. package/dist/esm/api/order.js.map +1 -1
  59. package/dist/esm/api/subscription.js +10 -9
  60. package/dist/esm/api/subscription.js.map +1 -1
  61. package/dist/esm/api/tieredDiscount.js +2 -1
  62. package/dist/esm/api/tieredDiscount.js.map +1 -1
  63. package/dist/esm/mappers/cdn.js +6 -1
  64. package/dist/esm/mappers/cdn.js.map +1 -1
  65. package/dist/esm/utils/bundle.js +25 -11
  66. package/dist/esm/utils/bundle.js.map +1 -1
  67. package/dist/esm/utils/bundleData.js +1 -1
  68. package/dist/esm/utils/bundleData.js.map +1 -1
  69. package/dist/esm/utils/request.js +3 -2
  70. package/dist/esm/utils/request.js.map +1 -1
  71. package/dist/esm/utils/url.js +6 -0
  72. package/dist/esm/utils/url.js.map +1 -0
  73. package/dist/index.d.ts +13 -1
  74. package/dist/umd/recharge-client.min.js +11 -11
  75. package/package.json +1 -1
@@ -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 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 }, {}),\n ranges,\n };\n return acc;\n }, {}),\n };\n } catch (error) {\n return null;\n }\n }\n\n #formatBundleData(bundleData: StorefrontBundleData) {\n try {\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 }, {}),\n };\n\n return acc;\n }, {});\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 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 invalidCollections = this.#items.filter(({ collectionId }) => !variantSettings?.optionSources[collectionId]);\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 const totalSelectedByCollection = this.#items.reduce<Record<string, number>>((acc, current) => {\n acc[current.collectionId] = current.quantity + (acc[current.collectionId] || 0);\n return acc;\n }, {});\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 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 {}\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(\n ({ externalProductId, collectionId }) => !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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,eAAA,EAAA,MAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,CAAA;AAGO,SAAS,mBAAmB,MAA8D,EAAA;AAC/F,EAAA,MAAM,IAAO,GAAA;AAAA,IACX,WAAW,GAAI,CAAA,MAAA,CAAO,WAAW,MAAO,CAAA,SAAA,CAAU,UAAU,CAAA;AAAA,IAC5D,OAAA,EAAS,OAAO,OAAW,IAAA,IAAA,CAAK,MAAM,IAAK,CAAA,GAAA,KAAQ,GAAI,CAAA;AAAA,IACvD,KAAO,EAAA,MAAA,CAAO,KAAM,CAAA,GAAA,CAAI,CAAQ,IAAA,KAAA;AAC9B,MAAO,OAAA,IAAI,IAAI,UAAW,CAAA;AAAA,QACxB,cAAc,GAAI,CAAA,MAAA,CAAO,WAAW,IAAK,CAAA,YAAA,CAAa,UAAU,CAAA;AAAA,QAChE,WAAW,GAAI,CAAA,MAAA,CAAO,WAAW,IAAK,CAAA,SAAA,CAAU,UAAU,CAAA;AAAA,QAC1D,WAAW,GAAI,CAAA,MAAA,CAAO,WAAW,IAAK,CAAA,SAAA,CAAU,UAAU,CAAA;AAAA,QAC1D,GAAA,EAAK,KAAK,GAAO,IAAA,EAAA;AAAA,QACjB,UAAU,IAAK,CAAA,QAAA;AAAA,QACf,GAAK,EAAA,IAAI,GAAI,CAAA,aAAA,CAAc,CAAC,CAAA;AAAA,OAC7B,CAAA,CAAA;AAAA,KACF,CAAA;AAAA,IACD,GAAK,EAAA,IAAI,GAAI,CAAA,SAAA,CAAU,CAAC,CAAA;AAAA,GAC1B,CAAA;AAEA,EAAA,MAAM,SAAY,GAAA,IAAI,GAAI,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AACrC,EAAA,OAAO,IAAI,cAAe,CAAA,kBAAA,CAAmB,SAAS,CAAA,CAAE,MAAM,QAAQ,CAAA,CAAA;AACxE,CAAA;AAEA,MAAM,GAAM,GAAAA,YAAA;AAAA,EACV,CAACC,IAqBK,KAAA;AACJ,IAAAA,IAAAA,CAAI,KAAK,cAAgB,EAAA;AAAA,MACvB,kBAAoB,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AACD,IAAAA,IAAI,CAAA,OAAA,CAAQ,QAAUA,EAAAA,IAAAA,CAAI,MAAM,CAAA,CAAA;AAChC,IAAAA,IAAI,CAAA,OAAA,CAAQ,QAAUA,EAAAA,IAAAA,CAAI,QAAQ,CAAA,CAAA;AAClC,IAAAA,IAAAA,CAAI,MAAM,eAAiB,EAAA;AAAA,MACzB,QAAA,EAAUA,KAAI,GAAI,EAAA;AAAA,MAClB,UAAY,EAAA,GAAA;AAAA,MACZ,UAAU,CAAC,CAAC,GAAGA,IAAI,CAAA,IAAA,EAAM,CAAC,CAAA;AAAA,MAC1B,MAAM,EAAC;AAAA,KACR,CAAA,CAAA;AACD,IAAAA,IAAAA,CAAI,OAAO,YAAc,EAAA;AAAA,MACvB,CAAC,cAAA,EAAgBA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MACrC,CAAC,WAAA,EAAaA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MAClC,CAAC,WAAA,EAAaA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MAClC,CAAC,KAAA,EAAOA,IAAI,CAAA,MAAA,EAAQ,CAAA;AAAA,MACpB,CAAC,UAAA,EAAYA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MACjC,CAAC,KAAA,EAAOA,IAAI,CAAA,MAAA,CAAO,eAAe,CAAC,CAAA;AAAA,KACpC,CAAA,CAAA;AACD,IAAAA,IAAAA,CAAI,MAAM,WAAa,EAAA;AAAA,MACrB,QAAA,EAAUA,KAAI,GAAI,EAAA;AAAA,MAClB,UAAY,EAAA,GAAA;AAAA,MACZ,UAAU,CAAC,CAAC,GAAGA,IAAI,CAAA,IAAA,EAAM,CAAC,CAAA;AAAA,MAC1B,MAAM,EAAC;AAAA,KACR,CAAA,CAAA;AACD,IAAAA,IAAAA,CAAI,OAAO,QAAU,EAAA;AAAA,MACnB,CAAC,WAAA,EAAaA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MAClC,CAAC,SAASA,IAAI,CAAA,QAAA,CAASA,KAAI,MAAO,CAAA,YAAY,CAAG,EAAA,GAAG,CAAC,CAAA;AAAA,MACrD,CAAC,SAAA,EAAWA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,MAChC,CAAC,KAAA,EAAOA,IAAI,CAAA,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,KAChC,CAAA,CAAA;AACD,IAAAA,IAAAA,CAAI,MAAM,gBAAkB,EAAA;AAAA,MAC1B,QAAA,EAAUA,IAAI,CAAA,MAAA,CAAO,cAAc,CAAA;AAAA,MACnC,UAAY,EAAA,MAAA;AAAA,MACZ,QAAU,EAAA,CAAC,CAAC,oBAAA,EAAsB,IAAI,CAAC,CAAA;AAAA,MACvC,IAAM,EAAA;AAAA,QACJ,EAAA,EAAIA,IAAI,CAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,OACzB;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAA,CAAA;AA+BO,MAAM,wBAAyB,CAAA;AAAA,EAKpC,WAAA,CAAY,gBAAwC,UAAkC,EAAA;AAMtF,IAAA,YAAA,CAAA,IAAA,EAAA,qBAAA,CAAA,CAAA;AAuCA,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAoBA,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAA;AAWA,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AAhFA,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAGE,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,EAAkB,eAAK,CAAA,IAAA,EAAA,qBAAA,EAAA,uBAAA,CAAA,CAAL,IAA2B,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA,CAAA;AAClD,IAAK,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,eAAK,CAAA,IAAA,EAAA,iBAAA,EAAA,mBAAA,CAAA,CAAL,IAAuB,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA,CAAA;AAC1C,IAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,cAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EA4EA,kBAAqB,GAAA;AACnB,IAAI,IAAA,CAAC,mBAAK,WAAa,CAAA,EAAA;AACrB,MAAM,MAAA,mDAAA,CAAA;AAAA,KACR;AAEA,IAAI,IAAA,CAAC,mBAAK,eAAiB,CAAA,EAAA;AACzB,MAAM,MAAA,qDAAA,CAAA;AAAA,KACR;AAEA,IAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,YAAA,CAAA,IAAA,EAAK,OAAM,CAAK,IAAA,CAAC,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,MAAQ,EAAA;AACtD,MAAM,MAAA,qCAAA,CAAA;AAAA,KACR;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,eAAe,iBAA2B,EAAA;AACxC,IAAA,IAAI,CAAC,YAAA,CAAA,IAAA,EAAK,eAAiB,CAAA,EAAA,gBAAA,CAAiB,iBAAiB,CAAG,EAAA;AAC9D,MAAA,MAAM,OAAO,iBAAiB,CAAA,2BAAA,CAAA,CAAA;AAAA,KAChC;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,0BAA0B,iBAA2B,EAAA;AACnD,IAAM,MAAA,KAAA,GAAQ,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,MAAO,CAAA,CAAC,KAAK,OAAY,KAAA,GAAA,GAAM,OAAQ,CAAA,QAAA,EAAU,CAAC,CAAA,CAAA;AAC5E,IAAA,MAAM,SAAS,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,EAAiB,iBAAiB,iBAAiB,CAAA,CAAE,UAAU,EAAC,CAAA;AAEpF,IAAA,IAAI,CAAC,eAAA,CAAA,IAAA,EAAK,eAAL,EAAA,iBAAA,CAAA,CAAA,IAAA,CAAA,IAAA,EAAqB,QAAQ,KAAQ,CAAA,EAAA;AACxC,MAAM,MAAA,+EAAA,CAAA;AAAA,KACR;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,yBAA4B,GAAA;AAC1B,IAAA,MAAM,UAAa,GAAA,YAAA,CAAA,IAAA,EAAK,eAAiB,CAAA,EAAA,cAAA,CAAe,UAAc,IAAA,CAAA,CAAA;AACtE,IAAM,MAAA,eAAA,GAAkB,mBAAK,MAAO,CAAA,CAAA,MAAA,CAAO,CAAC,EAAE,QAAA,EAAe,KAAA,QAAA,GAAW,UAAU,CAAA,CAAA;AAElF,IAAI,IAAA,UAAA,IAAc,gBAAgB,MAAQ,EAAA;AACxC,MAAA,MAAM,UAAa,GAAA,eAAA,CAAA,IAAA,EAAK,OAAL,EAAA,SAAA,CAAA,CAAA,IAAA,CAAA,IAAA,EAAa,eAAgB,CAAA,GAAA,CAAI,CAAC,EAAE,iBAAkB,EAAA,KAAM,iBAAiB,CAAA,CAAA,CAAG,KAAK,IAAI,CAAA,CAAA;AAC5G,MAAM,MAAA,CAAA,uBAAA,EAA0B,UAAU,CAAA,8BAAA,EAAiC,UAAU,CAAA,mBAAA,CAAA,CAAA;AAAA,KACvF;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,4BAA4B,iBAA2B,EAAA;AACrD,IAAA,MAAM,eAAkB,GAAA,YAAA,CAAA,IAAA,EAAK,eAAiB,CAAA,EAAA,gBAAA,CAAiB,iBAAiB,CAAA,CAAA;AAChF,IAAA,MAAM,kBAAqB,GAAA,YAAA,CAAA,IAAA,EAAK,MAAO,CAAA,CAAA,MAAA,CAAO,CAAC,EAAE,YAAa,EAAA,KAAM,CAAC,eAAA,EAAiB,aAAc,CAAA,YAAY,CAAC,CAAA,CAAA;AACjH,IAAA,IAAI,mBAAmB,MAAQ,EAAA;AAC7B,MAAA,MAAM,UAAa,GAAA,eAAA,CAAA,IAAA,EAAK,OAAL,EAAA,SAAA,CAAA,CAAA,IAAA,CAAA,IAAA,EAAa,kBAAmB,CAAA,GAAA,CAAI,CAAC,EAAE,YAAa,EAAA,KAAM,YAAY,CAAA,CAAA,CAAG,KAAK,IAAI,CAAA,CAAA;AACrG,MAAM,MAAA,CAAA,iBAAA,EAAoB,UAAU,CAAA,8CAAA,EAAiD,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAAA,KACxG;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,wCAAwC,iBAA2B,EAAA;AACjE,IAAA,MAAM,4BAA4B,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,MAA+B,CAAA,CAAC,KAAK,OAAY,KAAA;AAC7F,MAAI,GAAA,CAAA,OAAA,CAAQ,YAAY,CAAI,GAAA,OAAA,CAAQ,YAAY,GAAI,CAAA,OAAA,CAAQ,YAAY,CAAK,IAAA,CAAA,CAAA,CAAA;AAC7E,MAAO,OAAA,GAAA,CAAA;AAAA,KACT,EAAG,EAAE,CAAA,CAAA;AAEL,IAAA,MAAM,eAAkB,GAAA,YAAA,CAAA,IAAA,EAAK,eAAiB,CAAA,EAAA,gBAAA,CAAiB,iBAAiB,CAAA,CAAA;AAChF,IAAM,MAAA,YAAA,GAAe,OAAO,MAAO,CAAA,eAAA,EAAiB,iBAAiB,EAAE,CAAE,CAAA,MAAA,CAAO,CAAc,UAAA,KAAA;AAC5F,MAAA,MAAM,QAAW,GAAA,yBAAA,CAA0B,UAAW,CAAA,YAAY,CAAK,IAAA,CAAA,CAAA;AACvE,MAAA,OAAO,CAAC,eAAK,CAAA,IAAA,EAAA,eAAA,EAAA,iBAAA,CAAA,CAAL,IAAqB,CAAA,IAAA,EAAA,CAAC,UAAU,CAAG,EAAA,QAAA,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AAED,IAAI,IAAA,CAAC,eAAmB,IAAA,YAAA,CAAa,MAAQ,EAAA;AAC3C,MAAA,MAAM,UAAa,GAAA,eAAA,CAAA,IAAA,EAAK,OAAL,EAAA,SAAA,CAAA,CAAA,IAAA,CAAA,IAAA,EAAa,YAAa,CAAA,GAAA,CAAI,CAAC,EAAE,YAAa,EAAA,KAAM,YAAY,CAAA,CAAA,CAAG,KAAK,IAAI,CAAA,CAAA;AAC/F,MAAA,MAAM,yDAAyD,UAAU,CAAA,EAAA,CAAA,CAAA;AAAA,KAC3E;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,yBAAyB,iBAA2B,EAAA;AAClD,IAAA,MAAM,2BAA2B,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,EAAiB,iBAAiB,iBAAiB,CAAA,EAAG,iBAAiB,EAAC,CAAA;AAC9G,IAAA,MAAM,kBAAqB,GAAA,MAAA,CAAO,MAAO,CAAA,wBAAwB,CAAE,CAAA,MAAA;AAAA,MACjE,CAAC,KAAK,YAAiB,KAAA;AACrB,QAAA,MAAM,UAAa,GAAA,YAAA,CAAA,IAAA,EAAK,WAAa,CAAA,EAAA,WAAA,CAAY,aAAa,YAAY,CAAA,CAAA;AAC1E,QAAA,IAAI,UAAY,EAAA;AACd,UAAI,GAAA,CAAA,YAAA,CAAa,YAAY,CAAI,GAAA,UAAA,CAAA;AAAA,SACnC;AACA,QAAO,OAAA,GAAA,CAAA;AAAA,OACT;AAAA,MACA,EAAC;AAAA,KACH,CAAA;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,MAAO,CAAA,kBAAkB,EAAE,MAAQ,EAAA;AAC7C,MAAA,MAAM,gDAAgD,iBAAiB,CAAA,EAAA,CAAA,CAAA;AAAA,KACzE;AAEA,IAAM,MAAA,eAAA,GAAkB,mBAAK,MAAO,CAAA,CAAA,MAAA;AAAA,MAClC,CAAC,EAAE,iBAAA,EAAmB,YAAa,EAAA,KAAM,CAAC,kBAAmB,CAAA,YAAY,CAAG,EAAA,QAAA,CAAS,iBAAiB,CAAA;AAAA,KACxG,CAAA;AAEA,IAAA,IAAI,gBAAgB,MAAQ,EAAA;AAC1B,MAAA,MAAM,UAAa,GAAA,eAAA,CAAA,IAAA,EAAK,OAAL,EAAA,SAAA,CAAA,CAAA,IAAA,CAAA,IAAA,EAAa,eAAgB,CAAA,GAAA,CAAI,CAAC,EAAE,iBAAkB,EAAA,KAAM,iBAAiB,CAAA,CAAA,CAAG,KAAK,IAAI,CAAA,CAAA;AAC5G,MAAA,MAAM,iBAAiB,UAAU,CAAA,6CAAA,CAAA,CAAA;AAAA,KACnC;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,uBAAuB,iBAA2B,EAAA;AAChD,IAAA,IAAA,CAAK,kBAAmB,EAAA,CAAA;AACxB,IAAA,IAAA,CAAK,eAAe,iBAAiB,CAAA,CAAA;AACrC,IAAA,IAAA,CAAK,0BAA0B,iBAAiB,CAAA,CAAA;AAChD,IAAA,IAAA,CAAK,yBAA0B,EAAA,CAAA;AAC/B,IAAA,IAAA,CAAK,4BAA4B,iBAAiB,CAAA,CAAA;AAClD,IAAA,IAAA,CAAK,wCAAwC,iBAAiB,CAAA,CAAA;AAC9D,IAAA,IAAA,CAAK,yBAAyB,iBAAiB,CAAA,CAAA;AAE/C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,CAAA;AA1ME,eAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,MAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAQA,qBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,uBAAA,GAAqB,SAAC,UAAkC,EAAA;AACtD,EAAI,IAAA;AACF,IAAA,MAAM,iBAAiB,UAAW,CAAA,eAAA,CAAA;AAClC,IAAO,OAAA;AAAA,MACL,cAAgB,EAAA;AAAA,QACd,YAAY,cAAe,CAAA,wBAAA;AAAA,QAC3B,gBAAgB,cAAe,CAAA,eAAA;AAAA,OACjC;AAAA,MACA,kBAAkB,cAAe,CAAA,QAAA,CAAS,MAA2C,CAAA,CAAC,KAAK,OAAY,KAAA;AACrG,QAAA,IAAI,CAAC,OAAQ,CAAA,OAAA;AAAS,UAAO,OAAA,GAAA,CAAA;AAE7B,QAAI,IAAA,MAAA,GAAoC,CAAC,EAAE,GAAA,EAAK,QAAQ,WAAa,EAAA,GAAA,EAAK,OAAQ,CAAA,WAAA,EAAa,CAAA,CAAA;AAC/F,QAAI,IAAA,CAAC,QAAQ,WAAa,EAAA;AACxB,UAAA,MAAA,GAAS,QAAQ,MAAO,CAAA,GAAA,CAAI,CAAC,EAAE,YAAA,EAAc,cAAoB,MAAA;AAAA,YAC/D,GAAK,EAAA,YAAA;AAAA,YACL,GAAK,EAAA,YAAA;AAAA,WACL,CAAA,CAAA,CAAA;AAAA,SACJ;AAEA,QAAI,GAAA,CAAA,OAAA,CAAQ,mBAAmB,CAAI,GAAA;AAAA,UACjC,mBAAmB,OAAQ,CAAA,mBAAA;AAAA,UAC3B,eAAe,OAAQ,CAAA,cAAA,CAAe,MAAyC,CAAA,CAACC,MAAK,YAAiB,KAAA;AACpG,YAAAA,IAAAA,CAAI,YAAa,CAAA,gBAAgB,CAAI,GAAA;AAAA,cACnC,KAAK,YAAa,CAAA,YAAA;AAAA,cAClB,KAAK,YAAa,CAAA,YAAA;AAAA,cAClB,cAAc,YAAa,CAAA,gBAAA;AAAA,aAC7B,CAAA;AACA,YAAOA,OAAAA,IAAAA,CAAAA;AAAA,WACT,EAAG,EAAE,CAAA;AAAA,UACL,MAAA;AAAA,SACF,CAAA;AACA,QAAO,OAAA,GAAA,CAAA;AAAA,OACT,EAAG,EAAE,CAAA;AAAA,KACP,CAAA;AAAA,WACO,KAAO,EAAA;AACd,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,iBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,mBAAA,GAAiB,SAAC,UAAkC,EAAA;AAClD,EAAI,IAAA;AACF,IAAM,MAAA,WAAA,GAAc,OAAO,MAAO,CAAA,UAAA,CAAW,WAAW,CAAE,CAAA,MAAA,CAAkC,CAAC,GAAA,EAAK,OAAY,KAAA;AAC5G,MAAI,GAAA,CAAA,OAAA,CAAQ,EAAE,CAAI,GAAA;AAAA,QAChB,GAAG,OAAA;AAAA,QACH,UAAU,OAAQ,CAAA,QAAA,CAAS,MAAsD,CAAA,CAAC,YAAY,OAAY,KAAA;AACxG,UAAW,UAAA,CAAA,OAAA,CAAQ,EAAE,CAAI,GAAA,OAAA,CAAA;AACzB,UAAO,OAAA,UAAA,CAAA;AAAA,SACT,EAAG,EAAE,CAAA;AAAA,OACP,CAAA;AAEA,MAAO,OAAA,GAAA,CAAA;AAAA,KACT,EAAG,EAAE,CAAA,CAAA;AAEL,IAAO,OAAA,EAAE,GAAG,UAAA,EAAY,WAAY,EAAA,CAAA;AAAA,WAC7B,KAAO,EAAA;AACd,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,eAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,iBAAe,GAAA,SAAC,QAAsD,KAAe,EAAA;AACnF,EAAA,MAAM,gBAAgB,MAAO,CAAA,MAAA,CAAO,CAAC,EAAE,GAAA,EAAK,KAAU,KAAA;AACpD,IAAA,MAAM,WAAW,GAAO,IAAA,KAAA,CAAA;AACxB,IAAA,MAAM,WAAW,GAAO,IAAA,KAAA,CAAA;AAExB,IAAO,OAAA,QAAA,IAAY,SAAS,KAAS,IAAA,QAAA,CAAA;AAAA,GACtC,CAAA,CAAA;AAED,EAAO,OAAA,CAAC,CAAC,aAAc,CAAA,MAAA,CAAA;AACzB,CAAA,CAAA;AAEA,OAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAAA,SAAA,GAAO,SAAC,GAAe,EAAA;AACrB,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,GAAG,CAAC,CAAA,CAAA;AAChC,CAAA;;;;;"}
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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"}
@@ -4,7 +4,7 @@ const mapBundleSettings = (bundleSettings) => {
4
4
  const addons = bundleSettings.layout_settings.addons;
5
5
  const crossSells = bundleSettings.layout_settings.crossSells;
6
6
  const customizationWindow = bundleSettings.customization_window;
7
- const defaultVariantId = bundleSettings.default_bundle_variant_id;
7
+ const defaultVariantId = bundleSettings.layout_settings?.defaultVariantId ?? bundleSettings.default_bundle_variant_id;
8
8
  const defaultFrequency = bundleSettings.layout_settings.defaultFrequency;
9
9
  const addToCartBehavior = bundleSettings.layout_settings.addToCartCallback;
10
10
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"bundleData.js","sources":["../../../src/utils/bundleData.ts"],"sourcesContent":["import { PublicBundleData, PriceRule } from '../types/bundleData';\nimport { BaseProduct, BaseProductVariant, BundleData as StorefrontBundleData } from '../types/bundle';\n\nconst mapBundleSettings = (bundleSettings: StorefrontBundleData['bundle_settings']) => {\n const addons = bundleSettings.layout_settings.addons;\n const crossSells = bundleSettings.layout_settings.crossSells;\n const customizationWindow = bundleSettings.customization_window;\n const defaultVariantId = bundleSettings.default_bundle_variant_id;\n const defaultFrequency = bundleSettings.layout_settings.defaultFrequency;\n const addToCartBehavior = bundleSettings.layout_settings.addToCartCallback;\n\n return {\n default_variant_id: defaultVariantId ? String(defaultVariantId) : null,\n is_customizable: bundleSettings.is_customizable,\n price_rule: String(bundleSettings.price_rule).toUpperCase(),\n customization_window: customizationWindow\n ? {\n active_days: customizationWindow,\n disabled_message: bundleSettings.customization_window_disabled_message || '',\n }\n : null,\n addons: addons.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n cross_sells: crossSells.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n default_selling_plan_id: defaultFrequency || null,\n collapsible_collections: bundleSettings.layout_settings.collapsibleSections,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n show_product_variants: bundleSettings.layout_settings.showVariants,\n product_details_modal_enabled: bundleSettings.layout_settings.learnMoreModal,\n addToCartBehavior: {\n type: addToCartBehavior.type === 'none' ? ('cart_page' as const) : addToCartBehavior.type,\n value: addToCartBehavior.value,\n },\n };\n};\n\nconst mapIncentives = (incentives: StorefrontBundleData['incentives']): PublicBundleData['incentives'] => {\n if (incentives.tiered_discounts.length === 0) return null;\n\n return {\n tiered_discounts: incentives.tiered_discounts,\n };\n};\n\nconst mapSellingPlan = (\n sellingPlan: StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]\n): PublicBundleData['selling_plan_groups'][number]['selling_plans'][number] => ({\n id: sellingPlan.id,\n name: sellingPlan.name,\n options: sellingPlan.options.map(option => ({ name: option.name, value: option.value })),\n recurring_deliveries: sellingPlan.recurring_deliveries,\n price_adjustments: sellingPlan.price_adjustments.map(({ value, value_type }) => ({\n value,\n value_type,\n })),\n});\n\nconst mapSellingPlanGroups = (\n sellingPlanGroup: StorefrontBundleData['selling_plan_groups'][number]\n): PublicBundleData['selling_plan_groups'][number] => ({\n name: sellingPlanGroup.name,\n options: sellingPlanGroup.options.map(option => ({ name: option.name, values: option.values })),\n selling_plans: sellingPlanGroup.selling_plans.map(mapSellingPlan),\n});\n\nconst mapBasicVariant = (variant: BaseProductVariant) => ({\n id: String(variant.id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n options: variant.options,\n available_for_sale: variant.available,\n});\n\nconst formatFeaturedImage = (featuredImage: BaseProduct['featured_image']): string | null => {\n if (featuredImage == null || typeof featuredImage === 'string') return featuredImage;\n\n if ('src' in featuredImage) return featuredImage['src'];\n\n return null;\n};\n\nconst mapBasicProduct = (product: BaseProduct) => {\n return {\n id: String(product.id),\n title: product.title,\n description: product.description,\n available_for_sale: product.available,\n featured_image: formatFeaturedImage(product.featured_image),\n images: product.images,\n requires_selling_plan: product.requires_selling_plan,\n selling_plan_groups: product.selling_plan_groups.map(mapSellingPlanGroups),\n };\n};\n\nconst mapProduct = (product: StorefrontBundleData['collections'][number]['products'][number]) => {\n const productPlansLookup = productSellingPlansGroupLookup(product.selling_plan_groups);\n\n return {\n ...mapBasicProduct(product),\n handle: product.handle,\n tags: product.tags,\n price_range: { min: product.price_min, max: product.price_max },\n compare_at_price_range: { min: product.compare_at_price_min, max: product.compare_at_price_max },\n options: product.options,\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(\n productPlansLookup[`${sellingPlan.selling_plan_group_id}-${sellingPlan.selling_plan_id}`]\n ),\n })),\n option1: variant.option1,\n option2: variant.option2,\n option3: variant.option3,\n sku: variant.sku || '',\n requires_shipping: variant.requires_shipping,\n taxable: variant.taxable,\n featured_image: formatFeaturedImage(variant.featured_image),\n public_title: variant.public_title,\n requires_selling_plan: variant.requires_selling_plan,\n })),\n };\n};\n\nconst mapBundleVariantRanges = ({\n items_count,\n ranges,\n}: Pick<StorefrontBundleData['bundle_settings']['variants'][number], 'items_count' | 'ranges'>) => {\n if (ranges.length > 0) {\n return ranges.map(({ quantity_max, quantity_min }) => ({ min: quantity_min, max: quantity_max }));\n }\n\n return [{ min: items_count, max: items_count }];\n};\n\nconst productSellingPlansGroupLookup = (sellingPlanGroups: BaseProduct['selling_plan_groups']) =>\n sellingPlanGroups.reduce<\n Record<string, StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]>\n >((acc, current) => {\n current.selling_plans.forEach(sellingPlan => {\n const key = `${current.id}-${sellingPlan.id}`;\n acc[key] = sellingPlan;\n });\n\n return acc;\n }, {});\n\nconst mapFilters = (filters: StorefrontBundleData['filters']): PublicBundleData['filters'] => {\n if (!Array.isArray(filters)) return [];\n return filters;\n};\n\nexport function mapOnlineStoreToPublicBundleData(bundleData: StorefrontBundleData): PublicBundleData {\n const bundleSettings = mapBundleSettings(bundleData.bundle_settings);\n const variantsLookup = bundleData.variants.reduce<Record<string, StorefrontBundleData['variants'][number]>>(\n (acc, variant) => {\n acc[variant.id] = variant;\n return acc;\n },\n {}\n );\n\n return {\n id: String(bundleData.id),\n title: bundleData.title,\n description: bundleData.description || null,\n handle: bundleData.handle,\n options: bundleData.options.map(option => ({\n name: option.name,\n position: option.position,\n values: option.values,\n })),\n default_variant_id: bundleSettings.default_variant_id,\n default_selling_plan_id: bundleSettings.default_selling_plan_id\n ? Number(bundleSettings.default_selling_plan_id)\n : null,\n available_for_sale: bundleData.available,\n requires_selling_plan: bundleData.requires_selling_plan,\n bundle_settings: {\n is_customizable: bundleSettings.is_customizable,\n price_rule: bundleSettings.price_rule as PriceRule,\n customization_window: bundleSettings.customization_window,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n collapsible_collections: bundleSettings.collapsible_collections,\n show_product_variants: bundleSettings.show_product_variants,\n product_details_modal_enabled: bundleSettings.product_details_modal_enabled,\n show_variants_as_individual_products:\n bundleData.bundle_settings.settings.display_variants_as_separate_products_in_list,\n post_add_to_cart_behavior: bundleSettings.addToCartBehavior,\n },\n variants: bundleData.bundle_settings.variants\n .filter(({ enabled }) => enabled)\n .map((item, index) => {\n const variant = variantsLookup[String(item.external_variant_id)];\n\n return {\n id: String(item.external_variant_id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n image: variant.image || '',\n available_for_sale: variant.available,\n options: variant.options,\n requires_selling_plan: variant.requires_selling_plan,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n ranges: mapBundleVariantRanges(item),\n collections: item.option_sources.map(source => ({\n id: source.option_source_id,\n source_platform: 'shopify',\n min: source.quantity_min || 0,\n max: source.quantity_max,\n position: source.position,\n })),\n default_selections: item.selection_defaults.map(selectionDefault => ({\n quantity: selectionDefault.quantity,\n product: {\n id: String(selectionDefault.product.id),\n handle: selectionDefault.handle,\n title: selectionDefault.product.title,\n description: selectionDefault.product.description,\n images: selectionDefault.product.images,\n },\n variant: {\n id: selectionDefault.external_variant_id,\n title: selectionDefault.variant.title,\n featured_image: formatFeaturedImage(selectionDefault.variant.featured_image),\n sku: selectionDefault.sku || '',\n },\n })),\n position: index,\n };\n }),\n selling_plan_groups: bundleData.selling_plan_groups.map(mapSellingPlanGroups),\n collections: Object.values(bundleData.collections).reduce<PublicBundleData['collections']>((acc, current) => {\n if (!Array.isArray(current.products)) {\n /* If a collection is not published in Online store, it is included \n as _1:{ handle: \"<collection-handle\"} in the collections object.\n We need to skip these collections.\n */\n return acc;\n }\n\n acc[String(current.id)] = {\n id: String(current.id),\n title: current.title,\n handle: current.handle,\n products: current.products.map(mapProduct),\n };\n\n return acc;\n }, {}),\n addons: bundleData.addons.products.length\n ? {\n collection_id: bundleSettings.addons?.collection_id || '',\n collection_handle: bundleSettings.addons?.collection_handle || '',\n products: bundleData.addons.products.map(product => ({\n ...mapBasicProduct(product),\n price_range: { min: product.price, max: product.price },\n compare_at_price_range: { min: product.compare_at_price || 0, max: product.compare_at_price },\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n image: variant.image,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n })),\n })),\n }\n : null,\n cross_sells: bundleData.cross_sells.products.length\n ? {\n collection_id: bundleSettings.cross_sells?.collection_id || '',\n collection_handle: bundleSettings.cross_sells?.collection_handle || '',\n products: bundleData.cross_sells.products.map(mapProduct),\n }\n : null,\n incentives: mapIncentives(bundleData.incentives),\n filters: mapFilters(bundleData.filters),\n templates: bundleData.bundle_settings.layout_settings.templates || null,\n globalStyles: bundleData.bundle_settings.layout_settings.globalStyles || null,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundleData.js","sources":["../../../src/utils/bundleData.ts"],"sourcesContent":["import { PublicBundleData, PriceRule } from '../types/bundleData';\nimport { BaseProduct, BaseProductVariant, BundleData as StorefrontBundleData } from '../types/bundle';\n\nconst mapBundleSettings = (bundleSettings: StorefrontBundleData['bundle_settings']) => {\n const addons = bundleSettings.layout_settings.addons;\n const crossSells = bundleSettings.layout_settings.crossSells;\n const customizationWindow = bundleSettings.customization_window;\n const defaultVariantId = bundleSettings.layout_settings?.defaultVariantId ?? bundleSettings.default_bundle_variant_id;\n const defaultFrequency = bundleSettings.layout_settings.defaultFrequency;\n const addToCartBehavior = bundleSettings.layout_settings.addToCartCallback;\n\n return {\n default_variant_id: defaultVariantId ? String(defaultVariantId) : null,\n is_customizable: bundleSettings.is_customizable,\n price_rule: String(bundleSettings.price_rule).toUpperCase(),\n customization_window: customizationWindow\n ? {\n active_days: customizationWindow,\n disabled_message: bundleSettings.customization_window_disabled_message || '',\n }\n : null,\n addons: addons.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n cross_sells: crossSells.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n default_selling_plan_id: defaultFrequency || null,\n collapsible_collections: bundleSettings.layout_settings.collapsibleSections,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n show_product_variants: bundleSettings.layout_settings.showVariants,\n product_details_modal_enabled: bundleSettings.layout_settings.learnMoreModal,\n addToCartBehavior: {\n type: addToCartBehavior.type === 'none' ? ('cart_page' as const) : addToCartBehavior.type,\n value: addToCartBehavior.value,\n },\n };\n};\n\nconst mapIncentives = (incentives: StorefrontBundleData['incentives']): PublicBundleData['incentives'] => {\n if (incentives.tiered_discounts.length === 0) return null;\n\n return {\n tiered_discounts: incentives.tiered_discounts,\n };\n};\n\nconst mapSellingPlan = (\n sellingPlan: StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]\n): PublicBundleData['selling_plan_groups'][number]['selling_plans'][number] => ({\n id: sellingPlan.id,\n name: sellingPlan.name,\n options: sellingPlan.options.map(option => ({ name: option.name, value: option.value })),\n recurring_deliveries: sellingPlan.recurring_deliveries,\n price_adjustments: sellingPlan.price_adjustments.map(({ value, value_type }) => ({\n value,\n value_type,\n })),\n});\n\nconst mapSellingPlanGroups = (\n sellingPlanGroup: StorefrontBundleData['selling_plan_groups'][number]\n): PublicBundleData['selling_plan_groups'][number] => ({\n name: sellingPlanGroup.name,\n options: sellingPlanGroup.options.map(option => ({ name: option.name, values: option.values })),\n selling_plans: sellingPlanGroup.selling_plans.map(mapSellingPlan),\n});\n\nconst mapBasicVariant = (variant: BaseProductVariant) => ({\n id: String(variant.id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n options: variant.options,\n available_for_sale: variant.available,\n});\n\nconst formatFeaturedImage = (featuredImage: BaseProduct['featured_image']): string | null => {\n if (featuredImage == null || typeof featuredImage === 'string') return featuredImage;\n\n if ('src' in featuredImage) return featuredImage['src'];\n\n return null;\n};\n\nconst mapBasicProduct = (product: BaseProduct) => {\n return {\n id: String(product.id),\n title: product.title,\n description: product.description,\n available_for_sale: product.available,\n featured_image: formatFeaturedImage(product.featured_image),\n images: product.images,\n requires_selling_plan: product.requires_selling_plan,\n selling_plan_groups: product.selling_plan_groups.map(mapSellingPlanGroups),\n };\n};\n\nconst mapProduct = (product: StorefrontBundleData['collections'][number]['products'][number]) => {\n const productPlansLookup = productSellingPlansGroupLookup(product.selling_plan_groups);\n\n return {\n ...mapBasicProduct(product),\n handle: product.handle,\n tags: product.tags,\n price_range: { min: product.price_min, max: product.price_max },\n compare_at_price_range: { min: product.compare_at_price_min, max: product.compare_at_price_max },\n options: product.options,\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(\n productPlansLookup[`${sellingPlan.selling_plan_group_id}-${sellingPlan.selling_plan_id}`]\n ),\n })),\n option1: variant.option1,\n option2: variant.option2,\n option3: variant.option3,\n sku: variant.sku || '',\n requires_shipping: variant.requires_shipping,\n taxable: variant.taxable,\n featured_image: formatFeaturedImage(variant.featured_image),\n public_title: variant.public_title,\n requires_selling_plan: variant.requires_selling_plan,\n })),\n };\n};\n\nconst mapBundleVariantRanges = ({\n items_count,\n ranges,\n}: Pick<StorefrontBundleData['bundle_settings']['variants'][number], 'items_count' | 'ranges'>) => {\n if (ranges.length > 0) {\n return ranges.map(({ quantity_max, quantity_min }) => ({ min: quantity_min, max: quantity_max }));\n }\n\n return [{ min: items_count, max: items_count }];\n};\n\nconst productSellingPlansGroupLookup = (sellingPlanGroups: BaseProduct['selling_plan_groups']) =>\n sellingPlanGroups.reduce<\n Record<string, StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]>\n >((acc, current) => {\n current.selling_plans.forEach(sellingPlan => {\n const key = `${current.id}-${sellingPlan.id}`;\n acc[key] = sellingPlan;\n });\n\n return acc;\n }, {});\n\nconst mapFilters = (filters: StorefrontBundleData['filters']): PublicBundleData['filters'] => {\n if (!Array.isArray(filters)) return [];\n return filters;\n};\n\nexport function mapOnlineStoreToPublicBundleData(bundleData: StorefrontBundleData): PublicBundleData {\n const bundleSettings = mapBundleSettings(bundleData.bundle_settings);\n const variantsLookup = bundleData.variants.reduce<Record<string, StorefrontBundleData['variants'][number]>>(\n (acc, variant) => {\n acc[variant.id] = variant;\n return acc;\n },\n {}\n );\n\n return {\n id: String(bundleData.id),\n title: bundleData.title,\n description: bundleData.description || null,\n handle: bundleData.handle,\n options: bundleData.options.map(option => ({\n name: option.name,\n position: option.position,\n values: option.values,\n })),\n default_variant_id: bundleSettings.default_variant_id,\n default_selling_plan_id: bundleSettings.default_selling_plan_id\n ? Number(bundleSettings.default_selling_plan_id)\n : null,\n available_for_sale: bundleData.available,\n requires_selling_plan: bundleData.requires_selling_plan,\n bundle_settings: {\n is_customizable: bundleSettings.is_customizable,\n price_rule: bundleSettings.price_rule as PriceRule,\n customization_window: bundleSettings.customization_window,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n collapsible_collections: bundleSettings.collapsible_collections,\n show_product_variants: bundleSettings.show_product_variants,\n product_details_modal_enabled: bundleSettings.product_details_modal_enabled,\n show_variants_as_individual_products:\n bundleData.bundle_settings.settings.display_variants_as_separate_products_in_list,\n post_add_to_cart_behavior: bundleSettings.addToCartBehavior,\n },\n variants: bundleData.bundle_settings.variants\n .filter(({ enabled }) => enabled)\n .map((item, index) => {\n const variant = variantsLookup[String(item.external_variant_id)];\n\n return {\n id: String(item.external_variant_id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n image: variant.image || '',\n available_for_sale: variant.available,\n options: variant.options,\n requires_selling_plan: variant.requires_selling_plan,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n ranges: mapBundleVariantRanges(item),\n collections: item.option_sources.map(source => ({\n id: source.option_source_id,\n source_platform: 'shopify',\n min: source.quantity_min || 0,\n max: source.quantity_max,\n position: source.position,\n })),\n default_selections: item.selection_defaults.map(selectionDefault => ({\n quantity: selectionDefault.quantity,\n product: {\n id: String(selectionDefault.product.id),\n handle: selectionDefault.handle,\n title: selectionDefault.product.title,\n description: selectionDefault.product.description,\n images: selectionDefault.product.images,\n },\n variant: {\n id: selectionDefault.external_variant_id,\n title: selectionDefault.variant.title,\n featured_image: formatFeaturedImage(selectionDefault.variant.featured_image),\n sku: selectionDefault.sku || '',\n },\n })),\n position: index,\n };\n }),\n selling_plan_groups: bundleData.selling_plan_groups.map(mapSellingPlanGroups),\n collections: Object.values(bundleData.collections).reduce<PublicBundleData['collections']>((acc, current) => {\n if (!Array.isArray(current.products)) {\n /* If a collection is not published in Online store, it is included \n as _1:{ handle: \"<collection-handle\"} in the collections object.\n We need to skip these collections.\n */\n return acc;\n }\n\n acc[String(current.id)] = {\n id: String(current.id),\n title: current.title,\n handle: current.handle,\n products: current.products.map(mapProduct),\n };\n\n return acc;\n }, {}),\n addons: bundleData.addons.products.length\n ? {\n collection_id: bundleSettings.addons?.collection_id || '',\n collection_handle: bundleSettings.addons?.collection_handle || '',\n products: bundleData.addons.products.map(product => ({\n ...mapBasicProduct(product),\n price_range: { min: product.price, max: product.price },\n compare_at_price_range: { min: product.compare_at_price || 0, max: product.compare_at_price },\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n image: variant.image,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n })),\n })),\n }\n : null,\n cross_sells: bundleData.cross_sells.products.length\n ? {\n collection_id: bundleSettings.cross_sells?.collection_id || '',\n collection_handle: bundleSettings.cross_sells?.collection_handle || '',\n products: bundleData.cross_sells.products.map(mapProduct),\n }\n : null,\n incentives: mapIncentives(bundleData.incentives),\n filters: mapFilters(bundleData.filters),\n templates: bundleData.bundle_settings.layout_settings.templates || null,\n globalStyles: bundleData.bundle_settings.layout_settings.globalStyles || null,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ var stringify = require('qs/lib/stringify');
6
6
  var options = require('./options.js');
7
7
  var api = require('../constants/api.js');
8
8
  var error = require('./error.js');
9
+ var url = require('./url.js');
9
10
 
10
11
  function stringifyQuery(str) {
11
12
  return stringify(str, {
@@ -50,7 +51,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
50
51
  "X-Recharge-Sdk-Fn": session.internalFnCall,
51
52
  ...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
52
53
  ...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
53
- "X-Recharge-Sdk-Version": "1.88.0",
54
+ "X-Recharge-Sdk-Version": "1.90.0",
54
55
  "X-Request-Id": session.internalRequestId,
55
56
  ...session.tmp_fn_identifier ? { "X-Recharge-Sdk-Fn-Identifier": session.tmp_fn_identifier } : {},
56
57
  ...headers ? headers : {}
@@ -101,10 +102,10 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
101
102
  async function shopifyAppProxyRequest(method, url, requestOptions = {}) {
102
103
  return request(method, `${api.SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);
103
104
  }
104
- async function request(method, url, { id, query, data, headers } = {}) {
105
- let reqUrl = url.trim();
105
+ async function request(method, url$1, { id, query, data, headers } = {}) {
106
+ let reqUrl = url$1.trim();
106
107
  if (id) {
107
- reqUrl = [reqUrl, `${id}`.trim()].join("/");
108
+ reqUrl = [reqUrl, url.encodePathSegment(id)].join("/");
108
109
  }
109
110
  if (query) {
110
111
  let exQuery;
@@ -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';\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 reqUrl = [reqUrl, `${id}`.trim()].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"],"mappings":"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"}
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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"}
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ function encodePathSegment(value) {
4
+ return encodeURIComponent(`${value}`.trim());
5
+ }
6
+
7
+ exports.encodePathSegment = encodePathSegment;
8
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sources":["../../../src/utils/url.ts"],"sourcesContent":["/**\n * Encode a value as a single opaque URL path segment.\n *\n * Resource identifiers interpolated into a request URL must never be able to\n * change the route: without encoding, an id containing `../` or `?` can\n * traverse to a different endpoint or smuggle query parameters (H1-3884884 /\n * SEC-4002). Use this for every caller- or session-supplied path segment.\n *\n * Kept in its own module (not `request.ts`) so it stays available to callers\n * even when tests mock the request module.\n */\nexport function encodePathSegment(value: string | number): string {\n return encodeURIComponent(`${value}`.trim());\n}\n"],"names":[],"mappings":";;AAWO,SAAS,kBAAkB,KAAgC,EAAA;AAChE,EAAA,OAAO,kBAAmB,CAAA,CAAA,EAAG,KAAK,CAAA,CAAA,CAAG,MAAM,CAAA,CAAA;AAC7C;;;;"}
@@ -1,4 +1,5 @@
1
1
  import { rechargeApiRequest, getInternalSession } from '../utils/request.js';
2
+ import { encodePathSegment } from '../utils/url.js';
2
3
 
3
4
  function listAddresses(session, query) {
4
5
  return rechargeApiRequest(
@@ -83,7 +84,7 @@ async function skipFutureCharge(session, id, skipRequest) {
83
84
  }
84
85
  const { charge } = await rechargeApiRequest(
85
86
  "post",
86
- `/addresses/${id}/charges/skip`,
87
+ `/addresses/${encodePathSegment(id)}/charges/skip`,
87
88
  {
88
89
  data: skipRequest
89
90
  },
@@ -1 +1 @@
1
- {"version":3,"file":"address.js","sources":["../../../src/api/address.ts"],"sourcesContent":["import { getInternalSession, rechargeApiRequest } from '../utils/request';\nimport {\n AddressResponse,\n AddressListParams,\n CreateAddressRequest,\n UpdateAddressRequest,\n AddressListResponse,\n MergeAddressesRequest,\n SkipFutureChargeAddressRequest,\n SkipFutureChargeAddressResponse,\n GetAddressOptions,\n Session,\n UpdateAddressParams,\n} from '../types';\n\n/** Returns all addresses from the store, or addresses for the customer given in the parameter. */\nexport function listAddresses(session: Session, query?: AddressListParams) {\n return rechargeApiRequest<AddressListResponse>(\n 'get',\n `/addresses`,\n { query },\n getInternalSession(session, 'listAddresses')\n );\n}\n\n/** Retrieves address for customer based on specified address id. */\nexport async function getAddress(session: Session, id: string | number, options?: GetAddressOptions) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'get',\n `/addresses`,\n {\n id,\n query: { include: options?.include },\n },\n getInternalSession(session, 'getAddress')\n );\n return address;\n}\n\n/** Create a new address for a customer. */\nexport async function createAddress(session: Session, createRequest: CreateAddressRequest) {\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'post',\n `/addresses`,\n { data: { ...createRequest, customer_id: session.customerId ? Number(session.customerId) : undefined } },\n getInternalSession(session, 'createAddress')\n );\n return address;\n}\n\n/** Updates an existing address to match the specified parameters. */\nexport async function updateAddress(\n session: Session,\n id: string | number,\n updateRequest: UpdateAddressRequest,\n query?: UpdateAddressParams\n) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'put',\n `/addresses`,\n { id, data: updateRequest, query },\n getInternalSession(session, 'updateAddress')\n );\n return address;\n}\n\n/** Apply discount code to an address. Addresses are currently limited to a single discount. */\nexport async function applyDiscountToAddress(\n session: Session,\n id: string | number,\n discountCode: string,\n query?: UpdateAddressParams\n) {\n return updateAddress(\n getInternalSession(session, 'applyDiscountToAddress'),\n id,\n {\n discounts: [{ code: discountCode }],\n },\n query\n );\n}\n\n/** Removes all discounts from an address. */\nexport async function removeDiscountsFromAddress(session: Session, id: string | number, query?: UpdateAddressParams) {\n if (id === undefined || id === '') {\n throw new Error('Id is required');\n }\n return updateAddress(getInternalSession(session, 'removeDiscountsFromAddress'), id, { discounts: [] }, query);\n}\n\n/** Deletes an address. Only Addresses with no active Subscriptions can be deleted. */\nexport function deleteAddress(session: Session, id: string | number) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n return rechargeApiRequest<void>('delete', `/addresses`, { id }, getInternalSession(session, 'deleteAddress'));\n}\n\n/**\n * Merges up to 10 source addresses into 1 target address.\n */\nexport async function mergeAddresses(session: Session, mergeRequest: MergeAddressesRequest) {\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'post',\n `/addresses/merge`,\n {\n data: mergeRequest,\n },\n getInternalSession(session, 'mergeAddresses')\n );\n return address;\n}\n\n/**\n * Skip a Charge in the future for one or multiple Subscriptions associated with the Address.\n */\nexport async function skipFutureCharge(\n session: Session,\n id: string | number,\n skipRequest: SkipFutureChargeAddressRequest\n) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { charge } = await rechargeApiRequest<SkipFutureChargeAddressResponse>(\n 'post',\n `/addresses/${id}/charges/skip`,\n {\n data: skipRequest,\n },\n getInternalSession(session, 'skipFutureCharge')\n );\n return charge;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"address.js","sources":["../../../src/api/address.ts"],"sourcesContent":["import { getInternalSession, rechargeApiRequest } from '../utils/request';\nimport { encodePathSegment } from '../utils/url';\nimport {\n AddressResponse,\n AddressListParams,\n CreateAddressRequest,\n UpdateAddressRequest,\n AddressListResponse,\n MergeAddressesRequest,\n SkipFutureChargeAddressRequest,\n SkipFutureChargeAddressResponse,\n GetAddressOptions,\n Session,\n UpdateAddressParams,\n} from '../types';\n\n/** Returns all addresses from the store, or addresses for the customer given in the parameter. */\nexport function listAddresses(session: Session, query?: AddressListParams) {\n return rechargeApiRequest<AddressListResponse>(\n 'get',\n `/addresses`,\n { query },\n getInternalSession(session, 'listAddresses')\n );\n}\n\n/** Retrieves address for customer based on specified address id. */\nexport async function getAddress(session: Session, id: string | number, options?: GetAddressOptions) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'get',\n `/addresses`,\n {\n id,\n query: { include: options?.include },\n },\n getInternalSession(session, 'getAddress')\n );\n return address;\n}\n\n/** Create a new address for a customer. */\nexport async function createAddress(session: Session, createRequest: CreateAddressRequest) {\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'post',\n `/addresses`,\n { data: { ...createRequest, customer_id: session.customerId ? Number(session.customerId) : undefined } },\n getInternalSession(session, 'createAddress')\n );\n return address;\n}\n\n/** Updates an existing address to match the specified parameters. */\nexport async function updateAddress(\n session: Session,\n id: string | number,\n updateRequest: UpdateAddressRequest,\n query?: UpdateAddressParams\n) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'put',\n `/addresses`,\n { id, data: updateRequest, query },\n getInternalSession(session, 'updateAddress')\n );\n return address;\n}\n\n/** Apply discount code to an address. Addresses are currently limited to a single discount. */\nexport async function applyDiscountToAddress(\n session: Session,\n id: string | number,\n discountCode: string,\n query?: UpdateAddressParams\n) {\n return updateAddress(\n getInternalSession(session, 'applyDiscountToAddress'),\n id,\n {\n discounts: [{ code: discountCode }],\n },\n query\n );\n}\n\n/** Removes all discounts from an address. */\nexport async function removeDiscountsFromAddress(session: Session, id: string | number, query?: UpdateAddressParams) {\n if (id === undefined || id === '') {\n throw new Error('Id is required');\n }\n return updateAddress(getInternalSession(session, 'removeDiscountsFromAddress'), id, { discounts: [] }, query);\n}\n\n/** Deletes an address. Only Addresses with no active Subscriptions can be deleted. */\nexport function deleteAddress(session: Session, id: string | number) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n return rechargeApiRequest<void>('delete', `/addresses`, { id }, getInternalSession(session, 'deleteAddress'));\n}\n\n/**\n * Merges up to 10 source addresses into 1 target address.\n */\nexport async function mergeAddresses(session: Session, mergeRequest: MergeAddressesRequest) {\n const { address } = await rechargeApiRequest<AddressResponse>(\n 'post',\n `/addresses/merge`,\n {\n data: mergeRequest,\n },\n getInternalSession(session, 'mergeAddresses')\n );\n return address;\n}\n\n/**\n * Skip a Charge in the future for one or multiple Subscriptions associated with the Address.\n */\nexport async function skipFutureCharge(\n session: Session,\n id: string | number,\n skipRequest: SkipFutureChargeAddressRequest\n) {\n if (id === undefined || id === '') {\n throw new Error('ID is required');\n }\n const { charge } = await rechargeApiRequest<SkipFutureChargeAddressResponse>(\n 'post',\n `/addresses/${encodePathSegment(id)}/charges/skip`,\n {\n data: skipRequest,\n },\n getInternalSession(session, 'skipFutureCharge')\n );\n return charge;\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { shopifyAppProxyRequest, request } from '../utils/request.js';
2
+ import { encodePathSegment } from '../utils/url.js';
2
3
  import { getOptions } from '../utils/options.js';
3
4
  import { RECHARGE_ADMIN_URL } from '../constants/api.js';
4
5
 
@@ -60,11 +61,13 @@ async function sendPasswordlessCode(email, options = {}) {
60
61
  if (!storeIdentifier) {
61
62
  throw new Error("InitRecharge has not been called and/or no store identifier has been defined.");
62
63
  }
64
+ const { send_email, send_sms } = options;
63
65
  const response = await rechargeAdminRequest("post", "/attempt_login", {
64
66
  data: {
65
67
  email,
66
68
  shop: storeIdentifier,
67
- ...options
69
+ ...send_email !== void 0 ? { send_email } : {},
70
+ ...send_sms !== void 0 ? { send_sms } : {}
68
71
  }
69
72
  });
70
73
  if (response.errors) {
@@ -81,10 +84,12 @@ async function sendPasswordlessCodeAppProxy(email, options = {}) {
81
84
  if (storefrontAccessToken) {
82
85
  headers["X-Recharge-Storefront-Access-Token"] = storefrontAccessToken;
83
86
  }
87
+ const { send_email, send_sms } = options;
84
88
  const response = await shopifyAppProxyRequest("post", "/attempt_login", {
85
89
  data: {
86
90
  email,
87
- ...options
91
+ ...send_email !== void 0 ? { send_email } : {},
92
+ ...send_sms !== void 0 ? { send_sms } : {}
88
93
  },
89
94
  headers
90
95
  });
@@ -164,12 +169,16 @@ function getCustomerParams() {
164
169
  async function loginCustomerPortal() {
165
170
  const { customerHash, token } = getCustomerParams();
166
171
  const { storeIdentifier } = getOptions();
167
- const response = await rechargeAdminRequest("post", `/customers/${customerHash}/access`, {
168
- data: {
169
- token,
170
- shop: storeIdentifier
172
+ const response = await rechargeAdminRequest(
173
+ "post",
174
+ `/customers/${encodePathSegment(customerHash)}/access`,
175
+ {
176
+ data: {
177
+ token,
178
+ shop: storeIdentifier
179
+ }
171
180
  }
172
- });
181
+ );
173
182
  return { apiToken: response.api_token, customerId: response.customer_id };
174
183
  }
175
184
  async function rechargeAdminRequest(method, url, { id, query, data, headers } = {}) {
@@ -179,7 +188,7 @@ async function rechargeAdminRequest(method, url, { id, query, data, headers } =
179
188
  ...storefrontAccessToken ? { "X-Recharge-Storefront-Access-Token": storefrontAccessToken } : {},
180
189
  ...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
181
190
  ...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
182
- "X-Recharge-Sdk-Version": "1.88.0",
191
+ "X-Recharge-Sdk-Version": "1.90.0",
183
192
  ...headers ? headers : {}
184
193
  };
185
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 {\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 const response = await rechargeAdminRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n shop: storeIdentifier,\n ...options,\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 const response = await shopifyAppProxyRequest<PasswordlessCodeResponse>('post', '/attempt_login', {\n data: {\n email,\n ...options,\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>('post', `/customers/${customerHash}/access`, {\n data: {\n token,\n shop: storeIdentifier,\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,5 +1,6 @@
1
1
  import { nanoid } from 'nanoid/non-secure';
2
2
  import { shopifyAppProxyRequest, getInternalSession, rechargeApiRequest } from '../utils/request.js';
3
+ import { encodePathSegment } from '../utils/url.js';
3
4
  import { getOptions } from '../utils/options.js';
4
5
  import { BundleSelectionValidator, toLineItemProperty } from '../utils/bundle.js';
5
6
 
@@ -115,7 +116,10 @@ async function validateBundle(bundle) {
115
116
  }
116
117
  async function validateBundleSelection(bundle) {
117
118
  try {
118
- const bundleData = await shopifyAppProxyRequest("get", `/bundle-data/${bundle.externalProductId}`);
119
+ const bundleData = await shopifyAppProxyRequest(
120
+ "get",
121
+ `/bundle-data/${encodePathSegment(bundle.externalProductId)}`
122
+ );
119
123
  const selectionValidator = new BundleSelectionValidator(bundle.selections, bundleData);
120
124
  return { valid: selectionValidator.isBundleSelectionValid(bundle.externalVariantId) };
121
125
  } catch (error) {