@rebilly/instruments 1.0.1-beta → 1.0.2-beta.10

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 (277) hide show
  1. package/.babelrc +23 -5
  2. package/.eslintrc.js +27 -0
  3. package/.prettierrc.js +11 -0
  4. package/CONTRIBUTING.md +4 -0
  5. package/README.md +361 -2
  6. package/dist/events/base-event.js +51 -37
  7. package/dist/events/events.spec.js +18 -0
  8. package/dist/events/index.js +11 -8
  9. package/dist/functions/destroy.js +27 -5
  10. package/dist/functions/destroy.spec.js +69 -0
  11. package/dist/functions/initialize.js +60 -41
  12. package/dist/functions/initialize.spec.js +13 -13
  13. package/dist/functions/mount/fetch-summary-data.js +46 -0
  14. package/dist/functions/mount/fetch-summary-data.spec.js +44 -0
  15. package/dist/functions/mount/index.js +346 -0
  16. package/dist/functions/mount/mount.spec.js +135 -0
  17. package/dist/functions/on.js +26 -18
  18. package/dist/functions/on.spec.js +45 -63
  19. package/dist/functions/purchase.js +41 -154
  20. package/dist/functions/purchase.spec.js +60 -76
  21. package/dist/functions/show.js +39 -43
  22. package/dist/functions/show.spec.js +57 -0
  23. package/dist/functions/update.js +60 -5
  24. package/dist/functions/update.spec.js +100 -0
  25. package/dist/i18n/en.json +19 -0
  26. package/dist/i18n/es.json +19 -0
  27. package/dist/i18n/i18n.spec.js +6 -23
  28. package/dist/i18n/index.js +44 -67
  29. package/dist/index.js +70 -71
  30. package/dist/index.spec.js +24 -44
  31. package/dist/loader/index.js +63 -62
  32. package/dist/loader/loader.spec.js +14 -11
  33. package/dist/storefront/index.js +28 -39
  34. package/dist/storefront/models/plan-model.js +37 -54
  35. package/dist/storefront/models/product-model.js +25 -36
  36. package/dist/storefront/models/ready-to-pay-model.js +38 -42
  37. package/dist/storefront/models/summary-model.js +72 -99
  38. package/dist/storefront/plans.js +37 -84
  39. package/dist/storefront/plans.spec.js +61 -151
  40. package/dist/storefront/products.js +35 -83
  41. package/dist/storefront/products.spec.js +60 -150
  42. package/dist/storefront/purchase.js +27 -64
  43. package/dist/storefront/purchase.spec.js +51 -87
  44. package/dist/storefront/ready-to-pay.js +45 -107
  45. package/dist/storefront/ready-to-pay.spec.js +72 -147
  46. package/dist/storefront/storefront.spec.js +6 -6
  47. package/dist/storefront/summary.js +37 -84
  48. package/dist/storefront/summary.spec.js +135 -240
  49. package/dist/style/base/__snapshots__/theme.spec.js.snap +52 -0
  50. package/dist/style/base/index.js +72 -0
  51. package/dist/style/base/theme.js +73 -0
  52. package/dist/style/base/theme.spec.js +30 -0
  53. package/dist/style/browserslist.js +8 -0
  54. package/dist/style/components/address.js +64 -0
  55. package/dist/style/components/button.js +61 -0
  56. package/dist/style/components/divider.js +48 -0
  57. package/dist/style/components/forms/checkbox.js +83 -0
  58. package/dist/style/components/forms/field.js +53 -0
  59. package/dist/style/components/forms/form.js +28 -0
  60. package/dist/style/components/forms/input.js +45 -0
  61. package/dist/style/components/forms/label.js +43 -0
  62. package/dist/style/components/forms/select.js +63 -0
  63. package/dist/style/components/forms/validation.js +34 -0
  64. package/dist/style/components/icons.js +22 -0
  65. package/dist/style/components/index.js +57 -0
  66. package/dist/style/components/loader.js +48 -0
  67. package/dist/style/components/methods.js +104 -0
  68. package/dist/style/components/overlay.js +33 -0
  69. package/dist/style/helpers/index.js +59 -0
  70. package/dist/style/index.js +48 -0
  71. package/dist/style/payment-instruments/content.js +17 -0
  72. package/dist/style/payment-instruments/index.js +20 -0
  73. package/dist/style/payment-instruments/payment-card.js +35 -0
  74. package/dist/style/utils/color-values.js +22 -0
  75. package/dist/style/vendor/framepay.js +34 -0
  76. package/dist/style/vendor/postmate.js +17 -0
  77. package/dist/style/views/confirmation.js +85 -0
  78. package/dist/style/views/index.js +29 -0
  79. package/dist/style/views/method-selector.js +20 -0
  80. package/dist/style/views/modal.js +93 -0
  81. package/dist/style/views/result.js +61 -0
  82. package/dist/style/views/summary.js +123 -0
  83. package/dist/utils/add-dom-element.js +12 -34
  84. package/dist/utils/format-currency.js +4 -4
  85. package/dist/utils/has-valid-css-selector.js +2 -2
  86. package/dist/utils/index.js +15 -31
  87. package/dist/utils/is-dom-element.js +1 -1
  88. package/dist/utils/process-property-as-dom-element.js +12 -17
  89. package/dist/utils/sleep.js +10 -0
  90. package/{src/components → dist/views}/__snapshots__/summary.spec.js.snap +7 -3
  91. package/dist/views/common/iframe/base-iframe.js +57 -0
  92. package/dist/views/common/iframe/event-listeners.js +50 -0
  93. package/dist/views/common/iframe/index.js +19 -0
  94. package/dist/views/common/iframe/method-iframe.js +33 -0
  95. package/dist/views/common/iframe/modal-iframe.js +38 -0
  96. package/dist/views/common/iframe/view-iframe.js +31 -0
  97. package/dist/views/common/render-utilities.js +11 -0
  98. package/dist/views/confirmation.js +82 -0
  99. package/dist/views/method-selector/__snapshots__/method-selector.spec.js.snap +3 -0
  100. package/dist/views/method-selector/express-methods/apple-pay.js +92 -0
  101. package/dist/views/method-selector/express-methods/google-pay.js +32 -0
  102. package/dist/views/method-selector/express-methods/paypal.js +19 -0
  103. package/dist/views/method-selector/generate-digital-wallet.js +59 -0
  104. package/dist/views/method-selector/generate-digital-wallet.spec.js +132 -0
  105. package/dist/views/method-selector/get-method-data.js +25 -0
  106. package/dist/views/method-selector/get-payment-methods.js +55 -0
  107. package/dist/views/method-selector/get-payment-methods.spec.js +44 -0
  108. package/dist/views/method-selector/index.js +133 -0
  109. package/dist/views/method-selector/method-selector.spec.js +139 -0
  110. package/dist/views/method-selector/mount-express-methods.js +69 -0
  111. package/dist/views/method-selector/mount-methods.js +78 -0
  112. package/dist/views/modal.js +83 -0
  113. package/dist/views/result.js +42 -0
  114. package/dist/views/summary.js +162 -0
  115. package/dist/views/summary.spec.js +148 -0
  116. package/package.json +12 -6
  117. package/src/events/base-event.js +35 -12
  118. package/src/events/events.spec.js +11 -0
  119. package/src/events/index.js +12 -6
  120. package/src/functions/destroy.js +22 -3
  121. package/src/functions/destroy.spec.js +63 -0
  122. package/src/functions/initialize.js +43 -20
  123. package/src/functions/initialize.spec.js +9 -7
  124. package/src/functions/mount/fetch-summary-data.js +29 -0
  125. package/src/functions/mount/fetch-summary-data.spec.js +41 -0
  126. package/src/functions/mount/index.js +312 -0
  127. package/src/functions/mount/mount.spec.js +171 -0
  128. package/src/functions/on.js +17 -14
  129. package/src/functions/on.spec.js +39 -29
  130. package/src/functions/purchase.js +24 -64
  131. package/src/functions/purchase.spec.js +19 -17
  132. package/src/functions/show.js +27 -7
  133. package/src/functions/show.spec.js +61 -0
  134. package/src/functions/update.js +50 -3
  135. package/src/functions/update.spec.js +107 -0
  136. package/src/i18n/i18n.spec.js +6 -4
  137. package/src/i18n/index.js +20 -12
  138. package/src/index.js +43 -49
  139. package/src/index.spec.js +11 -42
  140. package/src/loader/index.js +55 -39
  141. package/src/loader/loader.spec.js +30 -23
  142. package/src/storefront/index.js +9 -7
  143. package/src/storefront/models/plan-model.js +1 -1
  144. package/src/storefront/models/product-model.js +1 -1
  145. package/src/storefront/models/ready-to-pay-model.js +10 -4
  146. package/src/storefront/models/summary-model.js +8 -15
  147. package/src/storefront/plans.js +16 -12
  148. package/src/storefront/plans.spec.js +29 -37
  149. package/src/storefront/products.js +16 -12
  150. package/src/storefront/products.spec.js +28 -39
  151. package/src/storefront/purchase.js +8 -6
  152. package/src/storefront/purchase.spec.js +18 -17
  153. package/src/storefront/ready-to-pay.js +19 -13
  154. package/src/storefront/ready-to-pay.spec.js +41 -41
  155. package/src/storefront/storefront.spec.js +1 -1
  156. package/src/storefront/summary.js +14 -12
  157. package/src/storefront/summary.spec.js +37 -50
  158. package/src/style/base/__snapshots__/theme.spec.js.snap +52 -0
  159. package/src/style/base/index.js +63 -0
  160. package/src/style/base/theme.js +61 -0
  161. package/src/style/base/theme.spec.js +32 -0
  162. package/src/style/browserslist.js +1 -0
  163. package/src/style/components/address.js +55 -0
  164. package/src/style/components/button.js +54 -0
  165. package/src/style/components/divider.js +39 -0
  166. package/src/style/components/forms/checkbox.js +76 -0
  167. package/src/style/components/forms/field.js +44 -0
  168. package/src/style/components/forms/form.js +19 -0
  169. package/src/style/components/forms/input.js +36 -0
  170. package/src/style/components/forms/label.js +34 -0
  171. package/src/style/components/forms/select.js +54 -0
  172. package/src/style/components/forms/validation.js +25 -0
  173. package/src/style/components/icons.js +13 -0
  174. package/src/style/components/index.js +35 -0
  175. package/src/style/components/loader.js +41 -0
  176. package/src/style/components/methods.js +93 -0
  177. package/src/style/components/overlay.js +24 -0
  178. package/src/style/helpers/index.js +51 -0
  179. package/src/style/index.js +30 -0
  180. package/src/style/payment-instruments/content.js +8 -0
  181. package/src/style/payment-instruments/index.js +10 -0
  182. package/src/style/payment-instruments/payment-card.js +26 -0
  183. package/src/style/utils/color-values.js +9 -0
  184. package/src/style/vendor/framepay.js +25 -0
  185. package/src/style/vendor/postmate.js +8 -0
  186. package/src/style/views/confirmation.js +76 -0
  187. package/src/style/views/index.js +16 -0
  188. package/src/style/views/method-selector.js +11 -0
  189. package/src/style/views/modal.js +84 -0
  190. package/src/style/views/result.js +52 -0
  191. package/src/style/views/summary.js +114 -0
  192. package/src/utils/add-dom-element.js +12 -13
  193. package/src/utils/format-currency.js +4 -1
  194. package/src/utils/has-valid-css-selector.js +2 -2
  195. package/src/utils/index.js +2 -6
  196. package/src/utils/is-dom-element.js +1 -1
  197. package/src/utils/process-property-as-dom-element.js +27 -24
  198. package/src/utils/sleep.js +3 -0
  199. package/src/views/__snapshots__/summary.spec.js.snap +292 -0
  200. package/src/views/common/iframe/base-iframe.js +46 -0
  201. package/src/views/common/iframe/event-listeners.js +27 -0
  202. package/src/views/common/iframe/index.js +7 -0
  203. package/src/views/common/iframe/method-iframe.js +21 -0
  204. package/src/views/common/iframe/modal-iframe.js +27 -0
  205. package/src/views/common/iframe/view-iframe.js +18 -0
  206. package/src/views/common/render-utilities.js +4 -0
  207. package/src/views/confirmation.js +57 -0
  208. package/src/views/method-selector/__snapshots__/method-selector.spec.js.snap +3 -0
  209. package/src/views/method-selector/express-methods/apple-pay.js +78 -0
  210. package/src/views/method-selector/express-methods/google-pay.js +25 -0
  211. package/src/views/method-selector/express-methods/paypal.js +7 -0
  212. package/src/views/method-selector/generate-digital-wallet.js +44 -0
  213. package/src/views/method-selector/generate-digital-wallet.spec.js +131 -0
  214. package/src/{components/form → views/method-selector}/get-method-data.js +9 -5
  215. package/src/views/method-selector/get-payment-methods.js +40 -0
  216. package/src/views/method-selector/get-payment-methods.spec.js +40 -0
  217. package/src/views/method-selector/index.js +110 -0
  218. package/src/views/method-selector/method-selector.spec.js +146 -0
  219. package/src/views/method-selector/mount-express-methods.js +53 -0
  220. package/src/views/method-selector/mount-methods.js +71 -0
  221. package/src/views/modal.js +84 -0
  222. package/src/views/result.js +30 -0
  223. package/src/{components → views}/summary.js +90 -21
  224. package/src/views/summary.spec.js +170 -0
  225. package/tests/async-utilities.js +22 -0
  226. package/tests/mocks/rebilly-instruments-mock.js +105 -7
  227. package/dist/components/confirmation.js +0 -103
  228. package/dist/components/form/form.js +0 -110
  229. package/dist/components/form/form.spec.js +0 -135
  230. package/dist/components/form/get-method-data.js +0 -21
  231. package/dist/components/form/get-payment-methods.js +0 -42
  232. package/dist/components/form/method-selector.js +0 -61
  233. package/dist/components/form/mount-express-payment-methods.js +0 -102
  234. package/dist/components/form/process-digital-wallet-options.js +0 -20
  235. package/dist/components/form/zoid-helpers.js +0 -130
  236. package/dist/components/result.js +0 -66
  237. package/dist/components/summary.js +0 -60
  238. package/dist/components/summary.spec.js +0 -144
  239. package/dist/events/instrument-ready.js +0 -51
  240. package/dist/events/purchase-complete.js +0 -51
  241. package/dist/functions/mount.js +0 -311
  242. package/dist/functions/mount.spec.js +0 -203
  243. package/dist/styles/base-styles.js +0 -12
  244. package/dist/styles/flat-theme-object.js +0 -42
  245. package/dist/styles/framepay.js +0 -15
  246. package/dist/styles/main.js +0 -25
  247. package/dist/styles/payment-card.js +0 -12
  248. package/dist/styles/shade-tint-values-helper.js +0 -28
  249. package/dist/styles/style-variables.js +0 -43
  250. package/dist/utils/camel-case.js +0 -12
  251. package/dist/utils/kebab-case.js +0 -10
  252. package/dist/utils/un-kebab-case.js +0 -10
  253. package/src/components/confirmation.js +0 -77
  254. package/src/components/form/__snapshots__/form.spec.js.snap +0 -43
  255. package/src/components/form/form.js +0 -88
  256. package/src/components/form/form.spec.js +0 -109
  257. package/src/components/form/get-payment-methods.js +0 -32
  258. package/src/components/form/method-selector.js +0 -47
  259. package/src/components/form/mount-express-payment-methods.js +0 -84
  260. package/src/components/form/process-digital-wallet-options.js +0 -11
  261. package/src/components/form/zoid-helpers.js +0 -114
  262. package/src/components/result.js +0 -50
  263. package/src/components/summary.spec.js +0 -106
  264. package/src/events/instrument-ready.js +0 -11
  265. package/src/events/purchase-complete.js +0 -11
  266. package/src/functions/mount.js +0 -204
  267. package/src/functions/mount.spec.js +0 -172
  268. package/src/styles/base-styles.js +0 -741
  269. package/src/styles/flat-theme-object.js +0 -12
  270. package/src/styles/framepay.js +0 -30
  271. package/src/styles/main.js +0 -17
  272. package/src/styles/payment-card.js +0 -18
  273. package/src/styles/shade-tint-values-helper.js +0 -13
  274. package/src/styles/style-variables.js +0 -34
  275. package/src/utils/camel-case.js +0 -3
  276. package/src/utils/kebab-case.js +0 -3
  277. package/src/utils/un-kebab-case.js +0 -3
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ var _events = _interopRequireWildcard(require("../events"));
4
+
5
+ var _baseEvent = _interopRequireDefault(require("../events/base-event"));
6
+
7
+ var _rebillyInstrumentsMock = require("../../tests/mocks/rebilly-instruments-mock");
8
+
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+
11
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
12
+
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+
15
+ describe('RebillyInstruments Destroy', () => {
16
+ it('should be able to destroy instance', async () => {
17
+ const rebillyInstruments = await (0, _rebillyInstrumentsMock.RenderMockRebillyInstruments)();
18
+ const formElement = document.querySelector('.form-selector');
19
+ const summaryElement = document.querySelector('.summary-selector');
20
+ expect(formElement.innerHTML).not.toEqual('');
21
+ expect(summaryElement.innerHTML).not.toEqual('');
22
+ await rebillyInstruments.destroy();
23
+ expect(formElement.innerHTML).toEqual('');
24
+ expect(summaryElement.innerHTML).toEqual('');
25
+ });
26
+ it('should remove registered listeners', async () => {
27
+ const rebillyInstruments = await (0, _rebillyInstrumentsMock.RenderMockRebillyInstruments)();
28
+ const fakeEventListener = jest.fn();
29
+ _events.default.fakeEvent = new _baseEvent.default('fake-event');
30
+
31
+ _events.publicEventNames.push('fake-event');
32
+
33
+ rebillyInstruments.on('fake-event', fakeEventListener);
34
+
35
+ _events.default.fakeEvent.dispatch();
36
+
37
+ expect(fakeEventListener).toHaveBeenCalledTimes(1);
38
+ fakeEventListener.mockClear();
39
+ await rebillyInstruments.destroy();
40
+
41
+ _events.default.fakeEvent.dispatch();
42
+
43
+ expect(fakeEventListener).not.toHaveBeenCalled();
44
+ });
45
+ it('should remove multiple listeners on the same event', async () => {
46
+ const rebillyInstruments = await (0, _rebillyInstrumentsMock.RenderMockRebillyInstruments)();
47
+ const fakeEventListener = jest.fn();
48
+ const anotherFakeEventListener = jest.fn();
49
+ _events.default.fakeEvent = new _baseEvent.default('fake-event');
50
+
51
+ _events.publicEventNames.push('fake-event');
52
+
53
+ rebillyInstruments.on('fake-event', fakeEventListener);
54
+ rebillyInstruments.on('fake-event', anotherFakeEventListener);
55
+
56
+ _events.default.fakeEvent.dispatch();
57
+
58
+ expect(fakeEventListener).toHaveBeenCalledTimes(1);
59
+ expect(anotherFakeEventListener).toHaveBeenCalledTimes(1);
60
+ fakeEventListener.mockClear();
61
+ anotherFakeEventListener.mockClear();
62
+ await rebillyInstruments.destroy();
63
+
64
+ _events.default.fakeEvent.dispatch();
65
+
66
+ expect(fakeEventListener).not.toHaveBeenCalled();
67
+ expect(anotherFakeEventListener).not.toHaveBeenCalled();
68
+ });
69
+ });
@@ -3,14 +3,30 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.Initialize = Initialize;
6
+ exports.initialize = initialize;
7
7
 
