@sakeetech/vendure-payment-viva 0.2.1

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 (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +952 -0
  3. package/dist/api/admin-internal.controller.d.ts +59 -0
  4. package/dist/api/admin-internal.controller.d.ts.map +1 -0
  5. package/dist/api/admin-internal.controller.js +229 -0
  6. package/dist/api/admin-internal.controller.js.map +1 -0
  7. package/dist/api/admin-onboarding.controller.d.ts +72 -0
  8. package/dist/api/admin-onboarding.controller.d.ts.map +1 -0
  9. package/dist/api/admin-onboarding.controller.js +496 -0
  10. package/dist/api/admin-onboarding.controller.js.map +1 -0
  11. package/dist/api/admin-sources.controller.d.ts +50 -0
  12. package/dist/api/admin-sources.controller.d.ts.map +1 -0
  13. package/dist/api/admin-sources.controller.js +283 -0
  14. package/dist/api/admin-sources.controller.js.map +1 -0
  15. package/dist/api/shop-api.extension.d.ts +15 -0
  16. package/dist/api/shop-api.extension.d.ts.map +1 -0
  17. package/dist/api/shop-api.extension.js +35 -0
  18. package/dist/api/shop-api.extension.js.map +1 -0
  19. package/dist/api/shop-api.resolver.d.ts +42 -0
  20. package/dist/api/shop-api.resolver.d.ts.map +1 -0
  21. package/dist/api/shop-api.resolver.js +256 -0
  22. package/dist/api/shop-api.resolver.js.map +1 -0
  23. package/dist/api/webhook.controller.d.ts +58 -0
  24. package/dist/api/webhook.controller.d.ts.map +1 -0
  25. package/dist/api/webhook.controller.js +204 -0
  26. package/dist/api/webhook.controller.js.map +1 -0
  27. package/dist/cli/bin.d.ts +28 -0
  28. package/dist/cli/bin.d.ts.map +1 -0
  29. package/dist/cli/bin.js +104 -0
  30. package/dist/cli/bin.js.map +1 -0
  31. package/dist/cli/plan.d.ts +41 -0
  32. package/dist/cli/plan.d.ts.map +1 -0
  33. package/dist/cli/plan.js +115 -0
  34. package/dist/cli/plan.js.map +1 -0
  35. package/dist/cli/register-webhooks.d.ts +45 -0
  36. package/dist/cli/register-webhooks.d.ts.map +1 -0
  37. package/dist/cli/register-webhooks.js +400 -0
  38. package/dist/cli/register-webhooks.js.map +1 -0
  39. package/dist/cli/types.d.ts +75 -0
  40. package/dist/cli/types.d.ts.map +1 -0
  41. package/dist/cli/types.js +10 -0
  42. package/dist/cli/types.js.map +1 -0
  43. package/dist/constants.d.ts +35 -0
  44. package/dist/constants.d.ts.map +1 -0
  45. package/dist/constants.js +40 -0
  46. package/dist/constants.js.map +1 -0
  47. package/dist/entities/index.d.ts +4 -0
  48. package/dist/entities/index.d.ts.map +1 -0
  49. package/dist/entities/index.js +3 -0
  50. package/dist/entities/index.js.map +1 -0
  51. package/dist/entities/viva-transaction.entity.d.ts +70 -0
  52. package/dist/entities/viva-transaction.entity.d.ts.map +1 -0
  53. package/dist/entities/viva-transaction.entity.js +133 -0
  54. package/dist/entities/viva-transaction.entity.js.map +1 -0
  55. package/dist/entities/viva-webhook-event.entity.d.ts +71 -0
  56. package/dist/entities/viva-webhook-event.entity.d.ts.map +1 -0
  57. package/dist/entities/viva-webhook-event.entity.js +138 -0
  58. package/dist/entities/viva-webhook-event.entity.js.map +1 -0
  59. package/dist/index.d.ts +27 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +23 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/jobs/process-viva-webhook.handler.d.ts +95 -0
  64. package/dist/jobs/process-viva-webhook.handler.d.ts.map +1 -0
  65. package/dist/jobs/process-viva-webhook.handler.js +530 -0
  66. package/dist/jobs/process-viva-webhook.handler.js.map +1 -0
  67. package/dist/jobs/queue-names.d.ts +18 -0
  68. package/dist/jobs/queue-names.d.ts.map +1 -0
  69. package/dist/jobs/queue-names.js +19 -0
  70. package/dist/jobs/queue-names.js.map +1 -0
  71. package/dist/jobs/retention-cleanup.handler.d.ts +31 -0
  72. package/dist/jobs/retention-cleanup.handler.d.ts.map +1 -0
  73. package/dist/jobs/retention-cleanup.handler.js +94 -0
  74. package/dist/jobs/retention-cleanup.handler.js.map +1 -0
  75. package/dist/loaders/bootstrap.d.ts +28 -0
  76. package/dist/loaders/bootstrap.d.ts.map +1 -0
  77. package/dist/loaders/bootstrap.js +90 -0
  78. package/dist/loaders/bootstrap.js.map +1 -0
  79. package/dist/migrations/1714000000000-create-viva-tables.d.ts +22 -0
  80. package/dist/migrations/1714000000000-create-viva-tables.d.ts.map +1 -0
  81. package/dist/migrations/1714000000000-create-viva-tables.js +105 -0
  82. package/dist/migrations/1714000000000-create-viva-tables.js.map +1 -0
  83. package/dist/observability/metrics-state.service.d.ts +43 -0
  84. package/dist/observability/metrics-state.service.d.ts.map +1 -0
  85. package/dist/observability/metrics-state.service.js +207 -0
  86. package/dist/observability/metrics-state.service.js.map +1 -0
  87. package/dist/payment-method-handler.d.ts +26 -0
  88. package/dist/payment-method-handler.d.ts.map +1 -0
  89. package/dist/payment-method-handler.js +693 -0
  90. package/dist/payment-method-handler.js.map +1 -0
  91. package/dist/plugin.d.ts +95 -0
  92. package/dist/plugin.d.ts.map +1 -0
  93. package/dist/plugin.js +241 -0
  94. package/dist/plugin.js.map +1 -0
  95. package/dist/providers/viva-oauth2-strategy.provider.d.ts +41 -0
  96. package/dist/providers/viva-oauth2-strategy.provider.d.ts.map +1 -0
  97. package/dist/providers/viva-oauth2-strategy.provider.js +60 -0
  98. package/dist/providers/viva-oauth2-strategy.provider.js.map +1 -0
  99. package/dist/services/connected-accounts.service.d.ts +53 -0
  100. package/dist/services/connected-accounts.service.d.ts.map +1 -0
  101. package/dist/services/connected-accounts.service.js +108 -0
  102. package/dist/services/connected-accounts.service.js.map +1 -0
  103. package/dist/services/per-merchant-semaphore.service.d.ts +49 -0
  104. package/dist/services/per-merchant-semaphore.service.d.ts.map +1 -0
  105. package/dist/services/per-merchant-semaphore.service.js +156 -0
  106. package/dist/services/per-merchant-semaphore.service.js.map +1 -0
  107. package/dist/services/state-machine.service.d.ts +100 -0
  108. package/dist/services/state-machine.service.d.ts.map +1 -0
  109. package/dist/services/state-machine.service.js +233 -0
  110. package/dist/services/state-machine.service.js.map +1 -0
  111. package/dist/types.d.ts +286 -0
  112. package/dist/types.d.ts.map +1 -0
  113. package/dist/types.js +23 -0
  114. package/dist/types.js.map +1 -0
  115. package/dist/util/currency.d.ts +32 -0
  116. package/dist/util/currency.d.ts.map +1 -0
  117. package/dist/util/currency.js +90 -0
  118. package/dist/util/currency.js.map +1 -0
  119. package/dist/util/error-envelope.d.ts +51 -0
  120. package/dist/util/error-envelope.d.ts.map +1 -0
  121. package/dist/util/error-envelope.js +157 -0
  122. package/dist/util/error-envelope.js.map +1 -0
  123. package/dist/util/ip-allowlist.d.ts +44 -0
  124. package/dist/util/ip-allowlist.d.ts.map +1 -0
  125. package/dist/util/ip-allowlist.js +139 -0
  126. package/dist/util/ip-allowlist.js.map +1 -0
  127. package/dist/util/normalize-options.d.ts +24 -0
  128. package/dist/util/normalize-options.d.ts.map +1 -0
  129. package/dist/util/normalize-options.js +189 -0
  130. package/dist/util/normalize-options.js.map +1 -0
  131. package/dist/util/url-template.d.ts +18 -0
  132. package/dist/util/url-template.d.ts.map +1 -0
  133. package/dist/util/url-template.js +22 -0
  134. package/dist/util/url-template.js.map +1 -0
  135. package/package.json +75 -0
@@ -0,0 +1,189 @@
1
+ /**
2
+ * util/normalize-options.ts — input validation + back-compat handling for
3
+ * `VivaPaymentPlugin.init()`.
4
+ *
5
+ * Takes the loose `VivaPaymentPluginInitInput` shape (which accepts deprecated
6
+ * field aliases and an optional `mode`) and returns the strict discriminated
7
+ * `VivaPaymentPluginOptions` union.
8
+ *
9
+ * Responsibilities:
10
+ * 1. Resolve deprecated `isvClientId`/`isvClientSecret` → `clientId`/`clientSecret`,
11
+ * with one-time deprecation warnings.
12
+ * 2. Resolve `mode`: default to `'merchant'` (with a warning), or auto-detect
13
+ * `'isv'` when ISV-only fields are present (no warning — strong hint).
14
+ * 3. Warn (don't throw) when merchant mode is paired with ISV-only resolvers.
15
+ * 4. Throw a single aggregated error if required fields are missing.
16
+ *
17
+ * Mirrors `medusa-payment-viva/src/config.ts` defaulting + back-compat behaviour
18
+ * (multi-mode-v0 plan §5, §10).
19
+ */
20
+ import { VivaValidationError } from '@sakeetech/viva-payments-core/errors';
21
+ // ---------------------------------------------------------------------------
22
+ // One-shot warning latches (process-level)
23
+ // ---------------------------------------------------------------------------
24
+ let _isvClientIdAliasWarned = false;
25
+ let _isvClientSecretAliasWarned = false;
26
+ let _defaultModeNoticeShown = false;
27
+ let _merchantWithIsvResolversWarned = false;
28
+ /** @internal Test-only: reset all one-time warning latches. */
29
+ export function _resetInitNoticesForTesting() {
30
+ _isvClientIdAliasWarned = false;
31
+ _isvClientSecretAliasWarned = false;
32
+ _defaultModeNoticeShown = false;
33
+ _merchantWithIsvResolversWarned = false;
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Normalizer
37
+ // ---------------------------------------------------------------------------
38
+ const ISV_ONLY_KEYS = [
39
+ 'resolveMerchantId',
40
+ 'resolveSourceCode',
41
+ 'resolveIsvAmount',
42
+ 'resolveCheckoutColor',
43
+ 'onboardingReturnUrl',
44
+ 'onboardingBranding',
45
+ 'reseller',
46
+ ];
47
+ const MERCHANT_ONLY_KEYS = [
48
+ 'sourceCode',
49
+ 'checkoutColor',
50
+ ];
51
+ export function normalizePluginOptions(input) {
52
+ const errors = [];
53
+ // -------------------------------------------------------------------------
54
+ // 1. clientId / clientSecret — accept deprecated aliases.
55
+ // -------------------------------------------------------------------------
56
+ let clientId = input.clientId;
57
+ if (!clientId && input.isvClientId) {
58
+ clientId = input.isvClientId;
59
+ if (!_isvClientIdAliasWarned) {
60
+ _isvClientIdAliasWarned = true;
61
+ console.warn('[viva] `isvClientId` is deprecated, rename to `clientId`. ' +
62
+ 'Removal in 0.3.0.');
63
+ }
64
+ }
65
+ if (!clientId) {
66
+ errors.push('clientId is required');
67
+ }
68
+ let clientSecret = input.clientSecret;
69
+ if (!clientSecret && input.isvClientSecret) {
70
+ clientSecret = input.isvClientSecret;
71
+ if (!_isvClientSecretAliasWarned) {
72
+ _isvClientSecretAliasWarned = true;
73
+ console.warn('[viva] `isvClientSecret` is deprecated, rename to `clientSecret`. ' +
74
+ 'Removal in 0.3.0.');
75
+ }
76
+ }
77
+ if (!clientSecret) {
78
+ errors.push('clientSecret is required');
79
+ }
80
+ // -------------------------------------------------------------------------
81
+ // 2. Resolve mode (with auto-detect + default warning).
82
+ // -------------------------------------------------------------------------
83
+ const isvFieldsPresent = ISV_ONLY_KEYS.some((k) => input[k] !== undefined);
84
+ let mode;
85
+ if (input.mode === 'merchant' || input.mode === 'isv') {
86
+ mode = input.mode;
87
+ }
88
+ else if (input.mode === undefined) {
89
+ mode = isvFieldsPresent ? 'isv' : 'merchant';
90
+ if (!isvFieldsPresent && !_defaultModeNoticeShown) {
91
+ _defaultModeNoticeShown = true;
92
+ console.warn(`[viva] mode is unset — defaulting to 'merchant'. ` +
93
+ `Pass mode: 'isv' if running under an ISV partner.`);
94
+ }
95
+ }
96
+ else {
97
+ errors.push(`mode must be 'merchant' or 'isv', got '${String(input.mode)}'`);
98
+ mode = 'merchant'; // placeholder
99
+ }
100
+ // -------------------------------------------------------------------------
101
+ // 3. Warn when merchant mode is paired with ISV-only resolvers/fields.
102
+ // -------------------------------------------------------------------------
103
+ if (mode === 'merchant' && isvFieldsPresent && !_merchantWithIsvResolversWarned) {
104
+ const presentKeys = ISV_ONLY_KEYS.filter((k) => input[k] !== undefined);
105
+ _merchantWithIsvResolversWarned = true;
106
+ console.warn(`[viva] mode='merchant' but ISV-only field(s) supplied: ${presentKeys.join(', ')}. ` +
107
+ `These values are ignored in merchant mode.`);
108
+ }
109
+ // -------------------------------------------------------------------------
110
+ // 4. Required common fields.
111
+ // -------------------------------------------------------------------------
112
+ if (!input.environment) {
113
+ errors.push('environment is required');
114
+ }
115
+ if (!input.legacyMerchantId) {
116
+ errors.push('legacyMerchantId is required — needed for createRefund (Viva legacy Basic-auth API).');
117
+ }
118
+ if (!input.legacyApiKey) {
119
+ errors.push('legacyApiKey is required — needed for createRefund (Viva legacy Basic-auth API).');
120
+ }
121
+ if (!input.webhookVerificationKey) {
122
+ errors.push('webhookVerificationKey is required');
123
+ }
124
+ if (input.successUrl === undefined) {
125
+ errors.push('successUrl is required');
126
+ }
127
+ if (input.failureUrl === undefined) {
128
+ errors.push('failureUrl is required');
129
+ }
130
+ // ISV mode: onboardingReturnUrl required (Viva ISV API rejects without it).
131
+ if (mode === 'isv' && input.onboardingReturnUrl === undefined) {
132
+ errors.push("onboardingReturnUrl is required when mode='isv' " +
133
+ '(POST /isv/v1/accounts rejects requests without it).');
134
+ }
135
+ // -------------------------------------------------------------------------
136
+ // 5. Throw aggregated validation errors before composing.
137
+ // -------------------------------------------------------------------------
138
+ if (errors.length > 0) {
139
+ throw new VivaValidationError({
140
+ message: `Invalid Viva plugin options:\n ${errors.join('\n ')}`,
141
+ });
142
+ }
143
+ // -------------------------------------------------------------------------
144
+ // 6. Compose common fields (we've already validated everything above —
145
+ // the non-null assertions are safe here).
146
+ // -------------------------------------------------------------------------
147
+ const common = {
148
+ environment: input.environment,
149
+ clientId: clientId,
150
+ clientSecret: clientSecret,
151
+ legacyMerchantId: input.legacyMerchantId,
152
+ legacyApiKey: input.legacyApiKey,
153
+ webhookVerificationKey: input.webhookVerificationKey,
154
+ successUrl: input.successUrl,
155
+ failureUrl: input.failureUrl,
156
+ ...(input.refundStrategy !== undefined ? { refundStrategy: input.refundStrategy } : {}),
157
+ ...(input.redlock !== undefined ? { redlock: input.redlock } : {}),
158
+ ...(input.logger !== undefined ? { logger: input.logger } : {}),
159
+ ...(input.metricsHook !== undefined ? { metricsHook: input.metricsHook } : {}),
160
+ ...(input.tracer !== undefined ? { tracer: input.tracer } : {}),
161
+ ...(input.webhookIpAllowlist !== undefined ? { webhookIpAllowlist: input.webhookIpAllowlist } : {}),
162
+ ...(input.trustedProxyDepth !== undefined ? { trustedProxyDepth: input.trustedProxyDepth } : {}),
163
+ };
164
+ if (mode === 'merchant') {
165
+ const merchant = {
166
+ ...common,
167
+ mode: 'merchant',
168
+ ...(input.sourceCode !== undefined ? { sourceCode: input.sourceCode } : {}),
169
+ ...(input.checkoutColor !== undefined ? { checkoutColor: input.checkoutColor } : {}),
170
+ };
171
+ return merchant;
172
+ }
173
+ // mode === 'isv'
174
+ const isv = {
175
+ ...common,
176
+ mode: 'isv',
177
+ onboardingReturnUrl: input.onboardingReturnUrl,
178
+ ...(input.resolveMerchantId !== undefined ? { resolveMerchantId: input.resolveMerchantId } : {}),
179
+ ...(input.resolveSourceCode !== undefined ? { resolveSourceCode: input.resolveSourceCode } : {}),
180
+ ...(input.resolveIsvAmount !== undefined ? { resolveIsvAmount: input.resolveIsvAmount } : {}),
181
+ ...(input.resolveCheckoutColor !== undefined ? { resolveCheckoutColor: input.resolveCheckoutColor } : {}),
182
+ ...(input.onboardingBranding !== undefined ? { onboardingBranding: input.onboardingBranding } : {}),
183
+ ...(input.reseller !== undefined ? { reseller: input.reseller } : {}),
184
+ };
185
+ // Suppress unused-key warnings for merchant-only fields under ISV mode.
186
+ void MERCHANT_ONLY_KEYS;
187
+ return isv;
188
+ }
189
+ //# sourceMappingURL=normalize-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize-options.js","sourceRoot":"","sources":["../../src/util/normalize-options.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAS3E,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,IAAI,uBAAuB,GAAG,KAAK,CAAC;AACpC,IAAI,2BAA2B,GAAG,KAAK,CAAC;AACxC,IAAI,uBAAuB,GAAG,KAAK,CAAC;AACpC,IAAI,+BAA+B,GAAG,KAAK,CAAC;AAE5C,+DAA+D;AAC/D,MAAM,UAAU,2BAA2B;IACzC,uBAAuB,GAAG,KAAK,CAAC;IAChC,2BAA2B,GAAG,KAAK,CAAC;IACpC,uBAAuB,GAAG,KAAK,CAAC;IAChC,+BAA+B,GAAG,KAAK,CAAC;AAC1C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,aAAa,GAAoD;IACrE,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,sBAAsB;IACtB,qBAAqB;IACrB,oBAAoB;IACpB,UAAU;CACX,CAAC;AAEF,MAAM,kBAAkB,GAAoD;IAC1E,YAAY;IACZ,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CACpC,KAAiC;IAEjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,4EAA4E;IAC5E,0DAA0D;IAC1D,4EAA4E;IAC5E,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAC9B,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC;QAC7B,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,uBAAuB,GAAG,IAAI,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,4DAA4D;gBAC1D,mBAAmB,CACtB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACtC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC3C,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC;QACrC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACjC,2BAA2B,GAAG,IAAI,CAAC;YACnC,OAAO,CAAC,IAAI,CACV,oEAAoE;gBAClE,mBAAmB,CACtB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,4EAA4E;IAC5E,wDAAwD;IACxD,4EAA4E;IAC5E,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAE3E,IAAI,IAAc,CAAC;IACnB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACtD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,gBAAgB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAClD,uBAAuB,GAAG,IAAI,CAAC;YAC/B,OAAO,CAAC,IAAI,CACV,mDAAmD;gBACjD,mDAAmD,CACtD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7E,IAAI,GAAG,UAAU,CAAC,CAAC,cAAc;IACnC,CAAC;IAED,4EAA4E;IAC5E,uEAAuE;IACvE,4EAA4E;IAC5E,IAAI,IAAI,KAAK,UAAU,IAAI,gBAAgB,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAChF,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QACxE,+BAA+B,GAAG,IAAI,CAAC;QACvC,OAAO,CAAC,IAAI,CACV,0DAA0D,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAClF,4CAA4C,CAC/C,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,6BAA6B;IAC7B,4EAA4E;IAC5E,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,sFAAsF,CACvF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CACT,kFAAkF,CACnF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED,4EAA4E;IAC5E,IAAI,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC9D,MAAM,CAAC,IAAI,CACT,kDAAkD;YAChD,sDAAsD,CACzD,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,0DAA0D;IAC1D,4EAA4E;IAC5E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,mBAAmB,CAAC;YAC5B,OAAO,EAAE,mCAAmC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;SAClE,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,uEAAuE;IACvE,0CAA0C;IAC1C,4EAA4E;IAC5E,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,KAAK,CAAC,WAAY;QAC/B,QAAQ,EAAE,QAAS;QACnB,YAAY,EAAE,YAAa;QAC3B,gBAAgB,EAAE,KAAK,CAAC,gBAAiB;QACzC,YAAY,EAAE,KAAK,CAAC,YAAa;QACjC,sBAAsB,EAAE,KAAK,CAAC,sBAAuB;QACrD,UAAU,EAAE,KAAK,CAAC,UAAW;QAC7B,UAAU,EAAE,KAAK,CAAC,UAAW;QAC7B,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,GAAG,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjG,CAAC;IAEF,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAwB;YACpC,GAAG,MAAM;YACT,IAAI,EAAE,UAAU;YAChB,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrF,CAAC;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,MAAM,GAAG,GAAmB;QAC1B,GAAG,MAAM;QACT,IAAI,EAAE,KAAK;QACX,mBAAmB,EAAE,KAAK,CAAC,mBAAoB;QAC/C,GAAG,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7F,GAAG,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzG,GAAG,CAAC,KAAK,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC;IACF,wEAAwE;IACxE,KAAK,kBAAkB,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * url-template.ts — Simple {token} substitution for redirect URLs.
3
+ *
4
+ * Used to substitute {orderCode} (and optionally other tokens) into
5
+ * successUrl / failureUrl after Viva returns the orderCode.
6
+ *
7
+ * @see docs/plans/vendure-plugin-v0.md §"Configuration Surface"
8
+ */
9
+ /**
10
+ * Replace all `{token}` occurrences in a template string with values from
11
+ * the provided map. Tokens with no matching key are left unchanged.
12
+ *
13
+ * @example
14
+ * substitute('https://example.com/success?ref={orderCode}', { orderCode: '12345' })
15
+ * // → 'https://example.com/success?ref=12345'
16
+ */
17
+ export declare function substitute(template: string, tokens: Record<string, string>): string;
18
+ //# sourceMappingURL=url-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-template.d.ts","sourceRoot":"","sources":["../../src/util/url-template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAInF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * url-template.ts — Simple {token} substitution for redirect URLs.
3
+ *
4
+ * Used to substitute {orderCode} (and optionally other tokens) into
5
+ * successUrl / failureUrl after Viva returns the orderCode.
6
+ *
7
+ * @see docs/plans/vendure-plugin-v0.md §"Configuration Surface"
8
+ */
9
+ /**
10
+ * Replace all `{token}` occurrences in a template string with values from
11
+ * the provided map. Tokens with no matching key are left unchanged.
12
+ *
13
+ * @example
14
+ * substitute('https://example.com/success?ref={orderCode}', { orderCode: '12345' })
15
+ * // → 'https://example.com/success?ref=12345'
16
+ */
17
+ export function substitute(template, tokens) {
18
+ return template.replace(/\{([^}]+)\}/g, (match, key) => {
19
+ return Object.prototype.hasOwnProperty.call(tokens, key) ? tokens[key] : match;
20
+ });
21
+ }
22
+ //# sourceMappingURL=url-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-template.js","sourceRoot":"","sources":["../../src/util/url-template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,MAA8B;IACzE,OAAO,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;QAC7D,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@sakeetech/vendure-payment-viva",
3
+ "version": "0.2.1",
4
+ "description": "Vendure plugin for Viva Wallet (ISV multi-tenant). Wraps viva-payments-core.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/sakee-tech/vivawallet-npm-public.git",
9
+ "directory": "packages/vendure-payment-viva"
10
+ },
11
+ "homepage": "https://github.com/sakee-tech/vivawallet-npm-public/tree/main/packages/vendure-payment-viva#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/sakee-tech/vivawallet-npm-public/issues"
14
+ },
15
+ "type": "module",
16
+ "main": "./dist/index.js",
17
+ "types": "./dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.js"
22
+ }
23
+ },
24
+ "bin": {
25
+ "vendure-viva-register-webhooks": "./dist/cli/bin.js"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "dependencies": {
36
+ "bullmq": "^5.76.2",
37
+ "@sakeetech/viva-payments-core": "0.2.1"
38
+ },
39
+ "peerDependencies": {
40
+ "@nestjs/common": "^11.0.0",
41
+ "@nestjs/core": "^11.0.0",
42
+ "@vendure/core": "^3.6.2",
43
+ "@vendure/job-queue-plugin": "^3.6.2",
44
+ "graphql": "^16.0.0",
45
+ "rxjs": "^7.0.0",
46
+ "typeorm": "^0.3.0"
47
+ },
48
+ "devDependencies": {
49
+ "@nestjs/common": "^11.1.19",
50
+ "@nestjs/core": "^11.1.19",
51
+ "@nestjs/graphql": "13.1.0",
52
+ "@types/node": "^22.10.0",
53
+ "@types/pg": "^8.11.0",
54
+ "@vendure/core": "^3.6.2",
55
+ "@vendure/job-queue-plugin": "^3.6.2",
56
+ "@vendure/testing": "^3.6.2",
57
+ "graphql": "^16.13.2",
58
+ "pg": "^8.13.3",
59
+ "rxjs": "^7.8.2",
60
+ "typeorm": "^0.3.28",
61
+ "typescript": "^5.7.2",
62
+ "undici": "^7.2.0",
63
+ "vitest": "^2.1.8"
64
+ },
65
+ "engines": {
66
+ "node": ">=20.0.0"
67
+ },
68
+ "scripts": {
69
+ "build": "tsc -p tsconfig.json",
70
+ "typecheck": "tsc -p tsconfig.json --noEmit",
71
+ "test": "vitest run",
72
+ "test:watch": "vitest",
73
+ "clean": "rm -rf dist .tsbuildinfo coverage"
74
+ }
75
+ }