@justifi/webcomponents 4.8.1 → 4.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/dist/cjs/{Business-3c0aa22c.js → Business-42d0c522.js} +1 -2
  2. package/dist/cjs/{SubAccount-b9487cbb.js → SubAccount-2a803b22.js} +1 -1
  3. package/dist/cjs/additional-questions-details_5.cjs.entry.js +1 -1
  4. package/dist/cjs/justifi-additional-questions_5.cjs.entry.js +5 -5
  5. package/dist/cjs/justifi-bank-account-form.cjs.entry.js +2 -1
  6. package/dist/cjs/justifi-billing-form_2.cjs.entry.js +3 -1
  7. package/dist/cjs/justifi-business-details.cjs.entry.js +1 -1
  8. package/dist/cjs/justifi-business-form-stepped.cjs.entry.js +1 -1
  9. package/dist/cjs/justifi-business-form.cjs.entry.js +2 -2
  10. package/dist/cjs/justifi-business-list.cjs.entry.js +2 -2
  11. package/dist/cjs/justifi-card-form.cjs.entry.js +2 -1
  12. package/dist/cjs/justifi-gross-payment-chart.cjs.entry.js +1 -1
  13. package/dist/cjs/justifi-payment-balance-transactions.cjs.entry.js +1 -1
  14. package/dist/cjs/justifi-payment-form.cjs.entry.js +9 -36
  15. package/dist/cjs/justifi-payment-method-form.cjs.entry.js +81 -64
  16. package/dist/cjs/justifi-proceeds-list.cjs.entry.js +1 -1
  17. package/dist/cjs/justifi-subaccount-details.cjs.entry.js +2 -2
  18. package/dist/cjs/justifi-subaccounts-list.cjs.entry.js +2 -2
  19. package/dist/cjs/loader.cjs.js +1 -1
  20. package/dist/cjs/payment-details-core.cjs.entry.js +1 -1
  21. package/dist/cjs/payments-list-core.cjs.entry.js +1 -1
  22. package/dist/cjs/payout-details-core.cjs.entry.js +1 -1
  23. package/dist/cjs/payouts-list-core.cjs.entry.js +1 -1
  24. package/dist/cjs/subaccount-account-details_4.cjs.entry.js +1 -1
  25. package/dist/cjs/{utils-36bf8b3e.js → utils-29a8a91d.js} +33 -1
  26. package/dist/cjs/webcomponents.cjs.js +1 -1
  27. package/dist/collection/api/Business.js +1 -1
  28. package/dist/collection/components/bank-account-form/bank-account-form.js +4 -2
  29. package/dist/collection/components/bank-account-form/test/bank-account-form.spec.js +9 -0
  30. package/dist/collection/components/business-form/business-form.js +1 -1
  31. package/dist/collection/components/business-form/business-generic-info/business-generic-info.js +1 -1
  32. package/dist/collection/components/business-form/business-representative/business-representative.js +1 -1
  33. package/dist/collection/components/business-form/legal-address-form/legal-address-form.js +2 -3
  34. package/dist/collection/components/card-form/card-form.js +4 -2
  35. package/dist/collection/components/card-form/test/card-form.spec.js +9 -0
  36. package/dist/collection/components/payment-details/test/payment-details-core.spec.js +2 -2
  37. package/dist/collection/components/payment-details/test/payment-details.spec.js +3 -3
  38. package/dist/collection/components/payment-form/payment-form.js +12 -83
  39. package/dist/collection/components/payment-form/payment-method-selector.js +2 -23
  40. package/dist/collection/components/payment-form/test/payment-form.spec.js +5 -18
  41. package/dist/collection/components/payment-method-form/payment-method-form.js +62 -72
  42. package/dist/collection/components/payment-method-form/test/payment-method-form.spec.js +123 -41
  43. package/dist/collection/components/payments-list/test/payments-list-core.spec.js +2 -2
  44. package/dist/collection/components/payments-list/test/payments-list.spec.js +3 -3
  45. package/dist/collection/components/payout-details/test/payout-details-core.spec.js +3 -3
  46. package/dist/collection/components/payout-details/test/payout-details.spec.js +1 -1
  47. package/dist/collection/components/payouts-list/test/payouts-list-core.spec.js +2 -2
  48. package/dist/collection/components/payouts-list/test/payouts-list.spec.js +3 -3
  49. package/dist/collection/utils/frame-comunication-service.js +32 -0
  50. package/dist/collection/utils/utils.js +31 -0
  51. package/dist/docs.json +40 -103
  52. package/dist/esm/{Business-954e1c1b.js → Business-e9340f6b.js} +2 -2
  53. package/dist/esm/{SubAccount-bd59f646.js → SubAccount-46b4c2b1.js} +1 -1
  54. package/dist/esm/additional-questions-details_5.entry.js +1 -1
  55. package/dist/esm/justifi-additional-questions_5.entry.js +5 -5
  56. package/dist/esm/justifi-bank-account-form.entry.js +2 -1
  57. package/dist/esm/justifi-billing-form_2.entry.js +3 -1
  58. package/dist/esm/justifi-business-details.entry.js +1 -1
  59. package/dist/esm/justifi-business-form-stepped.entry.js +1 -1
  60. package/dist/esm/justifi-business-form.entry.js +2 -2
  61. package/dist/esm/justifi-business-list.entry.js +2 -2
  62. package/dist/esm/justifi-card-form.entry.js +2 -1
  63. package/dist/esm/justifi-gross-payment-chart.entry.js +1 -1
  64. package/dist/esm/justifi-payment-balance-transactions.entry.js +1 -1
  65. package/dist/esm/justifi-payment-form.entry.js +9 -36
  66. package/dist/esm/justifi-payment-method-form.entry.js +81 -64
  67. package/dist/esm/justifi-proceeds-list.entry.js +1 -1
  68. package/dist/esm/justifi-subaccount-details.entry.js +2 -2
  69. package/dist/esm/justifi-subaccounts-list.entry.js +2 -2
  70. package/dist/esm/loader.js +1 -1
  71. package/dist/esm/payment-details-core.entry.js +1 -1
  72. package/dist/esm/payments-list-core.entry.js +1 -1
  73. package/dist/esm/payout-details-core.entry.js +1 -1
  74. package/dist/esm/payouts-list-core.entry.js +1 -1
  75. package/dist/esm/subaccount-account-details_4.entry.js +1 -1
  76. package/dist/esm/{utils-dd428dba.js → utils-76a93600.js} +32 -1
  77. package/dist/esm/webcomponents.js +1 -1
  78. package/dist/module/Business.js +2 -2
  79. package/dist/module/SubAccount.js +1 -1
  80. package/dist/module/business-generic-info.js +1 -1
  81. package/dist/module/business-representative.js +1 -1
  82. package/dist/module/justifi-bank-account-form.js +2 -1
  83. package/dist/module/justifi-business-form.js +1 -1
  84. package/dist/module/justifi-card-form.js +2 -1
  85. package/dist/module/justifi-gross-payment-chart.js +1 -1
  86. package/dist/module/justifi-payment-balance-transactions.js +1 -1
  87. package/dist/module/justifi-payment-form.js +11 -42
  88. package/dist/module/justifi-subaccount-details.js +1 -1
  89. package/dist/module/legal-address-form.js +2 -3
  90. package/dist/module/payment-details-core2.js +1 -1
  91. package/dist/module/payment-method-form.js +81 -64
  92. package/dist/module/payment-method-selector.js +3 -2
  93. package/dist/module/payments-list-core2.js +1 -1
  94. package/dist/module/payout-details-core2.js +1 -1
  95. package/dist/module/payouts-list-core2.js +1 -1
  96. package/dist/module/utils2.js +32 -1
  97. package/dist/types/api/Business.d.ts +11 -11
  98. package/dist/types/components/bank-account-form/bank-account-form.d.ts +1 -1
  99. package/dist/types/components/business-form/business-form-schema.d.ts +1 -1
  100. package/dist/types/components/business-form/legal-address-form/legal-address-form.d.ts +2 -1
  101. package/dist/types/components/card-form/card-form.d.ts +1 -1
  102. package/dist/types/components/payment-form/payment-form.d.ts +1 -5
  103. package/dist/types/components/payment-form/payment-method-selector.d.ts +1 -1
  104. package/dist/types/components/payment-method-form/payment-method-form.d.ts +12 -12
  105. package/dist/types/components.d.ts +8 -13
  106. package/dist/types/utils/frame-comunication-service.d.ts +13 -0
  107. package/dist/types/utils/utils.d.ts +2 -0
  108. package/dist/webcomponents/{p-d66a6057.entry.js → p-08833966.entry.js} +1 -1
  109. package/dist/webcomponents/p-0bc8b02e.entry.js +1 -0
  110. package/dist/webcomponents/{p-f0c535ed.js → p-22c1acd6.js} +1 -1
  111. package/dist/webcomponents/p-234bc840.entry.js +1 -0
  112. package/dist/webcomponents/{p-8a90b976.entry.js → p-40349ffc.entry.js} +1 -1
  113. package/dist/webcomponents/{p-0b9146cd.entry.js → p-4ee44c76.entry.js} +1 -1
  114. package/dist/webcomponents/{p-ea05d7c2.entry.js → p-5422a24b.entry.js} +1 -1
  115. package/dist/webcomponents/{p-0e53f470.entry.js → p-578e0a05.entry.js} +1 -1
  116. package/dist/webcomponents/{p-50730e69.js → p-5c0310ee.js} +1 -1
  117. package/dist/webcomponents/p-640d90dc.entry.js +1 -0
  118. package/dist/webcomponents/{p-80140d5b.js → p-6478f3ca.js} +1 -1
  119. package/dist/webcomponents/p-696396c7.entry.js +1 -0
  120. package/dist/webcomponents/p-6d0725ef.entry.js +1 -0
  121. package/dist/webcomponents/p-7a1a06c0.entry.js +1 -0
  122. package/dist/webcomponents/{p-5e142186.entry.js → p-8516d602.entry.js} +1 -1
  123. package/dist/webcomponents/{p-c0f882ce.entry.js → p-894a7475.entry.js} +1 -1
  124. package/dist/webcomponents/{p-896a9ddb.entry.js → p-94ebfafb.entry.js} +1 -1
  125. package/dist/webcomponents/{p-d71ce1cd.entry.js → p-9e81808f.entry.js} +1 -1
  126. package/dist/webcomponents/{p-2e318b6a.entry.js → p-a432110c.entry.js} +1 -1
  127. package/dist/webcomponents/{p-a5d662ac.entry.js → p-b1881723.entry.js} +1 -1
  128. package/dist/webcomponents/{p-19c5ddf1.entry.js → p-bfd917b8.entry.js} +1 -1
  129. package/dist/webcomponents/p-c90fa055.entry.js +1 -0
  130. package/dist/webcomponents/{p-34de1c5d.entry.js → p-ebb91944.entry.js} +1 -1
  131. package/dist/webcomponents/{p-eef5b15b.entry.js → p-fa495a43.entry.js} +1 -1
  132. package/dist/webcomponents/webcomponents.esm.js +1 -1
  133. package/package.json +3 -3
  134. package/dist/webcomponents/p-57aab065.entry.js +0 -1
  135. package/dist/webcomponents/p-5f8b9f64.entry.js +0 -1
  136. package/dist/webcomponents/p-731cb109.entry.js +0 -1
  137. package/dist/webcomponents/p-870c2e4d.entry.js +0 -1
  138. package/dist/webcomponents/p-ad9a6c20.entry.js +0 -1
  139. package/dist/webcomponents/p-f7a3fd12.entry.js +0 -1
  140. package/dist/webcomponents/p-f9183f12.entry.js +0 -1
  141. /package/dist/collection/{components/payment-method-form → utils}/get-computed-theme.js +0 -0
  142. /package/dist/collection/{components/payment-method-form → utils}/theme.js +0 -0
  143. /package/dist/types/{components/payment-method-form → utils}/get-computed-theme.d.ts +0 -0
  144. /package/dist/types/{components/payment-method-form → utils}/theme.d.ts +0 -0
