@bayarkit/testing 0.0.0 → 0.1.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 (138) hide show
  1. package/README.md +26 -1
  2. package/dist/cli/2c2p.d.ts +4 -0
  3. package/dist/cli/2c2p.d.ts.map +1 -0
  4. package/dist/cli/2c2p.js +7 -0
  5. package/dist/cli/2c2p.js.map +1 -0
  6. package/dist/cli/bayarcash.d.ts +4 -0
  7. package/dist/cli/bayarcash.d.ts.map +1 -0
  8. package/dist/cli/bayarcash.js +11 -0
  9. package/dist/cli/bayarcash.js.map +1 -0
  10. package/dist/cli/billplz.d.ts +4 -0
  11. package/dist/cli/billplz.d.ts.map +1 -0
  12. package/dist/cli/billplz.js +11 -0
  13. package/dist/cli/billplz.js.map +1 -0
  14. package/dist/cli/chip.d.ts +4 -0
  15. package/dist/cli/chip.d.ts.map +1 -0
  16. package/dist/cli/chip.js +7 -0
  17. package/dist/cli/chip.js.map +1 -0
  18. package/dist/cli/curlec.d.ts +4 -0
  19. package/dist/cli/curlec.d.ts.map +1 -0
  20. package/dist/cli/curlec.js +11 -0
  21. package/dist/cli/curlec.js.map +1 -0
  22. package/dist/cli/eghl.d.ts +4 -0
  23. package/dist/cli/eghl.d.ts.map +1 -0
  24. package/dist/cli/eghl.js +7 -0
  25. package/dist/cli/eghl.js.map +1 -0
  26. package/dist/cli/fiuu.d.ts +4 -0
  27. package/dist/cli/fiuu.d.ts.map +1 -0
  28. package/dist/cli/fiuu.js +17 -0
  29. package/dist/cli/fiuu.js.map +1 -0
  30. package/dist/cli/gkash.d.ts +4 -0
  31. package/dist/cli/gkash.d.ts.map +1 -0
  32. package/dist/cli/gkash.js +7 -0
  33. package/dist/cli/gkash.js.map +1 -0
  34. package/dist/cli/hitpay.d.ts +4 -0
  35. package/dist/cli/hitpay.d.ts.map +1 -0
  36. package/dist/cli/hitpay.js +7 -0
  37. package/dist/cli/hitpay.js.map +1 -0
  38. package/dist/cli/ipay88.d.ts +4 -0
  39. package/dist/cli/ipay88.d.ts.map +1 -0
  40. package/dist/cli/ipay88.js +7 -0
  41. package/dist/cli/ipay88.js.map +1 -0
  42. package/dist/cli/senangpay.d.ts +4 -0
  43. package/dist/cli/senangpay.d.ts.map +1 -0
  44. package/dist/cli/senangpay.js +17 -0
  45. package/dist/cli/senangpay.js.map +1 -0
  46. package/dist/cli/stripe.d.ts +4 -0
  47. package/dist/cli/stripe.d.ts.map +1 -0
  48. package/dist/cli/stripe.js +7 -0
  49. package/dist/cli/stripe.js.map +1 -0
  50. package/dist/cli/toyyibpay.d.ts +4 -0
  51. package/dist/cli/toyyibpay.d.ts.map +1 -0
  52. package/dist/cli/toyyibpay.js +7 -0
  53. package/dist/cli/toyyibpay.js.map +1 -0
  54. package/dist/cli/types.d.ts +7 -0
  55. package/dist/cli/types.d.ts.map +1 -0
  56. package/dist/cli/types.js +2 -0
  57. package/dist/cli/types.js.map +1 -0
  58. package/dist/cli/xendit.d.ts +4 -0
  59. package/dist/cli/xendit.d.ts.map +1 -0
  60. package/dist/cli/xendit.js +7 -0
  61. package/dist/cli/xendit.js.map +1 -0
  62. package/dist/cli.d.ts +3 -0
  63. package/dist/cli.d.ts.map +1 -0
  64. package/dist/cli.js +46 -0
  65. package/dist/cli.js.map +1 -0
  66. package/dist/conformance.d.ts +13 -0
  67. package/dist/conformance.d.ts.map +1 -0
  68. package/dist/conformance.js +166 -0
  69. package/dist/conformance.js.map +1 -0
  70. package/dist/control.d.ts +6 -0
  71. package/dist/control.d.ts.map +1 -0
  72. package/dist/control.js +46 -0
  73. package/dist/control.js.map +1 -0
  74. package/dist/fakes/2c2p.d.ts +21 -0
  75. package/dist/fakes/2c2p.d.ts.map +1 -0
  76. package/dist/fakes/2c2p.js +287 -0
  77. package/dist/fakes/2c2p.js.map +1 -0
  78. package/dist/fakes/bayarcash.d.ts +15 -0
  79. package/dist/fakes/bayarcash.d.ts.map +1 -0
  80. package/dist/fakes/bayarcash.js +133 -0
  81. package/dist/fakes/bayarcash.js.map +1 -0
  82. package/dist/fakes/billplz.d.ts +20 -0
  83. package/dist/fakes/billplz.d.ts.map +1 -0
  84. package/dist/fakes/billplz.js +233 -0
  85. package/dist/fakes/billplz.js.map +1 -0
  86. package/dist/fakes/chip.d.ts +18 -0
  87. package/dist/fakes/chip.d.ts.map +1 -0
  88. package/dist/fakes/chip.js +227 -0
  89. package/dist/fakes/chip.js.map +1 -0
  90. package/dist/fakes/curlec.d.ts +30 -0
  91. package/dist/fakes/curlec.d.ts.map +1 -0
  92. package/dist/fakes/curlec.js +396 -0
  93. package/dist/fakes/curlec.js.map +1 -0
  94. package/dist/fakes/eghl.d.ts +36 -0
  95. package/dist/fakes/eghl.d.ts.map +1 -0
  96. package/dist/fakes/eghl.js +267 -0
  97. package/dist/fakes/eghl.js.map +1 -0
  98. package/dist/fakes/fiuu.d.ts +27 -0
  99. package/dist/fakes/fiuu.d.ts.map +1 -0
  100. package/dist/fakes/fiuu.js +230 -0
  101. package/dist/fakes/fiuu.js.map +1 -0
  102. package/dist/fakes/gkash.d.ts +18 -0
  103. package/dist/fakes/gkash.d.ts.map +1 -0
  104. package/dist/fakes/gkash.js +193 -0
  105. package/dist/fakes/gkash.js.map +1 -0
  106. package/dist/fakes/hitpay.d.ts +36 -0
  107. package/dist/fakes/hitpay.d.ts.map +1 -0
  108. package/dist/fakes/hitpay.js +233 -0
  109. package/dist/fakes/hitpay.js.map +1 -0
  110. package/dist/fakes/ipay88.d.ts +16 -0
  111. package/dist/fakes/ipay88.d.ts.map +1 -0
  112. package/dist/fakes/ipay88.js +195 -0
  113. package/dist/fakes/ipay88.js.map +1 -0
  114. package/dist/fakes/senangpay.d.ts +51 -0
  115. package/dist/fakes/senangpay.d.ts.map +1 -0
  116. package/dist/fakes/senangpay.js +255 -0
  117. package/dist/fakes/senangpay.js.map +1 -0
  118. package/dist/fakes/stripe.d.ts +26 -0
  119. package/dist/fakes/stripe.d.ts.map +1 -0
  120. package/dist/fakes/stripe.js +243 -0
  121. package/dist/fakes/stripe.js.map +1 -0
  122. package/dist/fakes/toyyibpay.d.ts +14 -0
  123. package/dist/fakes/toyyibpay.d.ts.map +1 -0
  124. package/dist/fakes/toyyibpay.js +138 -0
  125. package/dist/fakes/toyyibpay.js.map +1 -0
  126. package/dist/fakes/types.d.ts +19 -0
  127. package/dist/fakes/types.d.ts.map +1 -0
  128. package/dist/fakes/types.js +3 -0
  129. package/dist/fakes/types.js.map +1 -0
  130. package/dist/fakes/xendit.d.ts +36 -0
  131. package/dist/fakes/xendit.d.ts.map +1 -0
  132. package/dist/fakes/xendit.js +300 -0
  133. package/dist/fakes/xendit.js.map +1 -0
  134. package/dist/index.d.ts +18 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +18 -0
  137. package/dist/index.js.map +1 -0
  138. package/package.json +66 -2
