@rechargeapps/storefront-client 2.7.1 → 2.9.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.
@@ -154,7 +154,8 @@ function mapOnlineStoreToPublicBundleData(bundleData) {
154
154
  show_product_variants: bundleSettings.show_product_variants,
155
155
  product_details_modal_enabled: bundleSettings.product_details_modal_enabled,
156
156
  show_variants_as_individual_products: bundleData.bundle_settings.settings.display_variants_as_separate_products_in_list,
157
- post_add_to_cart_behavior: bundleSettings.addToCartBehavior
157
+ post_add_to_cart_behavior: bundleSettings.addToCartBehavior,
158
+ cross_sells_default_purchase_type: bundleData.bundle_settings.layout_settings.crossSells.defaultPurchaseType ?? null
158
159
  },
159
160
  variants: bundleData.bundle_settings.variants.filter(({ enabled }) => enabled).map((item, index) => {
160
161
  const variant = variantsLookup[String(item.external_variant_id)];
@@ -1 +1 @@
1
- {"version":3,"file":"bundleData.js","sources":["../../../src/utils/bundleData.ts"],"sourcesContent":["import { PublicBundleData, PriceRule } from '../types/bundleData';\nimport { BaseProduct, BaseProductVariant, BundleData as StorefrontBundleData } from '../types/bundle';\n\nconst mapBundleSettings = (bundleSettings: StorefrontBundleData['bundle_settings']) => {\n const addons = bundleSettings.layout_settings.addons;\n const crossSells = bundleSettings.layout_settings.crossSells;\n const customizationWindow = bundleSettings.customization_window;\n const defaultVariantId = bundleSettings.layout_settings?.defaultVariantId ?? bundleSettings.default_bundle_variant_id;\n const defaultFrequency = bundleSettings.layout_settings.defaultFrequency;\n const addToCartBehavior = bundleSettings.layout_settings.addToCartCallback;\n\n return {\n default_variant_id: defaultVariantId ? String(defaultVariantId) : null,\n is_customizable: bundleSettings.is_customizable,\n price_rule: String(bundleSettings.price_rule).toUpperCase(),\n customization_window: customizationWindow\n ? {\n active_days: customizationWindow,\n disabled_message: bundleSettings.customization_window_disabled_message || '',\n }\n : null,\n addons: addons.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n cross_sells: crossSells.collectionId\n ? { collection_id: addons.collectionId, collection_handle: addons.collectionHandle }\n : null,\n default_selling_plan_id: defaultFrequency || null,\n collapsible_collections: bundleSettings.layout_settings.collapsibleSections,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n show_product_variants: bundleSettings.layout_settings.showVariants,\n product_details_modal_enabled: bundleSettings.layout_settings.learnMoreModal,\n addToCartBehavior: {\n type: addToCartBehavior.type === 'none' ? ('cart_page' as const) : addToCartBehavior.type,\n value: addToCartBehavior.value,\n },\n };\n};\n\nconst mapIncentives = (incentives: StorefrontBundleData['incentives']): PublicBundleData['incentives'] => {\n if (incentives.tiered_discounts.length === 0) return null;\n\n return {\n tiered_discounts: incentives.tiered_discounts,\n };\n};\n\nconst mapSellingPlan = (\n sellingPlan: StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]\n): PublicBundleData['selling_plan_groups'][number]['selling_plans'][number] => ({\n id: sellingPlan.id,\n name: sellingPlan.name,\n options: sellingPlan.options.map(option => ({ name: option.name, value: option.value })),\n recurring_deliveries: sellingPlan.recurring_deliveries,\n price_adjustments: sellingPlan.price_adjustments.map(({ value, value_type }) => ({\n value,\n value_type,\n })),\n});\n\nconst mapSellingPlanGroups = (\n sellingPlanGroup: StorefrontBundleData['selling_plan_groups'][number]\n): PublicBundleData['selling_plan_groups'][number] => ({\n name: sellingPlanGroup.name,\n options: sellingPlanGroup.options.map(option => ({ name: option.name, values: option.values })),\n selling_plans: sellingPlanGroup.selling_plans.map(mapSellingPlan),\n});\n\nconst mapBasicVariant = (variant: BaseProductVariant) => ({\n id: String(variant.id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n options: variant.options,\n available_for_sale: variant.available,\n});\n\nconst formatFeaturedImage = (featuredImage: BaseProduct['featured_image']): string | null => {\n if (featuredImage == null || typeof featuredImage === 'string') return featuredImage;\n\n if ('src' in featuredImage) return featuredImage['src'];\n\n return null;\n};\n\nconst mapBasicProduct = (product: BaseProduct) => {\n return {\n id: String(product.id),\n title: product.title,\n description: product.description,\n available_for_sale: product.available,\n featured_image: formatFeaturedImage(product.featured_image),\n images: product.images,\n requires_selling_plan: product.requires_selling_plan,\n selling_plan_groups: product.selling_plan_groups.map(mapSellingPlanGroups),\n };\n};\n\nconst mapProduct = (product: StorefrontBundleData['collections'][number]['products'][number]) => {\n const productPlansLookup = productSellingPlansGroupLookup(product.selling_plan_groups);\n\n return {\n ...mapBasicProduct(product),\n handle: product.handle,\n tags: product.tags,\n price_range: { min: product.price_min, max: product.price_max },\n compare_at_price_range: { min: product.compare_at_price_min, max: product.compare_at_price_max },\n options: product.options,\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(\n productPlansLookup[`${sellingPlan.selling_plan_group_id}-${sellingPlan.selling_plan_id}`]\n ),\n })),\n option1: variant.option1,\n option2: variant.option2,\n option3: variant.option3,\n sku: variant.sku || '',\n requires_shipping: variant.requires_shipping,\n taxable: variant.taxable,\n featured_image: formatFeaturedImage(variant.featured_image),\n public_title: variant.public_title,\n requires_selling_plan: variant.requires_selling_plan,\n })),\n };\n};\n\nconst mapBundleVariantRanges = ({\n items_count,\n ranges,\n}: Pick<StorefrontBundleData['bundle_settings']['variants'][number], 'items_count' | 'ranges'>) => {\n if (ranges.length > 0) {\n return ranges.map(({ quantity_max, quantity_min }) => ({ min: quantity_min, max: quantity_max }));\n }\n\n return [{ min: items_count, max: items_count }];\n};\n\nconst productSellingPlansGroupLookup = (sellingPlanGroups: BaseProduct['selling_plan_groups']) =>\n sellingPlanGroups.reduce<\n Record<string, StorefrontBundleData['selling_plan_groups'][number]['selling_plans'][number]>\n >((acc, current) => {\n current.selling_plans.forEach(sellingPlan => {\n const key = `${current.id}-${sellingPlan.id}`;\n acc[key] = sellingPlan;\n });\n\n return acc;\n }, {});\n\nconst mapFilters = (filters: StorefrontBundleData['filters']): PublicBundleData['filters'] => {\n if (!Array.isArray(filters)) return [];\n return filters;\n};\n\nexport function mapOnlineStoreToPublicBundleData(bundleData: StorefrontBundleData): PublicBundleData {\n const bundleSettings = mapBundleSettings(bundleData.bundle_settings);\n const variantsLookup = bundleData.variants.reduce<Record<string, StorefrontBundleData['variants'][number]>>(\n (acc, variant) => {\n acc[variant.id] = variant;\n return acc;\n },\n {}\n );\n\n return {\n id: String(bundleData.id),\n title: bundleData.title,\n description: bundleData.description || null,\n handle: bundleData.handle,\n options: bundleData.options.map(option => ({\n name: option.name,\n position: option.position,\n values: option.values,\n })),\n default_variant_id: bundleSettings.default_variant_id,\n default_selling_plan_id: bundleSettings.default_selling_plan_id\n ? Number(bundleSettings.default_selling_plan_id)\n : null,\n available_for_sale: bundleData.available,\n requires_selling_plan: bundleData.requires_selling_plan,\n bundle_settings: {\n is_customizable: bundleSettings.is_customizable,\n price_rule: bundleSettings.price_rule as PriceRule,\n customization_window: bundleSettings.customization_window,\n max_quantity_per_variant: bundleSettings.max_quantity_per_variant,\n collapsible_collections: bundleSettings.collapsible_collections,\n show_product_variants: bundleSettings.show_product_variants,\n product_details_modal_enabled: bundleSettings.product_details_modal_enabled,\n show_variants_as_individual_products:\n bundleData.bundle_settings.settings.display_variants_as_separate_products_in_list,\n post_add_to_cart_behavior: bundleSettings.addToCartBehavior,\n },\n variants: bundleData.bundle_settings.variants\n .filter(({ enabled }) => enabled)\n .map((item, index) => {\n const variant = variantsLookup[String(item.external_variant_id)];\n\n return {\n id: String(item.external_variant_id),\n title: variant.title,\n price: variant.price,\n compare_at_price: variant.compare_at_price,\n image: variant.image || '',\n available_for_sale: variant.available,\n options: variant.options,\n requires_selling_plan: variant.requires_selling_plan,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n ranges: mapBundleVariantRanges(item),\n collections: item.option_sources.map(source => ({\n id: source.option_source_id,\n source_platform: 'shopify',\n min: source.quantity_min || 0,\n max: source.quantity_max,\n position: source.position,\n })),\n default_selections: item.selection_defaults.map(selectionDefault => ({\n quantity: selectionDefault.quantity,\n product: {\n id: String(selectionDefault.product.id),\n handle: selectionDefault.handle,\n title: selectionDefault.product.title,\n description: selectionDefault.product.description,\n images: selectionDefault.product.images,\n },\n variant: {\n id: selectionDefault.external_variant_id,\n title: selectionDefault.variant.title,\n featured_image: formatFeaturedImage(selectionDefault.variant.featured_image),\n sku: selectionDefault.sku || '',\n },\n })),\n position: index,\n };\n }),\n selling_plan_groups: bundleData.selling_plan_groups.map(mapSellingPlanGroups),\n collections: Object.values(bundleData.collections).reduce<PublicBundleData['collections']>((acc, current) => {\n if (!Array.isArray(current.products)) {\n /* If a collection is not published in Online store, it is included \n as _1:{ handle: \"<collection-handle\"} in the collections object.\n We need to skip these collections.\n */\n return acc;\n }\n\n acc[String(current.id)] = {\n id: String(current.id),\n title: current.title,\n handle: current.handle,\n products: current.products.map(mapProduct),\n };\n\n return acc;\n }, {}),\n addons: bundleData.addons.products.length\n ? {\n collection_id: bundleSettings.addons?.collection_id || '',\n collection_handle: bundleSettings.addons?.collection_handle || '',\n products: bundleData.addons.products.map(product => ({\n ...mapBasicProduct(product),\n price_range: { min: product.price, max: product.price },\n compare_at_price_range: { min: product.compare_at_price || 0, max: product.compare_at_price },\n variants: product.variants.map(variant => ({\n ...mapBasicVariant(variant),\n image: variant.image,\n selling_plan_allocations: variant.selling_plan_allocations.map(sellingPlan => ({\n price: sellingPlan.price,\n compare_at_price: sellingPlan.compare_at_price,\n selling_plan: mapSellingPlan(sellingPlan.selling_plan),\n })),\n })),\n })),\n }\n : null,\n cross_sells: bundleData.cross_sells.products.length\n ? {\n collection_id: bundleSettings.cross_sells?.collection_id || '',\n collection_handle: bundleSettings.cross_sells?.collection_handle || '',\n products: bundleData.cross_sells.products.map(mapProduct),\n }\n : null,\n incentives: mapIncentives(bundleData.incentives),\n filters: mapFilters(bundleData.filters),\n templates: bundleData.bundle_settings.layout_settings.templates || null,\n globalStyles: bundleData.bundle_settings.layout_settings.globalStyles || null,\n };\n}\n"],"names":[],"mappings":"AAGA,MAAM,iBAAA,GAAoB,CAAC,cAAA,KAA4D;AACrF,EAAA,MAAM,MAAA,GAAS,eAAe,eAAA,CAAgB,MAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,eAAe,eAAA,CAAgB,UAAA;AAClD,EAAA,MAAM,sBAAsB,cAAA,CAAe,oBAAA;AAC3C,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,eAAA,EAAiB,gBAAA,IAAoB,cAAA,CAAe,yBAAA;AAC5F,EAAA,MAAM,gBAAA,GAAmB,eAAe,eAAA,CAAgB,gBAAA;AACxD,EAAA,MAAM,iBAAA,GAAoB,eAAe,eAAA,CAAgB,iBAAA;AAEzD,EAAA,OAAO;AAAA,IACL,kBAAA,EAAoB,gBAAA,GAAmB,MAAA,CAAO,gBAAgB,CAAA,GAAI,IAAA;AAAA,IAClE,iBAAiB,cAAA,CAAe,eAAA;AAAA,IAChC,UAAA,EAAY,MAAA,CAAO,cAAA,CAAe,UAAU,EAAE,WAAA,EAAY;AAAA,IAC1D,sBAAsB,mBAAA,GAClB;AAAA,MACE,WAAA,EAAa,mBAAA;AAAA,MACb,gBAAA,EAAkB,eAAe,qCAAA,IAAyC;AAAA,KAC5E,GACA,IAAA;AAAA,IACJ,MAAA,EAAQ,MAAA,CAAO,YAAA,GACX,EAAE,aAAA,EAAe,OAAO,YAAA,EAAc,iBAAA,EAAmB,MAAA,CAAO,gBAAA,EAAiB,GACjF,IAAA;AAAA,IACJ,WAAA,EAAa,UAAA,CAAW,YAAA,GACpB,EAAE,aAAA,EAAe,OAAO,YAAA,EAAc,iBAAA,EAAmB,MAAA,CAAO,gBAAA,EAAiB,GACjF,IAAA;AAAA,IACJ,yBAAyB,gBAAA,IAAoB,IAAA;AAAA,IAC7C,uBAAA,EAAyB,eAAe,eAAA,CAAgB,mBAAA;AAAA,IACxD,0BAA0B,cAAA,CAAe,wBAAA;AAAA,IACzC,qBAAA,EAAuB,eAAe,eAAA,CAAgB,YAAA;AAAA,IACtD,6BAAA,EAA+B,eAAe,eAAA,CAAgB,cAAA;AAAA,IAC9D,iBAAA,EAAmB;AAAA,MACjB,IAAA,EAAM,iBAAA,CAAkB,IAAA,KAAS,MAAA,GAAU,cAAwB,iBAAA,CAAkB,IAAA;AAAA,MACrF,OAAO,iBAAA,CAAkB;AAAA;AAC3B,GACF;AACF,CAAA;AAEA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAAmF;AACxG,EAAA,IAAI,UAAA,CAAW,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAErD,EAAA,OAAO;AAAA,IACL,kBAAkB,UAAA,CAAW;AAAA,GAC/B;AACF,CAAA;AAEA,MAAM,cAAA,GAAiB,CACrB,WAAA,MAC8E;AAAA,EAC9E,IAAI,WAAA,CAAY,EAAA;AAAA,EAChB,MAAM,WAAA,CAAY,IAAA;AAAA,EAClB,OAAA,EAAS,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,CAAE,CAAA;AAAA,EACvF,sBAAsB,WAAA,CAAY,oBAAA;AAAA,EAClC,iBAAA,EAAmB,YAAY,iBAAA,CAAkB,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,YAAW,MAAO;AAAA,IAC/E,KAAA;AAAA,IACA;AAAA,GACF,CAAE;AACJ,CAAA,CAAA;AAEA,MAAM,oBAAA,GAAuB,CAC3B,gBAAA,MACqD;AAAA,EACrD,MAAM,gBAAA,CAAiB,IAAA;AAAA,EACvB,OAAA,EAAS,gBAAA,CAAiB,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,CAAE,CAAA;AAAA,EAC9F,aAAA,EAAe,gBAAA,CAAiB,aAAA,CAAc,GAAA,CAAI,cAAc;AAClE,CAAA,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,OAAA,MAAiC;AAAA,EACxD,EAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,EACf,OAAO,OAAA,CAAQ,KAAA;AAAA,EACf,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,EAC1B,SAAS,OAAA,CAAQ,OAAA;AAAA,EACjB,oBAAoB,OAAA,CAAQ;AAC9B,CAAA,CAAA;AAEA,MAAM,mBAAA,GAAsB,CAAC,aAAA,KAAgE;AAC3F,EAAA,IAAI,aAAA,IAAiB,IAAA,IAAQ,OAAO,aAAA,KAAkB,UAAU,OAAO,aAAA;AAEvE,EAAA,IAAI,KAAA,IAAS,aAAA,EAAe,OAAO,aAAA,CAAc,KAAK,CAAA;AAEtD,EAAA,OAAO,IAAA;AACT,CAAA;AAEA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAAyB;AAChD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,IACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,oBAAoB,OAAA,CAAQ,SAAA;AAAA,IAC5B,cAAA,EAAgB,mBAAA,CAAoB,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC1D,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,IAC/B,mBAAA,EAAqB,OAAA,CAAQ,mBAAA,CAAoB,GAAA,CAAI,oBAAoB;AAAA,GAC3E;AACF,CAAA;AAEA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA6E;AAC/F,EAAA,MAAM,kBAAA,GAAqB,8BAAA,CAA+B,OAAA,CAAQ,mBAAmB,CAAA;AAErF,EAAA,OAAO;AAAA,IACL,GAAG,gBAAgB,OAAO,CAAA;AAAA,IAC1B,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,aAAa,EAAE,GAAA,EAAK,QAAQ,SAAA,EAAW,GAAA,EAAK,QAAQ,SAAA,EAAU;AAAA,IAC9D,wBAAwB,EAAE,GAAA,EAAK,QAAQ,oBAAA,EAAsB,GAAA,EAAK,QAAQ,oBAAA,EAAqB;AAAA,IAC/F,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,MACzC,GAAG,gBAAgB,OAAO,CAAA;AAAA,MAC1B,wBAAA,EAA0B,OAAA,CAAQ,wBAAA,CAAyB,GAAA,CAAI,CAAA,WAAA,MAAgB;AAAA,QAC7E,OAAO,WAAA,CAAY,KAAA;AAAA,QACnB,kBAAkB,WAAA,CAAY,gBAAA;AAAA,QAC9B,YAAA,EAAc,cAAA;AAAA,UACZ,mBAAmB,CAAA,EAAG,WAAA,CAAY,qBAAqB,CAAA,CAAA,EAAI,WAAA,CAAY,eAAe,CAAA,CAAE;AAAA;AAC1F,OACF,CAAE,CAAA;AAAA,MACF,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,GAAA,EAAK,QAAQ,GAAA,IAAO,EAAA;AAAA,MACpB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,MAC3B,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,cAAA,EAAgB,mBAAA,CAAoB,OAAA,CAAQ,cAAc,CAAA;AAAA,MAC1D,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,uBAAuB,OAAA,CAAQ;AAAA,KACjC,CAAE;AAAA,GACJ;AACF,CAAA;AAEA,MAAM,yBAAyB,CAAC;AAAA,EAC9B,WAAA;AAAA,EACA;AACF,CAAA,KAAmG;AACjG,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,YAAA,EAAc,YAAA,EAAa,MAAO,EAAE,GAAA,EAAK,YAAA,EAAc,GAAA,EAAK,YAAA,EAAa,CAAE,CAAA;AAAA,EAClG;AAEA,EAAA,OAAO,CAAC,EAAE,GAAA,EAAK,WAAA,EAAa,GAAA,EAAK,aAAa,CAAA;AAChD,CAAA;AAEA,MAAM,iCAAiC,CAAC,iBAAA,KACtC,kBAAkB,MAAA,CAEhB,CAAC,KAAK,OAAA,KAAY;AAClB,EAAA,OAAA,CAAQ,aAAA,CAAc,QAAQ,CAAA,WAAA,KAAe;AAC3C,IAAA,MAAM,MAAM,CAAA,EAAG,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,YAAY,EAAE,CAAA,CAAA;AAC3C,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,WAAA;AAAA,EACb,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT,CAAA,EAAG,EAAE,CAAA;AAEP,MAAM,UAAA,GAAa,CAAC,OAAA,KAA0E;AAC5F,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,SAAU,EAAC;AACrC,EAAA,OAAO,OAAA;AACT,CAAA;AAEO,SAAS,iCAAiC,UAAA,EAAoD;AACnG,EAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,UAAA,CAAW,eAAe,CAAA;AACnE,EAAA,MAAM,cAAA,GAAiB,WAAW,QAAA,CAAS,MAAA;AAAA,IACzC,CAAC,KAAK,OAAA,KAAY;AAChB,MAAA,GAAA,CAAI,OAAA,CAAQ,EAAE,CAAA,GAAI,OAAA;AAClB,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAAA,IACxB,OAAO,UAAA,CAAW,KAAA;AAAA,IAClB,WAAA,EAAa,WAAW,WAAA,IAAe,IAAA;AAAA,IACvC,QAAQ,UAAA,CAAW,MAAA;AAAA,IACnB,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,MACzC,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO;AAAA,KACjB,CAAE,CAAA;AAAA,IACF,oBAAoB,cAAA,CAAe,kBAAA;AAAA,IACnC,yBAAyB,cAAA,CAAe,uBAAA,GACpC,MAAA,CAAO,cAAA,CAAe,uBAAuB,CAAA,GAC7C,IAAA;AAAA,IACJ,oBAAoB,UAAA,CAAW,SAAA;AAAA,IAC/B,uBAAuB,UAAA,CAAW,qBAAA;AAAA,IAClC,eAAA,EAAiB;AAAA,MACf,iBAAiB,cAAA,CAAe,eAAA;AAAA,MAChC,YAAY,cAAA,CAAe,UAAA;AAAA,MAC3B,sBAAsB,cAAA,CAAe,oBAAA;AAAA,MACrC,0BAA0B,cAAA,CAAe,wBAAA;AAAA,MACzC,yBAAyB,cAAA,CAAe,uBAAA;AAAA,MACxC,uBAAuB,cAAA,CAAe,qBAAA;AAAA,MACtC,+BAA+B,cAAA,CAAe,6BAAA;AAAA,MAC9C,oCAAA,EACE,UAAA,CAAW,eAAA,CAAgB,QAAA,CAAS,6CAAA;AAAA,MACtC,2BAA2B,cAAA,CAAe;AAAA,KAC5C;AAAA,IACA,QAAA,EAAU,UAAA,CAAW,eAAA,CAAgB,QAAA,CAClC,OAAO,CAAC,EAAE,OAAA,EAAQ,KAAM,OAAO,CAAA,CAC/B,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AACpB,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,CAAO,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAE/D,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,mBAAmB,CAAA;AAAA,QACnC,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,kBAAkB,OAAA,CAAQ,gBAAA;AAAA,QAC1B,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,QACxB,oBAAoB,OAAA,CAAQ,SAAA;AAAA,QAC5B,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,QAC/B,wBAAA,EAA0B,OAAA,CAAQ,wBAAA,CAAyB,GAAA,CAAI,CAAA,WAAA,MAAgB;AAAA,UAC7E,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,kBAAkB,WAAA,CAAY,gBAAA;AAAA,UAC9B,YAAA,EAAc,cAAA,CAAe,WAAA,CAAY,YAAY;AAAA,SACvD,CAAE,CAAA;AAAA,QACF,MAAA,EAAQ,uBAAuB,IAAI,CAAA;AAAA,QACnC,WAAA,EAAa,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,UAC9C,IAAI,MAAA,CAAO,gBAAA;AAAA,UACX,eAAA,EAAiB,SAAA;AAAA,UACjB,GAAA,EAAK,OAAO,YAAA,IAAgB,CAAA;AAAA,UAC5B,KAAK,MAAA,CAAO,YAAA;AAAA,UACZ,UAAU,MAAA,CAAO;AAAA,SACnB,CAAE,CAAA;AAAA,QACF,kBAAA,EAAoB,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,CAAA,gBAAA,MAAqB;AAAA,UACnE,UAAU,gBAAA,CAAiB,QAAA;AAAA,UAC3B,OAAA,EAAS;AAAA,YACP,EAAA,EAAI,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAAQ,EAAE,CAAA;AAAA,YACtC,QAAQ,gBAAA,CAAiB,MAAA;AAAA,YACzB,KAAA,EAAO,iBAAiB,OAAA,CAAQ,KAAA;AAAA,YAChC,WAAA,EAAa,iBAAiB,OAAA,CAAQ,WAAA;AAAA,YACtC,MAAA,EAAQ,iBAAiB,OAAA,CAAQ;AAAA,WACnC;AAAA,UACA,OAAA,EAAS;AAAA,YACP,IAAI,gBAAA,CAAiB,mBAAA;AAAA,YACrB,KAAA,EAAO,iBAAiB,OAAA,CAAQ,KAAA;AAAA,YAChC,cAAA,EAAgB,mBAAA,CAAoB,gBAAA,CAAiB,OAAA,CAAQ,cAAc,CAAA;AAAA,YAC3E,GAAA,EAAK,iBAAiB,GAAA,IAAO;AAAA;AAC/B,SACF,CAAE,CAAA;AAAA,QACF,QAAA,EAAU;AAAA,OACZ;AAAA,IACF,CAAC,CAAA;AAAA,IACH,mBAAA,EAAqB,UAAA,CAAW,mBAAA,CAAoB,GAAA,CAAI,oBAAoB,CAAA;AAAA,IAC5E,WAAA,EAAa,OAAO,MAAA,CAAO,UAAA,CAAW,WAAW,CAAA,CAAE,MAAA,CAAwC,CAAC,GAAA,EAAK,OAAA,KAAY;AAC3G,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAKpC,QAAA,OAAO,GAAA;AAAA,MACT;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAC,CAAA,GAAI;AAAA,QACxB,EAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,QACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,UAAU;AAAA,OAC3C;AAEA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAAA,IACL,MAAA,EAAQ,UAAA,CAAW,MAAA,CAAO,QAAA,CAAS,MAAA,GAC/B;AAAA,MACE,aAAA,EAAe,cAAA,CAAe,MAAA,EAAQ,aAAA,IAAiB,EAAA;AAAA,MACvD,iBAAA,EAAmB,cAAA,CAAe,MAAA,EAAQ,iBAAA,IAAqB,EAAA;AAAA,MAC/D,QAAA,EAAU,UAAA,CAAW,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,OAAA,MAAY;AAAA,QACnD,GAAG,gBAAgB,OAAO,CAAA;AAAA,QAC1B,aAAa,EAAE,GAAA,EAAK,QAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,KAAA,EAAM;AAAA,QACtD,sBAAA,EAAwB,EAAE,GAAA,EAAK,OAAA,CAAQ,oBAAoB,CAAA,EAAG,GAAA,EAAK,QAAQ,gBAAA,EAAiB;AAAA,QAC5F,QAAA,EAAU,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,OAAA,MAAY;AAAA,UACzC,GAAG,gBAAgB,OAAO,CAAA;AAAA,UAC1B,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,wBAAA,EAA0B,OAAA,CAAQ,wBAAA,CAAyB,GAAA,CAAI,CAAA,WAAA,MAAgB;AAAA,YAC7E,OAAO,WAAA,CAAY,KAAA;AAAA,YACnB,kBAAkB,WAAA,CAAY,gBAAA;AAAA,YAC9B,YAAA,EAAc,cAAA,CAAe,WAAA,CAAY,YAAY;AAAA,WACvD,CAAE;AAAA,SACJ,CAAE;AAAA,OACJ,CAAE;AAAA,KACJ,GACA,IAAA;AAAA,IACJ,WAAA,EAAa,UAAA,CAAW,WAAA,CAAY,QAAA,CAAS,MAAA,GACzC;AAAA,MACE,aAAA,EAAe,cAAA,CAAe,WAAA,EAAa,aAAA,IAAiB,EAAA;AAAA,MAC5D,iBAAA,EAAmB,cAAA,CAAe,WAAA,EAAa,iBAAA,IAAqB,EAAA;AAAA,MACpE,QAAA,EAAU,UAAA,CAAW,WAAA,CAAY,QAAA,CAAS,IAAI,UAAU;AAAA,KAC1D,GACA,IAAA;AAAA,IACJ,UAAA,EAAY,aAAA,CAAc,UAAA,CAAW,UAAU,CAAA;AAAA,IAC/C,OAAA,EAAS,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,IACtC,SAAA,EAAW,UAAA,CAAW,eAAA,CAAgB,eAAA,CAAgB,SAAA,IAAa,IAAA;AAAA,IACnE,YAAA,EAAc,UAAA,CAAW,eAAA,CAAgB,eAAA,CAAgB,YAAA,IAAgB;AAAA,GAC3E;AACF;;"}
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 cross_sells_default_purchase_type:\n bundleData.bundle_settings.layout_settings.crossSells.defaultPurchaseType ?? null,\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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"}
@@ -9,6 +9,31 @@ function stringifyQuery(obj) {
9
9
  return Object.entries(obj).filter(([, value]) => value !== void 0 && !(Array.isArray(value) && value.length === 0)).map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(",") : encode(value)}`).join("&");
10
10
  }
11
11
  const RESERVED_QUERY_KEYS = /* @__PURE__ */ new Set(["shop_url"]);
12
+ const sessionRetryStates = /* @__PURE__ */ new WeakMap();
13
+ let sessionRetryGeneration = 0;
14
+ function getSessionRetryState(retryFn) {
15
+ let state = sessionRetryStates.get(retryFn);
16
+ if (!state) {
17
+ state = {};
18
+ sessionRetryStates.set(retryFn, state);
19
+ }
20
+ return state;
21
+ }
22
+ function getRetrySession(retryFn, failedToken, sentAtGeneration) {
23
+ const state = getSessionRetryState(retryFn);
24
+ if (state.inFlight) return state.inFlight;
25
+ if (state.latest && state.latest.generation > sentAtGeneration) return Promise.resolve(state.latest.session);
26
+ state.inFlight = retryFn().then((session) => {
27
+ if (session && session.apiToken !== failedToken) {
28
+ sessionRetryGeneration += 1;
29
+ state.latest = { session, generation: sessionRetryGeneration };
30
+ }
31
+ return session;
32
+ }).finally(() => {
33
+ state.inFlight = void 0;
34
+ });
35
+ return state.inFlight;
36
+ }
12
37
  function getInternalSession(session, fnName) {
13
38
  return {
14
39
  ...session,
@@ -37,6 +62,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
37
62
  if (!token) {
38
63
  throw new Error("No API token defined on session.");
39
64
  }
65
+ const sentAtGeneration = sessionRetryGeneration;
40
66
  const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);
41
67
  const reqHeaders = {
42
68
  "X-Recharge-Access-Token": token,
@@ -44,7 +70,7 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
44
70
  "X-Recharge-Sdk-Fn": session.internalFnCall,
45
71
  ...appName ? { "X-Recharge-Sdk-App-Name": appName } : {},
46
72
  ...appVersion ? { "X-Recharge-Sdk-App-Version": appVersion } : {},
47
- "X-Recharge-Sdk-Version": "2.7.1",
73
+ "X-Recharge-Sdk-Version": "2.9.0",
48
74
  "X-Request-Id": session.internalRequestId,
49
75
  ...session.tmp_fn_identifier ? { "X-Recharge-Sdk-Fn-Identifier": session.tmp_fn_identifier } : {},
50
76
  ...headers ? headers : {}
@@ -58,38 +84,23 @@ async function rechargeApiRequest(method, url, { id, query, data, headers } = {}
58
84
  try {
59
85
  return await request(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });
60
86
  } catch (error) {
61
- if (loginRetryFn && error instanceof RechargeRequestError && error.status === 401) {
62
- return loginRetryFn().then((session2) => {
63
- if (session2) {
64
- return request(method, `${rechargeBaseUrl}${url}`, {
65
- id,
66
- query: localQuery,
67
- data,
68
- headers: {
69
- ...reqHeaders,
70
- "X-Recharge-Access-Token": session2.apiToken
71
- }
72
- });
73
- }
74
- throw error;
75
- });
76
- } else if (__unstable_twoFactorRetryFn && error instanceof RechargeRequestError && error.status === 423) {
77
- return __unstable_twoFactorRetryFn().then((session2) => {
78
- if (session2) {
79
- return request(method, `${rechargeBaseUrl}${url}`, {
80
- id,
81
- query: localQuery,
82
- data,
83
- headers: {
84
- ...reqHeaders,
85
- "X-Recharge-Access-Token": session2.apiToken
86
- }
87
- });
88
- }
89
- throw error;
90
- });
91
- }
92
- throw error;
87
+ const retryFnsByStatus = {
88
+ 401: loginRetryFn,
89
+ 423: __unstable_twoFactorRetryFn
90
+ };
91
+ const retryFn = error instanceof RechargeRequestError && error.status ? retryFnsByStatus[error.status] : void 0;
92
+ if (!retryFn) throw error;
93
+ const retrySession = await getRetrySession(retryFn, token, sentAtGeneration);
94
+ if (!retrySession) throw error;
95
+ return request(method, `${rechargeBaseUrl}${url}`, {
96
+ id,
97
+ query: localQuery,
98
+ data,
99
+ headers: {
100
+ ...reqHeaders,
101
+ "X-Recharge-Access-Token": retrySession.apiToken
102
+ }
103
+ });
93
104
  }
94
105
  }
95
106
  async function shopifyAppProxyRequest(method, url, requestOptions = {}) {
@@ -1 +1 @@
1
- {"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\n/** @internal */\nexport function getInternalSession(session: Session | InternalSession, fnName: string): InternalSession {\n return {\n ...session,\n internalFnCall: (session as InternalSession).internalFnCall ?? fnName,\n internalRequestId: (session as InternalSession).internalRequestId ?? nanoid(),\n };\n}\n\nexport async function cdnRequest<T>(method: Method, url: string, requestOptions: RequestOptions = {}): Promise<T> {\n const opts = getOptions();\n return request(method, `${RECHARGE_CDN_URL(opts.environment)}/store/${opts.storeIdentifier}${url}`, requestOptions);\n}\n\nexport async function rechargeApiRequest<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {},\n session: InternalSession\n): Promise<T> {\n const {\n environment,\n environmentUri,\n storeIdentifier,\n loginRetryFn,\n __unstable_twoFactorRetryFn,\n appName,\n appVersion,\n } = getOptions();\n if (!storeIdentifier) {\n throw new Error('InitRecharge has not been called and/or no store identifier has been defined.');\n }\n const token = session.apiToken;\n if (!token) {\n throw new Error('No API token defined on session.');\n }\n const rechargeBaseUrl = RECHARGE_API_URL(environment, environmentUri);\n const reqHeaders: RequestHeaders = {\n 'X-Recharge-Access-Token': token,\n 'X-Recharge-Version': '2021-11',\n 'X-Recharge-Sdk-Fn': session.internalFnCall,\n ...(appName ? { 'X-Recharge-Sdk-App-Name': appName } : {}),\n ...(appVersion ? { 'X-Recharge-Sdk-App-Version': appVersion } : {}),\n 'X-Recharge-Sdk-Version': '__SDK_VERSION__',\n 'X-Request-Id': session.internalRequestId,\n ...(session.tmp_fn_identifier ? { 'X-Recharge-Sdk-Fn-Identifier': session.tmp_fn_identifier } : {}),\n ...(headers ? headers : {}),\n };\n\n const callerQuery = query as Record<string, unknown> | undefined;\n const sanitizedCallerQuery = callerQuery\n ? Object.fromEntries(Object.entries(callerQuery).filter(([k]) => !RESERVED_QUERY_KEYS.has(k)))\n : undefined;\n\n const localQuery = {\n ...sanitizedCallerQuery,\n shop_url: storeIdentifier,\n };\n\n try {\n // await to catch any errors\n return await request<T>(method, `${rechargeBaseUrl}${url}`, { id, query: localQuery, data, headers: reqHeaders });\n } catch (error: unknown) {\n if (loginRetryFn && error instanceof RechargeRequestError && error.status === 401) {\n // call loginRetryFn and retry request on 401\n return loginRetryFn().then(session => {\n if (session) {\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': session.apiToken,\n },\n });\n }\n throw error;\n });\n } else if (__unstable_twoFactorRetryFn && error instanceof RechargeRequestError && error.status === 423) {\n // trigger two-factor authentication flow and retry request on 423\n return __unstable_twoFactorRetryFn().then(session => {\n if (session) {\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': session.apiToken,\n },\n });\n }\n throw error;\n });\n }\n throw error;\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":["session"],"mappings":"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"}
1
+ {"version":3,"file":"request.js","sources":["../../../src/utils/request.ts"],"sourcesContent":["import { nanoid } from './id';\n\nimport { Method, RequestHeaders, RequestOptions, InternalSession, Session } from '../types';\nimport { getOptions } from './options';\nimport { RECHARGE_API_URL, RECHARGE_CDN_URL, SHOPIFY_APP_PROXY_URL } from '../constants/api';\nimport { RechargeRequestError } from './error';\nimport { encodePathSegment } from './url';\n\n/**\n * Converts a query object into a URL-encoded query string using the following rules:\n * - Arrays are serialized as comma-separated values: `a=1,2` (not `a[0]=1&a[1]=2`)\n * - Only the values are URL-encoded; keys are not encoded\n * - Properties with `undefined` values or empty arrays are omitted from the result\n *\n * Reference: qs\n */\nfunction stringifyQuery(obj: Record<string, unknown>): string {\n const encode = (value: unknown) => encodeURIComponent(value === null ? '' : String(value));\n return Object.entries(obj)\n .filter(([, value]) => value !== undefined && !(Array.isArray(value) && value.length === 0))\n .map(([key, value]) => `${key}=${Array.isArray(value) ? value.map(encode).join(',') : encode(value)}`)\n .join('&');\n}\n\nconst RESERVED_QUERY_KEYS = new Set(['shop_url']);\n\ntype SessionRetryFn = () => Promise<Session | undefined>;\n\ninterface SessionRetryState {\n inFlight?: Promise<Session | undefined>;\n latest?: { session: Session; generation: number };\n}\n\nconst sessionRetryStates = new WeakMap<SessionRetryFn, SessionRetryState>();\nlet sessionRetryGeneration = 0;\n\nfunction getSessionRetryState(retryFn: SessionRetryFn): SessionRetryState {\n let state = sessionRetryStates.get(retryFn);\n if (!state) {\n state = {};\n sessionRetryStates.set(retryFn, state);\n }\n return state;\n}\n\n/**\n * Gets a fresh session for a failed request. Concurrent failures share one `retryFn` call. A request sent before an\n * earlier call returned a new session retries with that session instead of calling `retryFn` again; a request sent\n * after it always calls `retryFn`, so the app still decides (for example, after the customer logs out).\n */\nfunction getRetrySession(\n retryFn: SessionRetryFn,\n failedToken: string,\n sentAtGeneration: number\n): Promise<Session | undefined> {\n const state = getSessionRetryState(retryFn);\n if (state.inFlight) return state.inFlight;\n if (state.latest && state.latest.generation > sentAtGeneration) return Promise.resolve(state.latest.session);\n\n state.inFlight = retryFn()\n .then(session => {\n if (session && session.apiToken !== failedToken) {\n sessionRetryGeneration += 1;\n state.latest = { session, generation: sessionRetryGeneration };\n }\n return session;\n })\n .finally(() => {\n state.inFlight = undefined;\n });\n return state.inFlight;\n}\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 sentAtGeneration = sessionRetryGeneration;\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 const retryFnsByStatus: Partial<Record<number, SessionRetryFn>> = {\n 401: loginRetryFn,\n 423: __unstable_twoFactorRetryFn,\n };\n const retryFn = error instanceof RechargeRequestError && error.status ? retryFnsByStatus[error.status] : undefined;\n if (!retryFn) throw error;\n\n const retrySession = await getRetrySession(retryFn, token, sentAtGeneration);\n if (!retrySession) throw error;\n return request(method, `${rechargeBaseUrl}${url}`, {\n id,\n query: localQuery,\n data,\n headers: {\n ...reqHeaders,\n 'X-Recharge-Access-Token': retrySession.apiToken,\n },\n });\n }\n}\n\nexport async function shopifyAppProxyRequest<T>(\n method: Method,\n url: string,\n requestOptions: RequestOptions = {}\n): Promise<T> {\n return request(method, `${SHOPIFY_APP_PROXY_URL}${url}`, requestOptions);\n}\n\nexport async function request<T>(\n method: Method,\n url: string,\n { id, query, data, headers }: RequestOptions = {}\n): Promise<T> {\n let reqUrl = url.trim();\n\n if (id) {\n // Encode the id as a single opaque path segment. Without this, an id\n // containing `../` or `?` could traverse to a different API route or\n // smuggle query params (H1-3884884 / SEC-4002).\n reqUrl = [reqUrl, encodePathSegment(id)].join('/');\n }\n\n if (query) {\n let exQuery;\n [reqUrl, exQuery] = reqUrl.split('?');\n const fullQuery = [exQuery, stringifyQuery(query as Record<string, unknown>)].join('&').replace(/^&/, '');\n reqUrl = `${reqUrl}${fullQuery ? `?${fullQuery}` : ''}`;\n }\n\n let reqBody;\n if (data && method !== 'get') {\n reqBody = JSON.stringify(data);\n }\n\n const reqHeaders: RequestHeaders = {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Recharge-App': 'storefront-client',\n ...(headers ? headers : {}),\n };\n\n const response = await fetch(reqUrl, {\n method,\n headers: reqHeaders,\n body: reqBody,\n });\n\n let result;\n try {\n result = await response.json();\n } catch (e) {\n // If we get here, it means we were a no content response.\n }\n\n if (!response.ok) {\n if (response.status === 502 || response.status === 504) {\n throw new RechargeRequestError('A gateway error occurred while making the request', response.status);\n } else if (result && result.error) {\n throw new RechargeRequestError(result.error, response.status);\n } else if (result && result.errors) {\n throw new RechargeRequestError(JSON.stringify(result.errors), response.status);\n } else {\n throw new RechargeRequestError('A connection error occurred while making the request');\n }\n }\n\n return result as T;\n}\n"],"names":[],"mappings":"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"}