@@ -2,11 +2,15 @@ import { config } from "../../../../config";
2
2
  import { h } from "@stencil/core";
3
3
  import { newSpecPage } from "@stencil/core/testing";
4
4
  import { PaymentMethodForm } from "../payment-method-form";
5
+ import { PaymentMethodTypes } from "../../../api";
6
+ import { FrameCommunicationService } from "../../../utils/frame-comunication-service";
7
+ import { MessageEventType } from "../message-event-types";
8
+ import packageJson from "../../../../package.json";
5
9
  describe('justifi-payment-method-form', () => {
6
10
  it('renders an iframe', async () => {
7
11
  const page = await newSpecPage({
8
12
  components: [PaymentMethodForm],
9
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'card' }),
13
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.card, iframeOrigin: config.iframeOrigin })),
10
14
  });
11
15
  expect(page.root).toEqualHtml(`
12
16
  <justifi-payment-method-form>
@@ -14,70 +18,148 @@ describe('justifi-payment-method-form', () => {
14
18
  </justifi-payment-method-form>
15
19
  `);
16
20
  });
17
- it('renders a card iframe when paymentMethodFormType is card', async () => {
18
- const page = await newSpecPage({
19
- components: [PaymentMethodForm],
20
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'card' }),
21
- });
22
- expect(page.root).toEqualHtml(`
21
+ describe('Test Props', () => {
22
+ it('renders a card iframe when paymentMethodFormType is card', async () => {
23
+ const page = await newSpecPage({
24
+ components: [PaymentMethodForm],
25
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.card, iframeOrigin: config.iframeOrigin })),
26
+ });
27
+ expect(page.root).toEqualHtml(`
23
28
  <justifi-payment-method-form>
24
29
  <iframe id='justifi-payment-method-form-card' src='${config.iframeOrigin}/card'></iframe>
25
30
  </justifi-payment-method-form>
26
31
  `);
27
- });
28
- it('renders a bank iframe when paymentMethodFormType is bank', async () => {
29
- const page = await newSpecPage({
30
- components: [PaymentMethodForm],
31
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'bankAccount' }),
32
32
  });
33
- expect(page.root).toEqualHtml(`
33
+ it('renders a bank iframe when paymentMethodFormType is bank', async () => {
34
+ const page = await newSpecPage({
35
+ components: [PaymentMethodForm],
36
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.bankAccount, iframeOrigin: config.iframeOrigin })),
37
+ });
38
+ expect(page.root).toEqualHtml(`
34
39
  <justifi-payment-method-form>
35
40
  <iframe id='justifi-payment-method-form-bankAccount' src='${config.iframeOrigin}/bankAccount'></iframe>
36
41
  </justifi-payment-method-form>
37
42
  `);
