@solidgate/client-sdk-loader 1.0.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 (96) hide show
  1. package/.eslintignore +8 -0
  2. package/.eslintrc +41 -0
  3. package/.gitlab-ci.yml +27 -0
  4. package/.husky/pre-commit +4 -0
  5. package/.lintstagedrc +3 -0
  6. package/.prettierrc +9 -0
  7. package/README.md +37 -0
  8. package/babel.config.js +6 -0
  9. package/dist/enums/AdditionalField.d.ts +8 -0
  10. package/dist/enums/AdditionalField.js +11 -0
  11. package/dist/enums/CardBrand.d.ts +15 -0
  12. package/dist/enums/CardBrand.js +19 -0
  13. package/dist/enums/FieldName.d.ts +12 -0
  14. package/dist/enums/FieldName.js +15 -0
  15. package/dist/enums/FormType.d.ts +7 -0
  16. package/dist/enums/FormType.js +10 -0
  17. package/dist/enums/InteractionTargetType.d.ts +5 -0
  18. package/dist/enums/InteractionTargetType.js +8 -0
  19. package/dist/enums/InteractionType.d.ts +7 -0
  20. package/dist/enums/InteractionType.js +10 -0
  21. package/dist/enums/MessageType.d.ts +14 -0
  22. package/dist/enums/MessageType.js +17 -0
  23. package/dist/enums/PayableEntity.d.ts +6 -0
  24. package/dist/enums/PayableEntity.js +9 -0
  25. package/dist/enums/SecureBrand.d.ts +9 -0
  26. package/dist/enums/SecureBrand.js +12 -0
  27. package/dist/index.d.ts +29 -0
  28. package/dist/index.js +26 -0
  29. package/dist/interfaces/ClientSdk.d.ts +6 -0
  30. package/dist/interfaces/ClientSdk.js +2 -0
  31. package/dist/interfaces/ClientSdkInstance.d.ts +12 -0
  32. package/dist/interfaces/ClientSdkInstance.js +2 -0
  33. package/dist/interfaces/InitConfig.d.ts +43 -0
  34. package/dist/interfaces/InitConfig.js +2 -0
  35. package/dist/interfaces/OrderShort.d.ts +7 -0
  36. package/dist/interfaces/OrderShort.js +2 -0
  37. package/dist/interfaces/OrderStatus.d.ts +28 -0
  38. package/dist/interfaces/OrderStatus.js +2 -0
  39. package/dist/interfaces/SdkMessage.d.ts +24 -0
  40. package/dist/interfaces/SdkMessage.js +6 -0
  41. package/dist/interfaces/Transaction.d.ts +57 -0
  42. package/dist/interfaces/Transaction.js +2 -0
  43. package/dist/interfaces/UpdateConfig.d.ts +4 -0
  44. package/dist/interfaces/UpdateConfig.js +2 -0
  45. package/dist/interfaces/messages/ErrorMessage.d.ts +8 -0
  46. package/dist/interfaces/messages/ErrorMessage.js +2 -0
  47. package/dist/interfaces/messages/FailMessage.d.ts +10 -0
  48. package/dist/interfaces/messages/FailMessage.js +2 -0
  49. package/dist/interfaces/messages/InteractionMessage.d.ts +20 -0
  50. package/dist/interfaces/messages/InteractionMessage.js +2 -0
  51. package/dist/interfaces/messages/Message.d.ts +4 -0
  52. package/dist/interfaces/messages/Message.js +2 -0
  53. package/dist/interfaces/messages/MountedMessage.d.ts +5 -0
  54. package/dist/interfaces/messages/MountedMessage.js +2 -0
  55. package/dist/interfaces/messages/OrderStatusMessage.d.ts +6 -0
  56. package/dist/interfaces/messages/OrderStatusMessage.js +2 -0
  57. package/dist/interfaces/messages/ResizeMessage.d.ts +6 -0
  58. package/dist/interfaces/messages/ResizeMessage.js +2 -0
  59. package/dist/interfaces/messages/SubmitMessage.d.ts +6 -0
  60. package/dist/interfaces/messages/SubmitMessage.js +2 -0
  61. package/dist/interfaces/messages/SuccessMessage.d.ts +8 -0
  62. package/dist/interfaces/messages/SuccessMessage.js +2 -0
  63. package/dist/services/SdkLoader.d.ts +10 -0
  64. package/dist/services/SdkLoader.js +48 -0
  65. package/dist/tsconfig.tsbuildinfo +1 -0
  66. package/package.json +50 -0
  67. package/src/enums/AdditionalField.ts +9 -0
  68. package/src/enums/CardBrand.ts +16 -0
  69. package/src/enums/FieldName.ts +13 -0
  70. package/src/enums/FormType.ts +8 -0
  71. package/src/enums/InteractionTargetType.ts +6 -0
  72. package/src/enums/InteractionType.ts +8 -0
  73. package/src/enums/MessageType.ts +15 -0
  74. package/src/enums/PayableEntity.ts +7 -0
  75. package/src/enums/SecureBrand.ts +10 -0
  76. package/src/index.ts +62 -0
  77. package/src/interfaces/ClientSdk.ts +7 -0
  78. package/src/interfaces/ClientSdkInstance.ts +17 -0
  79. package/src/interfaces/InitConfig.ts +44 -0
  80. package/src/interfaces/OrderShort.ts +7 -0
  81. package/src/interfaces/OrderStatus.ts +29 -0
  82. package/src/interfaces/SdkMessage.ts +27 -0
  83. package/src/interfaces/Transaction.ts +57 -0
  84. package/src/interfaces/UpdateConfig.ts +4 -0
  85. package/src/interfaces/messages/ErrorMessage.ts +10 -0
  86. package/src/interfaces/messages/FailMessage.ts +12 -0
  87. package/src/interfaces/messages/InteractionMessage.ts +28 -0
  88. package/src/interfaces/messages/Message.ts +5 -0
  89. package/src/interfaces/messages/MountedMessage.ts +7 -0
  90. package/src/interfaces/messages/OrderStatusMessage.ts +9 -0
  91. package/src/interfaces/messages/ResizeMessage.ts +8 -0
  92. package/src/interfaces/messages/SubmitMessage.ts +8 -0
  93. package/src/interfaces/messages/SuccessMessage.ts +10 -0
  94. package/src/services/SdkLoader.test.ts +90 -0
  95. package/src/services/SdkLoader.ts +48 -0
  96. package/tsconfig.json +33 -0