@@ -0,0 +1,300 @@
1
+ /**
2
+ * A fake Xendit API (Payment Sessions + the v3 payment request lookup), built from the official docs in
3
+ * `gateways/xendit/spec.md` (not yet measured against a Xendit test-mode account). When someone measures test mode,
4
+ * change this file first so it answers like the real thing, then the adapter.
5
+ *
6
+ * What it checks, and where each rule comes from (spec sections in brackets):
7
+ * - auth: `Authorization: Basic base64("<key>:")` with the configured key, else 401 `INVALID_API_KEY` [§1]; the key's
8
+ * prefix picks the mode, so the fake only accepts `xnd_development_…` keys (it IS test mode) [§1];
9
+ * - JSON in, JSON out; errors are `{ error_code, message }` [§1, AI-SKILL "Conventions"];
10
+ * - `POST /sessions` → 201 with the session object [§2]: required `reference_id` (1-64), `session_type`, `mode`,
11
+ * `amount`, `currency`, `country`; amount in RINGGIT (major units), > 0 for PAY; return URLs must be HTTPS
12
+ * (`INVALID_URL`); `expires_at` at least 10 minutes ahead (`INVALID_EXPIRY_DATE`), default 30 minutes [§2];
13
+ * - the fake allows at most two decimals for MYR. The docs only say "the decimal places allowed for the given
14
+ * currency" (UNCONFIRMED), so this is the fake's assumption, not a documented rule;
15
+ * - no idempotency header exists and `reference_id` uniqueness is not enforced [§6]: every POST is a new session;
16
+ * - `GET /sessions/{id}`, `POST /sessions/{id}/cancel` (only from ACTIVE → `CANCELED`, one L) [§3, §7];
17
+ * - `GET /v3/payment_requests/{id}` REQUIRES `api-version: 2024-11-11` here. The OpenAPI does not mark it required
18
+ * while the migration guide says v3 "requires" it (contradiction C9); the fake is strict so a test proves the
19
+ * adapter always sends it;
20
+ * - webhooks: POST, JSON `{ event, business_id, created, data }`, authenticated ONLY by the static
21
+ * `x-callback-token` header [§4]. Nothing signs the body. `data` of a session event is the session object; of a
22
+ * `payment.*` event, the payment (with `payment_request_id`, `reference_id`, `request_amount`, `captures`) [§3, §4].
23
+ *
24
+ * The fake's own assumptions (not documented): a paid session's payment request carries the session's `reference_id`
25
+ * and amount; ids are `ps-` + 24 hex (27 characters, as the schema says) and `pr-` / `py-` / `cptr-` + a UUID, as in
26
+ * the official examples.
27
+ */
28
+ import { randomBytes, randomUUID } from 'node:crypto';
29
+ import { createServer } from 'node:http';
30
+ import { flip } from './types.js';
31
+ export const XENDIT_API_VERSION = '2024-11-11';
32
+ const BUSINESS_ID = '603f1c4172bbe840979fd408';
33
+ const isoNow = () => new Date().toISOString();
34
+ export async function startFakeXendit(opts) {
35
+ if (!opts.secretKey.startsWith('xnd_development_')) {
36
+ throw new Error('fake Xendit: use a test-mode key (xnd_development_…); the fake is test mode');
37
+ }
38
+ const sessions = new Map();
39
+ const paymentRequests = new Map();
40
+ const requests = [];
41
+ const expectedAuth = `Basic ${Buffer.from(`${opts.secretKey}:`).toString('base64')}`;
42
+ const server = createServer((req, res) => {
43
+ let raw = '';
44
+ req.on('data', (d) => {
45
+ raw += d;
46
+ });
47
+ req.on('end', () => {
48
+ const path = (req.url ?? '').split('?')[0] ?? '';
49
+ let body = null;
50
+ const send = (status, o) => {
51
+ res.writeHead(status, { 'content-type': 'application/json' });
52
+ res.end(JSON.stringify(o));
53
+ };
54
+ const fail = (status, error_code, message) => send(status, { error_code, message });
55
+ if (raw) {
56
+ try {
57
+ const parsed = JSON.parse(raw);
58
+ body = parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : null;
59
+ }
60
+ catch {
61
+ requests.push({ method: req.method ?? '', path, body: null, headers: req.headers });
62
+ return fail(400, 'API_VALIDATION_ERROR', 'Request body is not valid JSON');
63
+ }
64
+ }
65
+ requests.push({ method: req.method ?? '', path, body, headers: req.headers });
66
+ if (req.headers.authorization !== expectedAuth) {
67
+ return fail(401, 'INVALID_API_KEY', 'The API key provided is invalid or missing');
68
+ }
69
+ if (req.method === 'POST' && path === '/sessions') {
70
+ const r = create(body ?? {});
71
+ return send(r.status, r.body);
72
+ }
73
+ const get = /^\/sessions\/([A-Za-z0-9-]+)$/.exec(path);
74
+ if (req.method === 'GET' && get) {
75
+ const s = sessions.get(get[1] ?? '');
76
+ return s ? send(200, s) : fail(404, 'DATA_NOT_FOUND', 'Session not found');
77
+ }
78
+ const cancel = /^\/sessions\/([A-Za-z0-9-]+)\/cancel$/.exec(path);
79
+ if (req.method === 'POST' && cancel) {
80
+ const s = sessions.get(cancel[1] ?? '');
81
+ if (!s)
82
+ return fail(404, 'DATA_NOT_FOUND', 'Session not found');
83
+ if (s.status !== 'ACTIVE')
84
+ return fail(400, 'INVALID_STATUS', `Session is ${s.status}, not ACTIVE`);
85
+ s.status = 'CANCELED';
86
+ s.updated = isoNow();
87
+ return send(200, s);
88
+ }
89
+ const pr = /^\/v3\/payment_requests\/([A-Za-z0-9-]+)$/.exec(path);
90
+ if (req.method === 'GET' && pr) {
91
+ if (req.headers['api-version'] !== XENDIT_API_VERSION) {
92
+ return fail(400, 'API_VALIDATION_ERROR', `fake Xendit: send api-version: ${XENDIT_API_VERSION}`);
93
+ }
94
+ const p = paymentRequests.get(pr[1] ?? '');
95
+ return p ? send(200, p) : fail(404, 'DATA_NOT_FOUND', 'Payment request not found');
96
+ }
97
+ return fail(404, 'NOT_FOUND', `No route ${req.method} ${path}`);
98
+ });
99
+ });
100
+ function create(b) {
101
+ const bad = (error_code, message) => ({ status: 400, body: { error_code, message } });
102
+ for (const k of ['reference_id', 'session_type', 'mode', 'amount', 'currency', 'country']) {
103
+ if (b[k] === undefined || b[k] === null)
104
+ return bad('API_VALIDATION_ERROR', `${k} is required`);
105
+ }
106
+ const ref = b.reference_id;
107
+ if (typeof ref !== 'string' || ref.length < 1 || ref.length > 64) {
108
+ return bad('API_VALIDATION_ERROR', 'reference_id must be 1 to 64 characters');
109
+ }
110
+ if (!['PAY', 'SAVE', 'SUBSCRIPTION'].includes(String(b.session_type)))
111
+ return bad('API_VALIDATION_ERROR', 'invalid session_type');
112
+ if (b.session_type !== 'PAY')
113
+ return bad('SESSION_TYPE_NOT_SUPPORTED', 'fake Xendit only implements PAY');
114
+ if (!['PAYMENT_LINK', 'COMPONENTS'].includes(String(b.mode)))
115
+ return bad('MODE_NOT_SUPPORTED', 'invalid mode');
116
+ if (b.currency !== 'MYR')
117
+ return bad('INVALID_CURRENCY', 'fake Xendit only speaks MYR');
118
+ if (b.country !== 'MY')
119
+ return bad('INVALID_COUNTRY', 'fake Xendit only speaks MY');
120
+ const amount = b.amount;
121
+ if (typeof amount !== 'number' || !Number.isFinite(amount) || amount <= 0) {
122
+ return bad('INVALID_AMOUNT', 'For PAY session type, amount must be greater than zero');
123
+ }
124
+ if (!/^\d+(\.\d{1,2})?$/.test(String(amount))) {
125
+ return bad('INVALID_AMOUNT', 'Amount must respect the decimal places allowed for the given currency');
126
+ }
127
+ for (const k of ['success_return_url', 'cancel_return_url']) {
128
+ const u = b[k];
129
+ if (u !== undefined && (typeof u !== 'string' || !/^https:\/\/[^\s]+$/.test(u))) {
130
+ return bad('INVALID_URL', `${k} is not a valid HTTPS URL`);
131
+ }
132
+ }
133
+ if (b.capture_method !== undefined && !['AUTOMATIC', 'MANUAL'].includes(String(b.capture_method))) {
134
+ return bad('API_VALIDATION_ERROR', 'invalid capture_method');
135
+ }
136
+ if (b.description !== undefined) {
137
+ const d = b.description;
138
+ if (typeof d !== 'string' || d.length < 1 || d.length > 1000)
139
+ return bad('API_VALIDATION_ERROR', 'description must be 1 to 1000 characters');
140
+ }
141
+ const created = Date.now();
142
+ let expiresAt = new Date(created + 30 * 60_000);
143
+ if (b.expires_at !== undefined) {
144
+ const e = typeof b.expires_at === 'string' ? new Date(b.expires_at) : new Date(Number.NaN);
145
+ if (Number.isNaN(e.getTime()) || e.getTime() - created < 10 * 60_000) {
146
+ return bad('INVALID_EXPIRY_DATE', 'expires_at must be at least 10 minutes in the future');
147
+ }
148
+ expiresAt = e;
149
+ }
150
+ const id = `ps-${randomBytes(12).toString('hex')}`;
151
+ const session = {
152
+ payment_session_id: id,
153
+ created: new Date(created).toISOString(),
154
+ updated: new Date(created).toISOString(),
155
+ reference_id: ref,
156
+ customer_id: null,
157
+ session_type: 'PAY',
158
+ allow_save_payment_method: 'DISABLED',
159
+ currency: 'MYR',
160
+ amount,
161
+ country: 'MY',
162
+ mode: b.mode,
163
+ capture_method: b.capture_method ?? 'AUTOMATIC',
164
+ channel_properties: b.channel_properties ?? {},
165
+ allowed_payment_channels: b.allowed_payment_channels ?? [],
166
+ expires_at: expiresAt.toISOString(),
167
+ locale: b.locale ?? 'en',
168
+ metadata: b.metadata ?? null,
169
+ description: b.description ?? null,
170
+ items: b.items ?? null,
171
+ success_return_url: b.success_return_url ?? null,
172
+ cancel_return_url: b.cancel_return_url ?? null,
173
+ status: 'ACTIVE',
174
+ payment_link_url: `https://dev.xen.to/${randomBytes(6).toString('base64url')}`,
175
+ payment_token_id: null,
176
+ payment_id: null,
177
+ payment_request_id: null,
178
+ latest_payment_request_id: null,
179
+ latest_payment_token_id: null,
180
+ business_id: BUSINESS_ID,
181
+ };
182
+ sessions.set(id, session);
183
+ return { status: 201, body: session };
184
+ }
185
+ await new Promise((r) => server.listen(0, '127.0.0.1', r));
186
+ const url = `http://127.0.0.1:${server.address().port}`;
187
+ const session = (id) => {
188
+ const s = sessions.get(id);
189
+ if (!s)
190
+ throw new Error(`fake Xendit: no session ${id}`);
191
+ return s;
192
+ };
193
+ /** The session's payment request, created on first use (REQUIRES_ACTION until markPaid). */
194
+ const requestFor = (s) => {
195
+ const existing = paymentRequests.get(String(s.latest_payment_request_id ?? ''));
196
+ if (existing)
197
+ return existing;
198
+ const p = {
199
+ payment_request_id: `pr-${randomUUID()}`,
200
+ business_id: BUSINESS_ID,
201
+ reference_id: s.reference_id,
202
+ type: 'PAY',
203
+ country: 'MY',
204
+ currency: 'MYR',
205
+ request_amount: s.amount,
206
+ capture_method: s.capture_method,
207
+ channel_code: 'MAYB2U_FPX',
208
+ status: 'REQUIRES_ACTION',
209
+ created: isoNow(),
210
+ updated: isoNow(),
211
+ };
212
+ paymentRequests.set(p.payment_request_id, p);
213
+ s.latest_payment_request_id = p.payment_request_id;
214
+ return p;
215
+ };
216
+ const webhook = (event, data) => {
217
+ const rawBody = JSON.stringify({ event, business_id: BUSINESS_ID, created: isoNow(), data });
218
+ return {
219
+ fields: {},
220
+ rawBody,
221
+ headers: { 'content-type': 'application/json', 'x-callback-token': opts.callbackToken },
222
+ };
223
+ };
224
+ return {
225
+ url,
226
+ requests,
227
+ session: (id) => sessions.get(id),
228
+ paymentRequest: (id) => paymentRequests.get(id),
229
+ markPaid(id) {
230
+ const s = session(id);
231
+ const p = requestFor(s);
232
+ const capturedAt = isoNow();
233
+ p.status = 'SUCCEEDED';
234
+ p.payment_id = `py-${randomUUID()}`;
235
+ p.captures = [
236
+ { capture_id: `cptr-${randomUUID()}`, capture_timestamp: capturedAt, capture_amount: s.amount },
237
+ ];
238
+ p.updated = capturedAt;
239
+ s.status = 'COMPLETED';
240
+ s.payment_id = p.payment_id;
241
+ s.payment_request_id = p.payment_request_id;
242
+ s.updated = capturedAt;
243
+ },
244
+ expire(id) {
245
+ const s = session(id);
246
+ if (s.status === 'ACTIVE') {
247
+ s.status = 'EXPIRED';
248
+ s.updated = isoNow();
249
+ }
250
+ },
251
+ /**
252
+ * A `payment_session.completed` webhook claiming success (even before `markPaid`; the fake's record stays
253
+ * ACTIVE). `override` changes fields of `data` (the session object); the key `event` changes the event name.
254
+ */
255
+ callbackFor(id, override = {}) {
256
+ const { event, ...fields } = override;
257
+ const s = session(id);
258
+ const data = {
259
+ ...s,
260
+ status: 'COMPLETED',
261
+ payment_id: s.payment_id ?? `py-${randomUUID()}`,
262
+ payment_request_id: s.payment_request_id ?? `pr-${randomUUID()}`,
263
+ ...fields,
264
+ };
265
+ return webhook(event ?? 'payment_session.completed', data);
266
+ },
267
+ paymentCallbackFor(sessionId, override = {}) {
268
+ const { event, ...fields } = override;
269
+ const p = requestFor(session(sessionId));
270
+ const at = isoNow();
271
+ const data = {
272
+ payment_id: p.payment_id ?? `py-${randomUUID()}`,
273
+ business_id: BUSINESS_ID,
274
+ reference_id: p.reference_id,
275
+ payment_request_id: p.payment_request_id,
276
+ type: 'PAY',
277
+ country: 'MY',
278
+ currency: 'MYR',
279
+ request_amount: p.request_amount,
280
+ capture_method: p.capture_method,
281
+ channel_code: p.channel_code,
282
+ status: 'SUCCEEDED',
283
+ captures: [
284
+ { capture_id: `cptr-${randomUUID()}`, capture_timestamp: at, capture_amount: p.request_amount },
285
+ ],
286
+ payment_details: {},
287
+ created: p.created,
288
+ updated: at,
289
+ ...fields,
290
+ };
291
+ return webhook(typeof event === 'string' ? event : 'payment.capture', data);
292
+ },
293
+ tamper: (cb) => ({
294
+ ...cb,
295
+ headers: { ...cb.headers, 'x-callback-token': flip(cb.headers['x-callback-token'] ?? '') },
296
+ }),
297
+ close: () => new Promise((r) => server.close(() => r())),
298
+ };
299
+ }
300
+ //# sourceMappingURL=xendit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xendit.js","sourceRoot":"","sources":["../../src/fakes/xendit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export { type ConformanceSetup, gatewayConformance, sampleInput } from './conformance.js';
2
+ export { startControlServer } from './control.js';
3
+ export { type Fake2C2P, sign2C2PJwt, startFake2C2P } from './fakes/2c2p.js';
4
+ export { type FakeBayarcash, startFakeBayarcash } from './fakes/bayarcash.js';
5
+ export { type FakeBillplz, startFakeBillplz } from './fakes/billplz.js';
6
+ export { type FakeChip, startFakeChip } from './fakes/chip.js';
7
+ export { curlecWebhookSignature, type FakeCurlec, startFakeCurlec } from './fakes/curlec.js';
8
+ export { type EghlPayment, type FakeEghl, startFakeEghl } from './fakes/eghl.js';
9
+ export { type FakeFiuu, type FakeFiuuOptions, startFakeFiuu } from './fakes/fiuu.js';
10
+ export { type FakeGkash, startFakeGkash } from './fakes/gkash.js';
11
+ export { type FakeHitPay, startFakeHitPay } from './fakes/hitpay.js';
12
+ export { type FakeIPay88, startFakeIPay88 } from './fakes/ipay88.js';
13
+ export { dokuSignature, type FakeSenangPay, startFakeSenangPay } from './fakes/senangpay.js';
14
+ export { type FakeStripe, startFakeStripe, stripeSignature } from './fakes/stripe.js';
15
+ export { type FakeToyyibPay, startFakeToyyibPay } from './fakes/toyyibpay.js';
16
+ export { type FakeGateway, flip } from './fakes/types.js';
17
+ export { type FakeXendit, startFakeXendit, XENDIT_API_VERSION } from './fakes/xendit.js';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,KAAK,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,KAAK,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAE,KAAK,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC5F,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAE,KAAK,SAAS,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,EAAE,KAAK,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAE,KAAK,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ export { gatewayConformance, sampleInput } from './conformance.js';
2
+ export { startControlServer } from './control.js';
3
+ export { sign2C2PJwt, startFake2C2P } from './fakes/2c2p.js';
4
+ export { startFakeBayarcash } from './fakes/bayarcash.js';
5
+ export { startFakeBillplz } from './fakes/billplz.js';
6
+ export { startFakeChip } from './fakes/chip.js';
7
+ export { curlecWebhookSignature, startFakeCurlec } from './fakes/curlec.js';
8
+ export { startFakeEghl } from './fakes/eghl.js';
9
+ export { startFakeFiuu } from './fakes/fiuu.js';
10
+ export { startFakeGkash } from './fakes/gkash.js';
11
+ export { startFakeHitPay } from './fakes/hitpay.js';
12
+ export { startFakeIPay88 } from './fakes/ipay88.js';
13
+ export { dokuSignature, startFakeSenangPay } from './fakes/senangpay.js';
14
+ export { startFakeStripe, stripeSignature } from './fakes/stripe.js';
15
+ export { startFakeToyyibPay } from './fakes/toyyibpay.js';
16
+ export { flip } from './fakes/types.js';
17
+ export { startFakeXendit, XENDIT_API_VERSION } from './fakes/xendit.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,kBAAkB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EAAsB,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAoB,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACvE,OAAO,EAAiB,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,sBAAsB,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAC5F,OAAO,EAAmC,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAChF,OAAO,EAAuC,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpF,OAAO,EAAkB,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAmB,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,aAAa,EAAsB,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC5F,OAAO,EAAmB,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,EAAsB,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,EAAoB,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAmB,eAAe,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA"}
package/package.json CHANGED
@@ -1,2 +1,66 @@
1
- {"name": "@bayarkit/testing", "version": "0.0.0", "description": "Name reserved for bayarkit. The first release is 0.1.0.",
2
- "license": "MIT", "repository": {"type": "git", "url": "git+https://github.com/sasateguh/bayarkit.git"}}
1
+ {
2
+ "name": "@bayarkit/testing",
3
+ "version": "0.1.0",
4
+ "description": "Fake Malaysian payment gateways and the bayarkit conformance suite, for testing without real money.",
5
+ "keywords": [
6
+ "payment",
7
+ "payment-gateway",
8
+ "malaysia",
9
+ "fpx",
10
+ "duitnow",
11
+ "webhook",
12
+ "checkout",
13
+ "typescript",
14
+ "testing",
15
+ "fake",
16
+ "mock",
17
+ "conformance"
18
+ ],
19
+ "homepage": "https://github.com/sasateguh/bayarkit/tree/main/packages/testing#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/sasateguh/bayarkit/issues"
22
+ },
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/sasateguh/bayarkit.git",
26
+ "directory": "packages/testing"
27
+ },
28
+ "license": "MIT",
29
+ "author": "Muhammad Aiman (https://github.com/aimanmalib)",
30
+ "type": "module",
31
+ "sideEffects": false,
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js"
36
+ }
37
+ },
38
+ "files": [
39
+ "dist",
40
+ "README.md"
41
+ ],
42
+ "engines": {
43
+ "node": ">=22.12.0"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public",
47
+ "provenance": true
48
+ },
49
+ "scripts": {
50
+ "build": "tsc -p tsconfig.build.json"
51
+ },
52
+ "dependencies": {
53
+ "@bayarkit/core": "0.1.0"
54
+ },
55
+ "peerDependencies": {
56
+ "vitest": ">=4"
57
+ },
58
+ "bin": {
59
+ "bayarkit-fake": "./dist/cli.js"
60
+ },
61
+ "peerDependenciesMeta": {
62
+ "vitest": {
63
+ "optional": true
64
+ }
65
+ }
66
+ }