8
8
  var _storefront = _interopRequireDefault(require("../storefront"));
9
9
 
10
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
11
 
12
12
  /**
13
- * @typedef {"live" | "sandbox"} ApiMode
13
+ * @typedef {Object} Typeography
14
+ * @param {string} fontFamily - Same as CSS property "font-family". Will be used thoughout the library ui
15
+ */
16
+
17
+ /**
18
+ * @typedef {Object} Color
19
+ * @param {string} primary - CSS hexcode or color name, used to draw user attention
20
+ * @param {string} errorText - CSS hexcode or color name, used to display error messages
21
+ * @param {string} text - CSS hexcode or color name, used to display font color
22
+ * @param {string} buttonText - CSS hexcode or color name, used for buttons text, primary will be it's background
23
+ * @param {string} background - CSS hexcode or color name, the color used for the background of the forms
24
+ */
25
+
26
+ /**
27
+ * @typedef {Object} Theme
28
+ * @param {Color} color - object with color properties
29
+ * @param {Typeography} typography - object with typography options
14
30
  */
15
31
 
16
32
  /**
@@ -18,53 +34,56 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d
18
34
  * @property {string} organizationId - The Rebilly organization id that all api requests will be associated with.
19
35
  * @property {string} publishableKey - The Rebilly publishable api key used to access the storefront api's.
20
36
  * @property {string} websiteId - The Rebilly website api.
21
- * @property {ApiMode} apiMode - The mode for the Rebilly api. default "live".
37
+ * @property {"live" | "sandbox"} apiMode - default "live". The mode for the Rebilly api. default "live".
22
38
  * @property {string} css - CSS string that overrides any styles.
39
+ * @property {Theme} theme - CSS string that overrides any styles.
40
+ * @property {object} i18n - object containing the language defintions. (or overrides for existing languages)
23
41
  */
