@rebilly/instruments 4.4.0 → 4.6.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 (134) hide show
  1. package/.babelrc +24 -26
  2. package/CHANGELOG.md +14 -0
  3. package/dist/index.js +14 -40
  4. package/dist/index.min.js +14 -40
  5. package/package.json +16 -5
  6. package/project.json +9 -0
  7. package/rollup.config.mjs +21 -26
  8. package/src/data/options-schema/index.js +94 -78
  9. package/src/data/options-schema/schemas/options-schema.js +420 -408
  10. package/src/events/base-event.js +34 -34
  11. package/src/events/events.spec.js +6 -6
  12. package/src/events/index.js +5 -5
  13. package/src/functions/destroy.js +19 -19
  14. package/src/functions/destroy.spec.js +41 -41
  15. package/src/functions/mount/fetch-data.js +200 -193
  16. package/src/functions/mount/fetch-data.spec.js +287 -285
  17. package/src/functions/mount/get-lead-source-data.js +31 -31
  18. package/src/functions/mount/get-lead-source-data.spec.js +19 -19
  19. package/src/functions/mount/index.js +73 -65
  20. package/src/functions/mount/mount.spec.js +77 -66
  21. package/src/functions/mount/setup-element.js +23 -23
  22. package/src/functions/mount/setup-framepay-theme.js +86 -68
  23. package/src/functions/mount/setup-framepay.js +9 -5
  24. package/src/functions/mount/setup-i18n.js +15 -15
  25. package/src/functions/mount/setup-options.js +74 -74
  26. package/src/functions/mount/setup-options.spec.js +325 -289
  27. package/src/functions/mount/setup-storefront.js +15 -20
  28. package/src/functions/mount/setup-styles-vars.js +19 -22
  29. package/src/functions/mount/setup-user-flow.js +51 -47
  30. package/src/functions/on.js +5 -5
  31. package/src/functions/on.spec.js +60 -51
  32. package/src/functions/purchase.js +149 -134
  33. package/src/functions/purchase.spec.js +59 -56
  34. package/src/functions/setup.js +53 -49
  35. package/src/functions/setup.spec.js +88 -75
  36. package/src/functions/show.js +13 -14
  37. package/src/functions/show.spec.js +53 -53
  38. package/src/functions/update.js +30 -28
  39. package/src/functions/update.spec.js +94 -93
  40. package/src/i18n/en.json +32 -32
  41. package/src/i18n/es.json +29 -29
  42. package/src/i18n/i18n.spec.js +18 -18
  43. package/src/i18n/index.js +48 -48
  44. package/src/instance.js +36 -36
  45. package/src/instance.spec.js +29 -27
  46. package/src/loader/index.js +95 -70
  47. package/src/loader/loader.spec.js +63 -63
  48. package/src/state/iframes.js +21 -21
  49. package/src/state/index.js +56 -54
  50. package/src/storefront/account-and-website.js +10 -8
  51. package/src/storefront/account-and-website.spec.js +55 -55
  52. package/src/storefront/deposit-requests.js +6 -6
  53. package/src/storefront/fetch-plans-from-addons-bumpOffer.js +21 -19
  54. package/src/storefront/fetch-products-from-plans.js +52 -51
  55. package/src/storefront/fetch-products-from-plans.spec.js +90 -87
  56. package/src/storefront/index.js +56 -49
  57. package/src/storefront/invoices.js +15 -15
  58. package/src/storefront/invoices.spec.js +69 -65
  59. package/src/storefront/models/account-model.js +29 -32
  60. package/src/storefront/models/base-model.js +6 -9
  61. package/src/storefront/models/deposit-request-model.js +22 -13
  62. package/src/storefront/models/invoice-model.js +16 -16
  63. package/src/storefront/models/payment-metadata.js +4 -4
  64. package/src/storefront/models/plan-model.js +73 -64
  65. package/src/storefront/models/ready-to-pay-model.js +59 -59
  66. package/src/storefront/models/summary-model.js +43 -46
  67. package/src/storefront/models/transaction-model.js +11 -14
  68. package/src/storefront/payment-instruments.js +38 -35
  69. package/src/storefront/payment-instruments.spec.js +81 -62
  70. package/src/storefront/purchase.js +50 -44
  71. package/src/storefront/purchase.spec.js +40 -40
  72. package/src/storefront/ready-to-pay.js +75 -77
  73. package/src/storefront/ready-to-pay.spec.js +59 -54
  74. package/src/storefront/storefront.spec.js +9 -9
  75. package/src/storefront/summary.js +93 -67
  76. package/src/storefront/summary.spec.js +108 -106
  77. package/src/storefront/transactions.js +6 -6
  78. package/src/style/base/default-theme.js +928 -923
  79. package/src/style/base/theme.js +21 -21
  80. package/src/style/base/theme.spec.js +13 -13
  81. package/src/style/index.js +3 -3
  82. package/src/style/utils/border.js +40 -27
  83. package/src/style/utils/color-values.js +18 -18
  84. package/src/style/utils/minifyCss.js +6 -6
  85. package/src/utils/add-dom-element.js +14 -14
  86. package/src/utils/format-currency.js +6 -5
  87. package/src/utils/has-valid-css-selector.js +2 -2
  88. package/src/utils/index.js +6 -6
  89. package/src/utils/is-dom-element.js +1 -1
  90. package/src/utils/process-property-as-dom-element.js +22 -22
  91. package/src/utils/quantity.js +26 -28
  92. package/src/utils/sleep.js +3 -1
  93. package/src/views/amount-selector.js +37 -36
  94. package/src/views/common/iframe/base-iframe.js +53 -52
  95. package/src/views/common/iframe/events/change-iframe-src-handler.js +5 -5
  96. package/src/views/common/iframe/events/dispatch-event-handler.js +4 -4
  97. package/src/views/common/iframe/events/resize-component-handler.js +8 -8
  98. package/src/views/common/iframe/events/show-error-handler.js +2 -2
  99. package/src/views/common/iframe/events/stop-loader-handler.js +8 -8
  100. package/src/views/common/iframe/events/update-addons-handler.js +20 -13
  101. package/src/views/common/iframe/events/update-coupons-handler.js +9 -9
  102. package/src/views/common/iframe/events/update-items-handler.js +26 -22
  103. package/src/views/common/iframe/modal-iframe.js +67 -56
  104. package/src/views/common/iframe/view-iframe.js +11 -11
  105. package/src/views/common/render-utilities.js +2 -2
  106. package/src/views/confirmation.js +33 -30
  107. package/src/views/errors.js +89 -79
  108. package/src/views/form.js +41 -37
  109. package/src/views/method-selector/express-methods.js +46 -46
  110. package/src/views/method-selector/generate-digital-wallet.js +46 -45
  111. package/src/views/method-selector/generate-digital-wallet.spec.js +104 -102
  112. package/src/views/method-selector/generate-framepay-config.js +53 -51
  113. package/src/views/method-selector/generate-framepay-config.spec.js +197 -173
  114. package/src/views/method-selector/get-method-data.js +5 -6
  115. package/src/views/method-selector/get-payment-methods.js +18 -16
  116. package/src/views/method-selector/get-payment-methods.spec.js +29 -27
  117. package/src/views/method-selector/index.js +154 -139
  118. package/src/views/method-selector/method-selector.spec.js +13 -13
  119. package/src/views/method-selector/mount-bump-offer.js +65 -49
  120. package/src/views/method-selector/mount-express-methods.js +89 -85
  121. package/src/views/modal.js +74 -67
  122. package/src/views/result.js +14 -14
  123. package/src/views/summary.js +25 -26
  124. package/tests/async-utilities.js +13 -13
  125. package/tests/mocks/framepay-mock.js +9 -8
  126. package/tests/mocks/rebilly-api-mock.js +5 -3
  127. package/tests/mocks/rebilly-instruments-mock.js +121 -117
  128. package/tests/mocks/storefront-api-mock.js +55 -48
  129. package/tests/mocks/storefront-mock.js +10 -14
  130. package/tests/msw/server.js +6 -6
  131. package/tests/setup-test.js +14 -16
  132. package/vitest.config.js +14 -14
  133. package/.eslintrc.js +0 -34
  134. package/.prettierrc.js +0 -11
