@bayarkit/testing 0.0.0-stage → 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 +27 -2
  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 +64 -4
@@ -0,0 +1,227 @@
1
+ /**
2
+ * A fake CHIP Collect API, built from the official OpenAPI (docs.chip-in.asia/openapi/chip-collect.yaml, read
3
+ * 2026-10-23) and `gateways/chip/spec.md`. NOT yet measured against CHIP's test mode: when someone does, change this
4
+ * file first so it answers like the real thing, then the adapter.
5
+ *
6
+ * - base path `/api/v1`, plural paths with a trailing slash, `Authorization: Bearer <secret key>`;
7
+ * - 401 body = the shape observed live on gate.chip-in.asia (`__all__` is an ARRAY there); other errors use the
8
+ * OpenAPI 400 example shape (`__all__` is an OBJECT). Field-level error shapes are not documented, so every
9
+ * validation error here uses that one example shape;
10
+ * - `success_callback` with an explicit port (even `:443`) → `webhooks_callback_port`; non-http(s) →
11
+ * `webhooks_callback_scheme`; URL fields nested inside `purchase` are ignored silently (docs /overview/callbacks);
12
+ * - callbacks: the Purchase JSON plus `event_type`, signed in `X-Signature` = base64 RSA PKCS#1 v1.5 over SHA-256 of
13
+ * the raw body; `GET /public_key/` answers the PEM as a JSON-encoded string;
14
+ * - the fee on a paid purchase is illustrative only (CHIP's fees are per merchant and not in the OpenAPI).
15
+ */
16
+ import { generateKeyPairSync, randomUUID, sign } from 'node:crypto';
17
+ import { createServer } from 'node:http';
18
+ import { flip } from './types.js';
19
+ const METHODS = new Set([
20
+ 'fpx',
21
+ 'fpx_b2b1',
22
+ 'crypto_coin',
23
+ 'dnqr',
24
+ 'duitnow_qr',
25
+ 'maestro',
26
+ 'mastercard',
27
+ 'mpgs_apple_pay',
28
+ 'mpgs_google_pay',
29
+ 'razer_atome',
30
+ 'razer_grabpay',
31
+ 'razer_maybankqr',
32
+ 'razer_shopeepay',
33
+ 'razer_tng',
34
+ 'shopee_pay',
35
+ 'visa',
36
+ ]);
37
+ /** True when the URL's authority spells out a port (`URL` normalises `:443` away, so the text is checked). */
38
+ const explicitPort = (url) => /:\d*$/.test(/^[a-z][a-z0-9+.-]*:\/\/([^/?#]*)/i.exec(url)?.[1] ?? '');
39
+ export async function startFakeChip(opts) {
40
+ const { publicKey, privateKey } = generateKeyPairSync('rsa', { modulusLength: 2048 });
41
+ const pem = publicKey.export({ type: 'spki', format: 'pem' }).toString();
42
+ const purchases = new Map();
43
+ const requests = [];
44
+ let n = 0;
45
+ const now = () => Math.floor(Date.now() / 1000);
46
+ const server = createServer((req, res) => {
47
+ let raw = '';
48
+ req.on('data', (d) => {
49
+ raw += d;
50
+ });
51
+ req.on('end', () => {
52
+ let body = {};
53
+ try {
54
+ const parsed = raw ? JSON.parse(raw) : {};
55
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
56
+ body = parsed;
57
+ }
58
+ catch { }
59
+ const path = req.url ?? '';
60
+ requests.push({ method: req.method ?? '', path, body, headers: req.headers });
61
+ const send = (status, o) => {
62
+ res.writeHead(status, { 'content-type': 'application/json' });
63
+ res.end(JSON.stringify(o));
64
+ };
65
+ const bad = (code, message) => send(400, { __all__: { message, code } });
66
+ const auth = req.headers.authorization;
67
+ if (!auth)
68
+ return send(401, {
69
+ __all__: [{ message: 'Authorization header missing', code: 'authentication_failed' }],
70
+ });
71
+ if (auth !== `Bearer ${opts.secretKey}`)
72
+ return send(401, { __all__: [{ message: 'Incorrect secret_key', code: 'authentication_failed' }] });
73
+ if (req.method === 'POST' && path === '/api/v1/purchases/') {
74
+ if (body.brand_id !== opts.brandId)
75
+ return bad('invalid', 'brand_id: invalid brand');
76
+ const client = body.client;
77
+ if (!client || typeof client.email !== 'string' || !client.email)
78
+ return bad('required', 'client.email: this field is required');
79
+ const details = (body.purchase ?? {});
80
+ const products = details.products;
81
+ if (!Array.isArray(products) || products.length === 0)
82
+ return bad('required', 'purchase.products: at least one product is required');
83
+ for (const p of products) {
84
+ if (typeof p?.name !== 'string' || !p.name || p.name.length > 256)
85
+ return bad('invalid', 'purchase.products.name: required, at most 256 characters');
86
+ if (!Number.isInteger(p.price) || p.price < 0)
87
+ return bad('invalid', 'purchase.products.price: integer in minor units, at least 0');
88
+ }
89
+ const cb = body.success_callback;
90
+ if (cb != null && cb !== '') {
91
+ if (typeof cb !== 'string' || !/^https?:\/\//i.test(cb))
92
+ return bad('webhooks_callback_scheme', 'success_callback: only http and https are supported');
93
+ if (explicitPort(cb))
94
+ return bad('webhooks_callback_port', 'success_callback: the URL must not contain a port');
95
+ }
96
+ const wl = body.payment_method_whitelist;
97
+ if (wl !== undefined &&
98
+ (!Array.isArray(wl) || wl.length === 0 || wl.some((m) => !METHODS.has(String(m)))))
99
+ return bad('invalid', 'payment_method_whitelist: unknown or empty');
100
+ if (body.due != null && !Number.isInteger(body.due))
101
+ return bad('invalid', 'due: must be a Unix timestamp');
102
+ const id = randomUUID();
103
+ n += 1;
104
+ const total = products.reduce((s, p) => s + p.price * Number(p.quantity ?? 1) - Number(p.discount ?? 0), 0);
105
+ const created = now();
106
+ const purchase = {
107
+ id,
108
+ type: 'purchase',
109
+ status: 'created',
110
+ is_test: opts.isTest ?? true,
111
+ brand_id: opts.brandId,
112
+ reference: typeof body.reference === 'string' ? body.reference : '',
113
+ reference_generated: `CH${String(n).padStart(4, '0')}`,
114
+ due: body.due ?? null,
115
+ created_on: created,
116
+ updated_on: created,
117
+ payment_method_whitelist: wl ?? null,
118
+ // Only top-level URL fields count; nested ones are ignored silently (docs /overview/callbacks).
119
+ success_redirect: body.success_redirect ?? '',
120
+ failure_redirect: body.failure_redirect ?? '',
121
+ cancel_redirect: body.cancel_redirect ?? '',
122
+ success_callback: cb ?? '',
123
+ checkout_url: `${url}/p/${id}/`,
124
+ direct_post_url: null,
125
+ status_history: [{ status: 'created', timestamp: created }],
126
+ client: { email: client.email, full_name: client.full_name ?? '', phone: client.phone ?? '' },
127
+ purchase: {
128
+ currency: typeof details.currency === 'string' ? details.currency : 'MYR',
129
+ due_strict: details.due_strict === true,
130
+ total,
131
+ products: products.map((p) => ({
132
+ name: p.name,
133
+ price: p.price,
134
+ quantity: Number(p.quantity ?? 1).toFixed(4),
135
+ discount: p.discount ?? 0,
136
+ tax_percent: '0.00',
137
+ category: '',
138
+ total_price_override: null,
139
+ })),
140
+ },
141
+ payment: null,
142
+ transaction_data: { payment_method: '', flow: 'payform', attempts: [] },
143
+ };
144
+ purchases.set(id, purchase);
145
+ return send(201, purchase);
146
+ }
147
+ const one = /^\/api\/v1\/purchases\/([A-Za-z0-9-]+)\/$/.exec(path);
148
+ if (req.method === 'GET' && one) {
149
+ const p = purchases.get(one[1] ?? '');
150
+ if (!p)
151
+ return send(404, { __all__: { message: 'No such object', code: 'not_found' } });
152
+ return send(200, p);
153
+ }
154
+ if (req.method === 'GET' && path === '/api/v1/public_key/')
155
+ return send(200, pem);
156
+ send(404, { __all__: { message: 'No such object', code: 'not_found' } });
157
+ });
158
+ });
159
+ await new Promise((r) => server.listen(0, '127.0.0.1', r));
160
+ const url = `http://127.0.0.1:${server.address().port}`;
161
+ const purchase = (id) => {
162
+ const p = purchases.get(id);
163
+ if (!p)
164
+ throw new Error(`fake CHIP: no purchase ${id}`);
165
+ return p;
166
+ };
167
+ const paymentFor = (p, paidOn) => {
168
+ const total = p.purchase.total;
169
+ const fee = Math.min(100, total); // illustrative
170
+ return {
171
+ is_outgoing: false,
172
+ payment_type: 'purchase',
173
+ amount: total,
174
+ currency: p.purchase.currency,
175
+ net_amount: total - fee,
176
+ fee_amount: fee,
177
+ pending_amount: 0,
178
+ pending_unfreeze_on: null,
179
+ description: '',
180
+ paid_on: paidOn,
181
+ remote_paid_on: paidOn,
182
+ };
183
+ };
184
+ return {
185
+ url: `${url}/api/v1`,
186
+ publicKey: pem,
187
+ requests,
188
+ markPaid(id) {
189
+ const p = purchase(id);
190
+ const t = now();
191
+ p.status = 'paid';
192
+ p.payment = paymentFor(p, t);
193
+ p.updated_on = t;
194
+ p.transaction_data.payment_method = 'fpx';
195
+ p.status_history.push({ status: 'paid', timestamp: t });
196
+ },
197
+ callbackFor(id, override = {}) {
198
+ const p = purchase(id);
199
+ // A callback claims success even before markPaid (replay / leaked key); the fake's own record stays unpaid.
200
+ const payload = {
201
+ ...structuredClone(p),
202
+ status: 'paid',
203
+ payment: p.payment ?? paymentFor(p, now()),
204
+ event_type: 'purchase.paid',
205
+ ...override,
206
+ };
207
+ const rawBody = JSON.stringify(payload);
208
+ const fields = {};
209
+ for (const [k, v] of Object.entries(payload)) {
210
+ if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')
211
+ fields[k] = String(v);
212
+ }
213
+ const signature = sign('sha256', Buffer.from(rawBody), privateKey).toString('base64');
214
+ return {
215
+ fields,
216
+ rawBody,
217
+ headers: { 'content-type': 'application/json', 'x-signature': signature },
218
+ };
219
+ },
220
+ tamper: (cb) => ({
221
+ ...cb,
222
+ headers: { ...cb.headers, 'x-signature': flip(cb.headers['x-signature'] ?? '') },
223
+ }),
224
+ close: () => new Promise((r) => server.close(() => r())),
225
+ };
226
+ }
227
+ //# sourceMappingURL=chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chip.js","sourceRoot":"","sources":["../../src/fakes/chip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { CallbackInput } from '@bayarkit/core';
2
+ import { type FakeGateway } from './types.js';
3
+ type Entity = Record<string, unknown> & {
4
+ id: string;
5
+ };
6
+ /** Webhook signature: the RAW body, keyed with the Dashboard webhook secret [WV L138-153]. */
7
+ export declare const curlecWebhookSignature: (webhookSecret: string, rawBody: string) => string;
8
+ export interface FakeCurlec extends FakeGateway {
9
+ requests: {
10
+ method: string;
11
+ path: string;
12
+ body: unknown;
13
+ headers: Record<string, string | string[] | undefined>;
14
+ }[];
15
+ /** The fake's own record (what `GET /v1/payment_links/{id}` or `GET /v1/orders/{id}` answers). */
16
+ entity(id: string): Entity | undefined;
17
+ /** Simulate the customer opening a link (creates its order, `attempted`) or attempting an order. */
18
+ attempt(id: string): Entity;
19
+ /** The Payment Link browser redirect (GET query), signed with the API key secret [PLA]. */
20
+ redirectFor(id: string, override?: Record<string, string>): CallbackInput;
21
+ /** The Standard Checkout callback (POST form), signed with the API key secret [CK]. */
22
+ checkoutCallbackFor(orderId: string, override?: Record<string, string>): CallbackInput;
23
+ }
24
+ export declare function startFakeCurlec(opts: {
25
+ keyId: string;
26
+ keySecret: string;
27
+ webhookSecret: string;
28
+ }): Promise<FakeCurlec>;
29
+ export {};
30
+ //# sourceMappingURL=curlec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curlec.d.ts","sourceRoot":"","sources":["../../src/fakes/curlec.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,KAAK,WAAW,EAAQ,MAAM,YAAY,CAAA;AAEnD,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAMtD,8FAA8F;AAC9F,eAAO,MAAM,sBAAsB,kBAAmB,MAAM,WAAW,MAAM,KAAG,MAC/C,CAAA;AAEjC,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,OAAO,CAAA;QACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAA;KACvD,EAAE,CAAA;IACH,kGAAkG;IAClG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACtC,oGAAoG;IACpG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IAC3B,2FAA2F;IAC3F,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAAA;IACzE,uFAAuF;IACvF,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,CAAA;CACvF;AAoBD,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,UAAU,CAAC,CA2VtB"}