38
- });
39
- it('renders a card iframe with validationMode when paymentMethodFormType is card and paymentMethodFormValidationMode is set', async () => {
40
- const page = await newSpecPage({
41
- components: [PaymentMethodForm],
42
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'bankAccount', paymentMethodFormValidationMode: 'onChange' }),
43
43
  });
44
- expect(page.root).toEqualHtml(`
44
+ it('renders a card iframe with validationMode when paymentMethodFormType is card and paymentMethodFormValidationMode is set', async () => {
45
+ const page = await newSpecPage({
46
+ components: [PaymentMethodForm],
47
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.bankAccount, paymentMethodFormValidationMode: 'onChange', iframeOrigin: config.iframeOrigin })),
48
+ });
49
+ expect(page.root).toEqualHtml(`
45
50
  <justifi-payment-method-form>
46
51
  <iframe id='justifi-payment-method-form-bankAccount' src='${config.iframeOrigin}/bankAccount?validationMode=onChange'></iframe>
47
52
  </justifi-payment-method-form>
48
53
  `);
49
- });
50
- it('renders a card iframe with validationMode when paymentMethodFormType is card and paymentMethodFormValidationMode is set', async () => {
51
- const page = await newSpecPage({
52
- components: [PaymentMethodForm],
53
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'bankAccount', paymentMethodFormValidationMode: 'onBlur' }),
54
54
  });
55
- expect(page.root).toEqualHtml(`
55
+ it('renders a card iframe with validationMode when paymentMethodFormType is card and paymentMethodFormValidationMode is set', async () => {
56
+ const page = await newSpecPage({
57
+ components: [PaymentMethodForm],
58
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.bankAccount, paymentMethodFormValidationMode: 'onBlur', iframeOrigin: config.iframeOrigin })),
59
+ });
60
+ expect(page.root).toEqualHtml(`
56
61
  <justifi-payment-method-form>
57
62
  <iframe id='justifi-payment-method-form-bankAccount' src='${config.iframeOrigin}/bankAccount?validationMode=onBlur'></iframe>
58
63
  </justifi-payment-method-form>
59
64
  `);
