@beamimpact/web-sdk 1.48.0 → 1.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/chunks/_share-dialog-dependencies-RmYWlyJ0.esm.js +2 -0
  2. package/dist/chunks/_share-dialog-dependencies-RmYWlyJ0.esm.js.map +1 -0
  3. package/dist/chunks/_share-dialog-dependencies-yCBFjXxQ.esm.js +2 -0
  4. package/dist/chunks/_share-dialog-dependencies-yCBFjXxQ.esm.js.map +1 -0
  5. package/dist/chunks/beam-errors-AMvTvR1C.esm.js +2 -0
  6. package/dist/chunks/beam-errors-AMvTvR1C.esm.js.map +1 -0
  7. package/dist/chunks/{beam-errors-fXDkG1zo.esm.d.ts → beam-errors-bKCZlkvr.esm.d.ts} +2 -7
  8. package/dist/chunks/cart-contents-6_ztOjrx.esm.d.ts +18 -0
  9. package/dist/chunks/cart-contents-h60geKWa.esm.js.map +1 -1
  10. package/dist/chunks/enforce-config-S8EGgEnO.esm.js +3 -0
  11. package/dist/chunks/enforce-config-S8EGgEnO.esm.js.map +1 -0
  12. package/dist/chunks/enforce-config-l-tNb_z7.esm.js +3 -0
  13. package/dist/chunks/enforce-config-l-tNb_z7.esm.js.map +1 -0
  14. package/dist/chunks/events-T3hYV1LF.esm.js +2 -0
  15. package/dist/chunks/events-T3hYV1LF.esm.js.map +1 -0
  16. package/dist/chunks/{events-ZCTR9JGZ.esm.d.ts → events-u_8n2LIU.esm.d.ts} +33 -4
  17. package/dist/chunks/{index-PA0NAKHV.esm.d.ts → index-0X3JKFYs.esm.d.ts} +1 -1
  18. package/dist/chunks/{index-XH3OS_sy.esm.d.ts → index-2qmtuEV_.esm.d.ts} +4 -4
  19. package/dist/chunks/index-44clOvXJ.esm.js +2 -0
  20. package/dist/chunks/index-44clOvXJ.esm.js.map +1 -0
  21. package/dist/chunks/index-B-9JPaCH.esm.js +2 -0
  22. package/dist/chunks/index-B-9JPaCH.esm.js.map +1 -0
  23. package/dist/chunks/{index-M7Ut5U3j.esm.js → index-CNVMNDM4.esm.js} +2 -2
  24. package/dist/chunks/index-CNVMNDM4.esm.js.map +1 -0
  25. package/dist/chunks/{index-XHm2EBaD.esm.js → index-HVGMpZIV.esm.js} +2 -2
  26. package/dist/chunks/{index-XHm2EBaD.esm.js.map → index-HVGMpZIV.esm.js.map} +1 -1
  27. package/dist/chunks/{index-WvOCqhxv.esm.js → index-UHchr4H_.esm.js} +2 -2
  28. package/dist/chunks/index-UHchr4H_.esm.js.map +1 -0
  29. package/dist/chunks/{index-JJjxnRZK.esm.js → index-XPlAZw7t.esm.js} +2 -2
  30. package/dist/chunks/{index-JJjxnRZK.esm.js.map → index-XPlAZw7t.esm.js.map} +1 -1
  31. package/dist/chunks/{index-v6fG3D6u.esm.d.ts → index-bhqIqVQJ.esm.d.ts} +1 -1
  32. package/dist/chunks/{index--z5MSe4-.esm.d.ts → index-cznI-EZa.esm.d.ts} +1 -1
  33. package/dist/chunks/index-dLnZQZlT.esm.js +2 -0
  34. package/dist/chunks/index-dLnZQZlT.esm.js.map +1 -0
  35. package/dist/chunks/index-f7fp9odj.esm.js +2 -0
  36. package/dist/chunks/index-f7fp9odj.esm.js.map +1 -0
  37. package/dist/chunks/index-kFulvjM4.esm.js +2 -0
  38. package/dist/chunks/index-kFulvjM4.esm.js.map +1 -0
  39. package/dist/chunks/index-m1LRybiJ.esm.js +2 -0
  40. package/dist/chunks/index-m1LRybiJ.esm.js.map +1 -0
  41. package/dist/chunks/index-puZGYsUA.esm.d.ts +46 -0
  42. package/dist/chunks/index-q2vZ79t1.esm.d.ts +46 -0
  43. package/dist/chunks/index-smGc5rsi.esm.js +2 -0
  44. package/dist/chunks/index-smGc5rsi.esm.js.map +1 -0
  45. package/dist/chunks/index-wz6Yfo37.esm.js +2 -0
  46. package/dist/chunks/index-wz6Yfo37.esm.js.map +1 -0
  47. package/dist/chunks/{localize-o-cYvHQf.esm.js → localize-7sMSg1W9.esm.js} +2 -2
  48. package/dist/chunks/{localize-o-cYvHQf.esm.js.map → localize-7sMSg1W9.esm.js.map} +1 -1
  49. package/dist/chunks/{localize-m-_ESmpk.esm.js → localize-OiRewTgu.esm.js} +2 -2
  50. package/dist/chunks/{localize-m-_ESmpk.esm.js.map → localize-OiRewTgu.esm.js.map} +1 -1
  51. package/dist/chunks/{openapi-spec-hjdK2L9Q.esm.d.ts → openapi-spec-bxGNhNMa.esm.d.ts} +332 -0
  52. package/dist/chunks/order-page-WPxvCNLM.esm.js +2 -0
  53. package/dist/chunks/{order-page-Z3WcYluU.esm.js.map → order-page-WPxvCNLM.esm.js.map} +1 -1
  54. package/dist/chunks/order-page-ZpOf35sP.esm.js +2 -0
  55. package/dist/chunks/{order-page-rrfJ4w9F.esm.js.map → order-page-ZpOf35sP.esm.js.map} +1 -1
  56. package/dist/chunks/{order-page-9clVUPaS.esm.d.ts → order-page-dlXIs0gJ.esm.d.ts} +6 -4
  57. package/dist/chunks/promo-types-aQ_hre6t.esm.d.ts +14 -0
  58. package/dist/chunks/promoManager--3WXq4at.esm.js +2 -0
  59. package/dist/chunks/promoManager--3WXq4at.esm.js.map +1 -0
  60. package/dist/chunks/promoManager-YUzbMtwY.esm.js +2 -0
  61. package/dist/chunks/promoManager-YUzbMtwY.esm.js.map +1 -0
  62. package/dist/chunks/routes-YPOoVIR2.esm.js +2 -0
  63. package/dist/chunks/routes-YPOoVIR2.esm.js.map +1 -0
  64. package/dist/chunks/{routes-iurI6dvR.esm.d.ts → routes-lGXt7ttd.esm.d.ts} +76 -3
  65. package/dist/chunks/routes-o-phF_L1.esm.js +2 -0
  66. package/dist/chunks/routes-o-phF_L1.esm.js.map +1 -0
  67. package/dist/chunks/{share-button-k_Xn5956.esm.js → share-button-EsUPw38-.esm.js} +2 -2
  68. package/dist/chunks/{share-button-diP8wKOc.esm.js.map → share-button-EsUPw38-.esm.js.map} +1 -1
  69. package/dist/chunks/{share-button-diP8wKOc.esm.js → share-button-r0y-bbwR.esm.js} +2 -2
  70. package/dist/chunks/{share-button-k_Xn5956.esm.js.map → share-button-r0y-bbwR.esm.js.map} +1 -1
  71. package/dist/chunks/{shoelace-components-wBxNHnyr.esm.js → shoelace-components-PB22pjfM.esm.js} +2 -2
  72. package/dist/chunks/{shoelace-components-wBxNHnyr.esm.js.map → shoelace-components-PB22pjfM.esm.js.map} +1 -1
  73. package/dist/chunks/{shoelace-components-xrhk189_.esm.js → shoelace-components-lr4iB8kL.esm.js} +2 -2
  74. package/dist/chunks/{shoelace-components-xrhk189_.esm.js.map → shoelace-components-lr4iB8kL.esm.js.map} +1 -1
  75. package/dist/chunks/{types-zbTZ8-KP.esm.d.ts → types-IbMT3Nwn.esm.d.ts} +5 -1
  76. package/dist/chunks/{update-cart-l86bU5uS.esm.d.ts → update-cart-JO4fuiim.esm.d.ts} +1 -1
  77. package/dist/chunks/update-cart-UuMHYehB.esm.js +2 -0
  78. package/dist/chunks/update-cart-UuMHYehB.esm.js.map +1 -0
  79. package/dist/chunks/update-cart-mNsQ9K-k.esm.js +2 -0
  80. package/dist/chunks/update-cart-mNsQ9K-k.esm.js.map +1 -0
  81. package/dist/components/community-impact.d.ts +1 -1
  82. package/dist/components/community-impact.esm.js +1 -1
  83. package/dist/components/community-impact.js +1 -1
  84. package/dist/components/cumulative-impact.d.ts +1 -1
  85. package/dist/components/cumulative-impact.esm.js +1 -1
  86. package/dist/components/cumulative-impact.js +1 -1
  87. package/dist/components/impact-overview.d.ts +6 -2
  88. package/dist/components/impact-overview.esm.js +2 -2
  89. package/dist/components/impact-overview.esm.js.map +1 -1
  90. package/dist/components/impact-overview.js +2 -2
  91. package/dist/components/impact-overview.js.map +1 -1
  92. package/dist/components/index.d.ts +4 -4
  93. package/dist/components/index.esm.js +1 -1
  94. package/dist/components/index.js +1 -1
  95. package/dist/components/post-purchase.d.ts +11 -3
  96. package/dist/components/post-purchase.esm.js +4 -4
  97. package/dist/components/post-purchase.esm.js.map +1 -1
  98. package/dist/components/post-purchase.js +4 -4
  99. package/dist/components/post-purchase.js.map +1 -1
  100. package/dist/components/product-details-page.d.ts +23 -4
  101. package/dist/components/product-details-page.esm.js +24 -24
  102. package/dist/components/product-details-page.esm.js.map +1 -1
  103. package/dist/components/product-details-page.js +24 -24
  104. package/dist/components/product-details-page.js.map +1 -1
  105. package/dist/components/redeem-transaction.d.ts +5 -14
  106. package/dist/components/redeem-transaction.esm.js +27 -27
  107. package/dist/components/redeem-transaction.esm.js.map +1 -1
  108. package/dist/components/redeem-transaction.js +27 -27
  109. package/dist/components/redeem-transaction.js.map +1 -1
  110. package/dist/components/select-nonprofit.d.ts +10 -3
  111. package/dist/components/select-nonprofit.esm.js +50 -45
  112. package/dist/components/select-nonprofit.esm.js.map +1 -1
  113. package/dist/components/select-nonprofit.js +50 -45
  114. package/dist/components/select-nonprofit.js.map +1 -1
  115. package/dist/components/select-subscription-nonprofit.d.ts +1 -1
  116. package/dist/components/select-subscription-nonprofit.esm.js +1 -1
  117. package/dist/components/select-subscription-nonprofit.js +1 -1
  118. package/dist/components/shopify.d.ts +8 -7
  119. package/dist/components/shopify.esm.js +1 -1
  120. package/dist/components/shopify.esm.js.map +1 -1
  121. package/dist/components/shopify.js +1 -1
  122. package/dist/components/shopify.js.map +1 -1
  123. package/dist/components/social-share.d.ts +1 -1
  124. package/dist/components/social-share.esm.js +1 -1
  125. package/dist/components/social-share.js +1 -1
  126. package/dist/components/subscription-impact.d.ts +2 -1
  127. package/dist/components/subscription-impact.esm.js +1 -1
  128. package/dist/components/subscription-impact.js +1 -1
  129. package/dist/components/subscription-management.d.ts +15 -4
  130. package/dist/components/subscription-management.esm.js +1 -1
  131. package/dist/components/subscription-management.js +1 -1
  132. package/dist/index.d.ts +16 -14
  133. package/dist/index.esm.js +1 -1
  134. package/dist/index.js +1 -1
  135. package/dist/integrations/beam.d.ts +1 -1
  136. package/dist/integrations/beam.esm.js +1 -1
  137. package/dist/integrations/beam.js +1 -1
  138. package/dist/integrations/cart.d.ts +3 -3
  139. package/dist/integrations/cart.esm.js +1 -1
  140. package/dist/integrations/cart.js +1 -1
  141. package/dist/integrations/index.d.ts +14 -12
  142. package/dist/integrations/index.esm.js +1 -1
  143. package/dist/integrations/index.js +1 -1
  144. package/dist/integrations/logs.d.ts +2 -2
  145. package/dist/integrations/logs.esm.js +1 -1
  146. package/dist/integrations/logs.js +1 -1
  147. package/dist/integrations/promoManager.d.ts +36 -0
  148. package/dist/integrations/promoManager.esm.js +2 -0
  149. package/dist/integrations/promoManager.esm.js.map +1 -0
  150. package/dist/integrations/promoManager.js +2 -0
  151. package/dist/integrations/promoManager.js.map +1 -0
  152. package/dist/integrations/session.esm.js +1 -1
  153. package/dist/integrations/session.js +1 -1
  154. package/dist/integrations/shopify.d.ts +6 -6
  155. package/dist/integrations/shopify.esm.js +1 -1
  156. package/dist/integrations/shopify.js +1 -1
  157. package/dist/integrations/statsig.d.ts +1 -1
  158. package/dist/integrations/statsig.esm.js +1 -1
  159. package/dist/integrations/statsig.js +1 -1
  160. package/dist/integrations/utils.d.ts +7 -5
  161. package/dist/integrations/utils.esm.js +1 -1
  162. package/dist/integrations/utils.js +1 -1
  163. package/dist/react/community-impact.d.ts +1 -1
  164. package/dist/react/community-impact.esm.js +1 -1
  165. package/dist/react/community-impact.js +1 -1
  166. package/dist/react/cumulative-impact.d.ts +1 -1
  167. package/dist/react/cumulative-impact.esm.js +1 -1
  168. package/dist/react/cumulative-impact.js +1 -1
  169. package/dist/react/impact-overview.d.ts +1 -1
  170. package/dist/react/impact-overview.esm.js +1 -1
  171. package/dist/react/impact-overview.js +1 -1
  172. package/dist/react/index.d.ts +6 -5
  173. package/dist/react/index.esm.js +1 -1
  174. package/dist/react/index.js +1 -1
  175. package/dist/react/post-purchase.d.ts +3 -3
  176. package/dist/react/post-purchase.esm.js +1 -1
  177. package/dist/react/post-purchase.esm.js.map +1 -1
  178. package/dist/react/post-purchase.js +1 -1
  179. package/dist/react/post-purchase.js.map +1 -1
  180. package/dist/react/product-details-page.d.ts +1 -1
  181. package/dist/react/product-details-page.esm.js +1 -1
  182. package/dist/react/product-details-page.esm.js.map +1 -1
  183. package/dist/react/product-details-page.js +1 -1
  184. package/dist/react/product-details-page.js.map +1 -1
  185. package/dist/react/redeem-transaction.d.ts +5 -4
  186. package/dist/react/redeem-transaction.esm.js +1 -1
  187. package/dist/react/redeem-transaction.js +1 -1
  188. package/dist/react/select-nonprofit.d.ts +5 -4
  189. package/dist/react/select-nonprofit.esm.js +1 -1
  190. package/dist/react/select-nonprofit.esm.js.map +1 -1
  191. package/dist/react/select-nonprofit.js +1 -1
  192. package/dist/react/select-nonprofit.js.map +1 -1
  193. package/dist/react/select-subscription-nonprofit.d.ts +5 -4
  194. package/dist/react/select-subscription-nonprofit.esm.js +1 -1
  195. package/dist/react/select-subscription-nonprofit.js +1 -1
  196. package/dist/react/social-share.d.ts +1 -1
  197. package/dist/react/social-share.esm.js +1 -1
  198. package/dist/react/social-share.js +1 -1
  199. package/dist/react/subscription-impact.d.ts +1 -1
  200. package/dist/react/subscription-impact.esm.js +1 -1
  201. package/dist/react/subscription-impact.js +1 -1
  202. package/dist/react/subscription-management.d.ts +4 -4
  203. package/dist/react/subscription-management.esm.js +1 -1
  204. package/dist/react/subscription-management.js +1 -1
  205. package/dist/utils/beam-errors.d.ts +1 -1
  206. package/dist/utils/beam-errors.esm.js +1 -1
  207. package/dist/utils/beam-errors.js +1 -1
  208. package/dist/utils/cart.esm.js +1 -1
  209. package/dist/utils/cart.js +1 -1
  210. package/dist/utils/cookies.esm.js +1 -1
  211. package/dist/utils/cookies.esm.js.map +1 -1
  212. package/dist/utils/cookies.js +1 -1
  213. package/dist/utils/cookies.js.map +1 -1
  214. package/dist/utils/events.d.ts +5 -4
  215. package/dist/utils/events.esm.js +1 -1
  216. package/dist/utils/events.js +1 -1
  217. package/dist/utils/index.d.ts +7 -5
  218. package/dist/utils/index.esm.js +1 -1
  219. package/dist/utils/index.js +1 -1
  220. package/dist/utils/local-storage.esm.js +1 -1
  221. package/dist/utils/local-storage.js +1 -1
  222. package/dist/utils/network-listeners.esm.js +1 -1
  223. package/dist/utils/network-listeners.esm.js.map +1 -1
  224. package/dist/utils/network-listeners.js +1 -1
  225. package/dist/utils/network-listeners.js.map +1 -1
  226. package/dist/utils/promoManager.d.ts +123 -0
  227. package/dist/utils/promoManager.esm.js +2 -0
  228. package/dist/utils/promoManager.esm.js.map +1 -0
  229. package/dist/utils/promoManager.js +2 -0
  230. package/dist/utils/promoManager.js.map +1 -0
  231. package/dist/utils/remote-session.esm.js +1 -1
  232. package/dist/utils/remote-session.js +1 -1
  233. package/dist/utils/wait-for-element.esm.js +1 -1
  234. package/dist/utils/wait-for-element.js +1 -1
  235. package/package.json +2 -2
  236. package/dist/chunks/_share-dialog-dependencies-2jzbs44g.esm.js +0 -2
  237. package/dist/chunks/_share-dialog-dependencies-2jzbs44g.esm.js.map +0 -1
  238. package/dist/chunks/_share-dialog-dependencies-C8uChjuF.esm.js +0 -2
  239. package/dist/chunks/_share-dialog-dependencies-C8uChjuF.esm.js.map +0 -1
  240. package/dist/chunks/beam-errors-P-Lu07Ce.esm.js +0 -2
  241. package/dist/chunks/beam-errors-P-Lu07Ce.esm.js.map +0 -1
  242. package/dist/chunks/cart-contents-CMm57qu0.esm.d.ts +0 -11
  243. package/dist/chunks/enforce-config-ZAI7WYAd.esm.js +0 -3
  244. package/dist/chunks/enforce-config-ZAI7WYAd.esm.js.map +0 -1
  245. package/dist/chunks/enforce-config-ZyPq_4CF.esm.js +0 -3
  246. package/dist/chunks/enforce-config-ZyPq_4CF.esm.js.map +0 -1
  247. package/dist/chunks/events-6Z5MkCRr.esm.js +0 -2
  248. package/dist/chunks/events-6Z5MkCRr.esm.js.map +0 -1
  249. package/dist/chunks/index-2bLOkP4H.esm.d.ts +0 -32
  250. package/dist/chunks/index-CsWTfuok.esm.js +0 -2
  251. package/dist/chunks/index-CsWTfuok.esm.js.map +0 -1
  252. package/dist/chunks/index-GynYZRPI.esm.d.ts +0 -32
  253. package/dist/chunks/index-M7Ut5U3j.esm.js.map +0 -1
  254. package/dist/chunks/index-MIp7LlXH.esm.js +0 -2
  255. package/dist/chunks/index-MIp7LlXH.esm.js.map +0 -1
  256. package/dist/chunks/index-WvOCqhxv.esm.js.map +0 -1
  257. package/dist/chunks/index-YJNgLCif.esm.js +0 -2
  258. package/dist/chunks/index-YJNgLCif.esm.js.map +0 -1
  259. package/dist/chunks/index-a6oXV2ro.esm.js +0 -2
  260. package/dist/chunks/index-a6oXV2ro.esm.js.map +0 -1
  261. package/dist/chunks/index-dkwGkvOu.esm.js +0 -2
  262. package/dist/chunks/index-dkwGkvOu.esm.js.map +0 -1
  263. package/dist/chunks/index-iK195-B9.esm.js +0 -2
  264. package/dist/chunks/index-iK195-B9.esm.js.map +0 -1
  265. package/dist/chunks/index-nstmHC95.esm.js +0 -2
  266. package/dist/chunks/index-nstmHC95.esm.js.map +0 -1
  267. package/dist/chunks/index-vq14EaW4.esm.js +0 -2
  268. package/dist/chunks/index-vq14EaW4.esm.js.map +0 -1
  269. package/dist/chunks/order-page-Z3WcYluU.esm.js +0 -2
  270. package/dist/chunks/order-page-rrfJ4w9F.esm.js +0 -2
  271. package/dist/chunks/routes-Dmf2ZNnZ.esm.js +0 -2
  272. package/dist/chunks/routes-Dmf2ZNnZ.esm.js.map +0 -1
  273. package/dist/chunks/routes-o1QpF40R.esm.js +0 -2
  274. package/dist/chunks/routes-o1QpF40R.esm.js.map +0 -1
  275. package/dist/chunks/update-cart-EGTcbNRX.esm.js +0 -2
  276. package/dist/chunks/update-cart-EGTcbNRX.esm.js.map +0 -1
  277. package/dist/chunks/update-cart-FwtFnnGe.esm.js +0 -2
  278. package/dist/chunks/update-cart-FwtFnnGe.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"localize-m-_ESmpk.esm.js","sources":["../../src/shared/fragments/css-variable-map.ts","../../src/shared/controllers/async-controller.ts","../../src/shared/fragments/error-message-template.ts","../../src/shared/fragments/custom-text.ts","../../src/shared/localize.ts"],"sourcesContent":["export const _cssVariableMap = (variables: Record<string, string>) => {\n return Object.entries(variables)\n .map(([k, v]) => `${k}: ${v};`)\n .join(\"\\n\");\n};\n","import { ReactiveController, ReactiveControllerHost } from \"lit\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AsyncFunction = (...args: any[]) => Promise<any>;\n\n/**\n * Creates a declarative wrapper around async operations\n * @example\n * class MyElement extends LitElement {\n * private user = new AsyncController(\n * this,\n * async ({ id }) => get(url, { id }));\n *\n * async updated(changedProperties) {\n * if (changedProperties.has(\"userId\")) {\n * await this.user.exec({ id: this.userId })\n * }\n * }\n *\n * render() {\n * const { data, loading, error } = this.user;\n * if (loading) return html`Please wait...`\n * if (error) return html`Error! <button @click=${this.user.retry}>Reload</button>`;\n * return html`My name is: ${data.name}`\n * }\n * }\n */\nexport class AsyncController<TFn extends AsyncFunction> implements ReactiveController {\n public data: Awaited<ReturnType<TFn>> | null = null;\n public loading = false;\n public error: Error | null = null;\n\n private readonly host: ReactiveControllerHost;\n private readonly asyncFn: TFn;\n private lastArgs?: Parameters<TFn>;\n\n constructor(host: ReactiveControllerHost, asyncFn: TFn) {\n (this.host = host).addController(this);\n this.asyncFn = asyncFn;\n }\n\n public async exec(...args: Parameters<TFn>): Promise<ReturnType<TFn> | null> {\n this.lastArgs = args;\n this.loading = true;\n this.host.requestUpdate();\n try {\n // TODO: prevent race condition if later invocation returns before earlier\n this.data = await this.asyncFn(...args);\n this.error = null;\n } catch (err) {\n if (err instanceof Error) {\n this.error = err;\n this.data = null;\n }\n }\n this.loading = false;\n this.host.requestUpdate();\n return this.data;\n }\n\n public async retry() {\n return this.exec(...((this.lastArgs || []) as Parameters<TFn>));\n }\n\n hostDisconnected() {\n // TODO: cancel API calls\n }\n}\n","import { html } from \"lit\";\nimport { MissingConfig, NetworkError } from \"../../utils/beam-errors\";\n\nconst strings = {\n errorTitle: `Beam encountered an error. Please try again.`,\n retry: `Retry`,\n};\n\nexport const _errorMessage = ({ error, retry }: { error: Error; retry?: (...args: never) => void }) => {\n let details = html``;\n if (error instanceof NetworkError) {\n const response = JSON.stringify(\n {\n status: error.response.status,\n statusText: error.response.statusText,\n url: error.response.url,\n body: error.body,\n },\n null,\n 4\n );\n details = html`\n <p><b>Network Response:</b></p>\n <p>${response}</p>\n `;\n }\n if (error instanceof MissingConfig) {\n details = html`\n <p><b>Missing Required Config Options:</b></p>\n <p>${error.missingConfigKeyNames.join(\", \")}</p>\n `;\n }\n return html`<div class=\"beam-error\" style=\"text-align: left\">\n <p>${strings.errorTitle} ${retry ? html` <button type=\"reset\" @click=\"${retry}\">${strings.retry}</button>` : \"\"}</p>\n <br />\n <details>\n <div style=\"white-space: pre-wrap; font-family: monospace; line-height: 1;\">\n ${details}\n <p><b>Message:</b> ${error.message || html`<i>None</i>`}</p>\n <p><b>Stack:</b> ${error.stack}</p>\n </div>\n </details>\n <br />\n <p>Help: <a href=\"https://www.beamimpact.com\">www.beamimpact.com</a></p>\n </div>`;\n};\n","import { CSSResult, unsafeCSS } from \"lit\";\n\n/**\n * Create an object that can be passed to cssVariableMap\n * to define CSS variables in a style tag. The default properties\n * are the ones exposed for customization in the remote config interface.\n * @example\n * const variables = {\n * ...customizableTextJs(\"widget-header\",\n * \"widget-border-color\": \"red\"\n * };\n *\n * html`<style>:host { ${_cssVariableMap(variables)} }</style>`;\n * @returns {{[p: string]: string}}\n */\nexport const defineCustomText = (\n namespace = \"\",\n {\n fontFamily = \"inherit\",\n fontStyle = \"inherit\",\n fontSize = \"inherit\",\n fontWeight = \"inherit\",\n textTransform = \"none\",\n textDecoration = \"none\",\n marginTop = \"0\",\n lineHeight = \"inherit\",\n color = \"inherit\",\n letterSpacing = \"normal\",\n } = {}\n): Record<string, string> => {\n const prefix = namespace.startsWith(\"--beam-\") ? namespace : `--beam-${namespace}`;\n return {\n [`${prefix}-fontFamily`]: fontFamily,\n [`${prefix}-fontStyle`]: fontStyle,\n [`${prefix}-fontSize`]: fontSize,\n [`${prefix}-fontWeight`]: fontWeight,\n [`${prefix}-textTransform`]: textTransform,\n [`${prefix}-marginTop`]: marginTop,\n [`${prefix}-lineHeight`]: lineHeight,\n [`${prefix}-color`]: color,\n [`${prefix}-letterSpacing`]: letterSpacing,\n [`${prefix}-textDecoration`]: textDecoration,\n };\n};\n\n/**\n * Returns a string that defines css properties based on variables,\n * which can be used in a css`` template. The default properties are the\n * ones exposed for customization in the remote config interface.\n * @example\n * css`.widget-header { ${customizableTextCss(\"widget-header\")} border: none; }`\n * @returns {CSSResult}\n */\nexport const useCustomText = (\n namespace = \"\",\n {\n fontFamily = \"inherit\",\n fontStyle = \"inherit\",\n fontSize = \"inherit\",\n fontWeight = \"inherit\",\n textTransform = \"none\",\n textDecoration = \"none\",\n marginTop = \"0\",\n lineHeight = \"inherit\",\n color = \"inherit\",\n letterSpacing = \"normal\",\n } = {}\n): CSSResult => {\n const prefix = namespace.startsWith(\"--beam-\") ? namespace : `--beam-${namespace}`;\n return unsafeCSS(`\\\n font-family: var(${prefix}-fontFamily, ${fontFamily});\n font-style: var(${prefix}-fontStyle, ${fontStyle});\n font-size: var(${prefix}-fontSize, ${fontSize});\n font-weight: var(${prefix}-fontWeight, ${fontWeight});\n text-transform: var(${prefix}-textTransform, ${textTransform});\n margin-top: var(${prefix}-marginTop, ${marginTop});\n line-height: var(${prefix}-lineHeight, ${lineHeight});\n text-decoration: var(${prefix}-textDecoration, ${textDecoration});\n color: var(${prefix}-color, ${color});\n letter-spacing: var(${prefix}-letterSpacing, ${letterSpacing});\n `);\n};\n\n/**\n * Same as useCustomText except returns an object that can be passed to styleMap\n */\nexport const useCustomTextMap = (\n namespace = \"\",\n {\n fontSize = \"inherit\",\n fontStyle = \"inherit\",\n fontWeight = \"inherit\",\n textTransform = \"none\",\n textDecoration = \"none\",\n marginTop = \"0\",\n lineHeight = \"inherit\",\n letterSpacing = \"normal\",\n } = {}\n): Record<string, string> => {\n const prefix = namespace.startsWith(\"--beam-\") ? namespace : `--beam-${namespace}`;\n return {\n fontSize: `var(${prefix}-fontSize, ${fontSize})`,\n fontStyle: `var(${prefix}-fontStyle, ${fontStyle})`,\n fontWeight: `var(${prefix}-fontWeight, ${fontWeight})`,\n textTransform: `var(${prefix}-textTransform, ${textTransform})`,\n textDecoration: `var(${prefix}-textDecoration, ${textDecoration})`,\n marginTop: `var(${prefix}-marginTop, ${marginTop})`,\n lineHeight: `var(${prefix}-lineHeight, ${lineHeight})`,\n letterSpacing: `var(${prefix}-letterSpacing, ${letterSpacing})`,\n };\n};\n","import { LANGUAGES } from \"../api-sdk/types\";\nimport { logger } from \"../utils/logger\";\nimport { BeamError } from \"../utils/beam-errors\";\n\n/**\n * User-provided strings may include embedded translations in JSON form\n * This function extracts the string for the provided language\n * If it fails to parse, or the string is not json-like, it returns the whole string\n */\nconst localizeUserString = (lang: LANGUAGES, str: string): string => {\n const isJson = str.startsWith(\"{\");\n if (isJson) {\n try {\n const json = JSON.parse(str);\n return json[lang] ?? json[\"en\"] ?? str;\n } catch (err) {\n logger.error(new BeamError(\"Failed to extract JSON translation from string\"), str);\n return str;\n }\n }\n return str;\n};\n\nexport { localizeUserString };\n"],"names":["_cssVariableMap","variables","k","v","AsyncController","host","asyncFn","args","err","strings","_errorMessage","error","retry","details","html","NetworkError","response","MissingConfig","defineCustomText","namespace","fontFamily","fontStyle","fontSize","fontWeight","textTransform","textDecoration","marginTop","lineHeight","color","letterSpacing","prefix","useCustomText","unsafeCSS","localizeUserString","lang","str","json","logger","BeamError"],"mappings":"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"}
