@beamimpact/web-sdk 1.55.7 → 1.56.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/chunks/_share-dialog-dependencies-Bk60ibnw.esm.js +2 -0
- package/dist/chunks/{_share-dialog-dependencies-BVNp0oLJ.esm.js.map → _share-dialog-dependencies-Bk60ibnw.esm.js.map} +1 -1
- package/dist/chunks/_share-dialog-dependencies-D6vA_2f6.esm.js +2 -0
- package/dist/chunks/{_share-dialog-dependencies-D4i8Nvve.esm.js.map → _share-dialog-dependencies-D6vA_2f6.esm.js.map} +1 -1
- package/dist/chunks/beam-errors-Ci0d3926.esm.js.map +1 -1
- package/dist/chunks/{beam-errors-CCe004HS.esm.d.ts → beam-errors-DUQ9pK2V.esm.d.ts} +7 -1
- package/dist/chunks/{cart-contents-CLT7p7Gd.esm.d.ts → cart-contents-CEoSx3y4.esm.d.ts} +1 -1
- package/dist/chunks/{css-card-grid-CvoGpsJH.esm.js → css-card-grid-DixMt6ek.esm.js} +2 -2
- package/dist/chunks/{css-card-grid-CvoGpsJH.esm.js.map → css-card-grid-DixMt6ek.esm.js.map} +1 -1
- package/dist/chunks/enforce-config-DHnpgqSK.esm.js +3 -0
- package/dist/chunks/enforce-config-DHnpgqSK.esm.js.map +1 -0
- package/dist/chunks/enforce-config-DUbQnaLO.esm.js +3 -0
- package/dist/chunks/enforce-config-DUbQnaLO.esm.js.map +1 -0
- package/dist/chunks/events-COWOQoLW.esm.js +2 -0
- package/dist/chunks/{events-Dki0ka4F.esm.js.map → events-COWOQoLW.esm.js.map} +1 -1
- package/dist/chunks/{events-B7l6VPsF.esm.d.ts → events-Dwqfqbij.esm.d.ts} +33 -5
- package/dist/chunks/index-8rOpG9kf.esm.js +2 -0
- package/dist/chunks/index-8rOpG9kf.esm.js.map +1 -0
- package/dist/chunks/{index-BAgWh5OK.esm.js → index-B1GmdVT3.esm.js} +2 -2
- package/dist/chunks/index-B1GmdVT3.esm.js.map +1 -0
- package/dist/chunks/{index-DKAZRTl5.esm.js → index-B2dxbh1d.esm.js} +2 -2
- package/dist/chunks/{index-DKAZRTl5.esm.js.map → index-B2dxbh1d.esm.js.map} +1 -1
- package/dist/chunks/{index-DPptZHfR.esm.js → index-BEEmYYxP.esm.js} +28 -18
- package/dist/chunks/index-BEEmYYxP.esm.js.map +1 -0
- package/dist/chunks/{index-CWnHkgy3.esm.js → index-BIEV1MH0.esm.js} +2 -2
- package/dist/chunks/{index-CWnHkgy3.esm.js.map → index-BIEV1MH0.esm.js.map} +1 -1
- package/dist/chunks/{index-CBS5Fqry.esm.d.ts → index-BLlSL37B.esm.d.ts} +4 -2
- package/dist/chunks/{index-C-hPf29c.esm.d.ts → index-BY5lSRmw.esm.d.ts} +4 -1
- package/dist/chunks/index-BaWMWAyt.esm.js +2 -0
- package/dist/chunks/index-BaWMWAyt.esm.js.map +1 -0
- package/dist/chunks/index-BeX4QeUu.esm.js +2 -0
- package/dist/chunks/index-BeX4QeUu.esm.js.map +1 -0
- package/dist/chunks/{index-CGKJagBi.esm.js → index-C3v-y56g.esm.js} +2 -2
- package/dist/chunks/index-C3v-y56g.esm.js.map +1 -0
- package/dist/chunks/{index-DEoMwStx.esm.d.ts → index-C_u1FXtO.esm.d.ts} +33 -5
- package/dist/chunks/{index-CG2AhvV9.esm.js → index-CqqF1sQo.esm.js} +2 -2
- package/dist/chunks/index-CqqF1sQo.esm.js.map +1 -0
- package/dist/chunks/index-Cs4Kp9X4.esm.js +2 -0
- package/dist/chunks/index-Cs4Kp9X4.esm.js.map +1 -0
- package/dist/chunks/index-D20ifskY.esm.d.ts +21 -0
- package/dist/chunks/{index-DmUEFwoM.esm.js → index-D3hxLDQF.esm.js} +2 -2
- package/dist/chunks/index-D3hxLDQF.esm.js.map +1 -0
- package/dist/chunks/{index-DBb5HSkR.esm.js → index-D5TZB-zM.esm.js} +2 -2
- package/dist/chunks/index-D5TZB-zM.esm.js.map +1 -0
- package/dist/chunks/{index-DTPlqZRf.esm.d.ts → index-DDCtGN21.esm.d.ts} +15 -2
- package/dist/chunks/index-DSJACB_p.esm.js +2 -0
- package/dist/chunks/{index-BNjsFEGn.esm.js.map → index-DSJACB_p.esm.js.map} +1 -1
- package/dist/chunks/{index-Ct1m4IjM.esm.js → index-DmjZnpod.esm.js} +2 -2
- package/dist/chunks/index-DmjZnpod.esm.js.map +1 -0
- package/dist/chunks/{index-rxgS4BLp.esm.d.ts → index-DyUuvdr3.esm.d.ts} +6 -2
- package/dist/chunks/{index-Bliur1O3.esm.d.ts → index-EJRmgmQu.esm.d.ts} +33 -5
- package/dist/chunks/{index-DvhxjeiK.esm.js → index-UMeAzKTG.esm.js} +28 -18
- package/dist/chunks/index-UMeAzKTG.esm.js.map +1 -0
- package/dist/chunks/index-hghrT7Z_.esm.d.ts +40 -0
- package/dist/chunks/index-mppXVWCH.esm.js +2 -0
- package/dist/chunks/{index-IKiJwo5v.esm.js.map → index-mppXVWCH.esm.js.map} +1 -1
- package/dist/chunks/{index-DjrWwYdg.esm.js → index-n62IxH5D.esm.js} +2 -2
- package/dist/chunks/index-n62IxH5D.esm.js.map +1 -0
- package/dist/chunks/{index-tbwbkOdj.esm.js → index-nAPzvUWE.esm.js} +2 -2
- package/dist/chunks/index-nAPzvUWE.esm.js.map +1 -0
- package/dist/chunks/{index-DXj15KHe.esm.d.ts → index-xcGPhpiO.esm.d.ts} +13 -1
- package/dist/chunks/lit-JRlupCB5.esm.js +25 -0
- package/dist/chunks/lit-JRlupCB5.esm.js.map +1 -0
- package/dist/chunks/loading-template-BFvXaTlD.esm.js +2 -0
- package/dist/chunks/{loading-template-DG4lkIIc.esm.js.map → loading-template-BFvXaTlD.esm.js.map} +1 -1
- package/dist/chunks/{localize-Btu9xYcE.esm.js → localize-Dg7NgKIP.esm.js} +4 -4
- package/dist/chunks/localize-Dg7NgKIP.esm.js.map +1 -0
- package/dist/chunks/{localize-C25pEGnx.esm.js → localize-DkAbsh05.esm.js} +4 -4
- package/dist/chunks/localize-DkAbsh05.esm.js.map +1 -0
- package/dist/chunks/lodash-BSs6Il-c.esm.js +2 -0
- package/dist/chunks/lodash-BSs6Il-c.esm.js.map +1 -0
- package/dist/chunks/{openapi-spec-Bk7E2QQP.esm.d.ts → openapi-spec-B4z4_CMq.esm.d.ts} +18 -0
- package/dist/chunks/{order-page-C3b348k0.esm.js → order-page-B0WbVrvh.esm.js} +2 -2
- package/dist/chunks/order-page-B0WbVrvh.esm.js.map +1 -0
- package/dist/chunks/{order-page-M7a2TINy.esm.d.ts → order-page-CSEjG6ma.esm.d.ts} +19 -18
- package/dist/chunks/{order-page-CuL1s6HR.esm.js → order-page-CT3hnhzf.esm.js} +2 -2
- package/dist/chunks/order-page-CT3hnhzf.esm.js.map +1 -0
- package/dist/chunks/{progress-bar-DF7UuuHb.esm.js → progress-bar-B82FOT8n.esm.js} +2 -2
- package/dist/chunks/{progress-bar-DF7UuuHb.esm.js.map → progress-bar-B82FOT8n.esm.js.map} +1 -1
- package/dist/chunks/{promo-pill-label-BihVdXIv.esm.js → promo-pill-label-D_4zJ7uy.esm.js} +3 -3
- package/dist/chunks/{promo-pill-label-BihVdXIv.esm.js.map → promo-pill-label-D_4zJ7uy.esm.js.map} +1 -1
- package/dist/chunks/{promo-pill-label-CD0lWdsv.esm.js → promo-pill-label-DcsiJS_N.esm.js} +3 -3
- package/dist/chunks/{promo-pill-label-CD0lWdsv.esm.js.map → promo-pill-label-DcsiJS_N.esm.js.map} +1 -1
- package/dist/chunks/{promo-types-BPmDZ5dF.esm.d.ts → promo-types-CmZzhkpN.esm.d.ts} +3 -2
- package/dist/chunks/promo-types-DKAOFHJr.esm.js.map +1 -1
- package/dist/chunks/{responsive-BR8qUfBa.esm.js → responsive-CIV4sFdH.esm.js} +2 -2
- package/dist/chunks/{responsive-BR8qUfBa.esm.js.map → responsive-CIV4sFdH.esm.js.map} +1 -1
- package/dist/chunks/routes-BIMwJ8u9.esm.js +2 -0
- package/dist/chunks/routes-BIMwJ8u9.esm.js.map +1 -0
- package/dist/chunks/routes-DSu5s3K7.esm.js +2 -0
- package/dist/chunks/routes-DSu5s3K7.esm.js.map +1 -0
- package/dist/chunks/routes-OxC3Ah30.esm.d.ts +638 -0
- package/dist/chunks/{share-button-BnNOZHBt.esm.js → share-button-CLMw49f5.esm.js} +2 -2
- package/dist/chunks/{share-button-BnNOZHBt.esm.js.map → share-button-CLMw49f5.esm.js.map} +1 -1
- package/dist/chunks/{share-button-BzmG48J9.esm.js → share-button-DXS3zbJz.esm.js} +2 -2
- package/dist/chunks/{share-button-BzmG48J9.esm.js.map → share-button-DXS3zbJz.esm.js.map} +1 -1
- package/dist/chunks/{share-button-BJ8T-uYK.esm.js → share-button-DkTpGZk1.esm.js} +8 -3
- package/dist/chunks/share-button-DkTpGZk1.esm.js.map +1 -0
- package/dist/chunks/{share-button-VEIdBFu3.esm.js → share-button-Dzc7loia.esm.js} +8 -3
- package/dist/chunks/share-button-Dzc7loia.esm.js.map +1 -0
- package/dist/chunks/{types-CPxMwnoR.esm.d.ts → types-D_PLq1pj.esm.d.ts} +1 -1
- package/dist/chunks/{update-cart-HlVGSYR7.esm.js → update-cart-ByUvNLyZ.esm.js} +2 -2
- package/dist/chunks/update-cart-ByUvNLyZ.esm.js.map +1 -0
- package/dist/chunks/{update-cart-CauFT0AF.esm.d.ts → update-cart-DWgFuC7U.esm.d.ts} +3 -2
- package/dist/chunks/{update-cart-C6BdmBt1.esm.js → update-cart-yj_9VGHp.esm.js} +2 -2
- package/dist/chunks/update-cart-yj_9VGHp.esm.js.map +1 -0
- package/dist/chunks/vendor-ckSdd6aH.esm.js +1286 -0
- package/dist/chunks/vendor-ckSdd6aH.esm.js.map +1 -0
- package/dist/components/beam-partner-logos.esm.js +5 -5
- package/dist/components/beam-partner-logos.esm.js.map +1 -1
- package/dist/components/beam-partner-logos.js +5 -5
- package/dist/components/beam-partner-logos.js.map +1 -1
- package/dist/components/community-impact.d.ts +1 -3
- package/dist/components/community-impact.esm.js +11 -6
- package/dist/components/community-impact.esm.js.map +1 -1
- package/dist/components/community-impact.js +11 -6
- package/dist/components/community-impact.js.map +1 -1
- package/dist/components/cumulative-impact.d.ts +1 -1
- package/dist/components/cumulative-impact.esm.js +10 -10
- package/dist/components/cumulative-impact.esm.js.map +1 -1
- package/dist/components/cumulative-impact.js +10 -10
- package/dist/components/cumulative-impact.js.map +1 -1
- package/dist/components/impact-overview.d.ts +36 -39
- package/dist/components/impact-overview.esm.js +11 -6
- package/dist/components/impact-overview.esm.js.map +1 -1
- package/dist/components/impact-overview.js +11 -6
- package/dist/components/impact-overview.js.map +1 -1
- package/dist/components/index.d.ts +5 -8
- package/dist/components/index.esm.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/post-purchase.d.ts +11 -12
- package/dist/components/post-purchase.esm.js +4 -4
- package/dist/components/post-purchase.esm.js.map +1 -1
- package/dist/components/post-purchase.js +4 -4
- package/dist/components/post-purchase.js.map +1 -1
- package/dist/components/product-details-page.d.ts +25 -26
- package/dist/components/product-details-page.esm.js +21 -21
- package/dist/components/product-details-page.esm.js.map +1 -1
- package/dist/components/product-details-page.js +21 -21
- package/dist/components/product-details-page.js.map +1 -1
- package/dist/components/redeem-transaction.d.ts +4 -7
- package/dist/components/redeem-transaction.esm.js +1 -1
- package/dist/components/redeem-transaction.js +1 -1
- package/dist/components/select-nonprofit.d.ts +4 -16
- package/dist/components/select-nonprofit.esm.js +6 -5
- package/dist/components/select-nonprofit.esm.js.map +1 -1
- package/dist/components/select-nonprofit.js +6 -5
- package/dist/components/select-nonprofit.js.map +1 -1
- package/dist/components/select-subscription-nonprofit.d.ts +2 -3
- package/dist/components/select-subscription-nonprofit.esm.js +42 -21
- package/dist/components/select-subscription-nonprofit.esm.js.map +1 -1
- package/dist/components/select-subscription-nonprofit.js +42 -21
- package/dist/components/select-subscription-nonprofit.js.map +1 -1
- package/dist/components/shopify.d.ts +8 -12
- package/dist/components/shopify.esm.js +1 -1
- package/dist/components/shopify.js +1 -1
- package/dist/components/social-share.d.ts +13 -2
- package/dist/components/social-share.esm.js +11 -4
- package/dist/components/social-share.esm.js.map +1 -1
- package/dist/components/social-share.js +11 -4
- package/dist/components/social-share.js.map +1 -1
- package/dist/components/subscription-impact.d.ts +37 -50
- package/dist/components/subscription-impact.esm.js +15 -3
- package/dist/components/subscription-impact.esm.js.map +1 -1
- package/dist/components/subscription-impact.js +15 -3
- package/dist/components/subscription-impact.js.map +1 -1
- package/dist/components/subscription-management.d.ts +92 -93
- package/dist/components/subscription-management.esm.js +4 -3
- package/dist/components/subscription-management.esm.js.map +1 -1
- package/dist/components/subscription-management.js +4 -3
- package/dist/components/subscription-management.js.map +1 -1
- package/dist/index.d.ts +19 -22
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/integrations/beam.d.ts +3 -2
- package/dist/integrations/beam.esm.js +1 -1
- package/dist/integrations/beam.esm.js.map +1 -1
- package/dist/integrations/beam.js +1 -1
- package/dist/integrations/beam.js.map +1 -1
- package/dist/integrations/cart.d.ts +3 -3
- package/dist/integrations/cart.esm.js +1 -1
- package/dist/integrations/cart.js +1 -1
- package/dist/integrations/index.d.ts +14 -18
- package/dist/integrations/index.esm.js +1 -1
- package/dist/integrations/index.js +1 -1
- package/dist/integrations/logs.d.ts +2 -2
- package/dist/integrations/logs.esm.js +1 -1
- package/dist/integrations/logs.js +1 -1
- package/dist/integrations/promoManager.d.ts +1 -1
- package/dist/integrations/promoManager.esm.js +1 -1
- package/dist/integrations/promoManager.esm.js.map +1 -1
- package/dist/integrations/promoManager.js +1 -1
- package/dist/integrations/promoManager.js.map +1 -1
- package/dist/integrations/session.d.ts +1 -1
- package/dist/integrations/session.esm.js +1 -1
- package/dist/integrations/session.js +1 -1
- package/dist/integrations/shopify.d.ts +6 -10
- package/dist/integrations/shopify.esm.js +1 -1
- package/dist/integrations/shopify.js +1 -1
- package/dist/integrations/statsig.d.ts +9 -5
- package/dist/integrations/statsig.esm.js +14 -14
- package/dist/integrations/statsig.esm.js.map +1 -1
- package/dist/integrations/statsig.js +14 -14
- package/dist/integrations/statsig.js.map +1 -1
- package/dist/integrations/utils.d.ts +7 -7
- package/dist/integrations/utils.esm.js +1 -1
- package/dist/integrations/utils.js +1 -1
- package/dist/react/beam-partner-logos.esm.js +1 -1
- package/dist/react/beam-partner-logos.esm.js.map +1 -1
- package/dist/react/beam-partner-logos.js +1 -1
- package/dist/react/beam-partner-logos.js.map +1 -1
- package/dist/react/community-impact.d.ts +1 -3
- package/dist/react/community-impact.esm.js +1 -1
- package/dist/react/community-impact.esm.js.map +1 -1
- package/dist/react/community-impact.js +1 -1
- package/dist/react/community-impact.js.map +1 -1
- package/dist/react/cumulative-impact.d.ts +1 -1
- package/dist/react/cumulative-impact.esm.js +1 -1
- package/dist/react/cumulative-impact.esm.js.map +1 -1
- package/dist/react/cumulative-impact.js +1 -1
- package/dist/react/cumulative-impact.js.map +1 -1
- package/dist/react/impact-overview.d.ts +1 -4
- package/dist/react/impact-overview.esm.js +1 -1
- package/dist/react/impact-overview.esm.js.map +1 -1
- package/dist/react/impact-overview.js +1 -1
- package/dist/react/impact-overview.js.map +1 -1
- package/dist/react/index.d.ts +18 -21
- package/dist/react/index.esm.js +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/post-purchase.d.ts +3 -7
- package/dist/react/post-purchase.esm.js +1 -1
- package/dist/react/post-purchase.esm.js.map +1 -1
- package/dist/react/post-purchase.js +1 -1
- package/dist/react/post-purchase.js.map +1 -1
- package/dist/react/product-details-page.d.ts +1 -2
- package/dist/react/product-details-page.esm.js +1 -1
- package/dist/react/product-details-page.esm.js.map +1 -1
- package/dist/react/product-details-page.js +1 -1
- package/dist/react/product-details-page.js.map +1 -1
- package/dist/react/redeem-transaction.d.ts +5 -8
- package/dist/react/redeem-transaction.esm.js +1 -1
- package/dist/react/redeem-transaction.esm.js.map +1 -1
- package/dist/react/redeem-transaction.js +1 -1
- package/dist/react/redeem-transaction.js.map +1 -1
- package/dist/react/select-nonprofit.d.ts +5 -7
- package/dist/react/select-nonprofit.esm.js +1 -1
- package/dist/react/select-nonprofit.esm.js.map +1 -1
- package/dist/react/select-nonprofit.js +1 -1
- package/dist/react/select-nonprofit.js.map +1 -1
- package/dist/react/select-subscription-nonprofit.d.ts +5 -6
- package/dist/react/select-subscription-nonprofit.esm.js +1 -1
- package/dist/react/select-subscription-nonprofit.esm.js.map +1 -1
- package/dist/react/select-subscription-nonprofit.js +1 -1
- package/dist/react/select-subscription-nonprofit.js.map +1 -1
- package/dist/react/social-share.d.ts +1 -2
- package/dist/react/social-share.esm.js +1 -1
- package/dist/react/social-share.esm.js.map +1 -1
- package/dist/react/social-share.js +1 -1
- package/dist/react/social-share.js.map +1 -1
- package/dist/react/subscription-impact.d.ts +1 -3
- package/dist/react/subscription-impact.esm.js +1 -1
- package/dist/react/subscription-impact.esm.js.map +1 -1
- package/dist/react/subscription-impact.js +1 -1
- package/dist/react/subscription-impact.js.map +1 -1
- package/dist/react/subscription-management.d.ts +4 -6
- package/dist/react/subscription-management.esm.js +1 -1
- package/dist/react/subscription-management.esm.js.map +1 -1
- package/dist/react/subscription-management.js +1 -1
- package/dist/react/subscription-management.js.map +1 -1
- package/dist/utils/beam-errors.d.ts +1 -1
- package/dist/utils/cookies.d.ts +1 -41
- package/dist/utils/cookies.esm.js +1 -1
- package/dist/utils/cookies.esm.js.map +1 -1
- package/dist/utils/cookies.js +1 -1
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/debounce.esm.js +1 -1
- package/dist/utils/debounce.js +1 -1
- package/dist/utils/events.d.ts +5 -5
- package/dist/utils/events.esm.js +1 -1
- package/dist/utils/events.js +1 -1
- package/dist/utils/index.d.ts +7 -7
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/is-equal.esm.js +1 -1
- package/dist/utils/is-equal.js +1 -1
- package/dist/utils/makeApiKeyHeader.esm.js.map +1 -1
- package/dist/utils/makeApiKeyHeader.js.map +1 -1
- package/dist/utils/memoize-last.esm.js +1 -1
- package/dist/utils/memoize-last.esm.js.map +1 -1
- package/dist/utils/memoize-last.js +1 -1
- package/dist/utils/memoize-last.js.map +1 -1
- package/dist/utils/network-listeners.esm.js +1 -1
- package/dist/utils/network-listeners.esm.js.map +1 -1
- package/dist/utils/network-listeners.js +1 -1
- package/dist/utils/network-listeners.js.map +1 -1
- package/dist/utils/promoManager.d.ts +6 -18
- package/dist/utils/promoManager.esm.js.map +1 -1
- package/dist/utils/promoManager.js.map +1 -1
- package/dist/utils/wait-for-element.esm.js.map +1 -1
- package/dist/utils/wait-for-element.js.map +1 -1
- package/package.json +42 -39
- package/dist/chunks/_share-dialog-dependencies-BVNp0oLJ.esm.js +0 -2
- package/dist/chunks/_share-dialog-dependencies-D4i8Nvve.esm.js +0 -2
- package/dist/chunks/enforce-config-Ba1JkOHs.esm.js +0 -3
- package/dist/chunks/enforce-config-Ba1JkOHs.esm.js.map +0 -1
- package/dist/chunks/enforce-config-CZ3ToOgr.esm.js +0 -3
- package/dist/chunks/enforce-config-CZ3ToOgr.esm.js.map +0 -1
- package/dist/chunks/events-Dki0ka4F.esm.js +0 -2
- package/dist/chunks/index-BAgWh5OK.esm.js.map +0 -1
- package/dist/chunks/index-BNjsFEGn.esm.js +0 -2
- package/dist/chunks/index-C0J0SqUr.esm.js +0 -2
- package/dist/chunks/index-C0J0SqUr.esm.js.map +0 -1
- package/dist/chunks/index-CG2AhvV9.esm.js.map +0 -1
- package/dist/chunks/index-CGKJagBi.esm.js.map +0 -1
- package/dist/chunks/index-CLNjLpMX.esm.js +0 -2
- package/dist/chunks/index-CLNjLpMX.esm.js.map +0 -1
- package/dist/chunks/index-Ct1m4IjM.esm.js.map +0 -1
- package/dist/chunks/index-DBb5HSkR.esm.js.map +0 -1
- package/dist/chunks/index-DFGxZmsj.esm.js +0 -2
- package/dist/chunks/index-DFGxZmsj.esm.js.map +0 -1
- package/dist/chunks/index-DHK-p5LV.esm.d.ts +0 -15
- package/dist/chunks/index-DPptZHfR.esm.js.map +0 -1
- package/dist/chunks/index-DbaDUPup.esm.d.ts +0 -28
- package/dist/chunks/index-DjrWwYdg.esm.js.map +0 -1
- package/dist/chunks/index-DmUEFwoM.esm.js.map +0 -1
- package/dist/chunks/index-DvhxjeiK.esm.js.map +0 -1
- package/dist/chunks/index-IKiJwo5v.esm.js +0 -2
- package/dist/chunks/index-NHPT4c0V.esm.js +0 -2
- package/dist/chunks/index-NHPT4c0V.esm.js.map +0 -1
- package/dist/chunks/index-tbwbkOdj.esm.js.map +0 -1
- package/dist/chunks/lit-WqMxC_PA.esm.js +0 -34
- package/dist/chunks/lit-WqMxC_PA.esm.js.map +0 -1
- package/dist/chunks/loading-template-DG4lkIIc.esm.js +0 -2
- package/dist/chunks/localize-Btu9xYcE.esm.js.map +0 -1
- package/dist/chunks/localize-C25pEGnx.esm.js.map +0 -1
- package/dist/chunks/lodash-D3TLHRR_.esm.js +0 -2
- package/dist/chunks/lodash-D3TLHRR_.esm.js.map +0 -1
- package/dist/chunks/order-page-C3b348k0.esm.js.map +0 -1
- package/dist/chunks/order-page-CuL1s6HR.esm.js.map +0 -1
- package/dist/chunks/progress-bar-CveZ8E6Q.esm.d.ts +0 -15
- package/dist/chunks/promo-pill-label-BXRqZHET.esm.d.ts +0 -19
- package/dist/chunks/routes-BHChxaFQ.esm.js +0 -2
- package/dist/chunks/routes-BHChxaFQ.esm.js.map +0 -1
- package/dist/chunks/routes-BoeGe1RQ.esm.d.ts +0 -638
- package/dist/chunks/routes-E1gMJl6d.esm.js +0 -2
- package/dist/chunks/routes-E1gMJl6d.esm.js.map +0 -1
- package/dist/chunks/share-button-BJ8T-uYK.esm.js.map +0 -1
- package/dist/chunks/share-button-CDVVaxEc.esm.d.ts +0 -27
- package/dist/chunks/share-button-VEIdBFu3.esm.js.map +0 -1
- package/dist/chunks/update-cart-C6BdmBt1.esm.js.map +0 -1
- package/dist/chunks/update-cart-HlVGSYR7.esm.js.map +0 -1
- package/dist/chunks/vendor-KKSARHWL.esm.js +0 -1284
- package/dist/chunks/vendor-KKSARHWL.esm.js.map +0 -1
package/dist/utils/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as t}from"../chunks/beam-errors-Ci0d3926.esm.js";import{e as a}from"../chunks/events-
|
|
1
|
+
import{b as t}from"../chunks/beam-errors-Ci0d3926.esm.js";import{e as a}from"../chunks/events-COWOQoLW.esm.js";import{logger as i}from"./logger.js";import{initNetworkListeners as d}from"./network-listeners.js";import{createScopedLocalStorage as C}from"./local-storage.js";import{waitForElement as l}from"./wait-for-element.js";import{deleteCookieValue as S,getCookieMap as x,getCookieValue as P,setCookieValue as k}from"./cookies.js";import{getRemoteSession as c,saveRemoteSession as A}from"./remote-session.js";import{memoizeLast as L}from"./memoize-last.js";import{d as R,i as v}from"../chunks/lodash-BSs6Il-c.esm.js";import{formatStoreAndReturnPromoCodes as V,getAllPromoCodesFromCookie as b,getPromoCodeFromShopifyCookie as q,getPromoCodesFromCart as w,getPromoCodesLocalStorage as z,getSanitizedUrlForStorage as I,isEmptyPromoData as U,mapToUnvalidatedPromoCodes as h,mergeStoreAndReturnPromos as D,parseJsonStringArray as J,promoCodesAreEqual as M,setPromoCodeInCookie as N,setPromoCodesInLocalStorage as T}from"./promoManager.js";import"../chunks/promo-types-DKAOFHJr.esm.js";export{C as createScopedLocalStorage,R as debounce,S as deleteCookieValue,t as errors,a as events,V as formatStoreAndReturnPromoCodes,b as getAllPromoCodesFromCookie,x as getCookieMap,P as getCookieValue,q as getPromoCodeFromShopifyCookie,w as getPromoCodesFromCart,z as getPromoCodesLocalStorage,c as getRemoteSession,I as getSanitizedUrlForStorage,d as initNetworkListeners,U as isEmptyPromoData,v as isEqual,i as logger,h as mapToUnvalidatedPromoCodes,L as memoizeLast,D as mergeStoreAndReturnPromos,J as parseJsonStringArray,M as promoCodesAreEqual,A as saveRemoteSession,k as setCookieValue,N as setPromoCodeInCookie,T as setPromoCodesInLocalStorage,l as waitForElement};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as o}from"../chunks/lodash-
|
|
1
|
+
import{i as o}from"../chunks/lodash-BSs6Il-c.esm.js";export{o as isEqual};
|
|
2
2
|
//# sourceMappingURL=is-equal.esm.js.map
|
package/dist/utils/is-equal.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as o}from"../chunks/lodash-
|
|
1
|
+
import{i as o}from"../chunks/lodash-BSs6Il-c.esm.js";export{o as isEqual};
|
|
2
2
|
//# sourceMappingURL=is-equal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeApiKeyHeader.esm.js","sources":["../../src/utils/makeApiKeyHeader.ts"],"sourcesContent":["export function makeApiKeyHeader(apiKey: string) {\n return {\n authorization: `Api-Key ${apiKey}`,\n };\n}\n"],"names":["makeApiKeyHeader","apiKey"],"mappings":"
|
|
1
|
+
{"version":3,"file":"makeApiKeyHeader.esm.js","sources":["../../src/utils/makeApiKeyHeader.ts"],"sourcesContent":["export function makeApiKeyHeader(apiKey: string) {\n return {\n authorization: `Api-Key ${apiKey}`,\n };\n}\n"],"names":["makeApiKeyHeader","apiKey"],"mappings":"AAAO,SAASA,EAAiBC,EAAgB,CAC/C,MAAO,CACL,cAAe,WAAWA,CAAM,EAClC,CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeApiKeyHeader.js","sources":["../../src/utils/makeApiKeyHeader.ts"],"sourcesContent":["export function makeApiKeyHeader(apiKey: string) {\n return {\n authorization: `Api-Key ${apiKey}`,\n };\n}\n"],"names":["makeApiKeyHeader","apiKey"],"mappings":"
|
|
1
|
+
{"version":3,"file":"makeApiKeyHeader.js","sources":["../../src/utils/makeApiKeyHeader.ts"],"sourcesContent":["export function makeApiKeyHeader(apiKey: string) {\n return {\n authorization: `Api-Key ${apiKey}`,\n };\n}\n"],"names":["makeApiKeyHeader","apiKey"],"mappings":"AAAO,SAASA,EAAiBC,EAAgB,CAC/C,MAAO,CACL,cAAe,WAAWA,CAAM,EAClC,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as a}from"../chunks/lodash-
|
|
1
|
+
import{i as a}from"../chunks/lodash-BSs6Il-c.esm.js";function f(o,{isEqual:u=a}={}){let i=null,l=null,e=!1,r=0;return(...s)=>{if(e&&u(i,s))return l;const t=o(...s);if(t instanceof Promise){r++;const n=r;t.catch(()=>{n===r&&(e=!1)})}return i=s,l=t,e=!0,t}}export{f as memoizeLast};
|
|
2
2
|
//# sourceMappingURL=memoize-last.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoize-last.esm.js","sources":["../../src/utils/memoize-last.ts"],"sourcesContent":["import { isEqual as defaultIsEqual } from \"./is-equal\";\n\ntype Func<T extends any[], R> = (...args: T) => R;\n\n/**\n * Takes a function and returns a new memoized function.\n * If the same arguments are passed to the memoized function, it will return the previously computed result.\n * This is a \"memoize once\" function meaning it only compares the previous and current arguments, not historic values.\n * Results that throw errors or return rejected Promises are not cached.\n *\n * @param {Function} fn - The function to be memoized.\n * @param {(value: any) => boolean} [isEqual]- The equality function used to compare arguments.\n * @returns {Function} - The memoized function.\n * @param func\n */\nexport function memoizeLast<T extends any[], R>(func: Func<T, R>, { isEqual = defaultIsEqual } = {}): Func<T, R> {\n let lastArgs: T | null = null;\n let lastResult: R | null = null;\n let hasResult = false; // Separate variable to track whether lastResult exists because lastResult could be falsy\n let promiseCounter = 0; // Used to keep track of result order in async invocation so we know to replace cache or not\n\n return (...args: T): R => {\n if (hasResult && isEqual(lastArgs, args)) {\n return lastResult as R;\n }\n\n const result = func(...args); // Errors here are not caught, so result will not cache if there is an error\n\n if (result instanceof Promise) {\n promiseCounter++;\n const promiseCounterAtStart = promiseCounter;\n result.catch(() => {\n // Don't return cached result next time if the Promise rejects, unless a new Promise has already replaced\n // the one that rejected\n if (promiseCounterAtStart === promiseCounter) {\n hasResult = false;\n }\n });\n }\n\n // Cache the latest args and result.\n lastArgs = args;\n lastResult = result;\n hasResult = true;\n\n return result;\n };\n}\n"],"names":["memoizeLast","func","isEqual","defaultIsEqual","lastArgs","lastResult","hasResult","promiseCounter","args","result","promiseCounterAtStart"],"mappings":"qDAeO,SAASA,EAAgCC,EAAkB,CAAE,QAAAC,EAAUC,CAAe,EAAI,
|
|
1
|
+
{"version":3,"file":"memoize-last.esm.js","sources":["../../src/utils/memoize-last.ts"],"sourcesContent":["import { isEqual as defaultIsEqual } from \"./is-equal\";\n\ntype Func<T extends any[], R> = (...args: T) => R;\n\n/**\n * Takes a function and returns a new memoized function.\n * If the same arguments are passed to the memoized function, it will return the previously computed result.\n * This is a \"memoize once\" function meaning it only compares the previous and current arguments, not historic values.\n * Results that throw errors or return rejected Promises are not cached.\n *\n * @param {Function} fn - The function to be memoized.\n * @param {(value: any) => boolean} [isEqual]- The equality function used to compare arguments.\n * @returns {Function} - The memoized function.\n * @param func\n */\nexport function memoizeLast<T extends any[], R>(func: Func<T, R>, { isEqual = defaultIsEqual } = {}): Func<T, R> {\n let lastArgs: T | null = null;\n let lastResult: R | null = null;\n let hasResult = false; // Separate variable to track whether lastResult exists because lastResult could be falsy\n let promiseCounter = 0; // Used to keep track of result order in async invocation so we know to replace cache or not\n\n return (...args: T): R => {\n if (hasResult && isEqual(lastArgs, args)) {\n return lastResult as R;\n }\n\n const result = func(...args); // Errors here are not caught, so result will not cache if there is an error\n\n if (result instanceof Promise) {\n promiseCounter++;\n const promiseCounterAtStart = promiseCounter;\n result.catch(() => {\n // Don't return cached result next time if the Promise rejects, unless a new Promise has already replaced\n // the one that rejected\n if (promiseCounterAtStart === promiseCounter) {\n hasResult = false;\n }\n });\n }\n\n // Cache the latest args and result.\n lastArgs = args;\n lastResult = result;\n hasResult = true;\n\n return result;\n };\n}\n"],"names":["memoizeLast","func","isEqual","defaultIsEqual","lastArgs","lastResult","hasResult","promiseCounter","args","result","promiseCounterAtStart"],"mappings":"qDAeO,SAASA,EAAgCC,EAAkB,CAAE,QAAAC,EAAUC,CAAe,EAAI,CAAA,EAAgB,CAC/G,IAAIC,EAAqB,KACrBC,EAAuB,KACvBC,EAAY,GACZC,EAAiB,EAErB,MAAO,IAAIC,IAAe,CACxB,GAAIF,GAAaJ,EAAQE,EAAUI,CAAI,EACrC,OAAOH,EAGT,MAAMI,EAASR,EAAK,GAAGO,CAAI,EAE3B,GAAIC,aAAkB,QAAS,CAC7BF,IACA,MAAMG,EAAwBH,EAC9BE,EAAO,MAAM,IAAM,CAGbC,IAA0BH,IAC5BD,EAAY,GAEhB,CAAC,CACH,CAGA,OAAAF,EAAWI,EACXH,EAAaI,EACbH,EAAY,GAELG,CACT,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as a}from"../chunks/lodash-
|
|
1
|
+
import{i as a}from"../chunks/lodash-BSs6Il-c.esm.js";function f(o,{isEqual:u=a}={}){let i=null,l=null,e=!1,r=0;return(...s)=>{if(e&&u(i,s))return l;const t=o(...s);if(t instanceof Promise){r++;const n=r;t.catch(()=>{n===r&&(e=!1)})}return i=s,l=t,e=!0,t}}export{f as memoizeLast};
|
|
2
2
|
//# sourceMappingURL=memoize-last.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memoize-last.js","sources":["../../src/utils/memoize-last.ts"],"sourcesContent":["import { isEqual as defaultIsEqual } from \"./is-equal\";\n\ntype Func<T extends any[], R> = (...args: T) => R;\n\n/**\n * Takes a function and returns a new memoized function.\n * If the same arguments are passed to the memoized function, it will return the previously computed result.\n * This is a \"memoize once\" function meaning it only compares the previous and current arguments, not historic values.\n * Results that throw errors or return rejected Promises are not cached.\n *\n * @param {Function} fn - The function to be memoized.\n * @param {(value: any) => boolean} [isEqual]- The equality function used to compare arguments.\n * @returns {Function} - The memoized function.\n * @param func\n */\nexport function memoizeLast<T extends any[], R>(func: Func<T, R>, { isEqual = defaultIsEqual } = {}): Func<T, R> {\n let lastArgs: T | null = null;\n let lastResult: R | null = null;\n let hasResult = false; // Separate variable to track whether lastResult exists because lastResult could be falsy\n let promiseCounter = 0; // Used to keep track of result order in async invocation so we know to replace cache or not\n\n return (...args: T): R => {\n if (hasResult && isEqual(lastArgs, args)) {\n return lastResult as R;\n }\n\n const result = func(...args); // Errors here are not caught, so result will not cache if there is an error\n\n if (result instanceof Promise) {\n promiseCounter++;\n const promiseCounterAtStart = promiseCounter;\n result.catch(() => {\n // Don't return cached result next time if the Promise rejects, unless a new Promise has already replaced\n // the one that rejected\n if (promiseCounterAtStart === promiseCounter) {\n hasResult = false;\n }\n });\n }\n\n // Cache the latest args and result.\n lastArgs = args;\n lastResult = result;\n hasResult = true;\n\n return result;\n };\n}\n"],"names":["memoizeLast","func","isEqual","defaultIsEqual","lastArgs","lastResult","hasResult","promiseCounter","args","result","promiseCounterAtStart"],"mappings":"qDAeO,SAASA,EAAgCC,EAAkB,CAAE,QAAAC,EAAUC,CAAe,EAAI,
|
|
1
|
+
{"version":3,"file":"memoize-last.js","sources":["../../src/utils/memoize-last.ts"],"sourcesContent":["import { isEqual as defaultIsEqual } from \"./is-equal\";\n\ntype Func<T extends any[], R> = (...args: T) => R;\n\n/**\n * Takes a function and returns a new memoized function.\n * If the same arguments are passed to the memoized function, it will return the previously computed result.\n * This is a \"memoize once\" function meaning it only compares the previous and current arguments, not historic values.\n * Results that throw errors or return rejected Promises are not cached.\n *\n * @param {Function} fn - The function to be memoized.\n * @param {(value: any) => boolean} [isEqual]- The equality function used to compare arguments.\n * @returns {Function} - The memoized function.\n * @param func\n */\nexport function memoizeLast<T extends any[], R>(func: Func<T, R>, { isEqual = defaultIsEqual } = {}): Func<T, R> {\n let lastArgs: T | null = null;\n let lastResult: R | null = null;\n let hasResult = false; // Separate variable to track whether lastResult exists because lastResult could be falsy\n let promiseCounter = 0; // Used to keep track of result order in async invocation so we know to replace cache or not\n\n return (...args: T): R => {\n if (hasResult && isEqual(lastArgs, args)) {\n return lastResult as R;\n }\n\n const result = func(...args); // Errors here are not caught, so result will not cache if there is an error\n\n if (result instanceof Promise) {\n promiseCounter++;\n const promiseCounterAtStart = promiseCounter;\n result.catch(() => {\n // Don't return cached result next time if the Promise rejects, unless a new Promise has already replaced\n // the one that rejected\n if (promiseCounterAtStart === promiseCounter) {\n hasResult = false;\n }\n });\n }\n\n // Cache the latest args and result.\n lastArgs = args;\n lastResult = result;\n hasResult = true;\n\n return result;\n };\n}\n"],"names":["memoizeLast","func","isEqual","defaultIsEqual","lastArgs","lastResult","hasResult","promiseCounter","args","result","promiseCounterAtStart"],"mappings":"qDAeO,SAASA,EAAgCC,EAAkB,CAAE,QAAAC,EAAUC,CAAe,EAAI,CAAA,EAAgB,CAC/G,IAAIC,EAAqB,KACrBC,EAAuB,KACvBC,EAAY,GACZC,EAAiB,EAErB,MAAO,IAAIC,IAAe,CACxB,GAAIF,GAAaJ,EAAQE,EAAUI,CAAI,EACrC,OAAOH,EAGT,MAAMI,EAASR,EAAK,GAAGO,CAAI,EAE3B,GAAIC,aAAkB,QAAS,CAC7BF,IACA,MAAMG,EAAwBH,EAC9BE,EAAO,MAAM,IAAM,CAGbC,IAA0BH,IAC5BD,EAAY,GAEhB,CAAC,CACH,CAGA,OAAAF,EAAWI,EACXH,EAAaI,EACbH,EAAY,GAELG,CACT,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as i}from"../chunks/events-
|
|
1
|
+
import{d as i}from"../chunks/events-COWOQoLW.esm.js";const a={apply:function(o,r,t){return o(...t).then(e=>{if(e.ok){const n=e.clone();window.dispatchEvent(new i({url:t[0].toString(),method:(t[1]?.method||"get").toLowerCase(),type:"fetch",response:n}))}return e})}},d={construct(o,r){const t=new o(...r),e=t.open;let n,s;return t.open=function(c,p){n=c,s=p,e.apply(this,arguments)},t.addEventListener("load",()=>{window.dispatchEvent(new i({url:(s||"").toString(),method:(n||"get").toLowerCase(),type:"xhr",xhr:t}))}),t}};let w=!1;const h=()=>{w||(window.fetch=new Proxy(window.fetch,a),XMLHttpRequest=new Proxy(XMLHttpRequest,d),w=!0)};export{h as initNetworkListeners};
|
|
2
2
|
//# sourceMappingURL=network-listeners.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-listeners.esm.js","sources":["../../src/utils/network-listeners.ts"],"sourcesContent":["import { BeamNetworkCallEvent } from \"./events\";\n\n/**\n * Fetch Listener\n */\n\nconst fetchHandler = {\n apply: function (target: any, _thisArg: any, args: any[]) {\n return target(...args).then((response: Response) => {\n if (response.ok) {\n const responseCopy = response.clone();\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: args[0].toString(),\n method: (args[1]?.method || \"get\").toLowerCase(),\n type: \"fetch\",\n response: responseCopy,\n })
|
|
1
|
+
{"version":3,"file":"network-listeners.esm.js","sources":["../../src/utils/network-listeners.ts"],"sourcesContent":["import { BeamNetworkCallEvent } from \"./events\";\n\n/**\n * Fetch Listener\n */\n\nconst fetchHandler = {\n apply: function (target: any, _thisArg: any, args: any[]) {\n return target(...args).then((response: Response) => {\n if (response.ok) {\n const responseCopy = response.clone();\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: args[0].toString(),\n method: (args[1]?.method || \"get\").toLowerCase(),\n type: \"fetch\",\n response: responseCopy,\n }),\n );\n }\n return response;\n });\n },\n};\n\n/**\n * XMLHTTPRequest Listener\n */\nconst xhrHandler = {\n construct(TargetConstructor: any, args: any[]) {\n const xhr: XMLHttpRequest = new TargetConstructor(...args);\n const _open: (method: string, url: string | URL) => void = xhr.open;\n let _method: string;\n let _url: string | URL;\n\n xhr.open = function (method: string, url: string | URL) {\n _method = method;\n _url = url;\n // @ts-expect-error arguments is untyped since xhr.open is an overloaded method\n // eslint-disable-next-line prefer-rest-params\n _open.apply(this, arguments);\n };\n\n xhr.addEventListener(\"load\", () => {\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: (_url || \"\").toString(),\n method: (_method || \"get\").toLowerCase(),\n type: \"xhr\",\n xhr,\n }),\n );\n });\n\n return xhr;\n },\n};\n\n/**\n * Side-Effects Setup (initialize listeners)\n */\n\nlet initializedListeners = false;\n\nexport const initNetworkListeners = () => {\n if (initializedListeners) return;\n window.fetch = new Proxy(window.fetch, fetchHandler);\n XMLHttpRequest = new Proxy(XMLHttpRequest, xhrHandler);\n initializedListeners = true;\n};\n"],"names":["fetchHandler","target","_thisArg","args","response","responseCopy","BeamNetworkCallEvent","xhrHandler","TargetConstructor","xhr","_open","_method","_url","method","url","initializedListeners","initNetworkListeners"],"mappings":"qDAMA,MAAMA,EAAe,CACnB,MAAO,SAAUC,EAAaC,EAAeC,EAAa,CACxD,OAAOF,EAAO,GAAGE,CAAI,EAAE,KAAMC,GAAuB,CAClD,GAAIA,EAAS,GAAI,CACf,MAAMC,EAAeD,EAAS,MAAA,EAC9B,OAAO,cACL,IAAIE,EAAqB,CACvB,IAAKH,EAAK,CAAC,EAAE,SAAA,EACb,QAASA,EAAK,CAAC,GAAG,QAAU,OAAO,YAAA,EACnC,KAAM,QACN,SAAUE,CACZ,CAAC,CACH,CACF,CACA,OAAOD,CACT,CAAC,CACH,CACF,EAKMG,EAAa,CACjB,UAAUC,EAAwBL,EAAa,CAC7C,MAAMM,EAAsB,IAAID,EAAkB,GAAGL,CAAI,EACnDO,EAAqDD,EAAI,KAC/D,IAAIE,EACAC,EAEJ,OAAAH,EAAI,KAAO,SAAUI,EAAgBC,EAAmB,CACtDH,EAAUE,EACVD,EAAOE,EAGPJ,EAAM,MAAM,KAAM,SAAS,CAC7B,EAEAD,EAAI,iBAAiB,OAAQ,IAAM,CACjC,OAAO,cACL,IAAIH,EAAqB,CACvB,KAAMM,GAAQ,IAAI,SAAA,EAClB,QAASD,GAAW,OAAO,YAAA,EAC3B,KAAM,MACN,IAAAF,CACF,CAAC,CACH,CACF,CAAC,EAEMA,CACT,CACF,EAMA,IAAIM,EAAuB,GAEpB,MAAMC,EAAuB,IAAM,CACpCD,IACJ,OAAO,MAAQ,IAAI,MAAM,OAAO,MAAOf,CAAY,EACnD,eAAiB,IAAI,MAAM,eAAgBO,CAAU,EACrDQ,EAAuB,GACzB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{d as i}from"../chunks/events-
|
|
1
|
+
import{d as i}from"../chunks/events-COWOQoLW.esm.js";const a={apply:function(o,r,t){return o(...t).then(e=>{if(e.ok){const n=e.clone();window.dispatchEvent(new i({url:t[0].toString(),method:(t[1]?.method||"get").toLowerCase(),type:"fetch",response:n}))}return e})}},d={construct(o,r){const t=new o(...r),e=t.open;let n,s;return t.open=function(c,p){n=c,s=p,e.apply(this,arguments)},t.addEventListener("load",()=>{window.dispatchEvent(new i({url:(s||"").toString(),method:(n||"get").toLowerCase(),type:"xhr",xhr:t}))}),t}};let w=!1;const h=()=>{w||(window.fetch=new Proxy(window.fetch,a),XMLHttpRequest=new Proxy(XMLHttpRequest,d),w=!0)};export{h as initNetworkListeners};
|
|
2
2
|
//# sourceMappingURL=network-listeners.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-listeners.js","sources":["../../src/utils/network-listeners.ts"],"sourcesContent":["import { BeamNetworkCallEvent } from \"./events\";\n\n/**\n * Fetch Listener\n */\n\nconst fetchHandler = {\n apply: function (target: any, _thisArg: any, args: any[]) {\n return target(...args).then((response: Response) => {\n if (response.ok) {\n const responseCopy = response.clone();\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: args[0].toString(),\n method: (args[1]?.method || \"get\").toLowerCase(),\n type: \"fetch\",\n response: responseCopy,\n })
|
|
1
|
+
{"version":3,"file":"network-listeners.js","sources":["../../src/utils/network-listeners.ts"],"sourcesContent":["import { BeamNetworkCallEvent } from \"./events\";\n\n/**\n * Fetch Listener\n */\n\nconst fetchHandler = {\n apply: function (target: any, _thisArg: any, args: any[]) {\n return target(...args).then((response: Response) => {\n if (response.ok) {\n const responseCopy = response.clone();\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: args[0].toString(),\n method: (args[1]?.method || \"get\").toLowerCase(),\n type: \"fetch\",\n response: responseCopy,\n }),\n );\n }\n return response;\n });\n },\n};\n\n/**\n * XMLHTTPRequest Listener\n */\nconst xhrHandler = {\n construct(TargetConstructor: any, args: any[]) {\n const xhr: XMLHttpRequest = new TargetConstructor(...args);\n const _open: (method: string, url: string | URL) => void = xhr.open;\n let _method: string;\n let _url: string | URL;\n\n xhr.open = function (method: string, url: string | URL) {\n _method = method;\n _url = url;\n // @ts-expect-error arguments is untyped since xhr.open is an overloaded method\n // eslint-disable-next-line prefer-rest-params\n _open.apply(this, arguments);\n };\n\n xhr.addEventListener(\"load\", () => {\n window.dispatchEvent(\n new BeamNetworkCallEvent({\n url: (_url || \"\").toString(),\n method: (_method || \"get\").toLowerCase(),\n type: \"xhr\",\n xhr,\n }),\n );\n });\n\n return xhr;\n },\n};\n\n/**\n * Side-Effects Setup (initialize listeners)\n */\n\nlet initializedListeners = false;\n\nexport const initNetworkListeners = () => {\n if (initializedListeners) return;\n window.fetch = new Proxy(window.fetch, fetchHandler);\n XMLHttpRequest = new Proxy(XMLHttpRequest, xhrHandler);\n initializedListeners = true;\n};\n"],"names":["fetchHandler","target","_thisArg","args","response","responseCopy","BeamNetworkCallEvent","xhrHandler","TargetConstructor","xhr","_open","_method","_url","method","url","initializedListeners","initNetworkListeners"],"mappings":"qDAMA,MAAMA,EAAe,CACnB,MAAO,SAAUC,EAAaC,EAAeC,EAAa,CACxD,OAAOF,EAAO,GAAGE,CAAI,EAAE,KAAMC,GAAuB,CAClD,GAAIA,EAAS,GAAI,CACf,MAAMC,EAAeD,EAAS,MAAA,EAC9B,OAAO,cACL,IAAIE,EAAqB,CACvB,IAAKH,EAAK,CAAC,EAAE,SAAA,EACb,QAASA,EAAK,CAAC,GAAG,QAAU,OAAO,YAAA,EACnC,KAAM,QACN,SAAUE,CACZ,CAAC,CACH,CACF,CACA,OAAOD,CACT,CAAC,CACH,CACF,EAKMG,EAAa,CACjB,UAAUC,EAAwBL,EAAa,CAC7C,MAAMM,EAAsB,IAAID,EAAkB,GAAGL,CAAI,EACnDO,EAAqDD,EAAI,KAC/D,IAAIE,EACAC,EAEJ,OAAAH,EAAI,KAAO,SAAUI,EAAgBC,EAAmB,CACtDH,EAAUE,EACVD,EAAOE,EAGPJ,EAAM,MAAM,KAAM,SAAS,CAC7B,EAEAD,EAAI,iBAAiB,OAAQ,IAAM,CACjC,OAAO,cACL,IAAIH,EAAqB,CACvB,KAAMM,GAAQ,IAAI,SAAA,EAClB,QAASD,GAAW,OAAO,YAAA,EAC3B,KAAM,MACN,IAAAF,CACF,CAAC,CACH,CACF,CAAC,EAEMA,CACT,CACF,EAMA,IAAIM,EAAuB,GAEpB,MAAMC,EAAuB,IAAM,CACpCD,IACJ,OAAO,MAAQ,IAAI,MAAM,OAAO,MAAOf,CAAY,EACnD,eAAiB,IAAI,MAAM,eAAgBO,CAAU,EACrDQ,EAAuB,GACzB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { b as TBeamCartLocalStorage } from '../chunks/cart-contents-
|
|
2
|
-
import { a as
|
|
3
|
-
import '../chunks/openapi-spec-
|
|
1
|
+
import { b as TBeamCartLocalStorage } from '../chunks/cart-contents-CEoSx3y4.esm.js';
|
|
2
|
+
import { a as TPromoCodeAttribute, T as TPromoCodeRequest, b as TPromoCodeResponse, c as TUnvalidatedPromoRequest, d as TValidatedPromoResponse } from '../chunks/promo-types-CmZzhkpN.esm.js';
|
|
3
|
+
import '../chunks/openapi-spec-B4z4_CMq.esm.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Retrieves all validated promo codes stored in the "beam_promo_codes" cookie and parses it
|
|
@@ -16,7 +16,7 @@ declare const getAllPromoCodesFromCookie: () => TPromoCodeResponse | undefined;
|
|
|
16
16
|
*/
|
|
17
17
|
declare const setPromoCodeInCookie: ({ validatedPromoCodes, domain, }: {
|
|
18
18
|
validatedPromoCodes: TValidatedPromoResponse;
|
|
19
|
-
domain?: string
|
|
19
|
+
domain?: string;
|
|
20
20
|
}) => void;
|
|
21
21
|
/**
|
|
22
22
|
* Retrieves promo codes from localStorage, scoped by API key
|
|
@@ -35,7 +35,7 @@ declare const getPromoCodesLocalStorage: ({ apiKey }: {
|
|
|
35
35
|
* @param {string} apiKey API key for storage scoping
|
|
36
36
|
*/
|
|
37
37
|
declare const setPromoCodesInLocalStorage: ({ apiKey, promoCodes, }: {
|
|
38
|
-
apiKey?: string
|
|
38
|
+
apiKey?: string;
|
|
39
39
|
promoCodes: Partial<TPromoCodeRequest>;
|
|
40
40
|
}) => void;
|
|
41
41
|
/**
|
|
@@ -67,19 +67,7 @@ declare const mergeStoreAndReturnPromos: ({ newPromos, apiKey, }: {
|
|
|
67
67
|
* @returns {TUnvalidatedPromoRequest} - An array of UnvalidatedPromoCode objects,
|
|
68
68
|
* each with a source and attributes object
|
|
69
69
|
*/
|
|
70
|
-
declare const mapToUnvalidatedPromoCodes: (promoAttributes: TPromoCodeAttribute[]) =>
|
|
71
|
-
type?: "manual" | "url" | undefined;
|
|
72
|
-
} & {
|
|
73
|
-
attributes?: {
|
|
74
|
-
value?: string | undefined;
|
|
75
|
-
} | undefined;
|
|
76
|
-
}> & Partial<{
|
|
77
|
-
type?: "manual" | "url" | undefined;
|
|
78
|
-
} & {
|
|
79
|
-
attributes?: {
|
|
80
|
-
url?: string | undefined;
|
|
81
|
-
} | undefined;
|
|
82
|
-
}>)[];
|
|
70
|
+
declare const mapToUnvalidatedPromoCodes: (promoAttributes: TPromoCodeAttribute[]) => TUnvalidatedPromoRequest;
|
|
83
71
|
/**
|
|
84
72
|
* @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted
|
|
85
73
|
* @param {string} apiKey API key for storage scoping
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promoManager.esm.js","sources":["../../src/utils/promoManager.ts"],"sourcesContent":["import { Discount, TBeamCartLocalStorage } from \"../shared/cart-contents\";\nimport {\n TPromoCodeAttribute,\n PromoCodeSource,\n TPromoCodeRequest,\n TPromoCodeResponse,\n TValidatedPromoResponse,\n TUnvalidatedPromoRequest,\n PROMO_LOCAL_STORAGE_KEY,\n PROMO_CODES_COOKIE_NAME,\n TUnvalidatedPromoCode,\n} from \"../shared/promo-types\";\nimport { LocalStorageError } from \"./beam-errors\";\nimport { getCookieValue, setCookieValue } from \"./cookies\";\nimport { createScopedLocalStorage } from \"./local-storage\";\nimport { logger } from \"./logger\";\n\nconst URL_QUERY_PARAM_CHAR_LIMIT = 100;\nconst ALLOWED_URL_PREFIX = \"utm_\";\n// Standard name for Shopify's discount tracking cookie\nconst DISCOUNT_CODE_COOKIE_NAME = \"discount_code\";\n// < --------- Cookie ------- >\n\n/**\n * Retrieves all validated promo codes stored in the \"beam_promo_codes\" cookie and parses it\n *\n * @returns {TPromoCodeResponse | undefined} An array of `ValidatedPromoCode` objects if found and parsed successfully, otherwise `undefined`\n */\nexport const getAllPromoCodesFromCookie = (): TPromoCodeResponse | undefined => {\n const promoCodesString = getCookieValue(PROMO_CODES_COOKIE_NAME);\n\n if (!promoCodesString) return undefined;\n\n try {\n const promoCodes: TPromoCodeResponse = JSON.parse(promoCodesString);\n return promoCodes;\n } catch (error) {\n logger.error(\"Failed to parse beam_promo_codes cookie:\", error);\n return undefined;\n }\n};\n\n/**\n * Stores the validated promo codes in the \"beam_promo_codes\" cookie, replaces and does not merge\n *\n * @param {TValidatedPromoResponse} validatedPromoCodes\n * @param {string} domain\n */\nexport const setPromoCodeInCookie = ({\n validatedPromoCodes,\n domain,\n}: {\n validatedPromoCodes: TValidatedPromoResponse;\n domain?: string;\n}) => {\n const promoCodeData = {\n validatedPromoCodes: validatedPromoCodes,\n };\n const threeMonthsFromNow = Date.now() + 1000 * 60 * 60 * 24 * 90;\n\n setCookieValue({\n name: PROMO_CODES_COOKIE_NAME,\n value: JSON.stringify(promoCodeData),\n path: \"/\",\n domain,\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: threeMonthsFromNow,\n });\n};\n\n// < --------- Local Storage ------- >\n/**\n * Retrieves promo codes from localStorage, scoped by API key\n * @param {string} apiKey API key used for storage scoping\n * @returns {TPromoCodeRequest | null} - Returns stored promo codes object containing both\n * validated and unvalidated codes\n * - If no codes exist, returns a fresh object with empty arrays\n *\n */\nexport const getPromoCodesLocalStorage = ({ apiKey }: { apiKey: string }): TPromoCodeRequest | null => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to get promo codes\"));\n return null;\n }\n\n const storage = createScopedLocalStorage({ apiKey });\n const allPromos = storage.getItemJson<TPromoCodeRequest>(PROMO_LOCAL_STORAGE_KEY) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n return allPromos;\n};\n\n/**\n * Sets promo codes in localStorage\n * @param {TPromoCodeRequest} promoCodes New promo codes to add\n * @param {string} apiKey API key for storage scoping\n */\nexport const setPromoCodesInLocalStorage = ({\n apiKey,\n promoCodes,\n}: {\n apiKey?: string;\n promoCodes: Partial<TPromoCodeRequest>;\n}): void => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to set promo codes\"));\n return;\n }\n const storage = createScopedLocalStorage({ apiKey });\n const completePromoCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: promoCodes?.unvalidatedPromoCodes || [],\n validatedPromoCodes: promoCodes?.validatedPromoCodes || [],\n };\n storage.setItemJson(PROMO_LOCAL_STORAGE_KEY, completePromoCodes);\n};\n\n/**\n * Merges new promo codes with existing ones and returns the combined result\n * @param {Partial<TPromoCodeRequest>} newPromos New promo codes to add\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n * @example\n * const result = mergePromoCodes({\n * apiKey: 'beam_123',\n * newPromos: {\n * unvalidatedPromoCodes: [\n * { type: 'manual', attributes: { value: 'WINTER20' } },\n * { type: 'url', attributes: { url: 'www.example.com/?promo=HOLIDAY25' } }\n * ]\n * }\n * });\n */\nexport const mergeStoreAndReturnPromos = ({\n newPromos,\n apiKey,\n}: {\n newPromos: Partial<TPromoCodeRequest>;\n apiKey: string;\n}): TPromoCodeRequest => {\n const existing = getPromoCodesLocalStorage({ apiKey }) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n const uniqueNewUnvalidatedPromos = (newPromos?.unvalidatedPromoCodes || []).filter((newPromo) => {\n const isDuplicate = existing.unvalidatedPromoCodes.some((existingPromo) => {\n return JSON.stringify(existingPromo) === JSON.stringify(newPromo);\n });\n return !isDuplicate;\n });\n\n const mergedCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: [...existing.unvalidatedPromoCodes, ...uniqueNewUnvalidatedPromos],\n validatedPromoCodes: [...existing.validatedPromoCodes, ...(newPromos?.validatedPromoCodes || [])],\n };\n\n const shouldStore = mergedCodes.unvalidatedPromoCodes.length > 0 || mergedCodes.validatedPromoCodes.length > 0;\n\n if (shouldStore) {\n setPromoCodesInLocalStorage({ apiKey, promoCodes: mergedCodes });\n }\n return {\n ...mergedCodes,\n };\n};\n\n/**\n * Formats unvalidated promo codes by determining their source and attributes\n * The function will assign `QueryParam` as the source if a `url` exists,\n * otherwise, it will assign `Manual` as the source\n *\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @returns {TUnvalidatedPromoRequest} - An array of UnvalidatedPromoCode objects,\n * each with a source and attributes object\n */\nexport const mapToUnvalidatedPromoCodes = (promoAttributes: TPromoCodeAttribute[]): TUnvalidatedPromoRequest => {\n return promoAttributes.reduce<TUnvalidatedPromoRequest>((acc, attr) => {\n const result: TUnvalidatedPromoRequest = acc || [];\n if (attr.url) {\n result.push({\n type: PromoCodeSource.Url,\n attributes: { url: attr.url },\n });\n } else if (attr.value) {\n result.push({\n type: PromoCodeSource.Manual,\n attributes: { value: attr.value },\n });\n } else {\n logger.error(\"Invalid PromoAttribute - must contain either 'url' or 'value'\", { attr });\n }\n return result;\n }, []);\n};\n\n/**\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n */\nexport const formatStoreAndReturnPromoCodes = (\n promoAttributes: TPromoCodeAttribute[],\n apiKey: string\n): TPromoCodeRequest => {\n const unvalidatedPromoCodes = mapToUnvalidatedPromoCodes(promoAttributes);\n return mergeStoreAndReturnPromos({ newPromos: { unvalidatedPromoCodes }, apiKey });\n};\n\n/**\n * Extracts applicable promo codes from the cart object\n * This function retrieves discounts stored in the cart's `content.discounts` array,\n * filters out only the applicable promo codes, and returns them as an array of strings\n *\n * @param {TBeamCartLocalStorage} cart The cart object retrieved from local storage\n * @returns {string[]} An array of applicable promo codes\n */\nexport const getPromoCodesFromCart = (cart: TBeamCartLocalStorage): string[] => {\n if (!cart?.content) return [];\n\n const cartLevelCodes = cart.content.discounts?.filter((d) => d.applicable)?.map((d) => d.code) || [];\n\n const itemLevelCodes =\n cart.content.items?.flatMap(\n (item) => item.discounts?.filter((d: Discount) => d.applicable)?.map((d: Discount) => d.code) || []\n ) || [];\n\n const allCodes = [...cartLevelCodes, ...itemLevelCodes];\n\n return [...new Set(allCodes)];\n};\n\n/**\n * Gets promo code exclusively from Shopify discount cookie\n * @returns {string | null} Single discount code or null if not found\n */\nexport const getPromoCodeFromShopifyCookie = (): string | null => {\n return getCookieValue(DISCOUNT_CODE_COOKIE_NAME) ?? null;\n};\n\n/**\n * Safely parses a JSON string into an array of strings\n * If parsing fails or the input is not a valid JSON array, it returns an empty array\n *\n * @param {string | undefined | null} jsonString The JSON string to parse\n * @returns {string[]} The parsed array of strings or an empty array if parsing fails\n */\nexport const parseJsonStringArray = (jsonString: string | undefined | null): string[] => {\n if (!jsonString) return [];\n try {\n const parsed = JSON.parse(jsonString);\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\n return parsed;\n }\n return [];\n } catch (error) {\n logger.error(\"Failed to parse JSON:\", error);\n return [];\n }\n};\n\n/**\n * Retrieves and sanitizes the current URL for storage, preserving only safe query parameters\n *\n * @returns {TPromoCodeAttribute} Returns an object with only the `url` property set\n */\nexport const getSanitizedUrlForStorage = (): TPromoCodeAttribute | undefined => {\n try {\n const url = new URL(window.location.href);\n\n if (!url.search) return undefined;\n\n // Create NEW URL instead of modifying existing one\n const cleanUrl = new URL(url.origin + url.pathname);\n let hasValidParams = false;\n\n // Process all parameters\n url.searchParams.forEach((value, key) => {\n const isAllowed = key.startsWith(ALLOWED_URL_PREFIX);\n const isValidLength = value.length <= URL_QUERY_PARAM_CHAR_LIMIT;\n\n if (isAllowed && isValidLength) {\n cleanUrl.searchParams.append(key, value);\n hasValidParams = true;\n }\n });\n\n const finalUrl = cleanUrl.toString();\n return hasValidParams ? { url: finalUrl } : undefined;\n } catch (error) {\n return undefined;\n }\n};\n\nexport const promoCodesAreEqual = (a: TPromoCodeRequest, b: TPromoCodeRequest): boolean => {\n const extract = (codes: unknown): string => {\n const validCodes = (Array.isArray(codes) ? codes : []) as TUnvalidatedPromoCode[];\n\n const flattened = validCodes\n .map((c) => {\n if (c.type === \"manual\") {\n return c.attributes?.value;\n }\n if (c.type === \"url\") {\n return c.attributes?.url;\n }\n return \"\";\n })\n .filter(Boolean)\n .sort()\n .join(\",\");\n return flattened;\n };\n\n return extract(a?.unvalidatedPromoCodes) === extract(b?.unvalidatedPromoCodes);\n};\n\nexport const isEmptyPromoData = (promos: {\n unvalidatedPromoCodes?: unknown[];\n validatedPromoCodes?: unknown[];\n}): boolean => {\n return (\n (!promos.unvalidatedPromoCodes || promos.unvalidatedPromoCodes.length === 0) &&\n (!promos.validatedPromoCodes || promos.validatedPromoCodes.length === 0)\n );\n};\n"],"names":["URL_QUERY_PARAM_CHAR_LIMIT","ALLOWED_URL_PREFIX","DISCOUNT_CODE_COOKIE_NAME","getAllPromoCodesFromCookie","promoCodesString","getCookieValue","PROMO_CODES_COOKIE_NAME","error","logger","setPromoCodeInCookie","validatedPromoCodes","domain","promoCodeData","threeMonthsFromNow","setCookieValue","getPromoCodesLocalStorage","apiKey","createScopedLocalStorage","PROMO_LOCAL_STORAGE_KEY","LocalStorageError","setPromoCodesInLocalStorage","promoCodes","storage","completePromoCodes","mergeStoreAndReturnPromos","newPromos","existing","uniqueNewUnvalidatedPromos","newPromo","existingPromo","mergedCodes","mapToUnvalidatedPromoCodes","promoAttributes","acc","attr","result","PromoCodeSource","formatStoreAndReturnPromoCodes","unvalidatedPromoCodes","getPromoCodesFromCart","cart","cartLevelCodes","d","itemLevelCodes","item","allCodes","getPromoCodeFromShopifyCookie","parseJsonStringArray","jsonString","parsed","getSanitizedUrlForStorage","url","cleanUrl","hasValidParams","value","key","isAllowed","isValidLength","finalUrl","promoCodesAreEqual","a","b","extract","codes","c","isEmptyPromoData","promos"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"promoManager.esm.js","sources":["../../src/utils/promoManager.ts"],"sourcesContent":["import { Discount, TBeamCartLocalStorage } from \"../shared/cart-contents\";\nimport {\n TPromoCodeAttribute,\n PromoCodeSource,\n TPromoCodeRequest,\n TPromoCodeResponse,\n TValidatedPromoResponse,\n TUnvalidatedPromoRequest,\n PROMO_LOCAL_STORAGE_KEY,\n PROMO_CODES_COOKIE_NAME,\n TUnvalidatedPromoCode,\n} from \"../shared/promo-types\";\nimport { LocalStorageError } from \"./beam-errors\";\nimport { getCookieValue, setCookieValue } from \"./cookies\";\nimport { createScopedLocalStorage } from \"./local-storage\";\nimport { logger } from \"./logger\";\n\nconst URL_QUERY_PARAM_CHAR_LIMIT = 100;\nconst ALLOWED_URL_PREFIX = \"utm_\";\n// Standard name for Shopify's discount tracking cookie\nconst DISCOUNT_CODE_COOKIE_NAME = \"discount_code\";\n// < --------- Cookie ------- >\n\n/**\n * Retrieves all validated promo codes stored in the \"beam_promo_codes\" cookie and parses it\n *\n * @returns {TPromoCodeResponse | undefined} An array of `ValidatedPromoCode` objects if found and parsed successfully, otherwise `undefined`\n */\nexport const getAllPromoCodesFromCookie = (): TPromoCodeResponse | undefined => {\n const promoCodesString = getCookieValue(PROMO_CODES_COOKIE_NAME);\n\n if (!promoCodesString) return undefined;\n\n try {\n const promoCodes: TPromoCodeResponse = JSON.parse(promoCodesString);\n return promoCodes;\n } catch (error) {\n logger.error(\"Failed to parse beam_promo_codes cookie:\", error);\n return undefined;\n }\n};\n\n/**\n * Stores the validated promo codes in the \"beam_promo_codes\" cookie, replaces and does not merge\n *\n * @param {TValidatedPromoResponse} validatedPromoCodes\n * @param {string} domain\n */\nexport const setPromoCodeInCookie = ({\n validatedPromoCodes,\n domain,\n}: {\n validatedPromoCodes: TValidatedPromoResponse;\n domain?: string;\n}) => {\n const promoCodeData = {\n validatedPromoCodes: validatedPromoCodes,\n };\n const threeMonthsFromNow = Date.now() + 1000 * 60 * 60 * 24 * 90;\n\n setCookieValue({\n name: PROMO_CODES_COOKIE_NAME,\n value: JSON.stringify(promoCodeData),\n path: \"/\",\n domain,\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: threeMonthsFromNow,\n });\n};\n\n// < --------- Local Storage ------- >\n/**\n * Retrieves promo codes from localStorage, scoped by API key\n * @param {string} apiKey API key used for storage scoping\n * @returns {TPromoCodeRequest | null} - Returns stored promo codes object containing both\n * validated and unvalidated codes\n * - If no codes exist, returns a fresh object with empty arrays\n *\n */\nexport const getPromoCodesLocalStorage = ({ apiKey }: { apiKey: string }): TPromoCodeRequest | null => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to get promo codes\"));\n return null;\n }\n\n const storage = createScopedLocalStorage({ apiKey });\n const allPromos = storage.getItemJson<TPromoCodeRequest>(PROMO_LOCAL_STORAGE_KEY) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n return allPromos;\n};\n\n/**\n * Sets promo codes in localStorage\n * @param {TPromoCodeRequest} promoCodes New promo codes to add\n * @param {string} apiKey API key for storage scoping\n */\nexport const setPromoCodesInLocalStorage = ({\n apiKey,\n promoCodes,\n}: {\n apiKey?: string;\n promoCodes: Partial<TPromoCodeRequest>;\n}): void => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to set promo codes\"));\n return;\n }\n const storage = createScopedLocalStorage({ apiKey });\n const completePromoCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: promoCodes?.unvalidatedPromoCodes || [],\n validatedPromoCodes: promoCodes?.validatedPromoCodes || [],\n };\n storage.setItemJson(PROMO_LOCAL_STORAGE_KEY, completePromoCodes);\n};\n\n/**\n * Merges new promo codes with existing ones and returns the combined result\n * @param {Partial<TPromoCodeRequest>} newPromos New promo codes to add\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n * @example\n * const result = mergePromoCodes({\n * apiKey: 'beam_123',\n * newPromos: {\n * unvalidatedPromoCodes: [\n * { type: 'manual', attributes: { value: 'WINTER20' } },\n * { type: 'url', attributes: { url: 'www.example.com/?promo=HOLIDAY25' } }\n * ]\n * }\n * });\n */\nexport const mergeStoreAndReturnPromos = ({\n newPromos,\n apiKey,\n}: {\n newPromos: Partial<TPromoCodeRequest>;\n apiKey: string;\n}): TPromoCodeRequest => {\n const existing = getPromoCodesLocalStorage({ apiKey }) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n const uniqueNewUnvalidatedPromos = (newPromos?.unvalidatedPromoCodes || []).filter((newPromo) => {\n const isDuplicate = existing.unvalidatedPromoCodes.some((existingPromo) => {\n return JSON.stringify(existingPromo) === JSON.stringify(newPromo);\n });\n return !isDuplicate;\n });\n\n const mergedCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: [...existing.unvalidatedPromoCodes, ...uniqueNewUnvalidatedPromos],\n validatedPromoCodes: [...existing.validatedPromoCodes, ...(newPromos?.validatedPromoCodes || [])],\n };\n\n const shouldStore = mergedCodes.unvalidatedPromoCodes.length > 0 || mergedCodes.validatedPromoCodes.length > 0;\n\n if (shouldStore) {\n setPromoCodesInLocalStorage({ apiKey, promoCodes: mergedCodes });\n }\n return {\n ...mergedCodes,\n };\n};\n\n/**\n * Formats unvalidated promo codes by determining their source and attributes\n * The function will assign `QueryParam` as the source if a `url` exists,\n * otherwise, it will assign `Manual` as the source\n *\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @returns {TUnvalidatedPromoRequest} - An array of UnvalidatedPromoCode objects,\n * each with a source and attributes object\n */\nexport const mapToUnvalidatedPromoCodes = (promoAttributes: TPromoCodeAttribute[]): TUnvalidatedPromoRequest => {\n return promoAttributes.reduce<TUnvalidatedPromoRequest>((acc, attr) => {\n const result: TUnvalidatedPromoRequest = acc || [];\n if (attr.url) {\n result.push({\n type: PromoCodeSource.Url,\n attributes: { url: attr.url },\n });\n } else if (attr.value) {\n result.push({\n type: PromoCodeSource.Manual,\n attributes: { value: attr.value },\n });\n } else {\n logger.error(\"Invalid PromoAttribute - must contain either 'url' or 'value'\", { attr });\n }\n return result;\n }, []);\n};\n\n/**\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n */\nexport const formatStoreAndReturnPromoCodes = (\n promoAttributes: TPromoCodeAttribute[],\n apiKey: string,\n): TPromoCodeRequest => {\n const unvalidatedPromoCodes = mapToUnvalidatedPromoCodes(promoAttributes);\n return mergeStoreAndReturnPromos({ newPromos: { unvalidatedPromoCodes }, apiKey });\n};\n\n/**\n * Extracts applicable promo codes from the cart object\n * This function retrieves discounts stored in the cart's `content.discounts` array,\n * filters out only the applicable promo codes, and returns them as an array of strings\n *\n * @param {TBeamCartLocalStorage} cart The cart object retrieved from local storage\n * @returns {string[]} An array of applicable promo codes\n */\nexport const getPromoCodesFromCart = (cart: TBeamCartLocalStorage): string[] => {\n if (!cart?.content) return [];\n\n const cartLevelCodes = cart.content.discounts?.filter((d) => d.applicable)?.map((d) => d.code) || [];\n\n const itemLevelCodes =\n cart.content.items?.flatMap(\n (item) => item.discounts?.filter((d: Discount) => d.applicable)?.map((d: Discount) => d.code) || [],\n ) || [];\n\n const allCodes = [...cartLevelCodes, ...itemLevelCodes];\n\n return [...new Set(allCodes)];\n};\n\n/**\n * Gets promo code exclusively from Shopify discount cookie\n * @returns {string | null} Single discount code or null if not found\n */\nexport const getPromoCodeFromShopifyCookie = (): string | null => {\n return getCookieValue(DISCOUNT_CODE_COOKIE_NAME) ?? null;\n};\n\n/**\n * Safely parses a JSON string into an array of strings\n * If parsing fails or the input is not a valid JSON array, it returns an empty array\n *\n * @param {string | undefined | null} jsonString The JSON string to parse\n * @returns {string[]} The parsed array of strings or an empty array if parsing fails\n */\nexport const parseJsonStringArray = (jsonString: string | undefined | null): string[] => {\n if (!jsonString) return [];\n try {\n const parsed = JSON.parse(jsonString);\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\n return parsed;\n }\n return [];\n } catch (error) {\n logger.error(\"Failed to parse JSON:\", error);\n return [];\n }\n};\n\n/**\n * Retrieves and sanitizes the current URL for storage, preserving only safe query parameters\n *\n * @returns {TPromoCodeAttribute} Returns an object with only the `url` property set\n */\nexport const getSanitizedUrlForStorage = (): TPromoCodeAttribute | undefined => {\n try {\n const url = new URL(window.location.href);\n\n if (!url.search) return undefined;\n\n // Create NEW URL instead of modifying existing one\n const cleanUrl = new URL(url.origin + url.pathname);\n let hasValidParams = false;\n\n // Process all parameters\n url.searchParams.forEach((value, key) => {\n const isAllowed = key.startsWith(ALLOWED_URL_PREFIX);\n const isValidLength = value.length <= URL_QUERY_PARAM_CHAR_LIMIT;\n\n if (isAllowed && isValidLength) {\n cleanUrl.searchParams.append(key, value);\n hasValidParams = true;\n }\n });\n\n const finalUrl = cleanUrl.toString();\n return hasValidParams ? { url: finalUrl } : undefined;\n } catch (error) {\n return undefined;\n }\n};\n\nexport const promoCodesAreEqual = (a: TPromoCodeRequest, b: TPromoCodeRequest): boolean => {\n const extract = (codes: unknown): string => {\n const validCodes = (Array.isArray(codes) ? codes : []) as TUnvalidatedPromoCode[];\n\n const flattened = validCodes\n .map((c) => {\n if (c.type === \"manual\") {\n return c.attributes?.value;\n }\n if (c.type === \"url\") {\n return c.attributes?.url;\n }\n return \"\";\n })\n .filter(Boolean)\n .sort()\n .join(\",\");\n return flattened;\n };\n\n return extract(a?.unvalidatedPromoCodes) === extract(b?.unvalidatedPromoCodes);\n};\n\nexport const isEmptyPromoData = (promos: {\n unvalidatedPromoCodes?: unknown[];\n validatedPromoCodes?: unknown[];\n}): boolean => {\n return (\n (!promos.unvalidatedPromoCodes || promos.unvalidatedPromoCodes.length === 0) &&\n (!promos.validatedPromoCodes || promos.validatedPromoCodes.length === 0)\n );\n};\n"],"names":["URL_QUERY_PARAM_CHAR_LIMIT","ALLOWED_URL_PREFIX","DISCOUNT_CODE_COOKIE_NAME","getAllPromoCodesFromCookie","promoCodesString","getCookieValue","PROMO_CODES_COOKIE_NAME","error","logger","setPromoCodeInCookie","validatedPromoCodes","domain","promoCodeData","threeMonthsFromNow","setCookieValue","getPromoCodesLocalStorage","apiKey","createScopedLocalStorage","PROMO_LOCAL_STORAGE_KEY","LocalStorageError","setPromoCodesInLocalStorage","promoCodes","storage","completePromoCodes","mergeStoreAndReturnPromos","newPromos","existing","uniqueNewUnvalidatedPromos","newPromo","existingPromo","mergedCodes","mapToUnvalidatedPromoCodes","promoAttributes","acc","attr","result","PromoCodeSource","formatStoreAndReturnPromoCodes","unvalidatedPromoCodes","getPromoCodesFromCart","cart","cartLevelCodes","d","itemLevelCodes","item","allCodes","getPromoCodeFromShopifyCookie","parseJsonStringArray","jsonString","parsed","getSanitizedUrlForStorage","url","cleanUrl","hasValidParams","value","key","isAllowed","isValidLength","finalUrl","promoCodesAreEqual","a","b","extract","codes","c","isEmptyPromoData","promos"],"mappings":"mTAiBA,MAAMA,EAA6B,IAC7BC,EAAqB,OAErBC,EAA4B,gBAQrBC,EAA6B,IAAsC,CAC9E,MAAMC,EAAmBC,EAAeC,CAAuB,EAE/D,GAAKF,EAEL,GAAI,CAEF,OADuC,KAAK,MAAMA,CAAgB,CAEpE,OAASG,EAAO,CACdC,EAAO,MAAM,2CAA4CD,CAAK,EAC9D,MACF,CACF,EAQaE,EAAuB,CAAC,CACnC,oBAAAC,EACA,OAAAC,CACF,IAGM,CACJ,MAAMC,EAAgB,CACpB,oBAAqBF,CACvB,EACMG,EAAqB,KAAK,IAAA,EAAQ,IAAO,GAAK,GAAK,GAAK,GAE9DC,EAAe,CACb,KAAMR,EACN,MAAO,KAAK,UAAUM,CAAa,EACnC,KAAM,IACN,OAAAD,EAEA,QAASE,CACX,CAAC,CACH,EAWaE,EAA4B,CAAC,CAAE,OAAAC,CAAO,IAC5CA,EAKWC,EAAyB,CAAE,OAAAD,CAAO,CAAC,EACzB,YAA+BE,CAAuB,GAAK,CACnF,sBAAuB,CAAA,EACvB,oBAAqB,CAAA,CACvB,GAREV,EAAO,MAAM,IAAIW,EAAkB,wCAAwC,CAAC,EACrE,MAiBEC,EAA8B,CAAC,CAC1C,OAAAJ,EACA,WAAAK,CACF,IAGY,CACV,GAAI,CAACL,EAAQ,CACXR,EAAO,MAAM,IAAIW,EAAkB,wCAAwC,CAAC,EAC5E,MACF,CACA,MAAMG,EAAUL,EAAyB,CAAE,OAAAD,CAAO,CAAC,EAC7CO,EAAwC,CAC5C,sBAAuBF,GAAY,uBAAyB,CAAA,EAC5D,oBAAqBA,GAAY,qBAAuB,CAAA,CAC1D,EACAC,EAAQ,YAAYJ,EAAyBK,CAAkB,CACjE,EAkBaC,EAA4B,CAAC,CACxC,UAAAC,EACA,OAAAT,CACF,IAGyB,CACvB,MAAMU,EAAWX,EAA0B,CAAE,OAAAC,CAAO,CAAC,GAAK,CACxD,sBAAuB,GACvB,oBAAqB,CAAA,CACvB,EAEMW,GAA8BF,GAAW,uBAAyB,CAAA,GAAI,OAAQG,GAI3E,CAHaF,EAAS,sBAAsB,KAAMG,GAChD,KAAK,UAAUA,CAAa,IAAM,KAAK,UAAUD,CAAQ,CACjE,CAEF,EAEKE,EAAiC,CACrC,sBAAuB,CAAC,GAAGJ,EAAS,sBAAuB,GAAGC,CAA0B,EACxF,oBAAqB,CAAC,GAAGD,EAAS,oBAAqB,GAAID,GAAW,qBAAuB,CAAA,CAAG,CAClG,EAIA,OAFoBK,EAAY,sBAAsB,OAAS,GAAKA,EAAY,oBAAoB,OAAS,IAG3GV,EAA4B,CAAE,OAAAJ,EAAQ,WAAYc,CAAY,CAAC,EAE1D,CACL,GAAGA,CACL,CACF,EAWaC,EAA8BC,GAClCA,EAAgB,OAAiC,CAACC,EAAKC,IAAS,CACrE,MAAMC,EAAmCF,GAAO,GAChD,OAAIC,EAAK,IACPC,EAAO,KAAK,CACV,KAAMC,EAAgB,IACtB,WAAY,CAAE,IAAKF,EAAK,GAAI,CAC9B,CAAC,EACQA,EAAK,MACdC,EAAO,KAAK,CACV,KAAMC,EAAgB,OACtB,WAAY,CAAE,MAAOF,EAAK,KAAM,CAClC,CAAC,EAED1B,EAAO,MAAM,gEAAiE,CAAE,KAAA0B,CAAK,CAAC,EAEjFC,CACT,EAAG,EAAE,EAQME,EAAiC,CAC5CL,EACAhB,IACsB,CACtB,MAAMsB,EAAwBP,EAA2BC,CAAe,EACxE,OAAOR,EAA0B,CAAE,UAAW,CAAE,sBAAAc,CAAsB,EAAG,OAAAtB,CAAO,CAAC,CACnF,EAUauB,EAAyBC,GAA0C,CAC9E,GAAI,CAACA,GAAM,QAAS,MAAO,CAAA,EAE3B,MAAMC,EAAiBD,EAAK,QAAQ,WAAW,OAAQE,GAAMA,EAAE,UAAU,GAAG,IAAKA,GAAMA,EAAE,IAAI,GAAK,CAAA,EAE5FC,EACJH,EAAK,QAAQ,OAAO,QACjBI,GAASA,EAAK,WAAW,OAAQ,GAAgB,EAAE,UAAU,GAAG,IAAK,GAAgB,EAAE,IAAI,GAAK,CAAA,CACnG,GAAK,GAEDC,EAAW,CAAC,GAAGJ,EAAgB,GAAGE,CAAc,EAEtD,MAAO,CAAC,GAAG,IAAI,IAAIE,CAAQ,CAAC,CAC9B,EAMaC,EAAgC,IACpCzC,EAAeH,CAAyB,GAAK,KAUzC6C,EAAwBC,GAAoD,CACvF,GAAI,CAACA,EAAY,MAAO,CAAA,EACxB,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,CAAU,EACpC,OAAI,MAAM,QAAQC,CAAM,GAAKA,EAAO,MAAOL,GAAS,OAAOA,GAAS,QAAQ,EACnEK,EAEF,CAAA,CACT,OAAS1C,EAAO,CACd,OAAAC,EAAO,MAAM,wBAAyBD,CAAK,EACpC,CAAA,CACT,CACF,EAOa2C,EAA4B,IAAuC,CAC9E,GAAI,CACF,MAAMC,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAExC,GAAI,CAACA,EAAI,OAAQ,OAGjB,MAAMC,EAAW,IAAI,IAAID,EAAI,OAASA,EAAI,QAAQ,EAClD,IAAIE,EAAiB,GAGrBF,EAAI,aAAa,QAAQ,CAACG,EAAOC,IAAQ,CACvC,MAAMC,EAAYD,EAAI,WAAWtD,CAAkB,EAC7CwD,EAAgBH,EAAM,QAAUtD,EAElCwD,GAAaC,IACfL,EAAS,aAAa,OAAOG,EAAKD,CAAK,EACvCD,EAAiB,GAErB,CAAC,EAED,MAAMK,EAAWN,EAAS,SAAA,EAC1B,OAAOC,EAAiB,CAAE,IAAKK,CAAS,EAAI,MAC9C,MAAgB,CACd,MACF,CACF,EAEaC,EAAqB,CAACC,EAAsBC,IAAkC,CACzF,MAAMC,EAAWC,IACK,MAAM,QAAQA,CAAK,EAAIA,EAAQ,CAAA,GAGhD,IAAKC,GACAA,EAAE,OAAS,SACNA,EAAE,YAAY,MAEnBA,EAAE,OAAS,MACNA,EAAE,YAAY,IAEhB,EACR,EACA,OAAO,OAAO,EACd,KAAA,EACA,KAAK,GAAG,EAIb,OAAOF,EAAQF,GAAG,qBAAqB,IAAME,EAAQD,GAAG,qBAAqB,CAC/E,EAEaI,EAAoBC,IAK5B,CAACA,EAAO,uBAAyBA,EAAO,sBAAsB,SAAW,KACzE,CAACA,EAAO,qBAAuBA,EAAO,oBAAoB,SAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promoManager.js","sources":["../../src/utils/promoManager.ts"],"sourcesContent":["import { Discount, TBeamCartLocalStorage } from \"../shared/cart-contents\";\nimport {\n TPromoCodeAttribute,\n PromoCodeSource,\n TPromoCodeRequest,\n TPromoCodeResponse,\n TValidatedPromoResponse,\n TUnvalidatedPromoRequest,\n PROMO_LOCAL_STORAGE_KEY,\n PROMO_CODES_COOKIE_NAME,\n TUnvalidatedPromoCode,\n} from \"../shared/promo-types\";\nimport { LocalStorageError } from \"./beam-errors\";\nimport { getCookieValue, setCookieValue } from \"./cookies\";\nimport { createScopedLocalStorage } from \"./local-storage\";\nimport { logger } from \"./logger\";\n\nconst URL_QUERY_PARAM_CHAR_LIMIT = 100;\nconst ALLOWED_URL_PREFIX = \"utm_\";\n// Standard name for Shopify's discount tracking cookie\nconst DISCOUNT_CODE_COOKIE_NAME = \"discount_code\";\n// < --------- Cookie ------- >\n\n/**\n * Retrieves all validated promo codes stored in the \"beam_promo_codes\" cookie and parses it\n *\n * @returns {TPromoCodeResponse | undefined} An array of `ValidatedPromoCode` objects if found and parsed successfully, otherwise `undefined`\n */\nexport const getAllPromoCodesFromCookie = (): TPromoCodeResponse | undefined => {\n const promoCodesString = getCookieValue(PROMO_CODES_COOKIE_NAME);\n\n if (!promoCodesString) return undefined;\n\n try {\n const promoCodes: TPromoCodeResponse = JSON.parse(promoCodesString);\n return promoCodes;\n } catch (error) {\n logger.error(\"Failed to parse beam_promo_codes cookie:\", error);\n return undefined;\n }\n};\n\n/**\n * Stores the validated promo codes in the \"beam_promo_codes\" cookie, replaces and does not merge\n *\n * @param {TValidatedPromoResponse} validatedPromoCodes\n * @param {string} domain\n */\nexport const setPromoCodeInCookie = ({\n validatedPromoCodes,\n domain,\n}: {\n validatedPromoCodes: TValidatedPromoResponse;\n domain?: string;\n}) => {\n const promoCodeData = {\n validatedPromoCodes: validatedPromoCodes,\n };\n const threeMonthsFromNow = Date.now() + 1000 * 60 * 60 * 24 * 90;\n\n setCookieValue({\n name: PROMO_CODES_COOKIE_NAME,\n value: JSON.stringify(promoCodeData),\n path: \"/\",\n domain,\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: threeMonthsFromNow,\n });\n};\n\n// < --------- Local Storage ------- >\n/**\n * Retrieves promo codes from localStorage, scoped by API key\n * @param {string} apiKey API key used for storage scoping\n * @returns {TPromoCodeRequest | null} - Returns stored promo codes object containing both\n * validated and unvalidated codes\n * - If no codes exist, returns a fresh object with empty arrays\n *\n */\nexport const getPromoCodesLocalStorage = ({ apiKey }: { apiKey: string }): TPromoCodeRequest | null => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to get promo codes\"));\n return null;\n }\n\n const storage = createScopedLocalStorage({ apiKey });\n const allPromos = storage.getItemJson<TPromoCodeRequest>(PROMO_LOCAL_STORAGE_KEY) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n return allPromos;\n};\n\n/**\n * Sets promo codes in localStorage\n * @param {TPromoCodeRequest} promoCodes New promo codes to add\n * @param {string} apiKey API key for storage scoping\n */\nexport const setPromoCodesInLocalStorage = ({\n apiKey,\n promoCodes,\n}: {\n apiKey?: string;\n promoCodes: Partial<TPromoCodeRequest>;\n}): void => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to set promo codes\"));\n return;\n }\n const storage = createScopedLocalStorage({ apiKey });\n const completePromoCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: promoCodes?.unvalidatedPromoCodes || [],\n validatedPromoCodes: promoCodes?.validatedPromoCodes || [],\n };\n storage.setItemJson(PROMO_LOCAL_STORAGE_KEY, completePromoCodes);\n};\n\n/**\n * Merges new promo codes with existing ones and returns the combined result\n * @param {Partial<TPromoCodeRequest>} newPromos New promo codes to add\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n * @example\n * const result = mergePromoCodes({\n * apiKey: 'beam_123',\n * newPromos: {\n * unvalidatedPromoCodes: [\n * { type: 'manual', attributes: { value: 'WINTER20' } },\n * { type: 'url', attributes: { url: 'www.example.com/?promo=HOLIDAY25' } }\n * ]\n * }\n * });\n */\nexport const mergeStoreAndReturnPromos = ({\n newPromos,\n apiKey,\n}: {\n newPromos: Partial<TPromoCodeRequest>;\n apiKey: string;\n}): TPromoCodeRequest => {\n const existing = getPromoCodesLocalStorage({ apiKey }) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n const uniqueNewUnvalidatedPromos = (newPromos?.unvalidatedPromoCodes || []).filter((newPromo) => {\n const isDuplicate = existing.unvalidatedPromoCodes.some((existingPromo) => {\n return JSON.stringify(existingPromo) === JSON.stringify(newPromo);\n });\n return !isDuplicate;\n });\n\n const mergedCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: [...existing.unvalidatedPromoCodes, ...uniqueNewUnvalidatedPromos],\n validatedPromoCodes: [...existing.validatedPromoCodes, ...(newPromos?.validatedPromoCodes || [])],\n };\n\n const shouldStore = mergedCodes.unvalidatedPromoCodes.length > 0 || mergedCodes.validatedPromoCodes.length > 0;\n\n if (shouldStore) {\n setPromoCodesInLocalStorage({ apiKey, promoCodes: mergedCodes });\n }\n return {\n ...mergedCodes,\n };\n};\n\n/**\n * Formats unvalidated promo codes by determining their source and attributes\n * The function will assign `QueryParam` as the source if a `url` exists,\n * otherwise, it will assign `Manual` as the source\n *\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @returns {TUnvalidatedPromoRequest} - An array of UnvalidatedPromoCode objects,\n * each with a source and attributes object\n */\nexport const mapToUnvalidatedPromoCodes = (promoAttributes: TPromoCodeAttribute[]): TUnvalidatedPromoRequest => {\n return promoAttributes.reduce<TUnvalidatedPromoRequest>((acc, attr) => {\n const result: TUnvalidatedPromoRequest = acc || [];\n if (attr.url) {\n result.push({\n type: PromoCodeSource.Url,\n attributes: { url: attr.url },\n });\n } else if (attr.value) {\n result.push({\n type: PromoCodeSource.Manual,\n attributes: { value: attr.value },\n });\n } else {\n logger.error(\"Invalid PromoAttribute - must contain either 'url' or 'value'\", { attr });\n }\n return result;\n }, []);\n};\n\n/**\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n */\nexport const formatStoreAndReturnPromoCodes = (\n promoAttributes: TPromoCodeAttribute[],\n apiKey: string\n): TPromoCodeRequest => {\n const unvalidatedPromoCodes = mapToUnvalidatedPromoCodes(promoAttributes);\n return mergeStoreAndReturnPromos({ newPromos: { unvalidatedPromoCodes }, apiKey });\n};\n\n/**\n * Extracts applicable promo codes from the cart object\n * This function retrieves discounts stored in the cart's `content.discounts` array,\n * filters out only the applicable promo codes, and returns them as an array of strings\n *\n * @param {TBeamCartLocalStorage} cart The cart object retrieved from local storage\n * @returns {string[]} An array of applicable promo codes\n */\nexport const getPromoCodesFromCart = (cart: TBeamCartLocalStorage): string[] => {\n if (!cart?.content) return [];\n\n const cartLevelCodes = cart.content.discounts?.filter((d) => d.applicable)?.map((d) => d.code) || [];\n\n const itemLevelCodes =\n cart.content.items?.flatMap(\n (item) => item.discounts?.filter((d: Discount) => d.applicable)?.map((d: Discount) => d.code) || []\n ) || [];\n\n const allCodes = [...cartLevelCodes, ...itemLevelCodes];\n\n return [...new Set(allCodes)];\n};\n\n/**\n * Gets promo code exclusively from Shopify discount cookie\n * @returns {string | null} Single discount code or null if not found\n */\nexport const getPromoCodeFromShopifyCookie = (): string | null => {\n return getCookieValue(DISCOUNT_CODE_COOKIE_NAME) ?? null;\n};\n\n/**\n * Safely parses a JSON string into an array of strings\n * If parsing fails or the input is not a valid JSON array, it returns an empty array\n *\n * @param {string | undefined | null} jsonString The JSON string to parse\n * @returns {string[]} The parsed array of strings or an empty array if parsing fails\n */\nexport const parseJsonStringArray = (jsonString: string | undefined | null): string[] => {\n if (!jsonString) return [];\n try {\n const parsed = JSON.parse(jsonString);\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\n return parsed;\n }\n return [];\n } catch (error) {\n logger.error(\"Failed to parse JSON:\", error);\n return [];\n }\n};\n\n/**\n * Retrieves and sanitizes the current URL for storage, preserving only safe query parameters\n *\n * @returns {TPromoCodeAttribute} Returns an object with only the `url` property set\n */\nexport const getSanitizedUrlForStorage = (): TPromoCodeAttribute | undefined => {\n try {\n const url = new URL(window.location.href);\n\n if (!url.search) return undefined;\n\n // Create NEW URL instead of modifying existing one\n const cleanUrl = new URL(url.origin + url.pathname);\n let hasValidParams = false;\n\n // Process all parameters\n url.searchParams.forEach((value, key) => {\n const isAllowed = key.startsWith(ALLOWED_URL_PREFIX);\n const isValidLength = value.length <= URL_QUERY_PARAM_CHAR_LIMIT;\n\n if (isAllowed && isValidLength) {\n cleanUrl.searchParams.append(key, value);\n hasValidParams = true;\n }\n });\n\n const finalUrl = cleanUrl.toString();\n return hasValidParams ? { url: finalUrl } : undefined;\n } catch (error) {\n return undefined;\n }\n};\n\nexport const promoCodesAreEqual = (a: TPromoCodeRequest, b: TPromoCodeRequest): boolean => {\n const extract = (codes: unknown): string => {\n const validCodes = (Array.isArray(codes) ? codes : []) as TUnvalidatedPromoCode[];\n\n const flattened = validCodes\n .map((c) => {\n if (c.type === \"manual\") {\n return c.attributes?.value;\n }\n if (c.type === \"url\") {\n return c.attributes?.url;\n }\n return \"\";\n })\n .filter(Boolean)\n .sort()\n .join(\",\");\n return flattened;\n };\n\n return extract(a?.unvalidatedPromoCodes) === extract(b?.unvalidatedPromoCodes);\n};\n\nexport const isEmptyPromoData = (promos: {\n unvalidatedPromoCodes?: unknown[];\n validatedPromoCodes?: unknown[];\n}): boolean => {\n return (\n (!promos.unvalidatedPromoCodes || promos.unvalidatedPromoCodes.length === 0) &&\n (!promos.validatedPromoCodes || promos.validatedPromoCodes.length === 0)\n );\n};\n"],"names":["URL_QUERY_PARAM_CHAR_LIMIT","ALLOWED_URL_PREFIX","DISCOUNT_CODE_COOKIE_NAME","getAllPromoCodesFromCookie","promoCodesString","getCookieValue","PROMO_CODES_COOKIE_NAME","error","logger","setPromoCodeInCookie","validatedPromoCodes","domain","promoCodeData","threeMonthsFromNow","setCookieValue","getPromoCodesLocalStorage","apiKey","createScopedLocalStorage","PROMO_LOCAL_STORAGE_KEY","LocalStorageError","setPromoCodesInLocalStorage","promoCodes","storage","completePromoCodes","mergeStoreAndReturnPromos","newPromos","existing","uniqueNewUnvalidatedPromos","newPromo","existingPromo","mergedCodes","mapToUnvalidatedPromoCodes","promoAttributes","acc","attr","result","PromoCodeSource","formatStoreAndReturnPromoCodes","unvalidatedPromoCodes","getPromoCodesFromCart","cart","cartLevelCodes","d","itemLevelCodes","item","allCodes","getPromoCodeFromShopifyCookie","parseJsonStringArray","jsonString","parsed","getSanitizedUrlForStorage","url","cleanUrl","hasValidParams","value","key","isAllowed","isValidLength","finalUrl","promoCodesAreEqual","a","b","extract","codes","c","isEmptyPromoData","promos"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"promoManager.js","sources":["../../src/utils/promoManager.ts"],"sourcesContent":["import { Discount, TBeamCartLocalStorage } from \"../shared/cart-contents\";\nimport {\n TPromoCodeAttribute,\n PromoCodeSource,\n TPromoCodeRequest,\n TPromoCodeResponse,\n TValidatedPromoResponse,\n TUnvalidatedPromoRequest,\n PROMO_LOCAL_STORAGE_KEY,\n PROMO_CODES_COOKIE_NAME,\n TUnvalidatedPromoCode,\n} from \"../shared/promo-types\";\nimport { LocalStorageError } from \"./beam-errors\";\nimport { getCookieValue, setCookieValue } from \"./cookies\";\nimport { createScopedLocalStorage } from \"./local-storage\";\nimport { logger } from \"./logger\";\n\nconst URL_QUERY_PARAM_CHAR_LIMIT = 100;\nconst ALLOWED_URL_PREFIX = \"utm_\";\n// Standard name for Shopify's discount tracking cookie\nconst DISCOUNT_CODE_COOKIE_NAME = \"discount_code\";\n// < --------- Cookie ------- >\n\n/**\n * Retrieves all validated promo codes stored in the \"beam_promo_codes\" cookie and parses it\n *\n * @returns {TPromoCodeResponse | undefined} An array of `ValidatedPromoCode` objects if found and parsed successfully, otherwise `undefined`\n */\nexport const getAllPromoCodesFromCookie = (): TPromoCodeResponse | undefined => {\n const promoCodesString = getCookieValue(PROMO_CODES_COOKIE_NAME);\n\n if (!promoCodesString) return undefined;\n\n try {\n const promoCodes: TPromoCodeResponse = JSON.parse(promoCodesString);\n return promoCodes;\n } catch (error) {\n logger.error(\"Failed to parse beam_promo_codes cookie:\", error);\n return undefined;\n }\n};\n\n/**\n * Stores the validated promo codes in the \"beam_promo_codes\" cookie, replaces and does not merge\n *\n * @param {TValidatedPromoResponse} validatedPromoCodes\n * @param {string} domain\n */\nexport const setPromoCodeInCookie = ({\n validatedPromoCodes,\n domain,\n}: {\n validatedPromoCodes: TValidatedPromoResponse;\n domain?: string;\n}) => {\n const promoCodeData = {\n validatedPromoCodes: validatedPromoCodes,\n };\n const threeMonthsFromNow = Date.now() + 1000 * 60 * 60 * 24 * 90;\n\n setCookieValue({\n name: PROMO_CODES_COOKIE_NAME,\n value: JSON.stringify(promoCodeData),\n path: \"/\",\n domain,\n // If we don't set an expiration, the cookie will be cleared when the tab is closed\n expires: threeMonthsFromNow,\n });\n};\n\n// < --------- Local Storage ------- >\n/**\n * Retrieves promo codes from localStorage, scoped by API key\n * @param {string} apiKey API key used for storage scoping\n * @returns {TPromoCodeRequest | null} - Returns stored promo codes object containing both\n * validated and unvalidated codes\n * - If no codes exist, returns a fresh object with empty arrays\n *\n */\nexport const getPromoCodesLocalStorage = ({ apiKey }: { apiKey: string }): TPromoCodeRequest | null => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to get promo codes\"));\n return null;\n }\n\n const storage = createScopedLocalStorage({ apiKey });\n const allPromos = storage.getItemJson<TPromoCodeRequest>(PROMO_LOCAL_STORAGE_KEY) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n return allPromos;\n};\n\n/**\n * Sets promo codes in localStorage\n * @param {TPromoCodeRequest} promoCodes New promo codes to add\n * @param {string} apiKey API key for storage scoping\n */\nexport const setPromoCodesInLocalStorage = ({\n apiKey,\n promoCodes,\n}: {\n apiKey?: string;\n promoCodes: Partial<TPromoCodeRequest>;\n}): void => {\n if (!apiKey) {\n logger.error(new LocalStorageError(\"API key is required to set promo codes\"));\n return;\n }\n const storage = createScopedLocalStorage({ apiKey });\n const completePromoCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: promoCodes?.unvalidatedPromoCodes || [],\n validatedPromoCodes: promoCodes?.validatedPromoCodes || [],\n };\n storage.setItemJson(PROMO_LOCAL_STORAGE_KEY, completePromoCodes);\n};\n\n/**\n * Merges new promo codes with existing ones and returns the combined result\n * @param {Partial<TPromoCodeRequest>} newPromos New promo codes to add\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n * @example\n * const result = mergePromoCodes({\n * apiKey: 'beam_123',\n * newPromos: {\n * unvalidatedPromoCodes: [\n * { type: 'manual', attributes: { value: 'WINTER20' } },\n * { type: 'url', attributes: { url: 'www.example.com/?promo=HOLIDAY25' } }\n * ]\n * }\n * });\n */\nexport const mergeStoreAndReturnPromos = ({\n newPromos,\n apiKey,\n}: {\n newPromos: Partial<TPromoCodeRequest>;\n apiKey: string;\n}): TPromoCodeRequest => {\n const existing = getPromoCodesLocalStorage({ apiKey }) ?? {\n unvalidatedPromoCodes: [],\n validatedPromoCodes: [],\n };\n\n const uniqueNewUnvalidatedPromos = (newPromos?.unvalidatedPromoCodes || []).filter((newPromo) => {\n const isDuplicate = existing.unvalidatedPromoCodes.some((existingPromo) => {\n return JSON.stringify(existingPromo) === JSON.stringify(newPromo);\n });\n return !isDuplicate;\n });\n\n const mergedCodes: TPromoCodeRequest = {\n unvalidatedPromoCodes: [...existing.unvalidatedPromoCodes, ...uniqueNewUnvalidatedPromos],\n validatedPromoCodes: [...existing.validatedPromoCodes, ...(newPromos?.validatedPromoCodes || [])],\n };\n\n const shouldStore = mergedCodes.unvalidatedPromoCodes.length > 0 || mergedCodes.validatedPromoCodes.length > 0;\n\n if (shouldStore) {\n setPromoCodesInLocalStorage({ apiKey, promoCodes: mergedCodes });\n }\n return {\n ...mergedCodes,\n };\n};\n\n/**\n * Formats unvalidated promo codes by determining their source and attributes\n * The function will assign `QueryParam` as the source if a `url` exists,\n * otherwise, it will assign `Manual` as the source\n *\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @returns {TUnvalidatedPromoRequest} - An array of UnvalidatedPromoCode objects,\n * each with a source and attributes object\n */\nexport const mapToUnvalidatedPromoCodes = (promoAttributes: TPromoCodeAttribute[]): TUnvalidatedPromoRequest => {\n return promoAttributes.reduce<TUnvalidatedPromoRequest>((acc, attr) => {\n const result: TUnvalidatedPromoRequest = acc || [];\n if (attr.url) {\n result.push({\n type: PromoCodeSource.Url,\n attributes: { url: attr.url },\n });\n } else if (attr.value) {\n result.push({\n type: PromoCodeSource.Manual,\n attributes: { value: attr.value },\n });\n } else {\n logger.error(\"Invalid PromoAttribute - must contain either 'url' or 'value'\", { attr });\n }\n return result;\n }, []);\n};\n\n/**\n * @param {TPromoCodeAttribute[]} promoAttributes An array of promo attributes to be formatted\n * @param {string} apiKey API key for storage scoping\n * @returns {TPromoCodeRequest} An object containing both validated and unvalidated promo codes\n */\nexport const formatStoreAndReturnPromoCodes = (\n promoAttributes: TPromoCodeAttribute[],\n apiKey: string,\n): TPromoCodeRequest => {\n const unvalidatedPromoCodes = mapToUnvalidatedPromoCodes(promoAttributes);\n return mergeStoreAndReturnPromos({ newPromos: { unvalidatedPromoCodes }, apiKey });\n};\n\n/**\n * Extracts applicable promo codes from the cart object\n * This function retrieves discounts stored in the cart's `content.discounts` array,\n * filters out only the applicable promo codes, and returns them as an array of strings\n *\n * @param {TBeamCartLocalStorage} cart The cart object retrieved from local storage\n * @returns {string[]} An array of applicable promo codes\n */\nexport const getPromoCodesFromCart = (cart: TBeamCartLocalStorage): string[] => {\n if (!cart?.content) return [];\n\n const cartLevelCodes = cart.content.discounts?.filter((d) => d.applicable)?.map((d) => d.code) || [];\n\n const itemLevelCodes =\n cart.content.items?.flatMap(\n (item) => item.discounts?.filter((d: Discount) => d.applicable)?.map((d: Discount) => d.code) || [],\n ) || [];\n\n const allCodes = [...cartLevelCodes, ...itemLevelCodes];\n\n return [...new Set(allCodes)];\n};\n\n/**\n * Gets promo code exclusively from Shopify discount cookie\n * @returns {string | null} Single discount code or null if not found\n */\nexport const getPromoCodeFromShopifyCookie = (): string | null => {\n return getCookieValue(DISCOUNT_CODE_COOKIE_NAME) ?? null;\n};\n\n/**\n * Safely parses a JSON string into an array of strings\n * If parsing fails or the input is not a valid JSON array, it returns an empty array\n *\n * @param {string | undefined | null} jsonString The JSON string to parse\n * @returns {string[]} The parsed array of strings or an empty array if parsing fails\n */\nexport const parseJsonStringArray = (jsonString: string | undefined | null): string[] => {\n if (!jsonString) return [];\n try {\n const parsed = JSON.parse(jsonString);\n if (Array.isArray(parsed) && parsed.every((item) => typeof item === \"string\")) {\n return parsed;\n }\n return [];\n } catch (error) {\n logger.error(\"Failed to parse JSON:\", error);\n return [];\n }\n};\n\n/**\n * Retrieves and sanitizes the current URL for storage, preserving only safe query parameters\n *\n * @returns {TPromoCodeAttribute} Returns an object with only the `url` property set\n */\nexport const getSanitizedUrlForStorage = (): TPromoCodeAttribute | undefined => {\n try {\n const url = new URL(window.location.href);\n\n if (!url.search) return undefined;\n\n // Create NEW URL instead of modifying existing one\n const cleanUrl = new URL(url.origin + url.pathname);\n let hasValidParams = false;\n\n // Process all parameters\n url.searchParams.forEach((value, key) => {\n const isAllowed = key.startsWith(ALLOWED_URL_PREFIX);\n const isValidLength = value.length <= URL_QUERY_PARAM_CHAR_LIMIT;\n\n if (isAllowed && isValidLength) {\n cleanUrl.searchParams.append(key, value);\n hasValidParams = true;\n }\n });\n\n const finalUrl = cleanUrl.toString();\n return hasValidParams ? { url: finalUrl } : undefined;\n } catch (error) {\n return undefined;\n }\n};\n\nexport const promoCodesAreEqual = (a: TPromoCodeRequest, b: TPromoCodeRequest): boolean => {\n const extract = (codes: unknown): string => {\n const validCodes = (Array.isArray(codes) ? codes : []) as TUnvalidatedPromoCode[];\n\n const flattened = validCodes\n .map((c) => {\n if (c.type === \"manual\") {\n return c.attributes?.value;\n }\n if (c.type === \"url\") {\n return c.attributes?.url;\n }\n return \"\";\n })\n .filter(Boolean)\n .sort()\n .join(\",\");\n return flattened;\n };\n\n return extract(a?.unvalidatedPromoCodes) === extract(b?.unvalidatedPromoCodes);\n};\n\nexport const isEmptyPromoData = (promos: {\n unvalidatedPromoCodes?: unknown[];\n validatedPromoCodes?: unknown[];\n}): boolean => {\n return (\n (!promos.unvalidatedPromoCodes || promos.unvalidatedPromoCodes.length === 0) &&\n (!promos.validatedPromoCodes || promos.validatedPromoCodes.length === 0)\n );\n};\n"],"names":["URL_QUERY_PARAM_CHAR_LIMIT","ALLOWED_URL_PREFIX","DISCOUNT_CODE_COOKIE_NAME","getAllPromoCodesFromCookie","promoCodesString","getCookieValue","PROMO_CODES_COOKIE_NAME","error","logger","setPromoCodeInCookie","validatedPromoCodes","domain","promoCodeData","threeMonthsFromNow","setCookieValue","getPromoCodesLocalStorage","apiKey","createScopedLocalStorage","PROMO_LOCAL_STORAGE_KEY","LocalStorageError","setPromoCodesInLocalStorage","promoCodes","storage","completePromoCodes","mergeStoreAndReturnPromos","newPromos","existing","uniqueNewUnvalidatedPromos","newPromo","existingPromo","mergedCodes","mapToUnvalidatedPromoCodes","promoAttributes","acc","attr","result","PromoCodeSource","formatStoreAndReturnPromoCodes","unvalidatedPromoCodes","getPromoCodesFromCart","cart","cartLevelCodes","d","itemLevelCodes","item","allCodes","getPromoCodeFromShopifyCookie","parseJsonStringArray","jsonString","parsed","getSanitizedUrlForStorage","url","cleanUrl","hasValidParams","value","key","isAllowed","isValidLength","finalUrl","promoCodesAreEqual","a","b","extract","codes","c","isEmptyPromoData","promos"],"mappings":"uSAiBA,MAAMA,EAA6B,IAC7BC,EAAqB,OAErBC,EAA4B,gBAQrBC,EAA6B,IAAsC,CAC9E,MAAMC,EAAmBC,EAAeC,CAAuB,EAE/D,GAAKF,EAEL,GAAI,CAEF,OADuC,KAAK,MAAMA,CAAgB,CAEpE,OAASG,EAAO,CACdC,EAAO,MAAM,2CAA4CD,CAAK,EAC9D,MACF,CACF,EAQaE,EAAuB,CAAC,CACnC,oBAAAC,EACA,OAAAC,CACF,IAGM,CACJ,MAAMC,EAAgB,CACpB,oBAAqBF,CACvB,EACMG,EAAqB,KAAK,IAAA,EAAQ,IAAO,GAAK,GAAK,GAAK,GAE9DC,EAAe,CACb,KAAMR,EACN,MAAO,KAAK,UAAUM,CAAa,EACnC,KAAM,IACN,OAAAD,EAEA,QAASE,CACX,CAAC,CACH,EAWaE,EAA4B,CAAC,CAAE,OAAAC,CAAO,IAC5CA,EAKWC,EAAyB,CAAE,OAAAD,CAAO,CAAC,EACzB,YAA+BE,CAAuB,GAAK,CACnF,sBAAuB,CAAA,EACvB,oBAAqB,CAAA,CACvB,GAREV,EAAO,MAAM,IAAIW,EAAkB,wCAAwC,CAAC,EACrE,MAiBEC,EAA8B,CAAC,CAC1C,OAAAJ,EACA,WAAAK,CACF,IAGY,CACV,GAAI,CAACL,EAAQ,CACXR,EAAO,MAAM,IAAIW,EAAkB,wCAAwC,CAAC,EAC5E,MACF,CACA,MAAMG,EAAUL,EAAyB,CAAE,OAAAD,CAAO,CAAC,EAC7CO,EAAwC,CAC5C,sBAAuBF,GAAY,uBAAyB,CAAA,EAC5D,oBAAqBA,GAAY,qBAAuB,CAAA,CAC1D,EACAC,EAAQ,YAAYJ,EAAyBK,CAAkB,CACjE,EAkBaC,EAA4B,CAAC,CACxC,UAAAC,EACA,OAAAT,CACF,IAGyB,CACvB,MAAMU,EAAWX,EAA0B,CAAE,OAAAC,CAAO,CAAC,GAAK,CACxD,sBAAuB,GACvB,oBAAqB,CAAA,CACvB,EAEMW,GAA8BF,GAAW,uBAAyB,CAAA,GAAI,OAAQG,GAI3E,CAHaF,EAAS,sBAAsB,KAAMG,GAChD,KAAK,UAAUA,CAAa,IAAM,KAAK,UAAUD,CAAQ,CACjE,CAEF,EAEKE,EAAiC,CACrC,sBAAuB,CAAC,GAAGJ,EAAS,sBAAuB,GAAGC,CAA0B,EACxF,oBAAqB,CAAC,GAAGD,EAAS,oBAAqB,GAAID,GAAW,qBAAuB,CAAA,CAAG,CAClG,EAIA,OAFoBK,EAAY,sBAAsB,OAAS,GAAKA,EAAY,oBAAoB,OAAS,IAG3GV,EAA4B,CAAE,OAAAJ,EAAQ,WAAYc,CAAY,CAAC,EAE1D,CACL,GAAGA,CACL,CACF,EAWaC,EAA8BC,GAClCA,EAAgB,OAAiC,CAACC,EAAKC,IAAS,CACrE,MAAMC,EAAmCF,GAAO,GAChD,OAAIC,EAAK,IACPC,EAAO,KAAK,CACV,KAAMC,EAAgB,IACtB,WAAY,CAAE,IAAKF,EAAK,GAAI,CAC9B,CAAC,EACQA,EAAK,MACdC,EAAO,KAAK,CACV,KAAMC,EAAgB,OACtB,WAAY,CAAE,MAAOF,EAAK,KAAM,CAClC,CAAC,EAED1B,EAAO,MAAM,gEAAiE,CAAE,KAAA0B,CAAK,CAAC,EAEjFC,CACT,EAAG,EAAE,EAQME,EAAiC,CAC5CL,EACAhB,IACsB,CACtB,MAAMsB,EAAwBP,EAA2BC,CAAe,EACxE,OAAOR,EAA0B,CAAE,UAAW,CAAE,sBAAAc,CAAsB,EAAG,OAAAtB,CAAO,CAAC,CACnF,EAUauB,EAAyBC,GAA0C,CAC9E,GAAI,CAACA,GAAM,QAAS,MAAO,CAAA,EAE3B,MAAMC,EAAiBD,EAAK,QAAQ,WAAW,OAAQE,GAAMA,EAAE,UAAU,GAAG,IAAKA,GAAMA,EAAE,IAAI,GAAK,CAAA,EAE5FC,EACJH,EAAK,QAAQ,OAAO,QACjBI,GAASA,EAAK,WAAW,OAAQ,GAAgB,EAAE,UAAU,GAAG,IAAK,GAAgB,EAAE,IAAI,GAAK,CAAA,CACnG,GAAK,GAEDC,EAAW,CAAC,GAAGJ,EAAgB,GAAGE,CAAc,EAEtD,MAAO,CAAC,GAAG,IAAI,IAAIE,CAAQ,CAAC,CAC9B,EAMaC,EAAgC,IACpCzC,EAAeH,CAAyB,GAAK,KAUzC6C,EAAwBC,GAAoD,CACvF,GAAI,CAACA,EAAY,MAAO,CAAA,EACxB,GAAI,CACF,MAAMC,EAAS,KAAK,MAAMD,CAAU,EACpC,OAAI,MAAM,QAAQC,CAAM,GAAKA,EAAO,MAAOL,GAAS,OAAOA,GAAS,QAAQ,EACnEK,EAEF,CAAA,CACT,OAAS1C,EAAO,CACd,OAAAC,EAAO,MAAM,wBAAyBD,CAAK,EACpC,CAAA,CACT,CACF,EAOa2C,EAA4B,IAAuC,CAC9E,GAAI,CACF,MAAMC,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EAExC,GAAI,CAACA,EAAI,OAAQ,OAGjB,MAAMC,EAAW,IAAI,IAAID,EAAI,OAASA,EAAI,QAAQ,EAClD,IAAIE,EAAiB,GAGrBF,EAAI,aAAa,QAAQ,CAACG,EAAOC,IAAQ,CACvC,MAAMC,EAAYD,EAAI,WAAWtD,CAAkB,EAC7CwD,EAAgBH,EAAM,QAAUtD,EAElCwD,GAAaC,IACfL,EAAS,aAAa,OAAOG,EAAKD,CAAK,EACvCD,EAAiB,GAErB,CAAC,EAED,MAAMK,EAAWN,EAAS,SAAA,EAC1B,OAAOC,EAAiB,CAAE,IAAKK,CAAS,EAAI,MAC9C,MAAgB,CACd,MACF,CACF,EAEaC,EAAqB,CAACC,EAAsBC,IAAkC,CACzF,MAAMC,EAAWC,IACK,MAAM,QAAQA,CAAK,EAAIA,EAAQ,CAAA,GAGhD,IAAKC,GACAA,EAAE,OAAS,SACNA,EAAE,YAAY,MAEnBA,EAAE,OAAS,MACNA,EAAE,YAAY,IAEhB,EACR,EACA,OAAO,OAAO,EACd,KAAA,EACA,KAAK,GAAG,EAIb,OAAOF,EAAQF,GAAG,qBAAqB,IAAME,EAAQD,GAAG,qBAAqB,CAC/E,EAEaI,EAAoBC,IAK5B,CAACA,EAAO,uBAAyBA,EAAO,sBAAsB,SAAW,KACzE,CAACA,EAAO,qBAAuBA,EAAO,oBAAoB,SAAW"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-element.esm.js","sources":["../../src/utils/wait-for-element.ts"],"sourcesContent":["// Based on https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e (MIT License, JWilson)\n\nimport { BeamError } from \"./beam-errors\";\n\nexport function waitForElement(selector: string, { timeout = 10000 } = {}): Promise<Element> {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n\n let mutationObserver: MutationObserver;\n\n const timer = setTimeout(() => {\n if (el) return; // no need to reject\n mutationObserver?.disconnect();\n reject(new BeamError(`Timed out waiting for '${selector}'`));\n }, timeout);\n\n new MutationObserver((_mutationRecords, observer) => {\n mutationObserver = observer;\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach((element) => {\n el = element;\n resolve(element);\n // Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n clearTimeout(timer);\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n"],"names":["waitForElement","selector","timeout","resolve","reject","el","mutationObserver","timer","BeamError","_mutationRecords","observer","element"],"mappings":"0DAIO,SAASA,EAAeC,EAAkB,CAAE,QAAAC,EAAU,GAAM,EAAI,
|
|
1
|
+
{"version":3,"file":"wait-for-element.esm.js","sources":["../../src/utils/wait-for-element.ts"],"sourcesContent":["// Based on https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e (MIT License, JWilson)\n\nimport { BeamError } from \"./beam-errors\";\n\nexport function waitForElement(selector: string, { timeout = 10000 } = {}): Promise<Element> {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n\n let mutationObserver: MutationObserver;\n\n const timer = setTimeout(() => {\n if (el) return; // no need to reject\n mutationObserver?.disconnect();\n reject(new BeamError(`Timed out waiting for '${selector}'`));\n }, timeout);\n\n new MutationObserver((_mutationRecords, observer) => {\n mutationObserver = observer;\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach((element) => {\n el = element;\n resolve(element);\n // Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n clearTimeout(timer);\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n"],"names":["waitForElement","selector","timeout","resolve","reject","el","mutationObserver","timer","BeamError","_mutationRecords","observer","element"],"mappings":"0DAIO,SAASA,EAAeC,EAAkB,CAAE,QAAAC,EAAU,GAAM,EAAI,CAAA,EAAsB,CAC3F,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,IAAIC,EAAK,SAAS,cAAcJ,CAAQ,EACxC,GAAII,EAAI,CACNF,EAAQE,CAAE,EACV,MACF,CAEA,IAAIC,EAEJ,MAAMC,EAAQ,WAAW,IAAM,CACzBF,IACJC,GAAkB,WAAA,EAClBF,EAAO,IAAII,EAAU,0BAA0BP,CAAQ,GAAG,CAAC,EAC7D,EAAGC,CAAO,EAEV,IAAI,iBAAiB,CAACO,EAAkBC,IAAa,CACnDJ,EAAmBI,EAEnB,MAAM,KAAK,SAAS,iBAAiBT,CAAQ,CAAC,EAAE,QAASU,GAAY,CACnEN,EAAKM,EACLR,EAAQQ,CAAO,EAEfD,EAAS,WAAA,EACT,aAAaH,CAAK,CACpB,CAAC,CACH,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CACnC,UAAW,GACX,QAAS,EACX,CAAC,CACH,CAAC,CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-for-element.js","sources":["../../src/utils/wait-for-element.ts"],"sourcesContent":["// Based on https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e (MIT License, JWilson)\n\nimport { BeamError } from \"./beam-errors\";\n\nexport function waitForElement(selector: string, { timeout = 10000 } = {}): Promise<Element> {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n\n let mutationObserver: MutationObserver;\n\n const timer = setTimeout(() => {\n if (el) return; // no need to reject\n mutationObserver?.disconnect();\n reject(new BeamError(`Timed out waiting for '${selector}'`));\n }, timeout);\n\n new MutationObserver((_mutationRecords, observer) => {\n mutationObserver = observer;\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach((element) => {\n el = element;\n resolve(element);\n // Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n clearTimeout(timer);\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n"],"names":["waitForElement","selector","timeout","resolve","reject","el","mutationObserver","timer","BeamError","_mutationRecords","observer","element"],"mappings":"0DAIO,SAASA,EAAeC,EAAkB,CAAE,QAAAC,EAAU,GAAM,EAAI,
|
|
1
|
+
{"version":3,"file":"wait-for-element.js","sources":["../../src/utils/wait-for-element.ts"],"sourcesContent":["// Based on https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e (MIT License, JWilson)\n\nimport { BeamError } from \"./beam-errors\";\n\nexport function waitForElement(selector: string, { timeout = 10000 } = {}): Promise<Element> {\n return new Promise((resolve, reject) => {\n let el = document.querySelector(selector);\n if (el) {\n resolve(el);\n return;\n }\n\n let mutationObserver: MutationObserver;\n\n const timer = setTimeout(() => {\n if (el) return; // no need to reject\n mutationObserver?.disconnect();\n reject(new BeamError(`Timed out waiting for '${selector}'`));\n }, timeout);\n\n new MutationObserver((_mutationRecords, observer) => {\n mutationObserver = observer;\n // Query for elements matching the specified selector\n Array.from(document.querySelectorAll(selector)).forEach((element) => {\n el = element;\n resolve(element);\n // Once we have resolved we don't need the observer anymore.\n observer.disconnect();\n clearTimeout(timer);\n });\n }).observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n });\n}\n"],"names":["waitForElement","selector","timeout","resolve","reject","el","mutationObserver","timer","BeamError","_mutationRecords","observer","element"],"mappings":"0DAIO,SAASA,EAAeC,EAAkB,CAAE,QAAAC,EAAU,GAAM,EAAI,CAAA,EAAsB,CAC3F,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,IAAIC,EAAK,SAAS,cAAcJ,CAAQ,EACxC,GAAII,EAAI,CACNF,EAAQE,CAAE,EACV,MACF,CAEA,IAAIC,EAEJ,MAAMC,EAAQ,WAAW,IAAM,CACzBF,IACJC,GAAkB,WAAA,EAClBF,EAAO,IAAII,EAAU,0BAA0BP,CAAQ,GAAG,CAAC,EAC7D,EAAGC,CAAO,EAEV,IAAI,iBAAiB,CAACO,EAAkBC,IAAa,CACnDJ,EAAmBI,EAEnB,MAAM,KAAK,SAAS,iBAAiBT,CAAQ,CAAC,EAAE,QAASU,GAAY,CACnEN,EAAKM,EACLR,EAAQQ,CAAO,EAEfD,EAAS,WAAA,EACT,aAAaH,CAAK,CACpB,CAAC,CACH,CAAC,EAAE,QAAQ,SAAS,gBAAiB,CACnC,UAAW,GACX,QAAS,EACX,CAAC,CACH,CAAC,CACH"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beamimpact/web-sdk",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.56.3",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"module": "dist/index.js",
|
|
8
8
|
"engines": {
|
|
9
|
-
"node": "^
|
|
9
|
+
"node": "^24.0.0"
|
|
10
10
|
},
|
|
11
|
-
"packageManager": "npm@
|
|
11
|
+
"packageManager": "npm@11.0.0",
|
|
12
12
|
"browserslist": [
|
|
13
13
|
"> 0.5%, last 2 versions, not dead"
|
|
14
14
|
],
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"prepublishOnly": "npm-run-all build",
|
|
36
36
|
"report:diskusage": "du -h -s dist/* dist/**/*",
|
|
37
37
|
"lint": "eslint",
|
|
38
|
-
"format": "prettier --write",
|
|
38
|
+
"format": "prettier --write .",
|
|
39
39
|
"check": "npm-run-all -p check:*",
|
|
40
40
|
"check:format": "prettier --list-different .",
|
|
41
41
|
"check:types": "tsc",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"proxy:wait": "npm-run-all dev & wait-on http://localhost:8080/empty.html",
|
|
46
46
|
"proxy:stop": "lsof -ti tcp:8080 | xargs kill",
|
|
47
47
|
"predev": "echo '💡 ️Starting:\n\\033[0;35mhttp://localhost:8080\\033[0;32m'",
|
|
48
|
-
"prepare": "husky
|
|
48
|
+
"prepare": "husky",
|
|
49
49
|
"cypress:test-components": "cypress run --component --reporter junit",
|
|
50
50
|
"cypress:test-components-interactive": "cypress open --component",
|
|
51
51
|
"test": "npm-run-all cypress:test-components-interactive",
|
|
@@ -53,49 +53,52 @@
|
|
|
53
53
|
"update-openapi-schema": "cp ../beam/packages/api-schemas/src/generated/central-backend/central-backend.ts ./src/api-sdk/openapi-spec.ts"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@lit/react": "1.0.
|
|
57
|
-
"@lukeed/uuid": "2.0.
|
|
58
|
-
"@shoelace-style/shoelace": "2.
|
|
59
|
-
"lit": "
|
|
60
|
-
"lodash-es": "4.
|
|
56
|
+
"@lit/react": "1.0.8",
|
|
57
|
+
"@lukeed/uuid": "2.0.1",
|
|
58
|
+
"@shoelace-style/shoelace": "2.20.1",
|
|
59
|
+
"lit": "3.3.2",
|
|
60
|
+
"lodash-es": "4.18.1",
|
|
61
61
|
"lucide-static": "0.292.0"
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
|
-
"@cypress/vite-dev-server": "
|
|
65
|
-
"@devcontainers/cli": "0.
|
|
66
|
-
"@
|
|
67
|
-
"@
|
|
68
|
-
"@fastify/
|
|
69
|
-
"@
|
|
70
|
-
"@
|
|
71
|
-
"@
|
|
72
|
-
"@
|
|
73
|
-
"@
|
|
64
|
+
"@cypress/vite-dev-server": "7.3.1",
|
|
65
|
+
"@devcontainers/cli": "0.86.0",
|
|
66
|
+
"@eslint/eslintrc": "3.3.5",
|
|
67
|
+
"@eslint/js": "9.39.4",
|
|
68
|
+
"@fastify/compress": "8.3.1",
|
|
69
|
+
"@fastify/cors": "11.2.0",
|
|
70
|
+
"@fastify/static": "9.1.3",
|
|
71
|
+
"@rollup/plugin-json": "6.1.0",
|
|
72
|
+
"@rollup/plugin-node-resolve": "16.0.3",
|
|
73
|
+
"@types/lodash-es": "4.17.12",
|
|
74
|
+
"@typescript-eslint/eslint-plugin": "8.59.0",
|
|
75
|
+
"@typescript-eslint/parser": "8.59.0",
|
|
74
76
|
"@web-types/lit": "2.0.0-3",
|
|
75
|
-
"browserslist": "4.
|
|
76
|
-
"commitizen": "4.3.
|
|
77
|
-
"cypress": "
|
|
77
|
+
"browserslist": "4.28.4",
|
|
78
|
+
"commitizen": "4.3.1",
|
|
79
|
+
"cypress": "15.16.0",
|
|
78
80
|
"cz-conventional-changelog": "3.3.0",
|
|
79
|
-
"esbuild": "0.
|
|
80
|
-
"eslint": "
|
|
81
|
+
"esbuild": "0.28.1",
|
|
82
|
+
"eslint": "9.39.4",
|
|
81
83
|
"eslint-config-google": "0.14.0",
|
|
82
|
-
"eslint-config-prettier": "
|
|
83
|
-
"eslint-plugin-import": "2.
|
|
84
|
-
"eslint-plugin-lit": "
|
|
84
|
+
"eslint-config-prettier": "10.1.5",
|
|
85
|
+
"eslint-plugin-import": "2.32.0",
|
|
86
|
+
"eslint-plugin-lit": "2.3.1",
|
|
85
87
|
"eslint-plugin-lodash": "7.4.0",
|
|
86
|
-
"fastify": "
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
88
|
+
"fastify": "5.8.5",
|
|
89
|
+
"globals": "17.6.0",
|
|
90
|
+
"husky": "9.1.7",
|
|
91
|
+
"lint-staged": "16.4.0",
|
|
92
|
+
"nodemon": "3.1.14",
|
|
90
93
|
"npm-run-all": "4.1.5",
|
|
91
|
-
"prettier": "
|
|
94
|
+
"prettier": "3.8.3",
|
|
92
95
|
"react": "18.2.0",
|
|
93
|
-
"rollup": "4.
|
|
96
|
+
"rollup": "4.60.2",
|
|
94
97
|
"rollup-plugin-copy": "3.5.0",
|
|
95
|
-
"rollup-plugin-dts": "6.1
|
|
96
|
-
"rollup-plugin-esbuild": "6.1
|
|
97
|
-
"typescript": "
|
|
98
|
-
"vite": "
|
|
99
|
-
"wait-on": "
|
|
98
|
+
"rollup-plugin-dts": "6.4.1",
|
|
99
|
+
"rollup-plugin-esbuild": "6.2.1",
|
|
100
|
+
"typescript": "5.9.3",
|
|
101
|
+
"vite": "7.3.6",
|
|
102
|
+
"wait-on": "9.0.10"
|
|
100
103
|
}
|
|
101
104
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as a,s as c}from"./vendor-KKSARHWL.esm.js";import{k as t}from"./routes-E1gMJl6d.esm.js";import"./lit-WqMxC_PA.esm.js";import"./promo-types-DKAOFHJr.esm.js";import"./beam-errors-Ci0d3926.esm.js";import"../utils/logger.esm.js";const s="https://sdk.beamimpact.com",i=`${s}/lib/shoelace/v${t["@shoelace-style/shoelace"]}`,o=`${s}/lib/lucide-static/v${t["lucide-static"]}`;if(a("lucide",{resolver:e=>`${o}/icons/${e}.svg`}),c(i),document&&!document.querySelector("link[data-beam-impact]")){const e=document.createElement("link");e.href=`${i}/themes/light.css`,e.rel="stylesheet",e.setAttribute("data-beam-impact","true"),document.head.appendChild(e)}
|
|
2
|
-
//# sourceMappingURL=_share-dialog-dependencies-BVNp0oLJ.esm.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{r as a,s as c}from"./vendor-KKSARHWL.esm.js";import{k as t}from"./routes-BHChxaFQ.esm.js";import"./lit-WqMxC_PA.esm.js";import"./promo-types-DKAOFHJr.esm.js";import"./beam-errors-Ci0d3926.esm.js";import"../utils/logger.js";const s="https://sdk.beamimpact.com",i=`${s}/lib/shoelace/v${t["@shoelace-style/shoelace"]}`,o=`${s}/lib/lucide-static/v${t["lucide-static"]}`;if(a("lucide",{resolver:e=>`${o}/icons/${e}.svg`}),c(i),document&&!document.querySelector("link[data-beam-impact]")){const e=document.createElement("link");e.href=`${i}/themes/light.css`,e.rel="stylesheet",e.setAttribute("data-beam-impact","true"),document.head.appendChild(e)}
|
|
2
|
-
//# sourceMappingURL=_share-dialog-dependencies-D4i8Nvve.esm.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{f as n}from"./lit-WqMxC_PA.esm.js";import{M as s}from"./beam-errors-Ci0d3926.esm.js";import{logger as a}from"../utils/logger.js";const l=n`html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{/*height:auto;*/max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}`;function f(i,e=i.tagName){customElements.get(e)||customElements.define(e,i)}function d(i,e){const t=[],r=e;for(const o of i)r[o]==null&&t.push(o);if(t.length>0)throw a.error(`Beam Impact - Missing Required Config Values:
|
|
2
|
-
`,t.join(", "),e),new s(t);return!0}function h(i,e){return i.every(t=>t in e&&e[t]!=null)}export{h as a,l as c,f as d,d as e};
|
|
3
|
-
//# sourceMappingURL=enforce-config-Ba1JkOHs.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce-config-Ba1JkOHs.esm.js","sources":["../../src/shared/css-reset.ts","../../src/shared/defineCustomElement.ts","../../src/shared/enforce-config.ts"],"sourcesContent":["import { css } from \"lit\";\n\n// minireset.css v0.0.7 | MIT License | github.com/jgthms/minireset.css\n// prettier-ignore\nexport const cssReset = css`html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{/*height:auto;*/max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}`;\n","/**\n * Defines a custom element based on its static tagName property\n */\nexport function defineCustomElement(\n CustomElementClass: CustomElementConstructor & { tagName: string },\n tagName = CustomElementClass[\"tagName\"]\n) {\n customElements.get(tagName) || customElements.define(tagName, CustomElementClass);\n}\n","import { MissingConfig } from \"../utils/beam-errors\";\nimport { logger } from \"../utils/logger\";\n\nexport function enforceConfig<T>(keys: (keyof T)[], input: unknown): input is Required<T> {\n const missingKeys: string[] = [];\n const check = input as Record<string | number | symbol, unknown>;\n for (const key of keys) {\n if (check[key] == null) {\n missingKeys.push(key as string);\n }\n }\n if (missingKeys.length > 0) {\n logger.error(\"Beam Impact - Missing Required Config Values:\\n\", missingKeys.join(\", \"), input);\n throw new MissingConfig(missingKeys);\n }\n return true;\n}\n\nexport function areRequiredKeysDefined<T extends object>(requiredKeys: (keyof T)[], config: T): boolean {\n return requiredKeys.every((key) => key in config && config[key] != null);\n}\n"],"names":["cssReset","css","defineCustomElement","CustomElementClass","tagName","enforceConfig","keys","input","missingKeys","check","key","logger","MissingConfig","areRequiredKeysDefined","requiredKeys","config"],"mappings":"wIAIO,MAAMA,EAAWC,gaCDjB,SAASC,EACdC,EACAC,EAAUD,EAAmB,QAC7B,CACA,eAAe,IAAIC,CAAO,GAAK,eAAe,OAAOA,EAASD,CAAkB,CAClF,CCLgB,SAAAE,EAAiBC,EAAmBC,EAAsC,CACxF,MAAMC,EAAwB,CAAA,EACxBC,EAAQF,EACd,UAAWG,KAAOJ,EACZG,EAAMC,CAAG,GAAK,MAChBF,EAAY,KAAKE,CAAa,EAGlC,GAAIF,EAAY,OAAS,EACvB,MAAAG,EAAO,MAAM;AAAA,EAAmDH,EAAY,KAAK,IAAI,EAAGD,CAAK,EACvF,IAAIK,EAAcJ,CAAW,EAErC,MAAO,EACT,CAEO,SAASK,EAAyCC,EAA2BC,EAAoB,CACtG,OAAOD,EAAa,MAAOJ,GAAQA,KAAOK,GAAUA,EAAOL,CAAG,GAAK,IAAI,CACzE"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{f as n}from"./lit-WqMxC_PA.esm.js";import{M as s}from"./beam-errors-Ci0d3926.esm.js";import{logger as a}from"../utils/logger.esm.js";const l=n`html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{/*height:auto;*/max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}`;function f(i,e=i.tagName){customElements.get(e)||customElements.define(e,i)}function d(i,e){const t=[],r=e;for(const o of i)r[o]==null&&t.push(o);if(t.length>0)throw a.error(`Beam Impact - Missing Required Config Values:
|
|
2
|
-
`,t.join(", "),e),new s(t);return!0}function h(i,e){return i.every(t=>t in e&&e[t]!=null)}export{h as a,l as c,f as d,d as e};
|
|
3
|
-
//# sourceMappingURL=enforce-config-CZ3ToOgr.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce-config-CZ3ToOgr.esm.js","sources":["../../src/shared/css-reset.ts","../../src/shared/defineCustomElement.ts","../../src/shared/enforce-config.ts"],"sourcesContent":["import { css } from \"lit\";\n\n// minireset.css v0.0.7 | MIT License | github.com/jgthms/minireset.css\n// prettier-ignore\nexport const cssReset = css`html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,video{/*height:auto;*/max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}`;\n","/**\n * Defines a custom element based on its static tagName property\n */\nexport function defineCustomElement(\n CustomElementClass: CustomElementConstructor & { tagName: string },\n tagName = CustomElementClass[\"tagName\"]\n) {\n customElements.get(tagName) || customElements.define(tagName, CustomElementClass);\n}\n","import { MissingConfig } from \"../utils/beam-errors\";\nimport { logger } from \"../utils/logger\";\n\nexport function enforceConfig<T>(keys: (keyof T)[], input: unknown): input is Required<T> {\n const missingKeys: string[] = [];\n const check = input as Record<string | number | symbol, unknown>;\n for (const key of keys) {\n if (check[key] == null) {\n missingKeys.push(key as string);\n }\n }\n if (missingKeys.length > 0) {\n logger.error(\"Beam Impact - Missing Required Config Values:\\n\", missingKeys.join(\", \"), input);\n throw new MissingConfig(missingKeys);\n }\n return true;\n}\n\nexport function areRequiredKeysDefined<T extends object>(requiredKeys: (keyof T)[], config: T): boolean {\n return requiredKeys.every((key) => key in config && config[key] != null);\n}\n"],"names":["cssReset","css","defineCustomElement","CustomElementClass","tagName","enforceConfig","keys","input","missingKeys","check","key","logger","MissingConfig","areRequiredKeysDefined","requiredKeys","config"],"mappings":"4IAIO,MAAMA,EAAWC,gaCDjB,SAASC,EACdC,EACAC,EAAUD,EAAmB,QAC7B,CACA,eAAe,IAAIC,CAAO,GAAK,eAAe,OAAOA,EAASD,CAAkB,CAClF,CCLgB,SAAAE,EAAiBC,EAAmBC,EAAsC,CACxF,MAAMC,EAAwB,CAAA,EACxBC,EAAQF,EACd,UAAWG,KAAOJ,EACZG,EAAMC,CAAG,GAAK,MAChBF,EAAY,KAAKE,CAAa,EAGlC,GAAIF,EAAY,OAAS,EACvB,MAAAG,EAAO,MAAM;AAAA,EAAmDH,EAAY,KAAK,IAAI,EAAGD,CAAK,EACvF,IAAIK,EAAcJ,CAAW,EAErC,MAAO,EACT,CAEO,SAASK,EAAyCC,EAA2BC,EAAoB,CACtG,OAAOD,EAAa,MAAOJ,GAAQA,KAAOK,GAAUA,EAAOL,CAAG,GAAK,IAAI,CACzE"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const t=class x extends CustomEvent{constructor(e){super(x.eventName,{detail:e,bubbles:!0,composed:!0})}};t.eventName="beamnetworkcall";let n=t;const s=class h extends CustomEvent{constructor(e){super(h.eventName,{detail:e,bubbles:!0,composed:!0})}};s.eventName="beamnonprofitselect";let o=s;const a=class w extends CustomEvent{constructor(e){super(w.eventName,{detail:e,bubbles:!0,composed:!0})}};a.eventName="beamcartchange";let r=a;const m=class y extends CustomEvent{constructor(e){super(y.eventName,{detail:e,bubbles:!0,composed:!0})}};m.eventName="beamcartcreated";let c=m;const u=class W extends CustomEvent{constructor(e){super(W.eventName,{detail:e,bubbles:!0,composed:!0})}};u.eventName="beamordercreated";let l=u;const d=class k extends CustomEvent{constructor(e){super(k.eventName,{detail:e,bubbles:!0,composed:!0})}};d.eventName="beamstatuschange";let v=d;const i=class I extends CustomEvent{constructor(e){super(I.eventName,{detail:e,bubbles:!0,composed:!0})}};i.eventName="beamnonprofitselectionremoved";let b=i;const p=class P extends CustomEvent{constructor(e){super(P.eventName,{detail:e,bubbles:!0,composed:!0})}};p.eventName="beampromocodesstored";let E=p;const N=class O extends CustomEvent{constructor(e){super(O.eventName,{detail:e,bubbles:!0,composed:!0})}};N.eventName="beamwidgetstoredpromocodes";let C=N;const B=class j extends CustomEvent{constructor(e){super(j.eventName,{detail:e,bubbles:!0,composed:!0})}};B.eventName="beamwidgetinitialnonprofitsync";let g=B;const f=class R extends CustomEvent{constructor(e){super(R.eventName,{detail:e,bubbles:!0,composed:!0})}};f.eventName="beamwidgetinitialnonprofitsynccancel";let S=f;var z=Object.freeze({__proto__:null,BeamCartChangeEvent:r,BeamCartCreatedEvent:c,BeamNetworkCallEvent:n,BeamNonprofitSelectEvent:o,BeamNonprofitSelectionRemovedEvent:b,BeamOrderCreatedEvent:l,BeamPromoCodesStoredEvent:E,BeamStatusChangeEvent:v,BeamWidgetInitialNonprofitSyncCancelEvent:S,BeamWidgetInitialNonprofitSyncEvent:g,BeamWidgetStoredPromoCodesEvent:C});export{v as B,E as a,l as b,o as c,n as d,z as e,C as f,r as g,c as h,g as i,S as j,b as k};
|
|
2
|
-
//# sourceMappingURL=events-Dki0ka4F.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-BAgWh5OK.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{v as d}from"./vendor-KKSARHWL.esm.js";import{getCookieValue as i,setCookieValue as p,deleteCookieValue as l}from"../utils/cookies.js";import{createScopedLocalStorage as n}from"../utils/local-storage.js";const s="beam_session";async function r({cookieName:e=s,domain:o=window.location.hostname,apiKey:t=""}={}){if(await i(e))return;const a=d(),m=Date.now()+30*24*60*60*1e3;await p({name:e,value:a,domain:o,path:"/",expires:m}),n({apiKey:t}).setItemJson("cart",{cartId:a})}async function c({cookieName:e=s,domain:o=window.location.hostname,apiKey:t=""}={}){const a=await i(e);a&&(n({apiKey:t}).setItemJson("cart",{cartId:a}),await l({name:e,domain:o}))}var u=Object.freeze({__proto__:null,createSession:r,endSession:c});export{r as c,c as e,u as i};
|
|
2
|
-
//# sourceMappingURL=index-BNjsFEGn.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-C0J0SqUr.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CG2AhvV9.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CGKJagBi.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{i}from"./index-DBb5HSkR.esm.js";import{i as o}from"./index-CG2AhvV9.esm.js";import{i as r}from"./index-BNjsFEGn.esm.js";import{i as e}from"./index-C0J0SqUr.esm.js";import{i as m}from"./index-CWnHkgy3.esm.js";var s=Object.freeze({__proto__:null,Cart:e,Logs:m,Session:r,Shopify:o,Utils:i});export{s as i};
|
|
2
|
-
//# sourceMappingURL=index-CLNjLpMX.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-CLNjLpMX.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|