60
- });
61
- it('renders a card iframe with iframeOrigin when paymentMethodFormType is card and iframeOrigin is set', async () => {
62
- const page = await newSpecPage({
63
- components: [PaymentMethodForm],
64
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'card', iframeOrigin: '${config.iframeOrigin}' }),
65
65
  });
66
- expect(page.root).toEqualHtml(`
66
+ it('renders a card iframe with singleLine when paymentMethodFormType is card and singleLine is set', async () => {
67
+ const page = await newSpecPage({
68
+ components: [PaymentMethodForm],
69
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.card, singleLine: true, iframeOrigin: config.iframeOrigin })),
70
+ });
71
+ expect(page.root).toEqualHtml(`
67
72
  <justifi-payment-method-form>
68
- <iframe id='justifi-payment-method-form-card' src='${config.iframeOrigin}/card'></iframe>
73
+ <iframe id='justifi-payment-method-form-card' src='${config.iframeOrigin}/card?singleLine=true'></iframe>
69
74
  </justifi-payment-method-form>
70
75
  `);
76
+ });
71
77
  });
72
- it('renders a card iframe with singleLine when paymentMethodFormType is card and singleLine is set', async () => {
73
- const page = await newSpecPage({
74
- components: [PaymentMethodForm],
75
- template: () => h("justifi-payment-method-form", { paymentMethodFormType: 'card', singleLine: true }),
78
+ // Frame comunication service
79
+ describe('Frame Communication Service', () => {
80
+ it('removes message listener on disconnected callback', async () => {
81
+ const removeSpy = jest.spyOn(FrameCommunicationService.prototype, 'removeMessageListener');
82
+ const page = await newSpecPage({
83
+ components: [PaymentMethodForm],
84
+ template: () => h("justifi-payment-method-form", { iframeOrigin: config.iframeOrigin }),
85
+ });
86
+ // Manually set up the frameService to ensure it's available for the disconnectedCallback
87
+ page.rootInstance.frameService = new FrameCommunicationService(page.rootInstance.iframeElement, config.iframeOrigin);
88
+ page.rootInstance.frameService.addMessageListener(jest.fn()); // Add a dummy listener
89
+ // Manually call disconnectedCallback to simulate the component being removed
90
+ await page.rootInstance.disconnectedCallback();
91
+ // Check if removeMessageListener was called upon disconnection
92
+ expect(removeSpy).toHaveBeenCalled();
93
+ // Cleanup the spy
94
+ removeSpy.mockRestore();
95
+ });
96
+ });
97
+ // Event emission tests
98
+ describe('Event Emissions', () => {
99
+ it('emits paymentMethodFormReady when iframe sends ready event', async () => {
100
+ const page = await newSpecPage({
101
+ components: [PaymentMethodForm],
102
+ template: () => (h("justifi-payment-method-form", { paymentMethodFormType: PaymentMethodTypes.card, iframeOrigin: config.iframeOrigin })),
103
+ });
104
+ await page.waitForChanges();
105
+ const eventSpy = jest.fn();
106
+ page.win.addEventListener('paymentMethodFormReady', eventSpy);
107
+ // Ensure paymentMethodFormType is set and is a valid key in MessageEventType
108
+ const formType = page.rootInstance.paymentMethodFormType;
109
+ const eventType = MessageEventType[formType] ? MessageEventType[formType].ready : null;
110
+ if (!eventType) {
111
+ throw new Error(`Invalid paymentMethodFormType: ${formType}`);
112
+ }
113
+ const simulatedEventData = { eventType, data: {} };
114
+ page.rootInstance.dispatchMessageEvent({ data: simulatedEventData });
115
+ await page.waitForChanges();
116
+ expect(eventSpy).toHaveBeenCalled();
117
+ });
118
+ });
119
+ describe('Methods', () => {
120
+ it('calls postMessageWithResponseListener with correct parameters on tokenize', async () => {
121
+ // Mock the iframe and its contentWindow.postMessage
122
+ const mockPostMessage = jest.fn();
123
+ global.window = Object.create(window);
124
+ const url = "https://example.com";
125
+ Object.defineProperty(window, 'location', {
126
+ value: {
127
+ href: url,
128
+ }
129
+ });
130
+ const mockedIframe = {
131
+ contentWindow: {
132
+ postMessage: mockPostMessage,
133
+ }
134
+ };
135
+ const page = await newSpecPage({
136
+ components: [PaymentMethodForm],
137
+ template: () => h("justifi-payment-method-form", { iframeOrigin: url, paymentMethodFormType: PaymentMethodTypes.card }),
138
+ });
139
+ // Assign the mocked iframe to the component instance
140
+ page.rootInstance.iframeElement = mockedIframe;
141
+ // Replace the frameService with a mock that includes a mocked postMessageWithResponseListener
142
+ page.rootInstance.frameService = {
143
+ postMessage: jest.fn(),
144
+ postMessageWithResponseListener: jest.fn().mockResolvedValue({
145
+ // Mock the expected resolution value if your component expects any
146
+ }),
147
+ addMessageListener: jest.fn(),
148
+ removeMessageListener: jest.fn(),
149
+ };
150
+ const clientId = 'test-client-id';
151
+ const paymentMethodMetadata = { key: 'value' };
152
+ const account = 'test-account';
153
+ // Call the tokenize method
154
+ await page.rootInstance.tokenize(clientId, paymentMethodMetadata, account);
155
+ // Verify postMessageWithResponseListener was called with the expected parameters
156
+ expect(page.rootInstance.frameService.postMessageWithResponseListener)
157
+ .toHaveBeenCalledWith(MessageEventType.card.tokenize, expect.objectContaining({
158
+ clientId,
159
+ paymentMethodMetadata,
160
+ account,
161
+ componentVersion: packageJson.version,
162
+ }));
76
163
  });
77
- expect(page.root).toEqualHtml(`
78
- <justifi-payment-method-form>
79
- <iframe id='justifi-payment-method-form-card' src='${config.iframeOrigin}/card?singleLine=true'></iframe>
80
- </justifi-payment-method-form>
81
- `);
82
164
  });
83
165
  });
@@ -27,7 +27,7 @@ describe('payments-list-core', () => {
27
27
  const rows = justifiTable.shadowRoot.querySelectorAll('[data-test-id="table-row"]');
28
28
  expect(rows.length).toBe(mockPaymentsResponse.data.length);
29
29
  expect(mockPaymentsService.fetchPayments).toHaveBeenCalled();
30
- // expect(page.root).toMatchSnapshot();
30
+ expect(page.root).toMatchSnapshot();
31
31
  });
32
32
  it('displays an error state on failed data fetch', async () => {
33
33
  const mockService = {
@@ -47,7 +47,7 @@ describe('payments-list-core', () => {
47
47
  await page.rootInstance.fetchData();
48
48
  await page.waitForChanges();
49
49
  expect(page.rootInstance.errorMessage).toBe('Fetch error');
50
- // expect(page.root).toMatchSnapshot();
50
+ expect(page.root).toMatchSnapshot();
51
51
  });
52
52
  it('emits payment-row-clicked event on row click', async () => {
53
53
  const mockPaymentsService = {
@@ -8,7 +8,7 @@ describe('payments-list', () => {
8
8
  html: '<justifi-payments-list></justifi-payments-list>',
9
9
  });
10
10
  await page.waitForChanges();
11
- // expect(page.root).toMatchSnapshot();
11
+ expect(page.root).toMatchSnapshot();
12
12
  });
13
13
  it('renders an error message when accountId is not provided', async () => {
14
14
  const page = await newSpecPage({
@@ -16,7 +16,7 @@ describe('payments-list', () => {
16
16
  html: '<justifi-payments-list auth-token="abc"></justifi-payments-list>',
17
17
  });
18
18
  await page.waitForChanges();
19
- // expect(page.root).toMatchSnapshot();
19
+ expect(page.root).toMatchSnapshot();
20
20
  });
21
21
  it('renders an error message when authToken is not provided', async () => {
22
22
  const page = await newSpecPage({
@@ -24,6 +24,6 @@ describe('payments-list', () => {
24
24
  html: '<justifi-payments-list account-id="abc"></justifi-payments-list>',
25
25
  });
26
26
  await page.waitForChanges();
27
- // expect(page.root).toMatchSnapshot();
27
+ expect(page.root).toMatchSnapshot();
28
28
  });
29
29
  });
@@ -19,7 +19,7 @@ describe('payout-details-core', () => {
19
19
  // Wait for any state changes to complete
20
20
  await page.waitForChanges();
21
21
  // Assert the loading state is visible in the snapshot
22
- // expect(page.root).toMatchSnapshot();
22
+ expect(page.root).toMatchSnapshot();
23
23
  });
24
24
  it('fetches payout details on connected callback', async () => {
25
25
  const mockService = {
@@ -42,7 +42,7 @@ describe('payout-details-core', () => {
42
42
  expect(page.rootInstance.payout).toEqual(expect.objectContaining({
43
43
  "id": mockPayoutDetailSuccess.id, // Verify the component state was updated with mock data
44
44
  }));
45
- // expect(page.root).toMatchSnapshot(); // Verify the rendered output
45
+ expect(page.root).toMatchSnapshot(); // Verify the rendered output
46
46
  });
47
47
  it('handles fetch payout error correctly', async () => {
48
48
  // Mock the service method that gets called by getPayout
@@ -67,6 +67,6 @@ describe('payout-details-core', () => {
67
67
  await page.waitForChanges();
68
68
  // Assertions to verify the error handling
69
69
  expect(page.rootInstance.errorMessage).toBe('Error fetching payout details: Error: Fetch error');
70
- // expect(page.root).toMatchSnapshot();
70
+ expect(page.root).toMatchSnapshot();
71
71
  });
72
72
  });
@@ -8,6 +8,6 @@ describe('payout-details', () => {
8
8
  html: '<justifi-payout-details></justifi-payout-details>',
9
9
  });
10
10
  await page.waitForChanges();
11
- // expect(page.root).toMatchSnapshot();
11
+ expect(page.root).toMatchSnapshot();
12
12
  });
13
13
  });
@@ -28,7 +28,7 @@ describe('payouts-list-core', () => {
28
28
  const shadowRoot = justifiTable.shadowRoot;
29
29
  const rows = shadowRoot.querySelectorAll('[data-test-id="table-row"]');
30
30
  expect(rows.length).toBe(4);
31
- // expect(page.root).toMatchSnapshot();
31
+ expect(page.root).toMatchSnapshot();
32
32
  });
33
33
  it('displays an error state on failed data fetch', async () => {
34
34
  const mockPayoutService = {
@@ -51,7 +51,7 @@ describe('payouts-list-core', () => {
51
51
  const shadowRoot = justifiTable.shadowRoot;
52
52
  const error = shadowRoot.querySelector('[data-test-id="table-error-state"]');
53
53
  expect(error).toBeTruthy();
54
- // expect(page.root).toMatchSnapshot();
54
+ expect(page.root).toMatchSnapshot();
55
55
  });
56
56
  it('emits payout-row-clicked event on row click', async () => {
57
57
  const mockPayoutService = {
@@ -8,7 +8,7 @@ describe('payouts-list', () => {
8
8
  html: '<justifi-payouts-list></justifi-payouts-list>',
9
9
  });
10
10
  await page.waitForChanges();
11
- // expect(page.root).toMatchSnapshot();
11
+ expect(page.root).toMatchSnapshot();
12
12
  });
13
13
  it('renders an error message when accountId is not provided', async () => {
14
14
  const page = await newSpecPage({
@@ -16,7 +16,7 @@ describe('payouts-list', () => {
16
16
  html: '<justifi-payouts-list auth-token="abc"></justifi-payouts-list>',
17
17
  });
18
18
  await page.waitForChanges();
19
- // expect(page.root).toMatchSnapshot();
19
+ expect(page.root).toMatchSnapshot();
20
20
  });
21
21
  it('renders an error message when authToken is not provided', async () => {
22
22
  const page = await newSpecPage({
@@ -24,6 +24,6 @@ describe('payouts-list', () => {
24
24
  html: '<justifi-payouts-list account-id="abc"></justifi-payouts-list>',
25
25
  });
26
26
  await page.waitForChanges();
27
- // expect(page.root).toMatchSnapshot();
27
+ expect(page.root).toMatchSnapshot();
28
28
  });
29
29
  });
@@ -0,0 +1,32 @@
1
+ /**
2
+ * This approach decouples the communication logic from PaymentMethodForm component,
3
+ * making it cleaner, more maintainable, and easier to test
4
+ */
5
+ export class FrameCommunicationService {
6
+ constructor(iframe, iframeOrigin) {
7
+ this.iframe = iframe;
8
+ this.iframeOrigin = iframeOrigin;
9
+ }
10
+ postMessage(eventType, payload) {
11
+ const message = Object.assign({ eventType }, payload);
12
+ this.iframe.contentWindow.postMessage(message, this.iframeOrigin);
13
+ }
14
+ addMessageListener(callback) {
15
+ window.addEventListener('message', callback);
16
+ }
17
+ removeMessageListener(callback) {
18
+ window.removeEventListener('message', callback);
19
+ }
20
+ postMessageWithResponseListener(eventType, payload) {
21
+ return new Promise((resolve) => {
22
+ const responseListener = (event) => {
23
+ if (event.data.eventType !== eventType)
24
+ return;
25
+ window.removeEventListener('message', responseListener);
26
+ resolve(event.data.data);
27
+ };
28
+ window.addEventListener('message', responseListener);
29
+ this.postMessage(eventType, payload);
30
+ });
31
+ }
32
+ }
@@ -150,3 +150,34 @@ export function snakeCaseToHumanReadable(snakeCaseStr) {
150
150
  .map(word => word.charAt(0).toUpperCase() + word.slice(1))
151
151
  .join(' ');
152
152
  }
153
+ export function composeQueryParams(values) {
154
+ const queryParams = values.map((value) => {
155
+ if (value === values[0]) {
156
+ return (value = `?${value}`);
157
+ }
158
+ else {
159
+ return (value = `&${value}`);
160
+ }
161
+ });
162
+ return queryParams.join('');
163
+ }
164
+ export async function loadFontsOnParent() {
165
+ const parent = document.body;
166
+ const fontsToLoad = extractComputedFontsToLoad();
167
+ if (!parent || !fontsToLoad) {
168
+ return null;
169
+ }
170
+ // Construct the font URL
171
+ const fontHref = `https://fonts.googleapis.com/css2?family=${fontsToLoad}&display=swap`;
172
+ // Check if a link element with the same href already exists
173
+ const existingFontLink = Array.from(document.querySelectorAll('link')).find((link) => link.href === fontHref);
174
+ // If the font link already exists, there's no need to append a new one
175
+ if (existingFontLink) {
176
+ return;
177
+ }
178
+ // This approach is needed to load the font in a parent of the component
179
+ const fonts = document.createElement('link');
180
+ fonts.rel = 'stylesheet';
181
+ fonts.href = fontHref;
182
+ parent.append(fonts);
183
+ }
package/dist/docs.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "timestamp": "2024-02-28T21:53:13",
2
+ "timestamp": "2024-03-12T20:24:00",
3
3
  "compiler": {
4
4
  "name": "@stencil/core",
5
5
  "version": "4.10.0",
@@ -1447,6 +1447,7 @@
1447
1447
  "reflectToAttr": false,
1448
1448
  "docs": "URL for the rendered iFrame. End-users need not use this.",
1449
1449
  "docsTags": [],
1450
+ "default": "config.iframeOrigin",
1450
1451
  "values": [
1451
1452
  {
1452
1453
  "type": "string"
@@ -2826,6 +2827,7 @@
2826
2827
  "reflectToAttr": false,
2827
2828
  "docs": "URL for the rendered iFrame. End-users need not use this.",
2828
2829
  "docsTags": [],
2830
+ "default": "config.iframeOrigin",
2829
2831
  "values": [
2830
2832
  {
2831
2833
  "type": "string"
@@ -3613,6 +3615,7 @@
3613
3615
  "reflectToAttr": false,
3614
3616
  "docs": "",
3615
3617
  "docsTags": [],
3618
+ "default": "true",
3616
3619
  "values": [
3617
3620
  {
3618
3621
  "type": "boolean"
@@ -3663,27 +3666,6 @@
3663
3666
  "optional": true,
3664
3667
  "required": false
3665
3668
  },
3666
- {
3667
- "name": "iframeOrigin",
3668
- "type": "string",
3669
- "complexType": {
3670
- "original": "string",
3671
- "resolved": "string",
3672
- "references": {}
3673
- },
3674
- "mutable": false,
3675
- "attr": "iframe-origin",
3676
- "reflectToAttr": false,
3677
- "docs": "",
3678
- "docsTags": [],
3679
- "values": [
3680
- {
3681
- "type": "string"
3682
- }
3683
- ],
3684
- "optional": true,
3685
- "required": false
3686
- },
3687
3669
  {
3688
3670
  "name": "submitButtonText",
3689
3671
  "type": "string",
@@ -3767,28 +3749,6 @@
3767
3749
  ],
3768
3750
  "docs": "",
3769
3751
  "docsTags": []
3770
- },
3771
- {
3772
- "name": "loadFontsOnParent",
3773
- "returns": {
3774
- "type": "Promise<any>",
3775
- "docs": ""
3776
- },
3777
- "complexType": {
3778
- "signature": "() => Promise<any>",
3779
- "parameters": [],
3780
- "references": {
3781
- "Promise": {
3782
- "location": "global",
3783
- "id": "global::Promise"
3784
- }
3785
- },
3786
- "return": "Promise<any>"
3787
- },
3788
- "signature": "loadFontsOnParent() => Promise<any>",
3789
- "parameters": [],
3790
- "docs": "",
3791
- "docsTags": []
3792
3752
  }
3793
3753
  ],
3794
3754
  "events": [
@@ -3813,13 +3773,7 @@
3813
3773
  "docsTags": []
3814
3774
  }
3815
3775
  ],
3816
- "listeners": [
3817
- {
3818
- "event": "paymentMethodSelected",
3819
- "capture": false,
3820
- "passive": false
3821
- }
3822
- ],
3776
+ "listeners": [],
3823
3777
  "styles": [],
3824
3778
  "slots": [],
3825
3779
  "parts": [],
@@ -3868,16 +3822,22 @@
3868
3822
  "type": "string"
3869
3823
  }
3870
3824
  ],
3871
- "optional": true,
3825
+ "optional": false,
3872
3826
  "required": false
3873
3827
  },