1
+ {"version":3,"file":"localize-OiRewTgu.esm.js","sources":["../../src/shared/fragments/css-variable-map.ts","../../src/shared/controllers/async-controller.ts","../../src/shared/fragments/error-message-template.ts","../../src/shared/fragments/custom-text.ts","../../src/shared/localize.ts"],"sourcesContent":["export const _cssVariableMap = (variables: Record<string, string>) => {\n return Object.entries(variables)\n .map(([k, v]) => `${k}: ${v};`)\n .join(\"\\n\");\n};\n","import { ReactiveController, ReactiveControllerHost } from \"lit\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AsyncFunction = (...args: any[]) => Promise<any>;\n\n/**\n * Creates a declarative wrapper around async operations\n * @example\n * class MyElement extends LitElement {\n * private user = new AsyncController(\n * this,\n * async ({ id }) => get(url, { id }));\n *\n * async updated(changedProperties) {\n * if (changedProperties.has(\"userId\")) {\n * await this.user.exec({ id: this.userId })\n * }\n * }\n *\n * render() {\n * const { data, loading, error } = this.user;\n * if (loading) return html`Please wait...`\n * if (error) return html`Error! <button @click=${this.user.retry}>Reload</button>`;\n * return html`My name is: ${data.name}`\n * }\n * }\n */\nexport class AsyncController<TFn extends AsyncFunction> implements ReactiveController {\n public data: Awaited<ReturnType<TFn>> | null = null;\n public loading = false;\n public error: Error | null = null;\n\n private readonly host: ReactiveControllerHost;\n private readonly asyncFn: TFn;\n private lastArgs?: Parameters<TFn>;\n\n constructor(host: ReactiveControllerHost, asyncFn: TFn) {\n (this.host = host).addController(this);\n this.asyncFn = asyncFn;\n }\n\n public async exec(...args: Parameters<TFn>): Promise<ReturnType<TFn> | null> {\n this.lastArgs = args;\n this.loading = true;\n this.host.requestUpdate();\n try {\n // TODO: prevent race condition if later invocation returns before earlier\n this.data = await this.asyncFn(...args);\n this.error = null;\n } catch (err) {\n if (err instanceof Error) {\n this.error = err;\n this.data = null;\n }\n }\n this.loading = false;\n this.host.requestUpdate();\n return this.data;\n }\n\n public async retry() {\n return this.exec(...((this.lastArgs || []) as Parameters<TFn>));\n }\n\n hostDisconnected() {\n // TODO: cancel API calls\n }\n}\n","import { html } from \"lit\";\nimport { MissingConfig, NetworkError } from \"../../utils/beam-errors\";\n\nconst strings = {\n errorTitle: `Beam encountered an error. Please try again.`,\n retry: `Retry`,\n};\n\nexport const _errorMessage = ({ error, retry }: { error: Error; retry?: (...args: never) => void }) => {\n let details = html``;\n if (error instanceof NetworkError) {\n const response = JSON.stringify(\n {\n status: error.response.status,\n statusText: error.response.statusText,\n url: error.response.url,\n body: error.body,\n },\n null,\n 4\n );\n details = html`\n <p><b>Network Response:</b></p>\n <p>${response}</p>\n `;\n }\n if (error instanceof MissingConfig) {\n details = html`\n <p><b>Missing Required Config Options:</b></p>\n <p>${error.missingConfigKeyNames.join(\", \")}</p>\n `;\n }\n return html`<div class=\"beam-error\" style=\"text-align: left\">\n <p>${strings.errorTitle} ${retry ? html` <button type=\"reset\" @click=\"${retry}\">${strings.retry}</button>` : \"\"}</p>\n <br />\n <details>\n <div style=\"white-space: pre-wrap; font-family: monospace; line-height: 1;\">\n ${details}\n <p><b>Message:</b> ${error.message || html`<i>None</i>`}</p>\n <p><b>Stack:</b> ${error.stack}</p>\n </div>\n </details>\n <br />\n <p>Help: <a href=\"https://www.beamimpact.com\">www.beamimpact.com</a></p>\n </div>`;\n};\n","import { CSSResult, unsafeCSS } from \"lit\";\n\n/**\n * Create an object that can be passed to cssVariableMap\n * to define CSS variables in a style tag. The default properties\n * are the ones exposed for customization in the remote config interface.\n * @example\n * const variables = {\n * ...customizableTextJs(\"widget-header\",\n * \"widget-border-color\": \"red\"\n * };\n *\n * html`<style>:host { ${_cssVariableMap(variables)} }</style>`;\n * @returns {{[p: string]: string}}\n */\nexport const defineCustomText = (\n namespace = \"\",\n {\n fontFamily = \"inherit\",\n fontStyle = \"inherit\",\n fontSize = \"inherit\",\n fontWeight = \"inherit\",\n textTransform = \"none\",\n textDecoration = \"none\",\n marginTop = \"0\",\n lineHeight = \"inherit\",\n color = \"inherit\",\n letterSpacing = \"normal\",\n } = {}\n): Record<string, string> => {\n const prefix = namespace.startsWith(\"--beam-\") ? namespace : `--beam-${namespace}`;\n return {\n [`${prefix}-fontFamily`]: fontFamily,\n [`${prefix}-fontStyle`]: fontStyle,\n [`${prefix}-fontSize`]: fontSize,\n [`${prefix}-fontWeight`]: fontWeight,\n [`${prefix}-textTransform`]: textTransform,\n [`${prefix}-marginTop`]: marginTop,\n [`${prefix}-lineHeight`]: lineHeight,\n [`${prefix}-color`]: color,\n [`${prefix}-letterSpacing`]: letterSpacing,\n [`${prefix}-textDecoration`]: textDecoration,\n };\n};\n\n/**\n * Returns a string that defines css properties based on variables,\n * which can be used in a css`` template. The default properties are the\n * ones exposed for customization in the remote config interface.\n * @example\n * css`.widget-header { ${customizableTextCss(\"widget-header\")} border: none; }`\n * @returns {CSSResult}\n */\nexport const useCustomText = (\n namespace = \"\",\n {\n fontFamily = \"inherit\",\n fontStyle = \"inherit\",\n fontSize = \"inherit\",\n fontWeight = \"inherit\",\n textTransform = \"none\",\n textDecoration = \"none\",\n marginTop = \"0\",\n lineHeight = \"inherit\",\n color = \"inherit\",\n letterSpacing = \"normal\",\n } = {}\n): CSSResult => {\n const prefix = namespace.startsWith(\"--beam-\") ? namespace : `--beam-${namespace}`;\n return unsafeCSS(`\\\n font-family: var(${prefix}-fontFamily, ${fontFamily});\n font-style: var(${prefix}-fontStyle, ${fontStyle});\n font-size: var(${prefix}-fontSize, ${fontSize});\n font-weight: var(${prefix}-fontWeight, ${fontWeight});\n text-transform: var(${prefix}-textTransform, ${textTransform});\n margin-top: var(${prefix}-marginTop, ${marginTop});\n line-height: var(${prefix}-lineHeight, ${lineHeight});\n text-decoration: var(${prefix}-textDecoration, ${textDecoration});\n color: var(${prefix}-color, ${color});\n letter-spacing: var(${prefix}-letterSpacing, ${letterSpacing});\n `);\n};\n\n/**\n * Same as useCustomText except returns an object that can be passed to styleMap\n */\nexport const useCustomTextMap = (\n namespace = \"\",\n {\n fontSize = \"inherit\",\n fontStyle = \"inherit\",\n fontWeight = \"inherit\",\n textTransform = \"none\",\n textDecoration = \"none\",\n marginTop = \"0\",\n lineHeight = \"inherit\",\n letterSpacing = \"normal\",\n } = {}\n): Record<string, string> => {\n const prefix = namespace.startsWith(\"--beam-\") ? namespace : `--beam-${namespace}`;\n return {\n fontSize: `var(${prefix}-fontSize, ${fontSize})`,\n fontStyle: `var(${prefix}-fontStyle, ${fontStyle})`,\n fontWeight: `var(${prefix}-fontWeight, ${fontWeight})`,\n textTransform: `var(${prefix}-textTransform, ${textTransform})`,\n textDecoration: `var(${prefix}-textDecoration, ${textDecoration})`,\n marginTop: `var(${prefix}-marginTop, ${marginTop})`,\n lineHeight: `var(${prefix}-lineHeight, ${lineHeight})`,\n letterSpacing: `var(${prefix}-letterSpacing, ${letterSpacing})`,\n };\n};\n","import { LANGUAGES } from \"../api-sdk/types\";\nimport { logger } from \"../utils/logger\";\nimport { BeamError } from \"../utils/beam-errors\";\n\n/**\n * User-provided strings may include embedded translations in JSON form\n * This function extracts the string for the provided language\n * If it fails to parse, or the string is not json-like, it returns the whole string\n */\nconst localizeUserString = (lang: LANGUAGES, str: string): string => {\n const isJson = str.startsWith(\"{\");\n if (isJson) {\n try {\n const json = JSON.parse(str);\n return json[lang] ?? json[\"en\"] ?? str;\n } catch (err) {\n logger.error(new BeamError(\"Failed to extract JSON translation from string\"), str);\n return str;\n }\n }\n return str;\n};\n\nexport { localizeUserString };\n"],"names":["_cssVariableMap","variables","k","v","AsyncController","host","asyncFn","args","err","strings","_errorMessage","error","retry","details","html","NetworkError","response","MissingConfig","defineCustomText","namespace","fontFamily","fontStyle","fontSize","fontWeight","textTransform","textDecoration","marginTop","lineHeight","color","letterSpacing","prefix","useCustomText","unsafeCSS","localizeUserString","lang","str","json","logger","BeamError"],"mappings":"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"}
@@ -261,6 +261,7 @@ interface paths {
261
261
  goalProgressPercentage: number;
262
262
  };