@@ -1,47 +1,47 @@
1
1
  export class RegisteredListeners {
2
- _listeners = {};
2
+ _listeners = {};
3
3
 
4
- add(eventName, callback) {
5
- document.addEventListener(eventName, callback, false);
4
+ add(eventName, callback) {
5
+ document.addEventListener(eventName, callback, false);
6
6
 
7
- if (!(eventName in this._listeners)) {
8
- this._listeners[eventName] = [];
7
+ if (!(eventName in this._listeners)) {
8
+ this._listeners[eventName] = [];
9
+ }
10
+ this._listeners[eventName].push(callback);
9
11
  }
10
- this._listeners[eventName].push(callback);
11
- }
12
12
 
13
- removeAll() {
14
- Object.keys(this._listeners).forEach((eventName) => {
15
- this._listeners[eventName].forEach((callback) =>
16
- document.removeEventListener(eventName, callback, false)
17
- );
18
- });
19
- this._listeners = {};
20
- }
13
+ removeAll() {
14
+ Object.keys(this._listeners).forEach((eventName) => {
15
+ this._listeners[eventName].forEach((callback) =>
16
+ document.removeEventListener(eventName, callback, false),
17
+ );
18
+ });
19
+ this._listeners = {};
20
+ }
21
21
  }
22
22
 
23
23
  export const registeredListeners = new RegisteredListeners();
24
24
 
25
25
  export default class BaseEvent {
26
- /**
27
- * @param {string} name
28
- */
29
- constructor(name) {
30
- // Using namespaced internal name as a protection mechanism
31
- const PREFIX = 'rebilly-instruments-';
32
- this.internalName = PREFIX+ name;
33
- }
26
+ /**
27
+ * @param {string} name
28
+ */
29
+ constructor(name) {
30
+ // Using namespaced internal name as a protection mechanism
31
+ const PREFIX = 'rebilly-instruments-';
32
+ this.internalName = PREFIX + name;
33
+ }
34
34
 
35
- addEventListener(callback) {
36
- const innerCallback = ({ detail }) => callback(detail);
37
- registeredListeners.add(this.internalName, innerCallback);
38
- }
35
+ addEventListener(callback) {
36
+ const innerCallback = ({ detail }) => callback(detail);
37
+ registeredListeners.add(this.internalName, innerCallback);
38
+ }
39
39
 
40
- dispatch(detail) {
41
- const event = new CustomEvent(this.internalName, {
42
- bubbles: true,
43
- detail
44
- });
45
- document.dispatchEvent(event);
46
- }
40
+ dispatch(detail) {
41
+ const event = new CustomEvent(this.internalName, {
42
+ bubbles: true,
43
+ detail,
44
+ });
45
+ document.dispatchEvent(event);
46
+ }
47
47
  }
@@ -2,10 +2,10 @@ import kebabCase from 'lodash.kebabcase';
2
2
  import events, { publicEventNames } from '@/events';
3
3
 
4
4
  it('Should export all public event names', async () => {
5
- Object.keys(events).forEach((internalEventName) => {
6
- expect(events[internalEventName].internalName).toEqual(
7
- `rebilly-instruments-${kebabCase(internalEventName)}`
8
- );
9
- expect(kebabCase(internalEventName) in publicEventNames);
10
- });
5
+ Object.keys(events).forEach((internalEventName) => {
6
+ expect(events[internalEventName].internalName).toEqual(
7
+ `rebilly-instruments-${kebabCase(internalEventName)}`,
8
+ );
9
+ expect(kebabCase(internalEventName) in publicEventNames);
10
+ });
11
11
  });
@@ -2,14 +2,14 @@ import kebabCase from 'lodash.kebabcase';
2
2
  import BaseEvent from './base-event';
3
3
 
4
4
  const events = {
5
- dataReady: new BaseEvent('data-ready'),
6
- instrumentReady: new BaseEvent('instrument-ready'),
7
- purchaseCompleted: new BaseEvent('purchase-completed'),
8
- setupCompleted: new BaseEvent('setup-completed')
5
+ dataReady: new BaseEvent('data-ready'),
6
+ instrumentReady: new BaseEvent('instrument-ready'),
7
+ purchaseCompleted: new BaseEvent('purchase-completed'),
8
+ setupCompleted: new BaseEvent('setup-completed'),
9
9
  };
10
10
 
11
11
  export default events;
12
12
 
13
13
  export const publicEventNames = Object.keys(events).map((internalName) =>
14
- kebabCase(internalName)
14
+ kebabCase(internalName),
15
15
  );
@@ -5,25 +5,25 @@ import state from '../state';
5
5
  import iframes from '../state/iframes';
6
6
 
7
7
  export async function destroy() {
8
- // wait to allow for cancellation to catch any pending api requests
9
- const sleepMilliseconds = 1000;
10
- await sleep(sleepMilliseconds);
11
-
12
- Object.keys(iframes).forEach(frame => {
13
- if (iframes.hasFrame(frame)) {
14
- iframes[frame].destroy();
15
- iframes[frame] = null;
16
- }
17
- });
8
+ // wait to allow for cancellation to catch any pending api requests
9
+ const sleepMilliseconds = 1000;
10
+ await sleep(sleepMilliseconds);
11
+
12
+ Object.keys(iframes).forEach((frame) => {
13
+ if (iframes.hasFrame(frame)) {
14
+ iframes[frame].destroy();
15
+ iframes[frame] = null;
16
+ }
17
+ });
18
18
 
19
- registeredListeners.removeAll(document);
20
-
21
- state.hasMounted = false;
19
+ registeredListeners.removeAll(document);
22
20
 
23
- if (state.summary) {
24
- state.summary.textContent = '';
25
- }
26
- state.form.textContent = '';
27
- cancellation.cancelAll();
28
- state.loader.clearAll();
21
+ state.hasMounted = false;
22
+
23
+ if (state.summary) {
24
+ state.summary.textContent = '';
25
+ }
26
+ state.form.textContent = '';
27
+ cancellation.cancelAll();
28
+ state.loader.clearAll();
29
29
  }
@@ -3,61 +3,61 @@ import BaseEvent from '@/events/base-event';
3
3
  import { RenderMockRebillyInstruments } from 'tests/mocks/rebilly-instruments-mock';
4
4
 
5
5
  describe('RebillyInstruments Destroy', () => {
6
- it('should be able to destroy instance', async () => {
7
- const rebillyInstruments = await RenderMockRebillyInstruments();
6
+ it('should be able to destroy instance', async () => {
7
+ const rebillyInstruments = await RenderMockRebillyInstruments();
8
8
 
9
- const formElement = document.querySelector('.form-selector');
10
- const summaryElement = document.querySelector('.summary-selector');
9
+ const formElement = document.querySelector('.form-selector');
10
+ const summaryElement = document.querySelector('.summary-selector');
11
11
 
12
- expect(formElement.innerHTML).not.toEqual('');
13
- expect(summaryElement.innerHTML).not.toEqual('');
12
+ expect(formElement.innerHTML).not.toEqual('');
13
+ expect(summaryElement.innerHTML).not.toEqual('');
14
14
 
15
- await rebillyInstruments.destroy();
15
+ await rebillyInstruments.destroy();
16
16
 
17
- expect(formElement.innerHTML).toEqual('');
18
- expect(summaryElement.innerHTML).toEqual('');
19
- });
17
+ expect(formElement.innerHTML).toEqual('');
18
+ expect(summaryElement.innerHTML).toEqual('');
19
+ });
20
20
 
21
- it('should remove registered listeners', async () => {
22
- const rebillyInstruments = await RenderMockRebillyInstruments();
21
+ it('should remove registered listeners', async () => {
22
+ const rebillyInstruments = await RenderMockRebillyInstruments();
23
23
 
24
- const fakeEventListener = vi.fn();
25
- Events.fakeEvent = new BaseEvent('fake-event');
26
- publicEventNames.push('fake-event');
27
- rebillyInstruments.on('fake-event', fakeEventListener);
24
+ const fakeEventListener = vi.fn();
25
+ Events.fakeEvent = new BaseEvent('fake-event');
26
+ publicEventNames.push('fake-event');
27
+ rebillyInstruments.on('fake-event', fakeEventListener);
28
28
 
29
- Events.fakeEvent.dispatch();
29
+ Events.fakeEvent.dispatch();
30
30
 
31
- expect(fakeEventListener).toHaveBeenCalledTimes(1);
31
+ expect(fakeEventListener).toHaveBeenCalledTimes(1);
32
32
 
33
- fakeEventListener.mockClear();
34
- await rebillyInstruments.destroy();
33
+ fakeEventListener.mockClear();
34
+ await rebillyInstruments.destroy();
35
35
 
36
- Events.fakeEvent.dispatch();
37
- expect(fakeEventListener).not.toHaveBeenCalled();
38
- });
36
+ Events.fakeEvent.dispatch();
37
+ expect(fakeEventListener).not.toHaveBeenCalled();
38
+ });
39
39
 
40
- it('should remove multiple listeners on the same event', async () => {
41
- const rebillyInstruments = await RenderMockRebillyInstruments();
40
+ it('should remove multiple listeners on the same event', async () => {
41
+ const rebillyInstruments = await RenderMockRebillyInstruments();
42
42
 
43
- const fakeEventListener = vi.fn();
44
- const anotherFakeEventListener = vi.fn();
45
- Events.fakeEvent = new BaseEvent('fake-event');
46
- publicEventNames.push('fake-event');
47
- rebillyInstruments.on('fake-event', fakeEventListener);
48
- rebillyInstruments.on('fake-event', anotherFakeEventListener);
43
+ const fakeEventListener = vi.fn();
44
+ const anotherFakeEventListener = vi.fn();
45
+ Events.fakeEvent = new BaseEvent('fake-event');
46
+ publicEventNames.push('fake-event');
47
+ rebillyInstruments.on('fake-event', fakeEventListener);
48
+ rebillyInstruments.on('fake-event', anotherFakeEventListener);
49
49
 
50
- Events.fakeEvent.dispatch();
50
+ Events.fakeEvent.dispatch();
51
51
 
52
- expect(fakeEventListener).toHaveBeenCalledTimes(1);
53
- expect(anotherFakeEventListener).toHaveBeenCalledTimes(1);
52
+ expect(fakeEventListener).toHaveBeenCalledTimes(1);
53
+ expect(anotherFakeEventListener).toHaveBeenCalledTimes(1);
54
54
 
55
- fakeEventListener.mockClear();
56
- anotherFakeEventListener.mockClear();
57
- await rebillyInstruments.destroy();
55
+ fakeEventListener.mockClear();
56
+ anotherFakeEventListener.mockClear();
57
+ await rebillyInstruments.destroy();
58
58
 
59
- Events.fakeEvent.dispatch();
60
- expect(fakeEventListener).not.toHaveBeenCalled();
61
- expect(anotherFakeEventListener).not.toHaveBeenCalled();
62
- });
59
+ Events.fakeEvent.dispatch();
60
+ expect(fakeEventListener).not.toHaveBeenCalled();
61
+ expect(anotherFakeEventListener).not.toHaveBeenCalled();
62
+ });
63
63
  });