@ducatjs/money 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.
- package/LICENSE +21 -0
- package/NOTICE +51 -0
- package/README.md +617 -3
- package/assets/CREDITS.md +12 -0
- package/data/adyen-fx.json +19 -0
- package/data/adyen.json +171 -0
- package/data/braintree.json +223 -0
- package/data/cash-rounding.json +399 -0
- package/data/checkout.json +230 -0
- package/data/iso4217-list-one.xml +1956 -0
- package/data/klarna.json +95 -0
- package/data/paypal.json +65 -0
- package/data/stripe-fx.json +17 -0
- package/data/stripe.json +285 -0
- package/dist/adyen-fx.d.ts +25 -0
- package/dist/adyen-fx.d.ts.map +1 -0
- package/dist/adyen-fx.js +122 -0
- package/dist/adyen-fx.js.map +1 -0
- package/dist/adyen.d.ts +25 -0
- package/dist/adyen.d.ts.map +1 -0
- package/dist/adyen.js +34 -0
- package/dist/adyen.js.map +1 -0
- package/dist/allocate.d.ts +72 -0
- package/dist/allocate.d.ts.map +1 -0
- package/dist/allocate.js +314 -0
- package/dist/allocate.js.map +1 -0
- package/dist/bag.d.ts +58 -0
- package/dist/bag.d.ts.map +1 -0
- package/dist/bag.js +122 -0
- package/dist/bag.js.map +1 -0
- package/dist/braintree.d.ts +34 -0
- package/dist/braintree.d.ts.map +1 -0
- package/dist/braintree.js +45 -0
- package/dist/braintree.js.map +1 -0
- package/dist/cash.d.ts +35 -0
- package/dist/cash.d.ts.map +1 -0
- package/dist/cash.js +86 -0
- package/dist/cash.js.map +1 -0
- package/dist/checkout.d.ts +42 -0
- package/dist/checkout.d.ts.map +1 -0
- package/dist/checkout.js +52 -0
- package/dist/checkout.js.map +1 -0
- package/dist/convert.d.ts +51 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +55 -0
- package/dist/convert.js.map +1 -0
- package/dist/currency.d.ts +22 -0
- package/dist/currency.d.ts.map +1 -0
- package/dist/currency.js +38 -0
- package/dist/currency.js.map +1 -0
- package/dist/decimal.d.ts +52 -0
- package/dist/decimal.d.ts.map +1 -0
- package/dist/decimal.js +251 -0
- package/dist/decimal.js.map +1 -0
- package/dist/ecb.d.ts +17 -0
- package/dist/ecb.d.ts.map +1 -0
- package/dist/ecb.js +147 -0
- package/dist/ecb.js.map +1 -0
- package/dist/exact.d.ts +62 -0
- package/dist/exact.d.ts.map +1 -0
- package/dist/exact.js +147 -0
- package/dist/exact.js.map +1 -0
- package/dist/fetch.d.ts +58 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +79 -0
- package/dist/fetch.js.map +1 -0
- package/dist/fixed.d.ts +121 -0
- package/dist/fixed.d.ts.map +1 -0
- package/dist/fixed.js +420 -0
- package/dist/fixed.js.map +1 -0
- package/dist/fn.d.ts +27 -0
- package/dist/fn.d.ts.map +1 -0
- package/dist/fn.js +30 -0
- package/dist/fn.js.map +1 -0
- package/dist/format.d.ts +13 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +90 -0
- package/dist/format.js.map +1 -0
- package/dist/generated/adyen.d.ts +3 -0
- package/dist/generated/adyen.d.ts.map +1 -0
- package/dist/generated/adyen.js +144 -0
- package/dist/generated/adyen.js.map +1 -0
- package/dist/generated/braintree.d.ts +3 -0
- package/dist/generated/braintree.d.ts.map +1 -0
- package/dist/generated/braintree.js +140 -0
- package/dist/generated/braintree.js.map +1 -0
- package/dist/generated/cash.d.ts +12 -0
- package/dist/generated/cash.d.ts.map +1 -0
- package/dist/generated/cash.js +364 -0
- package/dist/generated/cash.js.map +1 -0
- package/dist/generated/checkout.d.ts +3 -0
- package/dist/generated/checkout.d.ts.map +1 -0
- package/dist/generated/checkout.js +151 -0
- package/dist/generated/checkout.js.map +1 -0
- package/dist/generated/iso4217.d.ts +174 -0
- package/dist/generated/iso4217.d.ts.map +1 -0
- package/dist/generated/iso4217.js +175 -0
- package/dist/generated/iso4217.js.map +1 -0
- package/dist/generated/kernel.d.ts +17 -0
- package/dist/generated/kernel.d.ts.map +1 -0
- package/dist/generated/kernel.js +208 -0
- package/dist/generated/kernel.js.map +1 -0
- package/dist/generated/klarna.d.ts +3 -0
- package/dist/generated/klarna.d.ts.map +1 -0
- package/dist/generated/klarna.js +21 -0
- package/dist/generated/klarna.js.map +1 -0
- package/dist/generated/paypal.d.ts +3 -0
- package/dist/generated/paypal.d.ts.map +1 -0
- package/dist/generated/paypal.js +31 -0
- package/dist/generated/paypal.js.map +1 -0
- package/dist/generated/stripe.d.ts +8 -0
- package/dist/generated/stripe.d.ts.map +1 -0
- package/dist/generated/stripe.js +150 -0
- package/dist/generated/stripe.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/klarna.d.ts +31 -0
- package/dist/klarna.d.ts.map +1 -0
- package/dist/klarna.js +38 -0
- package/dist/klarna.js.map +1 -0
- package/dist/money.d.ts +218 -0
- package/dist/money.d.ts.map +1 -0
- package/dist/money.js +577 -0
- package/dist/money.js.map +1 -0
- package/dist/parse.d.ts +11 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +132 -0
- package/dist/parse.js.map +1 -0
- package/dist/paypal.d.ts +41 -0
- package/dist/paypal.d.ts.map +1 -0
- package/dist/paypal.js +58 -0
- package/dist/paypal.js.map +1 -0
- package/dist/plugins/adyen.d.ts +15 -0
- package/dist/plugins/adyen.d.ts.map +1 -0
- package/dist/plugins/adyen.js +10 -0
- package/dist/plugins/adyen.js.map +1 -0
- package/dist/plugins/all.d.ts +22 -0
- package/dist/plugins/all.d.ts.map +1 -0
- package/dist/plugins/all.js +23 -0
- package/dist/plugins/all.js.map +1 -0
- package/dist/plugins/allocate.d.ts +20 -0
- package/dist/plugins/allocate.d.ts.map +1 -0
- package/dist/plugins/allocate.js +26 -0
- package/dist/plugins/allocate.js.map +1 -0
- package/dist/plugins/braintree.d.ts +12 -0
- package/dist/plugins/braintree.d.ts.map +1 -0
- package/dist/plugins/braintree.js +12 -0
- package/dist/plugins/braintree.js.map +1 -0
- package/dist/plugins/cash.d.ts +19 -0
- package/dist/plugins/cash.d.ts.map +1 -0
- package/dist/plugins/cash.js +16 -0
- package/dist/plugins/cash.js.map +1 -0
- package/dist/plugins/checkout.d.ts +21 -0
- package/dist/plugins/checkout.d.ts.map +1 -0
- package/dist/plugins/checkout.js +16 -0
- package/dist/plugins/checkout.js.map +1 -0
- package/dist/plugins/convert.d.ts +20 -0
- package/dist/plugins/convert.d.ts.map +1 -0
- package/dist/plugins/convert.js +13 -0
- package/dist/plugins/convert.js.map +1 -0
- package/dist/plugins/exact.d.ts +15 -0
- package/dist/plugins/exact.d.ts.map +1 -0
- package/dist/plugins/exact.js +13 -0
- package/dist/plugins/exact.js.map +1 -0
- package/dist/plugins/fixed.d.ts +17 -0
- package/dist/plugins/fixed.d.ts.map +1 -0
- package/dist/plugins/fixed.js +13 -0
- package/dist/plugins/fixed.js.map +1 -0
- package/dist/plugins/format.d.ts +9 -0
- package/dist/plugins/format.d.ts.map +1 -0
- package/dist/plugins/format.js +16 -0
- package/dist/plugins/format.js.map +1 -0
- package/dist/plugins/klarna.d.ts +10 -0
- package/dist/plugins/klarna.d.ts.map +1 -0
- package/dist/plugins/klarna.js +10 -0
- package/dist/plugins/klarna.js.map +1 -0
- package/dist/plugins/paypal.d.ts +14 -0
- package/dist/plugins/paypal.d.ts.map +1 -0
- package/dist/plugins/paypal.js +16 -0
- package/dist/plugins/paypal.js.map +1 -0
- package/dist/plugins/prisma.d.ts +8 -0
- package/dist/plugins/prisma.d.ts.map +1 -0
- package/dist/plugins/prisma.js +13 -0
- package/dist/plugins/prisma.js.map +1 -0
- package/dist/plugins/stripe.d.ts +14 -0
- package/dist/plugins/stripe.d.ts.map +1 -0
- package/dist/plugins/stripe.js +16 -0
- package/dist/plugins/stripe.js.map +1 -0
- package/dist/plugins/tax.d.ts +21 -0
- package/dist/plugins/tax.d.ts.map +1 -0
- package/dist/plugins/tax.js +18 -0
- package/dist/plugins/tax.js.map +1 -0
- package/dist/prisma.d.ts +66 -0
- package/dist/prisma.d.ts.map +1 -0
- package/dist/prisma.js +66 -0
- package/dist/prisma.js.map +1 -0
- package/dist/processor.d.ts +28 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +118 -0
- package/dist/processor.js.map +1 -0
- package/dist/provider.d.ts +89 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +240 -0
- package/dist/provider.js.map +1 -0
- package/dist/rate.d.ts +119 -0
- package/dist/rate.d.ts.map +1 -0
- package/dist/rate.js +271 -0
- package/dist/rate.js.map +1 -0
- package/dist/rounding-error.d.ts +9 -0
- package/dist/rounding-error.d.ts.map +1 -0
- package/dist/rounding-error.js +9 -0
- package/dist/rounding-error.js.map +1 -0
- package/dist/rounding.d.ts +50 -0
- package/dist/rounding.d.ts.map +1 -0
- package/dist/rounding.js +87 -0
- package/dist/rounding.js.map +1 -0
- package/dist/stripe-fx.d.ts +22 -0
- package/dist/stripe-fx.d.ts.map +1 -0
- package/dist/stripe-fx.js +30 -0
- package/dist/stripe-fx.js.map +1 -0
- package/dist/stripe.d.ts +36 -0
- package/dist/stripe.d.ts.map +1 -0
- package/dist/stripe.js +39 -0
- package/dist/stripe.js.map +1 -0
- package/dist/tax.d.ts +29 -0
- package/dist/tax.d.ts.map +1 -0
- package/dist/tax.js +39 -0
- package/dist/tax.js.map +1 -0
- package/package.json +169 -5
- package/src/adyen-fx.ts +154 -0
- package/src/adyen.ts +46 -0
- package/src/allocate.ts +393 -0
- package/src/bag.ts +170 -0
- package/src/braintree.ts +71 -0
- package/src/cash.ts +115 -0
- package/src/checkout.ts +77 -0
- package/src/convert.ts +159 -0
- package/src/currency.ts +61 -0
- package/src/decimal.ts +283 -0
- package/src/ecb.ts +162 -0
- package/src/exact.ts +182 -0
- package/src/fetch.ts +127 -0
- package/src/fixed.ts +558 -0
- package/src/fn.ts +80 -0
- package/src/format.ts +106 -0
- package/src/generated/adyen.ts +144 -0
- package/src/generated/braintree.ts +140 -0
- package/src/generated/cash.ts +375 -0
- package/src/generated/checkout.ts +151 -0
- package/src/generated/iso4217.ts +179 -0
- package/src/generated/kernel.ts +230 -0
- package/src/generated/klarna.ts +21 -0
- package/src/generated/paypal.ts +31 -0
- package/src/generated/stripe.ts +150 -0
- package/src/index.ts +37 -0
- package/src/klarna.ts +54 -0
- package/src/money.ts +781 -0
- package/src/parse.ts +144 -0
- package/src/paypal.ts +93 -0
- package/src/plugins/adyen.ts +25 -0
- package/src/plugins/all.ts +47 -0
- package/src/plugins/allocate.ts +53 -0
- package/src/plugins/braintree.ts +23 -0
- package/src/plugins/cash.ts +33 -0
- package/src/plugins/checkout.ts +32 -0
- package/src/plugins/convert.ts +50 -0
- package/src/plugins/exact.ts +23 -0
- package/src/plugins/fixed.ts +28 -0
- package/src/plugins/format.ts +28 -0
- package/src/plugins/klarna.ts +21 -0
- package/src/plugins/paypal.ts +29 -0
- package/src/plugins/prisma.ts +24 -0
- package/src/plugins/stripe.ts +29 -0
- package/src/plugins/tax.ts +41 -0
- package/src/prisma.ts +118 -0
- package/src/processor.ts +181 -0
- package/src/provider.ts +324 -0
- package/src/rate.ts +377 -0
- package/src/rounding-error.ts +8 -0
- package/src/rounding.ts +122 -0
- package/src/stripe-fx.ts +49 -0
- package/src/stripe.ts +69 -0
- package/src/tax.ts +71 -0
package/dist/money.js
ADDED
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
import { currencyExponent } from './currency.js';
|
|
2
|
+
import { formatScaled, parseDecimal, parsePlainDecimal, POW10, pow10n, ratio, normalizeMinor, } from './decimal.js';
|
|
3
|
+
import { DEFAULT_ROUNDING, divideAndRound, divideAndRoundBigint, RoundingError, } from './rounding.js';
|
|
4
|
+
// A module-local constant, not an import: the hot loops (sum, add) read it on every iteration, and
|
|
5
|
+
// V8 reads an imported binding through an extra indirection.
|
|
6
|
+
const MAX_SAFE_MINOR = Number.MAX_SAFE_INTEGER;
|
|
7
|
+
/** Thrown when two amounts in different currencies are combined. */
|
|
8
|
+
export class CurrencyMismatchError extends TypeError {
|
|
9
|
+
name = 'CurrencyMismatchError';
|
|
10
|
+
constructor(expected, actual) {
|
|
11
|
+
super(`Currency mismatch: ${expected} vs ${actual}`);
|
|
12
|
+
this.expected = expected;
|
|
13
|
+
this.actual = actual;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* An immutable amount of money: an integer number of 10^-scale units of `currency`.
|
|
18
|
+
*
|
|
19
|
+
* `minor` is a JS number whenever it is a safe integer (|v| <= 2^53 - 1) and a bigint otherwise, so
|
|
20
|
+
* ordinary amounts never allocate a bigint, and huge or high-precision amounts never lose a digit.
|
|
21
|
+
* `scale` is normally the currency's ISO exponent (2 for EUR) but can be larger for sub-minor
|
|
22
|
+
* precision (unit prices, FX intermediates); `round()` brings it back.
|
|
23
|
+
*
|
|
24
|
+
* Instances are not frozen (Object.freeze costs 5-8x on construction in V8 and JSC; see bench/),
|
|
25
|
+
* but every field is readonly and no operation mutates. Create values with `money()` /
|
|
26
|
+
* `fromMinor()`.
|
|
27
|
+
*
|
|
28
|
+
* The class carries the core methods only. Opt-in modules (`@ducatjs/money/allocate`,
|
|
29
|
+
* `@ducatjs/money/tax`, `@ducatjs/money/format`, ...) add theirs when imported; see `extendMoney`.
|
|
30
|
+
*/
|
|
31
|
+
class Money {
|
|
32
|
+
/** @internal */
|
|
33
|
+
constructor(currency, minor, scale) {
|
|
34
|
+
this.currency = currency;
|
|
35
|
+
this.minor = minor;
|
|
36
|
+
this.scale = scale;
|
|
37
|
+
}
|
|
38
|
+
/** "12.34 EUR" */
|
|
39
|
+
toString() {
|
|
40
|
+
return `${formatScaled(this.minor, this.scale)} ${this.currency}`;
|
|
41
|
+
}
|
|
42
|
+
toJSON() {
|
|
43
|
+
return { amount: formatScaled(this.minor, this.scale), currency: this.currency };
|
|
44
|
+
}
|
|
45
|
+
/** Blocks `a + b`, `a > b`, `+a`: arithmetic and comparison must go through the library. */
|
|
46
|
+
[Symbol.toPrimitive](hint) {
|
|
47
|
+
if (hint === 'string') {
|
|
48
|
+
return this.toString();
|
|
49
|
+
}
|
|
50
|
+
throw new TypeError('Money cannot be converted to a number; use add(), compare(), toDecimal() etc.');
|
|
51
|
+
}
|
|
52
|
+
// Methods. Each one is a thin wrapper over the free function of the same name (also exported), so
|
|
53
|
+
// `a.add(b)` and `add(a, b)` are the same code. Operands are Money only: a bare number is never
|
|
54
|
+
// guessed to mean major or minor units.
|
|
55
|
+
// arithmetic
|
|
56
|
+
/** this + other (same currency; any scale) */
|
|
57
|
+
add(other) {
|
|
58
|
+
return add(this, other);
|
|
59
|
+
}
|
|
60
|
+
/** this - other */
|
|
61
|
+
subtract(other) {
|
|
62
|
+
return subtract(this, other);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* this * factor, rounded to this scale. `factor` is exact: integer, decimal string ('1.075'),
|
|
66
|
+
* bigint or ratio().
|
|
67
|
+
*/
|
|
68
|
+
multiply(factor, rounding) {
|
|
69
|
+
return multiply(this, factor, rounding);
|
|
70
|
+
}
|
|
71
|
+
/** this / divisor, rounded to this scale */
|
|
72
|
+
divide(divisor, rounding) {
|
|
73
|
+
return divide(this, divisor, rounding);
|
|
74
|
+
}
|
|
75
|
+
negate() {
|
|
76
|
+
return negate(this);
|
|
77
|
+
}
|
|
78
|
+
abs() {
|
|
79
|
+
return abs(this);
|
|
80
|
+
}
|
|
81
|
+
/** Rounds to the currency's exponent (or `scale`). */
|
|
82
|
+
round(rounding, scale) {
|
|
83
|
+
return round(this, rounding, scale);
|
|
84
|
+
}
|
|
85
|
+
/** Changes the scale; decreasing it rounds (default 'halfExpand'). */
|
|
86
|
+
toScale(scale, rounding) {
|
|
87
|
+
return toScale(this, scale, rounding);
|
|
88
|
+
}
|
|
89
|
+
// comparison
|
|
90
|
+
/** -1, 0 or 1; throws on currency mismatch */
|
|
91
|
+
compare(other) {
|
|
92
|
+
return compare(this, other);
|
|
93
|
+
}
|
|
94
|
+
/** same currency and value; a different currency is simply not equal */
|
|
95
|
+
equals(other) {
|
|
96
|
+
return equals(this, other);
|
|
97
|
+
}
|
|
98
|
+
lessThan(other) {
|
|
99
|
+
return compare(this, other) < 0;
|
|
100
|
+
}
|
|
101
|
+
lessThanOrEqual(other) {
|
|
102
|
+
return compare(this, other) <= 0;
|
|
103
|
+
}
|
|
104
|
+
greaterThan(other) {
|
|
105
|
+
return compare(this, other) > 0;
|
|
106
|
+
}
|
|
107
|
+
greaterThanOrEqual(other) {
|
|
108
|
+
return compare(this, other) >= 0;
|
|
109
|
+
}
|
|
110
|
+
isZero() {
|
|
111
|
+
return this.minor == 0;
|
|
112
|
+
}
|
|
113
|
+
isPositive() {
|
|
114
|
+
return this.minor > 0;
|
|
115
|
+
}
|
|
116
|
+
isNegative() {
|
|
117
|
+
return this.minor < 0;
|
|
118
|
+
}
|
|
119
|
+
sign() {
|
|
120
|
+
return sign(this);
|
|
121
|
+
}
|
|
122
|
+
min(...others) {
|
|
123
|
+
return min(this, ...others);
|
|
124
|
+
}
|
|
125
|
+
max(...others) {
|
|
126
|
+
return max(this, ...others);
|
|
127
|
+
}
|
|
128
|
+
clamp(lo, hi) {
|
|
129
|
+
return clamp(this, lo, hi);
|
|
130
|
+
}
|
|
131
|
+
// output
|
|
132
|
+
/** Exact decimal string in major units: "12.34" */
|
|
133
|
+
toDecimal() {
|
|
134
|
+
return formatScaled(this.minor, this.scale);
|
|
135
|
+
}
|
|
136
|
+
/** Minor units as a bigint (BIGINT columns) */
|
|
137
|
+
toMinor() {
|
|
138
|
+
return toBigInt(this.minor);
|
|
139
|
+
}
|
|
140
|
+
/** Minor units as a number; throws beyond 2^53 */
|
|
141
|
+
toMinorNumber() {
|
|
142
|
+
return toMinorNumber(this);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/** Whether a value is a Money from this package. */
|
|
146
|
+
export function isMoney(value) {
|
|
147
|
+
return value instanceof Money;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Which module installed each added method, so a second copy of the same module can replace its
|
|
151
|
+
* own.
|
|
152
|
+
*/
|
|
153
|
+
const methodOwners = new Map();
|
|
154
|
+
/**
|
|
155
|
+
* Names `extendMoney` refuses: the ones every object inherits, whose meaning other code relies on.
|
|
156
|
+
* `toLocaleString` is allowed, since a formatting module may want to provide it.
|
|
157
|
+
*/
|
|
158
|
+
const RESERVED_NAMES = new Set(Object.getOwnPropertyNames(Object.prototype).filter((name) => name !== 'toLocaleString'));
|
|
159
|
+
/**
|
|
160
|
+
* Adds methods to every Money (this is how `@ducatjs/money/allocate`, `@ducatjs/money/format`, ...
|
|
161
|
+
* install theirs). Declare their types with `declare module '@ducatjs/money' { interface Money<C
|
|
162
|
+
* extends string> { ... } }`. The methods are non-enumerable, like class methods. A name that Money
|
|
163
|
+
* already has (one of its own methods, or one added by a different owner) throws, so two modules
|
|
164
|
+
* cannot silently fight over it.
|
|
165
|
+
*/
|
|
166
|
+
export function extendMoney(methods, options) {
|
|
167
|
+
const prototype = Money.prototype;
|
|
168
|
+
const owner = options?.owner;
|
|
169
|
+
for (const name of Object.keys(methods)) {
|
|
170
|
+
const method = methods[name];
|
|
171
|
+
if (RESERVED_NAMES.has(name)) {
|
|
172
|
+
throw new TypeError(`Money#${name} is reserved`);
|
|
173
|
+
}
|
|
174
|
+
// Replacing an existing method would silently change behaviour for every caller, unless it is
|
|
175
|
+
// the same function or the same owner installing its own methods again.
|
|
176
|
+
const previousOwner = methodOwners.get(name);
|
|
177
|
+
const isOwnReinstall = owner !== undefined && previousOwner === owner;
|
|
178
|
+
if (Object.hasOwn(prototype, name) && prototype[name] !== method && !isOwnReinstall) {
|
|
179
|
+
throw new TypeError(`Money#${name} is already defined`);
|
|
180
|
+
}
|
|
181
|
+
// Non-enumerable, like the class's own methods, so Object.keys and spreads see only the fields.
|
|
182
|
+
Object.defineProperty(prototype, name, {
|
|
183
|
+
value: method,
|
|
184
|
+
writable: true,
|
|
185
|
+
configurable: true,
|
|
186
|
+
enumerable: false,
|
|
187
|
+
});
|
|
188
|
+
if (owner !== undefined) {
|
|
189
|
+
methodOwners.set(name, owner);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/** @internal construct from a value that may be an unsafe bigint */
|
|
194
|
+
export function make(currency, minor, scale) {
|
|
195
|
+
return new Money(currency, typeof minor === 'bigint' ? normalizeMinor(minor) : minor, scale);
|
|
196
|
+
}
|
|
197
|
+
const toBigInt = (minor) => (typeof minor === 'bigint' ? minor : BigInt(minor));
|
|
198
|
+
/** v * 10^e exactly (e >= 0) */
|
|
199
|
+
export function scaleUp(minor, exponent) {
|
|
200
|
+
if (exponent === 0) {
|
|
201
|
+
return minor;
|
|
202
|
+
}
|
|
203
|
+
if (typeof minor === 'number' && exponent <= 15) {
|
|
204
|
+
const scaled = minor * POW10[exponent];
|
|
205
|
+
if (scaled <= MAX_SAFE_MINOR && scaled >= -MAX_SAFE_MINOR) {
|
|
206
|
+
return scaled;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return normalizeMinor(toBigInt(minor) * pow10n(exponent));
|
|
210
|
+
}
|
|
211
|
+
/** v / 10^e rounded (e >= 0) */
|
|
212
|
+
export function scaleDown(minor, exponent, mode) {
|
|
213
|
+
if (exponent === 0) {
|
|
214
|
+
return minor;
|
|
215
|
+
}
|
|
216
|
+
if (typeof minor === 'number' && exponent <= 15) {
|
|
217
|
+
return divideAndRound(minor, POW10[exponent], mode);
|
|
218
|
+
}
|
|
219
|
+
return normalizeMinor(divideAndRoundBigint(toBigInt(minor), pow10n(exponent), mode));
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Creates money from an amount in major units.
|
|
223
|
+
*
|
|
224
|
+
* money('12.34', 'EUR') // exact decimal string: the recommended form
|
|
225
|
+
* money(12, 'EUR') // integers are major units: 12.00 EUR
|
|
226
|
+
* money(12.34, 'EUR') // non-integer numbers are read at their shortest decimal form ("12.34")
|
|
227
|
+
* money(10n ** 30n, 'USD')
|
|
228
|
+
*
|
|
229
|
+
* Throws if the amount has more decimals than the currency (or `scale`) unless `rounding` is given,
|
|
230
|
+
* so `money(0.1 + 0.2, 'EUR')` throws rather than silently becoming 0.30.
|
|
231
|
+
*/
|
|
232
|
+
export function money(amount, currency, options) {
|
|
233
|
+
const scale = options?.scale ?? currencyExponent(currency);
|
|
234
|
+
if (typeof amount === 'string') {
|
|
235
|
+
const parsed = parsePlainDecimal(amount) ?? parseDecimal(amount);
|
|
236
|
+
return fromScaled(currency, parsed.digits, parsed.scale, scale, options?.rounding ?? 'unnecessary', amount);
|
|
237
|
+
}
|
|
238
|
+
if (typeof amount === 'number') {
|
|
239
|
+
if (Number.isSafeInteger(amount)) {
|
|
240
|
+
return make(currency, scaleUp(amount, scale), scale);
|
|
241
|
+
}
|
|
242
|
+
if (!Number.isFinite(amount)) {
|
|
243
|
+
throw new RangeError(`Invalid amount ${amount}`);
|
|
244
|
+
}
|
|
245
|
+
const parsed = parseDecimal(String(amount));
|
|
246
|
+
return fromScaled(currency, parsed.digits, parsed.scale, scale, options?.rounding ?? 'unnecessary', amount);
|
|
247
|
+
}
|
|
248
|
+
if (typeof amount === 'bigint') {
|
|
249
|
+
return make(currency, scaleUp(normalizeMinor(amount), scale), scale);
|
|
250
|
+
}
|
|
251
|
+
throw new TypeError(`Invalid amount ${String(amount)}`);
|
|
252
|
+
}
|
|
253
|
+
function fromScaled(currency, digits, from, to, mode, input) {
|
|
254
|
+
if (typeof digits === 'bigint') {
|
|
255
|
+
digits = normalizeMinor(digits);
|
|
256
|
+
}
|
|
257
|
+
if (from === to) {
|
|
258
|
+
return new Money(currency, digits, to);
|
|
259
|
+
}
|
|
260
|
+
if (from < to) {
|
|
261
|
+
return make(currency, scaleUp(digits, to - from), to);
|
|
262
|
+
}
|
|
263
|
+
try {
|
|
264
|
+
return make(currency, scaleDown(digits, from - to, mode), to);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
if (error instanceof RoundingError) {
|
|
268
|
+
throw new RoundingError(`${String(input)} has more than ${to} decimal places for ${currency}; pass { rounding } or { scale }`);
|
|
269
|
+
}
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Creates money from an integer count of minor units (cents): `fromMinor(1234, 'EUR')` is 12.34
|
|
275
|
+
* EUR. This is the form to read from a BIGINT column or a payment processor (but see
|
|
276
|
+
* `stripe`/`adyen` for processors whose exponent differs from ISO).
|
|
277
|
+
*/
|
|
278
|
+
export function fromMinor(minor, currency, scale) {
|
|
279
|
+
const resolvedScale = scale ?? currencyExponent(currency);
|
|
280
|
+
if (typeof minor === 'number') {
|
|
281
|
+
if (!Number.isSafeInteger(minor)) {
|
|
282
|
+
throw new RangeError(`Minor units must be a safe integer, got ${minor}; pass a bigint`);
|
|
283
|
+
}
|
|
284
|
+
return new Money(currency, minor + 0, resolvedScale);
|
|
285
|
+
}
|
|
286
|
+
if (typeof minor !== 'bigint') {
|
|
287
|
+
throw new TypeError(`Invalid minor units ${String(minor)}`);
|
|
288
|
+
}
|
|
289
|
+
return make(currency, minor, resolvedScale);
|
|
290
|
+
}
|
|
291
|
+
/** Zero in a currency, at its exponent (or `scale`). */
|
|
292
|
+
export function zero(currency, scale) {
|
|
293
|
+
return new Money(currency, 0, scale ?? currencyExponent(currency));
|
|
294
|
+
}
|
|
295
|
+
// ---------------------------------------------------------------------------------------------
|
|
296
|
+
// Arithmetic
|
|
297
|
+
// ---------------------------------------------------------------------------------------------
|
|
298
|
+
function mismatch(money, other) {
|
|
299
|
+
throw new CurrencyMismatchError(money.currency, other.currency);
|
|
300
|
+
}
|
|
301
|
+
function addUsingBigInt(money, other, sign) {
|
|
302
|
+
const scale = Math.max(money.scale, other.scale);
|
|
303
|
+
const left = toBigInt(scaleUp(money.minor, scale - money.scale));
|
|
304
|
+
const right = toBigInt(scaleUp(other.minor, scale - other.scale));
|
|
305
|
+
return make(money.currency, sign === 1 ? left + right : left - right, scale);
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* a + b. Mixing currencies is a type error for literal currency types and a runtime error
|
|
309
|
+
* otherwise.
|
|
310
|
+
*/
|
|
311
|
+
export function add(money, other) {
|
|
312
|
+
if (money.currency !== other.currency) {
|
|
313
|
+
mismatch(money, other);
|
|
314
|
+
}
|
|
315
|
+
const left = money.minor;
|
|
316
|
+
const right = other.minor;
|
|
317
|
+
if (typeof left === 'number' && typeof right === 'number' && money.scale === other.scale) {
|
|
318
|
+
// exact whenever |sum| <= MAX_SAFE_MINOR: both inputs are safe integers
|
|
319
|
+
const sum = left + right;
|
|
320
|
+
if (sum <= MAX_SAFE_MINOR && sum >= -MAX_SAFE_MINOR) {
|
|
321
|
+
return new Money(money.currency, sum, money.scale);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return addUsingBigInt(money, other, 1);
|
|
325
|
+
}
|
|
326
|
+
/** a - b */
|
|
327
|
+
export function subtract(money, other) {
|
|
328
|
+
if (money.currency !== other.currency) {
|
|
329
|
+
mismatch(money, other);
|
|
330
|
+
}
|
|
331
|
+
const left = money.minor;
|
|
332
|
+
const right = other.minor;
|
|
333
|
+
if (typeof left === 'number' && typeof right === 'number' && money.scale === other.scale) {
|
|
334
|
+
const difference = left - right;
|
|
335
|
+
if (difference <= MAX_SAFE_MINOR && difference >= -MAX_SAFE_MINOR) {
|
|
336
|
+
return new Money(money.currency, difference + 0, money.scale);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return addUsingBigInt(money, other, -1);
|
|
340
|
+
}
|
|
341
|
+
/** Sum of a list (same currency; any scale). An empty list needs `currency` and returns zero. */
|
|
342
|
+
export function sum(items, currency) {
|
|
343
|
+
const count = items.length;
|
|
344
|
+
if (count === 0) {
|
|
345
|
+
if (currency === undefined) {
|
|
346
|
+
throw new RangeError('sum() of an empty list needs a currency');
|
|
347
|
+
}
|
|
348
|
+
return zero(currency);
|
|
349
|
+
}
|
|
350
|
+
let total = items[0];
|
|
351
|
+
if (currency !== undefined && total.currency !== currency) {
|
|
352
|
+
throw new CurrencyMismatchError(currency, total.currency);
|
|
353
|
+
}
|
|
354
|
+
const itemCurrency = total.currency;
|
|
355
|
+
const scale = total.scale;
|
|
356
|
+
// Fast loop on plain numbers: each partial sum of safe integers is exact while it stays within
|
|
357
|
+
// MAX_SAFE_MINOR. It falls back to add() at the first bigint, scale change or overflow. NaN marks
|
|
358
|
+
// "no fast total".
|
|
359
|
+
let fastTotal = typeof total.minor === 'number' ? total.minor : NaN;
|
|
360
|
+
let i = 1;
|
|
361
|
+
for (; i < count && fastTotal === fastTotal; i++) {
|
|
362
|
+
const item = items[i];
|
|
363
|
+
if (item.currency !== itemCurrency) {
|
|
364
|
+
mismatch(total, item);
|
|
365
|
+
}
|
|
366
|
+
if (typeof item.minor !== 'number' || item.scale !== scale) {
|
|
367
|
+
break;
|
|
368
|
+
}
|
|
369
|
+
const next = fastTotal + item.minor;
|
|
370
|
+
if (!(next <= MAX_SAFE_MINOR && next >= -MAX_SAFE_MINOR)) {
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
fastTotal = next;
|
|
374
|
+
}
|
|
375
|
+
if (fastTotal === fastTotal) {
|
|
376
|
+
total = new Money(itemCurrency, fastTotal, scale);
|
|
377
|
+
}
|
|
378
|
+
for (; i < count; i++) {
|
|
379
|
+
total = add(total, items[i]);
|
|
380
|
+
}
|
|
381
|
+
return total;
|
|
382
|
+
}
|
|
383
|
+
/** -money */
|
|
384
|
+
export function negate(money) {
|
|
385
|
+
const minor = money.minor;
|
|
386
|
+
return new Money(money.currency, typeof minor === 'number' ? 0 - minor : normalizeMinor(-minor), money.scale);
|
|
387
|
+
}
|
|
388
|
+
/** |money| */
|
|
389
|
+
export function abs(money) {
|
|
390
|
+
return money.minor < 0 ? negate(money) : money;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* m * factor, rounded to m's scale. `factor` is exact: an integer, a decimal string ('1.075'), a
|
|
394
|
+
* bigint, or a `ratio()`. Rounding defaults to 'halfExpand' (ties away from zero); pass
|
|
395
|
+
* 'unnecessary' to throw instead.
|
|
396
|
+
*/
|
|
397
|
+
export function multiply(money, factor, rounding = DEFAULT_ROUNDING) {
|
|
398
|
+
const minor = money.minor;
|
|
399
|
+
if (typeof factor === 'number' && Number.isSafeInteger(factor) && typeof minor === 'number') {
|
|
400
|
+
const product = minor * factor;
|
|
401
|
+
if (product <= MAX_SAFE_MINOR && product >= -MAX_SAFE_MINOR) {
|
|
402
|
+
return new Money(money.currency, product + 0, money.scale);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
return multiplyByRatio(money, ratio(factor), rounding);
|
|
406
|
+
}
|
|
407
|
+
/** @internal m * r, rounded */
|
|
408
|
+
export function multiplyByRatio(money, factor, rounding, scale = money.scale) {
|
|
409
|
+
const minor = money.minor;
|
|
410
|
+
if (typeof minor === 'number' &&
|
|
411
|
+
scale === money.scale &&
|
|
412
|
+
factor.n === factor.n &&
|
|
413
|
+
factor.d === factor.d) {
|
|
414
|
+
// exact when |product| <= MAX_SAFE_MINOR (both factors are safe integers)
|
|
415
|
+
const product = minor * factor.n;
|
|
416
|
+
if (product <= MAX_SAFE_MINOR && product >= -MAX_SAFE_MINOR) {
|
|
417
|
+
return new Money(money.currency, divideAndRound(product, factor.d, rounding), scale);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
let numerator = toBigInt(minor) * factor.num;
|
|
421
|
+
let denominator = factor.den;
|
|
422
|
+
if (scale > money.scale) {
|
|
423
|
+
numerator *= pow10n(scale - money.scale);
|
|
424
|
+
}
|
|
425
|
+
else if (scale < money.scale) {
|
|
426
|
+
denominator *= pow10n(money.scale - scale);
|
|
427
|
+
}
|
|
428
|
+
return make(money.currency, divideAndRoundBigint(numerator, denominator, rounding), scale);
|
|
429
|
+
}
|
|
430
|
+
/** m / divisor, rounded to m's scale (default 'halfExpand'). */
|
|
431
|
+
export function divide(money, divisor, rounding = DEFAULT_ROUNDING) {
|
|
432
|
+
const divisorRatio = ratio(divisor);
|
|
433
|
+
if (divisorRatio.num === 0n) {
|
|
434
|
+
throw new RangeError('Division by zero');
|
|
435
|
+
}
|
|
436
|
+
return multiplyByRatio(money, ratio(divisorRatio.den, divisorRatio.num), rounding);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Rounds to the currency's exponent (or `scale`): `round(money('1.005', 'EUR', {scale: 3}),
|
|
440
|
+
* 'halfEven')`.
|
|
441
|
+
*/
|
|
442
|
+
export function round(money, rounding, scale) {
|
|
443
|
+
return toScale(money, scale ?? currencyExponent(money.currency), rounding);
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Changes the scale; increasing it is always exact, decreasing it rounds (default 'halfExpand').
|
|
447
|
+
*/
|
|
448
|
+
export function toScale(money, scale, rounding = DEFAULT_ROUNDING) {
|
|
449
|
+
if (!Number.isInteger(scale) || scale < 0) {
|
|
450
|
+
throw new RangeError(`Invalid scale ${scale}`);
|
|
451
|
+
}
|
|
452
|
+
if (scale === money.scale) {
|
|
453
|
+
return money;
|
|
454
|
+
}
|
|
455
|
+
if (scale > money.scale) {
|
|
456
|
+
return make(money.currency, scaleUp(money.minor, scale - money.scale), scale);
|
|
457
|
+
}
|
|
458
|
+
return make(money.currency, scaleDown(money.minor, money.scale - scale, rounding), scale);
|
|
459
|
+
}
|
|
460
|
+
// ---------------------------------------------------------------------------------------------
|
|
461
|
+
// Comparison
|
|
462
|
+
// ---------------------------------------------------------------------------------------------
|
|
463
|
+
/** -1, 0 or 1. Throws on currency mismatch. Works across scales and number/bigint. */
|
|
464
|
+
export function compare(money, other) {
|
|
465
|
+
if (money.currency !== other.currency) {
|
|
466
|
+
mismatch(money, other);
|
|
467
|
+
}
|
|
468
|
+
let left = money.minor;
|
|
469
|
+
let right = other.minor;
|
|
470
|
+
if (money.scale !== other.scale) {
|
|
471
|
+
const scale = Math.max(money.scale, other.scale);
|
|
472
|
+
left = scaleUp(left, scale - money.scale);
|
|
473
|
+
right = scaleUp(right, scale - other.scale);
|
|
474
|
+
}
|
|
475
|
+
// number < bigint comparisons are exact in JS
|
|
476
|
+
if (left < right) {
|
|
477
|
+
return -1;
|
|
478
|
+
}
|
|
479
|
+
return left > right ? 1 : 0;
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Same currency and same value (1.0 EUR at scale 1 equals 1.00 EUR). Different currencies: false.
|
|
483
|
+
*/
|
|
484
|
+
export function equals(money, other) {
|
|
485
|
+
if (money.currency !== other.currency) {
|
|
486
|
+
return false;
|
|
487
|
+
}
|
|
488
|
+
if (money.scale === other.scale) {
|
|
489
|
+
// == compares number and bigint exactly
|
|
490
|
+
return money.minor == other.minor;
|
|
491
|
+
}
|
|
492
|
+
return compare(money, other) === 0;
|
|
493
|
+
}
|
|
494
|
+
/** money < other (same currency; any scale). */
|
|
495
|
+
export const lessThan = (money, other) => compare(money, other) < 0;
|
|
496
|
+
/** money <= other */
|
|
497
|
+
export const lessThanOrEqual = (money, other) => compare(money, other) <= 0;
|
|
498
|
+
/** money > other */
|
|
499
|
+
export const greaterThan = (money, other) => compare(money, other) > 0;
|
|
500
|
+
/** money >= other */
|
|
501
|
+
export const greaterThanOrEqual = (money, other) => compare(money, other) >= 0;
|
|
502
|
+
/** Whether the amount is zero. */
|
|
503
|
+
export const isZero = (money) => money.minor == 0;
|
|
504
|
+
/** Whether the amount is greater than zero. */
|
|
505
|
+
export const isPositive = (money) => money.minor > 0;
|
|
506
|
+
/** Whether the amount is less than zero. */
|
|
507
|
+
export const isNegative = (money) => money.minor < 0;
|
|
508
|
+
/** 1, 0 or -1 for positive, zero and negative amounts. */
|
|
509
|
+
export const sign = (money) => {
|
|
510
|
+
if (money.minor > 0) {
|
|
511
|
+
return 1;
|
|
512
|
+
}
|
|
513
|
+
return money.minor < 0 ? -1 : 0;
|
|
514
|
+
};
|
|
515
|
+
/** The smallest of the amounts (same currency); the first one wins ties. */
|
|
516
|
+
export function min(first, ...rest) {
|
|
517
|
+
let smallest = first;
|
|
518
|
+
for (const candidate of rest) {
|
|
519
|
+
if (compare(candidate, smallest) < 0) {
|
|
520
|
+
smallest = candidate;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return smallest;
|
|
524
|
+
}
|
|
525
|
+
/** The largest of the amounts (same currency); the first one wins ties. */
|
|
526
|
+
export function max(first, ...rest) {
|
|
527
|
+
let largest = first;
|
|
528
|
+
for (const candidate of rest) {
|
|
529
|
+
if (compare(candidate, largest) > 0) {
|
|
530
|
+
largest = candidate;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
return largest;
|
|
534
|
+
}
|
|
535
|
+
/** Limits m to [lo, hi]. */
|
|
536
|
+
export function clamp(money, lo, hi) {
|
|
537
|
+
if (compare(lo, hi) > 0) {
|
|
538
|
+
throw new RangeError('clamp(): lo > hi');
|
|
539
|
+
}
|
|
540
|
+
if (compare(money, lo) < 0) {
|
|
541
|
+
return lo;
|
|
542
|
+
}
|
|
543
|
+
return compare(money, hi) > 0 ? hi : money;
|
|
544
|
+
}
|
|
545
|
+
// ---------------------------------------------------------------------------------------------
|
|
546
|
+
// Serialisation primitives
|
|
547
|
+
// ---------------------------------------------------------------------------------------------
|
|
548
|
+
/**
|
|
549
|
+
* Exact decimal string in major units: "12.34", "-0.05", "1000" (JPY). For NUMERIC/DECIMAL columns.
|
|
550
|
+
*/
|
|
551
|
+
export function toDecimal(money) {
|
|
552
|
+
return formatScaled(money.minor, money.scale);
|
|
553
|
+
}
|
|
554
|
+
/** Minor units as a bigint (always safe; use for BIGINT columns). */
|
|
555
|
+
export function toMinor(money) {
|
|
556
|
+
return toBigInt(money.minor);
|
|
557
|
+
}
|
|
558
|
+
/** Minor units as a number; throws if not a safe integer. */
|
|
559
|
+
export function toMinorNumber(money) {
|
|
560
|
+
if (typeof money.minor === 'bigint') {
|
|
561
|
+
throw new RangeError(`${money} does not fit in a safe integer; use toMinor()`);
|
|
562
|
+
}
|
|
563
|
+
return money.minor;
|
|
564
|
+
}
|
|
565
|
+
/** Parses `{ amount: "12.34", currency: "EUR" }` (as produced by JSON.stringify(money)). */
|
|
566
|
+
export function fromJSON(json, options) {
|
|
567
|
+
const parsed = typeof json === 'string' ? JSON.parse(json) : json;
|
|
568
|
+
if (parsed === null ||
|
|
569
|
+
typeof parsed !== 'object' ||
|
|
570
|
+
typeof parsed.amount !== 'string' ||
|
|
571
|
+
typeof parsed.currency !== 'string') {
|
|
572
|
+
throw new TypeError('Expected { amount: string, currency: string }');
|
|
573
|
+
}
|
|
574
|
+
return money(parsed.amount, parsed.currency, options);
|
|
575
|
+
}
|
|
576
|
+
export { ratio } from './decimal.js';
|
|
577
|
+
//# sourceMappingURL=money.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"money.js","sourceRoot":"","sources":["../src/money.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAqB,MAAM,eAAe,CAAC;AACpE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,MAAM,EACN,KAAK,EACL,cAAc,GAGf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,aAAa,GAEd,MAAM,eAAe,CAAC;AAEvB,mGAAmG;AACnG,6DAA6D;AAC7D,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAY/C,oEAAoE;AACpE,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IACzC,IAAI,GAAG,uBAAuB,CAAC;IAGxC,YAAY,QAAgB,EAAE,MAAc;QAC1C,KAAK,CAAC,sBAAsB,QAAQ,OAAO,MAAM,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,KAAK;IAIT,gBAAgB;IAChB,YAAY,QAAW,EAAE,KAAsB,EAAE,KAAa;QAC5D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IACD,kBAAkB;IAClB,QAAQ;QACN,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpE,CAAC;IACD,MAAM;QACJ,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACnF,CAAC;IACD,4FAA4F;IAC5F,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAY;QAC/B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,kGAAkG;IAClG,gGAAgG;IAChG,wCAAwC;IAExC,aAAa;IACb,8CAA8C;IAC9C,GAAG,CAAC,KAAe;QACjB,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,mBAAmB;IACnB,QAAQ,CAAC,KAAe;QACtB,OAAO,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD;;;OAGG;IACH,QAAQ,CAAC,MAAc,EAAE,QAAuB;QAC9C,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IACD,4CAA4C;IAC5C,MAAM,CAAC,OAAe,EAAE,QAAuB;QAC7C,OAAO,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,MAAM;QACJ,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,GAAG;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,sDAAsD;IACtD,KAAK,CAAC,QAAsB,EAAE,KAAc;QAC1C,OAAO,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,sEAAsE;IACtE,OAAO,CAAC,KAAa,EAAE,QAAuB;QAC5C,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IACD,aAAa;IACb,8CAA8C;IAC9C,OAAO,CAAC,KAAe;QACrB,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,wEAAwE;IACxE,MAAM,CAAC,KAAY;QACjB,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,QAAQ,CAAC,KAAe;QACtB,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,eAAe,CAAC,KAAe;QAC7B,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,WAAW,CAAC,KAAe;QACzB,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,kBAAkB,CAAC,KAAe;QAChC,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IACD,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,GAAG,CAAC,GAAG,MAAkB;QACvB,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,GAAG,MAAkB;QACvB,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,EAAY,EAAE,EAAY;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS;IACT,mDAAmD;IACnD,SAAS;QACP,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,+CAA+C;IAC/C,OAAO;QACL,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IACD,kDAAkD;IAClD,aAAa;QACX,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAGD,oDAAoD;AACpD,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE/C;;;GAGG;AACH,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,gBAAgB,CAAC,CACzF,CAAC;AAaF;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAmE,EACnE,OAA4B;IAE5B,MAAM,SAAS,GAAG,KAAK,CAAC,SAA+C,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,SAAS,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC;QACnD,CAAC;QAED,8FAA8F;QAC9F,wEAAwE;QACxE,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,cAAc,GAAG,KAAK,KAAK,SAAS,IAAI,aAAa,KAAK,KAAK,CAAC;QACtE,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YACpF,MAAM,IAAI,SAAS,CAAC,SAAS,IAAI,qBAAqB,CAAC,CAAC;QAC1D,CAAC;QAED,gGAAgG;QAChG,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE;YACrC,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,IAAI,CAClB,QAAW,EACX,KAAsB,EACtB,KAAa;IAEb,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,KAAsB,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjG,gCAAgC;AAChC,MAAM,UAAU,OAAO,CAAC,KAAsB,EAAE,QAAgB;IAC9D,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAE,CAAC;QACxC,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1D,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,SAAS,CACvB,KAAsB,EACtB,QAAgB,EAChB,IAAkB;IAElB,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAChD,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAE,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,cAAc,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC;AAcD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,KAAK,CACnB,MAAgC,EAChC,QAAW,EACX,OAAsB;IAEtB,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,UAAU,CACf,QAAQ,EACR,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,EACZ,KAAK,EACL,OAAO,EAAE,QAAQ,IAAI,aAAa,EAClC,MAAM,CACP,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,OAAO,UAAU,CACf,QAAQ,EACR,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,KAAK,EACZ,KAAK,EACL,OAAO,EAAE,QAAQ,IAAI,aAAa,EAClC,MAAM,CACP,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,kBAAkB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU,CACjB,QAAW,EACX,MAAuB,EACvB,IAAY,EACZ,EAAU,EACV,IAAkB,EAClB,KAAc;IAEd,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnC,MAAM,IAAI,aAAa,CACrB,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,uBAAuB,QAAQ,kCAAkC,CACtG,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,KAAsB,EACtB,QAAW,EACX,KAAc;IAEd,MAAM,aAAa,GAAG,KAAK,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,UAAU,CAAC,2CAA2C,KAAK,iBAAiB,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,IAAI,CAA0B,QAAW,EAAE,KAAc;IACvE,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,gGAAgG;AAChG,aAAa;AACb,gGAAgG;AAEhG,SAAS,QAAQ,CAAC,KAAY,EAAE,KAAY;IAC1C,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAmB,KAAe,EAAE,KAAY,EAAE,IAAY;IACnF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAmB,KAAe,EAAE,KAAwB;IAC7E,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QACzF,wEAAwE;QACxE,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;QACzB,IAAI,GAAG,IAAI,cAAc,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YACpD,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,YAAY;AACZ,MAAM,UAAU,QAAQ,CAAmB,KAAe,EAAE,KAAwB;IAClF,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QACzF,MAAM,UAAU,GAAG,IAAI,GAAG,KAAK,CAAC;QAChC,IAAI,UAAU,IAAI,cAAc,IAAI,UAAU,IAAI,CAAC,cAAc,EAAE,CAAC;YAClE,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,OAAO,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAUD,iGAAiG;AACjG,MAAM,UAAU,GAAG,CACjB,KAA8C,EAC9C,QAAqB;IAErB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACtB,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1B,+FAA+F;IAC/F,kGAAkG;IAClG,mBAAmB;IACnB,IAAI,SAAS,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YACnC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC3D,MAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QACpC,IAAI,CAAC,CAAC,IAAI,IAAI,cAAc,IAAI,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACzD,MAAM;QACR,CAAC;QACD,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACtB,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,aAAa;AACb,MAAM,UAAU,MAAM,CAAmB,KAAe;IACtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,OAAO,IAAI,KAAK,CACd,KAAK,CAAC,QAAQ,EACd,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,EAC9D,KAAK,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC;AAED,cAAc;AACd,MAAM,UAAU,GAAG,CAAmB,KAAe;IACnD,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAe,EACf,MAAc,EACd,WAAyB,gBAAgB;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5F,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;QAC/B,IAAI,OAAO,IAAI,cAAc,IAAI,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5D,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC;AACzD,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,eAAe,CAC7B,KAAe,EACf,MAAa,EACb,QAAsB,EACtB,KAAK,GAAG,KAAK,CAAC,KAAK;IAEnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,KAAK,CAAC,KAAK;QACrB,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QACrB,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,EACrB,CAAC;QACD,0EAA0E;QAC1E,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;QACjC,IAAI,OAAO,IAAI,cAAc,IAAI,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5D,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IACD,IAAI,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;IAC7C,IAAI,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;IAC7B,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,SAAS,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;SAAM,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,MAAM,CACpB,KAAe,EACf,OAAe,EACf,WAAyB,gBAAgB;IAEzC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,YAAY,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CACnB,KAAe,EACf,QAAsB,EACtB,KAAc;IAEd,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CACrB,KAAe,EACf,KAAa,EACb,WAAyB,gBAAgB;IAEzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,UAAU,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,EAAE,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5F,CAAC;AAED,gGAAgG;AAChG,aAAa;AACb,gGAAgG;AAEhG,sFAAsF;AACtF,MAAM,UAAU,OAAO,CAAmB,KAAe,EAAE,KAAwB;IACjF,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACxB,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACjD,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,8CAA8C;IAC9C,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAY,EAAE,KAAY;IAC/C,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,wCAAwC;QACxC,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IACpC,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAmB,KAAe,EAAE,KAAwB,EAAW,EAAE,CAC/F,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,qBAAqB;AACrB,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAe,EACf,KAAwB,EACf,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACzC,oBAAoB;AACpB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAmB,KAAe,EAAE,KAAwB,EAAW,EAAE,CAClG,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5B,qBAAqB;AACrB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAe,EACf,KAAwB,EACf,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAEzC,kCAAkC;AAClC,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAY,EAAW,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;AAClE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAY,EAAW,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACrE,4CAA4C;AAC5C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAY,EAAW,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACrE,0DAA0D;AAC1D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAY,EAAc,EAAE;IAC/C,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,GAAG,CAAmB,KAAe,EAAE,GAAG,IAAyB;IACjF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,2EAA2E;AAC3E,MAAM,UAAU,GAAG,CAAmB,KAAe,EAAE,GAAG,IAAyB;IACjF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AACD,4BAA4B;AAC5B,MAAM,UAAU,KAAK,CACnB,KAAe,EACf,EAAqB,EACrB,EAAqB;IAErB,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,UAAU,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7C,CAAC;AAED,gGAAgG;AAChG,2BAA2B;AAC3B,gGAAgG;AAEhG;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,gDAAgD,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,QAAQ,CACtB,IAA2B,EAC3B,OAAsB;IAEtB,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,IACE,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACjC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EACnC,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxD,CAAC;AAGD,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type CurrencyInput, type Money, type MoneyOptions } from './money.js';
|
|
2
|
+
/**
|
|
3
|
+
* Parses a locale-formatted amount: parse('1.234,50 €', 'EUR', 'de-DE'), parse('CHF 1’234.50',
|
|
4
|
+
* 'CHF', 'de-CH'), parse('١٢٣٫٤٥ US$', 'USD', 'ar-EG'). Currency symbols/codes, spaces and bidi
|
|
5
|
+
* marks around the number are ignored (the currency is the `currency` argument, never guessed from
|
|
6
|
+
* the text). A minus sign (ASCII or U+2212) or accounting parentheses anywhere in the affixes make
|
|
7
|
+
* it negative. Inside the number only digits, the locale's group separator (before the decimal
|
|
8
|
+
* separator) and one decimal separator are allowed.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parse<C extends CurrencyInput>(input: string, currency: C, locale?: string, options?: MoneyOptions): Money<C>;
|
|
11
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,aAAa,EAAE,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AA8EtF;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,aAAa,EAC3C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,EACX,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,KAAK,CAAC,CAAC,CAAC,CAoDV"}
|