263
263
  promo?: {
264
+ type?: string;
264
265
  isActive: boolean;
265
266
  /**
266
267
  * @description When a promo is active, the total amount donated is multiplied by this value. ex:\ (subtotal * donationAmount) * multiplier -> ($100 * 1%) * 2 = $2.00 donated
@@ -277,6 +278,21 @@ interface paths {
277
278
  region: {
278
279
  id: string | null;
279
280
  };
281
+ promos?: {
282
+ validatedPromoCodes: {
283
+ /** @description promoCodeId */
284
+ promoCodeId: string | null;
285
+ promoCodeGroupId?: string | null;
286
+ promoId?: number;
287
+ /**
288
+ * Format: date-time
289
+ * @description ISO formatted date
290
+ * @example 2023-04-19T03:23:59.301Z
291
+ */
292
+ validatedAt: string;
293
+ apply: boolean;
294
+ }[];
295
+ };
280
296
  };
281
297
  };
282
298
  };
@@ -797,6 +813,7 @@ interface paths {
797
813
  goalProgressPercentage: number;
798
814
  };
799
815
  promo?: {
816
+ type?: string;
800
817
  isActive: boolean;
801
818
  /**
802
819
  * @description When a promo is active, the total amount donated is multiplied by this value. ex:\ (subtotal * donationAmount) * multiplier -> ($100 * 1%) * 2 = $2.00 donated
@@ -813,6 +830,21 @@ interface paths {
813
830
  region: {
814
831
  id: string | null;
815
832
  };
833
+ promos?: {
834
+ validatedPromoCodes: {
835
+ /** @description promoCodeId */
836
+ promoCodeId: string | null;
837
+ promoCodeGroupId?: string | null;
838
+ promoId?: number;
839
+ /**
840
+ * Format: date-time
841
+ * @description ISO formatted date
842
+ * @example 2023-04-19T03:23:59.301Z
843
+ */
844
+ validatedAt: string;
845
+ apply: boolean;
846
+ }[];
847
+ };
816
848
  };