3874
3828
  {
3875
3829
  "name": "paymentMethodFormType",
3876
- "type": "\"bankAccount\" | \"card\"",
3830
+ "type": "PaymentMethodTypes.bankAccount | PaymentMethodTypes.card",
3877
3831
  "complexType": {
3878
- "original": "'card' | 'bankAccount'",
3879
- "resolved": "\"bankAccount\" | \"card\"",
3880
- "references": {}
3832
+ "original": "PaymentMethodTypes",
3833
+ "resolved": "PaymentMethodTypes.bankAccount | PaymentMethodTypes.card",
3834
+ "references": {
3835
+ "PaymentMethodTypes": {
3836
+ "location": "import",
3837
+ "path": "../../api",
3838
+ "id": "src/api/index.ts::PaymentMethodTypes"
3839
+ }
3840
+ }
3881
3841
  },
3882
3842
  "mutable": false,
3883
3843
  "attr": "payment-method-form-type",
@@ -3886,12 +3846,10 @@
3886
3846
  "docsTags": [],
3887
3847
  "values": [
3888
3848
  {
3889
- "value": "bankAccount",
3890
- "type": "string"
3849
+ "type": "PaymentMethodTypes.bankAccount"
3891
3850
  },
3892
3851
  {
3893
- "value": "card",
3894
- "type": "string"
3852
+ "type": "PaymentMethodTypes.card"
3895
3853
  }
3896
3854
  ],
3897
3855
  "optional": false,
@@ -3961,11 +3919,11 @@
3961
3919
  {
3962
3920
  "name": "resize",
3963
3921
  "returns": {
3964
- "type": "Promise<any>",
3922
+ "type": "Promise<void>",
3965
3923
  "docs": ""
3966
3924
  },
3967
3925
  "complexType": {
3968
- "signature": "() => Promise<any>",
3926
+ "signature": "() => Promise<void>",
3969
3927
  "parameters": [],
3970
3928
  "references": {
3971
3929
  "Promise": {
@@ -3973,9 +3931,9 @@
3973
3931
  "id": "global::Promise"
3974
3932
  }
3975
3933
  },
3976
- "return": "Promise<any>"
3934
+ "return": "Promise<void>"
3977
3935
  },
3978
- "signature": "resize() => Promise<any>",
3936
+ "signature": "resize() => Promise<void>",
3979
3937
  "parameters": [],
3980
3938
  "docs": "",
3981
3939
  "docsTags": []
@@ -4065,11 +4023,11 @@
4065
4023
  "events": [
4066
4024
  {
4067
4025
  "event": "paymentMethodFormReady",
4068
- "detail": "any",
4026
+ "detail": "void",
4069
4027
  "bubbles": true,
4070
4028
  "complexType": {
4071
- "original": "any",
4072
- "resolved": "any",
4029
+ "original": "void",
4030
+ "resolved": "void",
4073
4031
  "references": {}
4074
4032
  },
4075
4033
  "cancelable": true,
@@ -4079,12 +4037,18 @@
4079
4037
  },
4080
4038
  {
4081
4039
  "event": "paymentMethodFormTokenized",
4082
- "detail": "any",
4040
+ "detail": "BankAccountCreateResponse | CardCreateResponse | PaymentMethodErrorResponse",
4083
4041
  "bubbles": true,
4084
4042
  "complexType": {
4085
- "original": "any",
4086
- "resolved": "any",
4087
- "references": {}
4043
+ "original": "CreatePaymentMethodResponse",
4044
+ "resolved": "BankAccountCreateResponse | CardCreateResponse | PaymentMethodErrorResponse",
4045
+ "references": {
4046
+ "CreatePaymentMethodResponse": {
4047
+ "location": "import",
4048
+ "path": "./payment-method-responses",
4049
+ "id": "src/components/payment-method-form/payment-method-responses.ts::CreatePaymentMethodResponse"
4050
+ }
4051
+ }
4088
4052
  },
4089
4053
  "cancelable": true,
4090
4054
  "composed": true,
@@ -4137,33 +4101,6 @@
4137
4101
  "docsTags": [],
4138
4102
  "usage": {},
4139
4103
  "props": [
4140
- {
4141
- "name": "paymentMethodTypes",
4142
- "type": "PaymentMethodTypes[]",
4143
- "complexType": {
4144
- "original": "PaymentMethodTypes[]",
4145
- "resolved": "PaymentMethodTypes[]",
4146
- "references": {
4147
- "PaymentMethodTypes": {
4148
- "location": "import",
4149
- "path": "../../api",
4150
- "id": "src/api/index.ts::PaymentMethodTypes"
4151
- }
4152
- }
4153
- },
4154
- "mutable": false,
4155
- "reflectToAttr": false,
4156
- "docs": "",
4157
- "docsTags": [],
4158
- "default": "[]",
4159
- "values": [
4160
- {
4161
- "type": "PaymentMethodTypes[]"
4162
- }
4163
- ],
4164
- "optional": false,
4165
- "required": false
4166
- },
4167
4104
  {
4168
4105
  "name": "selectedPaymentMethodType",
4169
4106
  "type": "PaymentMethodTypes.bankAccount | PaymentMethodTypes.card",
@@ -6576,6 +6513,11 @@
6576
6513
  "docstring": "",
6577
6514
  "path": "src/components/payment-method-form/payment-method-responses.ts"
6578
6515
  },
6516
+ "src/api/index.ts::PaymentMethodTypes": {
6517
+ "declaration": "any",
6518
+ "docstring": "",
6519
+ "path": "src/api/index.ts"
6520
+ },
6579
6521
  "src/components/billing-form/billing-form-schema.ts::BillingFormFields": {
6580
6522
  "declaration": "export interface BillingFormFields {\n name: string;\n address_line1: string;\n address_line2?: string;\n address_city: string;\n address_state: string;\n address_postal_code: string;\n}",
6581
6523
  "docstring": "",
@@ -6611,11 +6553,6 @@
6611
6553
  "docstring": "",
6612
6554
  "path": "src/components/form/form.ts"
6613
6555
  },
6614
- "src/api/index.ts::PaymentMethodTypes": {
6615
- "declaration": "any",
6616
- "docstring": "",
6617
- "path": "src/api/index.ts"
6618
- },
6619
6556
  "src/api/index.ts::Payment": {
6620
6557
  "declaration": "any",
6621
6558
  "docstring": "",