finprim 0.1.1 → 0.1.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.
- package/README.md +164 -76
- package/dist/{card-D3WC2rzV.d.mts → card-D2-7wbam.d.mts} +8 -1
- package/dist/{card-D3WC2rzV.d.ts → card-D2-7wbam.d.ts} +8 -1
- package/dist/index.d.mts +20 -3
- package/dist/index.d.ts +20 -3
- package/dist/index.js +207 -29
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +200 -30
- package/dist/index.mjs.map +1 -1
- package/dist/nest/index.d.mts +18 -0
- package/dist/nest/index.d.ts +18 -0
- package/dist/nest/index.js +448 -0
- package/dist/nest/index.js.map +1 -0
- package/dist/nest/index.mjs +438 -0
- package/dist/nest/index.mjs.map +1 -0
- package/dist/react/index.d.mts +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.js +36 -20
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +36 -20
- package/dist/react/index.mjs.map +1 -1
- package/dist/zod/index.d.mts +3 -1
- package/dist/zod/index.d.ts +3 -1
- package/dist/zod/index.js +124 -25
- package/dist/zod/index.js.map +1 -1
- package/dist/zod/index.mjs +123 -26
- package/dist/zod/index.mjs.map +1 -1
- package/package.json +30 -4
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,40 @@
|
|
|
1
|
+
// src/_guard.ts
|
|
2
|
+
var MAX_SAFE_INPUT_LENGTH = 256;
|
|
3
|
+
function guardStringInput(input, label = "Input") {
|
|
4
|
+
if (input == null || typeof input !== "string") {
|
|
5
|
+
return { ok: false, error: `${label} must be a non-empty string` };
|
|
6
|
+
}
|
|
7
|
+
if (input.length === 0) {
|
|
8
|
+
return { ok: false, error: `${label} must be a non-empty string` };
|
|
9
|
+
}
|
|
10
|
+
if (input.length > MAX_SAFE_INPUT_LENGTH) {
|
|
11
|
+
return {
|
|
12
|
+
ok: false,
|
|
13
|
+
error: `${label} must not exceed ${MAX_SAFE_INPUT_LENGTH} characters`
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return { ok: true, value: input };
|
|
17
|
+
}
|
|
18
|
+
function guardNumber(value, options) {
|
|
19
|
+
const label = options.label ?? "Value";
|
|
20
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
21
|
+
return { ok: false, error: `${label} must be a finite number` };
|
|
22
|
+
}
|
|
23
|
+
if (Number.isNaN(value)) {
|
|
24
|
+
return { ok: false, error: `${label} must not be NaN` };
|
|
25
|
+
}
|
|
26
|
+
if (options.integer && !Number.isInteger(value)) {
|
|
27
|
+
return { ok: false, error: `${label} must be an integer` };
|
|
28
|
+
}
|
|
29
|
+
if (options.min !== void 0 && value < options.min) {
|
|
30
|
+
return { ok: false, error: `${label} must be at least ${options.min}` };
|
|
31
|
+
}
|
|
32
|
+
if (options.max !== void 0 && value > options.max) {
|
|
33
|
+
return { ok: false, error: `${label} must be at most ${options.max}` };
|
|
34
|
+
}
|
|
35
|
+
return { ok: true, value };
|
|
36
|
+
}
|
|
37
|
+
|
|
1
38
|
// src/iban.ts
|
|
2
39
|
var IBAN_LENGTHS = {
|
|
3
40
|
AL: 28,
|
|
@@ -84,11 +121,15 @@ function ibanToDigits(iban) {
|
|
|
84
121
|
function formatIBANString(iban) {
|
|
85
122
|
return iban.replace(/(.{4})/g, "$1 ").trim();
|
|
86
123
|
}
|
|
124
|
+
function formatIBAN(input) {
|
|
125
|
+
if (typeof input !== "string") return "";
|
|
126
|
+
const cleaned = input.replace(/\s/g, "").toUpperCase().slice(0, 34);
|
|
127
|
+
return formatIBANString(cleaned);
|
|
128
|
+
}
|
|
87
129
|
function validateIBAN(input) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const cleaned = input.replace(/\s/g, "").toUpperCase();
|
|
130
|
+
const guarded = guardStringInput(input);
|
|
131
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
132
|
+
const cleaned = guarded.value.replace(/\s/g, "").toUpperCase();
|
|
92
133
|
if (cleaned.length < 4) {
|
|
93
134
|
return { valid: false, error: "IBAN is too short" };
|
|
94
135
|
}
|
|
@@ -122,11 +163,22 @@ function validateIBAN(input) {
|
|
|
122
163
|
}
|
|
123
164
|
|
|
124
165
|
// src/sortcode.ts
|
|
166
|
+
function formatSortCode(input) {
|
|
167
|
+
if (typeof input !== "string") return "";
|
|
168
|
+
const digits = input.replace(/[-\s]/g, "").slice(0, 6);
|
|
169
|
+
if (digits.length < 6) return digits;
|
|
170
|
+
return `${digits.slice(0, 2)}-${digits.slice(2, 4)}-${digits.slice(4, 6)}`;
|
|
171
|
+
}
|
|
172
|
+
function formatUKAccountNumber(input) {
|
|
173
|
+
if (typeof input !== "string") return "";
|
|
174
|
+
const digits = input.replace(/\s/g, "").slice(0, 8);
|
|
175
|
+
if (digits.length < 8) return digits;
|
|
176
|
+
return `${digits.slice(0, 4)} ${digits.slice(4, 8)}`;
|
|
177
|
+
}
|
|
125
178
|
function validateUKSortCode(input) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const cleaned = input.replace(/[-\s]/g, "");
|
|
179
|
+
const guarded = guardStringInput(input);
|
|
180
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
181
|
+
const cleaned = guarded.value.replace(/[-\s]/g, "");
|
|
130
182
|
if (!/^\d{6}$/.test(cleaned)) {
|
|
131
183
|
return {
|
|
132
184
|
valid: false,
|
|
@@ -141,10 +193,9 @@ function validateUKSortCode(input) {
|
|
|
141
193
|
};
|
|
142
194
|
}
|
|
143
195
|
function validateUKAccountNumber(input) {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const cleaned = input.replace(/\s/g, "");
|
|
196
|
+
const guarded = guardStringInput(input);
|
|
197
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
198
|
+
const cleaned = guarded.value.replace(/\s/g, "");
|
|
148
199
|
if (!/^\d{8}$/.test(cleaned)) {
|
|
149
200
|
return {
|
|
150
201
|
valid: false,
|
|
@@ -188,14 +239,13 @@ var SYMBOL_MAP = {
|
|
|
188
239
|
"CHF": "CHF"
|
|
189
240
|
};
|
|
190
241
|
function validateCurrencyCode(input) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
const upper = input.toUpperCase();
|
|
242
|
+
const guarded = guardStringInput(input);
|
|
243
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
244
|
+
const upper = guarded.value.toUpperCase();
|
|
195
245
|
if (!SUPPORTED_CURRENCIES.includes(upper)) {
|
|
196
246
|
return {
|
|
197
247
|
valid: false,
|
|
198
|
-
error: `Unsupported currency code: ${
|
|
248
|
+
error: `Unsupported currency code: ${upper}. Supported: ${SUPPORTED_CURRENCIES.join(", ")}`
|
|
199
249
|
};
|
|
200
250
|
}
|
|
201
251
|
return {
|
|
@@ -205,6 +255,9 @@ function validateCurrencyCode(input) {
|
|
|
205
255
|
};
|
|
206
256
|
}
|
|
207
257
|
function formatCurrency(amount, currency, locale) {
|
|
258
|
+
if (typeof amount !== "number" || !Number.isFinite(amount)) {
|
|
259
|
+
return "";
|
|
260
|
+
}
|
|
208
261
|
const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? "en-GB";
|
|
209
262
|
return new Intl.NumberFormat(resolvedLocale, {
|
|
210
263
|
style: "currency",
|
|
@@ -214,11 +267,10 @@ function formatCurrency(amount, currency, locale) {
|
|
|
214
267
|
}).format(amount);
|
|
215
268
|
}
|
|
216
269
|
function parseMoney(input) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
270
|
+
const guarded = guardStringInput(input);
|
|
271
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
220
272
|
let currency;
|
|
221
|
-
let cleaned =
|
|
273
|
+
let cleaned = guarded.value.trim();
|
|
222
274
|
for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {
|
|
223
275
|
if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {
|
|
224
276
|
currency = code;
|
|
@@ -245,10 +297,9 @@ function parseMoney(input) {
|
|
|
245
297
|
// src/bic.ts
|
|
246
298
|
var BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/;
|
|
247
299
|
function validateBIC(input) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const cleaned = input.replace(/\s/g, "").toUpperCase();
|
|
300
|
+
const guarded = guardStringInput(input);
|
|
301
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
302
|
+
const cleaned = guarded.value.replace(/\s/g, "").toUpperCase();
|
|
252
303
|
if (cleaned.length !== 8 && cleaned.length !== 11) {
|
|
253
304
|
return {
|
|
254
305
|
valid: false,
|
|
@@ -287,10 +338,9 @@ function formatCardNumber(digits, network) {
|
|
|
287
338
|
return digits.replace(/(.{4})/g, "$1 ").trim();
|
|
288
339
|
}
|
|
289
340
|
function validateCardNumber(input) {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
const digits = input.replace(/[\s-]/g, "");
|
|
341
|
+
const guarded = guardStringInput(input);
|
|
342
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
343
|
+
const digits = guarded.value.replace(/[\s-]/g, "");
|
|
294
344
|
if (!/^\d+$/.test(digits)) {
|
|
295
345
|
return { valid: false, error: "Card number must contain only digits" };
|
|
296
346
|
}
|
|
@@ -324,11 +374,131 @@ function validateCardNumber(input) {
|
|
|
324
374
|
};
|
|
325
375
|
}
|
|
326
376
|
|
|
377
|
+
// src/vat.ts
|
|
378
|
+
var EU_VAT_PATTERNS = {
|
|
379
|
+
AT: /^ATU\d{8}$/,
|
|
380
|
+
BE: /^BE0?\d{9}$/,
|
|
381
|
+
BG: /^BG\d{9,10}$/,
|
|
382
|
+
CY: /^CY\d{8}[A-Z]$/,
|
|
383
|
+
CZ: /^CZ\d{8,10}$/,
|
|
384
|
+
DE: /^DE\d{9}$/,
|
|
385
|
+
DK: /^DK\d{8}$/,
|
|
386
|
+
EE: /^EE\d{9}$/,
|
|
387
|
+
EL: /^EL\d{9}$/,
|
|
388
|
+
ES: /^ES[A-Z0-9]\d{7}[A-Z0-9]$/,
|
|
389
|
+
FI: /^FI\d{8}$/,
|
|
390
|
+
FR: /^FR[A-HJ-NP-Z0-9]{2}\d{9}$/,
|
|
391
|
+
GR: /^GR\d{9}$/,
|
|
392
|
+
HR: /^HR\d{11}$/,
|
|
393
|
+
HU: /^HU\d{8}$/,
|
|
394
|
+
IE: /^IE\d[A-Z0-9]\d{5}[A-Z]$|^IE\d{7}[A-W][A-I0-9]?$/,
|
|
395
|
+
IT: /^IT\d{11}$/,
|
|
396
|
+
LT: /^LT\d{9}$|^LT\d{12}$/,
|
|
397
|
+
LU: /^LU\d{8}$/,
|
|
398
|
+
LV: /^LV\d{11}$/,
|
|
399
|
+
MT: /^MT\d{8}$/,
|
|
400
|
+
NL: /^NL\d{9}B\d{2}$/,
|
|
401
|
+
PL: /^PL\d{10}$/,
|
|
402
|
+
PT: /^PT\d{9}$/,
|
|
403
|
+
RO: /^RO\d{2,10}$/,
|
|
404
|
+
SE: /^SE\d{12}$/,
|
|
405
|
+
SI: /^SI\d{8}$/,
|
|
406
|
+
SK: /^SK\d{10}$/
|
|
407
|
+
};
|
|
408
|
+
function validateEUVAT(input) {
|
|
409
|
+
const guarded = guardStringInput(input);
|
|
410
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
411
|
+
const cleaned = guarded.value.replace(/\s/g, "").toUpperCase();
|
|
412
|
+
if (cleaned.length < 4) {
|
|
413
|
+
return { valid: false, error: "VAT number is too short" };
|
|
414
|
+
}
|
|
415
|
+
const countryCode = cleaned.slice(0, 2);
|
|
416
|
+
const pattern = EU_VAT_PATTERNS[countryCode];
|
|
417
|
+
if (!pattern) {
|
|
418
|
+
return { valid: false, error: `Unsupported EU VAT country code: ${countryCode}` };
|
|
419
|
+
}
|
|
420
|
+
if (!pattern.test(cleaned)) {
|
|
421
|
+
return { valid: false, error: `Invalid VAT format for ${countryCode}` };
|
|
422
|
+
}
|
|
423
|
+
const formatted = `${countryCode} ${cleaned.slice(2)}`;
|
|
424
|
+
return {
|
|
425
|
+
valid: true,
|
|
426
|
+
value: cleaned,
|
|
427
|
+
formatted,
|
|
428
|
+
countryCode
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// src/routing.ts
|
|
433
|
+
function routingChecksum(digits) {
|
|
434
|
+
if (digits.length !== 9) return false;
|
|
435
|
+
const sum = 3 * (Number(digits[0]) + Number(digits[3]) + Number(digits[6])) + 7 * (Number(digits[1]) + Number(digits[4]) + Number(digits[7])) + Number(digits[2]) + Number(digits[5]) + Number(digits[8]);
|
|
436
|
+
return sum % 10 === 0;
|
|
437
|
+
}
|
|
438
|
+
function validateUSRoutingNumber(input) {
|
|
439
|
+
const guarded = guardStringInput(input);
|
|
440
|
+
if (!guarded.ok) return { valid: false, error: guarded.error };
|
|
441
|
+
const cleaned = guarded.value.replace(/\s/g, "");
|
|
442
|
+
if (!/^\d{9}$/.test(cleaned)) {
|
|
443
|
+
return {
|
|
444
|
+
valid: false,
|
|
445
|
+
error: "US routing number must be exactly 9 digits"
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
if (!routingChecksum(cleaned)) {
|
|
449
|
+
return { valid: false, error: "US routing number checksum is invalid" };
|
|
450
|
+
}
|
|
451
|
+
return {
|
|
452
|
+
valid: true,
|
|
453
|
+
value: cleaned,
|
|
454
|
+
formatted: cleaned
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// src/loan.ts
|
|
459
|
+
var MAX_LOAN_MONTHS = 3600;
|
|
460
|
+
function calculateEMI(principal, annualRatePercent, months) {
|
|
461
|
+
const p = guardNumber(principal, { min: 0, label: "Principal" });
|
|
462
|
+
const m = guardNumber(months, { min: 1, max: MAX_LOAN_MONTHS, integer: true, label: "Months" });
|
|
463
|
+
const rate = guardNumber(annualRatePercent, { min: 0, label: "Annual rate" });
|
|
464
|
+
if (!p.ok || !m.ok || !rate.ok) return 0;
|
|
465
|
+
if (rate.value === 0) return p.value / m.value;
|
|
466
|
+
const r = rate.value / 100 / 12;
|
|
467
|
+
return p.value * (r * (1 + r) ** m.value) / ((1 + r) ** m.value - 1);
|
|
468
|
+
}
|
|
469
|
+
function getLoanSchedule(principal, annualRatePercent, months) {
|
|
470
|
+
const emi = calculateEMI(principal, annualRatePercent, months);
|
|
471
|
+
if (emi === 0) return [];
|
|
472
|
+
const p = guardNumber(principal, { min: 0, label: "Principal" });
|
|
473
|
+
const m = guardNumber(months, { min: 1, max: MAX_LOAN_MONTHS, integer: true, label: "Months" });
|
|
474
|
+
const rate = guardNumber(annualRatePercent, { min: 0, label: "Annual rate" });
|
|
475
|
+
if (!p.ok || !m.ok || !rate.ok) return [];
|
|
476
|
+
const r = rate.value / 100 / 12;
|
|
477
|
+
const schedule = [];
|
|
478
|
+
let balance = p.value;
|
|
479
|
+
for (let month = 1; month <= m.value; month++) {
|
|
480
|
+
const interest = balance * r;
|
|
481
|
+
const principalPayment = emi - interest;
|
|
482
|
+
balance = Math.max(0, balance - principalPayment);
|
|
483
|
+
schedule.push({
|
|
484
|
+
month,
|
|
485
|
+
payment: emi,
|
|
486
|
+
principal: principalPayment,
|
|
487
|
+
interest,
|
|
488
|
+
balance
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
return schedule;
|
|
492
|
+
}
|
|
493
|
+
|
|
327
494
|
// src/types.ts
|
|
328
495
|
function isValidationSuccess(result) {
|
|
329
496
|
return result.valid === true;
|
|
330
497
|
}
|
|
498
|
+
function isValidationFailure(result) {
|
|
499
|
+
return result.valid === false;
|
|
500
|
+
}
|
|
331
501
|
|
|
332
|
-
export { SUPPORTED_CURRENCIES, formatCurrency, isValidationSuccess, parseMoney, validateBIC, validateCardNumber, validateCurrencyCode, validateIBAN, validateUKAccountNumber, validateUKSortCode };
|
|
502
|
+
export { SUPPORTED_CURRENCIES, calculateEMI, formatCurrency, formatIBAN, formatSortCode, formatUKAccountNumber, getLoanSchedule, isValidationFailure, isValidationSuccess, parseMoney, validateBIC, validateCardNumber, validateCurrencyCode, validateEUVAT, validateIBAN, validateUKAccountNumber, validateUKSortCode, validateUSRoutingNumber };
|
|
333
503
|
//# sourceMappingURL=index.mjs.map
|
|
334
504
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/iban.ts","../src/sortcode.ts","../src/currency.ts","../src/bic.ts","../src/card.ts","../src/types.ts"],"names":[],"mappings":";AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EA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","file":"index.mjs","sourcesContent":["import type { IBAN, IBANValidationResult } from './types'\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29,\n BG: 22, CR: 22, HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20,\n FI: 18, FR: 27, GE: 22, DE: 22, GI: 23, GR: 27, GT: 28, HU: 28,\n IS: 26, IE: 22, IL: 23, IT: 27, JO: 30, KZ: 20, KW: 30, LV: 21,\n LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31, MR: 27, MU: 30,\n MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\n PT: 25, QA: 29, RO: 24, SM: 27, SA: 24, RS: 22, SK: 24, SI: 19,\n ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\n}\n\nconst LETTER_A = 'A'.codePointAt(0)!\nconst LETTER_Z = 'Z'.codePointAt(0)!\nconst LETTER_TO_DIGIT_OFFSET = 55\n\nfunction mod97(value: string): number {\n return [...value].reduce(\n (remainder, char) => (remainder * 10 + Number.parseInt(char, 10)) % 97,\n 0\n )\n}\n\nfunction ibanToDigits(iban: string): string {\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n return [...rearranged]\n .map((char) => {\n const code = char.codePointAt(0) ?? 0\n return code >= LETTER_A && code <= LETTER_Z\n ? (code - LETTER_TO_DIGIT_OFFSET).toString()\n : char\n })\n .join('')\n}\n\nfunction formatIBANString(iban: string): string {\n return iban.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateIBAN(input: string): IBANValidationResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'IBAN is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n if (!/^[A-Z]{2}$/.test(countryCode)) {\n return { valid: false, error: 'IBAN must start with a 2-letter country code' }\n }\n\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) {\n return { valid: false, error: `Unsupported country code: ${countryCode}` }\n }\n\n if (cleaned.length !== expectedLength) {\n return {\n valid: false,\n error: `Invalid length for ${countryCode} IBAN. Expected ${expectedLength} characters, got ${cleaned.length}`,\n }\n }\n\n if (!/^[A-Z0-9]+$/.test(cleaned)) {\n return { valid: false, error: 'IBAN contains invalid characters' }\n }\n\n const digits = ibanToDigits(cleaned)\n\n if (mod97(digits) !== 1) {\n return { valid: false, error: 'IBAN checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as IBAN,\n formatted: formatIBANString(cleaned),\n countryCode,\n }\n}\n","import type { SortCode, AccountNumber, ValidationResult } from './types'\n\nexport function validateUKSortCode(input: string): ValidationResult<SortCode> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/[-\\s]/g, '')\n\n if (!/^\\d{6}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'Sort code must be exactly 6 digits. Accepted formats: 60-16-13, 601613, 60 16 13',\n }\n }\n\n const formatted = `${cleaned.slice(0, 2)}-${cleaned.slice(2, 4)}-${cleaned.slice(4, 6)}`\n\n return {\n valid: true,\n value: cleaned as SortCode,\n formatted,\n }\n}\n\nexport function validateUKAccountNumber(input: string): ValidationResult<AccountNumber> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '')\n\n if (!/^\\d{8}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'UK account number must be exactly 8 digits',\n }\n }\n\n const formatted = `${cleaned.slice(0, 4)} ${cleaned.slice(4, 8)}`\n\n return {\n valid: true,\n value: cleaned as AccountNumber,\n formatted,\n }\n}\n","import type { CurrencyCode, SupportedCurrency, MoneyResult, ValidationResult } from './types'\n\nexport const SUPPORTED_CURRENCIES: SupportedCurrency[] = [\n 'GBP', 'EUR', 'USD', 'JPY', 'CHF', 'CAD', 'AUD', 'NZD',\n]\n\nconst CURRENCY_LOCALES: Record<SupportedCurrency, string> = {\n GBP: 'en-GB',\n EUR: 'de-DE',\n USD: 'en-US',\n JPY: 'ja-JP',\n CHF: 'de-CH',\n CAD: 'en-CA',\n AUD: 'en-AU',\n NZD: 'en-NZ',\n}\n\nconst SYMBOL_MAP: Record<string, SupportedCurrency> = {\n '£': 'GBP',\n '€': 'EUR',\n '$': 'USD',\n '¥': 'JPY',\n 'CHF': 'CHF',\n}\n\nexport function validateCurrencyCode(input: string): ValidationResult<CurrencyCode> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const upper = input.toUpperCase() as SupportedCurrency\n\n if (!SUPPORTED_CURRENCIES.includes(upper)) {\n return {\n valid: false,\n error: `Unsupported currency code: ${input}. Supported: ${SUPPORTED_CURRENCIES.join(', ')}`,\n }\n }\n\n return {\n valid: true,\n value: upper as CurrencyCode,\n formatted: upper,\n }\n}\n\nexport function formatCurrency(\n amount: number,\n currency: SupportedCurrency,\n locale?: string\n): string {\n const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? 'en-GB'\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency,\n minimumFractionDigits: currency === 'JPY' ? 0 : 2,\n maximumFractionDigits: currency === 'JPY' ? 0 : 2,\n }).format(amount)\n}\n\nexport function parseMoney(input: string): MoneyResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n let currency: SupportedCurrency | undefined\n let cleaned = input.trim()\n\n for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {\n if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {\n currency = code\n cleaned = cleaned.replace(symbol, '').trim()\n break\n }\n }\n\n if (!currency) {\n return { valid: false, error: 'Could not detect currency from input. Expected a symbol like £, €, $, ¥' }\n }\n\n const normalised = cleaned.replace(/,/g, '')\n const amount = Number.parseFloat(normalised)\n\n if (Number.isNaN(amount)) {\n return { valid: false, error: `Could not parse amount from: \"${cleaned}\"` }\n }\n\n return {\n valid: true,\n amount,\n currency,\n formatted: formatCurrency(amount, currency),\n }\n}\n","import type { BIC, ValidationResult } from './types'\n\nconst BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/\n\nexport function validateBIC(input: string): ValidationResult<BIC> {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const cleaned = input.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length !== 8 && cleaned.length !== 11) {\n return {\n valid: false,\n error: `BIC must be 8 or 11 characters. Got ${cleaned.length}`,\n }\n }\n\n if (!BIC_REGEX.test(cleaned)) {\n return {\n valid: false,\n error: 'Invalid BIC format. Expected: 4 letters + 2 letters + 2 alphanumeric + optional 3 alphanumeric',\n }\n }\n\n const bankCode = cleaned.slice(0, 4)\n const countryCode = cleaned.slice(4, 6)\n const location = cleaned.slice(6, 8)\n const branch = cleaned.length === 11 ? cleaned.slice(8, 11) : 'XXX'\n\n return {\n valid: true,\n value: cleaned as BIC,\n formatted: `${bankCode} ${countryCode} ${location} ${branch}`,\n }\n}\n","import type { CardNumber, ValidationResult } from './types'\n\nexport type CardNetwork = 'Visa' | 'Mastercard' | 'Amex' | 'Discover' | 'Unknown'\n\nexport type CardValidationResult =\n | { valid: true; value: CardNumber; formatted: string; network: CardNetwork; last4: string }\n | { valid: false; error: string }\n\nfunction detectNetwork(digits: string): CardNetwork {\n if (/^4/.test(digits)) return 'Visa'\n if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits)) return 'Mastercard'\n if (/^3[47]/.test(digits)) return 'Amex'\n if (/^6(?:011|5)/.test(digits)) return 'Discover'\n return 'Unknown'\n}\n\nfunction formatCardNumber(digits: string, network: CardNetwork): string {\n if (network === 'Amex') {\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10, 15)}`\n }\n return digits.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateCardNumber(input: string): CardValidationResult {\n if (!input || typeof input !== 'string') {\n return { valid: false, error: 'Input must be a non-empty string' }\n }\n\n const digits = input.replace(/[\\s-]/g, '')\n\n if (!/^\\d+$/.test(digits)) {\n return { valid: false, error: 'Card number must contain only digits' }\n }\n\n if (digits.length < 13 || digits.length > 19) {\n return {\n valid: false,\n error: `Card number length invalid. Expected 13-19 digits, got ${digits.length}`,\n }\n }\n\n let sum = 0\n let shouldDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number.parseInt(digits[i]!, 10)\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n if (sum % 10 !== 0) {\n return { valid: false, error: 'Card number failed Luhn check — this is not a valid card number' }\n }\n\n const network = detectNetwork(digits)\n\n return {\n valid: true,\n value: digits as CardNumber,\n formatted: formatCardNumber(digits, network),\n network,\n last4: digits.slice(-4),\n }\n}\n","declare const __brand: unique symbol\ntype Brand<T, B> = T & { readonly [__brand]: B }\n\nexport type IBAN = Brand<string, 'IBAN'>\nexport type SortCode = Brand<string, 'SortCode'>\nexport type AccountNumber = Brand<string, 'AccountNumber'>\nexport type CurrencyCode = Brand<string, 'CurrencyCode'>\nexport type BIC = Brand<string, 'BIC'>\nexport type CardNumber = Brand<string, 'CardNumber'>\n\nexport type SupportedCurrency =\n | 'GBP' | 'EUR' | 'USD' | 'JPY'\n | 'CHF' | 'CAD' | 'AUD' | 'NZD'\n\nexport type ValidationSuccess<T> = {\n valid: true\n value: T\n formatted: string\n}\n\nexport type ValidationFailure = {\n valid: false\n error: string\n}\n\nexport type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure\n\nexport function isValidationSuccess<T>(\n result: ValidationResult<T>\n): result is ValidationSuccess<T> {\n return result.valid === true\n}\n\nexport type IBANValidationSuccess = ValidationSuccess<IBAN> & { countryCode: string }\nexport type IBANValidationResult = IBANValidationSuccess | ValidationFailure\n\nexport type MoneyResult =\n | { valid: true; amount: number; currency: SupportedCurrency; formatted: string }\n | { valid: false; error: string }\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/_guard.ts","../src/iban.ts","../src/sortcode.ts","../src/currency.ts","../src/bic.ts","../src/card.ts","../src/vat.ts","../src/routing.ts","../src/loan.ts","../src/types.ts"],"names":[],"mappings":";AAAO,IAAM,qBAAA,GAAwB,GAAA;AAE9B,SAAS,gBAAA,CACd,KAAA,EACA,KAAA,GAAQ,OAAA,EACoD;AAC5D,EAAA,IAAI,KAAA,IAAS,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AAC9C,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,2BAAA,CAAA,EAA8B;AAAA,EACnE;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,2BAAA,CAAA,EAA8B;AAAA,EACnE;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,qBAAA,EAAuB;AACxC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,iBAAA,EAAoB,qBAAqB,CAAA,WAAA;AAAA,KAC1D;AAAA,EACF;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM;AAClC;AAEO,SAAS,WAAA,CACd,OACA,OAAA,EAC4D;AAC5D,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,OAAA;AAC/B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACxD,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,wBAAA,CAAA,EAA2B;AAAA,EAChE;AACA,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,gBAAA,CAAA,EAAmB;AAAA,EACxD;AACA,EAAA,IAAI,QAAQ,OAAA,IAAW,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC/C,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,mBAAA,CAAA,EAAsB;AAAA,EAC3D;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,QAAQ,GAAA,EAAK;AACpD,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,GAAG,KAAK,CAAA,kBAAA,EAAqB,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAG;AAAA,EACxE;AACA,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,QAAQ,GAAA,EAAK;AACpD,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,GAAG,KAAK,CAAA,iBAAA,EAAoB,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAG;AAAA,EACvE;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAC3B;;;ACvCA,IAAM,YAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAC5D,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI,EAAA;AAAA,EAAI,EAAA,EAAI;AAC9D,CAAA;AAEA,IAAM,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA;AAClC,IAAM,QAAA,GAAW,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA;AAClC,IAAM,sBAAA,GAAyB,EAAA;AAE/B,SAAS,MAAM,KAAA,EAAuB;AACpC,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,MAAA;AAAA,IAChB,CAAC,WAAW,IAAA,KAAA,CAAU,SAAA,GAAY,KAAK,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA,IAAK,EAAA;AAAA,IACpE;AAAA,GACF;AACF;AAEA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAM,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAClD,EAAA,OAAO,CAAC,GAAG,UAAU,CAAA,CAClB,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AACpC,IAAA,OAAO,QAAQ,QAAA,IAAY,IAAA,IAAQ,YAC9B,IAAA,GAAO,sBAAA,EAAwB,UAAS,GACzC,IAAA;AAAA,EACN,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACZ;AAEA,SAAS,iBAAiB,IAAA,EAAsB;AAC9C,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,IAAA,EAAK;AAC7C;AAEO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAA;AACtC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClE,EAAA,OAAO,iBAAiB,OAAO,CAAA;AACjC;AAEO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,QAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAE7D,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAoB;AAAA,EACpD;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEtC,EAAA,IAAI,CAAC,YAAA,CAAa,IAAA,CAAK,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,8CAAA,EAA+C;AAAA,EAC/E;AAEA,EAAA,MAAM,cAAA,GAAiB,aAAa,WAAW,CAAA;AAE/C,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,0BAAA,EAA6B,WAAW,CAAA,CAAA,EAAG;AAAA,EAC3E;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,cAAA,EAAgB;AACrC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,OAAO,CAAA,mBAAA,EAAsB,WAAW,mBAAmB,cAAc,CAAA,iBAAA,EAAoB,QAAQ,MAAM,CAAA;AAAA,KAC7G;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG;AAChC,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,EACnE;AAEA,EAAA,MAAM,MAAA,GAAS,aAAa,OAAO,CAAA;AAEnC,EAAA,IAAI,KAAA,CAAM,MAAM,CAAA,KAAM,CAAA,EAAG;AACvB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,0BAAA,EAA2B;AAAA,EAC3D;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,iBAAiB,OAAO,CAAA;AAAA,IACnC;AAAA,GACF;AACF;;;ACzFO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAA;AACtC,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACrD,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC1E;AAEO,SAAS,sBAAsB,KAAA,EAAuB;AAC3D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAA;AACtC,EAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAClD,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACpD;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,CAAA;AAElD,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,QAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEtF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP;AAAA,GACF;AACF;AAEO,SAAS,wBAAwB,KAAA,EAAgD;AACtF,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,CAAA;AAE/C,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAE/D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP;AAAA,GACF;AACF;;;ACxDO,IAAM,oBAAA,GAA4C;AAAA,EACvD,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AACnD;AAEA,IAAM,gBAAA,GAAsD;AAAA,EAC1D,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK,OAAA;AAAA,EACL,GAAA,EAAK;AACP,CAAA;AAEA,IAAM,UAAA,GAAgD;AAAA,EACpD,MAAA,EAAK,KAAA;AAAA,EACL,QAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO;AACT,CAAA;AAEO,SAAS,qBAAqB,KAAA,EAA+C;AAClF,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAY;AAExC,EAAA,IAAI,CAAC,oBAAA,CAAqB,QAAA,CAAS,KAAK,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,OAAO,CAAA,2BAAA,EAA8B,KAAK,gBAAgB,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,KAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AACF;AAEO,SAAS,cAAA,CACd,MAAA,EACA,QAAA,EACA,MAAA,EACQ;AACR,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,IAAA,OAAO,EAAA;AAAA,EACT;AACA,EAAA,MAAM,cAAA,GAAiB,MAAA,IAAU,gBAAA,CAAiB,QAAQ,CAAA,IAAK,OAAA;AAC/D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB;AAAA,IAC3C,KAAA,EAAO,UAAA;AAAA,IACP,QAAA;AAAA,IACA,qBAAA,EAAuB,QAAA,KAAa,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAA,IAChD,qBAAA,EAAuB,QAAA,KAAa,KAAA,GAAQ,CAAA,GAAI;AAAA,GACjD,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAClB;AAEO,SAAS,WAAW,KAAA,EAA4B;AACrD,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAK;AAEjC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvD,IAAA,IAAI,QAAQ,UAAA,CAAW,MAAM,KAAK,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1D,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,EAAE,IAAA,EAAK;AAC3C,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,oFAAA,EAA0E;AAAA,EAC1G;AAEA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,UAAU,CAAA;AAE3C,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAA,CAAA,EAAI;AAAA,EAC5E;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,MAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,cAAA,CAAe,MAAA,EAAQ,QAAQ;AAAA,GAC5C;AACF;;;AC5FA,IAAM,SAAA,GAAY,6CAAA;AAEX,SAAS,YAAY,KAAA,EAAsC;AAChE,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,QAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAE7D,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,WAAW,EAAA,EAAI;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,oCAAA,EAAuC,OAAA,CAAQ,MAAM,CAAA;AAAA,KAC9D;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACnC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,KAAW,EAAA,GAAK,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAE9D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW,GAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,QAAQ,IAAI,MAAM,CAAA;AAAA,GAC7D;AACF;;;AC1BA,SAAS,cAAc,MAAA,EAA6B;AAClD,EAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,IAAI,SAAA,CAAU,KAAK,MAAM,CAAA,IAAK,UAAU,IAAA,CAAK,MAAM,GAAG,OAAO,YAAA;AAC7D,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,IAAI,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,UAAA;AACvC,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,QAAgB,OAAA,EAA8B;AACtE,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,OAAO,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,IAAA,EAAK;AAC/C;AAEO,SAAS,mBAAmB,KAAA,EAAqC;AACtE,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,CAAA;AAEjD,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,sCAAA,EAAuC;AAAA,EACvE;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,EAAA,IAAM,MAAA,CAAO,SAAS,EAAA,EAAI;AAC5C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,uDAAA,EAA0D,MAAA,CAAO,MAAM,CAAA;AAAA,KAChF;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,IAAA,IAAI,QAAQ,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAI,EAAE,CAAA;AAC1C,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,IAAS,CAAA;AAAA,IAC1B;AACA,IAAA,GAAA,IAAO,KAAA;AACP,IAAA,YAAA,GAAe,CAAC,YAAA;AAAA,EAClB;AAEA,EAAA,IAAI,GAAA,GAAM,OAAO,CAAA,EAAG;AAClB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,sEAAA,EAAkE;AAAA,EAClG;AAEA,EAAA,MAAM,OAAA,GAAU,cAAc,MAAM,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,SAAA,EAAW,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3C,OAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,EAAE;AAAA,GACxB;AACF;;;AChEA,IAAM,eAAA,GAA0C;AAAA,EAC9C,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,aAAA;AAAA,EACJ,EAAA,EAAI,cAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI,cAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,2BAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,4BAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,kDAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,sBAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,cAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,cAAc,KAAA,EAAoC;AAChE,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,UAAU,OAAA,CAAQ,KAAA,CAAM,QAAQ,KAAA,EAAO,EAAE,EAAE,WAAA,EAAY;AAE7D,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,EAC1D;AAEA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,gBAAgB,WAAW,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,iCAAA,EAAoC,WAAW,CAAA,CAAA,EAAG;AAAA,EAClF;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,CAAA,uBAAA,EAA0B,WAAW,CAAA,CAAA,EAAG;AAAA,EACxE;AAEA,EAAA,MAAM,YAAY,CAAA,EAAG,WAAW,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAEpD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC5DA,SAAS,gBAAgB,MAAA,EAAyB;AAChD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAChC,EAAA,MAAM,GAAA,GACJ,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,OAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,OAAO,CAAC,CAAC,KAC7D,CAAA,IAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,OAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,OAAO,CAAC,CAAC,KAC7D,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,OAAO,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1D,EAAA,OAAO,MAAM,EAAA,KAAO,CAAA;AACtB;AAEO,SAAS,wBAAwB,KAAA,EAAgD;AACtF,EAAA,MAAM,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,IAAI,CAAC,QAAQ,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAE7D,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,CAAA;AAE/C,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,uCAAA,EAAwC;AAAA,EACxE;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,SAAA,EAAW;AAAA,GACb;AACF;;;ACxBA,IAAM,eAAA,GAAkB,IAAA;AAEjB,SAAS,YAAA,CACd,SAAA,EACA,iBAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,CAAA,GAAI,YAAY,SAAA,EAAW,EAAE,KAAK,CAAA,EAAG,KAAA,EAAO,aAAa,CAAA;AAC/D,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,eAAA,EAAiB,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,CAAA;AAC9F,EAAA,MAAM,IAAA,GAAO,YAAY,iBAAA,EAAmB,EAAE,KAAK,CAAA,EAAG,KAAA,EAAO,eAAe,CAAA;AAC5E,EAAA,IAAI,CAAC,EAAE,EAAA,IAAM,CAAC,EAAE,EAAA,IAAM,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,CAAA;AAEvC,EAAA,IAAI,KAAK,KAAA,KAAU,CAAA,EAAG,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AACzC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,GAAA,GAAM,EAAA;AAC7B,EAAA,OAAO,CAAA,CAAE,KAAA,IAAS,CAAA,GAAA,CAAK,CAAA,GAAI,CAAA,KAAM,EAAE,KAAA,CAAA,IAAA,CAAW,CAAA,GAAI,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAA;AACpE;AAEO,SAAS,eAAA,CACd,SAAA,EACA,iBAAA,EACA,MAAA,EACqB;AACrB,EAAA,MAAM,GAAA,GAAM,YAAA,CAAa,SAAA,EAAW,iBAAA,EAAmB,MAAM,CAAA;AAC7D,EAAA,IAAI,GAAA,KAAQ,CAAA,EAAG,OAAO,EAAC;AAEvB,EAAA,MAAM,CAAA,GAAI,YAAY,SAAA,EAAW,EAAE,KAAK,CAAA,EAAG,KAAA,EAAO,aAAa,CAAA;AAC/D,EAAA,MAAM,CAAA,GAAI,WAAA,CAAY,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,eAAA,EAAiB,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,CAAA;AAC9F,EAAA,MAAM,IAAA,GAAO,YAAY,iBAAA,EAAmB,EAAE,KAAK,CAAA,EAAG,KAAA,EAAO,eAAe,CAAA;AAC5E,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,MAAM,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,EAAC;AAExC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,GAAA,GAAM,EAAA;AAC7B,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,IAAI,UAAU,CAAA,CAAE,KAAA;AAEhB,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,CAAA,CAAE,OAAO,KAAA,EAAA,EAAS;AAC7C,IAAA,MAAM,WAAW,OAAA,GAAU,CAAA;AAC3B,IAAA,MAAM,mBAAmB,GAAA,GAAM,QAAA;AAC/B,IAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,GAAU,gBAAgB,CAAA;AAChD,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,KAAA;AAAA,MACA,OAAA,EAAS,GAAA;AAAA,MACT,SAAA,EAAW,gBAAA;AAAA,MACX,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT;;;AC7BO,SAAS,oBACd,MAAA,EACgC;AAChC,EAAA,OAAO,OAAO,KAAA,KAAU,IAAA;AAC1B;AAEO,SAAS,oBACd,MAAA,EAC6B;AAC7B,EAAA,OAAO,OAAO,KAAA,KAAU,KAAA;AAC1B","file":"index.mjs","sourcesContent":["export const MAX_SAFE_INPUT_LENGTH = 256\n\nexport function guardStringInput(\n input: unknown,\n label = 'Input'\n): { ok: true; value: string } | { ok: false; error: string } {\n if (input == null || typeof input !== 'string') {\n return { ok: false, error: `${label} must be a non-empty string` }\n }\n if (input.length === 0) {\n return { ok: false, error: `${label} must be a non-empty string` }\n }\n if (input.length > MAX_SAFE_INPUT_LENGTH) {\n return {\n ok: false,\n error: `${label} must not exceed ${MAX_SAFE_INPUT_LENGTH} characters`,\n }\n }\n return { ok: true, value: input }\n}\n\nexport function guardNumber(\n value: unknown,\n options: { min?: number; max?: number; integer?: boolean; label?: string }\n): { ok: true; value: number } | { ok: false; error: string } {\n const label = options.label ?? 'Value'\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return { ok: false, error: `${label} must be a finite number` }\n }\n if (Number.isNaN(value)) {\n return { ok: false, error: `${label} must not be NaN` }\n }\n if (options.integer && !Number.isInteger(value)) {\n return { ok: false, error: `${label} must be an integer` }\n }\n if (options.min !== undefined && value < options.min) {\n return { ok: false, error: `${label} must be at least ${options.min}` }\n }\n if (options.max !== undefined && value > options.max) {\n return { ok: false, error: `${label} must be at most ${options.max}` }\n }\n return { ok: true, value }\n}\n","import type { IBAN, IBANValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst IBAN_LENGTHS: Record<string, number> = {\n AL: 28, AD: 24, AT: 20, AZ: 28, BH: 22, BE: 16, BA: 20, BR: 29,\n BG: 22, CR: 22, HR: 21, CY: 28, CZ: 24, DK: 18, DO: 28, EE: 20,\n FI: 18, FR: 27, GE: 22, DE: 22, GI: 23, GR: 27, GT: 28, HU: 28,\n IS: 26, IE: 22, IL: 23, IT: 27, JO: 30, KZ: 20, KW: 30, LV: 21,\n LB: 28, LI: 21, LT: 20, LU: 20, MK: 19, MT: 31, MR: 27, MU: 30,\n MC: 27, MD: 24, ME: 22, NL: 18, NO: 15, PK: 24, PS: 29, PL: 28,\n PT: 25, QA: 29, RO: 24, SM: 27, SA: 24, RS: 22, SK: 24, SI: 19,\n ES: 24, SE: 24, CH: 21, TN: 24, TR: 26, AE: 23, GB: 22, VG: 24,\n}\n\nconst LETTER_A = 'A'.codePointAt(0)!\nconst LETTER_Z = 'Z'.codePointAt(0)!\nconst LETTER_TO_DIGIT_OFFSET = 55\n\nfunction mod97(value: string): number {\n return [...value].reduce(\n (remainder, char) => (remainder * 10 + Number.parseInt(char, 10)) % 97,\n 0\n )\n}\n\nfunction ibanToDigits(iban: string): string {\n const rearranged = iban.slice(4) + iban.slice(0, 4)\n return [...rearranged]\n .map((char) => {\n const code = char.codePointAt(0) ?? 0\n return code >= LETTER_A && code <= LETTER_Z\n ? (code - LETTER_TO_DIGIT_OFFSET).toString()\n : char\n })\n .join('')\n}\n\nfunction formatIBANString(iban: string): string {\n return iban.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function formatIBAN(input: string): string {\n if (typeof input !== 'string') return ''\n const cleaned = input.replace(/\\s/g, '').toUpperCase().slice(0, 34)\n return formatIBANString(cleaned)\n}\n\nexport function validateIBAN(input: string): IBANValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'IBAN is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n if (!/^[A-Z]{2}$/.test(countryCode)) {\n return { valid: false, error: 'IBAN must start with a 2-letter country code' }\n }\n\n const expectedLength = IBAN_LENGTHS[countryCode]\n\n if (!expectedLength) {\n return { valid: false, error: `Unsupported country code: ${countryCode}` }\n }\n\n if (cleaned.length !== expectedLength) {\n return {\n valid: false,\n error: `Invalid length for ${countryCode} IBAN. Expected ${expectedLength} characters, got ${cleaned.length}`,\n }\n }\n\n if (!/^[A-Z0-9]+$/.test(cleaned)) {\n return { valid: false, error: 'IBAN contains invalid characters' }\n }\n\n const digits = ibanToDigits(cleaned)\n\n if (mod97(digits) !== 1) {\n return { valid: false, error: 'IBAN checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as IBAN,\n formatted: formatIBANString(cleaned),\n countryCode,\n }\n}\n","import type { SortCode, AccountNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport function formatSortCode(input: string): string {\n if (typeof input !== 'string') return ''\n const digits = input.replace(/[-\\s]/g, '').slice(0, 6)\n if (digits.length < 6) return digits\n return `${digits.slice(0, 2)}-${digits.slice(2, 4)}-${digits.slice(4, 6)}`\n}\n\nexport function formatUKAccountNumber(input: string): string {\n if (typeof input !== 'string') return ''\n const digits = input.replace(/\\s/g, '').slice(0, 8)\n if (digits.length < 8) return digits\n return `${digits.slice(0, 4)} ${digits.slice(4, 8)}`\n}\n\nexport function validateUKSortCode(input: string): ValidationResult<SortCode> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/[-\\s]/g, '')\n\n if (!/^\\d{6}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'Sort code must be exactly 6 digits. Accepted formats: 60-16-13, 601613, 60 16 13',\n }\n }\n\n const formatted = `${cleaned.slice(0, 2)}-${cleaned.slice(2, 4)}-${cleaned.slice(4, 6)}`\n\n return {\n valid: true,\n value: cleaned as SortCode,\n formatted,\n }\n}\n\nexport function validateUKAccountNumber(input: string): ValidationResult<AccountNumber> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '')\n\n if (!/^\\d{8}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'UK account number must be exactly 8 digits',\n }\n }\n\n const formatted = `${cleaned.slice(0, 4)} ${cleaned.slice(4, 8)}`\n\n return {\n valid: true,\n value: cleaned as AccountNumber,\n formatted,\n }\n}\n","import type { CurrencyCode, SupportedCurrency, MoneyResult, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport const SUPPORTED_CURRENCIES: SupportedCurrency[] = [\n 'GBP', 'EUR', 'USD', 'JPY', 'CHF', 'CAD', 'AUD', 'NZD',\n]\n\nconst CURRENCY_LOCALES: Record<SupportedCurrency, string> = {\n GBP: 'en-GB',\n EUR: 'de-DE',\n USD: 'en-US',\n JPY: 'ja-JP',\n CHF: 'de-CH',\n CAD: 'en-CA',\n AUD: 'en-AU',\n NZD: 'en-NZ',\n}\n\nconst SYMBOL_MAP: Record<string, SupportedCurrency> = {\n '£': 'GBP',\n '€': 'EUR',\n '$': 'USD',\n '¥': 'JPY',\n 'CHF': 'CHF',\n}\n\nexport function validateCurrencyCode(input: string): ValidationResult<CurrencyCode> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const upper = guarded.value.toUpperCase() as SupportedCurrency\n\n if (!SUPPORTED_CURRENCIES.includes(upper)) {\n return {\n valid: false,\n error: `Unsupported currency code: ${upper}. Supported: ${SUPPORTED_CURRENCIES.join(', ')}`,\n }\n }\n\n return {\n valid: true,\n value: upper as CurrencyCode,\n formatted: upper,\n }\n}\n\nexport function formatCurrency(\n amount: number,\n currency: SupportedCurrency,\n locale?: string\n): string {\n if (typeof amount !== 'number' || !Number.isFinite(amount)) {\n return ''\n }\n const resolvedLocale = locale ?? CURRENCY_LOCALES[currency] ?? 'en-GB'\n return new Intl.NumberFormat(resolvedLocale, {\n style: 'currency',\n currency,\n minimumFractionDigits: currency === 'JPY' ? 0 : 2,\n maximumFractionDigits: currency === 'JPY' ? 0 : 2,\n }).format(amount)\n}\n\nexport function parseMoney(input: string): MoneyResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n let currency: SupportedCurrency | undefined\n let cleaned = guarded.value.trim()\n\n for (const [symbol, code] of Object.entries(SYMBOL_MAP)) {\n if (cleaned.startsWith(symbol) || cleaned.endsWith(symbol)) {\n currency = code\n cleaned = cleaned.replace(symbol, '').trim()\n break\n }\n }\n\n if (!currency) {\n return { valid: false, error: 'Could not detect currency from input. Expected a symbol like £, €, $, ¥' }\n }\n\n const normalised = cleaned.replace(/,/g, '')\n const amount = Number.parseFloat(normalised)\n\n if (Number.isNaN(amount)) {\n return { valid: false, error: `Could not parse amount from: \"${cleaned}\"` }\n }\n\n return {\n valid: true,\n amount,\n currency,\n formatted: formatCurrency(amount, currency),\n }\n}\n","import type { BIC, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst BIC_REGEX = /^[A-Z]{4}[A-Z]{2}[A-Z0-9]{2}([A-Z0-9]{3})?$/\n\nexport function validateBIC(input: string): ValidationResult<BIC> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length !== 8 && cleaned.length !== 11) {\n return {\n valid: false,\n error: `BIC must be 8 or 11 characters. Got ${cleaned.length}`,\n }\n }\n\n if (!BIC_REGEX.test(cleaned)) {\n return {\n valid: false,\n error: 'Invalid BIC format. Expected: 4 letters + 2 letters + 2 alphanumeric + optional 3 alphanumeric',\n }\n }\n\n const bankCode = cleaned.slice(0, 4)\n const countryCode = cleaned.slice(4, 6)\n const location = cleaned.slice(6, 8)\n const branch = cleaned.length === 11 ? cleaned.slice(8, 11) : 'XXX'\n\n return {\n valid: true,\n value: cleaned as BIC,\n formatted: `${bankCode} ${countryCode} ${location} ${branch}`,\n }\n}\n","import type { CardNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nexport type CardNetwork = 'Visa' | 'Mastercard' | 'Amex' | 'Discover' | 'Unknown'\n\nexport type CardValidationResult =\n | { valid: true; value: CardNumber; formatted: string; network: CardNetwork; last4: string }\n | { valid: false; error: string }\n\nfunction detectNetwork(digits: string): CardNetwork {\n if (/^4/.test(digits)) return 'Visa'\n if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits)) return 'Mastercard'\n if (/^3[47]/.test(digits)) return 'Amex'\n if (/^6(?:011|5)/.test(digits)) return 'Discover'\n return 'Unknown'\n}\n\nfunction formatCardNumber(digits: string, network: CardNetwork): string {\n if (network === 'Amex') {\n return `${digits.slice(0, 4)} ${digits.slice(4, 10)} ${digits.slice(10, 15)}`\n }\n return digits.replace(/(.{4})/g, '$1 ').trim()\n}\n\nexport function validateCardNumber(input: string): CardValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const digits = guarded.value.replace(/[\\s-]/g, '')\n\n if (!/^\\d+$/.test(digits)) {\n return { valid: false, error: 'Card number must contain only digits' }\n }\n\n if (digits.length < 13 || digits.length > 19) {\n return {\n valid: false,\n error: `Card number length invalid. Expected 13-19 digits, got ${digits.length}`,\n }\n }\n\n let sum = 0\n let shouldDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number.parseInt(digits[i]!, 10)\n if (shouldDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n shouldDouble = !shouldDouble\n }\n\n if (sum % 10 !== 0) {\n return { valid: false, error: 'Card number failed Luhn check — this is not a valid card number' }\n }\n\n const network = detectNetwork(digits)\n\n return {\n valid: true,\n value: digits as CardNumber,\n formatted: formatCardNumber(digits, network),\n network,\n last4: digits.slice(-4),\n }\n}\n","import type { VATNumber, VATValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nconst EU_VAT_PATTERNS: Record<string, RegExp> = {\n AT: /^ATU\\d{8}$/,\n BE: /^BE0?\\d{9}$/,\n BG: /^BG\\d{9,10}$/,\n CY: /^CY\\d{8}[A-Z]$/,\n CZ: /^CZ\\d{8,10}$/,\n DE: /^DE\\d{9}$/,\n DK: /^DK\\d{8}$/,\n EE: /^EE\\d{9}$/,\n EL: /^EL\\d{9}$/,\n ES: /^ES[A-Z0-9]\\d{7}[A-Z0-9]$/,\n FI: /^FI\\d{8}$/,\n FR: /^FR[A-HJ-NP-Z0-9]{2}\\d{9}$/,\n GR: /^GR\\d{9}$/,\n HR: /^HR\\d{11}$/,\n HU: /^HU\\d{8}$/,\n IE: /^IE\\d[A-Z0-9]\\d{5}[A-Z]$|^IE\\d{7}[A-W][A-I0-9]?$/,\n IT: /^IT\\d{11}$/,\n LT: /^LT\\d{9}$|^LT\\d{12}$/,\n LU: /^LU\\d{8}$/,\n LV: /^LV\\d{11}$/,\n MT: /^MT\\d{8}$/,\n NL: /^NL\\d{9}B\\d{2}$/,\n PL: /^PL\\d{10}$/,\n PT: /^PT\\d{9}$/,\n RO: /^RO\\d{2,10}$/,\n SE: /^SE\\d{12}$/,\n SI: /^SI\\d{8}$/,\n SK: /^SK\\d{10}$/,\n}\n\nexport function validateEUVAT(input: string): VATValidationResult {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '').toUpperCase()\n\n if (cleaned.length < 4) {\n return { valid: false, error: 'VAT number is too short' }\n }\n\n const countryCode = cleaned.slice(0, 2)\n\n const pattern = EU_VAT_PATTERNS[countryCode]\n if (!pattern) {\n return { valid: false, error: `Unsupported EU VAT country code: ${countryCode}` }\n }\n\n if (!pattern.test(cleaned)) {\n return { valid: false, error: `Invalid VAT format for ${countryCode}` }\n }\n\n const formatted = `${countryCode} ${cleaned.slice(2)}`\n\n return {\n valid: true,\n value: cleaned as VATNumber,\n formatted,\n countryCode,\n }\n}\n","import type { RoutingNumber, ValidationResult } from './types'\nimport { guardStringInput } from './_guard'\n\nfunction routingChecksum(digits: string): boolean {\n if (digits.length !== 9) return false\n const sum =\n 3 * (Number(digits[0]) + Number(digits[3]) + Number(digits[6])) +\n 7 * (Number(digits[1]) + Number(digits[4]) + Number(digits[7])) +\n Number(digits[2]) + Number(digits[5]) + Number(digits[8])\n return sum % 10 === 0\n}\n\nexport function validateUSRoutingNumber(input: string): ValidationResult<RoutingNumber> {\n const guarded = guardStringInput(input)\n if (!guarded.ok) return { valid: false, error: guarded.error }\n\n const cleaned = guarded.value.replace(/\\s/g, '')\n\n if (!/^\\d{9}$/.test(cleaned)) {\n return {\n valid: false,\n error: 'US routing number must be exactly 9 digits',\n }\n }\n\n if (!routingChecksum(cleaned)) {\n return { valid: false, error: 'US routing number checksum is invalid' }\n }\n\n return {\n valid: true,\n value: cleaned as RoutingNumber,\n formatted: cleaned,\n }\n}\n","import { guardNumber } from './_guard'\n\nexport type LoanScheduleEntry = {\n month: number\n payment: number\n principal: number\n interest: number\n balance: number\n}\n\nconst MAX_LOAN_MONTHS = 3600\n\nexport function calculateEMI(\n principal: number,\n annualRatePercent: number,\n months: number\n): number {\n const p = guardNumber(principal, { min: 0, label: 'Principal' })\n const m = guardNumber(months, { min: 1, max: MAX_LOAN_MONTHS, integer: true, label: 'Months' })\n const rate = guardNumber(annualRatePercent, { min: 0, label: 'Annual rate' })\n if (!p.ok || !m.ok || !rate.ok) return 0\n\n if (rate.value === 0) return p.value / m.value\n const r = rate.value / 100 / 12\n return p.value * (r * (1 + r) ** m.value) / ((1 + r) ** m.value - 1)\n}\n\nexport function getLoanSchedule(\n principal: number,\n annualRatePercent: number,\n months: number\n): LoanScheduleEntry[] {\n const emi = calculateEMI(principal, annualRatePercent, months)\n if (emi === 0) return []\n\n const p = guardNumber(principal, { min: 0, label: 'Principal' })\n const m = guardNumber(months, { min: 1, max: MAX_LOAN_MONTHS, integer: true, label: 'Months' })\n const rate = guardNumber(annualRatePercent, { min: 0, label: 'Annual rate' })\n if (!p.ok || !m.ok || !rate.ok) return []\n\n const r = rate.value / 100 / 12\n const schedule: LoanScheduleEntry[] = []\n let balance = p.value\n\n for (let month = 1; month <= m.value; month++) {\n const interest = balance * r\n const principalPayment = emi - interest\n balance = Math.max(0, balance - principalPayment)\n schedule.push({\n month,\n payment: emi,\n principal: principalPayment,\n interest,\n balance,\n })\n }\n\n return schedule\n}\n","declare const __brand: unique symbol\ntype Brand<T, B> = T & { readonly [__brand]: B }\n\nexport type IBAN = Brand<string, 'IBAN'>\nexport type SortCode = Brand<string, 'SortCode'>\nexport type AccountNumber = Brand<string, 'AccountNumber'>\nexport type CurrencyCode = Brand<string, 'CurrencyCode'>\nexport type BIC = Brand<string, 'BIC'>\nexport type CardNumber = Brand<string, 'CardNumber'>\nexport type VATNumber = Brand<string, 'VATNumber'>\nexport type RoutingNumber = Brand<string, 'RoutingNumber'>\n\nexport type SupportedCurrency =\n | 'GBP' | 'EUR' | 'USD' | 'JPY'\n | 'CHF' | 'CAD' | 'AUD' | 'NZD'\n\nexport type ValidationSuccess<T> = {\n valid: true\n value: T\n formatted: string\n}\n\nexport type ValidationFailure = {\n valid: false\n error: string\n}\n\nexport type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure\n\nexport function isValidationSuccess<T>(\n result: ValidationResult<T>\n): result is ValidationSuccess<T> {\n return result.valid === true\n}\n\nexport function isValidationFailure<T>(\n result: ValidationResult<T>\n): result is ValidationFailure {\n return result.valid === false\n}\n\nexport type IBANValidationSuccess = ValidationSuccess<IBAN> & { countryCode: string }\nexport type IBANValidationResult = IBANValidationSuccess | ValidationFailure\n\nexport type MoneyResult =\n | { valid: true; amount: number; currency: SupportedCurrency; formatted: string }\n | { valid: false; error: string }\n\nexport type VATValidationSuccess = ValidationSuccess<VATNumber> & { countryCode: string }\nexport type VATValidationResult = VATValidationSuccess | ValidationFailure\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PipeTransform } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
type StringValidator = (val: string) => {
|
|
4
|
+
valid: boolean;
|
|
5
|
+
value?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
};
|
|
8
|
+
declare const IbanValidationPipe: new () => PipeTransform<string, string>;
|
|
9
|
+
declare const SortCodeValidationPipe: new () => PipeTransform<string, string>;
|
|
10
|
+
declare const AccountNumberValidationPipe: new () => PipeTransform<string, string>;
|
|
11
|
+
declare const BicValidationPipe: new () => PipeTransform<string, string>;
|
|
12
|
+
declare const CardNumberValidationPipe: new () => PipeTransform<string, string>;
|
|
13
|
+
declare const VatValidationPipe: new () => PipeTransform<string, string>;
|
|
14
|
+
declare const RoutingNumberValidationPipe: new () => PipeTransform<string, string>;
|
|
15
|
+
declare const CurrencyCodeValidationPipe: new () => PipeTransform<string, string>;
|
|
16
|
+
declare function createValidationPipe(validator: StringValidator): new () => PipeTransform<string, string>;
|
|
17
|
+
|
|
18
|
+
export { AccountNumberValidationPipe, BicValidationPipe, CardNumberValidationPipe, CurrencyCodeValidationPipe, IbanValidationPipe, RoutingNumberValidationPipe, SortCodeValidationPipe, VatValidationPipe, createValidationPipe };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PipeTransform } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
type StringValidator = (val: string) => {
|
|
4
|
+
valid: boolean;
|
|
5
|
+
value?: string;
|
|
6
|
+
error?: string;
|
|
7
|
+
};
|
|
8
|
+
declare const IbanValidationPipe: new () => PipeTransform<string, string>;
|
|
9
|
+
declare const SortCodeValidationPipe: new () => PipeTransform<string, string>;
|
|
10
|
+
declare const AccountNumberValidationPipe: new () => PipeTransform<string, string>;
|
|
11
|
+
declare const BicValidationPipe: new () => PipeTransform<string, string>;
|
|
12
|
+
declare const CardNumberValidationPipe: new () => PipeTransform<string, string>;
|
|
13
|
+
declare const VatValidationPipe: new () => PipeTransform<string, string>;
|
|
14
|
+
declare const RoutingNumberValidationPipe: new () => PipeTransform<string, string>;
|
|
15
|
+
declare const CurrencyCodeValidationPipe: new () => PipeTransform<string, string>;
|
|
16
|
+
declare function createValidationPipe(validator: StringValidator): new () => PipeTransform<string, string>;
|
|
17
|
+
|
|
18
|
+
export { AccountNumberValidationPipe, BicValidationPipe, CardNumberValidationPipe, CurrencyCodeValidationPipe, IbanValidationPipe, RoutingNumberValidationPipe, SortCodeValidationPipe, VatValidationPipe, createValidationPipe };
|