817
849
  };
818
850
  };
@@ -960,6 +992,51 @@ interface paths {
960
992
  }[];
961
993
  };
962
994
  };
995
+ promos?: {
996
+ unvalidatedPromoCodes: (Partial<{
997
+ /** @enum {string} */
998
+ type?: "manual" | "url";
999
+ } & {
1000
+ attributes?: {
1001
+ value?: string;
1002
+ };
1003
+ }> & Partial<{
1004
+ /** @enum {string} */
1005
+ type?: "manual" | "url";
1006
+ } & {
1007
+ attributes?: {
1008
+ url?: string;
1009
+ };
1010
+ }>)[];
1011
+ validatedPromoCodes: {
1012
+ /** @description promoCodeId */
1013
+ promoCodeId: string | null;
1014
+ promoCodeGroupId?: string | null;
1015
+ promoId?: number;
1016
+ /**
1017
+ * Format: date-time
1018
+ * @description ISO formatted date
1019
+ * @example 2023-04-19T03:23:59.301Z
1020
+ */
1021
+ validatedAt: string;
1022
+ apply: boolean;
1023
+ }[];
1024
+ };
1025
+ /**
1026
+ * @description UUID
1027
+ * @example bqkdk-0393b-jbkdd-02difj
1028
+ */
1029
+ transactionId?: string;
1030
+ /**
1031
+ * @description UUID
1032
+ * @example bqkdk-0393b-jbkdd-02difj
1033
+ */
1034
+ beamCartId?: string;
1035
+ /**
1036
+ * @description UUID
1037
+ * @example bqkdk-0393b-jbkdd-02difj
1038
+ */
1039
+ cartId?: string;
963
1040
  options?: {
964
1041
  config?: {
965
1042
  /** @description Removes the themes object from the remote config object in the response. */
@@ -1340,6 +1417,7 @@ interface paths {
1340
1417
  filters?: string[];
1341
1418
  }[];
1342
1419
  promo: {
1420
+ type?: string;
1343
1421
  isActive: boolean;
1344
1422
  /**
1345
1423
  * @description When a promo is active, the total amount donated is multiplied by this value. ex:\ (subtotal * donationAmount) * multiplier -> ($100 * 1%) * 2 = $2.00 donated
@@ -1719,6 +1797,7 @@ interface paths {
1719
1797
  filters?: string[];
1720
1798
  }[];
1721
1799
  promo: {
1800
+ type?: string;
1722
1801
  isActive: boolean;
1723
1802
  /**
1724
1803
  * @description When a promo is active, the total amount donated is multiplied by this value. ex:\ (subtotal * donationAmount) * multiplier -> ($100 * 1%) * 2 = $2.00 donated
@@ -2024,6 +2103,11 @@ interface paths {
2024
2103
  * @example bqkdk-0393b-jbkdd-02difj
2025
2104
  */
2026
2105
  beamUserId: string;
2106
+ /**
2107
+ * @description UUID
2108
+ * @example bqkdk-0393b-jbkdd-02difj
2109
+ */
2110
+ beamCartId?: string | null;
2027
2111
  /**
2028
2112
  * @description Numeric ID
2029
2113
  * @example 1001
@@ -2283,6 +2367,11 @@ interface paths {
2283
2367
  * @example bqkdk-0393b-jbkdd-02difj
2284
2368
  */
2285
2369
  beamUserId: string;
2370
+ /**
2371
+ * @description UUID
2372
+ * @example bqkdk-0393b-jbkdd-02difj
2373
+ */
2374
+ beamCartId?: string | null;
2286
2375
  /**
2287
2376
  * @description Numeric ID
2288
2377
  * @example 1001
@@ -2745,6 +2834,36 @@ interface paths {
2745
2834
  discountCodes?: string[];
2746
2835
  /** @enum {string|null} */
2747
2836
  creationMethod?: "recurring" | null;
2837
+ promos?: {
2838
+ unvalidatedPromoCodes: (Partial<{
2839
+ /** @enum {string} */
2840
+ type?: "manual" | "url";
2841
+ } & {
2842
+ attributes?: {
2843
+ value?: string;
2844
+ };
2845
+ }> & Partial<{
2846
+ /** @enum {string} */
2847
+ type?: "manual" | "url";
2848
+ } & {
2849
+ attributes?: {
2850
+ url?: string;
2851
+ };
2852
+ }>)[];
2853
+ validatedPromoCodes: {
2854
+ /** @description promoCodeId */
2855
+ promoCodeId: string | null;
2856
+ promoCodeGroupId?: string | null;
2857
+ promoId?: number;
2858
+ /**
2859
+ * Format: date-time
2860
+ * @description ISO formatted date
2861
+ * @example 2023-04-19T03:23:59.301Z
2862
+ */
2863
+ validatedAt: string;
2864
+ apply: boolean;
2865
+ }[];
2866
+ };
2748
2867
  };
2749
2868
  };
2750
2869
  };
@@ -6869,6 +6988,219 @@ interface paths {
6869
6988
  };
6870
6989
  };
6871
6990
  };