@@ -0,0 +1,57 @@
1
+ export default interface Transaction {
2
+ descriptor?: string
3
+ amount: number
4
+ card_token?: {
5
+ token: string
6
+ }
7
+ card: {
8
+ bank?: string
9
+ bin: number
10
+ brand?: string
11
+ card_exp_month: string
12
+ card_exp_year: number
13
+ card_holder?: string
14
+ card_type?: string
15
+ country?: string
16
+ number?: string
17
+ card_token?: {
18
+ token: string
19
+ }
20
+ }
21
+ created_at: string
22
+ currency: string
23
+ id: string
24
+ operation: string
25
+ status: string
26
+ updated_at: string
27
+ refund_reason?: string
28
+ refund_reason_code?: string
29
+ marketing_amount?: number
30
+ marketing_currency?: string
31
+ finance_fee_amount?: string | number
32
+ finance_fee_currency?: string | number
33
+ billing_details?: {
34
+ address?: string
35
+ city?: string
36
+ country?: string
37
+ state?: string
38
+ zip?: string
39
+ }
40
+ error?: {
41
+ code: string
42
+ message: string
43
+ recommended_message_for_user?: string
44
+ }
45
+ finance?: {
46
+ amount: number
47
+ currency: string
48
+ internal?: {
49
+ amount: number
50
+ currency: string
51
+ }
52
+ external?: {
53
+ amount: number
54
+ currency: string
55
+ }
56
+ }
57
+ }
@@ -0,0 +1,4 @@
1
+ export default interface UpdateConfig {
2
+ partialIntent: string
3
+ signature: string
4
+ }
@@ -0,0 +1,10 @@
1
+ import Message from './Message'
2
+
3
+ import MessageType from '../../enums/MessageType'
4
+
5
+ export default interface ErrorMessage extends Message<MessageType.Error> {
6
+ value: {
7
+ code?: string
8
+ message?: string | string[]
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ import Message from './Message'
2
+ import OrderShort from '../OrderShort'
3
+
4
+ import MessageType from '../../enums/MessageType'
5
+ import PayableEntity from '../../enums/PayableEntity'
6
+
7
+ export default interface FailMessage extends Message<MessageType.Fail> {
8
+ code?: string
9
+ message?: string
10
+ order?: OrderShort
11
+ entity: PayableEntity
12
+ }
@@ -0,0 +1,28 @@
1
+ import Message from "./Message"
2
+
3
+ import FieldName from '../../enums/FieldName'
4
+ import InteractionType from '../../enums/InteractionType'
5
+ import InteractionTargetType from '../../enums/InteractionTargetType'
6
+ import MessageType from "../../enums/MessageType"
7
+
8
+ export default interface InteractionMessage
9
+ extends Message<MessageType.Interaction> {
10
+ target: {
11
+ type: InteractionTargetType
12
+ name: FieldName | 'submit' | 'googlePay' | 'applePay'
13
+ interaction: InteractionType
14
+ }
15
+ cardForm: {
16
+ fields: Partial<
17
+ Record<
18
+ FieldName,
19
+ {
20
+ isValid: boolean
21
+ isTouched: boolean
22
+ }
23
+ >
24
+ >
25
+ isValid: boolean
26
+ isTouched: boolean
27
+ }
28
+ }
@@ -0,0 +1,5 @@
1
+ import MessageType from '../../enums/MessageType'
2
+
3
+ export default interface Message<T extends MessageType> {
4
+ type: T
5
+ }
@@ -0,0 +1,7 @@
1
+ import Message from './Message'
2
+
3
+ import MessageType from '../../enums/MessageType'
4
+
5
+ export default interface MountedMessage extends Message<MessageType.Mounted> {
6
+ entity: 'applebtn' | 'googlebtn' | 'form'
7
+ }
@@ -0,0 +1,9 @@
1
+ import Message from './Message'
2
+ import OrderStatus from '../OrderStatus'
3
+
4
+ import MessageType from '../../enums/MessageType'
5
+
6
+ export default interface OrderStatusMessage
7
+ extends Message<MessageType.OrderStatus> {
8
+ response: OrderStatus
9
+ }
@@ -0,0 +1,8 @@
1
+ import Message from './Message'
2
+
3
+ import MessageType from '../../enums/MessageType'
4
+
5
+ export default interface ResizeMessage extends Message<MessageType.Resize> {
6
+ height: number
7
+ width: number
8
+ }
@@ -0,0 +1,8 @@
1
+ import Message from './Message'
2
+
3
+ import MessageType from '../../enums/MessageType'
4
+ import PayableEntity from '../../enums/PayableEntity'
5
+
6
+ export default interface SubmitMessage extends Message<MessageType.Submit> {
7
+ entity: PayableEntity
8
+ }
@@ -0,0 +1,10 @@
1
+ import Message from './Message'
2
+ import OrderShort from '../OrderShort'
3
+
4
+ import MessageType from '../../enums/MessageType'
5
+ import PayableEntity from '../../enums/PayableEntity'
6
+
7
+ export default interface SuccessMessage extends Message<MessageType.Success> {
8
+ order: OrderShort
9
+ entity: PayableEntity
10
+ }
@@ -0,0 +1,90 @@
1
+ import ClientSdk from '../interfaces/ClientSdk'
2
+
3
+ declare global {
4
+ interface Window {
5
+ PaymentFormSdk?: ClientSdk
6
+ }
7
+ }
8
+
9
+ describe('SdkLoader', () => {
10
+ afterEach(() => {
11
+ jest.resetModules()
12
+
13
+ document.head.innerHTML = ''
14
+
15
+ delete window.PaymentFormSdk
16
+ })
17
+
18
+ it('just returns sdk if already loaded', async () => {
19
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
20
+ const SdkLoader = require('./SdkLoader').default
21
+
22
+ window.PaymentFormSdk = Symbol() as unknown as ClientSdk
23
+
24
+ expect(await SdkLoader.load()).toEqual(window.PaymentFormSdk)
25
+ })
26
+
27
+ it('creates script with proper src', () => {
28
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
29
+ const SdkLoader = require('./SdkLoader').default
30
+
31
+ SdkLoader.load()
32
+
33
+ const script = document.getElementById(
34
+ 'solid-payment-form-source'
35
+ ) as HTMLScriptElement
36
+
37
+ expect(script.src).toEqual('https://cdn.solidgate.com/js/solid-form.js')
38
+ expect(script.async).toBeTruthy()
39
+ })
40
+
41
+ it('resolves PaymentFormSdk after script loading', async () => {
42
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
43
+ const SdkLoader = require('./SdkLoader').default
44
+
45
+ const promise = SdkLoader.load()
46
+
47
+ const script = document.getElementById(
48
+ 'solid-payment-form-source'
49
+ ) as HTMLScriptElement
50
+
51
+ window.PaymentFormSdk = Symbol() as unknown as ClientSdk
52
+
53
+ if (script.onload) {
54
+ script.onload(new Event('load'))
55
+ }
56
+
57
+ expect(await promise).toEqual(window.PaymentFormSdk)
58
+ })
59
+
60
+ it('rejects load attempt after script loading error', () => {
61
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
62
+ const SdkLoader = require('./SdkLoader').default
63
+
64
+ const promise = SdkLoader.load()
65
+
66
+ const script = document.getElementById(
67
+ 'solid-payment-form-source'
68
+ ) as HTMLScriptElement
69
+
70
+ const error = new Event('load')
71
+
72
+ if (script.onerror) {
73
+ script.onerror(error)
74
+ }
75
+
76
+ expect(promise).rejects.toEqual(error)
77
+ })
78
+
79
+ it('creates only one script after double initialization', () => {
80
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
81
+ const SdkLoader = require('./SdkLoader').default
82
+
83
+ SdkLoader.load()
84
+ SdkLoader.load()
85
+
86
+ const scripts = document.getElementsByTagName('script')
87
+
88
+ expect(scripts.length).toEqual(1)
89
+ })
90
+ })
@@ -0,0 +1,48 @@
1
+ import ClientSdk from '../interfaces/ClientSdk'
2
+
3
+ declare global {
4
+ interface Window {
5
+ PaymentFormSdk?: ClientSdk
6
+ }
7
+ }
8
+
9
+ export default class SdkLoader {
10
+ static #CloudfrontSrc = 'https://cdn.solidgate.com/js/solid-form.js'
11
+
12
+ static #loadAttempt: Promise<ClientSdk> | null = null
13
+
14
+ static load (): Promise<ClientSdk> {
15
+ if (window.PaymentFormSdk) {
16
+ return Promise.resolve(window.PaymentFormSdk)
17
+ }
18
+
19
+ if (this.#loadAttempt) {
20
+ return this.#loadAttempt
21
+ }
22
+
23
+ this.#loadAttempt = new Promise<ClientSdk>((resolve, reject) => {
24
+ try {
25
+ const script = document.createElement('script')
26
+ script.async = true
27
+
28
+ script.src = this.#CloudfrontSrc
29
+ script.id = 'solid-payment-form-source'
30
+
31
+ script.onerror = e => {
32
+ this.#loadAttempt = null
33
+ reject(e)
34
+ }
35
+
36
+ script.onload = () => {
37
+ resolve(window.PaymentFormSdk as ClientSdk)
38
+ }
39
+
40
+ document.head.appendChild(script)
41
+ } catch (e) {
42
+ reject(e)
43
+ }
44
+ })
45
+
46
+ return this.#loadAttempt
47
+ }
48
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "compilerOptions": {
3
+ "incremental": true,
4
+ "target": "es2015",
5
+ "module": "commonjs",
6
+ "lib": ["es2017", "es7", "es6", "dom"],
7
+ "declaration": true,
8
+ "outDir": "dist",
9
+ "allowJs": true,
10
+ "strict": true,
11
+ "noImplicitAny": true,
12
+ "strictNullChecks": true,
13
+ "strictFunctionTypes": true,
14
+ "strictBindCallApply": true,
15
+ "strictPropertyInitialization": true,
16
+ "noImplicitThis": true,
17
+ "alwaysStrict": true,
18
+ "noUnusedLocals": true,
19
+ "noUnusedParameters": true,
20
+ "noImplicitReturns": true,
21
+ "moduleResolution": "node",
22
+ "allowSyntheticDefaultImports": true,
23
+ "esModuleInterop": true,
24
+ "skipLibCheck": true,
25
+ "forceConsistentCasingInFileNames": true,
26
+ "noFallthroughCasesInSwitch": true,
27
+ "resolveJsonModule": true,
28
+ "isolatedModules": true
29
+ },
30
+ "include": [
31
+ "src/index.ts"
32
+ ]
33
+ }