@internetarchive/donation-form 1.0.2 → 1.0.3-alpha-webdev7960.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +115 -115
  3. package/dist/demo/braintree-endpoint-manager.js.map +1 -1
  4. package/dist/demo/demo-analytics-handler.js.map +1 -1
  5. package/dist/demo/submit-form-with.js.map +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/src/braintree-manager/braintree-interfaces.js.map +1 -1
  8. package/dist/src/braintree-manager/braintree-manager.js.map +1 -1
  9. package/dist/src/braintree-manager/payment-clients.js.map +1 -1
  10. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.js.map +1 -1
  11. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.js.map +1 -1
  12. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.js.map +1 -1
  13. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.js.map +1 -1
  14. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.js.map +1 -1
  15. package/dist/src/braintree-manager/payment-providers/apple-pay/apple-pay.js.map +1 -1
  16. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card-interface.js.map +1 -1
  17. package/dist/src/braintree-manager/payment-providers/credit-card/credit-card.js.map +1 -1
  18. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.js.map +1 -1
  19. package/dist/src/braintree-manager/payment-providers/credit-card/hosted-field-container.js.map +1 -1
  20. package/dist/src/braintree-manager/payment-providers/google-pay-interface.js.map +1 -1
  21. package/dist/src/braintree-manager/payment-providers/google-pay.js.map +1 -1
  22. package/dist/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.js.map +1 -1
  23. package/dist/src/braintree-manager/payment-providers/paypal/paypal-interface.js.map +1 -1
  24. package/dist/src/braintree-manager/payment-providers/paypal/paypal.js.map +1 -1
  25. package/dist/src/braintree-manager/payment-providers/venmo-interface.js.map +1 -1
  26. package/dist/src/braintree-manager/payment-providers/venmo.js.map +1 -1
  27. package/dist/src/braintree-manager/payment-providers-interface.js.map +1 -1
  28. package/dist/src/braintree-manager/payment-providers.js.map +1 -1
  29. package/dist/src/donation-form-controller.js +123 -123
  30. package/dist/src/donation-form-controller.js.map +1 -1
  31. package/dist/src/donation-form-error.js.map +1 -1
  32. package/dist/src/donation-form.js +107 -107
  33. package/dist/src/donation-form.js.map +1 -1
  34. package/dist/src/form-elements/badged-input.js +47 -47
  35. package/dist/src/form-elements/badged-input.js.map +1 -1
  36. package/dist/src/form-elements/contact-form/autocomplete-field-options.js.map +1 -1
  37. package/dist/src/form-elements/contact-form/contact-form.js +157 -157
  38. package/dist/src/form-elements/contact-form/contact-form.js.map +1 -1
  39. package/dist/src/form-elements/contact-form/countries.js.map +1 -1
  40. package/dist/src/form-elements/header/donation-form-header.js +14 -14
  41. package/dist/src/form-elements/header/donation-form-header.js.map +1 -1
  42. package/dist/src/form-elements/header/donation-summary.js +15 -15
  43. package/dist/src/form-elements/header/donation-summary.js.map +1 -1
  44. package/dist/src/form-elements/payment-selector.js +164 -164
  45. package/dist/src/form-elements/payment-selector.js.map +1 -1
  46. package/dist/src/form-elements/total-amount.js +16 -16
  47. package/dist/src/form-elements/total-amount.js.map +1 -1
  48. package/dist/src/modals/confirm-donation-modal-content.js +51 -51
  49. package/dist/src/modals/confirm-donation-modal-content.js.map +1 -1
  50. package/dist/src/modals/error-modal-content.js +22 -22
  51. package/dist/src/modals/error-modal-content.js.map +1 -1
  52. package/dist/src/modals/upsell-modal-content.js +182 -182
  53. package/dist/src/modals/upsell-modal-content.js.map +1 -1
  54. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.js +20 -20
  55. package/dist/src/payment-flow-handlers/donation-flow-modal-manager.js.map +1 -1
  56. package/dist/src/payment-flow-handlers/handlers/applepay-flow-handler.js.map +1 -1
  57. package/dist/src/payment-flow-handlers/handlers/creditcard-flow-handler.js.map +1 -1
  58. package/dist/src/payment-flow-handlers/handlers/googlepay-flow-handler.js.map +1 -1
  59. package/dist/src/payment-flow-handlers/handlers/paypal-flow-handler.js.map +1 -1
  60. package/dist/src/payment-flow-handlers/handlers/venmo-flow-handler.js.map +1 -1
  61. package/dist/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.js.map +1 -1
  62. package/dist/src/payment-flow-handlers/payment-flow-handlers.js.map +1 -1
  63. package/dist/src/recaptcha-manager/recaptcha-manager.js.map +1 -1
  64. package/dist/src/util/promisedSleep.js.map +1 -1
  65. package/dist/test/helpers/fillInContactForm.js.map +1 -1
  66. package/dist/test/mocks/flow-handlers/individual-handlers/mock-applepay-flow-handler.js.map +1 -1
  67. package/dist/test/mocks/flow-handlers/individual-handlers/mock-creditcard-flow-handler.js.map +1 -1
  68. package/dist/test/mocks/flow-handlers/individual-handlers/mock-googlepay-flow-handler.js.map +1 -1
  69. package/dist/test/mocks/flow-handlers/individual-handlers/mock-paypal-flow-handler.js.map +1 -1
  70. package/dist/test/mocks/flow-handlers/individual-handlers/mock-venmo-flow-handler.js.map +1 -1
  71. package/dist/test/mocks/flow-handlers/mock-payment-flow-handlers.js.map +1 -1
  72. package/dist/test/mocks/mock-braintree-manager.js.map +1 -1
  73. package/dist/test/mocks/mock-donation-info.js.map +1 -1
  74. package/dist/test/mocks/mock-endpoint-manager.js.map +1 -1
  75. package/dist/test/mocks/mock-hosted-fields-config.js.map +1 -1
  76. package/dist/test/mocks/mock-hosted-fields-container.js.map +1 -1
  77. package/dist/test/mocks/mock-lazy-loader.js.map +1 -1
  78. package/dist/test/mocks/mock-modal-manager.js.map +1 -1
  79. package/dist/test/mocks/mock-payment-clients.js.map +1 -1
  80. package/dist/test/mocks/mock-paypal-button-renderer.js.map +1 -1
  81. package/dist/test/mocks/mock-recaptcha-manager.js.map +1 -1
  82. package/dist/test/mocks/models/mock-billing-info.js.map +1 -1
  83. package/dist/test/mocks/models/mock-custom-fields.js.map +1 -1
  84. package/dist/test/mocks/models/mock-customer-info.js.map +1 -1
  85. package/dist/test/mocks/models/mock-donation-request.js.map +1 -1
  86. package/dist/test/mocks/models/mock-success-response.js.map +1 -1
  87. package/dist/test/mocks/payment-clients/mock-applepay-client.js.map +1 -1
  88. package/dist/test/mocks/payment-clients/mock-applepay-payment.js.map +1 -1
  89. package/dist/test/mocks/payment-clients/mock-applepay-paymentauthorizedevent.js.map +1 -1
  90. package/dist/test/mocks/payment-clients/mock-applepay-session.js.map +1 -1
  91. package/dist/test/mocks/payment-clients/mock-applepay-sessionmanager.js.map +1 -1
  92. package/dist/test/mocks/payment-clients/mock-applepay-validatemerchantevent.js.map +1 -1
  93. package/dist/test/mocks/payment-clients/mock-braintree-client.js.map +1 -1
  94. package/dist/test/mocks/payment-clients/mock-data-collector.js.map +1 -1
  95. package/dist/test/mocks/payment-clients/mock-googlepay-client.js.map +1 -1
  96. package/dist/test/mocks/payment-clients/mock-googlepay-library.js.map +1 -1
  97. package/dist/test/mocks/payment-clients/mock-grecaptcha.js.map +1 -1
  98. package/dist/test/mocks/payment-clients/mock-hostedfields-client.js.map +1 -1
  99. package/dist/test/mocks/payment-clients/mock-hostedfieldstateobject-generator.js.map +1 -1
  100. package/dist/test/mocks/payment-clients/mock-hostedfieldtokenizepayload.js.map +1 -1
  101. package/dist/test/mocks/payment-clients/mock-paypal-client.js.map +1 -1
  102. package/dist/test/mocks/payment-clients/mock-paypal-library.js.map +1 -1
  103. package/dist/test/mocks/payment-clients/mock-venmo-client.js.map +1 -1
  104. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-datasource-delegate.js.map +1 -1
  105. package/dist/test/mocks/payment-providers/individual-providers/mock-applepay-handler.js.map +1 -1
  106. package/dist/test/mocks/payment-providers/individual-providers/mock-creditcard-handler.js.map +1 -1
  107. package/dist/test/mocks/payment-providers/individual-providers/mock-googlepay-handler.js.map +1 -1
  108. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource-delegate.js.map +1 -1
  109. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-button-datasource.js.map +1 -1
  110. package/dist/test/mocks/payment-providers/individual-providers/mock-paypal-handler.js.map +1 -1
  111. package/dist/test/mocks/payment-providers/individual-providers/mock-venmo-handler.js.map +1 -1
  112. package/dist/test/mocks/payment-providers/mock-payment-providers.js.map +1 -1
  113. package/dist/test/tests/braintree-manager.test.js.map +1 -1
  114. package/dist/test/tests/donation-form-controller.test.js +39 -39
  115. package/dist/test/tests/donation-form-controller.test.js.map +1 -1
  116. package/dist/test/tests/donation-form.test.js +4 -4
  117. package/dist/test/tests/donation-form.test.js.map +1 -1
  118. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.js +14 -14
  119. package/dist/test/tests/flow-handlers/donation-flow-modal-manager.test.js.map +1 -1
  120. package/dist/test/tests/form-elements/donation-summary.test.js.map +1 -1
  121. package/dist/test/tests/form-elements/payment-selector.test.js.map +1 -1
  122. package/dist/test/tests/modals/error-modal-content.test.js +2 -2
  123. package/dist/test/tests/modals/error-modal-content.test.js.map +1 -1
  124. package/dist/test/tests/modals/upsell-modal-content.test.js +31 -31
  125. package/dist/test/tests/modals/upsell-modal-content.test.js.map +1 -1
  126. package/dist/test/tests/models/donation-payment-info.test.js.map +1 -1
  127. package/dist/test/tests/payment-clients.test.js.map +1 -1
  128. package/dist/test/tests/payment-providers/applepay-sessiondatasource.test.js.map +1 -1
  129. package/dist/test/tests/payment-providers/applepay-sessionmanager.test.js.map +1 -1
  130. package/dist/test/tests/payment-providers/applepay.test.js.map +1 -1
  131. package/dist/test/tests/payment-providers/creditcard.test.js.map +1 -1
  132. package/dist/test/tests/payment-providers/googlepay.test.js.map +1 -1
  133. package/dist/test/tests/payment-providers/payment-providers.test.js.map +1 -1
  134. package/dist/test/tests/payment-providers/paypal-button-datasource.test.js.map +1 -1
  135. package/dist/test/tests/payment-providers/paypal.test.js.map +1 -1
  136. package/dist/test/tests/payment-providers/venmo.test.js.map +1 -1
  137. package/dist/test/tests/recaptcha-manager.test.js.map +1 -1
  138. package/package.json +107 -107
  139. package/src/@types/analytics-handler/index.d.ts +8 -8
  140. package/src/@types/braintree-web/LICENSE +21 -21
  141. package/src/@types/braintree-web/index.d.ts +93 -93
  142. package/src/@types/braintree-web/modules/american-express.d.ts +50 -50
  143. package/src/@types/braintree-web/modules/apple-pay.d.ts +213 -213
  144. package/src/@types/braintree-web/modules/client.d.ts +103 -103
  145. package/src/@types/braintree-web/modules/core.d.ts +34 -34
  146. package/src/@types/braintree-web/modules/data-collector.d.ts +13 -13
  147. package/src/@types/braintree-web/modules/google-payment.d.ts +269 -269
  148. package/src/@types/braintree-web/modules/hosted-fields.d.ts +366 -366
  149. package/src/@types/braintree-web/modules/paypal-checkout.d.ts +262 -262
  150. package/src/@types/braintree-web/modules/paypal.d.ts +177 -177
  151. package/src/@types/braintree-web/modules/three-d-secure.d.ts +141 -141
  152. package/src/@types/braintree-web/modules/unionpay.d.ts +224 -224
  153. package/src/@types/braintree-web/modules/us-bank-account.d.ts +81 -81
  154. package/src/@types/braintree-web/modules/venmo.d.ts +110 -110
  155. package/src/@types/braintree-web/package.json +64 -64
  156. package/src/@types/paypal-checkout-components/LICENSE +21 -21
  157. package/src/@types/paypal-checkout-components/index.d.ts +67 -67
  158. package/src/@types/paypal-checkout-components/modules/button.d.ts +50 -50
  159. package/src/@types/paypal-checkout-components/modules/callback-data.d.ts +244 -244
  160. package/src/@types/paypal-checkout-components/modules/configuration.d.ts +114 -114
  161. package/src/@types/paypal-checkout-components/package.json +58 -58
  162. package/src/braintree-manager/braintree-interfaces.ts +172 -172
  163. package/src/braintree-manager/braintree-manager.ts +281 -281
  164. package/src/braintree-manager/payment-clients.ts +146 -146
  165. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.ts +13 -13
  166. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.ts +8 -8
  167. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.ts +10 -10
  168. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.ts +119 -119
  169. package/src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.ts +21 -21
  170. package/src/braintree-manager/payment-providers/apple-pay/apple-pay.ts +97 -97
  171. package/src/braintree-manager/payment-providers/credit-card/credit-card-interface.ts +21 -21
  172. package/src/braintree-manager/payment-providers/credit-card/credit-card.ts +130 -130
  173. package/src/braintree-manager/payment-providers/credit-card/hosted-field-configuration.ts +19 -19
  174. package/src/braintree-manager/payment-providers/credit-card/hosted-field-container.ts +85 -85
  175. package/src/braintree-manager/payment-providers/google-pay-interface.ts +8 -8
  176. package/src/braintree-manager/payment-providers/google-pay.ts +59 -59
  177. package/src/braintree-manager/payment-providers/paypal/paypal-button-datasource.ts +218 -218
  178. package/src/braintree-manager/payment-providers/paypal/paypal-interface.ts +13 -13
  179. package/src/braintree-manager/payment-providers/paypal/paypal.ts +78 -78
  180. package/src/braintree-manager/payment-providers/venmo-interface.ts +8 -8
  181. package/src/braintree-manager/payment-providers/venmo.ts +67 -67
  182. package/src/braintree-manager/payment-providers-interface.ts +25 -25
  183. package/src/braintree-manager/payment-providers.ts +147 -147
  184. package/src/donation-form-controller.ts +623 -623
  185. package/src/donation-form-error.ts +6 -6
  186. package/src/donation-form.ts +576 -576
  187. package/src/form-elements/badged-input.ts +109 -109
  188. package/src/form-elements/contact-form/autocomplete-field-options.ts +63 -63
  189. package/src/form-elements/contact-form/contact-form.ts +434 -434
  190. package/src/form-elements/contact-form/countries.ts +252 -252
  191. package/src/form-elements/header/donation-form-header.ts +98 -98
  192. package/src/form-elements/header/donation-summary.ts +61 -61
  193. package/src/form-elements/payment-selector.ts +365 -365
  194. package/src/form-elements/total-amount.ts +46 -46
  195. package/src/modals/confirm-donation-modal-content.ts +168 -168
  196. package/src/modals/error-modal-content.ts +48 -48
  197. package/src/modals/upsell-modal-content.ts +284 -284
  198. package/src/payment-flow-handlers/donation-flow-modal-manager.ts +439 -439
  199. package/src/payment-flow-handlers/handlers/applepay-flow-handler.ts +109 -109
  200. package/src/payment-flow-handlers/handlers/creditcard-flow-handler.ts +232 -232
  201. package/src/payment-flow-handlers/handlers/googlepay-flow-handler.ts +111 -111
  202. package/src/payment-flow-handlers/handlers/paypal-flow-handler.ts +331 -331
  203. package/src/payment-flow-handlers/handlers/venmo-flow-handler.ts +119 -119
  204. package/src/payment-flow-handlers/handlers/venmo-restoration-state-handler.ts +127 -127
  205. package/src/payment-flow-handlers/payment-flow-handlers.ts +218 -218
  206. package/src/recaptcha-manager/recaptcha-manager.ts +123 -123
  207. package/src/util/promisedSleep.ts +3 -3
  208. package/dist/demo/app-root.d.ts +0 -0
  209. package/dist/demo/app-root.js +0 -2
  210. package/dist/demo/app-root.js.map +0 -1