6991
+ post: {
6992
+ parameters: {
6993
+ query: {
6994
+ lang?: "en" | "fr" | "de" | "es" | "it" | "pl";
6995
+ /** The version of the config */
6996
+ version: string;
6997
+ storeId: number;
6998
+ /** When set to true, draft themes are returned */
6999
+ draftConfig?: boolean;
7000
+ widgetName?: "community-impact" | "impact-overview" | "select-nonprofit" | "redeem-transaction" | "cumulative-impact" | "mobile-full-screen-nonprofit-selection" | "mobile-impact-list" | "mobile-minimal-nonprofit-selection" | "mobile-personal-impact" | "mobile-selected-nonprofit" | "mobile-progress-bar" | "select-nonprofit-cta" | "mobile-share-button" | "subscription-management" | "product-details-page" | "select-subscription-nonprofit" | "subscription-impact";
7001
+ /** The identifier for the product */
7002
+ remoteProductIdentifier?: string;
7003
+ };
7004
+ };
7005
+ responses: {
7006
+ /** Fetches config/copy for product display page widget */
7007
+ 200: {
7008
+ content: {
7009
+ "application/json": {
7010
+ /** @description Widget config for the product display page widget */
7011
+ config: {
7012
+ web: {
7013
+ /**
7014
+ * @description Header/title for the widget
7015
+ * @example Choose your impact
7016
+ */
7017
+ title: string;
7018
+ /** @description Subtitle/description for the widget */
7019
+ description: string;
7020
+ /**
7021
+ * @description The prefix promo description for the widget for web
7022
+ * @example At no extra cost,
7023
+ */
7024
+ promoDescriptionPrefix?: string;
7025
+ /**
7026
+ * @description The promo description for the widget for web
7027
+ * @example At no extra cost, select a nonprofit and 1% of your purchase will be donated
7028
+ */
7029
+ promoDescription?: string;
7030
+ /**
7031
+ * @description confirm button
7032
+ * @example Confirm free donation
7033
+ */
7034
+ confirmButton?: string;
7035
+ /**
7036
+ * @description copy once confirm button is clicked
7037
+ * @example Confirmed!
7038
+ */
7039
+ confirmedButton?: string;
7040
+ /**
7041
+ * @description collapsed button copy
7042
+ * @example Choose a nonprofit
7043
+ */
7044
+ collapsedButton?: string;
7045
+ /** @description Remote config theme data as requested by the given widgetName & version query params */
7046
+ theme?: {
7047
+ [key: string]: unknown;
7048
+ } | null;
7049
+ /**
7050
+ * @description nonprofit Selected Header for select-nonprofit-cta widget
7051
+ * @example Your impact
7052
+ */
7053
+ nonprofitSelectedHeader?: string;
7054
+ /**
7055
+ * @description nonprofit Unselected Header for select-nonprofit-cta widget
7056
+ * @example Make your purchase a force for good
7057
+ */
7058
+ nonprofitUnselectedHeader?: string;
7059
+ /** @description An object containing dynamic strings for the widget. These strings serve as templates and include dynamic variables that vary based on the widget type. */
7060
+ dynamicStrings?: {
7061
+ [key: string]: string;
7062
+ } | null;
7063
+ /** @description An object containing additional static strings specific to each widget. These strings are unique to the widget and are not shared across different widgets. */
7064
+ additionalStrings?: {
7065
+ [key: string]: string;
7066
+ } | null;
7067
+ /** @description Disables counter animation for cumulative-impact widget */
7068
+ disableAnimation?: boolean;
7069
+ /** @description promo copy is sent in this object to be used in conditionally rendered UI components. This object serves as a repository for server-generated copy */
7070
+ promo?: {
7071
+ /** @example Donations are 2x for Black History Month */
7072
+ "promo-text-long": string;
7073
+ /** @example Donations are 2x */
7074
+ "promo-text-short": string;
7075
+ /**
7076
+ * @description replaces cause copy
7077
+ * @example 2x boosting donations
7078
+ */
7079
+ "promo-cause-alt-text": string;
7080
+ };
7081
+ };
7082
+ mobileWeb?: {
7083
+ /**
7084
+ * @description Header/title for the widget
7085
+ * @example Choose your impact
7086
+ */
7087
+ title: string;
7088
+ /**
7089
+ * @description Subtitle/description for the widget
7090
+ * @example At no extra cost, select a nonprofit and 1% of your purchase will be donated
7091
+ */
7092
+ description: string;
7093
+ /**
7094
+ * @description nonprofit Selected Header for select-nonprofit-cta widget
7095
+ * @example Your impact
7096
+ */
7097
+ nonprofitSelectedHeader?: string;
7098
+ /**
7099
+ * @description nonprofit Unselected Header for select-nonprofit-cta widget
7100
+ * @example Make your purchase a force for good
7101
+ */
7102
+ nonprofitUnselectedHeader?: string;
7103
+ };
7104
+ mobile: {
7105
+ /**
7106
+ * @description Header/title for the widget
7107
+ * @example Choose your impact
7108
+ */
7109
+ title: string;
7110
+ /**
7111
+ * @description Subtitle/description for the widget
7112
+ * @example At no extra cost, select a nonprofit and 1% of your purchase will be donated
7113
+ */
7114
+ description: string;
7115
+ /**
7116
+ * @description nonprofit Selected Header for select-nonprofit-cta widget
7117
+ * @example Your impact
7118
+ */
7119
+ nonprofitSelectedHeader?: string;
7120
+ /**
7121
+ * @description nonprofit Unselected Header for select-nonprofit-cta widget
7122
+ * @example Make your purchase a force for good
7123
+ */
7124
+ nonprofitUnselectedHeader?: string;
7125
+ };
7126
+ /**
7127
+ * @description determines if a chain can enable nonprofit deselection for the select-nonprofit widget
7128
+ * @default false
7129
+ */
7130
+ enableNonprofitDeselection?: boolean;
7131
+ };
7132
+ ppgfDisclosure?: {
7133
+ copy: string;
7134
+ };
7135
+ ppgfDisclosureHyperlink?: {
7136
+ /** Format: uri */
7137
+ url: string;
7138
+ copy: string;
7139
+ };
7140
+ promos?: {
7141
+ /** @description The list of validated promo codes */
7142
+ validatedPromoCodes?: {
7143
+ /** @description promoCodeId */
7144
+ promoCodeId: string | null;
7145
+ promoCodeGroupId?: string | null;
7146
+ promoId?: number;
7147
+ /**
7148
+ * Format: date-time
7149
+ * @description ISO formatted date
7150
+ * @example 2023-04-19T03:23:59.301Z
7151
+ */
7152
+ validatedAt: string;
7153
+ apply: boolean;
7154
+ }[];
7155
+ };
7156
+ };
7157
+ };
7158
+ };
7159
+ };
7160
+ requestBody: {
7161
+ content: {
7162
+ "application/json": {
7163
+ lang?: string;
7164
+ version?: string;
7165
+ storeId?: number;
7166
+ widgetName?: string;
7167
+ remoteProductIdentifier?: string;
7168
+ beamCartId?: string;
7169
+ draftConfig?: boolean;
7170
+ promos?: {
7171
+ unvalidatedPromoCodes: (Partial<{
7172
+ /** @enum {string} */
7173
+ type?: "manual" | "url";
7174
+ } & {
7175
+ attributes?: {
7176
+ value?: string;
7177
+ };
7178
+ }> & Partial<{
7179
+ /** @enum {string} */
7180
+ type?: "manual" | "url";
7181
+ } & {
7182
+ attributes?: {
7183
+ url?: string;
7184
+ };
7185
+ }>)[];
7186
+ validatedPromoCodes: {
7187
+ /** @description promoCodeId */
7188
+ promoCodeId: string | null;
7189
+ promoCodeGroupId?: string | null;
7190
+ promoId?: number;
7191
+ /**
7192
+ * Format: date-time
7193
+ * @description ISO formatted date
7194
+ * @example 2023-04-19T03:23:59.301Z
7195
+ */
7196
+ validatedAt: string;
7197
+ apply: boolean;
7198
+ }[];
7199
+ };
7200
+ };
7201
+ };
7202
+ };
7203
+ };
6872
7204
  };