24
42
 
25
43
  /**
26
- * Initialize library with configurations.
44
+ * @typedef {Object} InitializeParams
45
+ * @param {Object} state - The global state.
27
46
  * @param {Configs} configs - The configurations that are to be passed to the library for use.
28
47
  */
29
- function Initialize() {
30
- var configs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
31
-
32
- var organizationId = configs.organizationId,
33
- publishableKey = configs.publishableKey,
34
- websiteId = configs.websiteId,
35
- _configs$apiMode = configs.apiMode,
36
- apiMode = _configs$apiMode === void 0 ? 'live' : _configs$apiMode,
37
- i18n = configs.i18n,
38
- theme = configs.theme,
39
- css = configs.css,
40
- _configs$_dev = configs._dev,
41
- _dev = _configs$_dev === void 0 ? {
42
- liveUrl: null,
43
- sandboxUrl: null
44
- } : _configs$_dev;
45
48
 
46
- this.configs = {
47
- organizationId: organizationId,
48
- publishableKey: publishableKey,
49
- websiteId: websiteId,
50
- apiMode: apiMode,
51
- i18n: i18n,
52
- theme: theme,
53
- css: css,
54
- _dev: _dev
49
+ /**
50
+ * Initialize library with configurations.
51
+ * @param {InitializeParams} params
52
+ */
53
+ function initialize({
54
+ state,
55
+ configs
56
+ }) {
57
+ const {
58
+ organizationId,
59
+ publishableKey,
60
+ websiteId,
61
+ apiMode = 'live',
62
+ i18n,
63
+ theme,
64
+ css,
65
+ _dev = null
66
+ } = configs;
67
+ state.configs = {
68
+ organizationId,
69
+ publishableKey,
70
+ websiteId,
71
+ apiMode,
72
+ i18n,
73
+ theme,
74
+ css
55
75
  };
56
- var storefront = {
57
- publishableKey: this.configs.publishableKey,
58
- orgnizationId: this.configs.orgnizationId,
59
- mode: this.configs.apiMode
76
+ const storefront = {
77
+ publishableKey: state.configs.publishableKey,
78
+ orgnizationId: state.configs.orgnizationId,
79
+ mode: state.configs.apiMode || 'live'
60
80
  };
61
81
 
62
- if (_dev.liveUrl || _dev.sandboxUrl) {
63
- storefront.liveUrl = _dev.liveUrl;
64
- storefront.sandboxUrl = _dev.sandboxUrl;
82
+ if (_dev) {
83
+ state.configs._dev = _dev;
84
+ storefront.liveUrl = _dev.liveUrl || 'https://api.local.rebilly.dev';
85
+ storefront.sandboxUrl = _dev.sandboxUrl || 'https://api-sandbox.local.rebilly.dev';
65
86
  }
66
87
 
67
- this.storefront = (0, _storefront["default"])(storefront);
68
- }
69
-
70
- ;
88
+ state.storefront = (0, _storefront.default)(storefront);
89
+ }
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
 
3
- var _rebillyInstrumentsMock = require("tests/mocks/rebilly-instruments-mock");
3
+ var _rebillyInstrumentsMock = require("../../tests/mocks/rebilly-instruments-mock");
4
4
 
5
- describe('RebillyInstruments instance', function () {
6
- it('should should set configs', function () {
7
- var testConfigs = {
5
+ describe('RebillyInstruments instance', () => {
6
+ it('should should set configs', () => {
7
+ const testConfigs = {
8
8
  apiMode: 'live',
9
9
  organizationId: 'test-organization-id',
10
10
  publishableKey: 'test-publishable-key',
@@ -14,21 +14,21 @@ describe('RebillyInstruments instance', function () {
14
14
  sandboxUrl: null
15
15
  }
16
16
  };
17
- var rebillyInstruments = (0, _rebillyInstrumentsMock.MockRebillyInstruments)(testConfigs);
18
- expect(rebillyInstruments.configs).toEqual(testConfigs);
17
+ const rebillyInstruments = (0, _rebillyInstrumentsMock.MockRebillyInstruments)(testConfigs);
18
+ expect(rebillyInstruments.state.configs).toEqual(testConfigs);
19
19
  });
20
- it('should setup api instance', function () {
21
- var rebillyInstruments = (0, _rebillyInstrumentsMock.MockRebillyInstruments)();
22
- expect(rebillyInstruments.storefront).toHaveProperty('setPublishableKey');
20
+ it('should setup api instance', () => {
21
+ const rebillyInstruments = (0, _rebillyInstrumentsMock.MockRebillyInstruments)();
22
+ expect(rebillyInstruments.state.storefront).toHaveProperty('setPublishableKey');
23
23
  });
24
- it('should have the right developer settings', function () {
25
- var devOptions = {
24
+ it('should have the right developer settings', () => {
25
+ const devOptions = {
26
26
  _dev: {
27
27
  liveUrl: 'https://api.rebilly.com',
28
28
  sandboxUrl: 'https://api-sandbox.rebilly.com'
29
29
  }
30
30
  };
31
- var rebillyInstruments = (0, _rebillyInstrumentsMock.MockRebillyInstruments)(devOptions);
32
- expect(rebillyInstruments.configs._dev).toEqual(devOptions._dev);
31
+ const rebillyInstruments = (0, _rebillyInstrumentsMock.MockRebillyInstruments)(devOptions);
32
+ expect(rebillyInstruments.state.configs._dev).toEqual(devOptions._dev);
33
33
  });
34
34
  });
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fetchSummaryData = fetchSummaryData;
7
+
8
+ var _plans = require("../../storefront/plans");
9
+
10
+ var _products = require("../../storefront/products");
11
+
12
+ var _readyToPay = require("../../storefront/ready-to-pay");
13
+
14
+ var _summary = require("../../storefront/summary");
15
+
16
+ async function fetchSummaryData({
17
+ state = null,
18
+ riskMetadata = null,
19
+ summaryPayload = null
20
+ }) {
21
+ if (!riskMetadata) {
22
+ throw new Error('riskMetadata is required for FetchSummaryData');
23
+ }
24
+
25
+ const [readyToPay, summary] = await Promise.all([(0, _readyToPay.fetchReadyToPay)({
26
+ riskMetadata,
27
+ state
28
+ }), (0, _summary.fetchSummary)({
29
+ data: summaryPayload,
30
+ state
31
+ })]);
32
+ const plans = await (0, _plans.fetchPlans)({
33
+ data: summary,
34
+ state
35
+ });
36
+ const products = await (0, _products.fetchProducts)({
37
+ data: plans,
38
+ state
39
+ });
40
+ return {
41
+ readyToPay,
42
+ summary,
43
+ plans,
44
+ products
45
+ };
46
+ }
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ var _fetchSummaryData = require("./fetch-summary-data");
4
+
5
+ describe.skip('Fetch Summary Data function helper', () => {
6
+ class TestInstance {
7
+ constructor() {
8
+ this.storefront = jest.fn();
9
+ this.configs = jest.fn();
10
+ this.options = jest.fn();
11
+ this._fetchSummary = jest.fn(() => {
12
+ return new Promise(resolve => resolve({}));
13
+ });
14
+ this._fetchProducts = jest.fn();
15
+ }
16
+
17
+ }
18
+
19
+ it.skip('should fetch all the data', async () => {
20
+ const instance = new TestInstance();
21
+ await (0, _fetchSummaryData.fetchSummaryData)({
22
+ riskMetadata: {},
23
+ state: instance
24
+ });
25
+ expect(fetchReadyToPay).toBeCalledTimes(1);
26
+ expect(instance._fetchSummary).toBeCalledTimes(1);
27
+ expect(instance._fetchPlans).toBeCalledTimes(1);
28
+ expect(instance._fetchProducts).toBeCalledTimes(1);
29
+ });
30
+ it('should pass riskMetadata to ready to pay', async () => {
31
+ const testRiskMetadata = {};
32
+ const instance = new TestInstance();
33
+ await (0, _fetchSummaryData.fetchSummaryData)({
34
+ riskMetadata: testRiskMetadata,
35
+ state: instance
36
+ });
37
+ expect(instance._fetchReadyToPay).toBeCalledWith(testRiskMetadata);
38
+ expect(async () => {
39
+ await (0, _fetchSummaryData.fetchSummaryData)({
40
+ state: instance
41
+ });
42
+ }).rejects.toEqual(new Error('riskMetadata is required for FetchSummaryData'));
43
+ });
44
+ });
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.mount = mount;
7
+
8
+ var _riskDataCollector = require("@rebilly/risk-data-collector");
9
+
10
+ var _lodash = _interopRequireDefault(require("lodash.merge"));
11
+
12
+ var _summary = require("../../views/summary");
13
+
14
+ var _methodSelector = require("../../views/method-selector");
15
+
16
+ var _style = require("../../style");
17
+
18
+ var _utils = require("../../utils");
19
+
20
+ var _fetchSummaryData = require("./fetch-summary-data");
21
+
22
+ var _show = require("../show");
23
+
24
+ var _on = require("../on");
25
+
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+
28
+ /* eslint-disable max-len */
29
+
30
+ /**
31
+ * @typedef {object} Item
32
+ * @property {string} planId - The Rebilly id of the plan.
33
+ * @property {number} quantity - The number of the plans to be purchased.
34
+ * @property {string} thumbnail - The source img for the product. Recommend 100px by 100px.
35
+ */
36
+
37
+ /**
38
+ * @typedef {object} Intent
39
+ * @property {"purchase" | "vault"} mode - Which mode the mount is usings. Default "purchase".
40
+ * @property {Array.<Item>} items - Which plans the customer is purchasing.
41
+ * @property {string} customerId - Which customer is associated with the instrument.
42
+ * @property {string} countryCode - The country code for the transaction
43
+ */
44
+
45
+ /**
46
+ * @typedef {GooglePayDisplayOptions} GooglePay
47
+ * @param {"back" | "white"} buttonColor - default "black". Color of google pay button
48
+ * @param {"short" | "long"} buttonType - default "short". The length of the button
49
+ * @param {string} buttonHeight - The value and units of the button to match other payment buttons
50
+ * <br>example: "44px", "1rem" etc.
51
+ */
52
+
53
+ /**
54
+ * @typedef {object} GooglePay
55
+ * @param {GooglePayDisplayOptions} displayOptions - display options for google pay instrument
56
+ */
57
+
58
+ /**
59
+ * @typedef {object} PaymentCard
60
+ * @param {boolean} popup - default: false. Show method as a button with a form popup
61
+ * <br>Otherwise the form will be mounted inline.
62
+ */
63
+
64
+ /**
65
+ * @typedef {object} Address
66
+ * @param {string} name - default: default. One of default, combined, or stacked.
67
+ * @param {string} region - default: default. One of default, split, or stacked.
68
+ * @param {Array.<"organization" | "phoneNumber">} show. Show extra fields listed.
69
+ * @param {Array.<"address" | "address2" | "email | "country" | "region" | "postalCode"">} hide. Hide the listed fields.
70
+ * @param {Array.<"organization" | "address" | "address2" | "email" | "phoneNumber" | "country" | "region" | "postalCode">} require.
71
+ * <br>If the field name is included, enforce the data for those inputs to be included.
72
+ * <br>First name and last name are always required. Country is always required if the products require shipping.
73
+ */
74
+
75
+ /**
76
+ * @typedef {object} PaymentInstruments
77
+ * @param {boolean} compactExpressInstruments - default: true. Show express methods as
78
+ * <br>inline pill buttons, or list of full width button.
79
+ * @param {PaymentCard} paymentCard - settings for payment card instruments
80
+ * @param {GooglePay} googlePay - settings for google pay instruments
81
+ * @param {Address} address - customization for address components for all payment instruments.
82
+ */
83
+
84
+ /**
85
+ * @typedef {object} Features
86
+ * @param {boolean} autoConfirmation - default: true. Will mount the confirmation screen after `instrument-ready`
87
+ * <br>event is triggered. Will need to trigger purchase manually if set to false.
88
+ * <br>Can use RebillyInstruments.show('confirmation', options) to mount defautl component
89
+ * @param {boolean} autoResult - default: true. Show results of transaction after `purchase-completed` event is triggered
90
+ * <br>Will need to handle purchase result manually if set to false.
91
+ * <br>Can use RebillyInstruments.show('result', options) to display default component
92
+ */
93
+
94
+ /**
95
+ * @typedef {object} Options
96
+ * @property {Intent} intent - The information required for purchaseing or vaulting an instrument
97
+ * @property {PaymentInstruments} paymentInstruments - settings for various payment instruments
98
+ * @property {Features} features - flags to enable and disable different features
99
+ * @property {string} locale - default: auto. Language to render component text
100
+ */
101
+
102
+ /**
103
+ * Mount library with configurations.
104
+ * @typedef {object} MountParams
105
+ * @property {Object} state - Global state
106
+ * @property {string | HTMLElement} form - The CSS class or HTML element were the form will be mounted.
107
+ * @property {string | HTMLElement} form - The CSS class or HTML element were the form will be mounted.
108
+ * @property {string | HTMLElement} summary - The CSS class or HTML element were the summary will be mounted.
109
+ * @property {Options} options - The configurations that are to be passed to the library for use.
110
+ */
111
+
112
+ /**
113
+ * Mount library with configurations.
114
+ * @param {MountParams} params
115
+ */
116
+ async function mount({
117
+ state,
118
+ form = '.rebilly-instruments',
119
+ summary = '.rebilly-instruments-summary',
120
+ options = {},
121
+ _dev = null
122
+ }) {
123
+ var _state$configs, _state$configs3;
124
+
125
+ state.form = form;
126
+ state.summary = summary;
127
+ state.mainStyle = null;
128
+ state._dev = _dev;
129
+ const framePayUrls = {
130
+ script: _dev ? _dev.framePayScriptLink || 'https://framepay.rebilly.com/rebilly.js' : 'https://framepay.rebilly.com/rebilly.js',
131
+ style: _dev ? _dev.framePayStyleLink || 'https://framepay.rebilly.com/rebilly.css' : 'https://framepay.rebilly.com/rebilly.css'
132
+ };
133
+ const _computed = {
134
+ paymentMethodsUrl: _dev ? _dev.paymentMethodsUrl || 'https://forms.local.rebilly.dev:3000' : 'https://forms.secure-payments.app'
135
+ };
136
+ const OPTIONS_DEFAULTS = {
137
+ intent: {
138
+ countryCode: 'US'
139
+ },
140
+ locale: 'auto',
141
+ paymentInstruments: {
142
+ address: {
143
+ name: 'default',
144
+ region: 'default',
145
+ hide: [],
146
+ show: [],
147
+ require: []
148
+ },
149
+ compactExpressInstruments: true,
150
+ googlePay: {
151
+ displayOptions: {
152
+ buttonColor: 'black',
153
+ buttonType: 'short',
154
+ buttonHeight: '44px'
155
+ }
156
+ },
157
+ applePay: {
158
+ displayOptions: {
159
+ buttonColor: 'black',
160
+ buttonType: 'plain',
161
+ buttonHeight: '44px'
162
+ }
163
+ },
164
+ paymentCard: {
165
+ popup: false
166
+ }
167
+ },
168
+ features: {
169
+ autoConfirmation: true,
170
+ autoResult: true
171
+ }
172
+ };
173
+ const combinedOptions = { ...options,
174
+ _computed
175
+ };
176
+
177
+ if (_dev) {
178
+ combinedOptions._dev = _dev;
179
+ }
180
+
181
+ state.options = (0, _lodash.default)(OPTIONS_DEFAULTS, combinedOptions);
182
+ state.form = (0, _utils.processPropertyAsDOMElement)({
183
+ prop: state.form,
184
+ propName: 'form'
185
+ });
186
+ state.summary = (0, _utils.processPropertyAsDOMElement)({
187
+ prop: state.summary,
188
+ propName: 'summary',
189
+ isRequired: false
190
+ }); // Setup loader
191
+
192
+ state.loader.addDOMElement({
193
+ el: state.form
194
+ });
195
+ state.loader.addDOMElement({
196
+ section: 'summary',
197
+ el: state.summary
198
+ }); // Adds base stylesheet
199
+
200
+ state.mainStyle = await (0, _style.mainStyle)(((_state$configs = state.configs) === null || _state$configs === void 0 ? void 0 : _state$configs.theme) || {});
201
+ (0, _utils.addDOMElement)({
202
+ element: 'style',
203
+ attributes: {
204
+ type: 'text/css'
205
+ },
206
+ content: state.mainStyle,
207
+ target: 'head'
208
+ }); // Adds configs CSS to override any styles
209
+
210
+ if (state.configs.css) {
211
+ (0, _utils.addDOMElement)({
212
+ element: 'style',
213
+ attributes: {
214
+ type: 'text/css'
215
+ },
216
+ content: state.configs.css,
217
+ target: 'head'
218
+ });
219
+ } // Adds FramePay
220
+
221
+
222
+ if (!document.querySelectorAll('[framepay*="script"]').length) {
223
+ (0, _utils.addDOMElement)({
224
+ element: 'script',
225
+ attributes: {
226
+ framepay: 'script',
227
+ src: framePayUrls.script
228
+ },
229
+ target: 'head'
230
+ });
231
+ }
232
+
233
+ if (!document.querySelectorAll('[framepay*="stylesheet"]').length) {
234
+ (0, _utils.addDOMElement)({
235
+ element: 'link',
236
+ attributes: {
237
+ framepay: 'stylesheet',
238
+ href: framePayUrls.style,
239
+ rel: 'stylesheet'
240
+ },
241
+ target: 'head'
242
+ });
243
+ }
244
+
245
+ try {
246
+ var _riskMetadata$browser, _state$configs2;
247
+
248
+ state.loader.startLoading({
249
+ section: 'summary',
250
+ id: 'initSummary'
251
+ });
252
+ state.loader.startLoading({
253
+ id: 'initForm'
254
+ });
255
+ const {
256
+ riskMetadata
257
+ } = await (0, _riskDataCollector.collectData)();
258
+
259
+ if (state.options.locale === 'auto' && riskMetadata !== null && riskMetadata !== void 0 && (_riskMetadata$browser = riskMetadata.browserData) !== null && _riskMetadata$browser !== void 0 && _riskMetadata$browser.language) {
260
+ const {
261
+ browserData: {
262
+ language
263
+ }
264
+ } = riskMetadata;
265
+ state.options.locale = language;
266
+ }
267
+
268
+ const i18n = ((_state$configs2 = state.configs) === null || _state$configs2 === void 0 ? void 0 : _state$configs2.i18n) || {};
269
+ state.translate.init(state.options.locale, i18n);
270
+ const {
271
+ readyToPay,
272
+ summary: summaryData,
273
+ plans,
274
+ products
275
+ } = await (0, _fetchSummaryData.fetchSummaryData)({
276
+ riskMetadata,
277
+ state
278
+ });
279
+ state.hasMounted = true;
280
+
281
+ if (state.form) {
282
+ const formOptions = {
283
+ summary: summaryData,
284
+ mainStyle: state.mainStyle,
285
+ readyToPay,
286
+ plans,
287
+ products
288
+ };
289
+ (0, _methodSelector.mountMethodSelector)({
290
+ state,
291
+ formOptions
292
+ });
293
+ }
294
+
295
+ if (state.summary) {
296
+ const summaryOptions = {
297
+ summary: summaryData,
298
+ readyToPay,
299
+ plans,
300
+ products
301
+ };
302
+ (0, _summary.mountSummary)({
303
+ state,
304
+ summaryOptions
305
+ });
306
+ }
307
+ } catch (error) {
308
+ throw error;
309
+ }
310
+
311
+ const i18n = ((_state$configs3 = state.configs) === null || _state$configs3 === void 0 ? void 0 : _state$configs3.i18n) || {};
312
+ state.translate.init(state.options.locale, i18n);
313
+ state.translate.translateItems();
314
+
315
+ if (state.options.features.autoConfirmation) {
316
+ (0, _on.on)({
317
+ eventName: 'instrument-ready',
318
+ callback: instrument => {
319
+ (0, _show.show)({
320
+ componentName: 'confirmation',
321
+ payload: {
322
+ instrument,
323
+ mainStyle: state.mainStyle
324
+ },
325
+ state
326
+ });
327
+ }
328
+ });
329
+ }
330
+
331
+ if (state.options.features.autoResult) {
332
+ (0, _on.on)({
333
+ eventName: 'purchase-completed',
334
+ callback: purchase => {
335
+ (0, _show.show)({
336
+ componentName: 'result',
337
+ payload: {
338
+ purchase,
339
+ mainStyle: state.mainStyle
340
+ },
341
+ state
342
+ });
343
+ }
344
+ });
345
+ }
346
+ }