@reportwright/viewer 0.0.0-stage → 0.11.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/CHANGELOG.md +206 -0
- package/LICENSE +23 -0
- package/README.md +146 -2
- package/dist/chunk-2NAW3MAP.js +1284 -0
- package/dist/chunk-2NAW3MAP.js.map +6 -0
- package/dist/chunk-3D43XGIN.js +1167 -0
- package/dist/chunk-3D43XGIN.js.map +6 -0
- package/dist/chunk-66QZ3RDV.js +1661 -0
- package/dist/chunk-66QZ3RDV.js.map +6 -0
- package/dist/chunk-72S6DETS.js +40 -0
- package/dist/chunk-72S6DETS.js.map +6 -0
- package/dist/chunk-AH47FS6Y.js +13 -0
- package/dist/chunk-AH47FS6Y.js.map +6 -0
- package/dist/chunk-APRPSQOD.js +301 -0
- package/dist/chunk-APRPSQOD.js.map +6 -0
- package/dist/chunk-BXKUE45K.js +1284 -0
- package/dist/chunk-BXKUE45K.js.map +6 -0
- package/dist/chunk-D2NTLAKL.js +14 -0
- package/dist/chunk-D2NTLAKL.js.map +6 -0
- package/dist/chunk-E7INJHTL.js +1284 -0
- package/dist/chunk-E7INJHTL.js.map +6 -0
- package/dist/chunk-FGEFSGJT.js +1284 -0
- package/dist/chunk-FGEFSGJT.js.map +6 -0
- package/dist/chunk-GJS242RR.js +1652 -0
- package/dist/chunk-GJS242RR.js.map +6 -0
- package/dist/chunk-HAMBWF6C.js +20682 -0
- package/dist/chunk-HAMBWF6C.js.map +6 -0
- package/dist/chunk-J56FRCFU.js +1284 -0
- package/dist/chunk-J56FRCFU.js.map +6 -0
- package/dist/chunk-KJTRZJHN.js +599 -0
- package/dist/chunk-KJTRZJHN.js.map +6 -0
- package/dist/chunk-N5WHQ4DM.js +153 -0
- package/dist/chunk-N5WHQ4DM.js.map +6 -0
- package/dist/chunk-NJWQT6VB.js +1284 -0
- package/dist/chunk-NJWQT6VB.js.map +6 -0
- package/dist/chunk-ODREGGKA.js +219 -0
- package/dist/chunk-ODREGGKA.js.map +6 -0
- package/dist/chunk-OLLMACWA.js +35 -0
- package/dist/chunk-OLLMACWA.js.map +6 -0
- package/dist/chunk-PXXMOP4N.js +1284 -0
- package/dist/chunk-PXXMOP4N.js.map +6 -0
- package/dist/chunk-RKGIVPK5.js +1284 -0
- package/dist/chunk-RKGIVPK5.js.map +6 -0
- package/dist/chunk-RYHJUQSV.js +98 -0
- package/dist/chunk-RYHJUQSV.js.map +6 -0
- package/dist/chunk-SBD55ZES.js +316 -0
- package/dist/chunk-SBD55ZES.js.map +6 -0
- package/dist/chunk-SR2TQ2ZK.js +70 -0
- package/dist/chunk-SR2TQ2ZK.js.map +6 -0
- package/dist/chunk-WQOBRZAL.js +14777 -0
- package/dist/chunk-WQOBRZAL.js.map +6 -0
- package/dist/designer.d.ts +48 -0
- package/dist/designer.js +35865 -0
- package/dist/designer.js.map +6 -0
- package/dist/peer/chunk-2NJMXASD.js +1282 -0
- package/dist/peer/chunk-2NJMXASD.js.map +6 -0
- package/dist/peer/chunk-5X4ZSSJT.js +1660 -0
- package/dist/peer/chunk-5X4ZSSJT.js.map +6 -0
- package/dist/peer/chunk-6YO42ALN.js +14777 -0
- package/dist/peer/chunk-6YO42ALN.js.map +6 -0
- package/dist/peer/chunk-76ZABVTI.js +598 -0
- package/dist/peer/chunk-76ZABVTI.js.map +6 -0
- package/dist/peer/chunk-776OR56A.js +6040 -0
- package/dist/peer/chunk-776OR56A.js.map +6 -0
- package/dist/peer/chunk-BPF3SLL4.js +1282 -0
- package/dist/peer/chunk-BPF3SLL4.js.map +6 -0
- package/dist/peer/chunk-BWVDLOVL.js +1282 -0
- package/dist/peer/chunk-BWVDLOVL.js.map +6 -0
- package/dist/peer/chunk-CXM3YSWF.js +1282 -0
- package/dist/peer/chunk-CXM3YSWF.js.map +6 -0
- package/dist/peer/chunk-DQFZ6LVB.js +1282 -0
- package/dist/peer/chunk-DQFZ6LVB.js.map +6 -0
- package/dist/peer/chunk-EKWTFHVE.js +152 -0
- package/dist/peer/chunk-EKWTFHVE.js.map +6 -0
- package/dist/peer/chunk-IMQRHDR4.js +12 -0
- package/dist/peer/chunk-IMQRHDR4.js.map +6 -0
- package/dist/peer/chunk-IPU2YRL2.js +300 -0
- package/dist/peer/chunk-IPU2YRL2.js.map +6 -0
- package/dist/peer/chunk-M4AGFUWE.js +97 -0
- package/dist/peer/chunk-M4AGFUWE.js.map +6 -0
- package/dist/peer/chunk-PG2PNYDX.js +1282 -0
- package/dist/peer/chunk-PG2PNYDX.js.map +6 -0
- package/dist/peer/chunk-QRAJXW2D.js +1282 -0
- package/dist/peer/chunk-QRAJXW2D.js.map +6 -0
- package/dist/peer/chunk-SHVCNAUG.js +1282 -0
- package/dist/peer/chunk-SHVCNAUG.js.map +6 -0
- package/dist/peer/chunk-Y5CAHLXS.js +218 -0
- package/dist/peer/chunk-Y5CAHLXS.js.map +6 -0
- package/dist/peer/designer.js +35841 -0
- package/dist/peer/designer.js.map +6 -0
- package/dist/peer/viewer.js +1061 -0
- package/dist/peer/viewer.js.map +6 -0
- package/dist/viewer.d.ts +77 -0
- package/dist/viewer.js +1066 -0
- package/dist/viewer.js.map +6 -0
- package/package.json +76 -4
|
@@ -0,0 +1,1652 @@
|
|
|
1
|
+
// src/engine/expr/parser.js
|
|
2
|
+
var ExprError = class extends Error {
|
|
3
|
+
/** @param {string} msg @param {number} [pos] @param {string} [src] */
|
|
4
|
+
constructor(msg, pos, src) {
|
|
5
|
+
super(pos != null ? `${msg} (at ${pos + 1})` : msg);
|
|
6
|
+
this.pos = pos;
|
|
7
|
+
this.src = src;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var MAX_TEXT = 1e6;
|
|
11
|
+
var capText = (fname, n) => {
|
|
12
|
+
if (n > MAX_TEXT) throw new ExprError(`${fname}: the result would be longer than 1,000,000 characters`);
|
|
13
|
+
};
|
|
14
|
+
var MAX_PATTERN = 1e3;
|
|
15
|
+
var MAX_DIGITS = 340;
|
|
16
|
+
var capPattern = (fname, pat) => {
|
|
17
|
+
if (pat.length > MAX_PATTERN) throw new ExprError(`${fname}: a format longer than ${MAX_PATTERN} characters`);
|
|
18
|
+
};
|
|
19
|
+
var capDigits = (fname, n) => {
|
|
20
|
+
if (n > MAX_DIGITS) throw new ExprError(`${fname}: ${n} digits is more than ${MAX_DIGITS}`);
|
|
21
|
+
};
|
|
22
|
+
var OPS = ["<>", "<=", ">=", "==", "!=", "&&", "||", "+", "-", "*", "/", "%", "&", "=", "<", ">", "(", ")", ",", ".", "!", "[", "]", "?", ":", "^", "\\"];
|
|
23
|
+
var KEYWORDS = /* @__PURE__ */ new Set(["and", "or", "not", "true", "false", "null", "nothing", "mod", "is", "isnot", "xor", "andalso", "orelse"]);
|
|
24
|
+
function lex(src) {
|
|
25
|
+
const toks = [];
|
|
26
|
+
let i = 0;
|
|
27
|
+
while (i < src.length) {
|
|
28
|
+
const c = src[i];
|
|
29
|
+
if (/\s/.test(c)) {
|
|
30
|
+
i++;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (/[0-9]/.test(c) || c === "." && /[0-9]/.test(src[i + 1] || "")) {
|
|
34
|
+
let j = i;
|
|
35
|
+
while (j < src.length && /[0-9.]/.test(src[j])) j++;
|
|
36
|
+
if (/[eE]/.test(src[j] || "") && /[-+0-9]/.test(src[j + 1] || "")) {
|
|
37
|
+
j += 2;
|
|
38
|
+
while (/[0-9]/.test(src[j] || "")) j++;
|
|
39
|
+
}
|
|
40
|
+
const n = Number(src.slice(i, j));
|
|
41
|
+
if (Number.isNaN(n)) throw new ExprError(`Bad number "${src.slice(i, j)}"`, i, src);
|
|
42
|
+
toks.push({ t: "num", v: n, p: i });
|
|
43
|
+
i = j;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (c === '"' || c === "'") {
|
|
47
|
+
let j = i + 1, s = "";
|
|
48
|
+
while (j < src.length && src[j] !== c) {
|
|
49
|
+
if (src[j] === "\\" && j + 1 < src.length) {
|
|
50
|
+
s += src[j + 1];
|
|
51
|
+
j += 2;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
s += src[j++];
|
|
55
|
+
}
|
|
56
|
+
if (j >= src.length) throw new ExprError("A string has no closing quote", i, src);
|
|
57
|
+
toks.push({ t: "str", v: s, p: i });
|
|
58
|
+
i = j + 1;
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (/[A-Za-z_$]/.test(c)) {
|
|
62
|
+
let j = i;
|
|
63
|
+
while (j < src.length && /[A-Za-z0-9_$]/.test(src[j])) j++;
|
|
64
|
+
const w = src.slice(i, j);
|
|
65
|
+
toks.push(KEYWORDS.has(w.toLowerCase()) ? { t: "kw", v: w.toLowerCase(), p: i } : { t: "id", v: w, p: i });
|
|
66
|
+
i = j;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const op = OPS.find((o) => src.startsWith(o, i));
|
|
70
|
+
if (op) {
|
|
71
|
+
toks.push({ t: "op", v: op, p: i });
|
|
72
|
+
i += op.length;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
throw new ExprError(`Unexpected character "${c}"`, i, src);
|
|
76
|
+
}
|
|
77
|
+
toks.push({ t: "eof", v: "", p: src.length });
|
|
78
|
+
return toks;
|
|
79
|
+
}
|
|
80
|
+
var BIN = {
|
|
81
|
+
"or": 1,
|
|
82
|
+
"||": 1,
|
|
83
|
+
"orelse": 1,
|
|
84
|
+
"xor": 1,
|
|
85
|
+
"and": 2,
|
|
86
|
+
"&&": 2,
|
|
87
|
+
"andalso": 2,
|
|
88
|
+
"=": 4,
|
|
89
|
+
"==": 4,
|
|
90
|
+
"<>": 4,
|
|
91
|
+
"!=": 4,
|
|
92
|
+
"<": 4,
|
|
93
|
+
"<=": 4,
|
|
94
|
+
">": 4,
|
|
95
|
+
">=": 4,
|
|
96
|
+
"is": 4,
|
|
97
|
+
"isnot": 4,
|
|
98
|
+
"&": 5,
|
|
99
|
+
"+": 6,
|
|
100
|
+
"-": 6,
|
|
101
|
+
// VB: Mod below \ below * and /, all above + -; ^ above unary minus (-2 ^ 2 is -4), left to right (2 ^ 3 ^ 2 is 64)
|
|
102
|
+
"mod": 6.4,
|
|
103
|
+
"\\": 6.7,
|
|
104
|
+
"*": 7,
|
|
105
|
+
"/": 7,
|
|
106
|
+
"%": 7,
|
|
107
|
+
"^": 8.5
|
|
108
|
+
};
|
|
109
|
+
function parse(src) {
|
|
110
|
+
const toks = lex(src);
|
|
111
|
+
let k = 0;
|
|
112
|
+
const peek = () => toks[k];
|
|
113
|
+
const next = () => toks[k++];
|
|
114
|
+
const expect = (v) => {
|
|
115
|
+
const t = next();
|
|
116
|
+
if (t.v !== v) throw new ExprError(`Expected "${v}" but found "${t.v || "end"}"`, t.p, src);
|
|
117
|
+
return t;
|
|
118
|
+
};
|
|
119
|
+
const lbp = (t) => {
|
|
120
|
+
if (t.t === "op" && (t.v === "." || t.v === "[")) return 9;
|
|
121
|
+
if (t.t === "op" && t.v === "(") return 9;
|
|
122
|
+
if (t.t === "op" && t.v === "?") return 0.5;
|
|
123
|
+
if ((t.t === "op" || t.t === "kw") && BIN[t.v] != null) return BIN[t.v];
|
|
124
|
+
return 0;
|
|
125
|
+
};
|
|
126
|
+
function callArgs() {
|
|
127
|
+
const args = [];
|
|
128
|
+
if (peek().v !== ")") {
|
|
129
|
+
do {
|
|
130
|
+
args.push(expr(0));
|
|
131
|
+
} while (peek().v === "," && next());
|
|
132
|
+
}
|
|
133
|
+
expect(")");
|
|
134
|
+
return args;
|
|
135
|
+
}
|
|
136
|
+
function nud() {
|
|
137
|
+
const t = next();
|
|
138
|
+
if (t.t === "num" || t.t === "str") return { type: "lit", v: t.v };
|
|
139
|
+
if (t.t === "kw") {
|
|
140
|
+
if (t.v === "true") return { type: "lit", v: true };
|
|
141
|
+
if (t.v === "false") return { type: "lit", v: false };
|
|
142
|
+
if (t.v === "null" || t.v === "nothing") return { type: "lit", v: null };
|
|
143
|
+
if (t.v === "not") return { type: "unary", op: "not", arg: expr(3) };
|
|
144
|
+
}
|
|
145
|
+
if (t.t === "id") {
|
|
146
|
+
if (peek().v === "(") {
|
|
147
|
+
next();
|
|
148
|
+
return { type: "call", name: t.v, args: callArgs(), p: t.p };
|
|
149
|
+
}
|
|
150
|
+
return { type: "id", name: t.v, p: t.p };
|
|
151
|
+
}
|
|
152
|
+
if (t.t === "op") {
|
|
153
|
+
if (t.v === "(") {
|
|
154
|
+
const e = expr(0);
|
|
155
|
+
expect(")");
|
|
156
|
+
return e;
|
|
157
|
+
}
|
|
158
|
+
if (t.v === "-") return { type: "unary", op: "neg", arg: expr(8) };
|
|
159
|
+
if (t.v === "+") return expr(8);
|
|
160
|
+
if (t.v === "!") return { type: "unary", op: "not", arg: expr(8) };
|
|
161
|
+
}
|
|
162
|
+
throw new ExprError(t.t === "eof" ? "The expression ends too early" : `Unexpected "${t.v}"`, t.p, src);
|
|
163
|
+
}
|
|
164
|
+
function led(left) {
|
|
165
|
+
const t = next();
|
|
166
|
+
if (t.v === ".") {
|
|
167
|
+
const id = next();
|
|
168
|
+
if (id.t !== "id" && id.t !== "kw") throw new ExprError('Expected a name after "."', id.p, src);
|
|
169
|
+
if (peek().v === "(") {
|
|
170
|
+
next();
|
|
171
|
+
return { type: "call", name: id.v, args: callArgs(), p: id.p, obj: left };
|
|
172
|
+
}
|
|
173
|
+
return { type: "member", obj: left, prop: id.v };
|
|
174
|
+
}
|
|
175
|
+
if (t.v === "[") {
|
|
176
|
+
const e = expr(0);
|
|
177
|
+
expect("]");
|
|
178
|
+
return { type: "index", obj: left, key: e };
|
|
179
|
+
}
|
|
180
|
+
if (t.v === "(") {
|
|
181
|
+
const args = callArgs();
|
|
182
|
+
if (args.length !== 1) throw new ExprError('An index needs one value: Split(s, ",")(1)', t.p, src);
|
|
183
|
+
return { type: "index", obj: left, key: args[0] };
|
|
184
|
+
}
|
|
185
|
+
if (t.v === "?") {
|
|
186
|
+
const a = expr(0);
|
|
187
|
+
expect(":");
|
|
188
|
+
const b = expr(0);
|
|
189
|
+
return { type: "cond", test: left, a, b };
|
|
190
|
+
}
|
|
191
|
+
return { type: "bin", op: t.v, a: left, b: expr(BIN[t.v]) };
|
|
192
|
+
}
|
|
193
|
+
function expr(rbp) {
|
|
194
|
+
let left = nud();
|
|
195
|
+
while (rbp < lbp(peek())) left = led(left);
|
|
196
|
+
return left;
|
|
197
|
+
}
|
|
198
|
+
const ast = expr(0);
|
|
199
|
+
if (peek().t !== "eof") throw new ExprError(`Unexpected "${peek().v}"`, peek().p, src);
|
|
200
|
+
return ast;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// src/engine/expr/javafmt.js
|
|
204
|
+
var cache = /* @__PURE__ */ new Map();
|
|
205
|
+
var memo = (key, make) => {
|
|
206
|
+
let v = cache.get(key);
|
|
207
|
+
if (v === void 0) {
|
|
208
|
+
v = make();
|
|
209
|
+
if (cache.size >= 500) cache.clear();
|
|
210
|
+
cache.set(key, v);
|
|
211
|
+
}
|
|
212
|
+
return v;
|
|
213
|
+
};
|
|
214
|
+
function symbols(locale) {
|
|
215
|
+
return memo(`s${locale}`, () => {
|
|
216
|
+
const s = { digits: "0123456789", dec: ".", grp: ",", minus: "-", percent: "%", exp: "E", expMinus: "-", inf: "∞", nan: "NaN", perMille: "‰", latnDec: "." };
|
|
217
|
+
try {
|
|
218
|
+
const nf2 = new Intl.NumberFormat(locale, { useGrouping: false });
|
|
219
|
+
s.digits = [..."0123456789"].map((d) => nf2.format(Number(d))).join("");
|
|
220
|
+
const BIDI = /^[\u061c\u200e\u200f]+$/;
|
|
221
|
+
const parts = (f, v) => f.formatToParts(v);
|
|
222
|
+
const signed = (ps, type) => {
|
|
223
|
+
const i = ps.findIndex((p) => p.type === type);
|
|
224
|
+
if (i < 0) return null;
|
|
225
|
+
return (i > 0 && BIDI.test(ps[i - 1].value) ? ps[i - 1].value : "") + ps[i].value + (BIDI.test(ps[i + 1]?.value || "") ? ps[i + 1].value : "");
|
|
226
|
+
};
|
|
227
|
+
const np = parts(new Intl.NumberFormat(locale), -12345.5);
|
|
228
|
+
for (const p of np) {
|
|
229
|
+
if (p.type === "decimal") s.dec = p.value;
|
|
230
|
+
else if (p.type === "group") s.grp = p.value;
|
|
231
|
+
}
|
|
232
|
+
s.minus = signed(np, "minusSign") ?? "-";
|
|
233
|
+
s.percent = signed(parts(new Intl.NumberFormat(locale, { style: "percent" }), 0.5), "percentSign") ?? "%";
|
|
234
|
+
const ep = parts(new Intl.NumberFormat(locale, { notation: "scientific" }), -15e-6);
|
|
235
|
+
s.exp = ep.find((p) => p.type === "exponentSeparator")?.value ?? "E";
|
|
236
|
+
s.expMinus = signed(ep, "exponentMinusSign") ?? "-";
|
|
237
|
+
s.inf = nf2.format(Infinity);
|
|
238
|
+
s.nan = nf2.format(NaN);
|
|
239
|
+
for (const p of new Intl.NumberFormat(locale, { numberingSystem: "latn" }).formatToParts(1.5)) if (p.type === "decimal") s.latnDec = p.value;
|
|
240
|
+
if (s.digits[0] === "٠") s.perMille = "؉";
|
|
241
|
+
} catch {
|
|
242
|
+
}
|
|
243
|
+
if (s.digits.length !== 10) s.digits = "0123456789";
|
|
244
|
+
return s;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
var localDigits = (str, sy) => sy.digits === "0123456789" ? str : str.replace(/[0-9]/g, (d) => sy.digits[Number(d)]);
|
|
248
|
+
function currency(locale, iso) {
|
|
249
|
+
return memo(`c${locale}${iso}`, () => {
|
|
250
|
+
try {
|
|
251
|
+
const f = new Intl.NumberFormat(locale, { style: "currency", currency: iso });
|
|
252
|
+
const ps = f.formatToParts(1), i = ps.findIndex((p) => p.type === "currency");
|
|
253
|
+
const sym = i < 0 ? iso : ps[i].value + (/^[\u200e\u200f\u061c]+$/.test(ps[i + 1]?.value || "") ? ps[i + 1].value : "");
|
|
254
|
+
return { sym, iso, digits: f.resolvedOptions().maximumFractionDigits ?? 2 };
|
|
255
|
+
} catch {
|
|
256
|
+
return { sym: iso, iso, digits: 2 };
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
function exact(x) {
|
|
261
|
+
if (x === 0) return { M: 0n, s: 0 };
|
|
262
|
+
const dv = new DataView(new ArrayBuffer(8));
|
|
263
|
+
dv.setFloat64(0, x);
|
|
264
|
+
const hi = dv.getUint32(0), lo = dv.getUint32(4);
|
|
265
|
+
const be = hi >>> 20 & 2047;
|
|
266
|
+
let m = BigInt(hi & 1048575) << 32n | BigInt(lo);
|
|
267
|
+
let e = be - 1075;
|
|
268
|
+
if (be === 0) e = -1074;
|
|
269
|
+
else m |= 1n << 52n;
|
|
270
|
+
if (e >= 0) return { M: m << BigInt(e), s: 0 };
|
|
271
|
+
return { M: m * 5n ** BigInt(-e), s: -e };
|
|
272
|
+
}
|
|
273
|
+
function shortest(x) {
|
|
274
|
+
if (x === 0) return { M: 0n, s: 0 };
|
|
275
|
+
const [mant, ex] = x.toExponential().split("e");
|
|
276
|
+
const digits = mant.replace(".", "");
|
|
277
|
+
return { M: BigInt(digits), s: digits.length - 1 - Number(ex) };
|
|
278
|
+
}
|
|
279
|
+
var P10 = (n) => 10n ** BigInt(n);
|
|
280
|
+
function roundTo(d, f, mode, neg) {
|
|
281
|
+
if (d.s <= f) return { M: d.M * P10(f - d.s), s: f };
|
|
282
|
+
const k = P10(d.s - f), q = d.M / k, r = d.M % k, half = k / 2n;
|
|
283
|
+
let up;
|
|
284
|
+
switch (mode) {
|
|
285
|
+
case "HALF_UP":
|
|
286
|
+
up = r >= half;
|
|
287
|
+
break;
|
|
288
|
+
case "HALF_DOWN":
|
|
289
|
+
up = r > half;
|
|
290
|
+
break;
|
|
291
|
+
case "UP":
|
|
292
|
+
up = r > 0n;
|
|
293
|
+
break;
|
|
294
|
+
case "DOWN":
|
|
295
|
+
up = false;
|
|
296
|
+
break;
|
|
297
|
+
case "CEILING":
|
|
298
|
+
up = r > 0n && !neg;
|
|
299
|
+
break;
|
|
300
|
+
case "FLOOR":
|
|
301
|
+
up = r > 0n && neg;
|
|
302
|
+
break;
|
|
303
|
+
default:
|
|
304
|
+
up = r > half || r === half && q % 2n === 1n;
|
|
305
|
+
}
|
|
306
|
+
return { M: up ? q + 1n : q, s: f };
|
|
307
|
+
}
|
|
308
|
+
var digitCount = (M) => M === 0n ? 0 : M.toString().length;
|
|
309
|
+
function affix(text) {
|
|
310
|
+
const out = [];
|
|
311
|
+
for (let i = 0; i < text.length; i++) {
|
|
312
|
+
const c = text[i];
|
|
313
|
+
if (c === "'") {
|
|
314
|
+
const e = text.indexOf("'", i + 1);
|
|
315
|
+
if (e === i + 1) {
|
|
316
|
+
out.push("'");
|
|
317
|
+
i++;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
out.push(e < 0 ? text.slice(i + 1) : text.slice(i + 1, e));
|
|
321
|
+
i = e < 0 ? text.length : e;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (c === "¤") {
|
|
325
|
+
let n = 1;
|
|
326
|
+
while (text[i + n] === "¤") n++;
|
|
327
|
+
out.push({ t: n >= 2 ? "iso" : "cur" });
|
|
328
|
+
i += n - 1;
|
|
329
|
+
continue;
|
|
330
|
+
}
|
|
331
|
+
if (c === "%" || c === "‰" || c === "-" || c === "‰") {
|
|
332
|
+
out.push({ t: c === "-" ? "minus" : c === "%" ? "pct" : "mille" });
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
out.push(c);
|
|
336
|
+
}
|
|
337
|
+
return out;
|
|
338
|
+
}
|
|
339
|
+
function numberPattern(pat) {
|
|
340
|
+
return memo(`n${pat}`, () => {
|
|
341
|
+
let mode = "HALF_EVEN";
|
|
342
|
+
pat = pat.replace(/\{RoundingMode=([A-Z_]+)\}/, (_, m) => {
|
|
343
|
+
mode = m;
|
|
344
|
+
return "";
|
|
345
|
+
});
|
|
346
|
+
const split = (s) => {
|
|
347
|
+
let q = false, start = -1;
|
|
348
|
+
for (let i = 0; i < s.length; i++) {
|
|
349
|
+
const c = s[i];
|
|
350
|
+
if (c === "'") {
|
|
351
|
+
q = !q;
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
if (!q && "#0,.".includes(c)) {
|
|
355
|
+
start = i;
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (start < 0) return { prefix: s, num: "", suffix: "" };
|
|
360
|
+
let end = start;
|
|
361
|
+
while (end < s.length && "#0,.".includes(s[end])) end++;
|
|
362
|
+
if (s[end] === "E") {
|
|
363
|
+
let k = end + 1;
|
|
364
|
+
if (s[k] === "+") k++;
|
|
365
|
+
if (s[k] === "0") {
|
|
366
|
+
while (s[k] === "0") k++;
|
|
367
|
+
end = k;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return { prefix: s.slice(0, start), num: s.slice(start, end), suffix: s.slice(end) };
|
|
371
|
+
};
|
|
372
|
+
const [posText, negText] = (() => {
|
|
373
|
+
let q = false;
|
|
374
|
+
for (let i = 0; i < pat.length; i++) {
|
|
375
|
+
if (pat[i] === "'") q = !q;
|
|
376
|
+
else if (!q && pat[i] === ";") return [pat.slice(0, i), pat.slice(i + 1)];
|
|
377
|
+
}
|
|
378
|
+
return [pat, null];
|
|
379
|
+
})();
|
|
380
|
+
const pos = split(posText);
|
|
381
|
+
const num = pos.num;
|
|
382
|
+
const ei = num.indexOf("E");
|
|
383
|
+
const mant = ei >= 0 ? num.slice(0, ei) : num;
|
|
384
|
+
const expPart = ei >= 0 ? num.slice(ei + 1) : null;
|
|
385
|
+
const di = mant.indexOf(".");
|
|
386
|
+
const intPart = di >= 0 ? mant.slice(0, di) : mant, fracPart = di >= 0 ? mant.slice(di + 1) : "";
|
|
387
|
+
let zeros = (intPart.match(/0/g) || []).length, hashes = (intPart.match(/#/g) || []).length;
|
|
388
|
+
let minFrac = (fracPart.match(/0/g) || []).length, maxFrac = (fracPart.match(/[0#]/g) || []).length;
|
|
389
|
+
if (zeros === 0 && hashes > 0 && di >= 0) {
|
|
390
|
+
zeros = 1;
|
|
391
|
+
hashes--;
|
|
392
|
+
}
|
|
393
|
+
const commas = [];
|
|
394
|
+
for (let i = 0, d = 0; i < intPart.length; i++) {
|
|
395
|
+
if (intPart[i] === ",") commas.push(d);
|
|
396
|
+
else d++;
|
|
397
|
+
}
|
|
398
|
+
const intDigits = zeros + hashes;
|
|
399
|
+
const grouping = commas.length ? intDigits - commas[commas.length - 1] : 0;
|
|
400
|
+
const secondary = commas.length > 1 ? commas[commas.length - 1] - commas[commas.length - 2] : 0;
|
|
401
|
+
const pa = affix(pos.prefix), sa = affix(pos.suffix);
|
|
402
|
+
const all = [...pa, ...sa];
|
|
403
|
+
const mult = all.some((x) => typeof x === "object" && x.t === "pct") ? 2 : all.some((x) => typeof x === "object" && x.t === "mille") ? 3 : 0;
|
|
404
|
+
const neg = negText != null ? split(negText) : null;
|
|
405
|
+
for (const n of [intDigits, maxFrac, (expPart?.match(/0/g) || []).length]) capDigits("Format", n);
|
|
406
|
+
return {
|
|
407
|
+
mode,
|
|
408
|
+
minInt: zeros,
|
|
409
|
+
maxInt: expPart != null ? intDigits : Infinity,
|
|
410
|
+
minFrac,
|
|
411
|
+
maxFrac,
|
|
412
|
+
grouping,
|
|
413
|
+
secondary,
|
|
414
|
+
exp: expPart != null ? { plus: expPart.startsWith("+"), min: (expPart.match(/0/g) || []).length || 1 } : null,
|
|
415
|
+
prefix: pa,
|
|
416
|
+
suffix: sa,
|
|
417
|
+
negPrefix: neg ? affix(neg.prefix) : null,
|
|
418
|
+
negSuffix: neg ? affix(neg.suffix) : null,
|
|
419
|
+
mult,
|
|
420
|
+
cur: all.some((x) => typeof x === "object" && (x.t === "cur" || x.t === "iso"))
|
|
421
|
+
};
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
var renderAffix = (parts, sy, cur) => parts.map((p) => typeof p === "string" ? p : p.t === "pct" ? sy.percent : p.t === "mille" ? sy.perMille : p.t === "minus" ? sy.minus : p.t === "iso" ? cur.iso : cur.sym).join("");
|
|
425
|
+
function group(int, size, secondary, sep) {
|
|
426
|
+
if (!size || int.length <= size) return int;
|
|
427
|
+
const head = int.slice(0, -size), tail = int.slice(-size);
|
|
428
|
+
const s2 = secondary || size;
|
|
429
|
+
const parts = [];
|
|
430
|
+
for (let i = head.length; i > 0; i -= s2) parts.unshift(head.slice(Math.max(0, i - s2), i));
|
|
431
|
+
return [...parts, tail].join(sep);
|
|
432
|
+
}
|
|
433
|
+
function formatNumber(v, pat, locale, icu) {
|
|
434
|
+
const sy = symbols(locale);
|
|
435
|
+
const p = numberPattern(pat);
|
|
436
|
+
const neg = v < 0 || Object.is(v, -0);
|
|
437
|
+
const iso = currencyOf(locale) || "USD";
|
|
438
|
+
const cur = currency(locale, iso);
|
|
439
|
+
let minFrac = p.minFrac, maxFrac = p.maxFrac;
|
|
440
|
+
if (icu && p.cur && !p.exp) {
|
|
441
|
+
minFrac = cur.digits;
|
|
442
|
+
maxFrac = cur.digits;
|
|
443
|
+
}
|
|
444
|
+
let body;
|
|
445
|
+
if (!Number.isFinite(v)) body = Number.isNaN(v) ? sy.nan : sy.inf;
|
|
446
|
+
else {
|
|
447
|
+
const a = Math.abs(v);
|
|
448
|
+
const d0 = icu ? shortest(a) : exact(p.mult ? a * 10 ** p.mult : a);
|
|
449
|
+
const d = icu && p.mult ? { M: d0.M, s: d0.s - p.mult } : d0;
|
|
450
|
+
body = p.exp ? sci(d, p, minFrac, maxFrac, sy, neg) : fixed(d, p, minFrac, maxFrac, sy, neg);
|
|
451
|
+
}
|
|
452
|
+
if (Number.isNaN(v)) return body;
|
|
453
|
+
let pre, suf;
|
|
454
|
+
if (neg && p.negPrefix) {
|
|
455
|
+
pre = renderAffix(p.negPrefix, sy, cur);
|
|
456
|
+
suf = renderAffix(p.negSuffix || [], sy, cur);
|
|
457
|
+
} else {
|
|
458
|
+
pre = (neg ? sy.minus : "") + renderAffix(p.prefix, sy, cur);
|
|
459
|
+
suf = renderAffix(p.suffix, sy, cur);
|
|
460
|
+
}
|
|
461
|
+
if (icu && p.cur) {
|
|
462
|
+
const notSym = (ch) => ch && !/[\p{S}\s]/u.test(ch);
|
|
463
|
+
const last = pre.replace(/[]+$/, "").slice(-1), first = suf.replace(/^[]+/, "")[0];
|
|
464
|
+
if (p.prefix.some((x) => typeof x === "object" && (x.t === "cur" || x.t === "iso")) && notSym(last)) pre += " ";
|
|
465
|
+
if (p.suffix.some((x) => typeof x === "object" && (x.t === "cur" || x.t === "iso")) && notSym(first) && !/^\s/.test(suf)) suf = " " + suf;
|
|
466
|
+
}
|
|
467
|
+
return pre + body + suf;
|
|
468
|
+
}
|
|
469
|
+
function fixed(d, p, minFrac, maxFrac, sy, neg) {
|
|
470
|
+
const r = roundTo(d, maxFrac, p.mode, neg);
|
|
471
|
+
let s = r.M.toString().padStart(r.s + 1, "0");
|
|
472
|
+
let int = s.slice(0, s.length - r.s), frac = s.slice(s.length - r.s);
|
|
473
|
+
frac = frac.replace(/0+$/, "");
|
|
474
|
+
if (frac.length < minFrac) frac = frac.padEnd(minFrac, "0");
|
|
475
|
+
int = int.replace(/^0+/, "");
|
|
476
|
+
if (int.length < p.minInt) int = int.padStart(p.minInt, "0");
|
|
477
|
+
if (!int && !frac) int = "0";
|
|
478
|
+
const g = group(int, p.grouping, p.secondary, "\0");
|
|
479
|
+
return localDigits(g, sy).replace(/\u0000/g, sy.grp) + (frac ? sy.dec + localDigits(frac, sy) : "");
|
|
480
|
+
}
|
|
481
|
+
function sci(d, p, minFrac, maxFrac, sy, neg) {
|
|
482
|
+
const maxInt = p.maxInt === Infinity ? p.minInt : p.maxInt;
|
|
483
|
+
const sig = Math.max(1, maxInt + maxFrac);
|
|
484
|
+
let M = d.M, s = d.s;
|
|
485
|
+
let exponent = 0, intDigits;
|
|
486
|
+
if (M === 0n) {
|
|
487
|
+
exponent = 0;
|
|
488
|
+
intDigits = Math.max(1, p.minInt);
|
|
489
|
+
M = 0n;
|
|
490
|
+
} else {
|
|
491
|
+
const n = digitCount(M);
|
|
492
|
+
if (n > sig) {
|
|
493
|
+
const r = roundTo({ M, s: n - 1 }, sig - 1, p.mode, neg);
|
|
494
|
+
M = r.M;
|
|
495
|
+
s = s - (n - 1) + (sig - 1);
|
|
496
|
+
}
|
|
497
|
+
const n2 = digitCount(M);
|
|
498
|
+
const decimalAt = n2 - s;
|
|
499
|
+
if (maxInt > 1 && maxInt > p.minInt) {
|
|
500
|
+
exponent = decimalAt >= 1 ? Math.trunc((decimalAt - 1) / maxInt) * maxInt : Math.trunc((decimalAt - maxInt) / maxInt) * maxInt;
|
|
501
|
+
intDigits = decimalAt - exponent;
|
|
502
|
+
} else {
|
|
503
|
+
exponent = decimalAt - Math.max(1, p.minInt);
|
|
504
|
+
intDigits = Math.max(1, p.minInt);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
let digits = M === 0n ? "" : M.toString().replace(/0+$/, "");
|
|
508
|
+
const minDigits = p.minInt + minFrac;
|
|
509
|
+
const total = Math.max(digits.length, minDigits, intDigits);
|
|
510
|
+
digits = digits.padEnd(total, "0");
|
|
511
|
+
const int = digits.slice(0, intDigits).padEnd(intDigits, "0");
|
|
512
|
+
let frac = digits.slice(intDigits);
|
|
513
|
+
if (frac.length > minFrac) frac = frac.replace(/0+$/, "").padEnd(minFrac, "0");
|
|
514
|
+
const e = String(Math.abs(exponent)).padStart(p.exp.min, "0");
|
|
515
|
+
const es = exponent < 0 ? sy.expMinus : p.exp.plus ? "+" : "";
|
|
516
|
+
return localDigits(int, sy) + (frac ? sy.dec + localDigits(frac, sy) : "") + sy.exp + es + localDigits(e, sy);
|
|
517
|
+
}
|
|
518
|
+
function javaDouble(x) {
|
|
519
|
+
if (Number.isNaN(x)) return "NaN";
|
|
520
|
+
if (!Number.isFinite(x)) return x > 0 ? "Infinity" : "-Infinity";
|
|
521
|
+
if (x === 0) return Object.is(x, -0) ? "-0.0" : "0.0";
|
|
522
|
+
const a = Math.abs(x);
|
|
523
|
+
if (a >= 1e-3 && a < 1e7) {
|
|
524
|
+
const s = String(x);
|
|
525
|
+
return s.includes(".") ? s : `${s}.0`;
|
|
526
|
+
}
|
|
527
|
+
const [m, e] = x.toExponential().split("e");
|
|
528
|
+
return `${m.includes(".") ? m : `${m}.0`}E${Number(e)}`;
|
|
529
|
+
}
|
|
530
|
+
var dtf = (locale, opts) => memo(`d${locale}${JSON.stringify(opts)}`, () => {
|
|
531
|
+
try {
|
|
532
|
+
return new Intl.DateTimeFormat(locale, { timeZone: "UTC", ...opts });
|
|
533
|
+
} catch {
|
|
534
|
+
return new Intl.DateTimeFormat("en-US", { timeZone: "UTC", ...opts });
|
|
535
|
+
}
|
|
536
|
+
});
|
|
537
|
+
var part = (locale, opts, w, type) => dtf(locale, opts).formatToParts(w).find((p) => p.type === type)?.value ?? "";
|
|
538
|
+
function weekInfo(locale) {
|
|
539
|
+
return memo(`w${locale}`, () => {
|
|
540
|
+
try {
|
|
541
|
+
const L = (
|
|
542
|
+
/** @type {any} */
|
|
543
|
+
new Intl.Locale(locale)
|
|
544
|
+
);
|
|
545
|
+
const w = L.getWeekInfo?.() || L.weekInfo;
|
|
546
|
+
if (w) return { first: w.firstDay, min: w.minimalDays };
|
|
547
|
+
} catch {
|
|
548
|
+
}
|
|
549
|
+
return { first: 7, min: 1 };
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
var DAY_MS = 864e5;
|
|
553
|
+
function weekOf(w, info) {
|
|
554
|
+
const dow = (x) => ((x.getUTCDay() || 7) - info.first + 7) % 7;
|
|
555
|
+
const y = w.getUTCFullYear();
|
|
556
|
+
const jan1 = new Date(Date.UTC(y, 0, 1));
|
|
557
|
+
const doy = Math.round((Date.UTC(y, w.getUTCMonth(), w.getUTCDate()) - jan1.getTime()) / DAY_MS);
|
|
558
|
+
const offset = dow(jan1);
|
|
559
|
+
const firstWeekStart = 7 - offset >= info.min ? -offset : 7 - offset;
|
|
560
|
+
let week = Math.floor((doy - firstWeekStart) / 7) + 1, wy = y;
|
|
561
|
+
if (week < 1) {
|
|
562
|
+
const prev = weekOf(new Date(Date.UTC(y - 1, 11, 31)), info);
|
|
563
|
+
return prev;
|
|
564
|
+
}
|
|
565
|
+
const nextJan1 = new Date(Date.UTC(y + 1, 0, 1));
|
|
566
|
+
const nOff = dow(nextJan1);
|
|
567
|
+
const nextStart = Math.round((nextJan1.getTime() - jan1.getTime()) / DAY_MS) + (7 - nOff >= info.min ? -nOff : 7 - nOff);
|
|
568
|
+
if (doy >= nextStart) {
|
|
569
|
+
week = 1;
|
|
570
|
+
wy = y + 1;
|
|
571
|
+
}
|
|
572
|
+
return { week, year: wy };
|
|
573
|
+
}
|
|
574
|
+
function formatDatePattern(d, pat, locale, tz, icu) {
|
|
575
|
+
const sy = symbols(locale);
|
|
576
|
+
const w = new Date(toWall(d, tz));
|
|
577
|
+
const num = (n, width) => localDigits(String(n).padStart(width, "0"), sy);
|
|
578
|
+
let out = "";
|
|
579
|
+
for (let i = 0; i < pat.length; ) {
|
|
580
|
+
const c = pat[i];
|
|
581
|
+
if (c === "'") {
|
|
582
|
+
if (pat[i + 1] === "'") {
|
|
583
|
+
out += "'";
|
|
584
|
+
i += 2;
|
|
585
|
+
continue;
|
|
586
|
+
}
|
|
587
|
+
const e = pat.indexOf("'", i + 1);
|
|
588
|
+
const lit = e < 0 ? pat.slice(i + 1) : pat.slice(i + 1, e);
|
|
589
|
+
out += lit.replace(/''/g, "'");
|
|
590
|
+
i = e < 0 ? pat.length : e + 1;
|
|
591
|
+
continue;
|
|
592
|
+
}
|
|
593
|
+
if (!/[A-Za-z]/.test(c)) {
|
|
594
|
+
out += c;
|
|
595
|
+
i++;
|
|
596
|
+
continue;
|
|
597
|
+
}
|
|
598
|
+
let n = 1;
|
|
599
|
+
while (pat[i + n] === c) n++;
|
|
600
|
+
i += n;
|
|
601
|
+
capDigits("Format", n);
|
|
602
|
+
out += field(c, n);
|
|
603
|
+
}
|
|
604
|
+
return out;
|
|
605
|
+
function field(c, n) {
|
|
606
|
+
const h = w.getUTCHours();
|
|
607
|
+
switch (c) {
|
|
608
|
+
case "G":
|
|
609
|
+
return part(locale, { era: n >= 4 ? "long" : "short", year: "numeric" }, w, "era");
|
|
610
|
+
case "y":
|
|
611
|
+
case "Y":
|
|
612
|
+
case "u": {
|
|
613
|
+
if (c === "u" && !icu) return num(w.getUTCDay() || 7, n);
|
|
614
|
+
const y = c === "Y" ? weekOf(w, weekInfo(locale)).year : w.getUTCFullYear();
|
|
615
|
+
return n === 2 ? num(y % 100, 2) : num(y, n);
|
|
616
|
+
}
|
|
617
|
+
case "M":
|
|
618
|
+
case "L": {
|
|
619
|
+
const m = w.getUTCMonth() + 1;
|
|
620
|
+
if (n <= 2) return num(m, n);
|
|
621
|
+
const style = n === 3 ? "short" : n === 5 && icu ? "narrow" : "long";
|
|
622
|
+
const fmtForm = c === "M" ? part(locale, { day: "numeric", month: style }, w, "month") : "";
|
|
623
|
+
return fmtForm && !/^[\d\u0660-\u0669\u06f0-\u06f9]+$/.test(fmtForm) ? fmtForm : dtf(locale, { month: style }).format(w);
|
|
624
|
+
}
|
|
625
|
+
case "d":
|
|
626
|
+
return num(w.getUTCDate(), n);
|
|
627
|
+
case "D":
|
|
628
|
+
return num(Math.round((Date.UTC(w.getUTCFullYear(), w.getUTCMonth(), w.getUTCDate()) - Date.UTC(w.getUTCFullYear(), 0, 1)) / DAY_MS) + 1, n);
|
|
629
|
+
case "F":
|
|
630
|
+
return num(Math.floor((w.getUTCDate() - 1) / 7) + 1, n);
|
|
631
|
+
case "w":
|
|
632
|
+
return num(weekOf(w, weekInfo(locale)).week, n);
|
|
633
|
+
case "W": {
|
|
634
|
+
const info = weekInfo(locale), first = new Date(Date.UTC(w.getUTCFullYear(), w.getUTCMonth(), 1));
|
|
635
|
+
const off = ((first.getUTCDay() || 7) - info.first + 7) % 7;
|
|
636
|
+
const startWeek1 = 7 - off >= info.min ? -off : 7 - off;
|
|
637
|
+
return num(Math.floor((w.getUTCDate() - 1 - startWeek1) / 7) + 1, n);
|
|
638
|
+
}
|
|
639
|
+
case "E":
|
|
640
|
+
case "c":
|
|
641
|
+
case "e":
|
|
642
|
+
if ((c === "e" || c === "c") && n <= 2) return num((w.getUTCDay() - weekInfo(locale).first + 7) % 7 + 1, n);
|
|
643
|
+
return part(locale, { weekday: n >= 4 && !(n === 5 && icu) ? "long" : n === 5 && icu ? "narrow" : "short", day: "numeric", month: "long" }, w, "weekday");
|
|
644
|
+
case "a":
|
|
645
|
+
return part(locale, { hour: "numeric", hour12: true }, w, "dayPeriod") || (h < 12 ? "AM" : "PM");
|
|
646
|
+
case "H":
|
|
647
|
+
return num(h, n);
|
|
648
|
+
case "k":
|
|
649
|
+
return num(h || 24, n);
|
|
650
|
+
case "K":
|
|
651
|
+
return num(h % 12, n);
|
|
652
|
+
case "h":
|
|
653
|
+
return num(h % 12 || 12, n);
|
|
654
|
+
case "m":
|
|
655
|
+
return num(w.getUTCMinutes(), n);
|
|
656
|
+
case "s":
|
|
657
|
+
return num(w.getUTCSeconds(), n);
|
|
658
|
+
case "S": {
|
|
659
|
+
const ms = w.getUTCMilliseconds();
|
|
660
|
+
if (!icu) return num(ms, n);
|
|
661
|
+
return localDigits(String(ms).padStart(3, "0").padEnd(n, "0").slice(0, n), sy);
|
|
662
|
+
}
|
|
663
|
+
case "z": {
|
|
664
|
+
try {
|
|
665
|
+
return new Intl.DateTimeFormat(locale, { timeZone: tz || void 0, timeZoneName: n >= 4 ? "long" : "short" }).formatToParts(d).find((x) => x.type === "timeZoneName")?.value || "UTC";
|
|
666
|
+
} catch {
|
|
667
|
+
return "UTC";
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
case "Z":
|
|
671
|
+
case "X":
|
|
672
|
+
case "x": {
|
|
673
|
+
const off = Math.round((w.getTime() - d.getTime()) / 6e4);
|
|
674
|
+
if (c === "X" && off === 0) return "Z";
|
|
675
|
+
const sign = off < 0 ? "-" : "+", a = Math.abs(off), hh = String(Math.floor(a / 60)).padStart(2, "0"), mm = String(a % 60).padStart(2, "0");
|
|
676
|
+
if (c === "Z") return n >= 4 ? `GMT${sign}${hh}:${mm}` : `${sign}${hh}${mm}`;
|
|
677
|
+
return n === 1 ? `${sign}${hh}${mm === "00" ? "" : mm}` : n === 2 ? `${sign}${hh}${mm}` : `${sign}${hh}:${mm}`;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
return icu ? "" : c.repeat(n);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
function formatStyle(d, spec, locale, tz) {
|
|
684
|
+
const o = {};
|
|
685
|
+
for (const kv of spec.split(";")) {
|
|
686
|
+
const [k, v] = kv.split("=");
|
|
687
|
+
if ((k === "date" || k === "time") && /^(short|medium|long|full)$/.test(v)) o[`${k}Style`] = v;
|
|
688
|
+
}
|
|
689
|
+
try {
|
|
690
|
+
return new Intl.DateTimeFormat(locale, { ...o, timeZone: tz || void 0 }).format(d);
|
|
691
|
+
} catch {
|
|
692
|
+
return d.toISOString();
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
var JAVA_DAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
696
|
+
var JAVA_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
697
|
+
function javaDateString(d, tz) {
|
|
698
|
+
const w = new Date(toWall(d, tz)), p = (n) => String(n).padStart(2, "0");
|
|
699
|
+
const zone = tz && tz !== "UTC" ? part("en-US", { timeZoneName: "short" }, d, "timeZoneName") : "UTC";
|
|
700
|
+
return `${JAVA_DAYS[w.getUTCDay()]} ${JAVA_MONTHS[w.getUTCMonth()]} ${p(w.getUTCDate())} ${p(w.getUTCHours())}:${p(w.getUTCMinutes())}:${p(w.getUTCSeconds())} ${zone} ${w.getUTCFullYear()}`;
|
|
701
|
+
}
|
|
702
|
+
var isJavaFormat = (fmt) => typeof fmt === "string" && (fmt.startsWith("java:") || fmt.startsWith("icu:"));
|
|
703
|
+
function formatJava(value, fmt, opt = {}) {
|
|
704
|
+
if (value == null) return "";
|
|
705
|
+
capPattern("Format", fmt);
|
|
706
|
+
const icu = fmt.startsWith("icu:");
|
|
707
|
+
const pat = fmt.slice(icu ? 4 : 5);
|
|
708
|
+
const locale = opt.locale || "en-US";
|
|
709
|
+
if (typeof value === "boolean") return value ? "true" : "false";
|
|
710
|
+
if (value instanceof Date) {
|
|
711
|
+
if (Number.isNaN(value.getTime())) return "";
|
|
712
|
+
if (!pat) {
|
|
713
|
+
if (!icu) return javaDateString(value, opt.timeZone);
|
|
714
|
+
const s = formatStyle(value, "date=medium;time=short", locale, opt.timeZone);
|
|
715
|
+
return /^en\b/i.test(locale) ? s.replace(/^(.*\d{4}), /, "$1 ") : s;
|
|
716
|
+
}
|
|
717
|
+
if (pat.startsWith("@")) return formatStyle(value, pat.slice(1), locale, opt.timeZone);
|
|
718
|
+
return formatDatePattern(value, pat, locale, opt.timeZone, icu);
|
|
719
|
+
}
|
|
720
|
+
if (typeof value === "number") {
|
|
721
|
+
if (!pat || pat.startsWith("@")) {
|
|
722
|
+
if (!icu) return javaDouble(value);
|
|
723
|
+
if (!Number.isFinite(value)) return Number.isNaN(value) ? "NaN" : value > 0 ? "Infinity" : "-Infinity";
|
|
724
|
+
return javaDouble(value).replace(/\.0$/, "").replace(".", symbols(locale).dec);
|
|
725
|
+
}
|
|
726
|
+
return formatNumber(value, pat, locale, icu);
|
|
727
|
+
}
|
|
728
|
+
return String(value);
|
|
729
|
+
}
|
|
730
|
+
function javaString(v, kind, tz) {
|
|
731
|
+
if (v == null) return "null";
|
|
732
|
+
if (typeof v === "boolean") return v ? "true" : "false";
|
|
733
|
+
if (typeof v === "number") return String(kind).toLowerCase() === "int" && Number.isFinite(v) ? String(Math.trunc(v)) : javaDouble(v);
|
|
734
|
+
if (v instanceof Date) return javaDateString(v, tz);
|
|
735
|
+
return String(v);
|
|
736
|
+
}
|
|
737
|
+
function jsString(v) {
|
|
738
|
+
if (v === null) return "null";
|
|
739
|
+
if (v === void 0) return "undefined";
|
|
740
|
+
if (v instanceof Date) return v.toString();
|
|
741
|
+
return String(v);
|
|
742
|
+
}
|
|
743
|
+
function javaFormatString(f, args, locale = "en-US", tz) {
|
|
744
|
+
const sy = symbols(locale);
|
|
745
|
+
let next = 0, out = "";
|
|
746
|
+
const re = /%(?:(\d{1,4})\$)?([-#+ 0,(]{0,7})(\d{1,9})?(?:\.(\d{1,9}))?([a-zA-Z%])/g;
|
|
747
|
+
capText("JavaFormat", f.length);
|
|
748
|
+
let last = 0, m;
|
|
749
|
+
const lit = (a, b) => {
|
|
750
|
+
const t = f.slice(a, b);
|
|
751
|
+
if (t.includes("%")) throw new ExprError(`JavaFormat: "${t.slice(t.indexOf("%"), t.indexOf("%") + 12)}…" is not a format specifier`);
|
|
752
|
+
return t;
|
|
753
|
+
};
|
|
754
|
+
while (m = re.exec(f)) {
|
|
755
|
+
out += lit(last, m.index);
|
|
756
|
+
last = re.lastIndex;
|
|
757
|
+
const [, idx, flags, width, prec, conv] = m;
|
|
758
|
+
if (conv === "%") {
|
|
759
|
+
out += "%";
|
|
760
|
+
continue;
|
|
761
|
+
}
|
|
762
|
+
if (conv === "n") {
|
|
763
|
+
out += "\n";
|
|
764
|
+
continue;
|
|
765
|
+
}
|
|
766
|
+
const v = idx ? args[Number(idx) - 1] : args[next++];
|
|
767
|
+
const w = width ? Number(width) : 0, p = prec != null ? Number(prec) : null;
|
|
768
|
+
capDigits("JavaFormat", w);
|
|
769
|
+
if (p != null && /[fFeE]/.test(conv)) capDigits("JavaFormat", p);
|
|
770
|
+
let s;
|
|
771
|
+
const lc = conv.toLowerCase();
|
|
772
|
+
if (lc === "s") s = javaString(v, void 0, tz);
|
|
773
|
+
else if (lc === "b") s = v == null ? "false" : typeof v === "boolean" ? String(v) : "true";
|
|
774
|
+
else if (lc === "c") s = v == null ? "null" : typeof v === "number" ? String.fromCodePoint(v) : String(v)[0] ?? "";
|
|
775
|
+
else if (v == null) s = "null";
|
|
776
|
+
else {
|
|
777
|
+
const x = Number(v);
|
|
778
|
+
const neg = x < 0 || Object.is(x, -0);
|
|
779
|
+
let body;
|
|
780
|
+
if (lc === "d") body = group(String(Math.abs(Math.trunc(x))), flags.includes(",") ? 3 : 0, 0, "\0");
|
|
781
|
+
else if (lc === "o" || lc === "x") {
|
|
782
|
+
const t = Math.trunc(x);
|
|
783
|
+
const u = t >= 0 ? t : t >= -(2 ** 31) ? t >>> 0 : Number(BigInt.asUintN(64, BigInt(t)));
|
|
784
|
+
body = u.toString(lc === "o" ? 8 : 16);
|
|
785
|
+
} else if (lc === "f") {
|
|
786
|
+
const r = roundTo(shortest(Math.abs(x)), p ?? 6, "HALF_UP", neg);
|
|
787
|
+
const str = r.M.toString().padStart(r.s + 1, "0");
|
|
788
|
+
const int = str.slice(0, str.length - r.s), frac = str.slice(str.length - r.s);
|
|
789
|
+
body = group(int, flags.includes(",") ? 3 : 0, 0, "\0") + (frac ? `${frac}` : "");
|
|
790
|
+
} else if (lc === "e") {
|
|
791
|
+
const d = shortest(Math.abs(x)), n = digitCount(d.M) || 1, pp = p ?? 6;
|
|
792
|
+
const r = d.M === 0n ? { M: 0n, s: pp } : roundTo({ M: d.M, s: n - 1 }, pp, "HALF_UP", neg);
|
|
793
|
+
let e = d.M === 0n ? 0 : n - 1 - d.s;
|
|
794
|
+
let str = r.M.toString();
|
|
795
|
+
if (str.length > pp + 1) {
|
|
796
|
+
str = str.slice(0, -1);
|
|
797
|
+
e++;
|
|
798
|
+
}
|
|
799
|
+
str = str.padStart(pp + 1, "0");
|
|
800
|
+
body = str[0] + (pp ? `${str.slice(1)}` : "") + `${conv}${e < 0 ? "-" : "+"}${String(Math.abs(e)).padStart(2, "0")}`;
|
|
801
|
+
} else {
|
|
802
|
+
s = String(v);
|
|
803
|
+
body = null;
|
|
804
|
+
}
|
|
805
|
+
if (body != null) {
|
|
806
|
+
const loc = lc === "x" || lc === "o" ? body : localDigits(body, sy).replace(/\u0000/g, sy.grp).replace(/\u0001/g, sy.dec);
|
|
807
|
+
const signed = lc === "x" || lc === "o" ? loc : neg ? flags.includes("(") ? `(${loc})` : `-${loc}` : flags.includes("+") ? `+${loc}` : flags.includes(" ") ? ` ${loc}` : loc;
|
|
808
|
+
s = signed;
|
|
809
|
+
if (flags.includes("0") && !flags.includes("-") && s.length < w) {
|
|
810
|
+
const sign = /^[-+ (]/.test(s) ? s[0] : "";
|
|
811
|
+
s = sign + localDigits("0".repeat(w - s.length), sy) + s.slice(sign.length);
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
if (p != null && (lc === "s" || lc === "b" || lc === "c")) s = s.slice(0, p);
|
|
816
|
+
if (conv === "S" || conv === "B" || conv === "X" || conv === "E") s = s.toUpperCase();
|
|
817
|
+
if (s.length < w) s = flags.includes("-") ? s.padEnd(w) : s.padStart(w);
|
|
818
|
+
capText("JavaFormat", out.length + s.length + (f.length - last));
|
|
819
|
+
out += s;
|
|
820
|
+
}
|
|
821
|
+
return out + lit(last, f.length);
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// src/engine/expr/format.js
|
|
825
|
+
var nfCache = /* @__PURE__ */ new Map();
|
|
826
|
+
function nf(locale, opts) {
|
|
827
|
+
const key = locale + JSON.stringify(opts);
|
|
828
|
+
let f = nfCache.get(key);
|
|
829
|
+
if (!f) {
|
|
830
|
+
f = new Intl.NumberFormat(locale, { numberingSystem: "latn", ...opts });
|
|
831
|
+
if (nfCache.size >= 500) nfCache.clear();
|
|
832
|
+
nfCache.set(key, f);
|
|
833
|
+
}
|
|
834
|
+
return f;
|
|
835
|
+
}
|
|
836
|
+
var DAY_MS2 = 864e5;
|
|
837
|
+
var zoneFmt = /* @__PURE__ */ new Map();
|
|
838
|
+
function offsetAt(t, tz) {
|
|
839
|
+
if (!tz) return -new Date(t).getTimezoneOffset();
|
|
840
|
+
if (tz === "UTC" || tz === "Etc/UTC") return 0;
|
|
841
|
+
let z = zoneFmt.get(tz);
|
|
842
|
+
if (!z) {
|
|
843
|
+
let f = null;
|
|
844
|
+
try {
|
|
845
|
+
f = new Intl.DateTimeFormat("en-US", { timeZone: tz, hourCycle: "h23", year: "numeric", month: "numeric", day: "numeric", hour: "numeric", minute: "numeric", second: "numeric" });
|
|
846
|
+
} catch {
|
|
847
|
+
}
|
|
848
|
+
z = { f, cache: /* @__PURE__ */ new Map() };
|
|
849
|
+
if (zoneFmt.size >= 100) zoneFmt.clear();
|
|
850
|
+
zoneFmt.set(tz, z);
|
|
851
|
+
}
|
|
852
|
+
if (!z.f) return -new Date(t).getTimezoneOffset();
|
|
853
|
+
const key = Math.floor(t / 9e5);
|
|
854
|
+
let o = z.cache.get(key);
|
|
855
|
+
if (o === void 0) {
|
|
856
|
+
const p = {};
|
|
857
|
+
for (const x of z.f.formatToParts(new Date(key * 9e5))) p[x.type] = Number(x.value);
|
|
858
|
+
o = Math.round((Date.UTC(p.year, p.month - 1, p.day, p.hour, p.minute, p.second) - key * 9e5) / 6e4);
|
|
859
|
+
if (z.cache.size >= 2e4) z.cache.clear();
|
|
860
|
+
z.cache.set(key, o);
|
|
861
|
+
}
|
|
862
|
+
return o;
|
|
863
|
+
}
|
|
864
|
+
var validTimeZone = (tz) => {
|
|
865
|
+
try {
|
|
866
|
+
new Intl.DateTimeFormat("en-US", { timeZone: tz });
|
|
867
|
+
return true;
|
|
868
|
+
} catch {
|
|
869
|
+
return false;
|
|
870
|
+
}
|
|
871
|
+
};
|
|
872
|
+
var toWall = (d, tz) => {
|
|
873
|
+
const t = d instanceof Date ? d.getTime() : d;
|
|
874
|
+
return t + offsetAt(t, tz) * 6e4;
|
|
875
|
+
};
|
|
876
|
+
function fromWall(w, tz) {
|
|
877
|
+
const a = w - offsetAt(w, tz) * 6e4;
|
|
878
|
+
const b = w - offsetAt(a, tz) * 6e4;
|
|
879
|
+
return new Date(toWall(b, tz) === w ? b : a);
|
|
880
|
+
}
|
|
881
|
+
var zoneDate = (y, m, d, tz, h = 0, mi = 0, sec = 0, ms = 0) => {
|
|
882
|
+
const w = /* @__PURE__ */ new Date(0);
|
|
883
|
+
w.setUTCFullYear(y, m, d);
|
|
884
|
+
w.setUTCHours(h, mi, sec, ms);
|
|
885
|
+
return fromWall(w.getTime(), tz);
|
|
886
|
+
};
|
|
887
|
+
var wallDate = (d, tz) => new Date(toWall(d, tz));
|
|
888
|
+
var ISO = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,9}))?)?\s*(Z|[+-]\d{2}:?\d{2})?)?$/i;
|
|
889
|
+
var NUMERIC = /^(\d{1,4})([./-])(\d{1,2})\2(\d{1,4})(?:[ T,]+(\d{1,2}):(\d{2})(?::(\d{2}))?\s*([AaPp][Mm])?)?$/;
|
|
890
|
+
var orderCache = /* @__PURE__ */ new Map();
|
|
891
|
+
function dateOrder(locale) {
|
|
892
|
+
const l = locale || "en-US";
|
|
893
|
+
let o = orderCache.get(l);
|
|
894
|
+
if (!o) {
|
|
895
|
+
try {
|
|
896
|
+
o = new Intl.DateTimeFormat(l, { year: "numeric", month: "2-digit", day: "2-digit", timeZone: "UTC" }).formatToParts(new Date(Date.UTC(2026, 2, 5))).filter((p) => p.type === "year" || p.type === "month" || p.type === "day").map((p) => p.type[0]).join("");
|
|
897
|
+
} catch {
|
|
898
|
+
o = "mdy";
|
|
899
|
+
}
|
|
900
|
+
if (!/^(mdy|dmy|ymd)$/.test(o)) o = "mdy";
|
|
901
|
+
if (orderCache.size >= 200) orderCache.clear();
|
|
902
|
+
orderCache.set(l, o);
|
|
903
|
+
}
|
|
904
|
+
return o;
|
|
905
|
+
}
|
|
906
|
+
var year2 = (y) => y < 100 ? y + (y < 30 ? 2e3 : 1900) : y;
|
|
907
|
+
var validParts = (y, mo, d, h = 0, mi = 0, s = 0) => mo >= 1 && mo <= 12 && d >= 1 && d <= new Date(Date.UTC(y, mo, 0)).getUTCDate() && h <= 23 && mi <= 59 && s <= 59;
|
|
908
|
+
function toDate(v, opt) {
|
|
909
|
+
if (v == null || v === "") return null;
|
|
910
|
+
if (v instanceof Date) return Number.isNaN(v.getTime()) ? null : v;
|
|
911
|
+
if (typeof v === "number") {
|
|
912
|
+
const d2 = new Date(v);
|
|
913
|
+
return Number.isNaN(d2.getTime()) ? null : d2;
|
|
914
|
+
}
|
|
915
|
+
const s = String(v).trim();
|
|
916
|
+
const tz = opt?.timeZone;
|
|
917
|
+
let m = ISO.exec(s);
|
|
918
|
+
if (m) {
|
|
919
|
+
const [y, mo, d2, h = 0, mi = 0, sec = 0] = [m[1], m[2], m[3], m[4], m[5], m[6]].map((x) => x == null ? void 0 : Number(x));
|
|
920
|
+
if (!validParts(y, mo, d2, h, mi, sec)) return null;
|
|
921
|
+
const ms = m[7] ? Math.round(Number(`0.${m[7]}`) * 1e3) : 0;
|
|
922
|
+
if (!m[8]) return zoneDate(y, mo - 1, d2, tz, h, mi, sec, ms);
|
|
923
|
+
const off = m[8].toUpperCase() === "Z" ? 0 : (m[8][0] === "-" ? -1 : 1) * (Number(m[8].slice(1, 3)) * 60 + Number(m[8].slice(-2)));
|
|
924
|
+
return new Date(Date.UTC(y, mo - 1, d2, h, mi, sec, ms) - off * 6e4);
|
|
925
|
+
}
|
|
926
|
+
m = NUMERIC.exec(s);
|
|
927
|
+
if (m) {
|
|
928
|
+
const a = Number(m[1]), b = Number(m[3]), c = Number(m[4]);
|
|
929
|
+
const ord = m[1].length === 4 ? "ymd" : dateOrder(opt?.locale);
|
|
930
|
+
let [y, mo, d2] = ord === "ymd" ? [a, b, c] : ord === "dmy" ? [c, b, a] : [c, a, b];
|
|
931
|
+
y = year2(y);
|
|
932
|
+
let h = m[5] ? Number(m[5]) : 0;
|
|
933
|
+
const mi = m[6] ? Number(m[6]) : 0, sec = m[7] ? Number(m[7]) : 0;
|
|
934
|
+
if (m[8]) {
|
|
935
|
+
if (h < 1 || h > 12) return null;
|
|
936
|
+
h = h % 12 + (/p/i.test(m[8]) ? 12 : 0);
|
|
937
|
+
}
|
|
938
|
+
if (!validParts(y, mo, d2, h, mi, sec)) return null;
|
|
939
|
+
return zoneDate(y, mo - 1, d2, tz, h, mi, sec);
|
|
940
|
+
}
|
|
941
|
+
if (!/[A-Za-z]{3}/.test(s)) return null;
|
|
942
|
+
const d = new Date(s);
|
|
943
|
+
if (Number.isNaN(d.getTime())) return null;
|
|
944
|
+
return /(Z|GMT|UTC|[+-]\d{2}:?\d{2})\s*$/i.test(s) || !tz ? d : zoneDate(d.getFullYear(), d.getMonth(), d.getDate(), tz, d.getHours(), d.getMinutes(), d.getSeconds(), d.getMilliseconds());
|
|
945
|
+
}
|
|
946
|
+
var isoDate = (d, tz) => formatDate(d, "yyyy-MM-dd", void 0, tz);
|
|
947
|
+
var sepCache = /* @__PURE__ */ new Map();
|
|
948
|
+
function latinDecimal(locale) {
|
|
949
|
+
const d = separators(locale).dec;
|
|
950
|
+
return /^[.,]$/.test(d) ? d : ".";
|
|
951
|
+
}
|
|
952
|
+
function separators(locale) {
|
|
953
|
+
const l = locale || "en-US";
|
|
954
|
+
let r = sepCache.get(l);
|
|
955
|
+
if (!r) {
|
|
956
|
+
let dec = ".", grp = ",";
|
|
957
|
+
try {
|
|
958
|
+
for (const p of new Intl.NumberFormat(l).formatToParts(12345.6)) {
|
|
959
|
+
if (p.type === "decimal") dec = p.value;
|
|
960
|
+
else if (p.type === "group") grp = p.value;
|
|
961
|
+
}
|
|
962
|
+
} catch {
|
|
963
|
+
}
|
|
964
|
+
r = { dec, grp };
|
|
965
|
+
if (sepCache.size >= 200) sepCache.clear();
|
|
966
|
+
sepCache.set(l, r);
|
|
967
|
+
}
|
|
968
|
+
return r;
|
|
969
|
+
}
|
|
970
|
+
function parseNumber(text, locale) {
|
|
971
|
+
let s = String(text).trim();
|
|
972
|
+
if (s === "") return NaN;
|
|
973
|
+
if (/^[+-]?(\d+\.?\d*|\.\d+)(e[+-]?\d+)?$/i.test(s)) {
|
|
974
|
+
const { dec: dec2, grp: grp2 } = separators(locale);
|
|
975
|
+
if (dec2 === "," && grp2 === "." && /^[+-]?\d{1,3}(\.\d{3})+$/.test(s)) return Number(s.replace(/\./g, ""));
|
|
976
|
+
return Number(s);
|
|
977
|
+
}
|
|
978
|
+
let neg = false;
|
|
979
|
+
if (/^\(.*\)$/.test(s)) {
|
|
980
|
+
neg = true;
|
|
981
|
+
s = s.slice(1, -1).trim();
|
|
982
|
+
}
|
|
983
|
+
let pct = false;
|
|
984
|
+
if (s.endsWith("%")) {
|
|
985
|
+
pct = true;
|
|
986
|
+
s = s.slice(0, -1).trim();
|
|
987
|
+
}
|
|
988
|
+
s = s.replace(/^[\p{L}\p{Sc}]+\.?\s*|\s*[\p{L}\p{Sc}]+\.?$/gu, "").replace(/^[^\d.,+-]+|[^\d.,+-]+$/g, "").trim();
|
|
989
|
+
if (/^[+-]/.test(s)) {
|
|
990
|
+
neg = neg !== (s[0] === "-");
|
|
991
|
+
s = s.slice(1).trim();
|
|
992
|
+
} else if (/[+-]$/.test(s)) {
|
|
993
|
+
neg = neg !== s.endsWith("-");
|
|
994
|
+
s = s.slice(0, -1).trim();
|
|
995
|
+
}
|
|
996
|
+
s = s.replace(/^[^\d.,]+|[^\d.,]+$/g, "").trim();
|
|
997
|
+
const { dec, grp } = separators(locale);
|
|
998
|
+
const g = grp === " " || grp === " " || grp === " " ? "[ ]" : grp === "." ? "\\." : grp === "'" || grp === "’" ? "['’]" : grp;
|
|
999
|
+
const d = dec === "." ? "\\." : dec;
|
|
1000
|
+
const india = /-IN$/i.test(locale || "");
|
|
1001
|
+
const re = new RegExp(`^(\\d{1,3}(?:${g}\\d{3})+${india ? `|\\d{1,2}(?:${g}\\d{2})+${g}\\d{3}` : ""}|\\d+)(?:${d}(\\d+))?$`);
|
|
1002
|
+
const m = re.exec(s);
|
|
1003
|
+
if (!m) return NaN;
|
|
1004
|
+
const int = m[1].replace(new RegExp(g, "g"), "");
|
|
1005
|
+
const n = Number(`${int}${m[2] ? `.${m[2]}` : ""}`);
|
|
1006
|
+
if (!Number.isFinite(n)) return NaN;
|
|
1007
|
+
const r = pct ? shiftDecSafe(n, -2) : n;
|
|
1008
|
+
return neg ? -r : r;
|
|
1009
|
+
}
|
|
1010
|
+
var shiftDecSafe = (x, e) => Number(`${x}e${e}`);
|
|
1011
|
+
var P10F = Array.from({ length: 23 }, (_, i) => 10 ** i);
|
|
1012
|
+
var shiftDec = (x, e) => {
|
|
1013
|
+
const [m, k = "0"] = String(x).split("e");
|
|
1014
|
+
return Number(`${m}e${Number(k) + e}`);
|
|
1015
|
+
};
|
|
1016
|
+
function roundHalfAway(v, digits = 0) {
|
|
1017
|
+
if (!Number.isFinite(v)) return v;
|
|
1018
|
+
if (digits >= 0 && digits <= 22) {
|
|
1019
|
+
const i = Math.round(v * P10F[digits]);
|
|
1020
|
+
if (i / P10F[digits] === v) return v + 0;
|
|
1021
|
+
}
|
|
1022
|
+
return Math.sign(v) * shiftDec(Math.round(shiftDec(Math.abs(v), digits)), -digits) + 0;
|
|
1023
|
+
}
|
|
1024
|
+
function roundHalfEven(v, digits = 0) {
|
|
1025
|
+
if (!Number.isFinite(v)) return v;
|
|
1026
|
+
const x = shiftDec(Math.abs(v), digits);
|
|
1027
|
+
const f = Math.floor(x), diff = x - f;
|
|
1028
|
+
const r = diff > 0.5 || diff === 0.5 && f % 2 !== 0 ? f + 1 : f;
|
|
1029
|
+
return Math.sign(v) * shiftDec(r, -digits) + 0;
|
|
1030
|
+
}
|
|
1031
|
+
var REGION_CURRENCY = {
|
|
1032
|
+
US: "USD",
|
|
1033
|
+
IN: "INR",
|
|
1034
|
+
GB: "GBP",
|
|
1035
|
+
DE: "EUR",
|
|
1036
|
+
FR: "EUR",
|
|
1037
|
+
ES: "EUR",
|
|
1038
|
+
IT: "EUR",
|
|
1039
|
+
NL: "EUR",
|
|
1040
|
+
BE: "EUR",
|
|
1041
|
+
AT: "EUR",
|
|
1042
|
+
PT: "EUR",
|
|
1043
|
+
IE: "EUR",
|
|
1044
|
+
FI: "EUR",
|
|
1045
|
+
GR: "EUR",
|
|
1046
|
+
JP: "JPY",
|
|
1047
|
+
CN: "CNY",
|
|
1048
|
+
CA: "CAD",
|
|
1049
|
+
AU: "AUD",
|
|
1050
|
+
NZ: "NZD",
|
|
1051
|
+
CH: "CHF",
|
|
1052
|
+
SG: "SGD",
|
|
1053
|
+
AE: "AED",
|
|
1054
|
+
SA: "SAR",
|
|
1055
|
+
BR: "BRL",
|
|
1056
|
+
MX: "MXN",
|
|
1057
|
+
ZA: "ZAR",
|
|
1058
|
+
KR: "KRW",
|
|
1059
|
+
RU: "RUB",
|
|
1060
|
+
ID: "IDR",
|
|
1061
|
+
MY: "MYR",
|
|
1062
|
+
PH: "PHP",
|
|
1063
|
+
TH: "THB",
|
|
1064
|
+
VN: "VND",
|
|
1065
|
+
PK: "PKR",
|
|
1066
|
+
BD: "BDT",
|
|
1067
|
+
LK: "LKR",
|
|
1068
|
+
NP: "NPR",
|
|
1069
|
+
SE: "SEK",
|
|
1070
|
+
NO: "NOK",
|
|
1071
|
+
DK: "DKK",
|
|
1072
|
+
PL: "PLN",
|
|
1073
|
+
TR: "TRY",
|
|
1074
|
+
IL: "ILS",
|
|
1075
|
+
EG: "EGP",
|
|
1076
|
+
NG: "NGN",
|
|
1077
|
+
KE: "KES",
|
|
1078
|
+
HK: "HKD",
|
|
1079
|
+
TW: "TWD"
|
|
1080
|
+
};
|
|
1081
|
+
var currencyOf = (locale) => {
|
|
1082
|
+
const l = locale || "";
|
|
1083
|
+
if (CURRENCY_OF.has(l)) return CURRENCY_OF.get(l);
|
|
1084
|
+
const m = /^[a-z]{2,3}-(?:[A-Za-z]{4}-)?([A-Za-z]{2})$/i.exec(l);
|
|
1085
|
+
const c = m ? REGION_CURRENCY[m[1].toUpperCase()] : void 0;
|
|
1086
|
+
if (CURRENCY_OF.size < 1e3 && l.length <= 35) CURRENCY_OF.set(l, c);
|
|
1087
|
+
return c;
|
|
1088
|
+
};
|
|
1089
|
+
var CURRENCY_OF = /* @__PURE__ */ new Map();
|
|
1090
|
+
var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
|
|
1091
|
+
var DAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
|
|
1092
|
+
function formatValue(value, fmt, opt = {}) {
|
|
1093
|
+
if (value == null) return "";
|
|
1094
|
+
if (typeof fmt === "string") capPattern("Format", fmt);
|
|
1095
|
+
if (isJavaFormat(fmt)) {
|
|
1096
|
+
if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}/.test(value)) {
|
|
1097
|
+
const d = toDate(value, opt);
|
|
1098
|
+
if (d) value = d;
|
|
1099
|
+
}
|
|
1100
|
+
return formatJava(
|
|
1101
|
+
value,
|
|
1102
|
+
/** @type {string} */
|
|
1103
|
+
fmt,
|
|
1104
|
+
opt
|
|
1105
|
+
);
|
|
1106
|
+
}
|
|
1107
|
+
const locale = opt.locale || "en-US";
|
|
1108
|
+
if (value instanceof Date) {
|
|
1109
|
+
const t = value.getTime();
|
|
1110
|
+
if (Number.isNaN(t)) return "";
|
|
1111
|
+
const tz = opt.timeZone;
|
|
1112
|
+
if (!fmt && toWall(value, tz) % DAY_MS2 !== 0) fmt = `dd MMM yyyy ${standardDate("t", locale)}`;
|
|
1113
|
+
if (!opt.fmtMemo) return formatDate(value, fmt || "dd MMM yyyy", locale, tz);
|
|
1114
|
+
const memo2 = memoFor(opt.fmtMemo, "i", fmt || "dd MMM yyyy", locale);
|
|
1115
|
+
let out = memo2.get(t);
|
|
1116
|
+
if (out === void 0) {
|
|
1117
|
+
out = formatDate(value, fmt || "dd MMM yyyy", locale, tz);
|
|
1118
|
+
memo2.set(t, out);
|
|
1119
|
+
}
|
|
1120
|
+
return out;
|
|
1121
|
+
}
|
|
1122
|
+
if (typeof value === "number") {
|
|
1123
|
+
if (!Number.isFinite(value)) return opt.nonFinite === "blank" ? "" : opt.nonFinite === "error" ? "#Error" : String(value);
|
|
1124
|
+
if (!fmt) return Number.isSafeInteger(value) && !Object.is(value, -0) ? String(value) : general(value, 15, "E", void 0, locale);
|
|
1125
|
+
return numberFn(fmt, locale, opt.currency || currencyOf(opt.locale), opt.grouping)(value);
|
|
1126
|
+
}
|
|
1127
|
+
if (typeof value === "boolean") return value ? "True" : "False";
|
|
1128
|
+
if (typeof value === "object") return plainText(value);
|
|
1129
|
+
if (typeof value === "string" && fmt && /^\d{4}-\d{2}-\d{2}/.test(value)) {
|
|
1130
|
+
const memo2 = opt.fmtMemo && value.length <= 40 ? memoFor(opt.fmtMemo, "s", fmt, locale) : null;
|
|
1131
|
+
let out = memo2?.get(value);
|
|
1132
|
+
if (out === void 0) {
|
|
1133
|
+
const d = toDate(value, opt);
|
|
1134
|
+
out = d && /[yMd]/.test(fmt) ? formatDate(d, fmt, locale, opt.timeZone) : value;
|
|
1135
|
+
memo2?.set(value, out);
|
|
1136
|
+
}
|
|
1137
|
+
return out;
|
|
1138
|
+
}
|
|
1139
|
+
return String(value);
|
|
1140
|
+
}
|
|
1141
|
+
function plainText(v) {
|
|
1142
|
+
if (typeof v === "number") {
|
|
1143
|
+
const s = String(v);
|
|
1144
|
+
return Number.isFinite(v) && /e/.test(s) ? v.toLocaleString("en-US", { useGrouping: false, maximumFractionDigits: 100 }) : s;
|
|
1145
|
+
}
|
|
1146
|
+
if (Array.isArray(v)) return v.map((x) => x == null ? "" : plainText(x)).join(", ");
|
|
1147
|
+
if (v && typeof v === "object" && !(v instanceof Date)) {
|
|
1148
|
+
try {
|
|
1149
|
+
return JSON.stringify(v) ?? String(v);
|
|
1150
|
+
} catch {
|
|
1151
|
+
return String(v);
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
return String(v);
|
|
1155
|
+
}
|
|
1156
|
+
function memoFor(all, kind, fmt, locale) {
|
|
1157
|
+
const key = `${kind}${fmt}${locale}`;
|
|
1158
|
+
let memo2 = all.get(key);
|
|
1159
|
+
if (!memo2) {
|
|
1160
|
+
if (all.size >= 50) all.clear();
|
|
1161
|
+
memo2 = /* @__PURE__ */ new Map();
|
|
1162
|
+
all.set(key, memo2);
|
|
1163
|
+
} else if (memo2.size >= 5e3) memo2.clear();
|
|
1164
|
+
return memo2;
|
|
1165
|
+
}
|
|
1166
|
+
var numberFns = /* @__PURE__ */ new Map();
|
|
1167
|
+
function numberFn(fmt, locale, currency2, grouping) {
|
|
1168
|
+
const key = `${fmt}${locale}${currency2 ?? ""}${grouping ?? ""}`;
|
|
1169
|
+
let fn = numberFns.get(key);
|
|
1170
|
+
if (!fn) {
|
|
1171
|
+
fn = compileNumber(fmt, locale, currency2, grouping);
|
|
1172
|
+
if (key.length <= 128) {
|
|
1173
|
+
if (numberFns.size >= 2e3) numberFns.clear();
|
|
1174
|
+
numberFns.set(key, fn);
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
return fn;
|
|
1178
|
+
}
|
|
1179
|
+
var BIDI_MARKS = /[\u200e\u061c]/g;
|
|
1180
|
+
function compileNumber(fmt, locale, currency2, grouping) {
|
|
1181
|
+
const m = /^([CcNnFfPpDdEeXxGgRr])(\d{0,2})$/.exec(fmt);
|
|
1182
|
+
if (m) {
|
|
1183
|
+
const k = m[1].toUpperCase();
|
|
1184
|
+
const d = m[2] === "" ? null : Number(m[2]);
|
|
1185
|
+
const useGrouping = grouping === "always" ? "always" : grouping === "never" ? false : "auto";
|
|
1186
|
+
const fixed2 = { minimumFractionDigits: d ?? 2, maximumFractionDigits: d ?? 2, signDisplay: "negative", useGrouping };
|
|
1187
|
+
switch (k) {
|
|
1188
|
+
// ja-JP JPY comes out as the full-width ¥ (U+FFE5), which the bundled fonts lack; .NET ja-JP writes ¥ (U+00A5)
|
|
1189
|
+
case "C": {
|
|
1190
|
+
const f = nf(locale, currency2 ? { style: "currency", currency: currency2, ...fixed2 } : fixed2);
|
|
1191
|
+
return (v) => f.format(v).replace(/\uFFE5/g, "¥");
|
|
1192
|
+
}
|
|
1193
|
+
case "N": {
|
|
1194
|
+
const f = nf(locale, fixed2);
|
|
1195
|
+
return (v) => f.format(v).replace(BIDI_MARKS, "");
|
|
1196
|
+
}
|
|
1197
|
+
// .NET's plain "-" (CLDR ar adds U+200E)
|
|
1198
|
+
case "F": {
|
|
1199
|
+
const f = nf(locale, { ...fixed2, useGrouping: false });
|
|
1200
|
+
return (v) => f.format(v);
|
|
1201
|
+
}
|
|
1202
|
+
// the locale's decimal sign, no grouping
|
|
1203
|
+
case "P": {
|
|
1204
|
+
const f = nf(locale, { style: "percent", ...fixed2 });
|
|
1205
|
+
return (v) => f.format(v).replace(BIDI_MARKS, "");
|
|
1206
|
+
}
|
|
1207
|
+
case "D":
|
|
1208
|
+
return (value) => {
|
|
1209
|
+
const t = Math.trunc(value);
|
|
1210
|
+
return (t < 0 ? "-" : "") + String(Math.abs(t)).padStart(d ?? 0, "0");
|
|
1211
|
+
};
|
|
1212
|
+
case "E": {
|
|
1213
|
+
const dec = latinDecimal(locale);
|
|
1214
|
+
return (v) => scientific(v, d ?? 6, m[1] === "e" ? "e" : "E", 3).replace(".", dec);
|
|
1215
|
+
}
|
|
1216
|
+
case "X":
|
|
1217
|
+
return (value) => {
|
|
1218
|
+
const t = Math.trunc(value);
|
|
1219
|
+
const h = t >= 0 ? t.toString(16) : BigInt.asUintN(t >= -(2 ** 31) ? 32 : 64, BigInt(t)).toString(16);
|
|
1220
|
+
return (m[1] === "X" ? h.toUpperCase() : h).padStart(d ?? 0, "0");
|
|
1221
|
+
};
|
|
1222
|
+
case "G":
|
|
1223
|
+
return (v) => general(v, d || 15, m[1] === "g" ? "e" : "E", void 0, locale);
|
|
1224
|
+
case "R":
|
|
1225
|
+
return (v) => general(v, 17, "E", String(v), locale);
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
if (/[#0]/.test(fmt)) return (v) => customNumber(v, fmt, locale);
|
|
1229
|
+
return (v) => String(v);
|
|
1230
|
+
}
|
|
1231
|
+
function scientific(v, digits, e, expDigits) {
|
|
1232
|
+
const [mant, exp] = Math.abs(v).toExponential(digits).split("e");
|
|
1233
|
+
const x = Number(exp);
|
|
1234
|
+
return `${v < 0 ? "-" : ""}${mant}${e}${x < 0 ? "-" : "+"}${String(Math.abs(x)).padStart(expDigits, "0")}`;
|
|
1235
|
+
}
|
|
1236
|
+
function general(v, p, e, shortest2, locale) {
|
|
1237
|
+
if (v === 0) return "0";
|
|
1238
|
+
const [mant, exp] = (shortest2 ? Number(shortest2) : v).toExponential(shortest2 ? void 0 : Math.min(p, 100) - 1).split("e");
|
|
1239
|
+
const x = Number(exp), digits = mant.includes(".") ? mant.replace(/\.?0+$/, "") : mant;
|
|
1240
|
+
const dec = locale ? latinDecimal(locale) : ".";
|
|
1241
|
+
if (x > -5 && x < p) return nf("en-US", { maximumFractionDigits: 20, maximumSignificantDigits: 21, useGrouping: false }).format(Number(`${digits}e${x}`)).replace(".", dec);
|
|
1242
|
+
return `${digits.replace(".", dec)}${e}${x < 0 ? "-" : "+"}${String(Math.abs(x)).padStart(2, "0")}`;
|
|
1243
|
+
}
|
|
1244
|
+
function sections(fmt) {
|
|
1245
|
+
const out = [""];
|
|
1246
|
+
for (let i = 0; i < fmt.length; i++) {
|
|
1247
|
+
const c = fmt[i];
|
|
1248
|
+
if (c === "\\") {
|
|
1249
|
+
out[out.length - 1] += fmt.slice(i, i + 2);
|
|
1250
|
+
i++;
|
|
1251
|
+
continue;
|
|
1252
|
+
}
|
|
1253
|
+
if (c === '"' || c === "'") {
|
|
1254
|
+
const j = fmt.indexOf(c, i + 1);
|
|
1255
|
+
const end = j < 0 ? fmt.length : j;
|
|
1256
|
+
out[out.length - 1] += fmt.slice(i, end + 1);
|
|
1257
|
+
i = end;
|
|
1258
|
+
continue;
|
|
1259
|
+
}
|
|
1260
|
+
if (c === ";") {
|
|
1261
|
+
out.push("");
|
|
1262
|
+
continue;
|
|
1263
|
+
}
|
|
1264
|
+
out[out.length - 1] += c;
|
|
1265
|
+
}
|
|
1266
|
+
return out;
|
|
1267
|
+
}
|
|
1268
|
+
function numTokens(sec) {
|
|
1269
|
+
const toks = [];
|
|
1270
|
+
for (let i = 0; i < sec.length; i++) {
|
|
1271
|
+
const c = sec[i];
|
|
1272
|
+
if (c === "\\") {
|
|
1273
|
+
toks.push({ k: "lit", s: sec[i + 1] ?? "" });
|
|
1274
|
+
i++;
|
|
1275
|
+
continue;
|
|
1276
|
+
}
|
|
1277
|
+
if (c === '"' || c === "'") {
|
|
1278
|
+
const j = sec.indexOf(c, i + 1);
|
|
1279
|
+
const end = j < 0 ? sec.length : j;
|
|
1280
|
+
toks.push({ k: "lit", s: sec.slice(i + 1, end) });
|
|
1281
|
+
i = end;
|
|
1282
|
+
continue;
|
|
1283
|
+
}
|
|
1284
|
+
toks.push("0#.,%".includes(c) ? { k: c } : { k: "lit", s: c });
|
|
1285
|
+
}
|
|
1286
|
+
return toks;
|
|
1287
|
+
}
|
|
1288
|
+
function customNumber(v, fmt, locale) {
|
|
1289
|
+
const secs = sections(fmt);
|
|
1290
|
+
let sec = secs[0], minus = v < 0;
|
|
1291
|
+
if (v < 0 && secs.length > 1 && secs[1] !== "") {
|
|
1292
|
+
sec = secs[1];
|
|
1293
|
+
minus = false;
|
|
1294
|
+
}
|
|
1295
|
+
const sci2 = exponentOf(sec);
|
|
1296
|
+
if (sci2) return (minus ? "-" : "") + scientificCustom(Math.abs(v), sci2, locale);
|
|
1297
|
+
const shape = numShape(numTokens(sec));
|
|
1298
|
+
let x = Math.abs(v);
|
|
1299
|
+
if (shape.pct) x = shiftDec(x, 2 * shape.pct);
|
|
1300
|
+
if (shape.mille) x = shiftDec(x, 3 * shape.mille);
|
|
1301
|
+
if (shape.scale) x = shiftDec(x, -3 * shape.scale);
|
|
1302
|
+
if (secs.length > 2 && secs[2] !== "" && roundHalfAway(x, shape.decimals) === 0) return formatShape(numShape(numTokens(secs[2])), 0, false, locale);
|
|
1303
|
+
return formatShape(shape, x, minus, locale);
|
|
1304
|
+
}
|
|
1305
|
+
function exponentOf(sec) {
|
|
1306
|
+
let q = null;
|
|
1307
|
+
for (let i = 0; i < sec.length; i++) {
|
|
1308
|
+
const c = sec[i];
|
|
1309
|
+
if (q) {
|
|
1310
|
+
if (c === q) q = null;
|
|
1311
|
+
continue;
|
|
1312
|
+
}
|
|
1313
|
+
if (c === '"' || c === "'") {
|
|
1314
|
+
q = c;
|
|
1315
|
+
continue;
|
|
1316
|
+
}
|
|
1317
|
+
if (c === "\\") {
|
|
1318
|
+
i++;
|
|
1319
|
+
continue;
|
|
1320
|
+
}
|
|
1321
|
+
if (c === "E" || c === "e") {
|
|
1322
|
+
const m = /^([+-]?)(0+)/.exec(sec.slice(i + 1));
|
|
1323
|
+
if (m && /[0#]/.test(sec.slice(0, i))) return { mant: sec.slice(0, i), e: c, plus: m[1] === "+", digits: m[2].length, rest: sec.slice(i + 1 + m[0].length) };
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
return null;
|
|
1327
|
+
}
|
|
1328
|
+
function scientificCustom(x, sci2, locale) {
|
|
1329
|
+
const intPh = (sci2.mant.split(".")[0].match(/[0#]/g) || []).length || 1;
|
|
1330
|
+
const decimals = ((sci2.mant.split(".")[1] || "").match(/[0#]/g) || []).length;
|
|
1331
|
+
let exp = 0, m = x;
|
|
1332
|
+
if (x !== 0) {
|
|
1333
|
+
exp = Math.floor(Math.log10(x)) - (intPh - 1);
|
|
1334
|
+
m = shiftDec(x, -exp);
|
|
1335
|
+
if (roundHalfAway(m, decimals) >= 10 ** intPh) {
|
|
1336
|
+
exp++;
|
|
1337
|
+
m = shiftDec(x, -exp);
|
|
1338
|
+
} else if (m < 10 ** (intPh - 1)) {
|
|
1339
|
+
exp--;
|
|
1340
|
+
m = shiftDec(x, -exp);
|
|
1341
|
+
}
|
|
1342
|
+
}
|
|
1343
|
+
const sign = exp < 0 ? "-" : sci2.plus ? "+" : "";
|
|
1344
|
+
const mant = formatShape(numShape(numTokens(sci2.mant)), roundHalfAway(m, decimals), false, locale);
|
|
1345
|
+
const rest = litText(numTokens(sci2.rest));
|
|
1346
|
+
return `${mant}${sci2.e}${sign}${String(Math.abs(exp)).padStart(sci2.digits, "0")}${rest}`;
|
|
1347
|
+
}
|
|
1348
|
+
function numShape(toks) {
|
|
1349
|
+
const ph = (t) => t.k === "0" || t.k === "#";
|
|
1350
|
+
const last = toks.findLastIndex(ph);
|
|
1351
|
+
const first = toks.findIndex((t) => ph(t) || t.k === ".");
|
|
1352
|
+
if (last < 0) return { toks, pre: toks, post: [], int: [], frac: [], decimals: 0, minDec: 0, minInt: 0, grouping: false, scale: 0, pct: 0, inner: false };
|
|
1353
|
+
const span = toks.slice(first, last + 1);
|
|
1354
|
+
let dot = span.findIndex((t) => t.k === ".");
|
|
1355
|
+
if (dot < 0) dot = span.length;
|
|
1356
|
+
const int = span.slice(0, dot), frac = span.slice(dot + 1).filter(ph);
|
|
1357
|
+
let scale = 0;
|
|
1358
|
+
for (let i = int.length - 1; i >= 0 && int[i].k === ","; i--) scale++;
|
|
1359
|
+
const intCore = int.slice(0, int.length - scale);
|
|
1360
|
+
if (dot === span.length) for (let j = last + 1; j < toks.length && toks[j].k === ","; j++) scale++;
|
|
1361
|
+
const intPh = intCore.filter(ph);
|
|
1362
|
+
const z = intPh.findIndex((t) => t.k === "0");
|
|
1363
|
+
const lastZero = frac.findLastIndex((t) => t.k === "0");
|
|
1364
|
+
const sizes = [];
|
|
1365
|
+
for (let i = intCore.length - 1, n = 0; i >= 0; i--) {
|
|
1366
|
+
if (intCore[i].k === ",") {
|
|
1367
|
+
sizes.push(n);
|
|
1368
|
+
n = 0;
|
|
1369
|
+
} else if (ph(intCore[i])) n++;
|
|
1370
|
+
}
|
|
1371
|
+
const groups = sizes.length > 1 && sizes.some((n) => n !== sizes[0]) && sizes.every((n) => n > 0) ? sizes : null;
|
|
1372
|
+
capDigits("Format", frac.length);
|
|
1373
|
+
capDigits("Format", intPh.length);
|
|
1374
|
+
return {
|
|
1375
|
+
pre: toks.slice(0, first),
|
|
1376
|
+
post: toks.slice(last + 1).filter((t) => t.k !== ","),
|
|
1377
|
+
int: intCore,
|
|
1378
|
+
frac,
|
|
1379
|
+
decimals: frac.length,
|
|
1380
|
+
minDec: lastZero + 1,
|
|
1381
|
+
minInt: z < 0 ? 0 : intPh.length - z,
|
|
1382
|
+
grouping: intCore.some((t) => t.k === ","),
|
|
1383
|
+
groups,
|
|
1384
|
+
inner: intCore.some((t) => t.k === "lit"),
|
|
1385
|
+
scale,
|
|
1386
|
+
pct: toks.filter((t) => t.k === "%").length,
|
|
1387
|
+
mille: toks.filter((t) => t.k === "lit" && t.s === "‰").length
|
|
1388
|
+
};
|
|
1389
|
+
}
|
|
1390
|
+
var litText = (toks) => toks.map((t) => t.k === "lit" ? t.s : t.k === "%" ? "%" : t.k === "." ? "." : t.k === "," ? "," : "").join("");
|
|
1391
|
+
function formatShape(s, x, minus, locale) {
|
|
1392
|
+
if (!s.int.length && !s.frac.length) return (minus ? "-" : "") + litText(s.pre);
|
|
1393
|
+
let body;
|
|
1394
|
+
if (s.inner) {
|
|
1395
|
+
const r = roundHalfAway(x, s.decimals);
|
|
1396
|
+
const [ip, fp = ""] = r.toFixed(s.decimals).split(".");
|
|
1397
|
+
let digits = ip === "0" ? "" : ip;
|
|
1398
|
+
const out = [];
|
|
1399
|
+
const phs = s.int.filter((t) => t.k === "0" || t.k === "#").length;
|
|
1400
|
+
let k = 0;
|
|
1401
|
+
for (let i = s.int.length - 1; i >= 0; i--) {
|
|
1402
|
+
const t = s.int[i];
|
|
1403
|
+
if (t.k === "lit") {
|
|
1404
|
+
out.unshift(t.s);
|
|
1405
|
+
continue;
|
|
1406
|
+
}
|
|
1407
|
+
if (t.k !== "0" && t.k !== "#") continue;
|
|
1408
|
+
k++;
|
|
1409
|
+
if (k === phs) {
|
|
1410
|
+
out.unshift(digits || (t.k === "0" ? "0" : ""));
|
|
1411
|
+
digits = "";
|
|
1412
|
+
continue;
|
|
1413
|
+
}
|
|
1414
|
+
const dch = digits.slice(-1);
|
|
1415
|
+
digits = digits.slice(0, -1);
|
|
1416
|
+
out.unshift(dch || (t.k === "0" ? "0" : ""));
|
|
1417
|
+
}
|
|
1418
|
+
const frac = fp.slice(0, s.decimals).replace(new RegExp(`0{0,${s.decimals - s.minDec}}$`), "");
|
|
1419
|
+
body = out.join("") + (frac ? latinDecimal(locale) + frac : "");
|
|
1420
|
+
minus = minus && r !== 0;
|
|
1421
|
+
} else {
|
|
1422
|
+
body = nf(locale, { useGrouping: s.grouping && !s.groups, minimumFractionDigits: s.minDec, maximumFractionDigits: s.decimals, minimumIntegerDigits: Math.max(1, s.minInt) }).format(x);
|
|
1423
|
+
minus = minus && /[1-9]/.test(body);
|
|
1424
|
+
if (s.groups) body = body.replace(/^\d+/, (d) => {
|
|
1425
|
+
const out = [];
|
|
1426
|
+
let k = 0;
|
|
1427
|
+
while (d.length > s.groups[Math.min(k, s.groups.length - 1)]) {
|
|
1428
|
+
const n = s.groups[Math.min(k++, s.groups.length - 1)];
|
|
1429
|
+
out.unshift(d.slice(-n));
|
|
1430
|
+
d = d.slice(0, -n);
|
|
1431
|
+
}
|
|
1432
|
+
return [d, ...out].join(separators(locale).grp);
|
|
1433
|
+
});
|
|
1434
|
+
if (s.minInt === 0) body = body.replace(/^0(?=\D|$)/, "");
|
|
1435
|
+
}
|
|
1436
|
+
return (minus ? "-" : "") + litText(s.pre) + body + litText(s.post);
|
|
1437
|
+
}
|
|
1438
|
+
var dtfCache = /* @__PURE__ */ new Map();
|
|
1439
|
+
function localName(locale, kind, style, w) {
|
|
1440
|
+
const key = `${locale}|${kind}|${style}`;
|
|
1441
|
+
let f = dtfCache.get(key);
|
|
1442
|
+
if (f === void 0) {
|
|
1443
|
+
try {
|
|
1444
|
+
f = new Intl.DateTimeFormat(locale, { [kind]: style, timeZone: "UTC" });
|
|
1445
|
+
} catch {
|
|
1446
|
+
f = null;
|
|
1447
|
+
}
|
|
1448
|
+
if (dtfCache.size >= 500) dtfCache.clear();
|
|
1449
|
+
dtfCache.set(key, f);
|
|
1450
|
+
}
|
|
1451
|
+
return f ? f.format(w) : null;
|
|
1452
|
+
}
|
|
1453
|
+
function localPart(locale, opts, w, type) {
|
|
1454
|
+
const key = `p|${locale}|${JSON.stringify(opts)}`;
|
|
1455
|
+
let f = dtfCache.get(key);
|
|
1456
|
+
if (f === void 0) {
|
|
1457
|
+
try {
|
|
1458
|
+
f = new Intl.DateTimeFormat(locale, { ...opts, timeZone: "UTC" });
|
|
1459
|
+
} catch {
|
|
1460
|
+
f = null;
|
|
1461
|
+
}
|
|
1462
|
+
if (dtfCache.size >= 500) dtfCache.clear();
|
|
1463
|
+
dtfCache.set(key, f);
|
|
1464
|
+
}
|
|
1465
|
+
return f ? f.formatToParts(w).find((p) => p.type === type)?.value ?? null : null;
|
|
1466
|
+
}
|
|
1467
|
+
function dateSep(locale) {
|
|
1468
|
+
const l = locale || "en-US";
|
|
1469
|
+
const key = `sep|${l}`;
|
|
1470
|
+
let v = dtfCache.get(key);
|
|
1471
|
+
if (v === void 0) {
|
|
1472
|
+
try {
|
|
1473
|
+
v = new Intl.DateTimeFormat(l, { day: "2-digit", month: "2-digit", year: "numeric", calendar: "gregory", numberingSystem: "latn", timeZone: "UTC" }).formatToParts(new Date(Date.UTC(2026, 2, 5))).find((p) => p.type === "literal")?.value.trim() || "/";
|
|
1474
|
+
} catch {
|
|
1475
|
+
v = "/";
|
|
1476
|
+
}
|
|
1477
|
+
if (/[\u200e\u200f]/.test(v)) v = v.replace(/[\u200e\u200f]/g, "") || "/";
|
|
1478
|
+
dtfCache.set(key, v);
|
|
1479
|
+
}
|
|
1480
|
+
return v;
|
|
1481
|
+
}
|
|
1482
|
+
var english = (locale) => !locale || /^en\b/i.test(locale);
|
|
1483
|
+
var US_DATES = { d: "M/d/yyyy", D: "dddd, MMMM d, yyyy", t: "h:mm tt", T: "h:mm:ss tt", M: "MMMM d", Y: "MMMM yyyy" };
|
|
1484
|
+
var DAY_FIRST = { d: "dd/MM/yyyy", D: "dddd, dd MMMM yyyy", t: "HH:mm", T: "HH:mm:ss", M: "dd MMMM", Y: "MMMM yyyy" };
|
|
1485
|
+
var NET_SHORT = { "en-IN": "dd-MM-yyyy" };
|
|
1486
|
+
var INVARIANT = { s: "yyyy-MM-dd'T'HH:mm:ss", u: "yyyy-MM-dd HH:mm:ss'Z'", o: "yyyy-MM-dd'T'HH:mm:ss.fffffff" };
|
|
1487
|
+
var patCache = /* @__PURE__ */ new Map();
|
|
1488
|
+
function intlPattern(locale, opts) {
|
|
1489
|
+
const parts = new Intl.DateTimeFormat(locale, { ...opts, calendar: "gregory", numberingSystem: "latn", timeZone: "UTC" }).formatToParts(new Date(Date.UTC(2026, 2, 5, 9, 4, 7)));
|
|
1490
|
+
const h12 = parts.some((p) => p.type === "dayPeriod");
|
|
1491
|
+
return parts.map((p) => {
|
|
1492
|
+
const v = p.value;
|
|
1493
|
+
switch (p.type) {
|
|
1494
|
+
case "year":
|
|
1495
|
+
return "yyyy";
|
|
1496
|
+
case "month":
|
|
1497
|
+
return /^[\d\u0660-\u0669\u06f0-\u06f9]+$/.test(v) ? v.length > 1 ? "MM" : "M" : v.length > 4 || opts.month === "long" ? "MMMM" : "MMM";
|
|
1498
|
+
case "day":
|
|
1499
|
+
return v.length > 1 ? "dd" : "d";
|
|
1500
|
+
case "weekday":
|
|
1501
|
+
return opts.weekday === "long" ? "dddd" : "ddd";
|
|
1502
|
+
case "hour":
|
|
1503
|
+
return h12 ? v.length > 1 ? "hh" : "h" : v.length > 1 ? "HH" : "H";
|
|
1504
|
+
case "minute":
|
|
1505
|
+
return "mm";
|
|
1506
|
+
case "second":
|
|
1507
|
+
return "ss";
|
|
1508
|
+
case "dayPeriod":
|
|
1509
|
+
return "tt";
|
|
1510
|
+
default:
|
|
1511
|
+
return !v ? "" : v.includes("'") ? [...v].map((c) => `\\${c}`).join("") : `'${v}'`;
|
|
1512
|
+
}
|
|
1513
|
+
}).join("");
|
|
1514
|
+
}
|
|
1515
|
+
function localePatterns(locale) {
|
|
1516
|
+
let p = patCache.get(locale);
|
|
1517
|
+
if (!p) {
|
|
1518
|
+
try {
|
|
1519
|
+
p = {
|
|
1520
|
+
d: NET_SHORT[locale] || intlPattern(locale, { dateStyle: "short" }),
|
|
1521
|
+
D: intlPattern(locale, { weekday: "long", year: "numeric", month: "long", day: "numeric" }),
|
|
1522
|
+
t: intlPattern(locale, { hour: "numeric", minute: "2-digit" }),
|
|
1523
|
+
T: intlPattern(locale, { hour: "numeric", minute: "2-digit", second: "2-digit" }),
|
|
1524
|
+
M: intlPattern(locale, { month: "long", day: "numeric" }),
|
|
1525
|
+
Y: intlPattern(locale, { year: "numeric", month: "long" })
|
|
1526
|
+
};
|
|
1527
|
+
} catch {
|
|
1528
|
+
p = DAY_FIRST;
|
|
1529
|
+
}
|
|
1530
|
+
if (patCache.size >= 200) patCache.clear();
|
|
1531
|
+
patCache.set(locale, p);
|
|
1532
|
+
}
|
|
1533
|
+
return p;
|
|
1534
|
+
}
|
|
1535
|
+
function standardDate(fmt, locale) {
|
|
1536
|
+
const p = !locale || /^en-US$/i.test(locale) ? US_DATES : localePatterns(locale);
|
|
1537
|
+
switch (fmt) {
|
|
1538
|
+
case "d":
|
|
1539
|
+
case "D":
|
|
1540
|
+
case "t":
|
|
1541
|
+
case "T":
|
|
1542
|
+
return p[fmt];
|
|
1543
|
+
case "f":
|
|
1544
|
+
return `${p.D} ${p.t}`;
|
|
1545
|
+
case "F":
|
|
1546
|
+
return `${p.D} ${p.T}`;
|
|
1547
|
+
case "g":
|
|
1548
|
+
return `${p.d} ${p.t}`;
|
|
1549
|
+
case "G":
|
|
1550
|
+
return `${p.d} ${p.T}`;
|
|
1551
|
+
case "M":
|
|
1552
|
+
case "m":
|
|
1553
|
+
return p.M;
|
|
1554
|
+
case "Y":
|
|
1555
|
+
case "y":
|
|
1556
|
+
return p.Y;
|
|
1557
|
+
case "s":
|
|
1558
|
+
case "u":
|
|
1559
|
+
case "o":
|
|
1560
|
+
return INVARIANT[fmt];
|
|
1561
|
+
case "O":
|
|
1562
|
+
return INVARIANT.o;
|
|
1563
|
+
}
|
|
1564
|
+
return null;
|
|
1565
|
+
}
|
|
1566
|
+
function formatDate(d, fmt, locale, tz) {
|
|
1567
|
+
if (fmt.length === 1) {
|
|
1568
|
+
const std = standardDate(fmt, locale);
|
|
1569
|
+
if (std) return formatDate(d, std, locale, tz);
|
|
1570
|
+
}
|
|
1571
|
+
if (fmt.length === 2 && fmt[0] === "%") fmt = fmt[1];
|
|
1572
|
+
const w = wallDate(d, tz);
|
|
1573
|
+
const en = english(locale);
|
|
1574
|
+
const name = (kind, style, fallback) => en ? fallback : localName(locale, kind, style, w) ?? fallback;
|
|
1575
|
+
const withDay = /(^|[^d])d{1,2}([^d]|$)/.test(fmt.replace(/'[^']*'|"[^"]*"/g, " "));
|
|
1576
|
+
const month = (style, fallback) => {
|
|
1577
|
+
if (en) return fallback;
|
|
1578
|
+
if (withDay) {
|
|
1579
|
+
const g = localPart(locale, { day: "numeric", month: style }, w, "month");
|
|
1580
|
+
if (g && !/^\d+$/.test(g)) return g;
|
|
1581
|
+
}
|
|
1582
|
+
return localName(locale, "month", style, w) ?? fallback;
|
|
1583
|
+
};
|
|
1584
|
+
const p2 = (n) => String(n).padStart(2, "0");
|
|
1585
|
+
return fmt.replace(/(y+|M+|d+|H+|h+|m+|s+|f+|F+|t+|z+|\/)|'([^']*)'?|"([^"]*)"?|\\(.?)/g, (tok, run, q1, q2, esc) => {
|
|
1586
|
+
if (!run) return q1 ?? q2 ?? esc ?? "";
|
|
1587
|
+
const n = run.length;
|
|
1588
|
+
switch (run[0]) {
|
|
1589
|
+
case "y": {
|
|
1590
|
+
const y = w.getUTCFullYear();
|
|
1591
|
+
return n === 1 ? String(y % 100) : n === 2 ? p2(y % 100) : String(y).padStart(n, "0");
|
|
1592
|
+
}
|
|
1593
|
+
case "M":
|
|
1594
|
+
return n >= 4 ? month("long", MONTHS[w.getUTCMonth()]) : n === 3 ? month("short", MONTHS[w.getUTCMonth()].slice(0, 3)) : n === 2 ? p2(w.getUTCMonth() + 1) : String(w.getUTCMonth() + 1);
|
|
1595
|
+
case "d":
|
|
1596
|
+
return n >= 4 ? name("weekday", "long", DAYS[w.getUTCDay()]) : n === 3 ? name("weekday", "short", DAYS[w.getUTCDay()].slice(0, 3)) : n === 2 ? p2(w.getUTCDate()) : String(w.getUTCDate());
|
|
1597
|
+
case "H":
|
|
1598
|
+
return n >= 2 ? p2(w.getUTCHours()) : String(w.getUTCHours());
|
|
1599
|
+
case "h": {
|
|
1600
|
+
const h = (w.getUTCHours() + 11) % 12 + 1;
|
|
1601
|
+
return n >= 2 ? p2(h) : String(h);
|
|
1602
|
+
}
|
|
1603
|
+
case "m":
|
|
1604
|
+
return n >= 2 ? p2(w.getUTCMinutes()) : String(w.getUTCMinutes());
|
|
1605
|
+
case "s":
|
|
1606
|
+
return n >= 2 ? p2(w.getUTCSeconds()) : String(w.getUTCSeconds());
|
|
1607
|
+
case "f":
|
|
1608
|
+
case "F": {
|
|
1609
|
+
const f = String(w.getUTCMilliseconds()).padStart(3, "0").padEnd(7, "0").slice(0, Math.min(n, 7));
|
|
1610
|
+
return run[0] === "F" ? f.replace(/0+$/, "") : f;
|
|
1611
|
+
}
|
|
1612
|
+
case "t": {
|
|
1613
|
+
const s = (en ? null : localPart(locale, { hour: "numeric", hour12: true }, w, "dayPeriod")) || (w.getUTCHours() < 12 ? "AM" : "PM");
|
|
1614
|
+
return n === 1 ? [...s][0] : s;
|
|
1615
|
+
}
|
|
1616
|
+
case "/":
|
|
1617
|
+
return dateSep(locale);
|
|
1618
|
+
// .NET: the culture's date separator (de-DE 05.03.2026); '/' or \/ for a slash (N17)
|
|
1619
|
+
case ":":
|
|
1620
|
+
return ":";
|
|
1621
|
+
case "z": {
|
|
1622
|
+
const o = Math.round((w.getTime() - d.getTime()) / 6e4), a = Math.abs(o), sg = o < 0 ? "-" : "+";
|
|
1623
|
+
return n === 1 ? `${sg}${Math.floor(a / 60)}` : n === 2 ? `${sg}${p2(Math.floor(a / 60))}` : `${sg}${p2(Math.floor(a / 60))}:${p2(a % 60)}`;
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
return run;
|
|
1627
|
+
});
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1630
|
+
export {
|
|
1631
|
+
ExprError,
|
|
1632
|
+
capText,
|
|
1633
|
+
parse,
|
|
1634
|
+
javaString,
|
|
1635
|
+
jsString,
|
|
1636
|
+
javaFormatString,
|
|
1637
|
+
validTimeZone,
|
|
1638
|
+
toWall,
|
|
1639
|
+
fromWall,
|
|
1640
|
+
toDate,
|
|
1641
|
+
isoDate,
|
|
1642
|
+
parseNumber,
|
|
1643
|
+
roundHalfAway,
|
|
1644
|
+
roundHalfEven,
|
|
1645
|
+
currencyOf,
|
|
1646
|
+
formatValue,
|
|
1647
|
+
plainText,
|
|
1648
|
+
english,
|
|
1649
|
+
standardDate,
|
|
1650
|
+
formatDate
|
|
1651
|
+
};
|
|
1652
|
+
//# sourceMappingURL=chunk-GJS242RR.js.map
|