6873
7205
  "/webhooks/shopify/redactCustomer": {
6874
7206
  post: {
@@ -0,0 +1,2 @@
1
+ import{i as U}from"./lodash-P8OIs-at.esm.js";import{d as R,c as k,i as x,h as K,g as F}from"./events-T3hYV1LF.esm.js";import{logger as I}from"../utils/logger.esm.js";import{initNetworkListeners as G}from"../utils/network-listeners.esm.js";import{createScopedLocalStorage as j}from"../utils/local-storage.esm.js";import{memoizeLast as A}from"../utils/memoize-last.esm.js";import"./promoManager-YUzbMtwY.esm.js";import{B as h}from"./cart-contents-h60geKWa.esm.js";import{O as E}from"./update-cart-UuMHYehB.esm.js";import{W as M,D as W}from"./routes-o-phF_L1.esm.js";import{getExternalCartId as S,getBeamCartId as _}from"../utils/cart.esm.js";import"../components/post-purchase.esm.js";import{waitForElement as q}from"../utils/wait-for-element.esm.js";import{B as z}from"./beam-errors-AMvTvR1C.esm.js";import{getCookieValue as H}from"../utils/cookies.esm.js";const N=window.Shopify?.routes?.root||"/";let P=!1;const B="cart";async function V(e){if(P)return!1;G(),window.addEventListener(R.eventName,async r=>{const t=r,n=/cart\/(add|change|update|clear)/,a=t.detail.type==="xhr"?t.detail.xhr.responseURL:t.detail.response.url,d=new URL(a);if(!n.test(d.pathname))return;const o=await O(e);o.changed&&E(e,o.cart)});let s,c;window.addEventListener(k.eventName,async r=>{const t=r;I.debug("[cart-page][BeamNonprofitSelectEvent]",t.detail);const{source:n,selectedNonprofitId:a,selectionId:d}=t.detail;if(n===M.select_nonprofit){const o=S(B,e),l=_(h,e),{chainId:p,storeId:u}=e;if(s===a&&c===d)return;await g({selectedNonprofitId:a,selectionId:d,beamCartId:l||void 0,cartId:o||void 0,chainId:p,storeId:u}),c=d,s=a}}),window.addEventListener(x.eventName,async r=>{const t=r;I.debug("[cart-page][BeamNonprofitSelectionRemovedEvent]",t.detail);const{newNonprofitId:n,selectionId:a}=t.detail,d=S(B,e),o=_(h,e),{chainId:l,storeId:p}=e;s===n&&c===a||(await g({selectedNonprofitId:n,beamCartId:o||void 0,selectionId:a,cartId:d||void 0,chainId:l,storeId:p}),c=a,s=n)}),window.addEventListener(K.eventName,r=>{const t=r;I.debug("[cart-page][BeamCartCreatedEvent]",t.detail),L(e)}),window.addEventListener(F.eventName,async r=>{const t=r;I.debug("[cart-page][BeamCartChangeEvent]",t.detail),L(e)});const m=await O(e);return await E(e,m.cart,!0),P=!0,!0}async function L(e){let s,c;try{if(window.statsig){const m=window.statsig;s=m.getLayer("beam_trial_layer").get("show_beam",!1),c=m.getStableID();const r=S(B,e),t=_(h,e),{chainId:n,storeId:a}=e;g({showBeam:s,remoteSessionId:c,beamCartId:t||void 0,cartId:r||void 0,chainId:n,storeId:a})}}catch(m){I.error(m)}}async function O(e){const{token:s,total_price:c,item_count:m,currency:r,items:t,cart_level_discount_applications:n}=await T();let a=!1;const d=j(e).getItemJson("cart"),o=_(h,e),l={cartId:s,beamCartId:o,subtotal:c/100,itemCount:m,currencyCode:r,schema:{source:"generic"},content:{items:t.map(({sku:p,final_line_price:u,product_id:y,line_level_discount_allocations:C})=>{const b=p||String(y),v=u/100,f=C?.map(({discount_application:w})=>({code:w?.title,applicable:!0}));return{remoteProductIdentifier:b,localAmount:v,discounts:f}}),discounts:n.map(({title:p})=>({code:p,applicable:!0}))}};return U(l,{...d,beamCartId:d?.beamCartId})||(a=!0),{changed:a,cart:l}}const $=E,T=async function(){return await window.fetch(N+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(e=>e.json())},g=A(async function({selectedNonprofitId:e,selectionId:s,beamCartId:c,cartId:m,chainId:r,storeId:t,showBeam:n,remoteSessionId:a}){const{attributes:d}=await T(),o=d?.beam;let l={};try{o&&(l=JSON.parse(o))}catch(u){I.error(u)}const p={beam:JSON.stringify({...l,nonprofit_id:e,selection_id:s,beam_cart_id:c,shopify_cart_id:m,chain_id:r,store_id:t,show_beam:n,remote_session_id:a})};if(!U(p.beam,l))try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:p})})}catch(u){I.error(u)}}),Q=A(async function({selectedNonprofitId:e,selectionId:s,beamCartId:c,cartId:m,chainId:r,storeId:t}){let n,a;try{if(window.statsig){const o=window.statsig;n=o.getLayer("beam_trial_layer").get("show_beam",!1),a=o.getStableID()}}catch(o){I.error(o)}const d={beam:JSON.stringify({nonprofit_id:e,selection_id:s,beam_cart_id:c,shopify_cart_id:m,chain_id:r,store_id:t,show_beam:n,remote_session_id:a})};try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:d})})}catch(o){I.error(o)}});async function X({parentSelector:e=".step__sections",apiKey:s,baseUrl:c=W,storeId:m,postalCode:r,discountCodes:t,countryCode:n,orderId:a,email:d,cartTotal:o,cart:l,promoCodes:p,htmlPromoCodes:u,currencyCode:y="USD",domain:C,lang:b="en",debug:v=!1}){const f=document.querySelector(e)||await q(e);if(!f)throw new z(`Timed out waiting for selector '${e}'. Could not render Beam post-purchase widget.`);const w=await H("cart");if(w){const J=j({apiKey:s}),D=J.getItemJson("cart")||{};J.setItemJson("cart",{...D,cartId:w})}const i=document.createElement("beam-post-purchase");i.apiKey=s,i.baseUrl=c,i.storeId=m,i.postalCode=r,i.countryCode=n,i.orderId=String(a),i.email=d,i.cartTotal=o,i.cart=l,i.promoCodes=p,i.htmlPromoCodes=u,i.discountCodes=t,i.currencyCode=y,i.domain=C,i.lang=b,i.debug=v,f.appendChild(i)}export{V as F,$ as G,Q as H,L as S,O as _,g,X as s,T as v};
2
+ //# sourceMappingURL=order-page-WPxvCNLM.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"order-page-Z3WcYluU.esm.js","sources":["../../src/integrations/shopify/cart-page.ts","../../src/integrations/shopify/order-page.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport isEqual from \"lodash-es/isEqual\";\nimport { logger, memoizeLast } from \"../../utils\";\nimport { initNetworkListeners } from \"../../utils/network-listeners\";\nimport {\n BeamCartChangeEvent,\n BeamCartCreatedEvent,\n BeamNetworkCallEvent,\n BeamNonprofitSelectEvent,\n BeamNonprofitSelectionRemovedEvent,\n} from \"../../utils/events\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCart, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\nimport { WIDGET_NAMES } from \"../../api-sdk/constants\";\nimport { getBeamCartId, getExternalCartId } from \"../../utils/cart\";\n\nexport type BeamShopifyCartIntegrationConfig = BeamCartAPIConfig & {\n storeId: number; // will be added to cart custom_attributes, and used in cart API call\n chainId?: number; // will be added to cart custom_attributes\n};\n\ntype ShopifyDiscountApplication = {\n title: string;\n value: string;\n};\n\ntype ShopifyLineLevelDiscountAllocations = {\n amount?: string;\n discount_application: ShopifyDiscountApplication;\n};\n\nconst SHOPIFY_BASE_URL = window.Shopify?.routes?.root || \"/\"; // see window.d.ts\n\nlet isBeamCartIntegrationRegistered = false; // Skip registering event listeners if already set up\n\nconst SHOPIFY_CART_COOKIE_NAME = \"cart\";\n\n/**\n * @main registerCartIntegration - set up event listeners to integrate Beam with Shopify cart\n * @return {boolean} returns true if NEW listeners were created, false if setup was already done\n */\nasync function registerCartIntegration(config: BeamShopifyCartIntegrationConfig) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // logger.debug(\"[cart-page][registerCartIntegration] initializing network listeners\");\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)/;\n // note: response urls below follow redirects\n const requestUrlStr = event.detail.type === \"xhr\" ? event.detail.xhr.responseURL : event.detail.response.url;\n const url = new URL(requestUrlStr);\n if (!cartChangePaths.test(url.pathname)) {\n return;\n }\n // logger.debug(\"[cart-page][BeamNetworkCallEvent] getting current cart\");\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has not changed from URL ${requestUrlStr}`, currentCart.cart);\n return;\n }\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has changed from URL ${requestUrlStr}`, currentCart.cart);\n updateCart(config, currentCart.cart);\n });\n\n // Listen to Beam's own events to integrate Beam data into Shopify order\n let lastNonprofitId: number | null | undefined;\n let lastSelectionId: string | null | undefined;\n window.addEventListener(BeamNonprofitSelectEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectEvent;\n logger.debug(\"[cart-page][BeamNonprofitSelectEvent]\", event.detail);\n const { source, selectedNonprofitId, selectionId } = event.detail;\n\n if (source === WIDGET_NAMES.select_nonprofit) {\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config); // Shopify cart ID\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config); // Beam cart ID\n const { chainId, storeId } = config;\n // Skip update if nothing changed (can happen if widget is re-initialized and\n // emits event after cache restoration, i.e., on cart re-render).\n if (lastNonprofitId === selectedNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await appendBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId: beamCartId ? beamCartId : undefined,\n cartId: cartId ? cartId : undefined,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n }\n });\n\n /**\n * Upon removal of the selected nonprofit from the widget and local storage,\n * an event is emitted and that event is then used to update the cart attributes accordingly\n * This event listener updates the cart attributes based on the emitted event\n */\n window.addEventListener(BeamNonprofitSelectionRemovedEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectionRemovedEvent;\n logger.debug(\"[cart-page][BeamNonprofitSelectionRemovedEvent]\", event.detail);\n const { newNonprofitId, selectionId } = event.detail;\n\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config);\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n const { chainId, storeId } = config;\n if (lastNonprofitId === newNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await appendBeamAttributesToCart({\n selectedNonprofitId: newNonprofitId,\n beamCartId: beamCartId ? beamCartId : undefined,\n selectionId,\n cartId: cartId ? cartId : undefined,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = newNonprofitId;\n });\n\n /**\n * When a BeamCart is created, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig\n */\n window.addEventListener(BeamCartCreatedEvent.eventName, (_event: Event) => {\n const event = _event as BeamCartCreatedEvent;\n logger.debug(\"[cart-page][BeamCartCreatedEvent]\", event.detail);\n appendStatsigToShopifyCartAttributes(config);\n });\n\n /**\n * On any cart changes, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig\n */\n window.addEventListener(BeamCartChangeEvent.eventName, async (_event: Event) => {\n const event = _event as BeamCartChangeEvent;\n logger.debug(\"[cart-page][BeamCartChangeEvent]\", event.detail);\n appendStatsigToShopifyCartAttributes(config);\n });\n\n // Handle full-page load, ie, first-time page load and reloads from form submit events\n // This creates a GET to /cart.js\n // logger.debug(\"[cart-page][registerCartIntegration] getting current cart\");\n const currentCart = await getCurrentCart(config);\n // logger.debug(\"[cart-page][registerCartIntegration] initial cart fetch result\", currentCart);\n await updateCart(config, currentCart.cart, true);\n\n isBeamCartIntegrationRegistered = true;\n\n return true;\n}\n\n/* ***************************************** HELPER FUNCTIONS *****************************************\n These may be used individually to integrate with carts if the registerCartIntegration\n script doesn't work for some reason.\n ****************************************************************************************************/\n\n/**\n * Adds Statsig data to a Shopify cart\n */\nasync function appendStatsigToShopifyCartAttributes(config: BeamShopifyCartIntegrationConfig) {\n let showBeam;\n let remoteSessionId;\n try {\n if (window.statsig) {\n const statsig = window.statsig as any;\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config);\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n const { chainId, storeId } = config;\n\n /**\n * When a Beam cart is created, we need to ensure that the\n * Statsig properties get added to the \"beam\" cart property\n */\n appendBeamAttributesToCart({\n showBeam: showBeam,\n remoteSessionId: remoteSessionId,\n beamCartId: beamCartId ? beamCartId : undefined,\n cartId: cartId ? cartId : undefined,\n chainId,\n storeId,\n });\n }\n } catch (e) {\n logger.error(e);\n }\n}\n\n/**\n * Detects change in cart since last page load,\n * by calling GET /cart.js, and returns cart values.\n * Used for:\n * - Form-based carts where the page refreshes to modify cart instead of using AJAX calls\n * - Hydrogen/GraphQL based carts (needs to be integrated manually)\n */\nasync function getCurrentCart(config: BeamShopifyCartIntegrationConfig): Promise<{\n changed: boolean;\n cart: {\n cartId: string;\n subtotal: number;\n itemCount: number;\n currencyCode: string;\n } & TCart;\n}> {\n const {\n token, // equal to \"cart\" cookie\n total_price, // this is the pretax value, after discounts, and multiplied by 100 (integer from decimal)\n item_count,\n currency,\n items,\n cart_level_discount_applications,\n } = await getShopifyCart();\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n // The Beam cart cookie is used to identify the cart across subdomains\n // Use explicit null if empty because API requires it\n const beamCartId: string | null = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n\n const cart = {\n cartId: token,\n beamCartId,\n subtotal: total_price / 100,\n itemCount: item_count,\n currencyCode: currency,\n schema: { source: \"generic\" } as const,\n content: {\n // pull out minimal fields from full line items\n items: (items as TCartItems).map(({ sku, final_line_price, product_id, line_level_discount_allocations }) => {\n const remoteProductIdentifier = sku || String(product_id);\n const localAmount = final_line_price / 100;\n const discounts = (line_level_discount_allocations as ShopifyLineLevelDiscountAllocations[])?.map(\n ({ discount_application }) => {\n return { code: discount_application?.title, applicable: true };\n }\n );\n return { remoteProductIdentifier, localAmount, discounts };\n }),\n discounts: (cart_level_discount_applications as ShopifyDiscountApplication[]).map(({ title }) => {\n return { code: title, applicable: true };\n }),\n },\n };\n\n if (\n !isEqual(cart, {\n ...cachedCart,\n beamCartId: cachedCart?.beamCartId,\n })\n ) {\n changed = true;\n }\n\n // logger.debug(\"[cart-page][getCurrentCart] has cart changed?\", changed, cart);\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/**\n * Helper function to get the Shopify cart attributes\n */\nconst getShopifyCart = async function () {\n const cart = await window\n .fetch(SHOPIFY_BASE_URL + \"cart.js\", {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((res) => res.json());\n return cart;\n};\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This will do an append, not a full overwrite of the attributes in the beam property\n */\nconst appendBeamAttributesToCart = memoizeLast(async function appendBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n showBeam,\n remoteSessionId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n showBeam?: boolean;\n remoteSessionId?: string;\n}) {\n const { attributes } = await getShopifyCart();\n\n // Get only the Beam attribute, if it exists\n const existingBeamCartAttrString = attributes?.beam;\n let existingBeamCartAttr = {};\n try {\n if (existingBeamCartAttrString) {\n existingBeamCartAttr = JSON.parse(existingBeamCartAttrString);\n }\n } catch (err) {\n logger.error(err);\n }\n\n const beamCartAttrs = {\n beam: JSON.stringify({\n ...existingBeamCartAttr,\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n show_beam: showBeam,\n remote_session_id: remoteSessionId,\n }),\n };\n\n // If the attributes match, no reason to update the cart\n if (isEqual(beamCartAttrs.beam, existingBeamCartAttr)) {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] cart attributes match, skipping update\");\n return;\n }\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This method force-updates the \"beam\" attribute with the values passed in\n */\nconst addBeamAttributesToCart = memoizeLast(async function addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n}) {\n let showBeam;\n let remoteSessionId;\n try {\n if (window.statsig) {\n const statsig = window.statsig as any;\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n }\n } catch (e) {\n logger.error(e);\n }\n const beamCartAttrs = {\n beam: JSON.stringify({\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n show_beam: showBeam,\n remote_session_id: remoteSessionId,\n }),\n };\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n statsig?: any; // attached by Statsig CDN script\n }\n}\nexport {\n trackCart,\n getCurrentCart,\n addBeamAttributesToCart,\n appendStatsigToShopifyCartAttributes,\n registerCartIntegration,\n appendBeamAttributesToCart,\n getShopifyCart,\n};\n","import \"../../components/post-purchase\";\nimport { postTransaction } from \"../../api-sdk/v3/routes\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { LANGUAGES, TUrl } from \"../../api-sdk/types\";\nimport { waitForElement } from \"../../utils/wait-for-element\";\nimport { BeamError } from \"../../utils/beam-errors\";\nimport { getCookieValue } from \"../../utils/cookies\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { TCart } from \"../../shared/cart-contents\";\n\n// Shopify admin page: admin/settings/checkout\n\nexport type TBeamOrderPageParams = Parameters<typeof postTransaction>[0][\"requestBody\"] & {\n // Either storeId or postalCode + countryCode must be provided\n storeId?: number;\n postalCode?: string;\n countryCode?: string;\n orderId: string;\n email: string;\n cartTotal: number;\n cart: TCart;\n discountCodes: string[];\n currencyCode: string;\n parentSelector: string; // CSS Selector for parent of widget to be inserted into DOM\n apiKey: string;\n baseUrl: TUrl;\n domain?: string; // Base domain for setting cookies\n lang: LANGUAGES;\n debug: boolean;\n};\n\nexport async function showBeamOrderPageWidgets({\n parentSelector = \".step__sections\",\n apiKey,\n baseUrl = DEFAULT_BASE_URL,\n storeId,\n postalCode,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n discountCodes,\n currencyCode = \"USD\",\n domain,\n lang = \"en\",\n debug = false,\n}: TBeamOrderPageParams) {\n const parentElement = document.querySelector(parentSelector) || (await waitForElement(parentSelector));\n if (!parentElement) {\n throw new BeamError(\n `Timed out waiting for selector '${parentSelector}'. Could not render Beam post-purchase widget.`\n );\n }\n\n // If checkout and order page are on different subdomains, we can't access localStorage\n // We can make postTransaction work by copying the cart cookie to the expected localStorage key on the current domain\n const cartId = await getCookieValue(\"cart\"); // Shopify-only cart identifier\n if (cartId) {\n const beamLocalStorage = createScopedLocalStorage({ apiKey });\n const existingValue = beamLocalStorage.getItemJson(\"cart\") || {};\n beamLocalStorage.setItemJson(\"cart\", { ...existingValue, cartId });\n }\n\n // Note: assign properties one by one instead of bulk Object.assign to type check assignments\n const widget = document.createElement(\"beam-post-purchase\");\n widget.apiKey = apiKey;\n widget.baseUrl = baseUrl;\n widget.storeId = storeId;\n widget.postalCode = postalCode;\n widget.countryCode = countryCode;\n widget.orderId = String(orderId);\n widget.email = email;\n widget.cartTotal = cartTotal;\n widget.cart = cart;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.domain = domain;\n widget.lang = lang;\n widget.debug = debug;\n\n // Insert widget into DOM\n parentElement.appendChild(widget);\n}\n"],"names":["SHOPIFY_BASE_URL","isBeamCartIntegrationRegistered","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","initNetworkListeners","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","currentCart","getCurrentCart","updateCart","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","logger","source","selectedNonprofitId","selectionId","WIDGET_NAMES","cartId","getExternalCartId","beamCartId","getBeamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","appendBeamAttributesToCart","BeamNonprofitSelectionRemovedEvent","newNonprofitId","BeamCartCreatedEvent","appendStatsigToShopifyCartAttributes","BeamCartChangeEvent","showBeam","remoteSessionId","statsig","e","token","total_price","item_count","currency","items","cart_level_discount_applications","getShopifyCart","changed","cachedCart","createScopedLocalStorage","cart","sku","final_line_price","product_id","line_level_discount_allocations","remoteProductIdentifier","localAmount","discounts","discount_application","title","isEqual","trackCart","res","memoizeLast","attributes","existingBeamCartAttrString","existingBeamCartAttr","err","beamCartAttrs","addBeamAttributesToCart","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","countryCode","orderId","email","cartTotal","discountCodes","currencyCode","domain","lang","debug","parentElement","waitForElement","BeamError","getCookieValue","beamLocalStorage","existingValue","widget"],"mappings":"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"}
1
+ {"version":3,"file":"order-page-WPxvCNLM.esm.js","sources":["../../src/integrations/shopify/cart-page.ts","../../src/integrations/shopify/order-page.ts"],"sourcesContent":["/* eslint-disable camelcase */\nimport isEqual from \"lodash-es/isEqual\";\nimport { logger, memoizeLast } from \"../../utils\";\nimport { initNetworkListeners } from \"../../utils/network-listeners\";\nimport {\n BeamCartChangeEvent,\n BeamCartCreatedEvent,\n BeamNetworkCallEvent,\n BeamNonprofitSelectEvent,\n BeamNonprofitSelectionRemovedEvent,\n} from \"../../utils/events\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { BEAM_CART_COOKIE_NAME, TBeamCartLocalStorage, TCart, TCartItems } from \"../../shared/cart-contents\";\nimport { BeamCartAPIConfig, updateCart } from \"../cart\";\nimport { WIDGET_NAMES } from \"../../api-sdk/constants\";\nimport { getBeamCartId, getExternalCartId } from \"../../utils/cart\";\n\nexport type BeamShopifyCartIntegrationConfig = BeamCartAPIConfig & {\n storeId: number; // will be added to cart custom_attributes, and used in cart API call\n chainId?: number; // will be added to cart custom_attributes\n};\n\ntype ShopifyDiscountApplication = {\n title: string;\n value: string;\n};\n\ntype ShopifyLineLevelDiscountAllocations = {\n amount?: string;\n discount_application: ShopifyDiscountApplication;\n};\n\nconst SHOPIFY_BASE_URL = window.Shopify?.routes?.root || \"/\"; // see window.d.ts\n\nlet isBeamCartIntegrationRegistered = false; // Skip registering event listeners if already set up\n\nconst SHOPIFY_CART_COOKIE_NAME = \"cart\";\n\n/**\n * @main registerCartIntegration - set up event listeners to integrate Beam with Shopify cart\n * @return {boolean} returns true if NEW listeners were created, false if setup was already done\n */\nasync function registerCartIntegration(config: BeamShopifyCartIntegrationConfig) {\n if (isBeamCartIntegrationRegistered) {\n return false; // Do nothing if listeners are already attached\n }\n\n // logger.debug(\"[cart-page][registerCartIntegration] initializing network listeners\");\n // Set up event listeners for AJAX events\n initNetworkListeners();\n\n window.addEventListener(BeamNetworkCallEvent.eventName, async (_event: Event) => {\n const event = _event as BeamNetworkCallEvent;\n const cartChangePaths = /cart\\/(add|change|update|clear)/;\n // note: response urls below follow redirects\n const requestUrlStr = event.detail.type === \"xhr\" ? event.detail.xhr.responseURL : event.detail.response.url;\n const url = new URL(requestUrlStr);\n if (!cartChangePaths.test(url.pathname)) {\n return;\n }\n // logger.debug(\"[cart-page][BeamNetworkCallEvent] getting current cart\");\n const currentCart = await getCurrentCart(config);\n if (!currentCart.changed) {\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has not changed from URL ${requestUrlStr}`, currentCart.cart);\n return;\n }\n // Send cart to Beam to update timestamp, which is used for cart abandonment / ROI calc\n // logger.debug(`[cart-page][BeamNetworkCallEvent] cart has changed from URL ${requestUrlStr}`, currentCart.cart);\n updateCart(config, currentCart.cart);\n });\n\n // Listen to Beam's own events to integrate Beam data into Shopify order\n let lastNonprofitId: number | null | undefined;\n let lastSelectionId: string | null | undefined;\n window.addEventListener(BeamNonprofitSelectEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectEvent;\n logger.debug(\"[cart-page][BeamNonprofitSelectEvent]\", event.detail);\n const { source, selectedNonprofitId, selectionId } = event.detail;\n\n if (source === WIDGET_NAMES.select_nonprofit) {\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config); // Shopify cart ID\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config); // Beam cart ID\n const { chainId, storeId } = config;\n // Skip update if nothing changed (can happen if widget is re-initialized and\n // emits event after cache restoration, i.e., on cart re-render).\n if (lastNonprofitId === selectedNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await appendBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId: beamCartId ? beamCartId : undefined,\n cartId: cartId ? cartId : undefined,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = selectedNonprofitId;\n }\n });\n\n /**\n * Upon removal of the selected nonprofit from the widget and local storage,\n * an event is emitted and that event is then used to update the cart attributes accordingly\n * This event listener updates the cart attributes based on the emitted event\n */\n window.addEventListener(BeamNonprofitSelectionRemovedEvent.eventName, async (_event) => {\n const event = _event as BeamNonprofitSelectionRemovedEvent;\n logger.debug(\"[cart-page][BeamNonprofitSelectionRemovedEvent]\", event.detail);\n const { newNonprofitId, selectionId } = event.detail;\n\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config);\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n const { chainId, storeId } = config;\n if (lastNonprofitId === newNonprofitId && lastSelectionId === selectionId) {\n return;\n }\n await appendBeamAttributesToCart({\n selectedNonprofitId: newNonprofitId,\n beamCartId: beamCartId ? beamCartId : undefined,\n selectionId,\n cartId: cartId ? cartId : undefined,\n chainId,\n storeId,\n });\n lastSelectionId = selectionId;\n lastNonprofitId = newNonprofitId;\n });\n\n /**\n * When a BeamCart is created, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig\n */\n window.addEventListener(BeamCartCreatedEvent.eventName, (_event: Event) => {\n const event = _event as BeamCartCreatedEvent;\n logger.debug(\"[cart-page][BeamCartCreatedEvent]\", event.detail);\n appendStatsigToShopifyCartAttributes(config);\n });\n\n /**\n * On any cart changes, write beam metadata to the Shopify cart if\n * we need to capture it for Statsig\n */\n window.addEventListener(BeamCartChangeEvent.eventName, async (_event: Event) => {\n const event = _event as BeamCartChangeEvent;\n logger.debug(\"[cart-page][BeamCartChangeEvent]\", event.detail);\n appendStatsigToShopifyCartAttributes(config);\n });\n\n // Handle full-page load, ie, first-time page load and reloads from form submit events\n // This creates a GET to /cart.js\n // logger.debug(\"[cart-page][registerCartIntegration] getting current cart\");\n const currentCart = await getCurrentCart(config);\n // logger.debug(\"[cart-page][registerCartIntegration] initial cart fetch result\", currentCart);\n await updateCart(config, currentCart.cart, true);\n\n isBeamCartIntegrationRegistered = true;\n\n return true;\n}\n\n/* ***************************************** HELPER FUNCTIONS *****************************************\n These may be used individually to integrate with carts if the registerCartIntegration\n script doesn't work for some reason.\n ****************************************************************************************************/\n\n/**\n * Adds Statsig data to a Shopify cart\n */\nasync function appendStatsigToShopifyCartAttributes(config: BeamShopifyCartIntegrationConfig) {\n let showBeam;\n let remoteSessionId;\n try {\n if (window.statsig) {\n const statsig = window.statsig as any;\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n\n const cartId = getExternalCartId(SHOPIFY_CART_COOKIE_NAME, config);\n const beamCartId = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n const { chainId, storeId } = config;\n\n /**\n * When a Beam cart is created, we need to ensure that the\n * Statsig properties get added to the \"beam\" cart property\n */\n appendBeamAttributesToCart({\n showBeam: showBeam,\n remoteSessionId: remoteSessionId,\n beamCartId: beamCartId ? beamCartId : undefined,\n cartId: cartId ? cartId : undefined,\n chainId,\n storeId,\n });\n }\n } catch (e) {\n logger.error(e);\n }\n}\n\n/**\n * Detects change in cart since last page load,\n * by calling GET /cart.js, and returns cart values.\n * Used for:\n * - Form-based carts where the page refreshes to modify cart instead of using AJAX calls\n * - Hydrogen/GraphQL based carts (needs to be integrated manually)\n */\nasync function getCurrentCart(config: BeamShopifyCartIntegrationConfig): Promise<{\n changed: boolean;\n cart: {\n cartId: string;\n subtotal: number;\n itemCount: number;\n currencyCode: string;\n } & TCart;\n}> {\n const {\n token, // equal to \"cart\" cookie\n total_price, // this is the pretax value, after discounts, and multiplied by 100 (integer from decimal)\n item_count,\n currency,\n items,\n cart_level_discount_applications,\n } = await getShopifyCart();\n\n let changed = false;\n\n const localStorage = createScopedLocalStorage(config);\n\n // The cart cache is used to detect changes after page refreshes / across tabs\n const cachedCart: TBeamCartLocalStorage | null = localStorage.getItemJson(\"cart\");\n // The Beam cart cookie is used to identify the cart across subdomains\n // Use explicit null if empty because API requires it\n const beamCartId: string | null = getBeamCartId(BEAM_CART_COOKIE_NAME, config);\n\n const cart = {\n cartId: token,\n beamCartId,\n subtotal: total_price / 100,\n itemCount: item_count,\n currencyCode: currency,\n schema: { source: \"generic\" } as const,\n content: {\n // pull out minimal fields from full line items\n items: (items as TCartItems).map(({ sku, final_line_price, product_id, line_level_discount_allocations }) => {\n const remoteProductIdentifier = sku || String(product_id);\n const localAmount = final_line_price / 100;\n const discounts = (line_level_discount_allocations as ShopifyLineLevelDiscountAllocations[])?.map(\n ({ discount_application }) => {\n return { code: discount_application?.title, applicable: true };\n }\n );\n return { remoteProductIdentifier, localAmount, discounts };\n }),\n discounts: (cart_level_discount_applications as ShopifyDiscountApplication[]).map(({ title }) => {\n return { code: title, applicable: true };\n }),\n },\n };\n\n if (\n !isEqual(cart, {\n ...cachedCart,\n beamCartId: cachedCart?.beamCartId,\n })\n ) {\n changed = true;\n }\n\n // logger.debug(\"[cart-page][getCurrentCart] has cart changed?\", changed, cart);\n\n return { changed, cart };\n}\n\n/**\n * trackCart - Backwards-compatible alias for updateCart\n */\nconst trackCart = updateCart;\n\n/**\n * Helper function to get the Shopify cart attributes\n */\nconst getShopifyCart = async function () {\n const cart = await window\n .fetch(SHOPIFY_BASE_URL + \"cart.js\", {\n method: \"GET\",\n headers: { \"Content-Type\": \"application/json\" },\n })\n .then((res) => res.json());\n return cart;\n};\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This will do an append, not a full overwrite of the attributes in the beam property\n */\nconst appendBeamAttributesToCart = memoizeLast(async function appendBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n showBeam,\n remoteSessionId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n showBeam?: boolean;\n remoteSessionId?: string;\n}) {\n const { attributes } = await getShopifyCart();\n\n // Get only the Beam attribute, if it exists\n const existingBeamCartAttrString = attributes?.beam;\n let existingBeamCartAttr = {};\n try {\n if (existingBeamCartAttrString) {\n existingBeamCartAttr = JSON.parse(existingBeamCartAttrString);\n }\n } catch (err) {\n logger.error(err);\n }\n\n const beamCartAttrs = {\n beam: JSON.stringify({\n ...existingBeamCartAttr,\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n show_beam: showBeam,\n remote_session_id: remoteSessionId,\n }),\n };\n\n // If the attributes match, no reason to update the cart\n if (isEqual(beamCartAttrs.beam, existingBeamCartAttr)) {\n // logger.debug(\"[cart-page][appendBeamAttributesToCart] cart attributes match, skipping update\");\n return;\n }\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\n/**\n * Sends Beam data to Shopify to integrate with order as custom attributes.\n * Memoized so that calls with the same data as the previous don't create additional API calls to Shopify.\n * This method force-updates the \"beam\" attribute with the values passed in\n */\nconst addBeamAttributesToCart = memoizeLast(async function addBeamAttributesToCart({\n selectedNonprofitId,\n selectionId,\n beamCartId,\n cartId,\n chainId,\n storeId,\n}: {\n selectedNonprofitId?: number | null;\n selectionId?: string;\n beamCartId?: string;\n cartId?: string;\n chainId?: number;\n storeId?: number;\n}) {\n let showBeam;\n let remoteSessionId;\n try {\n if (window.statsig) {\n const statsig = window.statsig as any;\n showBeam = statsig.getLayer(\"beam_trial_layer\").get(\"show_beam\", false /* default to hide */) as boolean;\n remoteSessionId = statsig.getStableID();\n }\n } catch (e) {\n logger.error(e);\n }\n const beamCartAttrs = {\n beam: JSON.stringify({\n nonprofit_id: selectedNonprofitId,\n selection_id: selectionId,\n beam_cart_id: beamCartId,\n shopify_cart_id: cartId,\n chain_id: chainId,\n store_id: storeId,\n show_beam: showBeam,\n remote_session_id: remoteSessionId,\n }),\n };\n\n try {\n await window.fetch(SHOPIFY_BASE_URL + \"cart/update.js\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ attributes: beamCartAttrs }),\n });\n } catch (err) {\n logger.error(err); // don't throw, allow later calls to continue\n }\n});\n\ndeclare global {\n interface Window {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n statsig?: any; // attached by Statsig CDN script\n }\n}\nexport {\n trackCart,\n getCurrentCart,\n addBeamAttributesToCart,\n appendStatsigToShopifyCartAttributes,\n registerCartIntegration,\n appendBeamAttributesToCart,\n getShopifyCart,\n};\n","import \"../../components/post-purchase\";\nimport { postTransaction } from \"../../api-sdk/v3/routes\";\nimport { DEFAULT_BASE_URL } from \"../../api-sdk/constants\";\nimport { LANGUAGES, TUrl } from \"../../api-sdk/types\";\nimport { waitForElement } from \"../../utils/wait-for-element\";\nimport { BeamError } from \"../../utils/beam-errors\";\nimport { getCookieValue } from \"../../utils/cookies\";\nimport { createScopedLocalStorage } from \"../../utils/local-storage\";\nimport { TCart } from \"../../shared/cart-contents\";\n\n// Shopify admin page: admin/settings/checkout\n\nexport type TBeamOrderPageParams = Parameters<typeof postTransaction>[0][\"requestBody\"] & {\n // Either storeId or postalCode + countryCode must be provided\n storeId?: number;\n postalCode?: string;\n countryCode?: string;\n orderId: string;\n email: string;\n cartTotal: number;\n cart: TCart;\n discountCodes: string[];\n promoCodes: string[];\n htmlPromoCodes: string;\n currencyCode: string;\n parentSelector: string; // CSS Selector for parent of widget to be inserted into DOM\n apiKey: string;\n baseUrl: TUrl;\n domain?: string; // Base domain for setting cookies\n lang: LANGUAGES;\n debug: boolean;\n};\n\nexport async function showBeamOrderPageWidgets({\n parentSelector = \".step__sections\",\n apiKey,\n baseUrl = DEFAULT_BASE_URL,\n storeId,\n postalCode,\n discountCodes,\n countryCode,\n orderId,\n email,\n cartTotal,\n cart,\n promoCodes,\n htmlPromoCodes,\n currencyCode = \"USD\",\n domain,\n lang = \"en\",\n debug = false,\n}: TBeamOrderPageParams) {\n const parentElement = document.querySelector(parentSelector) || (await waitForElement(parentSelector));\n if (!parentElement) {\n throw new BeamError(\n `Timed out waiting for selector '${parentSelector}'. Could not render Beam post-purchase widget.`\n );\n }\n\n // If checkout and order page are on different subdomains, we can't access localStorage\n // We can make postTransaction work by copying the cart cookie to the expected localStorage key on the current domain\n const cartId = await getCookieValue(\"cart\"); // Shopify-only cart identifier\n if (cartId) {\n const beamLocalStorage = createScopedLocalStorage({ apiKey });\n const existingValue = beamLocalStorage.getItemJson(\"cart\") || {};\n beamLocalStorage.setItemJson(\"cart\", { ...existingValue, cartId });\n }\n\n // Note: assign properties one by one instead of bulk Object.assign to type check assignments\n const widget = document.createElement(\"beam-post-purchase\");\n widget.apiKey = apiKey;\n widget.baseUrl = baseUrl;\n widget.storeId = storeId;\n widget.postalCode = postalCode;\n widget.countryCode = countryCode;\n widget.orderId = String(orderId);\n widget.email = email;\n widget.cartTotal = cartTotal;\n widget.cart = cart;\n widget.promoCodes = promoCodes;\n widget.htmlPromoCodes = htmlPromoCodes;\n widget.discountCodes = discountCodes;\n widget.currencyCode = currencyCode;\n widget.domain = domain;\n widget.lang = lang;\n widget.debug = debug;\n\n // Insert widget into DOM\n parentElement.appendChild(widget);\n}\n"],"names":["SHOPIFY_BASE_URL","isBeamCartIntegrationRegistered","SHOPIFY_CART_COOKIE_NAME","registerCartIntegration","config","initNetworkListeners","BeamNetworkCallEvent","_event","event","cartChangePaths","requestUrlStr","url","currentCart","getCurrentCart","updateCart","lastNonprofitId","lastSelectionId","BeamNonprofitSelectEvent","logger","source","selectedNonprofitId","selectionId","WIDGET_NAMES","cartId","getExternalCartId","beamCartId","getBeamCartId","BEAM_CART_COOKIE_NAME","chainId","storeId","appendBeamAttributesToCart","BeamNonprofitSelectionRemovedEvent","newNonprofitId","BeamCartCreatedEvent","appendStatsigToShopifyCartAttributes","BeamCartChangeEvent","showBeam","remoteSessionId","statsig","e","token","total_price","item_count","currency","items","cart_level_discount_applications","getShopifyCart","changed","cachedCart","createScopedLocalStorage","cart","sku","final_line_price","product_id","line_level_discount_allocations","remoteProductIdentifier","localAmount","discounts","discount_application","title","isEqual","trackCart","res","memoizeLast","attributes","existingBeamCartAttrString","existingBeamCartAttr","err","beamCartAttrs","addBeamAttributesToCart","showBeamOrderPageWidgets","parentSelector","apiKey","baseUrl","DEFAULT_BASE_URL","postalCode","discountCodes","countryCode","orderId","email","cartTotal","promoCodes","htmlPromoCodes","currencyCode","domain","lang","debug","parentElement","waitForElement","BeamError","getCookieValue","beamLocalStorage","existingValue","widget"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as U}from"./lodash-P8OIs-at.esm.js";import{d as R,c as k,i as x,h as K,g as F}from"./events-T3hYV1LF.esm.js";import{logger as I}from"../utils/logger.js";import{initNetworkListeners as G}from"../utils/network-listeners.js";import{createScopedLocalStorage as j}from"../utils/local-storage.js";import{memoizeLast as A}from"../utils/memoize-last.js";import"./promoManager--3WXq4at.esm.js";import{B as h}from"./cart-contents-h60geKWa.esm.js";import{O as E}from"./update-cart-mNsQ9K-k.esm.js";import{W as M,D as W}from"./routes-YPOoVIR2.esm.js";import{getExternalCartId as S,getBeamCartId as _}from"../utils/cart.js";import"../components/post-purchase.js";import{waitForElement as q}from"../utils/wait-for-element.js";import{B as z}from"./beam-errors-AMvTvR1C.esm.js";import{getCookieValue as H}from"../utils/cookies.js";const N=window.Shopify?.routes?.root||"/";let P=!1;const B="cart";async function V(e){if(P)return!1;G(),window.addEventListener(R.eventName,async r=>{const t=r,n=/cart\/(add|change|update|clear)/,a=t.detail.type==="xhr"?t.detail.xhr.responseURL:t.detail.response.url,d=new URL(a);if(!n.test(d.pathname))return;const o=await O(e);o.changed&&E(e,o.cart)});let s,c;window.addEventListener(k.eventName,async r=>{const t=r;I.debug("[cart-page][BeamNonprofitSelectEvent]",t.detail);const{source:n,selectedNonprofitId:a,selectionId:d}=t.detail;if(n===M.select_nonprofit){const o=S(B,e),l=_(h,e),{chainId:p,storeId:u}=e;if(s===a&&c===d)return;await g({selectedNonprofitId:a,selectionId:d,beamCartId:l||void 0,cartId:o||void 0,chainId:p,storeId:u}),c=d,s=a}}),window.addEventListener(x.eventName,async r=>{const t=r;I.debug("[cart-page][BeamNonprofitSelectionRemovedEvent]",t.detail);const{newNonprofitId:n,selectionId:a}=t.detail,d=S(B,e),o=_(h,e),{chainId:l,storeId:p}=e;s===n&&c===a||(await g({selectedNonprofitId:n,beamCartId:o||void 0,selectionId:a,cartId:d||void 0,chainId:l,storeId:p}),c=a,s=n)}),window.addEventListener(K.eventName,r=>{const t=r;I.debug("[cart-page][BeamCartCreatedEvent]",t.detail),L(e)}),window.addEventListener(F.eventName,async r=>{const t=r;I.debug("[cart-page][BeamCartChangeEvent]",t.detail),L(e)});const m=await O(e);return await E(e,m.cart,!0),P=!0,!0}async function L(e){let s,c;try{if(window.statsig){const m=window.statsig;s=m.getLayer("beam_trial_layer").get("show_beam",!1),c=m.getStableID();const r=S(B,e),t=_(h,e),{chainId:n,storeId:a}=e;g({showBeam:s,remoteSessionId:c,beamCartId:t||void 0,cartId:r||void 0,chainId:n,storeId:a})}}catch(m){I.error(m)}}async function O(e){const{token:s,total_price:c,item_count:m,currency:r,items:t,cart_level_discount_applications:n}=await T();let a=!1;const d=j(e).getItemJson("cart"),o=_(h,e),l={cartId:s,beamCartId:o,subtotal:c/100,itemCount:m,currencyCode:r,schema:{source:"generic"},content:{items:t.map(({sku:p,final_line_price:u,product_id:y,line_level_discount_allocations:C})=>{const b=p||String(y),v=u/100,f=C?.map(({discount_application:w})=>({code:w?.title,applicable:!0}));return{remoteProductIdentifier:b,localAmount:v,discounts:f}}),discounts:n.map(({title:p})=>({code:p,applicable:!0}))}};return U(l,{...d,beamCartId:d?.beamCartId})||(a=!0),{changed:a,cart:l}}const $=E,T=async function(){return await window.fetch(N+"cart.js",{method:"GET",headers:{"Content-Type":"application/json"}}).then(e=>e.json())},g=A(async function({selectedNonprofitId:e,selectionId:s,beamCartId:c,cartId:m,chainId:r,storeId:t,showBeam:n,remoteSessionId:a}){const{attributes:d}=await T(),o=d?.beam;let l={};try{o&&(l=JSON.parse(o))}catch(u){I.error(u)}const p={beam:JSON.stringify({...l,nonprofit_id:e,selection_id:s,beam_cart_id:c,shopify_cart_id:m,chain_id:r,store_id:t,show_beam:n,remote_session_id:a})};if(!U(p.beam,l))try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:p})})}catch(u){I.error(u)}}),Q=A(async function({selectedNonprofitId:e,selectionId:s,beamCartId:c,cartId:m,chainId:r,storeId:t}){let n,a;try{if(window.statsig){const o=window.statsig;n=o.getLayer("beam_trial_layer").get("show_beam",!1),a=o.getStableID()}}catch(o){I.error(o)}const d={beam:JSON.stringify({nonprofit_id:e,selection_id:s,beam_cart_id:c,shopify_cart_id:m,chain_id:r,store_id:t,show_beam:n,remote_session_id:a})};try{await window.fetch(N+"cart/update.js",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({attributes:d})})}catch(o){I.error(o)}});async function X({parentSelector:e=".step__sections",apiKey:s,baseUrl:c=W,storeId:m,postalCode:r,discountCodes:t,countryCode:n,orderId:a,email:d,cartTotal:o,cart:l,promoCodes:p,htmlPromoCodes:u,currencyCode:y="USD",domain:C,lang:b="en",debug:v=!1}){const f=document.querySelector(e)||await q(e);if(!f)throw new z(`Timed out waiting for selector '${e}'. Could not render Beam post-purchase widget.`);const w=await H("cart");if(w){const J=j({apiKey:s}),D=J.getItemJson("cart")||{};J.setItemJson("cart",{...D,cartId:w})}const i=document.createElement("beam-post-purchase");i.apiKey=s,i.baseUrl=c,i.storeId=m,i.postalCode=r,i.countryCode=n,i.orderId=String(a),i.email=d,i.cartTotal=o,i.cart=l,i.promoCodes=p,i.htmlPromoCodes=u,i.discountCodes=t,i.currencyCode=y,i.domain=C,i.lang=b,i.debug=v,f.appendChild(i)}export{V as F,$ as G,Q as H,L as S,O as _,g,X as s,T as v};
2
+ //# sourceMappingURL=order-page-ZpOf35sP.esm.js.map