package/README.md CHANGED
@@ -1,115 +1,115 @@
1
- # \<donation-form>
2
-
3
- The Internet Archive Donation Form
4
-
5
- ![Donation Form](./assets/img/screenshot.png "Donation Form")
6
-
7
- ## Installation
8
- ```bash
9
- yarn add @internetarchive/donation-form
10
- ```
11
-
12
- ## Usage
13
- ```html
14
- <script type="module">
15
- import '@internetarchive/donation-form';
16
- import '@internetarchive/modal-manager';
17
- // create an endpoint manager that conforms to `BraintreeEndpointManagerInterface`
18
- import BraintreeEndpointManager from './braintree-endpoint-manager.js';
19
-
20
- // instantiate the endpoint manager
21
- const endpointManager = new BraintreeEndpointManager();
22
- const formController = document.querySelector('donation-form-controller');
23
- const modalManager = document.querySelector('modal-manager');
24
- const recaptchaElement = document.querySelector('#recaptcha');
25
-
26
- // pass in all of the dependencies to the <donation-form-controller>
27
- formController.endpointManager = endpointManager;
28
- formController.modalManager = modalManager;
29
- formController.recaptchaElement = recaptchaElement;
30
- formController.analyticsHandler = window.archive_analytics;
31
- </script>
32
-
33
- <!--
34
- There's some environment-specific styling, depending on the host
35
- layout and configuration
36
- -->
37
- <style>
38
- donation-form-controller {
39
- min-height: 362px;
40
- display: block;
41
- }
42
-
43
- body.modal-manager-open {
44
- overflow: hidden;
45
- }
46
-
47
- modal-manager {
48
- display: none;
49
- --modalBottomMargin: 10px;
50
- --modalWidth: 320px;
51
- }
52
-
53
- modal-manager[mode='open'] {
54
- display: block;
55
- }
56
-
57
- #recaptcha {
58
- position: absolute;
59
- z-index: 10;
60
- }
61
- </style>
62
-
63
- <!--
64
- The <donation-form-controller> orchestrates the interactions
65
- between the donation-form itself and other dependencies like
66
- the modal manager, recaptcha, and some clear DOM dependencies
67
- like the PayPal button and Braintree hosted fields.
68
-
69
- The <donation-form> component can be used independently of the
70
- controller, but will need something to handle some of the interactions.
71
- -->
72
- <donation-form-controller
73
- environment='dev/prod'
74
- braintreeAuthToken='{braintree_auth_token}'
75
- recaptchaSiteKey='{recaptcha_key}'
76
- venmoProfileId='{venmo_profile_id}'
77
- googlePayMerchantId='{google_merchant_id}'
78
- referrer='{referrer}'
79
- loggedInUser='{logged_in_user}'>
80
- </donation-form-controller>
81
-
82
- <div id="recaptcha"></div>
83
-
84
- <modal-manager>
85
- <!--
86
- The PayPal button does not work in the shadow DOM so it
87
- must be slotted in from the top.
88
- -->
89
- <div slot="paypal-upsell-button">
90
- <div id="paypal-upsell-button"></div>
91
- </div>
92
- </modal-manager>
93
- ```
94
-
95
- # Development
96
-
97
- ## Prerequisite
98
- ```bash
99
- yarn install
100
- ```
101
-
102
- ## Start Development Server
103
- ```bash
104
- yarn run start
105
- ```
106
-
107
- ## Testing
108
- ```bash
109
- yarn run test
110
- ```
111
-
112
- ## Linting
113
- ```bash
114
- yarn lint
115
- ```
1
+ # \<donation-form>
2
+
3
+ The Internet Archive Donation Form
4
+
5
+ ![Donation Form](./assets/img/screenshot.png "Donation Form")
6
+
7
+ ## Installation
8
+ ```bash
9
+ yarn add @internetarchive/donation-form
10
+ ```
11
+
12
+ ## Usage
13
+ ```html
14
+ <script type="module">
15
+ import '@internetarchive/donation-form';
16
+ import '@internetarchive/modal-manager';
17
+ // create an endpoint manager that conforms to `BraintreeEndpointManagerInterface`
18
+ import BraintreeEndpointManager from './braintree-endpoint-manager.js';
19
+
20
+ // instantiate the endpoint manager
21
+ const endpointManager = new BraintreeEndpointManager();
22
+ const formController = document.querySelector('donation-form-controller');
23
+ const modalManager = document.querySelector('modal-manager');
24
+ const recaptchaElement = document.querySelector('#recaptcha');
25
+
26
+ // pass in all of the dependencies to the <donation-form-controller>
27
+ formController.endpointManager = endpointManager;
28
+ formController.modalManager = modalManager;
29
+ formController.recaptchaElement = recaptchaElement;
30
+ formController.analyticsHandler = window.archive_analytics;
31
+ </script>
32
+
33
+ <!--
34
+ There's some environment-specific styling, depending on the host
35
+ layout and configuration
36
+ -->
37
+ <style>
38
+ donation-form-controller {
39
+ min-height: 362px;
40
+ display: block;
41
+ }
42
+
43
+ body.modal-manager-open {
44
+ overflow: hidden;
45
+ }
46
+
47
+ modal-manager {
48
+ display: none;
49
+ --modalBottomMargin: 10px;
50
+ --modalWidth: 320px;
51
+ }
52
+
53
+ modal-manager[mode='open'] {
54
+ display: block;
55
+ }
56
+
57
+ #recaptcha {
58
+ position: absolute;
59
+ z-index: 10;
60
+ }
61
+ </style>
62
+
63
+ <!--
64
+ The <donation-form-controller> orchestrates the interactions
65
+ between the donation-form itself and other dependencies like
66
+ the modal manager, recaptcha, and some clear DOM dependencies
67
+ like the PayPal button and Braintree hosted fields.
68
+
69
+ The <donation-form> component can be used independently of the
70
+ controller, but will need something to handle some of the interactions.
71
+ -->
72
+ <donation-form-controller
73
+ environment='dev/prod'
74
+ braintreeAuthToken='{braintree_auth_token}'
75
+ recaptchaSiteKey='{recaptcha_key}'
76
+ venmoProfileId='{venmo_profile_id}'
77
+ googlePayMerchantId='{google_merchant_id}'
78
+ referrer='{referrer}'
79
+ loggedInUser='{logged_in_user}'>
80
+ </donation-form-controller>
81
+
82
+ <div id="recaptcha"></div>
83
+
84
+ <modal-manager>
85
+ <!--
86
+ The PayPal button does not work in the shadow DOM so it
87
+ must be slotted in from the top.
88
+ -->
89
+ <div slot="paypal-upsell-button">
90
+ <div id="paypal-upsell-button"></div>
91
+ </div>
92
+ </modal-manager>
93
+ ```
94
+
95
+ # Development
96
+
97
+ ## Prerequisite
98
+ ```bash
99
+ yarn install
100
+ ```
101
+
102
+ ## Start Development Server
103
+ ```bash
104
+ yarn run start
105
+ ```
106
+
107
+ ## Testing
108
+ ```bash
109
+ yarn run test
110
+ ```
111
+
112
+ ## Linting
113
+ ```bash
114
+ yarn lint
115
+ ```
@@ -1 +1 @@
1
- {"version":3,"file":"braintree-endpoint-manager.js","sourceRoot":"","sources":["../../demo/braintree-endpoint-manager.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,QAAQ,MAAM,aAAa,CAAC;AAUnC,MAAM,OAAO,wBAAwB;IAC7B,UAAU,CAAC,OAAwB;;YACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,mFAAmF,EACnF;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CACF,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAED,kBAAkB,CAAC,OAGlB;QACC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;QACzC,MAAM,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAErD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,OAAO,GAA0C;YACrD,MAAM,EAAE,GAAG,aAAa,EAAE;YAC1B,WAAW,EAAE,QAAQ,CAAC,cAAc;YACpC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY;YAClE,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;YACvC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;YACrC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK;SAC/B,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC;YAC3C,MAAM,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC;YACrD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YACnD,OAAO,CAAC,eAAe,CAAC,GAAG,GAAG,mBAAmB,EAAE,CAAC;YACpD,OAAO,CAAC,kBAAkB,CAAC,GAAG,cAAc,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAEpD,cAAc,CAAC;YACb,MAAM,EAAE,8DAA8D,OAAO,EAAE;YAC/E,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { submitFormWith } from './submit-form-with';\nimport currency from 'currency.js';\n\nimport {\n SuccessResponse,\n DonationRequest,\n DonationResponse,\n} from '@internetarchive/donation-form-data-models';\n\nimport { BraintreeEndpointManagerInterface } from '../index';\n\nexport class BraintreeEndpointManager implements BraintreeEndpointManagerInterface {\n async submitData(request: DonationRequest): Promise<DonationResponse> {\n const response = await fetch(\n 'https://ia-petabox.archive.org/services/donations/braintree-charge.php?debug=true',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify(request),\n },\n );\n const json = await response.json();\n return json;\n }\n\n donationSuccessful(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void {\n const response = options.successResponse;\n const upsellResponse = options.upsellSuccessResponse;\n\n const displayAmount = currency(response.amount);\n\n const payload: { [key: string]: string | undefined } = {\n amount: `${displayAmount}`,\n 'charge-id': response.transaction_id,\n 'donation-type': upsellResponse ? 'upsell' : response.donationType,\n first_name: response.customer.firstName,\n last_name: response.customer.lastName,\n email: response.customer.email,\n };\n\n if (upsellResponse) {\n const upsellAmount = upsellResponse.amount;\n const upsellChargeId = upsellResponse.transaction_id;\n const displayUpsellAmount = currency(upsellAmount);\n payload['upsell-amount'] = `${displayUpsellAmount}`;\n payload['upsell-charge-id'] = upsellChargeId;\n }\n\n const service = encodeURI(response.paymentProvider);\n\n submitFormWith({\n action: `https://www-jasonb.archive.org/services/donate.php?service=${service}`,\n fields: payload,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"braintree-endpoint-manager.js","sourceRoot":"","sources":["../../demo/braintree-endpoint-manager.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,QAAQ,MAAM,aAAa,CAAC;AAUnC,MAAM,OAAO,wBAAwB;IAC7B,UAAU,CAAC,OAAwB;;YACvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,mFAAmF,EACnF;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CACF,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAED,kBAAkB,CAAC,OAGlB;QACC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;QACzC,MAAM,cAAc,GAAG,OAAO,CAAC,qBAAqB,CAAC;QAErD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,OAAO,GAA0C;YACrD,MAAM,EAAE,GAAG,aAAa,EAAE;YAC1B,WAAW,EAAE,QAAQ,CAAC,cAAc;YACpC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY;YAClE,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS;YACvC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ;YACrC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK;SAC/B,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC;YAC3C,MAAM,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC;YACrD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;YACnD,OAAO,CAAC,eAAe,CAAC,GAAG,GAAG,mBAAmB,EAAE,CAAC;YACpD,OAAO,CAAC,kBAAkB,CAAC,GAAG,cAAc,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAEpD,cAAc,CAAC;YACb,MAAM,EAAE,8DAA8D,OAAO,EAAE;YAC/E,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { submitFormWith } from './submit-form-with';\r\nimport currency from 'currency.js';\r\n\r\nimport {\r\n SuccessResponse,\r\n DonationRequest,\r\n DonationResponse,\r\n} from '@internetarchive/donation-form-data-models';\r\n\r\nimport { BraintreeEndpointManagerInterface } from '../index';\r\n\r\nexport class BraintreeEndpointManager implements BraintreeEndpointManagerInterface {\r\n async submitData(request: DonationRequest): Promise<DonationResponse> {\r\n const response = await fetch(\r\n 'https://ia-petabox.archive.org/services/donations/braintree-charge.php?debug=true',\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n },\r\n body: JSON.stringify(request),\r\n },\r\n );\r\n const json = await response.json();\r\n return json;\r\n }\r\n\r\n donationSuccessful(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void {\r\n const response = options.successResponse;\r\n const upsellResponse = options.upsellSuccessResponse;\r\n\r\n const displayAmount = currency(response.amount);\r\n\r\n const payload: { [key: string]: string | undefined } = {\r\n amount: `${displayAmount}`,\r\n 'charge-id': response.transaction_id,\r\n 'donation-type': upsellResponse ? 'upsell' : response.donationType,\r\n first_name: response.customer.firstName,\r\n last_name: response.customer.lastName,\r\n email: response.customer.email,\r\n };\r\n\r\n if (upsellResponse) {\r\n const upsellAmount = upsellResponse.amount;\r\n const upsellChargeId = upsellResponse.transaction_id;\r\n const displayUpsellAmount = currency(upsellAmount);\r\n payload['upsell-amount'] = `${displayUpsellAmount}`;\r\n payload['upsell-charge-id'] = upsellChargeId;\r\n }\r\n\r\n const service = encodeURI(response.paymentProvider);\r\n\r\n submitFormWith({\r\n action: `https://www-jasonb.archive.org/services/donate.php?service=${service}`,\r\n fields: payload,\r\n });\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"demo-analytics-handler.js","sourceRoot":"","sources":["../../demo/demo-analytics-handler.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IAG/B,SAAS,CAAC,OAKT;QACC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,aAAa,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,KAAK,EAAE,CAAC;QACpH,OAAO,CAAC,KAAK,CACX,oCAAoC,oBAC/B,OAAO,GACZ,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,OAKnB;QACC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,aAAa,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,KAAK,EAAE,CAAC;QACpH,OAAO,CAAC,KAAK,CACX,8CAA8C,oBACzC,OAAO,GACZ,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,MAA2B;QAClC,OAAO,CAAC,KAAK,CAAC,mCAAmC,oBAAO,MAAM,EAAG,CAAC;IACpE,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\nexport class DemoAnalyticsHandler implements AnalyticsManagerInterface {\n nodeToUpdate!: HTMLElement;\n\n sendEvent(options: {\n category: string;\n action: string;\n label?: string;\n additionalEventParams?: object;\n }): void {\n this.nodeToUpdate.innerHTML = `Category: ${options.category} - Action: ${options.action} - Label: ${options.label}`;\n console.debug(\n 'DemoAnalyticsHandler -- sendEvent ',\n { ...options },\n this.nodeToUpdate.innerHTML,\n );\n }\n\n sendEventNoSampling(options: {\n category: string;\n action: string;\n label?: string;\n additionalEventParams?: object;\n }): void {\n this.nodeToUpdate.innerHTML = `Category: ${options.category} - Action: ${options.action} - Label: ${options.label}`;\n console.debug(\n 'DemoAnalyticsHandler -- sendEventNoSampling ',\n { ...options },\n this.nodeToUpdate.innerHTML,\n );\n }\n\n sendPing(values: Record<string, any>): void {\n console.debug('DemoAnalyticsHandler -- sendPing ', { ...values });\n }\n}\n"]}
1
+ {"version":3,"file":"demo-analytics-handler.js","sourceRoot":"","sources":["../../demo/demo-analytics-handler.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,oBAAoB;IAG/B,SAAS,CAAC,OAKT;QACC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,aAAa,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,KAAK,EAAE,CAAC;QACpH,OAAO,CAAC,KAAK,CACX,oCAAoC,oBAC/B,OAAO,GACZ,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,OAKnB;QACC,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,aAAa,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,KAAK,EAAE,CAAC;QACpH,OAAO,CAAC,KAAK,CACX,8CAA8C,oBACzC,OAAO,GACZ,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,MAA2B;QAClC,OAAO,CAAC,KAAK,CAAC,mCAAmC,oBAAO,MAAM,EAAG,CAAC;IACpE,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { AnalyticsManagerInterface } from '@internetarchive/analytics-manager';\r\nexport class DemoAnalyticsHandler implements AnalyticsManagerInterface {\r\n nodeToUpdate!: HTMLElement;\r\n\r\n sendEvent(options: {\r\n category: string;\r\n action: string;\r\n label?: string;\r\n additionalEventParams?: object;\r\n }): void {\r\n this.nodeToUpdate.innerHTML = `Category: ${options.category} - Action: ${options.action} - Label: ${options.label}`;\r\n console.debug(\r\n 'DemoAnalyticsHandler -- sendEvent ',\r\n { ...options },\r\n this.nodeToUpdate.innerHTML,\r\n );\r\n }\r\n\r\n sendEventNoSampling(options: {\r\n category: string;\r\n action: string;\r\n label?: string;\r\n additionalEventParams?: object;\r\n }): void {\r\n this.nodeToUpdate.innerHTML = `Category: ${options.category} - Action: ${options.action} - Label: ${options.label}`;\r\n console.debug(\r\n 'DemoAnalyticsHandler -- sendEventNoSampling ',\r\n { ...options },\r\n this.nodeToUpdate.innerHTML,\r\n );\r\n }\r\n\r\n sendPing(values: Record<string, any>): void {\r\n console.debug('DemoAnalyticsHandler -- sendPing ', { ...values });\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"submit-form-with.js","sourceRoot":"","sources":["../../demo/submit-form-with.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,OAI9B;;IACC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAoB,CAAC;IAC/D,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,MAAM,CAAC;IACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAErB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;IAEpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;QACpB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAElB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;AAChB,CAAC","sourcesContent":["export function submitFormWith(options: {\n method?: string;\n fields: { [key: string]: string | undefined };\n action: string;\n}): void {\n const form = document.createElement('form') as HTMLFormElement;\n form.method = options.method ?? 'POST';\n form.action = options.action;\n form.style.display = 'none';\n form.target = '_top';\n\n document.body.appendChild(form);\n\n const fields = options.fields ?? {};\n\n Object.keys(fields).forEach((name: string) => {\n const input = document.createElement('input');\n input.type = 'text';\n input.name = name;\n\n const value = fields[name];\n\n if (value) {\n input.value = value;\n }\n\n form.appendChild(input);\n });\n\n form.submit();\n}\n"]}
1
+ {"version":3,"file":"submit-form-with.js","sourceRoot":"","sources":["../../demo/submit-form-with.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,OAI9B;;IACC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAoB,CAAC;IAC/D,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,MAAM,CAAC;IACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAErB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;IAEpC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC;QACpB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAElB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;AAChB,CAAC","sourcesContent":["export function submitFormWith(options: {\r\n method?: string;\r\n fields: { [key: string]: string | undefined };\r\n action: string;\r\n}): void {\r\n const form = document.createElement('form') as HTMLFormElement;\r\n form.method = options.method ?? 'POST';\r\n form.action = options.action;\r\n form.style.display = 'none';\r\n form.target = '_top';\r\n\r\n document.body.appendChild(form);\r\n\r\n const fields = options.fields ?? {};\r\n\r\n Object.keys(fields).forEach((name: string) => {\r\n const input = document.createElement('input');\r\n input.type = 'text';\r\n input.name = name;\r\n\r\n const value = fields[name];\r\n\r\n if (value) {\r\n input.value = value;\r\n }\r\n\r\n form.appendChild(input);\r\n });\r\n\r\n form.submit();\r\n}\r\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,GACnB,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,gBAAgB,GAEjB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,mBAAmB,GAEpB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,cAAc,EAA2B,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC","sourcesContent":["export {\n BraintreeManagerInterface,\n BraintreeEndpointManagerInterface,\n HostingEnvironment,\n} from './src/braintree-manager/braintree-interfaces';\n\nexport { DonationFormController } from './src/donation-form-controller';\nexport { DonationForm } from './src/donation-form';\nexport {\n RecaptchaManager,\n RecaptchaManagerInterface,\n} from './src/recaptcha-manager/recaptcha-manager';\nexport {\n PaymentFlowHandlers,\n PaymentFlowHandlersInterface,\n} from './src/payment-flow-handlers/payment-flow-handlers';\nexport { PaymentClients, PaymentClientsInterface } from './src/braintree-manager/payment-clients';\nexport { BraintreeManager } from './src/braintree-manager/braintree-manager';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,kBAAkB,GACnB,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EACL,gBAAgB,GAEjB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EACL,mBAAmB,GAEpB,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,cAAc,EAA2B,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC","sourcesContent":["export {\r\n BraintreeManagerInterface,\r\n BraintreeEndpointManagerInterface,\r\n HostingEnvironment,\r\n} from './src/braintree-manager/braintree-interfaces';\r\n\r\nexport { DonationFormController } from './src/donation-form-controller';\r\nexport { DonationForm } from './src/donation-form';\r\nexport {\r\n RecaptchaManager,\r\n RecaptchaManagerInterface,\r\n} from './src/recaptcha-manager/recaptcha-manager';\r\nexport {\r\n PaymentFlowHandlers,\r\n PaymentFlowHandlersInterface,\r\n} from './src/payment-flow-handlers/payment-flow-handlers';\r\nexport { PaymentClients, PaymentClientsInterface } from './src/braintree-manager/payment-clients';\r\nexport { BraintreeManager } from './src/braintree-manager/braintree-manager';\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"braintree-interfaces.js","sourceRoot":"","sources":["../../../src/braintree-manager/braintree-interfaces.ts"],"names":[],"mappings":"AAwKA,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,yCAAmB,CAAA;AACrB,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B","sourcesContent":["import {\n DonationRequest,\n DonationResponse,\n SuccessResponse,\n PaymentProvider,\n DonationPaymentInfo,\n CustomerInfo,\n BillingInfo,\n} from '@internetarchive/donation-form-data-models';\nimport { PromisedSingleton } from '@internetarchive/promised-singleton';\nimport { Unsubscribe } from 'nanoevents';\nimport { PaymentProvidersInterface } from './payment-providers-interface';\n\nexport interface BraintreeManagerEvents {\n paymentProvidersHostedFieldsRetry: (retryNumber: number) => void;\n paymentProvidersHostedFieldsFailed: (error: unknown) => void;\n}\n\n/**\n * The BraintreeManager is the main entrypoint for much of the common braintree functionality.\n *\n * A single instance of it gets created and passed down through all of the components.\n *\n * @export\n * @interface BraintreeManagerInterface\n */\nexport interface BraintreeManagerInterface {\n on<E extends keyof BraintreeManagerEvents>(\n event: E,\n callback: BraintreeManagerEvents[E],\n ): Unsubscribe;\n\n /**\n * The PaymentProviders class contains the IA-specific handlers for each of the\n * different payment providers.\n *\n * They are generally data-focused, as opposed to UI-focused, but there\n * is some cross-polination between PaymentProviders and FlowHandlers.\n *\n * @type {PaymentProvidersInterface}\n * @memberof BraintreeManagerInterface\n */\n paymentProviders: PaymentProvidersInterface;\n\n /**\n * The Braintree Client instance.\n *\n * This gets used to isntantiate clients for all of the payment providers.\n *\n * @type {PromisedSingleton<braintree.Client>}\n * @memberof BraintreeManagerInterface\n */\n instance: PromisedSingleton<braintree.Client>;\n\n /**\n * Set the referrer for later submission\n *\n * @param {string} referrer\n * @memberof BraintreeManagerInterface\n */\n setReferrer(referrer: string): void;\n\n /**\n * Set the origin for later submission\n *\n * @param {string} origin\n * @memberof BraintreeManagerInterface\n */\n setOrigin(origin: string): void;\n\n /**\n * Set the logged-in user for later submission\n *\n * @param {string} loggedInUser\n * @memberof BraintreeManagerInterface\n */\n setLoggedInUser(loggedInUser: string): void;\n\n /**\n * Perform startup tasts like session resuming\n *\n * @memberof BraintreeManagerInterface\n */\n startup(): void;\n\n /**\n * Submit donation to the backend\n *\n * @param {{\n * nonce: string;\n * paymentProvider: PaymentProvider;\n * donationInfo: DonationPaymentInfo;\n * billingInfo: BillingInfo;\n * customerInfo: CustomerInfo;\n * upsellOnetimeTransactionId?: string;\n * customerId?: string;\n * recaptchaToken?: string;\n * bin?: string; // first 6 digits of CC\n * binName?: string; // credit card bank name\n * }} options\n * @returns {Promise<DonationResponse>}\n * @memberof BraintreeManagerInterface\n */\n submitDonation(options: {\n nonce: string;\n paymentProvider: PaymentProvider;\n donationInfo: DonationPaymentInfo;\n billingInfo: BillingInfo;\n customerInfo: CustomerInfo;\n upsellOnetimeTransactionId?: string;\n customerId?: string;\n recaptchaToken?: string;\n bin?: string; // first 6 digits of CC\n binName?: string; // credit card bank name\n }): Promise<DonationResponse>;\n\n /**\n * Submit the upsell donation\n *\n * @param {{\n * oneTimeDonationResponse: SuccessResponse;\n * amount: number;\n * }} options\n * @returns {Promise<DonationResponse>}\n * @memberof BraintreeManagerInterface\n */\n submitUpsellDonation(options: {\n oneTimeDonationResponse: SuccessResponse;\n amount: number;\n }): Promise<DonationResponse>;\n\n /**\n * Finish the donation after a successful completion.\n *\n * @param {{\n * successResponse: SuccessResponse;\n * upsellSuccessResponse?: SuccessResponse;\n * }} options\n * @memberof BraintreeManagerInterface\n */\n donationSuccessful(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void;\n}\n\nexport interface BraintreeEndpointManagerInterface {\n /**\n * Responsible for submitting a data object to the backend\n * and returning a Promise of the JSON object response.\n *\n * @param {object} data\n * @returns {Promise<object>}\n * @memberof BraintreeEndpointManagerInterface\n */\n submitData(request: DonationRequest): Promise<DonationResponse>;\n\n /**\n * Once the user is finished with the donation flow, either after\n * a monthly donation or an upsell, we notify the endpoint manager\n * so it can redirect the user to the thank you page.\n */\n donationSuccessful(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void;\n}\n\nexport enum HostingEnvironment {\n Development = 'dev',\n Production = 'prod',\n}\n"]}
1
+ {"version":3,"file":"braintree-interfaces.js","sourceRoot":"","sources":["../../../src/braintree-manager/braintree-interfaces.ts"],"names":[],"mappings":"AAwKA,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,yCAAmB,CAAA;AACrB,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B","sourcesContent":["import {\r\n DonationRequest,\r\n DonationResponse,\r\n SuccessResponse,\r\n PaymentProvider,\r\n DonationPaymentInfo,\r\n CustomerInfo,\r\n BillingInfo,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport { PromisedSingleton } from '@internetarchive/promised-singleton';\r\nimport { Unsubscribe } from 'nanoevents';\r\nimport { PaymentProvidersInterface } from './payment-providers-interface';\r\n\r\nexport interface BraintreeManagerEvents {\r\n paymentProvidersHostedFieldsRetry: (retryNumber: number) => void;\r\n paymentProvidersHostedFieldsFailed: (error: unknown) => void;\r\n}\r\n\r\n/**\r\n * The BraintreeManager is the main entrypoint for much of the common braintree functionality.\r\n *\r\n * A single instance of it gets created and passed down through all of the components.\r\n *\r\n * @export\r\n * @interface BraintreeManagerInterface\r\n */\r\nexport interface BraintreeManagerInterface {\r\n on<E extends keyof BraintreeManagerEvents>(\r\n event: E,\r\n callback: BraintreeManagerEvents[E],\r\n ): Unsubscribe;\r\n\r\n /**\r\n * The PaymentProviders class contains the IA-specific handlers for each of the\r\n * different payment providers.\r\n *\r\n * They are generally data-focused, as opposed to UI-focused, but there\r\n * is some cross-polination between PaymentProviders and FlowHandlers.\r\n *\r\n * @type {PaymentProvidersInterface}\r\n * @memberof BraintreeManagerInterface\r\n */\r\n paymentProviders: PaymentProvidersInterface;\r\n\r\n /**\r\n * The Braintree Client instance.\r\n *\r\n * This gets used to isntantiate clients for all of the payment providers.\r\n *\r\n * @type {PromisedSingleton<braintree.Client>}\r\n * @memberof BraintreeManagerInterface\r\n */\r\n instance: PromisedSingleton<braintree.Client>;\r\n\r\n /**\r\n * Set the referrer for later submission\r\n *\r\n * @param {string} referrer\r\n * @memberof BraintreeManagerInterface\r\n */\r\n setReferrer(referrer: string): void;\r\n\r\n /**\r\n * Set the origin for later submission\r\n *\r\n * @param {string} origin\r\n * @memberof BraintreeManagerInterface\r\n */\r\n setOrigin(origin: string): void;\r\n\r\n /**\r\n * Set the logged-in user for later submission\r\n *\r\n * @param {string} loggedInUser\r\n * @memberof BraintreeManagerInterface\r\n */\r\n setLoggedInUser(loggedInUser: string): void;\r\n\r\n /**\r\n * Perform startup tasts like session resuming\r\n *\r\n * @memberof BraintreeManagerInterface\r\n */\r\n startup(): void;\r\n\r\n /**\r\n * Submit donation to the backend\r\n *\r\n * @param {{\r\n * nonce: string;\r\n * paymentProvider: PaymentProvider;\r\n * donationInfo: DonationPaymentInfo;\r\n * billingInfo: BillingInfo;\r\n * customerInfo: CustomerInfo;\r\n * upsellOnetimeTransactionId?: string;\r\n * customerId?: string;\r\n * recaptchaToken?: string;\r\n * bin?: string; // first 6 digits of CC\r\n * binName?: string; // credit card bank name\r\n * }} options\r\n * @returns {Promise<DonationResponse>}\r\n * @memberof BraintreeManagerInterface\r\n */\r\n submitDonation(options: {\r\n nonce: string;\r\n paymentProvider: PaymentProvider;\r\n donationInfo: DonationPaymentInfo;\r\n billingInfo: BillingInfo;\r\n customerInfo: CustomerInfo;\r\n upsellOnetimeTransactionId?: string;\r\n customerId?: string;\r\n recaptchaToken?: string;\r\n bin?: string; // first 6 digits of CC\r\n binName?: string; // credit card bank name\r\n }): Promise<DonationResponse>;\r\n\r\n /**\r\n * Submit the upsell donation\r\n *\r\n * @param {{\r\n * oneTimeDonationResponse: SuccessResponse;\r\n * amount: number;\r\n * }} options\r\n * @returns {Promise<DonationResponse>}\r\n * @memberof BraintreeManagerInterface\r\n */\r\n submitUpsellDonation(options: {\r\n oneTimeDonationResponse: SuccessResponse;\r\n amount: number;\r\n }): Promise<DonationResponse>;\r\n\r\n /**\r\n * Finish the donation after a successful completion.\r\n *\r\n * @param {{\r\n * successResponse: SuccessResponse;\r\n * upsellSuccessResponse?: SuccessResponse;\r\n * }} options\r\n * @memberof BraintreeManagerInterface\r\n */\r\n donationSuccessful(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void;\r\n}\r\n\r\nexport interface BraintreeEndpointManagerInterface {\r\n /**\r\n * Responsible for submitting a data object to the backend\r\n * and returning a Promise of the JSON object response.\r\n *\r\n * @param {object} data\r\n * @returns {Promise<object>}\r\n * @memberof BraintreeEndpointManagerInterface\r\n */\r\n submitData(request: DonationRequest): Promise<DonationResponse>;\r\n\r\n /**\r\n * Once the user is finished with the donation flow, either after\r\n * a monthly donation or an upsell, we notify the endpoint manager\r\n * so it can redirect the user to the thank you page.\r\n */\r\n donationSuccessful(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void;\r\n}\r\n\r\nexport enum HostingEnvironment {\r\n Development = 'dev',\r\n Production = 'prod',\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"braintree-manager.js","sourceRoot":"","sources":["../../../src/braintree-manager/braintree-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DonationResponse,\n DonationRequest,\n DonationRequestCustomFields,\n DonationType,\n CustomerInfo,\n BillingInfo,\n DonationPaymentInfo,\n PaymentProvider,\n SuccessResponse,\n} from '@internetarchive/donation-form-data-models';\n\nimport { PaymentProviders } from './payment-providers';\nimport { PaymentClientsInterface } from './payment-clients';\nimport {\n BraintreeManagerInterface,\n BraintreeEndpointManagerInterface,\n HostingEnvironment,\n BraintreeManagerEvents,\n} from './braintree-interfaces';\nimport { HostedFieldConfiguration } from './payment-providers/credit-card/hosted-field-configuration';\nimport { PromisedSingleton } from '@internetarchive/promised-singleton';\nimport { PaymentProvidersInterface } from './payment-providers-interface';\nimport { createNanoEvents, Unsubscribe } from 'nanoevents';\n\n/** @inheritdoc */\nexport class BraintreeManager implements BraintreeManagerInterface {\n private referrer?: string;\n\n /**\n * The origin is made up of campaign / ABTest information that the user originated from.\n *\n * The field is a freeform string so it can be anything, but make sure it's something\n * identifiable so it can be queried in CiviCRM.\n *\n * For instance, we use this format for the Donation Banner:\n * - `{Source}-{Test Name}-{Variant Name}`, eg:\n * - `DonateBanner-Campaign Start 2020-IADefault`\n * - `DonateBanner-Mid Campaign-IAThermometer`\n *\n * For additional specificity, you could add additional info, ie.\n * - `DonateBanner-MidJuly2020 Campaign-VariantA-Button1`\n *\n * @private\n * @type {string}\n * @memberof BraintreeManager\n */\n private origin?: string;\n\n private loggedInUser?: string;\n\n /**\n * The Device Data token generated by the DataCollector.\n *\n * This gets submitted for several of the payment providers as an anti-fraud mechanism.\n *\n * @private\n * @type {string}\n * @memberof BraintreeManager\n */\n private deviceData?: string;\n\n private emitter = createNanoEvents<BraintreeManagerEvents>();\n\n on<E extends keyof BraintreeManagerEvents>(\n event: E,\n callback: BraintreeManagerEvents[E],\n ): Unsubscribe {\n return this.emitter.on(event, callback);\n }\n\n /** @inheritdoc */\n paymentProviders: PaymentProvidersInterface;\n\n /** @inheritdoc */\n async startup(): Promise<void> {\n return this.collectDeviceData();\n }\n\n /** @inheritdoc */\n instance = new PromisedSingleton<braintree.Client>({\n generator: async (): Promise<braintree.Client> => {\n const client = await this.paymentClients.braintreeClient.get();\n return client?.create({ authorization: this.authorizationToken });\n },\n });\n\n /** @inheritdoc */\n async submitDonation(options: {\n nonce: string;\n paymentProvider: PaymentProvider;\n donationInfo: DonationPaymentInfo;\n billingInfo: BillingInfo;\n customerInfo: CustomerInfo;\n upsellOnetimeTransactionId?: string;\n customerId?: string;\n recaptchaToken?: string;\n bin?: string; // first 6 digits of CC\n binName?: string; // credit card bank name\n }): Promise<DonationResponse> {\n const customFields = new DonationRequestCustomFields();\n customFields.fee_amount_covered = options.donationInfo.feeAmountCovered;\n customFields.logged_in_user = this.loggedInUser;\n customFields.referrer = this.referrer;\n customFields.origin = this.origin;\n\n // This is interesting and applies only to Venmo, but will work for other providers as well.\n // In Safari, `donationInfo` actually comes through as a DonationPaymentInfo object,\n // but in Chrome, it comes through as a plain object so you can't call `.total()` on it to\n // get the total amount and instead have to calculate the total\n const total = DonationPaymentInfo.calculateTotal(\n options.donationInfo.amount,\n options.donationInfo.coverFees,\n );\n\n const donationRequest = new DonationRequest({\n deviceData: this.deviceData,\n paymentProvider: options.paymentProvider,\n paymentMethodNonce: options.nonce,\n amount: total,\n donationType: options.donationInfo.donationType,\n customer: options.customerInfo,\n billing: options.billingInfo,\n customFields: customFields,\n upsellOnetimeTransactionId: options.upsellOnetimeTransactionId,\n customerId: options.customerId,\n recaptchaToken: options.recaptchaToken,\n bin: options.bin,\n binName: options.binName,\n });\n\n const jsonResponse = await this.endpointManager.submitData(donationRequest);\n const modeledResponse = new DonationResponse(jsonResponse);\n return modeledResponse;\n }\n\n /** @inheritdoc */\n async submitUpsellDonation(options: {\n oneTimeDonationResponse: SuccessResponse;\n amount: number;\n }): Promise<DonationResponse> {\n const response = options.oneTimeDonationResponse;\n\n const donationInfo = new DonationPaymentInfo({\n amount: options.amount,\n donationType: DonationType.Upsell,\n coverFees: false,\n });\n\n return this.submitDonation({\n nonce: response.paymentMethodNonce,\n paymentProvider: response.paymentProvider,\n customerId: response.customer_id,\n donationInfo: donationInfo,\n customerInfo: response.customer,\n billingInfo: response.billing,\n upsellOnetimeTransactionId: response.transaction_id,\n });\n }\n\n /** @inheritdoc */\n donationSuccessful(options: {\n successResponse: SuccessResponse;\n upsellSuccessResponse?: SuccessResponse;\n }): void {\n this.endpointManager.donationSuccessful(options);\n }\n\n private deviceDataCollectionStarted = false;\n\n /**\n * Collect Braintree device data. This is used to help fraud detection.\n *\n * @private\n * @returns {Promise<void>}\n * @memberof BraintreeManager\n */\n private async collectDeviceData(): Promise<void> {\n if (this.deviceDataCollectionStarted) {\n return;\n }\n this.deviceDataCollectionStarted = true;\n\n const instance = await this.instance.get();\n if (!instance) {\n return;\n }\n\n return this.paymentClients.dataCollector\n .get()\n .then((collector?: braintree.DataCollector) => {\n return collector?.create({ client: instance, kount: false, paypal: true });\n })\n .then(instance => {\n this.deviceData = instance?.deviceData;\n });\n }\n\n /**\n * Braintree Authorization Token\n *\n * @private\n * @type {string}\n * @memberof BraintreeManager\n */\n private authorizationToken: string;\n\n /**\n * The endpoint manager for network communications\n *\n * @private\n * @type {BraintreeEndpointManagerInterface}\n * @memberof BraintreeManager\n */\n private endpointManager: BraintreeEndpointManagerInterface;\n\n /**\n * The payment clients container containing the braintree, paypal, and google clients\n *\n * @private\n * @type {PaymentClientsInterface}\n * @memberof BraintreeManager\n */\n private paymentClients: PaymentClientsInterface;\n\n private hostingEnvironment: HostingEnvironment = HostingEnvironment.Development;\n\n constructor(options: {\n authorizationToken: string;\n paymentClients: PaymentClientsInterface;\n endpointManager: BraintreeEndpointManagerInterface;\n hostedFieldConfig: HostedFieldConfiguration;\n hostingEnvironment: HostingEnvironment;\n venmoProfileId?: string;\n googlePayMerchantId?: string;\n referrer?: string;\n loggedInUser?: string;\n origin?: string;\n }) {\n this.authorizationToken = options.authorizationToken;\n this.endpointManager = options.endpointManager;\n this.hostingEnvironment = options.hostingEnvironment;\n this.paymentClients = options.paymentClients;\n\n this.referrer = options.referrer;\n this.loggedInUser = options.loggedInUser;\n this.origin = options.origin;\n\n this.paymentProviders = new PaymentProviders({\n braintreeManager: this,\n paymentClients: this.paymentClients,\n venmoProfileId: options.venmoProfileId,\n googlePayMerchantId: options.googlePayMerchantId,\n hostingEnvironment: options.hostingEnvironment,\n hostedFieldConfig: options.hostedFieldConfig,\n });\n\n this.paymentProviders.on('hostedFieldsRetry', (retryNumber: number) => {\n this.emitter.emit('paymentProvidersHostedFieldsRetry', retryNumber);\n });\n\n this.paymentProviders.on('hostedFieldsFailed', (error: unknown) => {\n this.emitter.emit('paymentProvidersHostedFieldsFailed', error);\n });\n }\n\n /** @inheritdoc */\n setReferrer(referrer: string): void {\n this.referrer = referrer;\n }\n\n /** @inheritdoc */\n setLoggedInUser(loggedInUser: string): void {\n this.loggedInUser = loggedInUser;\n }\n\n /** @inheritdoc */\n setOrigin(origin: string): void {\n this.origin = origin;\n }\n}\n"]}
1
+ {"version":3,"file":"braintree-manager.js","sourceRoot":"","sources":["../../../src/braintree-manager/braintree-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n DonationResponse,\r\n DonationRequest,\r\n DonationRequestCustomFields,\r\n DonationType,\r\n CustomerInfo,\r\n BillingInfo,\r\n DonationPaymentInfo,\r\n PaymentProvider,\r\n SuccessResponse,\r\n} from '@internetarchive/donation-form-data-models';\r\n\r\nimport { PaymentProviders } from './payment-providers';\r\nimport { PaymentClientsInterface } from './payment-clients';\r\nimport {\r\n BraintreeManagerInterface,\r\n BraintreeEndpointManagerInterface,\r\n HostingEnvironment,\r\n BraintreeManagerEvents,\r\n} from './braintree-interfaces';\r\nimport { HostedFieldConfiguration } from './payment-providers/credit-card/hosted-field-configuration';\r\nimport { PromisedSingleton } from '@internetarchive/promised-singleton';\r\nimport { PaymentProvidersInterface } from './payment-providers-interface';\r\nimport { createNanoEvents, Unsubscribe } from 'nanoevents';\r\n\r\n/** @inheritdoc */\r\nexport class BraintreeManager implements BraintreeManagerInterface {\r\n private referrer?: string;\r\n\r\n /**\r\n * The origin is made up of campaign / ABTest information that the user originated from.\r\n *\r\n * The field is a freeform string so it can be anything, but make sure it's something\r\n * identifiable so it can be queried in CiviCRM.\r\n *\r\n * For instance, we use this format for the Donation Banner:\r\n * - `{Source}-{Test Name}-{Variant Name}`, eg:\r\n * - `DonateBanner-Campaign Start 2020-IADefault`\r\n * - `DonateBanner-Mid Campaign-IAThermometer`\r\n *\r\n * For additional specificity, you could add additional info, ie.\r\n * - `DonateBanner-MidJuly2020 Campaign-VariantA-Button1`\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof BraintreeManager\r\n */\r\n private origin?: string;\r\n\r\n private loggedInUser?: string;\r\n\r\n /**\r\n * The Device Data token generated by the DataCollector.\r\n *\r\n * This gets submitted for several of the payment providers as an anti-fraud mechanism.\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof BraintreeManager\r\n */\r\n private deviceData?: string;\r\n\r\n private emitter = createNanoEvents<BraintreeManagerEvents>();\r\n\r\n on<E extends keyof BraintreeManagerEvents>(\r\n event: E,\r\n callback: BraintreeManagerEvents[E],\r\n ): Unsubscribe {\r\n return this.emitter.on(event, callback);\r\n }\r\n\r\n /** @inheritdoc */\r\n paymentProviders: PaymentProvidersInterface;\r\n\r\n /** @inheritdoc */\r\n async startup(): Promise<void> {\r\n return this.collectDeviceData();\r\n }\r\n\r\n /** @inheritdoc */\r\n instance = new PromisedSingleton<braintree.Client>({\r\n generator: async (): Promise<braintree.Client> => {\r\n const client = await this.paymentClients.braintreeClient.get();\r\n return client?.create({ authorization: this.authorizationToken });\r\n },\r\n });\r\n\r\n /** @inheritdoc */\r\n async submitDonation(options: {\r\n nonce: string;\r\n paymentProvider: PaymentProvider;\r\n donationInfo: DonationPaymentInfo;\r\n billingInfo: BillingInfo;\r\n customerInfo: CustomerInfo;\r\n upsellOnetimeTransactionId?: string;\r\n customerId?: string;\r\n recaptchaToken?: string;\r\n bin?: string; // first 6 digits of CC\r\n binName?: string; // credit card bank name\r\n }): Promise<DonationResponse> {\r\n const customFields = new DonationRequestCustomFields();\r\n customFields.fee_amount_covered = options.donationInfo.feeAmountCovered;\r\n customFields.logged_in_user = this.loggedInUser;\r\n customFields.referrer = this.referrer;\r\n customFields.origin = this.origin;\r\n\r\n // This is interesting and applies only to Venmo, but will work for other providers as well.\r\n // In Safari, `donationInfo` actually comes through as a DonationPaymentInfo object,\r\n // but in Chrome, it comes through as a plain object so you can't call `.total()` on it to\r\n // get the total amount and instead have to calculate the total\r\n const total = DonationPaymentInfo.calculateTotal(\r\n options.donationInfo.amount,\r\n options.donationInfo.coverFees,\r\n );\r\n\r\n const donationRequest = new DonationRequest({\r\n deviceData: this.deviceData,\r\n paymentProvider: options.paymentProvider,\r\n paymentMethodNonce: options.nonce,\r\n amount: total,\r\n donationType: options.donationInfo.donationType,\r\n customer: options.customerInfo,\r\n billing: options.billingInfo,\r\n customFields: customFields,\r\n upsellOnetimeTransactionId: options.upsellOnetimeTransactionId,\r\n customerId: options.customerId,\r\n recaptchaToken: options.recaptchaToken,\r\n bin: options.bin,\r\n binName: options.binName,\r\n });\r\n\r\n const jsonResponse = await this.endpointManager.submitData(donationRequest);\r\n const modeledResponse = new DonationResponse(jsonResponse);\r\n return modeledResponse;\r\n }\r\n\r\n /** @inheritdoc */\r\n async submitUpsellDonation(options: {\r\n oneTimeDonationResponse: SuccessResponse;\r\n amount: number;\r\n }): Promise<DonationResponse> {\r\n const response = options.oneTimeDonationResponse;\r\n\r\n const donationInfo = new DonationPaymentInfo({\r\n amount: options.amount,\r\n donationType: DonationType.Upsell,\r\n coverFees: false,\r\n });\r\n\r\n return this.submitDonation({\r\n nonce: response.paymentMethodNonce,\r\n paymentProvider: response.paymentProvider,\r\n customerId: response.customer_id,\r\n donationInfo: donationInfo,\r\n customerInfo: response.customer,\r\n billingInfo: response.billing,\r\n upsellOnetimeTransactionId: response.transaction_id,\r\n });\r\n }\r\n\r\n /** @inheritdoc */\r\n donationSuccessful(options: {\r\n successResponse: SuccessResponse;\r\n upsellSuccessResponse?: SuccessResponse;\r\n }): void {\r\n this.endpointManager.donationSuccessful(options);\r\n }\r\n\r\n private deviceDataCollectionStarted = false;\r\n\r\n /**\r\n * Collect Braintree device data. This is used to help fraud detection.\r\n *\r\n * @private\r\n * @returns {Promise<void>}\r\n * @memberof BraintreeManager\r\n */\r\n private async collectDeviceData(): Promise<void> {\r\n if (this.deviceDataCollectionStarted) {\r\n return;\r\n }\r\n this.deviceDataCollectionStarted = true;\r\n\r\n const instance = await this.instance.get();\r\n if (!instance) {\r\n return;\r\n }\r\n\r\n return this.paymentClients.dataCollector\r\n .get()\r\n .then((collector?: braintree.DataCollector) => {\r\n return collector?.create({ client: instance, kount: false, paypal: true });\r\n })\r\n .then(instance => {\r\n this.deviceData = instance?.deviceData;\r\n });\r\n }\r\n\r\n /**\r\n * Braintree Authorization Token\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof BraintreeManager\r\n */\r\n private authorizationToken: string;\r\n\r\n /**\r\n * The endpoint manager for network communications\r\n *\r\n * @private\r\n * @type {BraintreeEndpointManagerInterface}\r\n * @memberof BraintreeManager\r\n */\r\n private endpointManager: BraintreeEndpointManagerInterface;\r\n\r\n /**\r\n * The payment clients container containing the braintree, paypal, and google clients\r\n *\r\n * @private\r\n * @type {PaymentClientsInterface}\r\n * @memberof BraintreeManager\r\n */\r\n private paymentClients: PaymentClientsInterface;\r\n\r\n private hostingEnvironment: HostingEnvironment = HostingEnvironment.Development;\r\n\r\n constructor(options: {\r\n authorizationToken: string;\r\n paymentClients: PaymentClientsInterface;\r\n endpointManager: BraintreeEndpointManagerInterface;\r\n hostedFieldConfig: HostedFieldConfiguration;\r\n hostingEnvironment: HostingEnvironment;\r\n venmoProfileId?: string;\r\n googlePayMerchantId?: string;\r\n referrer?: string;\r\n loggedInUser?: string;\r\n origin?: string;\r\n }) {\r\n this.authorizationToken = options.authorizationToken;\r\n this.endpointManager = options.endpointManager;\r\n this.hostingEnvironment = options.hostingEnvironment;\r\n this.paymentClients = options.paymentClients;\r\n\r\n this.referrer = options.referrer;\r\n this.loggedInUser = options.loggedInUser;\r\n this.origin = options.origin;\r\n\r\n this.paymentProviders = new PaymentProviders({\r\n braintreeManager: this,\r\n paymentClients: this.paymentClients,\r\n venmoProfileId: options.venmoProfileId,\r\n googlePayMerchantId: options.googlePayMerchantId,\r\n hostingEnvironment: options.hostingEnvironment,\r\n hostedFieldConfig: options.hostedFieldConfig,\r\n });\r\n\r\n this.paymentProviders.on('hostedFieldsRetry', (retryNumber: number) => {\r\n this.emitter.emit('paymentProvidersHostedFieldsRetry', retryNumber);\r\n });\r\n\r\n this.paymentProviders.on('hostedFieldsFailed', (error: unknown) => {\r\n this.emitter.emit('paymentProvidersHostedFieldsFailed', error);\r\n });\r\n }\r\n\r\n /** @inheritdoc */\r\n setReferrer(referrer: string): void {\r\n this.referrer = referrer;\r\n }\r\n\r\n /** @inheritdoc */\r\n setLoggedInUser(loggedInUser: string): void {\r\n this.loggedInUser = loggedInUser;\r\n }\r\n\r\n /** @inheritdoc */\r\n setOrigin(origin: string): void {\r\n this.origin = origin;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"payment-clients.js","sourceRoot":"","sources":["../../../src/braintree-manager/payment-clients.ts"],"names":[],"mappings":"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","sourcesContent":["import { LazyLoaderServiceInterface } from '@internetarchive/lazy-loader-service';\nimport { PromisedSingleton } from '@internetarchive/promised-singleton';\nimport { HostingEnvironment } from './braintree-interfaces';\n\nexport interface PaymentClientsInterface {\n braintreeClient: PromisedSingleton<braintree.Client>;\n dataCollector: PromisedSingleton<braintree.DataCollector>;\n hostedFields: PromisedSingleton<braintree.HostedFields>;\n venmo: PromisedSingleton<braintree.Venmo>;\n payPal: PromisedSingleton<braintree.PayPalCheckout>;\n applePay: PromisedSingleton<braintree.ApplePay>;\n googlePayBraintreeClient: PromisedSingleton<braintree.GooglePayment>;\n\n googlePaymentsClient: PromisedSingleton<google.payments.api.PaymentsClient>;\n recaptchaLibrary: PromisedSingleton<ReCaptchaV2.ReCaptcha>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n paypalLibrary: PromisedSingleton<any>;\n}\n\n/**\n * The PaymentClients class is responsible for loading and passing around\n * all of the payment libraries. Internally it uses the LazyLoaderService to lazy load\n * the javascript clients.\n *\n * For instance, it carries around the braintree and paypal libraries, as well as the specific\n * payment-provider clients for each of the providers. This allows us to pass around typed\n * objects instead of the untyped libraries we get from the providers.\n *\n * @export\n * @class PaymentClients\n * @implements {PaymentClientsInterface}\n */\nexport class PaymentClients implements PaymentClientsInterface {\n braintreeClient = new PromisedSingleton<braintree.Client>({\n generator: async (): Promise<braintree.Client> => {\n await this.loadBraintreeScript('client');\n return window.braintree.client;\n },\n });\n\n dataCollector = new PromisedSingleton<braintree.DataCollector>({\n generator: async (): Promise<braintree.DataCollector> => {\n await this.loadBraintreeScript('data-collector');\n return window.braintree.dataCollector;\n },\n });\n\n hostedFields = new PromisedSingleton<braintree.HostedFields>({\n generator: async (): Promise<braintree.HostedFields> => {\n await this.loadBraintreeScript('hosted-fields');\n return window.braintree.hostedFields;\n },\n });\n\n venmo = new PromisedSingleton<braintree.Venmo>({\n generator: async (): Promise<braintree.Venmo> => {\n await this.loadBraintreeScript('venmo');\n return window.braintree.venmo;\n },\n });\n\n payPal = new PromisedSingleton<braintree.PayPalCheckout>({\n generator: async (): Promise<braintree.PayPalCheckout> => {\n await this.loadBraintreeScript('paypal-checkout');\n return window.braintree.paypalCheckout;\n },\n });\n\n applePay = new PromisedSingleton<braintree.ApplePay>({\n generator: async (): Promise<braintree.ApplePay> => {\n await this.loadBraintreeScript('apple-pay');\n return window.braintree.applePay;\n },\n });\n\n googlePayBraintreeClient = new PromisedSingleton<braintree.GooglePayment>({\n generator: async (): Promise<braintree.GooglePayment> => {\n await this.loadBraintreeScript('google-payment');\n return window.braintree.googlePayment;\n },\n });\n\n googlePaymentsClient = new PromisedSingleton<google.payments.api.PaymentsClient>({\n generator: async (): Promise<google.payments.api.PaymentsClient> => {\n await this.lazyLoader.loadScript({ src: 'https://pay.google.com/gp/p/js/pay.js' });\n return new google.payments.api.PaymentsClient({\n environment: this.environment === HostingEnvironment.Development ? 'TEST' : 'PRODUCTION',\n });\n },\n });\n\n recaptchaLibrary = new PromisedSingleton<ReCaptchaV2.ReCaptcha>({\n generator: (): Promise<ReCaptchaV2.ReCaptcha> =>\n new Promise(resolve => {\n // The loader for the recaptcha library is relying on an onload callback from the recaptcha\n // library because even when the library has loaded, it is still not ready\n // As recommended by Recaptcha, we attach a callback to the window object before starting\n // the load and remove it once the load is complete and resolve the promise.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).donationFormGrecaptchaLoadedCallback = (): void => {\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (window as any).donationFormGrecaptchaLoadedCallback;\n }, 10);\n resolve(window.grecaptcha);\n };\n\n this.lazyLoader.loadScript({\n src: 'https://www.google.com/recaptcha/api.js?onload=donationFormGrecaptchaLoadedCallback&render=explicit',\n });\n }),\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n paypalLibrary = new PromisedSingleton<any>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n generator: async (): Promise<any> => {\n await this.lazyLoader.loadScript({\n src: 'https://www.paypalobjects.com/api/checkout.js',\n attributes: {\n 'data-version-4': '',\n 'log-level': 'warn',\n },\n });\n return window.paypal;\n },\n });\n\n constructor(lazyLoader: LazyLoaderServiceInterface, environment: HostingEnvironment) {\n this.lazyLoader = lazyLoader;\n this.environment = environment;\n }\n\n private async loadBraintreeScript(scriptName: string): Promise<void> {\n const extension = this.environment === HostingEnvironment.Production ? 'min.js' : 'js';\n const scriptWithSuffix = `${scriptName}.${extension}`;\n const url = `https://js.braintreegateway.com/web/${this.braintreeVersion}/js/${scriptWithSuffix}`;\n await this.lazyLoader.loadScript({ src: url });\n }\n\n private braintreeVersion = '3.62.2';\n\n private environment: HostingEnvironment = HostingEnvironment.Development;\n\n private lazyLoader: LazyLoaderServiceInterface;\n}\n"]}
1
+ {"version":3,"file":"payment-clients.js","sourceRoot":"","sources":["../../../src/braintree-manager/payment-clients.ts"],"names":[],"mappings":"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","sourcesContent":["import { LazyLoaderServiceInterface } from '@internetarchive/lazy-loader-service';\r\nimport { PromisedSingleton } from '@internetarchive/promised-singleton';\r\nimport { HostingEnvironment } from './braintree-interfaces';\r\n\r\nexport interface PaymentClientsInterface {\r\n braintreeClient: PromisedSingleton<braintree.Client>;\r\n dataCollector: PromisedSingleton<braintree.DataCollector>;\r\n hostedFields: PromisedSingleton<braintree.HostedFields>;\r\n venmo: PromisedSingleton<braintree.Venmo>;\r\n payPal: PromisedSingleton<braintree.PayPalCheckout>;\r\n applePay: PromisedSingleton<braintree.ApplePay>;\r\n googlePayBraintreeClient: PromisedSingleton<braintree.GooglePayment>;\r\n\r\n googlePaymentsClient: PromisedSingleton<google.payments.api.PaymentsClient>;\r\n recaptchaLibrary: PromisedSingleton<ReCaptchaV2.ReCaptcha>;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n paypalLibrary: PromisedSingleton<any>;\r\n}\r\n\r\n/**\r\n * The PaymentClients class is responsible for loading and passing around\r\n * all of the payment libraries. Internally it uses the LazyLoaderService to lazy load\r\n * the javascript clients.\r\n *\r\n * For instance, it carries around the braintree and paypal libraries, as well as the specific\r\n * payment-provider clients for each of the providers. This allows us to pass around typed\r\n * objects instead of the untyped libraries we get from the providers.\r\n *\r\n * @export\r\n * @class PaymentClients\r\n * @implements {PaymentClientsInterface}\r\n */\r\nexport class PaymentClients implements PaymentClientsInterface {\r\n braintreeClient = new PromisedSingleton<braintree.Client>({\r\n generator: async (): Promise<braintree.Client> => {\r\n await this.loadBraintreeScript('client');\r\n return window.braintree.client;\r\n },\r\n });\r\n\r\n dataCollector = new PromisedSingleton<braintree.DataCollector>({\r\n generator: async (): Promise<braintree.DataCollector> => {\r\n await this.loadBraintreeScript('data-collector');\r\n return window.braintree.dataCollector;\r\n },\r\n });\r\n\r\n hostedFields = new PromisedSingleton<braintree.HostedFields>({\r\n generator: async (): Promise<braintree.HostedFields> => {\r\n await this.loadBraintreeScript('hosted-fields');\r\n return window.braintree.hostedFields;\r\n },\r\n });\r\n\r\n venmo = new PromisedSingleton<braintree.Venmo>({\r\n generator: async (): Promise<braintree.Venmo> => {\r\n await this.loadBraintreeScript('venmo');\r\n return window.braintree.venmo;\r\n },\r\n });\r\n\r\n payPal = new PromisedSingleton<braintree.PayPalCheckout>({\r\n generator: async (): Promise<braintree.PayPalCheckout> => {\r\n await this.loadBraintreeScript('paypal-checkout');\r\n return window.braintree.paypalCheckout;\r\n },\r\n });\r\n\r\n applePay = new PromisedSingleton<braintree.ApplePay>({\r\n generator: async (): Promise<braintree.ApplePay> => {\r\n await this.loadBraintreeScript('apple-pay');\r\n return window.braintree.applePay;\r\n },\r\n });\r\n\r\n googlePayBraintreeClient = new PromisedSingleton<braintree.GooglePayment>({\r\n generator: async (): Promise<braintree.GooglePayment> => {\r\n await this.loadBraintreeScript('google-payment');\r\n return window.braintree.googlePayment;\r\n },\r\n });\r\n\r\n googlePaymentsClient = new PromisedSingleton<google.payments.api.PaymentsClient>({\r\n generator: async (): Promise<google.payments.api.PaymentsClient> => {\r\n await this.lazyLoader.loadScript({ src: 'https://pay.google.com/gp/p/js/pay.js' });\r\n return new google.payments.api.PaymentsClient({\r\n environment: this.environment === HostingEnvironment.Development ? 'TEST' : 'PRODUCTION',\r\n });\r\n },\r\n });\r\n\r\n recaptchaLibrary = new PromisedSingleton<ReCaptchaV2.ReCaptcha>({\r\n generator: (): Promise<ReCaptchaV2.ReCaptcha> =>\r\n new Promise(resolve => {\r\n // The loader for the recaptcha library is relying on an onload callback from the recaptcha\r\n // library because even when the library has loaded, it is still not ready\r\n // As recommended by Recaptcha, we attach a callback to the window object before starting\r\n // the load and remove it once the load is complete and resolve the promise.\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (window as any).donationFormGrecaptchaLoadedCallback = (): void => {\r\n setTimeout(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n delete (window as any).donationFormGrecaptchaLoadedCallback;\r\n }, 10);\r\n resolve(window.grecaptcha);\r\n };\r\n\r\n this.lazyLoader.loadScript({\r\n src: 'https://www.google.com/recaptcha/api.js?onload=donationFormGrecaptchaLoadedCallback&render=explicit',\r\n });\r\n }),\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n paypalLibrary = new PromisedSingleton<any>({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n generator: async (): Promise<any> => {\r\n await this.lazyLoader.loadScript({\r\n src: 'https://www.paypalobjects.com/api/checkout.js',\r\n attributes: {\r\n 'data-version-4': '',\r\n 'log-level': 'warn',\r\n },\r\n });\r\n return window.paypal;\r\n },\r\n });\r\n\r\n constructor(lazyLoader: LazyLoaderServiceInterface, environment: HostingEnvironment) {\r\n this.lazyLoader = lazyLoader;\r\n this.environment = environment;\r\n }\r\n\r\n private async loadBraintreeScript(scriptName: string): Promise<void> {\r\n const extension = this.environment === HostingEnvironment.Production ? 'min.js' : 'js';\r\n const scriptWithSuffix = `${scriptName}.${extension}`;\r\n const url = `https://js.braintreegateway.com/web/${this.braintreeVersion}/js/${scriptWithSuffix}`;\r\n await this.lazyLoader.loadScript({ src: url });\r\n }\r\n\r\n private braintreeVersion = '3.62.2';\r\n\r\n private environment: HostingEnvironment = HostingEnvironment.Development;\r\n\r\n private lazyLoader: LazyLoaderServiceInterface;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay-interface.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.ts"],"names":[],"mappings":"","sourcesContent":["import { PromisedSingleton } from '@internetarchive/promised-singleton';\nimport { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\nimport { ApplePaySessionDataSourceInterface } from './apple-pay-session-datasource-interface';\n\nexport interface ApplePayHandlerInterface {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instance: PromisedSingleton<any | undefined>;\n isAvailable(): Promise<boolean>;\n createPaymentRequest(\n e: Event,\n donationInfo: DonationPaymentInfo,\n ): Promise<ApplePaySessionDataSourceInterface>;\n}\n"]}
1
+ {"version":3,"file":"apple-pay-interface.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-interface.ts"],"names":[],"mappings":"","sourcesContent":["import { PromisedSingleton } from '@internetarchive/promised-singleton';\r\nimport { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\r\nimport { ApplePaySessionDataSourceInterface } from './apple-pay-session-datasource-interface';\r\n\r\nexport interface ApplePayHandlerInterface {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n instance: PromisedSingleton<any | undefined>;\r\n isAvailable(): Promise<boolean>;\r\n createPaymentRequest(\r\n e: Event,\r\n donationInfo: DonationPaymentInfo,\r\n ): Promise<ApplePaySessionDataSourceInterface>;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay-session-datasource-delegate.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.ts"],"names":[],"mappings":"","sourcesContent":["import { DonationResponse } from '@internetarchive/donation-form-data-models';\n\nexport interface ApplePaySessionDataSourceDelegate {\n paymentComplete(response: DonationResponse): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n paymentFailed(error: any): void;\n paymentCancelled(): void;\n}\n"]}
1
+ {"version":3,"file":"apple-pay-session-datasource-delegate.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-delegate.ts"],"names":[],"mappings":"","sourcesContent":["import { DonationResponse } from '@internetarchive/donation-form-data-models';\r\n\r\nexport interface ApplePaySessionDataSourceDelegate {\r\n paymentComplete(response: DonationResponse): void;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n paymentFailed(error: any): void;\r\n paymentCancelled(): void;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay-session-datasource-interface.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.ts"],"names":[],"mappings":"","sourcesContent":["import { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\nimport { ApplePaySessionDataSourceDelegate } from './apple-pay-session-datasource-delegate';\n\nexport interface ApplePaySessionDataSourceInterface {\n delegate?: ApplePaySessionDataSourceDelegate;\n donationInfo: DonationPaymentInfo;\n onvalidatemerchant(event: ApplePayJS.ApplePayValidateMerchantEvent): Promise<void>;\n onpaymentauthorized(event: ApplePayJS.ApplePayPaymentAuthorizedEvent): Promise<void>;\n oncancel(): Promise<void>;\n}\n"]}
1
+ {"version":3,"file":"apple-pay-session-datasource-interface.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource-interface.ts"],"names":[],"mappings":"","sourcesContent":["import { DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\r\nimport { ApplePaySessionDataSourceDelegate } from './apple-pay-session-datasource-delegate';\r\n\r\nexport interface ApplePaySessionDataSourceInterface {\r\n delegate?: ApplePaySessionDataSourceDelegate;\r\n donationInfo: DonationPaymentInfo;\r\n onvalidatemerchant(event: ApplePayJS.ApplePayValidateMerchantEvent): Promise<void>;\r\n onpaymentauthorized(event: ApplePayJS.ApplePayPaymentAuthorizedEvent): Promise<void>;\r\n oncancel(): Promise<void>;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay-session-datasource.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.ts"],"names":[],"mappings":";AAAA,OAAO,EAEL,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,4CAA4C,CAAC;AAKpD,MAAM,OAAO,yBAAyB;IASpC,YAAY,OAMX;QACC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IACnD,CAAC;IAEK,kBAAkB,CAAC,KAA+C;;YACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CACrC;oBACE,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,WAAW,EAAE,kBAAkB;iBAChC;gBACD,8DAA8D;gBAC9D,CAAC,aAAkB,EAAE,cAAmB,EAAE,EAAE;;oBAC1C,IAAI,aAAa,EAAE,CAAC;wBAClB,MAAA,IAAI,CAAC,QAAQ,0CAAE,aAAa,CAAC,aAAa,CAAC,CAAC;wBAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACrB,MAAM,CAAC,8BAA8B,aAAa,EAAE,CAAC,CAAC;oBACxD,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAC,cAAc,CAAC,CAAC;wBACxD,OAAO,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEK,QAAQ;;;YACZ,MAAA,IAAI,CAAC,QAAQ,0CAAE,gBAAgB,EAAE,CAAC;QACpC,CAAC;KAAA;IAEK,mBAAmB,CAAC,KAAgD;;;YACxE,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;oBAC7C,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;iBAC3B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAA,IAAI,CAAC,QAAQ,0CAAE,aAAa,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAC7D,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;YAC9C,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;YAChD,MAAM,YAAY,GAAG,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,YAAY,CAAC;YAElD,IAAI,KAAK,GAAuB,SAAS,CAAC;YAC1C,IAAI,KAAK,GAAuB,SAAS,CAAC;YAE1C,IAAI,YAAY,EAAE,CAAC;gBACjB,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBACxB,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;gBAClC,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,QAAQ;gBAClC,MAAM,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,kBAAkB;gBAC1C,UAAU,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,UAAU;gBACtC,iBAAiB,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW;aAC/C,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;gBACpC,KAAK,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,YAAY;gBACpC,SAAS,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,SAAS;gBACrC,QAAQ,EAAE,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,UAAU;aACtC,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;oBAClE,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,eAAe,EAAE,eAAe,CAAC,QAAQ;oBACzC,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,WAAW,EAAE,WAAW;oBACxB,YAAY,EAAE,YAAY;iBAC3B,CAAC,CAAC;gBACH,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;oBAC7B,MAAA,IAAI,CAAC,QAAQ,0CAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;oBACjD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAC/D,CAAC;qBAAM,CAAC;oBACN,MAAA,IAAI,CAAC,QAAQ,0CAAE,aAAa,CAAC,yBAAyB,CAAC,CAAC;oBACxD,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;gBAC/D,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAA,IAAI,CAAC,QAAQ,0CAAE,aAAa,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;KAAA;CACF","sourcesContent":["import {\n DonationPaymentInfo,\n BillingInfo,\n CustomerInfo,\n PaymentProvider,\n} from '@internetarchive/donation-form-data-models';\nimport { BraintreeManagerInterface } from '../../braintree-interfaces';\nimport { ApplePaySessionDataSourceInterface } from './apple-pay-session-datasource-interface';\nimport { ApplePaySessionDataSourceDelegate } from './apple-pay-session-datasource-delegate';\n\nexport class ApplePaySessionDataSource implements ApplePaySessionDataSourceInterface {\n delegate?: ApplePaySessionDataSourceDelegate;\n donationInfo: DonationPaymentInfo;\n\n private session: ApplePaySession;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private applePayInstance: any;\n private braintreeManager: BraintreeManagerInterface;\n\n constructor(options: {\n donationInfo: DonationPaymentInfo;\n session: ApplePaySession;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n applePayInstance: any;\n braintreeManager: BraintreeManagerInterface;\n }) {\n this.session = options.session;\n this.donationInfo = options.donationInfo;\n this.applePayInstance = options.applePayInstance;\n this.braintreeManager = options.braintreeManager;\n }\n\n async onvalidatemerchant(event: ApplePayJS.ApplePayValidateMerchantEvent): Promise<void> {\n return new Promise((resolve, reject) => {\n this.applePayInstance.performValidation(\n {\n validationURL: event.validationURL,\n displayName: 'Internet Archive',\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (validationErr: any, validationData: any) => {\n if (validationErr) {\n this.delegate?.paymentFailed(validationErr);\n this.session.abort();\n reject(`Merchant validation error: ${validationErr}`);\n } else {\n this.session.completeMerchantValidation(validationData);\n resolve();\n }\n },\n );\n });\n }\n\n async oncancel(): Promise<void> {\n this.delegate?.paymentCancelled();\n }\n\n async onpaymentauthorized(event: ApplePayJS.ApplePayPaymentAuthorizedEvent): Promise<void> {\n let payload;\n try {\n payload = await this.applePayInstance.tokenize({\n token: event.payment.token,\n });\n } catch (err) {\n this.delegate?.paymentFailed(err);\n this.session.completePayment(ApplePaySession.STATUS_FAILURE);\n return;\n }\n\n const payment = event.payment;\n const billingContact = payment.billingContact;\n const shippingContact = payment.shippingContact;\n const addressLines = billingContact?.addressLines;\n\n let line1: string | undefined = undefined;\n let line2: string | undefined = undefined;\n\n if (addressLines) {\n line1 = addressLines[0];\n line2 = addressLines[1];\n }\n\n const billingInfo = new BillingInfo({\n streetAddress: line1,\n extendedAddress: line2,\n locality: billingContact?.locality,\n region: billingContact?.administrativeArea,\n postalCode: billingContact?.postalCode,\n countryCodeAlpha2: billingContact?.countryCode,\n });\n\n const customerInfo = new CustomerInfo({\n email: shippingContact?.emailAddress,\n firstName: shippingContact?.givenName,\n lastName: shippingContact?.familyName,\n });\n\n try {\n const donationResponse = await this.braintreeManager.submitDonation({\n nonce: payload.nonce,\n paymentProvider: PaymentProvider.ApplePay,\n donationInfo: this.donationInfo,\n billingInfo: billingInfo,\n customerInfo: customerInfo,\n });\n if (donationResponse.success) {\n this.delegate?.paymentComplete(donationResponse);\n this.session.completePayment(ApplePaySession.STATUS_SUCCESS);\n } else {\n this.delegate?.paymentFailed('Failure submitting data');\n this.session.completePayment(ApplePaySession.STATUS_FAILURE);\n }\n } catch (err) {\n this.delegate?.paymentFailed(err);\n this.session.completePayment(ApplePaySession.STATUS_FAILURE);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"apple-pay-session-datasource.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-datasource.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n DonationPaymentInfo,\r\n BillingInfo,\r\n CustomerInfo,\r\n PaymentProvider,\r\n} from '@internetarchive/donation-form-data-models';\r\nimport { BraintreeManagerInterface } from '../../braintree-interfaces';\r\nimport { ApplePaySessionDataSourceInterface } from './apple-pay-session-datasource-interface';\r\nimport { ApplePaySessionDataSourceDelegate } from './apple-pay-session-datasource-delegate';\r\n\r\nexport class ApplePaySessionDataSource implements ApplePaySessionDataSourceInterface {\r\n delegate?: ApplePaySessionDataSourceDelegate;\r\n donationInfo: DonationPaymentInfo;\r\n\r\n private session: ApplePaySession;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private applePayInstance: any;\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n constructor(options: {\r\n donationInfo: DonationPaymentInfo;\r\n session: ApplePaySession;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n applePayInstance: any;\r\n braintreeManager: BraintreeManagerInterface;\r\n }) {\r\n this.session = options.session;\r\n this.donationInfo = options.donationInfo;\r\n this.applePayInstance = options.applePayInstance;\r\n this.braintreeManager = options.braintreeManager;\r\n }\r\n\r\n async onvalidatemerchant(event: ApplePayJS.ApplePayValidateMerchantEvent): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n this.applePayInstance.performValidation(\r\n {\r\n validationURL: event.validationURL,\r\n displayName: 'Internet Archive',\r\n },\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n (validationErr: any, validationData: any) => {\r\n if (validationErr) {\r\n this.delegate?.paymentFailed(validationErr);\r\n this.session.abort();\r\n reject(`Merchant validation error: ${validationErr}`);\r\n } else {\r\n this.session.completeMerchantValidation(validationData);\r\n resolve();\r\n }\r\n },\r\n );\r\n });\r\n }\r\n\r\n async oncancel(): Promise<void> {\r\n this.delegate?.paymentCancelled();\r\n }\r\n\r\n async onpaymentauthorized(event: ApplePayJS.ApplePayPaymentAuthorizedEvent): Promise<void> {\r\n let payload;\r\n try {\r\n payload = await this.applePayInstance.tokenize({\r\n token: event.payment.token,\r\n });\r\n } catch (err) {\r\n this.delegate?.paymentFailed(err);\r\n this.session.completePayment(ApplePaySession.STATUS_FAILURE);\r\n return;\r\n }\r\n\r\n const payment = event.payment;\r\n const billingContact = payment.billingContact;\r\n const shippingContact = payment.shippingContact;\r\n const addressLines = billingContact?.addressLines;\r\n\r\n let line1: string | undefined = undefined;\r\n let line2: string | undefined = undefined;\r\n\r\n if (addressLines) {\r\n line1 = addressLines[0];\r\n line2 = addressLines[1];\r\n }\r\n\r\n const billingInfo = new BillingInfo({\r\n streetAddress: line1,\r\n extendedAddress: line2,\r\n locality: billingContact?.locality,\r\n region: billingContact?.administrativeArea,\r\n postalCode: billingContact?.postalCode,\r\n countryCodeAlpha2: billingContact?.countryCode,\r\n });\r\n\r\n const customerInfo = new CustomerInfo({\r\n email: shippingContact?.emailAddress,\r\n firstName: shippingContact?.givenName,\r\n lastName: shippingContact?.familyName,\r\n });\r\n\r\n try {\r\n const donationResponse = await this.braintreeManager.submitDonation({\r\n nonce: payload.nonce,\r\n paymentProvider: PaymentProvider.ApplePay,\r\n donationInfo: this.donationInfo,\r\n billingInfo: billingInfo,\r\n customerInfo: customerInfo,\r\n });\r\n if (donationResponse.success) {\r\n this.delegate?.paymentComplete(donationResponse);\r\n this.session.completePayment(ApplePaySession.STATUS_SUCCESS);\r\n } else {\r\n this.delegate?.paymentFailed('Failure submitting data');\r\n this.session.completePayment(ApplePaySession.STATUS_FAILURE);\r\n }\r\n } catch (err) {\r\n this.delegate?.paymentFailed(err);\r\n this.session.completePayment(ApplePaySession.STATUS_FAILURE);\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay-session-manager.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,sBAAsB;IAGjC,eAAe;QACb,OAAO,CACL,iBAAiB,IAAI,MAAM;YAC3B,eAAe,CAAC,eAAe,CAAC,sBAAsB,CAAC,OAAO,CAAC;YAC/D,eAAe,CAAC,eAAe,EAAE,CAClC,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,cAAiD;QACvE,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,sBAAsB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACpF,OAAO,OAAO,CAAC;IACjB,CAAC;;AAbM,8BAAO,GAAG,CAAC,CAAC","sourcesContent":["export interface ApplePaySessionManagerInterface {\n canMakePayments(): boolean;\n createNewPaymentSession(paymentRequest: ApplePayJS.ApplePayPaymentRequest): ApplePaySession;\n}\n\nexport class ApplePaySessionManager implements ApplePaySessionManagerInterface {\n static VERSION = 3;\n\n canMakePayments(): boolean {\n return (\n 'ApplePaySession' in window &&\n ApplePaySession.supportsVersion(ApplePaySessionManager.VERSION) &&\n ApplePaySession.canMakePayments()\n );\n }\n\n createNewPaymentSession(paymentRequest: ApplePayJS.ApplePayPaymentRequest): ApplePaySession {\n const session = new ApplePaySession(ApplePaySessionManager.VERSION, paymentRequest);\n return session;\n }\n}\n"]}
1
+ {"version":3,"file":"apple-pay-session-manager.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay-session-manager.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,sBAAsB;IAGjC,eAAe;QACb,OAAO,CACL,iBAAiB,IAAI,MAAM;YAC3B,eAAe,CAAC,eAAe,CAAC,sBAAsB,CAAC,OAAO,CAAC;YAC/D,eAAe,CAAC,eAAe,EAAE,CAClC,CAAC;IACJ,CAAC;IAED,uBAAuB,CAAC,cAAiD;QACvE,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,sBAAsB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACpF,OAAO,OAAO,CAAC;IACjB,CAAC;;AAbM,8BAAO,GAAG,CAAC,CAAC","sourcesContent":["export interface ApplePaySessionManagerInterface {\r\n canMakePayments(): boolean;\r\n createNewPaymentSession(paymentRequest: ApplePayJS.ApplePayPaymentRequest): ApplePaySession;\r\n}\r\n\r\nexport class ApplePaySessionManager implements ApplePaySessionManagerInterface {\r\n static VERSION = 3;\r\n\r\n canMakePayments(): boolean {\r\n return (\r\n 'ApplePaySession' in window &&\r\n ApplePaySession.supportsVersion(ApplePaySessionManager.VERSION) &&\r\n ApplePaySession.canMakePayments()\r\n );\r\n }\r\n\r\n createNewPaymentSession(paymentRequest: ApplePayJS.ApplePayPaymentRequest): ApplePaySession {\r\n const session = new ApplePaySession(ApplePaySessionManager.VERSION, paymentRequest);\r\n return session;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"apple-pay.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAuB,MAAM,4CAA4C,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E,MAAM,OAAO,eAAe;IAI1B,YAAY,OAMX;;QACC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAE7D,IAAI,CAAC,QAAQ;YACX,MAAA,OAAO,CAAC,yBAAyB;YACjC,8DAA8D;YAC9D,IAAI,iBAAiB,CAAkB;gBACrC,8DAA8D;gBAC9D,SAAS,EAAE,GAAmC,EAAE;oBAC9C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,EAAE,CAAC;wBACnD,OAAO,SAAS,CAAC;oBACnB,CAAC;oBAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;oBACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;wBAChD,MAAM,EAAE,eAAe;qBACxB,CAAC,CAAC;oBAEH,OAAO,QAAQ,CAAC;gBAClB,CAAC,CAAA;aACF,CAAC,CAAC;IACP,CAAC;IAQK,WAAW;;YACf,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAC3C,OAAO,CAAC,CAAC,QAAQ,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KAAA;IAED,wEAAwE;IACxE,uEAAuE;IACvE,wCAAwC;IAClC,oBAAoB,CACxB,CAAQ,EACR,YAAiC;;YAEjC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAEnD,IAAI,KAAK,GAAG,0BAA0B,CAAC;YACvC,IAAI,YAAY,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;gBACvD,KAAK,GAAG,kBAAkB,CAAC;YAC7B,CAAC;YAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,oBAAoB,CAAC;gBAC3D,KAAK,EAAE;oBACL,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,YAAY,CAAC,KAAK;iBAC3B;gBACD,4BAA4B,EAAE,CAAC,eAAe,CAAC;gBAC/C,6BAA6B,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aACjD,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;YAEpF,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,CAAC;gBACtD,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,OAAO;gBAChB,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC,CAAC;YAEH,OAAO,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC1F,OAAO,CAAC,mBAAmB,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC5F,OAAO,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEtE,OAAO,CAAC,KAAK,EAAE,CAAC;YAEhB,OAAO,iBAAiB,CAAC;QAC3B,CAAC;KAAA;CACF","sourcesContent":["import { PromisedSingleton } from '@internetarchive/promised-singleton';\nimport { BraintreeManagerInterface } from '../../braintree-interfaces';\nimport { ApplePaySessionManagerInterface } from './apple-pay-session-manager';\nimport { DonationType, DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\nimport { ApplePaySessionDataSource } from './apple-pay-session-datasource';\nimport { ApplePayHandlerInterface } from './apple-pay-interface';\n\nexport class ApplePayHandler implements ApplePayHandlerInterface {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instance: PromisedSingleton<any | undefined>;\n\n constructor(options: {\n braintreeManager: BraintreeManagerInterface;\n applePayClient: braintree.ApplePay;\n applePaySessionManager: ApplePaySessionManagerInterface;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n instancePromisedSingleton?: PromisedSingleton<any | undefined>;\n }) {\n this.braintreeManager = options.braintreeManager;\n this.applePayClient = options.applePayClient;\n this.applePaySessionManager = options.applePaySessionManager;\n\n this.instance =\n options.instancePromisedSingleton ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new PromisedSingleton<any | undefined>({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n generator: async (): Promise<any | undefined> => {\n if (!this.applePaySessionManager.canMakePayments()) {\n return undefined;\n }\n\n const braintreeClient = await this.braintreeManager.instance.get();\n const instance = await this.applePayClient.create({\n client: braintreeClient,\n });\n\n return instance;\n },\n });\n }\n\n private braintreeManager: BraintreeManagerInterface;\n\n private applePaySessionManager: ApplePaySessionManagerInterface;\n\n private applePayClient: braintree.ApplePay;\n\n async isAvailable(): Promise<boolean> {\n try {\n const instance = await this.instance.get();\n return !!instance;\n } catch (err) {\n return false;\n }\n }\n\n // In order to trigger the Apple Pay flow, you HAVE to pass in the event\n // that triggered the launch. Notice we're not actually using the event\n // but ApplePay won't launch without it.\n async createPaymentRequest(\n e: Event,\n donationInfo: DonationPaymentInfo,\n ): Promise<ApplePaySessionDataSource> {\n const applePayInstance = await this.instance.get();\n\n let label = 'Internet Archive Monthly';\n if (donationInfo.donationType === DonationType.OneTime) {\n label = 'Internet Archive';\n }\n\n const paymentRequest = applePayInstance.createPaymentRequest({\n total: {\n label: label,\n amount: donationInfo.total,\n },\n requiredBillingContactFields: ['postalAddress'],\n requiredShippingContactFields: ['name', 'email'],\n });\n const session = this.applePaySessionManager.createNewPaymentSession(paymentRequest);\n\n const sessionDataSource = new ApplePaySessionDataSource({\n donationInfo: donationInfo,\n session: session,\n applePayInstance: applePayInstance,\n braintreeManager: this.braintreeManager,\n });\n\n session.onvalidatemerchant = sessionDataSource.onvalidatemerchant.bind(sessionDataSource);\n session.onpaymentauthorized = sessionDataSource.onpaymentauthorized.bind(sessionDataSource);\n session.oncancel = sessionDataSource.oncancel.bind(sessionDataSource);\n\n session.begin();\n\n return sessionDataSource;\n }\n}\n"]}
1
+ {"version":3,"file":"apple-pay.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/apple-pay/apple-pay.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAGxE,OAAO,EAAE,YAAY,EAAuB,MAAM,4CAA4C,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E,MAAM,OAAO,eAAe;IAI1B,YAAY,OAMX;;QACC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAE7D,IAAI,CAAC,QAAQ;YACX,MAAA,OAAO,CAAC,yBAAyB;YACjC,8DAA8D;YAC9D,IAAI,iBAAiB,CAAkB;gBACrC,8DAA8D;gBAC9D,SAAS,EAAE,GAAmC,EAAE;oBAC9C,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,EAAE,CAAC;wBACnD,OAAO,SAAS,CAAC;oBACnB,CAAC;oBAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;oBACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;wBAChD,MAAM,EAAE,eAAe;qBACxB,CAAC,CAAC;oBAEH,OAAO,QAAQ,CAAC;gBAClB,CAAC,CAAA;aACF,CAAC,CAAC;IACP,CAAC;IAQK,WAAW;;YACf,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAC3C,OAAO,CAAC,CAAC,QAAQ,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;KAAA;IAED,wEAAwE;IACxE,uEAAuE;IACvE,wCAAwC;IAClC,oBAAoB,CACxB,CAAQ,EACR,YAAiC;;YAEjC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAEnD,IAAI,KAAK,GAAG,0BAA0B,CAAC;YACvC,IAAI,YAAY,CAAC,YAAY,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;gBACvD,KAAK,GAAG,kBAAkB,CAAC;YAC7B,CAAC;YAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,oBAAoB,CAAC;gBAC3D,KAAK,EAAE;oBACL,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,YAAY,CAAC,KAAK;iBAC3B;gBACD,4BAA4B,EAAE,CAAC,eAAe,CAAC;gBAC/C,6BAA6B,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aACjD,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;YAEpF,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,CAAC;gBACtD,YAAY,EAAE,YAAY;gBAC1B,OAAO,EAAE,OAAO;gBAChB,gBAAgB,EAAE,gBAAgB;gBAClC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC,CAAC;YAEH,OAAO,CAAC,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC1F,OAAO,CAAC,mBAAmB,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC5F,OAAO,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAEtE,OAAO,CAAC,KAAK,EAAE,CAAC;YAEhB,OAAO,iBAAiB,CAAC;QAC3B,CAAC;KAAA;CACF","sourcesContent":["import { PromisedSingleton } from '@internetarchive/promised-singleton';\r\nimport { BraintreeManagerInterface } from '../../braintree-interfaces';\r\nimport { ApplePaySessionManagerInterface } from './apple-pay-session-manager';\r\nimport { DonationType, DonationPaymentInfo } from '@internetarchive/donation-form-data-models';\r\nimport { ApplePaySessionDataSource } from './apple-pay-session-datasource';\r\nimport { ApplePayHandlerInterface } from './apple-pay-interface';\r\n\r\nexport class ApplePayHandler implements ApplePayHandlerInterface {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n instance: PromisedSingleton<any | undefined>;\r\n\r\n constructor(options: {\r\n braintreeManager: BraintreeManagerInterface;\r\n applePayClient: braintree.ApplePay;\r\n applePaySessionManager: ApplePaySessionManagerInterface;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n instancePromisedSingleton?: PromisedSingleton<any | undefined>;\r\n }) {\r\n this.braintreeManager = options.braintreeManager;\r\n this.applePayClient = options.applePayClient;\r\n this.applePaySessionManager = options.applePaySessionManager;\r\n\r\n this.instance =\r\n options.instancePromisedSingleton ??\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n new PromisedSingleton<any | undefined>({\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n generator: async (): Promise<any | undefined> => {\r\n if (!this.applePaySessionManager.canMakePayments()) {\r\n return undefined;\r\n }\r\n\r\n const braintreeClient = await this.braintreeManager.instance.get();\r\n const instance = await this.applePayClient.create({\r\n client: braintreeClient,\r\n });\r\n\r\n return instance;\r\n },\r\n });\r\n }\r\n\r\n private braintreeManager: BraintreeManagerInterface;\r\n\r\n private applePaySessionManager: ApplePaySessionManagerInterface;\r\n\r\n private applePayClient: braintree.ApplePay;\r\n\r\n async isAvailable(): Promise<boolean> {\r\n try {\r\n const instance = await this.instance.get();\r\n return !!instance;\r\n } catch (err) {\r\n return false;\r\n }\r\n }\r\n\r\n // In order to trigger the Apple Pay flow, you HAVE to pass in the event\r\n // that triggered the launch. Notice we're not actually using the event\r\n // but ApplePay won't launch without it.\r\n async createPaymentRequest(\r\n e: Event,\r\n donationInfo: DonationPaymentInfo,\r\n ): Promise<ApplePaySessionDataSource> {\r\n const applePayInstance = await this.instance.get();\r\n\r\n let label = 'Internet Archive Monthly';\r\n if (donationInfo.donationType === DonationType.OneTime) {\r\n label = 'Internet Archive';\r\n }\r\n\r\n const paymentRequest = applePayInstance.createPaymentRequest({\r\n total: {\r\n label: label,\r\n amount: donationInfo.total,\r\n },\r\n requiredBillingContactFields: ['postalAddress'],\r\n requiredShippingContactFields: ['name', 'email'],\r\n });\r\n const session = this.applePaySessionManager.createNewPaymentSession(paymentRequest);\r\n\r\n const sessionDataSource = new ApplePaySessionDataSource({\r\n donationInfo: donationInfo,\r\n session: session,\r\n applePayInstance: applePayInstance,\r\n braintreeManager: this.braintreeManager,\r\n });\r\n\r\n session.onvalidatemerchant = sessionDataSource.onvalidatemerchant.bind(sessionDataSource);\r\n session.onpaymentauthorized = sessionDataSource.onpaymentauthorized.bind(sessionDataSource);\r\n session.oncancel = sessionDataSource.oncancel.bind(sessionDataSource);\r\n\r\n session.begin();\r\n\r\n return sessionDataSource;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"credit-card-interface.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/credit-card/credit-card-interface.ts"],"names":[],"mappings":"","sourcesContent":["import { PromisedSingleton } from '@internetarchive/promised-singleton';\nimport { Unsubscribe } from 'nanoevents';\nimport { HostedFieldName } from './hosted-field-container';\n\nexport interface CreditCardHandlerEvents {\n hostedFieldsRetry: (retryNumber: number) => void;\n hostedFieldsFailed: (error: unknown) => void;\n}\n\nexport interface CreditCardHandlerInterface {\n instance: PromisedSingleton<braintree.HostedFields | undefined>;\n tokenizeHostedFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined>;\n markFieldErrors(fields: HostedFieldName[]): void;\n removeFieldErrors(fields: HostedFieldName[]): void;\n showErrorMessage(message?: string): void;\n hideErrorMessage(): void;\n on<E extends keyof CreditCardHandlerEvents>(\n event: E,\n callback: CreditCardHandlerEvents[E],\n ): Unsubscribe;\n}\n"]}
1
+ {"version":3,"file":"credit-card-interface.js","sourceRoot":"","sources":["../../../../../src/braintree-manager/payment-providers/credit-card/credit-card-interface.ts"],"names":[],"mappings":"","sourcesContent":["import { PromisedSingleton } from '@internetarchive/promised-singleton';\r\nimport { Unsubscribe } from 'nanoevents';\r\nimport { HostedFieldName } from './hosted-field-container';\r\n\r\nexport interface CreditCardHandlerEvents {\r\n hostedFieldsRetry: (retryNumber: number) => void;\r\n hostedFieldsFailed: (error: unknown) => void;\r\n}\r\n\r\nexport interface CreditCardHandlerInterface {\r\n instance: PromisedSingleton<braintree.HostedFields | undefined>;\r\n tokenizeHostedFields(): Promise<braintree.HostedFieldsTokenizePayload | undefined>;\r\n markFieldErrors(fields: HostedFieldName[]): void;\r\n removeFieldErrors(fields: HostedFieldName[]): void;\r\n showErrorMessage(message?: string): void;\r\n hideErrorMessage(): void;\r\n on<E extends keyof CreditCardHandlerEvents>(\r\n event: E,\r\n callback: CreditCardHandlerEvents[E],\r\n ): Unsubscribe;\r\n}\r\n"]}