@gui-chat-plugin/spreadsheet 4.0.2 → 4.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.
@@ -0,0 +1,2856 @@
1
+ import { ARTIFACTS_ROOT as e } from "gui-chat-protocol";
2
+ //#region src/core/definition.ts
3
+ var t = "presentSpreadsheet", n = {
4
+ type: "function",
5
+ name: t,
6
+ description: "Display an Excel-like spreadsheet with formulas and calculations.",
7
+ parameters: {
8
+ type: "object",
9
+ properties: {
10
+ title: {
11
+ type: "string",
12
+ description: "Title for the spreadsheet"
13
+ },
14
+ sheets: {
15
+ type: "array",
16
+ description: "Sheets to render as spreadsheet tabs. Each sheet includes a name and 2D array of cells (rows x columns).",
17
+ items: {
18
+ type: "object",
19
+ properties: {
20
+ name: {
21
+ type: "string",
22
+ description: "Sheet name (e.g., 'Sales Q1', 'Summary')"
23
+ },
24
+ data: {
25
+ type: "array",
26
+ description: "Rows of cells. Each cell is an object with 'v' (value) and 'f' (format). Use Excel-style A1 notation in formulas: columns are letters (A, B, C...), rows are 1-based numbers (1, 2, 3...). Values can be text, numbers, dates, or formulas. Examples: [{\"v\": \"Product\"}, {\"v\": 2024, \"f\": \"#,##0\"}, {\"v\": \"01/15/2025\", \"f\": \"MM/DD/YYYY\"}, {\"v\": \"=B2*1.05\", \"f\": \"$#,##0.00\"}]. Format codes: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date).",
27
+ items: {
28
+ type: "array",
29
+ description: "Row of cells. Each cell is an object with value and format.",
30
+ items: {
31
+ type: "object",
32
+ description: "Cell object with value and optional format. If value is a string starting with '=', it's treated as a formula.",
33
+ properties: {
34
+ v: {
35
+ oneOf: [
36
+ { type: "string" },
37
+ { type: "number" },
38
+ { type: "boolean" }
39
+ ],
40
+ description: "Cell value. Can be text, number, date, or formula (string starting with '='). Examples: 'Revenue', 1500000, '01/15/2025', '=SUM(A1:A10)', '=B2-TODAY()'. Date strings like '01/15/2025' are automatically parsed to date serial numbers."
41
+ },
42
+ f: {
43
+ type: "string",
44
+ description: "Optional format code for displaying the value. Common formats: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date)"
45
+ }
46
+ },
47
+ required: ["v"]
48
+ }
49
+ }
50
+ }
51
+ },
52
+ required: ["name", "data"]
53
+ }
54
+ }
55
+ },
56
+ required: ["title", "sheets"]
57
+ }
58
+ }, r = `Use ${t} whenever the user needs a spreadsheet-style table, multi-step math, or dynamic what-if analysis—do not summarize in text. Build LIVE sheets where every cell is an object {"v": value, "f": format}. For formulas, set "v" to a string starting with "=" (e.g., {"v": "=B2*1.05", "f": "$#,##0.00"}). For dates, use date strings like "01/15/2025" or date formulas like "=TODAY()" or "=DATE(2025,1,15)". The spreadsheet auto-parses common date formats (MM/DD/YYYY, YYYY-MM-DD, DD-MMM-YYYY) into date serial numbers for calculations. Date arithmetic works: "=B2-TODAY()" calculates days between dates. Never pre-calculate; let the spreadsheet compute using cell refs, functions (SUM, AVERAGE, IF, TODAY, DATE, DATEDIF, etc.), and arithmetic. Standard formats: "$#,##0.00" currency, "#,##0" integer, "0.00%" percent, "0.00" decimal, "MM/DD/YYYY" date, "DD-MMM-YYYY" date, "YYYY-MM-DD" ISO date. Format is optional for plain text/numbers.`;
59
+ //#endregion
60
+ //#region src/engine/guards.ts
61
+ function i(e) {
62
+ return typeof e == "object" && !!e && !Array.isArray(e);
63
+ }
64
+ function a(e) {
65
+ return typeof e == "object" && !!e;
66
+ }
67
+ var o = (e, t) => i(e) && typeof e[t] == "string";
68
+ function s(e, t) {
69
+ return e instanceof Error ? e.message : o(e, "details") && e.details ? e.details : o(e, "message") && e.message ? e.message : t === void 0 ? String(e) : t;
70
+ }
71
+ //#endregion
72
+ //#region src/core/paths.ts
73
+ var c = "spreadsheets", l = ".json", u = 16, d = 2, f = (e) => `${e.getUTCFullYear()}/${String(e.getUTCMonth() + 1).padStart(d, "0")}`, ee = () => globalThis.crypto.randomUUID().split("-").join("").slice(0, u);
74
+ function p(t = /* @__PURE__ */ new Date(), n = ee()) {
75
+ let r = `${c}/${f(t)}/${n}${l}`;
76
+ return {
77
+ relPath: r,
78
+ filePath: `${e}/${r}`
79
+ };
80
+ }
81
+ var m = /* @__PURE__ */ new Set([
82
+ "",
83
+ ".",
84
+ ".."
85
+ ]);
86
+ function h(t) {
87
+ return typeof t != "string" || !t.startsWith(`${e}/${c}/`) || !t.endsWith(l) || t.includes("\\") ? !1 : !t.split("/").some((e) => m.has(e));
88
+ }
89
+ var g = (t) => t.slice(e.length + 1), _ = (e) => typeof e == "string" || typeof e == "number" || typeof e == "boolean", te = (e) => e === null || _(e) || i(e) && (e.v === void 0 || e.v === null || _(e.v)) && (e.f === void 0 || typeof e.f == "string"), ne = (e) => Array.isArray(e) && e.every(te), re = (e) => i(e) && typeof e.name == "string" && Array.isArray(e.data) && e.data.every(ne);
90
+ function ie(e) {
91
+ return Array.isArray(e) && e.every(re) ? e : null;
92
+ }
93
+ //#endregion
94
+ //#region src/core/dispatch.ts
95
+ function ae(e) {
96
+ return !i(e) || typeof e.path != "string" ? !1 : e.kind === "loadSpreadsheet" || e.kind === "saveSpreadsheet" && Array.isArray(e.sheets) && e.sheets.every(re);
97
+ }
98
+ var oe = (e) => i(e) && typeof e.read == "function" && typeof e.write == "function";
99
+ function se(e) {
100
+ if (!i(e) || !i(e.files)) return null;
101
+ let t = e.files.artifacts;
102
+ return oe(t) ? t : null;
103
+ }
104
+ async function ce(e, t) {
105
+ let n = await e.read(g(t)), r = ie(JSON.parse(n));
106
+ if (!r) throw Error(`${t} does not hold an array of sheets`);
107
+ return {
108
+ message: `Loaded spreadsheet ${t}`,
109
+ data: { sheets: r }
110
+ };
111
+ }
112
+ async function le(e, t) {
113
+ if (!h(t.path)) throw Error("path must be a .json file under artifacts/spreadsheets/");
114
+ return t.kind === "loadSpreadsheet" ? ce(e, t.path) : (await e.write(g(t.path), JSON.stringify(t.sheets)), {
115
+ message: `Saved spreadsheet ${t.path}`,
116
+ data: { sheets: t.path }
117
+ });
118
+ }
119
+ //#endregion
120
+ //#region src/core/plugin.ts
121
+ function ue(e) {
122
+ if (typeof e != "string") return e;
123
+ try {
124
+ let t = JSON.parse(e);
125
+ return console.warn("Sheets was provided as a string and has been parsed to an array"), t;
126
+ } catch (e) {
127
+ throw Error(`Invalid sheets format: sheets must be an array, not a string. Parse error: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
128
+ }
129
+ }
130
+ function de(e) {
131
+ if (!Array.isArray(e) || e.length === 0) throw Error("At least one sheet is required. Sheets must be an array of sheet objects.");
132
+ e.forEach((e) => {
133
+ if (!e.name || !e.data || e.data.length === 0) throw Error(`Invalid sheet: ${e.name || "unnamed"}. Each sheet must have a name and data array.`);
134
+ });
135
+ }
136
+ var fe = async (e, t) => {
137
+ let { title: n } = t, r = ue(t.sheets);
138
+ de(r);
139
+ let i = "Acknowledge that the spreadsheet has been created and is displayed to the user.", a = se(e);
140
+ if (!a) return {
141
+ message: `Created spreadsheet: ${n}`,
142
+ title: n,
143
+ data: { sheets: r },
144
+ instructions: i
145
+ };
146
+ let { relPath: o, filePath: s } = p();
147
+ return await a.write(o, JSON.stringify(r)), {
148
+ message: `Created spreadsheet: ${n}. Saved to ${s}; the user can edit cells there, so read that file for the current values.`,
149
+ title: n,
150
+ data: { sheets: s },
151
+ instructions: i
152
+ };
153
+ };
154
+ async function pe(e, t) {
155
+ if (!("kind" in t)) return fe(e, t);
156
+ let n = se(e);
157
+ if (!n) throw Error("This host does not provide files.artifacts, so spreadsheets cannot be loaded or saved");
158
+ if (!ae(t)) throw Error("Invalid spreadsheet dispatch");
159
+ return le(n, t);
160
+ }
161
+ var me = {
162
+ toolDefinition: n,
163
+ execute: pe,
164
+ generatingMessage: "Creating spreadsheet...",
165
+ waitingMessage: "Tell the user that the spreadsheet was created and will be presented shortly.",
166
+ isEnabled: () => !0,
167
+ systemPrompt: r
168
+ };
169
+ //#endregion
170
+ //#region src/engine/parser.ts
171
+ function he(e) {
172
+ let t = 0;
173
+ for (let n = 0; n < e.length; n++) t = t * 26 + (e.charCodeAt(n) - 64);
174
+ return t - 1;
175
+ }
176
+ function v(e) {
177
+ let t = "", n = e + 1;
178
+ for (; n > 0;) {
179
+ let e = (n - 1) % 26;
180
+ t = String.fromCharCode(65 + e) + t, n = Math.floor((n - 1) / 26);
181
+ }
182
+ return t;
183
+ }
184
+ //#endregion
185
+ //#region src/engine/spreadsheet-errors.ts
186
+ var ge = [
187
+ "#NULL!",
188
+ "#DIV/0!",
189
+ "#VALUE!",
190
+ "#REF!",
191
+ "#NAME?",
192
+ "#NUM!",
193
+ "#N/A",
194
+ "#ERROR!"
195
+ ], y = class {
196
+ code;
197
+ constructor(e) {
198
+ this.code = e;
199
+ }
200
+ toString() {
201
+ return this.code;
202
+ }
203
+ toJSON() {
204
+ return this.code;
205
+ }
206
+ }, _e = new y("#NULL!"), b = new y("#DIV/0!"), x = new y("#VALUE!"), ve = new y("#REF!"), ye = new y("#NAME?"), S = new y("#NUM!"), C = new y("#N/A"), be = {
207
+ "#NULL!": _e,
208
+ "#DIV/0!": b,
209
+ "#VALUE!": x,
210
+ "#REF!": ve,
211
+ "#NAME?": ye,
212
+ "#NUM!": S,
213
+ "#N/A": C,
214
+ "#ERROR!": new y("#ERROR!")
215
+ }, xe = (e) => be[e], Se = new Set(ge);
216
+ function Ce(e) {
217
+ return typeof e == "string" && Se.has(e);
218
+ }
219
+ function w(e) {
220
+ return e instanceof y;
221
+ }
222
+ function we(e) {
223
+ return w(e) ? e.code : Ce(e) ? e : null;
224
+ }
225
+ function Te(e) {
226
+ return e == null ? !0 : typeof e == "number" ? Number.isNaN(e) || !Number.isFinite(e) : w(e);
227
+ }
228
+ //#endregion
229
+ //#region src/engine/condition.ts
230
+ var Ee = [
231
+ ">=",
232
+ "<=",
233
+ "<>",
234
+ "!=",
235
+ "==",
236
+ "=",
237
+ ">",
238
+ "<"
239
+ ];
240
+ function* De(e) {
241
+ let t = null;
242
+ for (let n = 0; n < e.length; n++) {
243
+ let r = e[n];
244
+ t === null ? r === "\"" || r === "'" ? t = r : yield n : r === "\\" ? n++ : r === t && (t = null);
245
+ }
246
+ }
247
+ function Oe(e) {
248
+ let t = e.trim();
249
+ for (; t.startsWith("(") && t.endsWith(")");) {
250
+ let e = 0, n = !0;
251
+ for (let r of De(t)) {
252
+ let i = t[r];
253
+ if (i === "(") e++;
254
+ else if (i === ")") {
255
+ if (e--, e === 0 && r < t.length - 1) {
256
+ n = !1;
257
+ break;
258
+ }
259
+ if (e < 0) return t;
260
+ }
261
+ }
262
+ if (!n || e !== 0) return t;
263
+ t = t.slice(1, -1).trim();
264
+ }
265
+ return t;
266
+ }
267
+ function ke(e) {
268
+ let t = Oe(e);
269
+ for (let e of De(t)) for (let n of Ee) if (t.startsWith(n, e)) return {
270
+ left: t.slice(0, e).trim(),
271
+ operator: n,
272
+ right: t.slice(e + n.length).trim()
273
+ };
274
+ return null;
275
+ }
276
+ function Ae(e) {
277
+ return e.length >= 2 && (e.startsWith("\"") && e.endsWith("\"") || e.startsWith("'") && e.endsWith("'")) ? {
278
+ value: e.slice(1, -1).replace(/\\(["'\\])/g, "$1"),
279
+ quoted: !0
280
+ } : {
281
+ value: e,
282
+ quoted: !1
283
+ };
284
+ }
285
+ function je(e) {
286
+ let { value: t, quoted: n } = Ae(e.trim());
287
+ if (n) return t;
288
+ if (t === "") return "";
289
+ let r = t.toUpperCase();
290
+ if (r === "TRUE") return !0;
291
+ if (r === "FALSE") return !1;
292
+ let i = Number(t);
293
+ return Number.isNaN(i) ? t : i;
294
+ }
295
+ function Me(e, t) {
296
+ return typeof e == "number" && typeof t == "number" ? e - t : typeof e == "boolean" || typeof t == "boolean" ? null : String(e).localeCompare(String(t));
297
+ }
298
+ function Ne(e, t, n) {
299
+ if (e === "=" || e === "==") return t === n;
300
+ if (e === "<>" || e === "!=") return t !== n;
301
+ let r = Me(t, n);
302
+ return r === null ? !1 : e === ">" ? r > 0 : e === ">=" ? r >= 0 : e === "<" ? r < 0 : r <= 0;
303
+ }
304
+ function Pe(e) {
305
+ return typeof e == "boolean" ? e : typeof e == "number" ? e !== 0 : e !== "";
306
+ }
307
+ function Fe(e, t) {
308
+ let n = ke(e);
309
+ return n ? Ne(n.operator, t(n.left), t(n.right)) : Pe(t(Oe(e)));
310
+ }
311
+ function Ie(e) {
312
+ if (e == null) return "\"\"";
313
+ let t = w(e) ? e.code : e;
314
+ return typeof t == "string" ? `"${t.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"` : t.toString();
315
+ }
316
+ //#endregion
317
+ //#region src/engine/cellEmpty.ts
318
+ function Le(e) {
319
+ if (e == null) return !0;
320
+ if (typeof e == "string") return e.trim() === "";
321
+ if (a(e)) {
322
+ if (!("v" in e)) return !0;
323
+ let t = e.v;
324
+ return t == null || typeof t == "string" && t.trim() === "";
325
+ }
326
+ return !1;
327
+ }
328
+ //#endregion
329
+ //#region src/engine/date-utils.ts
330
+ var Re = 864e5, ze = new Date(Date.UTC(1899, 11, 30)), T = (e) => (e.getTime() - ze.getTime()) / Re, E = (e) => {
331
+ let t = Math.floor(e), n = e - t, r = new Date(ze.getTime() + t * Re), i = Math.round(n * 24 * 60 * 60);
332
+ return r.setSeconds(r.getSeconds() + i), r;
333
+ }, Be = [
334
+ "Jan",
335
+ "Feb",
336
+ "Mar",
337
+ "Apr",
338
+ "May",
339
+ "Jun",
340
+ "Jul",
341
+ "Aug",
342
+ "Sep",
343
+ "Oct",
344
+ "Nov",
345
+ "Dec"
346
+ ], Ve = [
347
+ "January",
348
+ "February",
349
+ "March",
350
+ "April",
351
+ "May",
352
+ "June",
353
+ "July",
354
+ "August",
355
+ "September",
356
+ "October",
357
+ "November",
358
+ "December"
359
+ ], He = [
360
+ "Sun",
361
+ "Mon",
362
+ "Tue",
363
+ "Wed",
364
+ "Thu",
365
+ "Fri",
366
+ "Sat"
367
+ ], Ue = [
368
+ "Sunday",
369
+ "Monday",
370
+ "Tuesday",
371
+ "Wednesday",
372
+ "Thursday",
373
+ "Friday",
374
+ "Saturday"
375
+ ], We = 864e5, D = 12;
376
+ function Ge(e, t) {
377
+ let n = e.getUTCMonth() + t, r = e.getUTCFullYear() + Math.floor(n / D), i = (n % D + D) % D, a = new Date(Date.UTC(r, i + 1, 0)).getUTCDate(), o = Math.min(e.getUTCDate(), a);
378
+ return new Date(Date.UTC(r, i, o));
379
+ }
380
+ function Ke(e, t, n) {
381
+ if (e > t) return S;
382
+ let r = E(e), i = E(t), a = i.getUTCFullYear() - r.getUTCFullYear(), o = i.getUTCMonth() - r.getUTCMonth(), s = i.getUTCDate() - r.getUTCDate();
383
+ switch (n.toUpperCase()) {
384
+ case "Y": {
385
+ let e = a;
386
+ return o < 0 || o === 0 && s < 0 ? e - 1 : e;
387
+ }
388
+ case "M": {
389
+ let e = a * D + o;
390
+ return s < 0 ? e - 1 : e;
391
+ }
392
+ case "D": return Math.floor(t - e);
393
+ case "MD": {
394
+ let e = Ge(r, a * D + o - +(s < 0)), t = Date.UTC(i.getUTCFullYear(), i.getUTCMonth(), i.getUTCDate());
395
+ return Math.round((t - e.getTime()) / We);
396
+ }
397
+ case "YM": {
398
+ let e = s < 0 ? o - 1 : o;
399
+ return e < 0 ? e + D : e;
400
+ }
401
+ case "YD": {
402
+ let e = new Date(r);
403
+ return e.setUTCFullYear(i.getUTCFullYear()), e.getTime() - i.getTime() > 0 && e.setUTCFullYear(i.getUTCFullYear() - 1), Math.floor((i.getTime() - e.getTime()) / We);
404
+ }
405
+ default: return S;
406
+ }
407
+ }
408
+ //#endregion
409
+ //#region src/engine/formatter.ts
410
+ function qe(e) {
411
+ return /[YMD]|MMM|DD|YYYY|h:mm|AM\/PM/i.test(e);
412
+ }
413
+ var Je = /YYYY|YY|MMMM|MMM|MM|M|dddd|ddd|DD|D|AM\/PM|am\/pm|HH|H|hh|h|mm|ss/g;
414
+ function Ye(e, t) {
415
+ let n = E(e), r = n.getUTCFullYear(), i = n.getUTCMonth(), a = n.getUTCDate(), o = n.getUTCHours(), s = n.getUTCMinutes(), c = n.getUTCSeconds(), l = n.getUTCDay(), u = /AM\/PM|am\/pm/.test(t), d = o % 12 || 12, f = o >= 12, ee = {
416
+ YYYY: r.toString(),
417
+ YY: (r % 100).toString().padStart(2, "0"),
418
+ MMMM: Ve[i] ?? Ve[0],
419
+ MMM: Be[i] ?? Be[0],
420
+ MM: (i + 1).toString().padStart(2, "0"),
421
+ M: (i + 1).toString(),
422
+ dddd: Ue[l] ?? Ue[0],
423
+ ddd: He[l] ?? He[0],
424
+ DD: a.toString().padStart(2, "0"),
425
+ D: a.toString(),
426
+ "AM/PM": f ? "PM" : "AM",
427
+ "am/pm": f ? "pm" : "am",
428
+ HH: o.toString().padStart(2, "0"),
429
+ H: o.toString(),
430
+ hh: (u ? d : o).toString().padStart(2, "0"),
431
+ h: (u ? d : o).toString(),
432
+ mm: s.toString().padStart(2, "0"),
433
+ ss: c.toString().padStart(2, "0")
434
+ };
435
+ return t.replace(Je, (e) => ee[e] ?? e);
436
+ }
437
+ var Xe = 3, Ze = (e) => Array.from(e).reduce((t, n, r) => r > 0 && (e.length - r) % Xe === 0 ? `${t},${n}` : `${t}${n}`, ""), Qe = (e) => {
438
+ let [t, ...n] = e.split(".");
439
+ return t === void 0 ? e : [Ze(t), ...n].join(".");
440
+ };
441
+ function $e(e, t) {
442
+ if (!t) return e.toString();
443
+ try {
444
+ if (qe(t)) return Ye(e, t);
445
+ if (t.includes("$")) {
446
+ let n = (t.match(/\.0+/) || [""])[0].length - 1, r = Math.abs(e).toFixed(n >= 0 ? n : 0), i = "$" + (t.includes(",") ? Qe(r) : r);
447
+ return e < 0 ? "-" + i : i;
448
+ }
449
+ if (t.includes("%")) {
450
+ let n = (t.match(/\.0+/) || [""])[0].length - 1;
451
+ return (e * 100).toFixed(n >= 0 ? n : 2) + "%";
452
+ }
453
+ if (t.includes(",")) {
454
+ let n = (t.match(/\.0+/) || [""])[0].length - 1, r = Qe(Math.abs(e).toFixed(n >= 0 ? n : 0));
455
+ return e < 0 ? "-" + r : r;
456
+ }
457
+ let n = (t.match(/\.0+/) || [""])[0].length - 1;
458
+ return n >= 0 ? e.toFixed(n) : e.toString();
459
+ } catch (t) {
460
+ return console.error("Format error:", t), e.toString();
461
+ }
462
+ }
463
+ //#endregion
464
+ //#region src/engine/translateFormula.ts
465
+ function et(e) {
466
+ return e.replace(/\^/g, "**");
467
+ }
468
+ function tt(e, t) {
469
+ return e === "" ? t : t === e ? "" : e;
470
+ }
471
+ function nt(e) {
472
+ let t = e.split(""), n = [], r = "";
473
+ return t.forEach((e, i) => {
474
+ !(i > 0 && t[i - 1] === "\\") && (e === "\"" || e === "'") && (r = tt(r, e)), n.push(e === "&" && r === "" ? "+" : e);
475
+ }), n.join("");
476
+ }
477
+ function rt(e) {
478
+ return e.replace(/([^<>!])=([^=])/g, "$1==$2");
479
+ }
480
+ function it(e) {
481
+ return /^[\d+\-*/(). ]+$/.test(e);
482
+ }
483
+ function at(e) {
484
+ return /^[\d+\-*/(). <>!=]+$/.test(e);
485
+ }
486
+ //#endregion
487
+ //#region src/engine/formulaError.ts
488
+ var O = {
489
+ div_zero: "#DIV/0!",
490
+ invalid_ref: "#REF!",
491
+ syntax: "#NAME?",
492
+ unknown: "#ERROR!"
493
+ }, ot = {
494
+ [O.div_zero]: "div_zero",
495
+ [O.invalid_ref]: "invalid_ref",
496
+ [O.syntax]: "syntax"
497
+ }, k = class extends Error {
498
+ errorType;
499
+ display;
500
+ constructor(e, t, n) {
501
+ super(n ?? t), this.errorType = e, this.display = t, this.name = "FormulaError";
502
+ }
503
+ }, st = (e) => e instanceof k, ct = () => new k("div_zero", O.div_zero, "Division by zero"), lt = (e) => new k("invalid_ref", O.invalid_ref, `Invalid reference: ${e}`), ut = (e) => new k("syntax", O.syntax, `Unknown function: ${e}`), dt = (e) => new k("unknown", O.unknown, e), ft = (e) => new k(ot[e] ?? "unknown", e, `Propagated error: ${e}`), pt = (e) => st(e) ? {
504
+ type: e.errorType,
505
+ display: e.display
506
+ } : {
507
+ type: "unknown",
508
+ display: O.unknown
509
+ }, A = (e) => isNaN(e) ? null : e;
510
+ function mt(e) {
511
+ if (e.includes("%")) {
512
+ let t = A(parseFloat(e.replace("%", "").trim()));
513
+ return t === null ? null : t / 100;
514
+ }
515
+ return e.includes("$") ? A(parseFloat(e.replace(/[$,]/g, "").trim())) : e.includes(",") ? A(parseFloat(e.replace(/,/g, "").trim())) : A(parseFloat(e));
516
+ }
517
+ function j(e) {
518
+ return typeof e == "number" ? !isNaN(e) : typeof e == "string" && mt(e) !== null;
519
+ }
520
+ function ht(e) {
521
+ return typeof e == "number" ? e : typeof e == "boolean" ? +!!e : typeof e == "string" ? mt(e) ?? x : e;
522
+ }
523
+ //#endregion
524
+ //#region src/engine/registry.ts
525
+ var gt = (e, t) => /* @__PURE__ */ Error(`${e} requires at least ${t} argument${t === 1 ? "" : "s"}`), M = (e, t, n) => {
526
+ let r = t[n];
527
+ if (r === void 0) throw gt(e.functionName, n + 1);
528
+ return r;
529
+ }, N = (e) => e.getRangeValuesRaw ?? e.getRangeValues, P = new class {
530
+ functions = /* @__PURE__ */ new Map();
531
+ register(e) {
532
+ this.functions.set(e.name.toUpperCase(), e);
533
+ }
534
+ get(e) {
535
+ return this.functions.get(e.toUpperCase());
536
+ }
537
+ hasFunction(e) {
538
+ return this.functions.has(e.toUpperCase());
539
+ }
540
+ getAllFunctions() {
541
+ return Array.from(this.functions.values());
542
+ }
543
+ getFunctionsByCategory() {
544
+ let e = /* @__PURE__ */ new Map();
545
+ for (let t of Array.from(this.functions.values())) {
546
+ let n = t.category || "Other";
547
+ e.has(n) || e.set(n, []), e.get(n).push(t);
548
+ }
549
+ return e;
550
+ }
551
+ }(), _t = (e) => /^[A-Z]+$/i.test(e) || P.hasFunction(e);
552
+ function F(e) {
553
+ return typeof e == "number" ? e : mt(String(e)) ?? 0;
554
+ }
555
+ function I(e) {
556
+ return String(e);
557
+ }
558
+ var vt = /[.*+?^${}()|[\]\\]/, yt = (e) => vt.test(e) ? `\\${e}` : e, bt = /~([\s\S])|[\s\S]/g, xt = (e) => e.replace(bt, (e, t) => t === void 0 ? e === "*" ? ".*" : e === "?" ? "." : yt(e) : yt(t));
559
+ function St(e) {
560
+ let t = RegExp(`^${xt(e)}$`, "iu");
561
+ return (e) => t.test(e);
562
+ }
563
+ function L(e) {
564
+ let t = e.trim().replace(/^["']|["']$/g, ""), [, n, r] = t.match(/^([><=!]+)(.+)$/) ?? [];
565
+ if (n !== void 0 && r !== void 0) {
566
+ let e = parseFloat(r), t = Ct(r);
567
+ switch (n) {
568
+ case ">": return (t) => F(t) > e;
569
+ case ">=": return (t) => F(t) >= e;
570
+ case "<": return (t) => F(t) < e;
571
+ case "<=": return (t) => F(t) <= e;
572
+ case "=":
573
+ case "==": return t;
574
+ case "!=":
575
+ case "<>": return (e) => !t(e);
576
+ default: return () => !1;
577
+ }
578
+ }
579
+ return Ct(t);
580
+ }
581
+ function Ct(e) {
582
+ let t = St(e), n = parseFloat(e), r = !isNaN(n);
583
+ return (e) => t(String(e)) || r && F(e) === n;
584
+ }
585
+ //#endregion
586
+ //#region src/engine/date-parser.ts
587
+ function wt(e) {
588
+ if (typeof e != "string" || e.length < 6 || e.length > 30) return !1;
589
+ let t = /\d/.test(e), n = /[/\-\s,]/.test(e);
590
+ return !t || !n ? !1 : [
591
+ /^\d{1,2}\/\d{1,2}\/\d{2,4}$/,
592
+ /^\d{4}-\d{1,2}-\d{1,2}$/,
593
+ /^\d{4}\/\d{1,2}\/\d{1,2}$/,
594
+ /^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/,
595
+ /^[A-Za-z]{3,9}\s+\d{1,2},?\s+\d{4}$/,
596
+ /^\d{1,2}\s+[A-Za-z]{3,9}\s+\d{4}$/
597
+ ].some((t) => t.test(e.trim()));
598
+ }
599
+ function Tt(e, t, n) {
600
+ return Ft(e, t, n) ? T(new Date(Date.UTC(e, t - 1, n))) : null;
601
+ }
602
+ function R(e, t) {
603
+ let [, n, r, i] = e.match(t) ?? [];
604
+ return n === void 0 || r === void 0 || i === void 0 ? null : [
605
+ n,
606
+ r,
607
+ i
608
+ ];
609
+ }
610
+ var Et = /^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/, Dt = 12, Ot = (e, t, n) => e > Dt || t <= Dt && e <= Dt && n;
611
+ function kt(e) {
612
+ let t = e.toLowerCase(), n = Be.findIndex((e) => e.toLowerCase() === t);
613
+ if (n !== -1) return n + 1;
614
+ let r = Ve.findIndex((e) => e.toLowerCase() === t);
615
+ return r === -1 ? null : r + 1;
616
+ }
617
+ function At(e, t = !1) {
618
+ if (!wt(e)) return null;
619
+ let n = e.trim(), r = R(n, /^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);
620
+ if (r) {
621
+ let [e, t, n] = r;
622
+ return Tt(parseInt(e), parseInt(t), parseInt(n));
623
+ }
624
+ let i = R(n, /^(\d{1,2})-([A-Za-z]{3})-(\d{2,4})$/);
625
+ if (i) {
626
+ let [e, t, n] = i;
627
+ return Pt(Nt(parseInt(n)), t, parseInt(e));
628
+ }
629
+ let a = R(n, /^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{4})$/);
630
+ if (a) {
631
+ let [e, t, n] = a;
632
+ return Pt(parseInt(n), e, parseInt(t));
633
+ }
634
+ let o = R(n, /^(\d{1,2})\s+([A-Za-z]{3,9})\s+(\d{4})$/);
635
+ if (o) {
636
+ let [e, t, n] = o;
637
+ return Pt(parseInt(n), t, parseInt(e));
638
+ }
639
+ let s = R(n, Et);
640
+ if (s) {
641
+ let [e, n, r] = s, i = Ot(parseInt(e), parseInt(n), t), a = parseInt(i ? n : e), o = parseInt(i ? e : n);
642
+ return Tt(Nt(parseInt(r)), a, o);
643
+ }
644
+ return null;
645
+ }
646
+ var jt = 100, Mt = 30;
647
+ function Nt(e) {
648
+ return e >= jt ? e : e < Mt ? 2e3 + e : 1900 + e;
649
+ }
650
+ function Pt(e, t, n) {
651
+ let r = kt(t);
652
+ return r === null ? null : Tt(e, r, n);
653
+ }
654
+ function Ft(e, t, n) {
655
+ if (e < 1900 || e > 2100 || t < 1 || t > 12 || n < 1 || n > 31) return !1;
656
+ let r = new Date(Date.UTC(e, t - 1, n));
657
+ return r.getUTCFullYear() === e && r.getUTCMonth() === t - 1 && r.getUTCDate() === n;
658
+ }
659
+ function It(e, t = !1) {
660
+ let n = e.trim();
661
+ if (/^\d{4}-\d{1,2}-\d{1,2}$/.test(n)) return "YYYY-MM-DD";
662
+ if (/^\d{4}\/\d{1,2}\/\d{1,2}$/.test(n)) return "YYYY/MM/DD";
663
+ if (/^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/.test(n)) return "DD-MMM-YYYY";
664
+ if (/^[A-Za-z]{3}\s+\d{1,2},?\s+\d{4}$/.test(n)) return "MMM D, YYYY";
665
+ if (/^[A-Za-z]{4,9}\s+\d{1,2},?\s+\d{4}$/.test(n)) return "MMMM D, YYYY";
666
+ let r = R(n, Et);
667
+ if (r) {
668
+ let [e, n] = r;
669
+ return Ot(parseInt(e), parseInt(n), t) ? "DD/MM/YYYY" : "MM/DD/YYYY";
670
+ }
671
+ return t ? "DD/MM/YYYY" : "MM/DD/YYYY";
672
+ }
673
+ //#endregion
674
+ //#region src/engine/evaluator.ts
675
+ function Lt(e) {
676
+ if (e == null) return "0";
677
+ let t = w(e) ? e.code : e;
678
+ return typeof t == "string" ? `"${t.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")}"` : t.toString();
679
+ }
680
+ function Rt(e) {
681
+ let t = "", n = null;
682
+ for (let r = 0; r < e.length; r++) {
683
+ let i = e[r];
684
+ if (n !== null) {
685
+ if (i === "\\") {
686
+ r++;
687
+ continue;
688
+ }
689
+ i === n && (n = null, t += i);
690
+ } else (i === "\"" || i === "'") && (n = i), t += i;
691
+ }
692
+ return t;
693
+ }
694
+ function zt(e) {
695
+ let t = Rt(e).replace(/\b(?:true|false)\b/g, "");
696
+ return /^[\d+\-*/(). "']*$/.test(t);
697
+ }
698
+ function Bt(e, t) {
699
+ let n = e[t], r = t + 1;
700
+ for (; r < e.length;) if (e[r] === "\\") r += 2;
701
+ else {
702
+ if (e[r] === n) return r + 1;
703
+ r++;
704
+ }
705
+ return e.length;
706
+ }
707
+ function Vt(e, t) {
708
+ let n = e.indexOf("'", t + 1);
709
+ if (n === -1 || e[n + 1] !== "!") return null;
710
+ let r = e.substring(n + 2).match(/^(\$?[A-Z]+\$?\d+)/);
711
+ return r ? e.substring(t, n + 2 + r[0].length) : null;
712
+ }
713
+ function Ht(e, t) {
714
+ let n = e.substring(t), r = n.match(/^([A-Z][A-Z0-9]*)!/i);
715
+ if (r) {
716
+ let e = n.substring(r[0].length).match(/^(\$?[A-Z]+\$?\d+)/);
717
+ if (e) return r[0] + e[0];
718
+ }
719
+ let i = n.match(/^(\$?[A-Z]+\$?\d+)/);
720
+ return i ? i[0] : null;
721
+ }
722
+ function Ut(e) {
723
+ let t = [], n = 0;
724
+ for (; n < e.length;) {
725
+ let r = e[n];
726
+ if (r === "\"") {
727
+ n = Bt(e, n);
728
+ continue;
729
+ }
730
+ if (r === "'") {
731
+ let r = Vt(e, n);
732
+ r ? (t.push({
733
+ ref: r,
734
+ start: n
735
+ }), n += r.length) : n = Bt(e, n);
736
+ continue;
737
+ }
738
+ let i = Ht(e, n);
739
+ i ? (t.push({
740
+ ref: i,
741
+ start: n
742
+ }), n += i.length) : n++;
743
+ }
744
+ return t;
745
+ }
746
+ function Wt(e, t, n) {
747
+ return [...t].reverse().reduce((e, { ref: t, start: r }) => e.slice(0, r) + n(t) + e.slice(r + t.length), e);
748
+ }
749
+ function Gt(e) {
750
+ let t = [], n = "", r = 0, i = !1, a = "";
751
+ for (let o = 0; o < e.length; o++) {
752
+ let s = e[o], c = o > 0 ? e[o - 1] : "";
753
+ (s === "\"" || s === "'") && c !== "\\" ? (i ? s === a && (i = !1, a = "") : (i = !0, a = s), n += s) : !i && (s === "(" && r++, s === ")" && r--, s === "," && r === 0) ? (t.push(n.trim()), n = "") : n += s;
754
+ }
755
+ return n.trim() && t.push(n.trim()), t;
756
+ }
757
+ function Kt(e) {
758
+ let t;
759
+ try {
760
+ t = Function(`return (${e})`)();
761
+ } catch {
762
+ throw dt();
763
+ }
764
+ if (typeof t == "number") {
765
+ if (!Number.isFinite(t)) throw ct();
766
+ return t;
767
+ }
768
+ if (typeof t == "string" || typeof t == "boolean") return t;
769
+ throw dt();
770
+ }
771
+ function qt(e, t) {
772
+ let n = e.trim();
773
+ if ((n.startsWith("\"") && n.endsWith("\"") || n.startsWith("'") && n.endsWith("'")) && !n.includes("&")) {
774
+ let e = n.slice(1, -1), r = At(e, t.preferDDMMYYYY);
775
+ return r === null ? e : r;
776
+ }
777
+ let [, r, i] = e.match(/^([A-Z][A-Z0-9]*)\((.*)\)$/i) ?? [];
778
+ if (r !== void 0 && i !== void 0 && _t(r)) {
779
+ let e = 0, n = !0;
780
+ for (let t of i) if (t === "(") e++;
781
+ else if (t === ")" && (e--, e < 0)) {
782
+ n = !1;
783
+ break;
784
+ }
785
+ let a = r.toUpperCase(), o = P.get(a);
786
+ if (o && n) {
787
+ let e = Gt(i);
788
+ if (o.minArgs !== void 0 && e.length < o.minArgs) throw gt(a, o.minArgs);
789
+ if (o.maxArgs !== void 0 && e.length > o.maxArgs) throw Error(`${a} accepts at most ${o.maxArgs} argument${o.maxArgs === 1 ? "" : "s"}`);
790
+ return o.handler(e, {
791
+ functionName: a,
792
+ getCellValue: t.getCellValue,
793
+ getRangeValues: t.getRangeValues,
794
+ getRangeValuesRaw: t.getRangeValuesRaw,
795
+ evaluateFormula: t.evaluateFormula
796
+ });
797
+ }
798
+ if (n && !o) throw ut(a);
799
+ }
800
+ let a = e, o = 0, s = 0;
801
+ for (; o < a.length && s < 100;) {
802
+ if (s++, a[o] === "\"" || a[o] === "'") {
803
+ o = Bt(a, o);
804
+ continue;
805
+ }
806
+ let [, e] = a.substring(o).match(/^([A-Z][A-Z0-9]*)\(/i) ?? [];
807
+ if (e === void 0 || !_t(e)) {
808
+ if (o++, o >= a.length) break;
809
+ continue;
810
+ }
811
+ let n = o, r = o + e.length + 1, i = 1, c = r, l = !1, u = "";
812
+ for (; c < a.length && i > 0;) {
813
+ let e = a[c], t = c > 0 ? a[c - 1] : "";
814
+ (e === "\"" || e === "'") && t !== "\\" && (l ? e === u && (l = !1, u = "") : (l = !0, u = e)), l || (e === "(" ? i++ : e === ")" && i--), c++;
815
+ }
816
+ if (i === 0) {
817
+ let e = a.substring(n, c), r = t.evaluateFormula(e);
818
+ if (w(r)) throw ft(r.code);
819
+ let i = typeof r == "string" ? `"${r}"` : `(${r})`;
820
+ a = a.substring(0, n) + i + a.substring(c), o = n + i.length;
821
+ } else o++;
822
+ }
823
+ let c = Ut(a), l = c.length === 1 ? c[0] : void 0;
824
+ if (l) {
825
+ let e = a.slice(0, l.start), n = a.slice(l.start + l.ref.length);
826
+ if (e.trim() === "" && n.trim() === "") return t.getCellValue(l.ref);
827
+ }
828
+ a = Wt(a, c, (e) => {
829
+ let n = t.getCellValue(e), r = we(n);
830
+ if (r !== null) throw ft(r);
831
+ return Lt(n);
832
+ }), a = a.replace(/"([^"]+)"/g, (e, n) => {
833
+ let r = At(n, t.preferDDMMYYYY);
834
+ return r === null ? e : r.toString();
835
+ }), a = et(a);
836
+ let u = a.includes("&"), d = /["']/.test(a);
837
+ if (u && d) {
838
+ let e = nt(a);
839
+ if (zt(e)) return Kt(e);
840
+ }
841
+ if (at(a)) return Kt(rt(a));
842
+ if (it(a)) return Kt(a);
843
+ let f = a.trim();
844
+ return f.startsWith("\"") && f.endsWith("\"") || f.startsWith("'") && f.endsWith("'") ? f.slice(1, -1) : a;
845
+ }
846
+ //#endregion
847
+ //#region src/engine/cellFormatting.ts
848
+ var Jt = 36e3, Yt = 63499, Xt = (e) => i(e) && "v" in e, Zt = (e) => typeof e == "number" && Number.isInteger(e) && e >= Jt && e <= Yt, Qt = (e, t, n) => {
849
+ if (w(t)) return t.code;
850
+ if (!Xt(e) || typeof t != "number") return t;
851
+ let r = typeof e.f == "string" ? e.f : "";
852
+ return r ? $e(t, r) : typeof e.v == "string" && e.v.startsWith("=") && Zt(t) ? $e(t, n ? "DD/MM/YYYY" : "MM/DD/YYYY") : t;
853
+ }, $t = /\$?[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+/g, en = /\$?[A-Z]+\$?\d+/g;
854
+ function tn(e) {
855
+ return e.startsWith("=") ? e.slice(1) : e;
856
+ }
857
+ var nn = /^([A-Z]+)(\d+)$/;
858
+ function rn(e) {
859
+ let [, t, n] = e.match(nn) ?? [];
860
+ return t === void 0 || n === void 0 ? null : {
861
+ col: he(t),
862
+ rowNumber: parseInt(n, 10)
863
+ };
864
+ }
865
+ function an(e) {
866
+ let [t, n, ...r] = e.split(":");
867
+ if (t === void 0 || n === void 0 || r.length > 0) return null;
868
+ let i = rn(t), a = rn(n);
869
+ return i && a ? {
870
+ start: i,
871
+ end: a
872
+ } : null;
873
+ }
874
+ function on(e) {
875
+ let t = an(e.replace(/\$/g, ""));
876
+ if (!t) return [];
877
+ let { start: n, end: r } = t, i = [];
878
+ for (let e = n.rowNumber - 1; e <= r.rowNumber - 1; e++) for (let t = n.col; t <= r.col; t++) i.push({
879
+ row: e,
880
+ col: t
881
+ });
882
+ return i;
883
+ }
884
+ function sn(e) {
885
+ let t = e.trim().toUpperCase();
886
+ if (t.includes(":")) {
887
+ let e = on(t);
888
+ return e.length > 0 ? e : null;
889
+ }
890
+ let n = z(t);
891
+ return n ? [n] : null;
892
+ }
893
+ function z(e) {
894
+ let t = rn(e.replace(/\$/g, ""));
895
+ return t ? {
896
+ col: t.col,
897
+ row: t.rowNumber - 1
898
+ } : null;
899
+ }
900
+ function B(e) {
901
+ let t = e.lastIndexOf("!"), n = t >= 0 ? e.slice(0, t + 1) : "", r = an(t >= 0 ? e.slice(t + 1) : e);
902
+ if (!r) return null;
903
+ let { start: i, end: a } = r;
904
+ return {
905
+ sheetPrefix: n,
906
+ startCol: i.col,
907
+ startRow: i.rowNumber,
908
+ endCol: a.col,
909
+ endRow: a.rowNumber
910
+ };
911
+ }
912
+ var cn = 0, V = 1;
913
+ function ln(e, t) {
914
+ let n = Math.trunc(e);
915
+ return Number.isFinite(n) ? n === cn ? t === 1 ? 0 : null : n < V || n > t ? null : n - V : null;
916
+ }
917
+ function un(e, t, n) {
918
+ let r = ln(t, e.endRow - e.startRow + 1), i = ln(n, e.endCol - e.startCol + 1);
919
+ return r === null || i === null ? null : {
920
+ colIndex: e.startCol + i,
921
+ row: e.startRow + r
922
+ };
923
+ }
924
+ function dn(e, t) {
925
+ let n = Math.trunc(e);
926
+ return !Number.isFinite(n) || n < V || n > t ? null : n - V;
927
+ }
928
+ function fn(e) {
929
+ let t = tn(e), n = [], r = /* @__PURE__ */ new Set(), i = (e) => {
930
+ let t = `${e.row},${e.col}`;
931
+ r.has(t) || (r.add(t), n.push(e));
932
+ };
933
+ for (let e of t.match($t) ?? []) for (let t of on(e)) i(t);
934
+ let a = t.replace($t, "");
935
+ for (let e of a.match(en) ?? []) {
936
+ let t = z(e);
937
+ t && i(t);
938
+ }
939
+ return n;
940
+ }
941
+ //#endregion
942
+ //#region src/engine/calculator.ts
943
+ function pn(e) {
944
+ if (!e || !Array.isArray(e) || e.length === 0) return [];
945
+ if (Array.isArray(e[0])) return e;
946
+ if (a(e[0])) {
947
+ let t = [];
948
+ for (let n = 0; n < e.length; n += 2) {
949
+ let r = [e[n]];
950
+ n + 1 < e.length && r.push(e[n + 1]), t.push(r);
951
+ }
952
+ return t;
953
+ }
954
+ return console.warn("Unknown data structure in spreadsheet, returning empty:", e), [];
955
+ }
956
+ function mn(e, t) {
957
+ return e.map((e) => e.map((e) => {
958
+ if (!a(e) || !("v" in e)) return e;
959
+ let n = e.v;
960
+ if (typeof n == "string" && !n.startsWith("=")) {
961
+ let r = At(n, t);
962
+ if (r !== null) return {
963
+ v: r,
964
+ f: e.f || It(n, t)
965
+ };
966
+ }
967
+ return e;
968
+ }));
969
+ }
970
+ function H(e, t, n = {}) {
971
+ let r = n.preferDDMMYYYY ?? !1, i = n.skipFormatting ?? !1, o = mn(pn(e.data), r), c = t?.map((e) => ({
972
+ ...e,
973
+ data: mn(pn(e.data), r)
974
+ })), l = o, u = e.name, d = /* @__PURE__ */ new Map(), f = [], ee = [], p = l.map((e) => [...e]);
975
+ d.set(u, p);
976
+ let m = /* @__PURE__ */ new Set(), h = /* @__PURE__ */ new Set(), g = (e, { cells: t, row: n, col: r }) => {
977
+ let i = `${n},${r}`;
978
+ if (m.has(i)) return f.push({
979
+ cell: {
980
+ row: n,
981
+ col: r
982
+ },
983
+ formula: e,
984
+ error: "Circular reference detected",
985
+ type: "circular"
986
+ }), 0;
987
+ if (h.has(i)) return t[r];
988
+ m.add(i);
989
+ try {
990
+ let n = oe(e.substring(1));
991
+ return t[r] = n, n;
992
+ } catch (i) {
993
+ let { type: a, display: o } = pt(i);
994
+ f.push({
995
+ cell: {
996
+ row: n,
997
+ col: r
998
+ },
999
+ formula: e,
1000
+ error: s(i),
1001
+ type: a
1002
+ });
1003
+ let c = xe(o);
1004
+ return t[r] = c, c;
1005
+ } finally {
1006
+ m.delete(i), h.add(i);
1007
+ }
1008
+ }, _ = (e, t) => {
1009
+ if (e == null) return 0;
1010
+ if (w(e) || typeof e == "number") return e;
1011
+ if (typeof e == "string") {
1012
+ if (e.trim() === "") return 0;
1013
+ if (e.includes("%")) {
1014
+ let t = e.replace("%", "").trim(), n = parseFloat(t);
1015
+ return isNaN(n) ? 0 : n / 100;
1016
+ }
1017
+ if (e.includes("$")) {
1018
+ let t = e.replace(/[$,]/g, "").trim(), n = parseFloat(t);
1019
+ return isNaN(n) ? 0 : n;
1020
+ }
1021
+ if (e.includes(",")) {
1022
+ let t = e.replace(/,/g, "").trim(), n = parseFloat(t);
1023
+ return isNaN(n) ? 0 : n;
1024
+ }
1025
+ let t = parseFloat(e);
1026
+ return isNaN(t) ? e : t;
1027
+ }
1028
+ if (a(e) && "v" in e) {
1029
+ let n = e.v;
1030
+ if (typeof n == "string" && n.startsWith("=")) return t ? g(n, t) : 0;
1031
+ if (typeof n == "number" || typeof n == "boolean") return n;
1032
+ if (typeof n == "string") {
1033
+ let e = parseFloat(n);
1034
+ return isNaN(e) ? n : e;
1035
+ }
1036
+ return String(n);
1037
+ }
1038
+ let n = parseFloat(e);
1039
+ return isNaN(n) ? e : n;
1040
+ }, te = (e) => {
1041
+ let t = e.match(/^(?:'([^']+)'|([^!]+))!(.+)$/);
1042
+ if (!t) return {
1043
+ sheetData: p,
1044
+ ref: e,
1045
+ isCurrentSheet: !0
1046
+ };
1047
+ let [, n, i, a] = t, o = n ?? i;
1048
+ if (o === void 0 || a === void 0) return null;
1049
+ let s = d.get(o);
1050
+ if (s) return {
1051
+ sheetData: s,
1052
+ ref: a,
1053
+ isCurrentSheet: !1
1054
+ };
1055
+ let l = c?.find((e) => e.name === o);
1056
+ if (!l || !l.data) return null;
1057
+ let u = l.data.map((e) => [...e]);
1058
+ d.set(o, u);
1059
+ let f = H(l, c, {
1060
+ preferDDMMYYYY: r,
1061
+ skipFormatting: !0
1062
+ });
1063
+ return d.set(o, f.data), {
1064
+ sheetData: f.data,
1065
+ ref: a,
1066
+ isCurrentSheet: !1
1067
+ };
1068
+ }, ne = (e) => {
1069
+ let t = te(e);
1070
+ if (!t) throw lt(e);
1071
+ let { sheetData: n, ref: r, isCurrentSheet: i } = t, a = z(r);
1072
+ if (!a) return 0;
1073
+ let { row: o, col: s } = a, c = o >= 0 ? n[o] : void 0;
1074
+ return !c || s < 0 || s >= c.length ? 0 : _(c[s], i ? {
1075
+ cells: c,
1076
+ row: o,
1077
+ col: s
1078
+ } : void 0);
1079
+ }, re = (e, t) => {
1080
+ let n = te(e);
1081
+ if (!n) return [];
1082
+ let { sheetData: r, ref: i, isCurrentSheet: a } = n, o = sn(i);
1083
+ if (!o) return [];
1084
+ let s = [];
1085
+ for (let { row: e, col: n } of o) {
1086
+ let i = e >= 0 ? r[e] : void 0;
1087
+ if (i && n >= 0 && n < i.length) {
1088
+ let r = i[n], o = _(r, a ? {
1089
+ cells: i,
1090
+ row: e,
1091
+ col: n
1092
+ } : void 0);
1093
+ t.numericOnly ? !Le(r) && !isNaN(o) && s.push(o) : s.push(o);
1094
+ }
1095
+ }
1096
+ return s;
1097
+ }, ie = (e) => re(e, { numericOnly: !0 }), ae = (e) => re(e, { numericOnly: !1 }), oe = (e) => qt(e, {
1098
+ getCellValue: ne,
1099
+ getRangeValues: ie,
1100
+ getRangeValuesRaw: ae,
1101
+ evaluateFormula: oe,
1102
+ preferDDMMYYYY: r
1103
+ }), se = (e, t) => {
1104
+ if (!a(e) || !("v" in e)) return;
1105
+ let n = e.v;
1106
+ if (typeof n != "string" || !n.startsWith("=")) {
1107
+ t.cells[t.col] = n;
1108
+ return;
1109
+ }
1110
+ let r = {
1111
+ cell: {
1112
+ row: t.row,
1113
+ col: t.col
1114
+ },
1115
+ formula: n,
1116
+ dependencies: [],
1117
+ result: 0
1118
+ };
1119
+ ee.push(r), r.result = g(n, t), t.cells[t.col] = r.result;
1120
+ }, ce = (e) => {
1121
+ l.forEach((t, n) => {
1122
+ let r = p[n];
1123
+ r && t.forEach((t, i) => e(t, {
1124
+ cells: r,
1125
+ row: n,
1126
+ col: i
1127
+ }));
1128
+ });
1129
+ };
1130
+ return ce((e, t) => {
1131
+ typeof t.cells[t.col] == "number" && a(e) && "f" in e || se(e, t);
1132
+ }), i || ce((e, { cells: t, col: n }) => {
1133
+ t[n] = Qt(e, t[n], r);
1134
+ }), {
1135
+ name: u,
1136
+ data: p,
1137
+ formulas: ee,
1138
+ errors: f
1139
+ };
1140
+ }
1141
+ function hn(e, t = {}) {
1142
+ return e.map((n) => H(n, e, t));
1143
+ }
1144
+ //#endregion
1145
+ //#region src/engine/functions/statistical-math.ts
1146
+ var gn = (e) => e.reduce((e, t) => e + t, 0) / e.length;
1147
+ function _n(e) {
1148
+ return e.length === 0 ? b : gn(e);
1149
+ }
1150
+ function vn(e) {
1151
+ return e.length === 0 ? S : gn(yn([...e].sort((e, t) => e - t)));
1152
+ }
1153
+ function yn(e) {
1154
+ let t = Math.floor(e.length / 2);
1155
+ return e.slice(e.length % 2 == 0 ? t - 1 : t, t + 1);
1156
+ }
1157
+ function bn(e) {
1158
+ let t = /* @__PURE__ */ new Map();
1159
+ for (let n of e) t.set(n, (t.get(n) ?? 0) + 1);
1160
+ let n = 0, r = C;
1161
+ for (let [e, i] of t.entries()) i > n && (n = i, r = e);
1162
+ return n >= 2 ? r : C;
1163
+ }
1164
+ var xn = 2;
1165
+ function Sn(e) {
1166
+ if (e.length < xn) return b;
1167
+ let t = gn(e);
1168
+ return e.reduce((e, n) => e + (n - t) ** 2, 0) / (e.length - 1);
1169
+ }
1170
+ function Cn(e) {
1171
+ let t = Sn(e);
1172
+ return typeof t == "number" ? Math.sqrt(t) : t;
1173
+ }
1174
+ //#endregion
1175
+ //#region src/engine/functions/statistical.ts
1176
+ var U = 255, wn = /^\$?[A-Z]+\$?\d+$/i, Tn = (e) => wn.test(e), En = (e) => e.slice(e.lastIndexOf("!") + 1), Dn = (e) => {
1177
+ if (!e) return !1;
1178
+ let [t, n] = En(e).split(":");
1179
+ return !t || !n ? !1 : Tn(t) && Tn(n);
1180
+ }, On = (e) => Dn(e) || Tn(En(e)), kn = (e, t, n) => {
1181
+ let r = [];
1182
+ for (let i of e) {
1183
+ let e = i?.trim();
1184
+ e && (On(e) ? n(e).forEach((e) => r.push({
1185
+ value: e,
1186
+ isScalar: !1
1187
+ })) : r.push({
1188
+ value: t.evaluateFormula(e),
1189
+ isScalar: !0
1190
+ }));
1191
+ }
1192
+ return r;
1193
+ }, W = (e, t) => kn(e, t, t.getRangeValues).map(({ value: e }) => F(e)), An = (e, t) => kn(e, t, N(t)).map(({ value: e }) => e), jn = (e, t) => W(e, t).reduce((e, t) => e + t, 0), Mn = (e, t) => _n(W(e, t)), Nn = (e, t) => {
1194
+ let n = W(e, t);
1195
+ return n.length > 0 ? Math.max(...n) : 0;
1196
+ }, Pn = (e, t) => {
1197
+ let n = W(e, t);
1198
+ return n.length > 0 ? Math.min(...n) : 0;
1199
+ }, Fn = ({ value: e, isScalar: t }) => !t || j(e), In = (e, t) => kn(e, t, t.getRangeValues).filter(Fn).length, Ln = (e, t) => vn(W(e, t)), Rn = (e, t) => bn(W(e, t)), zn = (e, t) => Cn(W(e, t)), Bn = (e, t) => Sn(W(e, t)), Vn = (e, t) => An(e, t).filter((e) => e != null && e !== "").length, Hn = (e, t) => N(t)(M(t, e, 0)).filter(L(M(t, e, 1).trim())).length, Un = (e, t) => {
1200
+ let n = M(t, e, 0), r = N(t), i = e.length === 3 ? M(t, e, 2) : n;
1201
+ return {
1202
+ criteriaRange: r(n),
1203
+ valueRange: r(i),
1204
+ matches: L(M(t, e, 1).trim())
1205
+ };
1206
+ }, Wn = (e, t, n) => e.reduce((e, r, i) => n(r) ? {
1207
+ sum: e.sum + F(t[i] ?? 0),
1208
+ count: e.count + 1
1209
+ } : e, {
1210
+ sum: 0,
1211
+ count: 0
1212
+ });
1213
+ P.register({
1214
+ name: "SUM",
1215
+ handler: jn,
1216
+ minArgs: 1,
1217
+ maxArgs: U,
1218
+ description: "Returns the sum of all numbers in a range",
1219
+ examples: ["SUM(A1:A10)", "SUM(B2:B20)"],
1220
+ category: "Statistical"
1221
+ }), P.register({
1222
+ name: "AVERAGE",
1223
+ handler: Mn,
1224
+ minArgs: 1,
1225
+ maxArgs: U,
1226
+ description: "Returns the average (arithmetic mean) of numbers in a range",
1227
+ examples: ["AVERAGE(A1:A10)", "AVERAGE(B2:B20)"],
1228
+ category: "Statistical"
1229
+ }), P.register({
1230
+ name: "MAX",
1231
+ handler: Nn,
1232
+ minArgs: 1,
1233
+ description: "Returns the largest value in a range",
1234
+ examples: ["MAX(A1:A10)", "MAX(B2:B20)"],
1235
+ category: "Statistical"
1236
+ }), P.register({
1237
+ name: "MIN",
1238
+ handler: Pn,
1239
+ minArgs: 1,
1240
+ description: "Returns the smallest value in a range",
1241
+ examples: ["MIN(A1:A10)", "MIN(B2:B20)"],
1242
+ category: "Statistical"
1243
+ }), P.register({
1244
+ name: "COUNT",
1245
+ handler: In,
1246
+ minArgs: 1,
1247
+ maxArgs: U,
1248
+ description: "Counts the number of cells in a range",
1249
+ examples: ["COUNT(A1:A10)", "COUNT(B2:B20)"],
1250
+ category: "Statistical"
1251
+ }), P.register({
1252
+ name: "MEDIAN",
1253
+ handler: Ln,
1254
+ minArgs: 1,
1255
+ maxArgs: U,
1256
+ description: "Returns the median (middle) value in a range",
1257
+ examples: ["MEDIAN(A1:A10)", "MEDIAN(B2:B20)"],
1258
+ category: "Statistical"
1259
+ }), P.register({
1260
+ name: "MODE",
1261
+ handler: Rn,
1262
+ minArgs: 1,
1263
+ maxArgs: U,
1264
+ description: "Returns the most frequently occurring value in a range",
1265
+ examples: ["MODE(A1:A10)", "MODE(B2:B20)"],
1266
+ category: "Statistical"
1267
+ }), P.register({
1268
+ name: "STDEV",
1269
+ handler: zn,
1270
+ minArgs: 1,
1271
+ maxArgs: U,
1272
+ description: "Returns the standard deviation of numbers in a range",
1273
+ examples: ["STDEV(A1:A10)", "STDEV(B2:B20)"],
1274
+ category: "Statistical"
1275
+ }), P.register({
1276
+ name: "VAR",
1277
+ handler: Bn,
1278
+ minArgs: 1,
1279
+ maxArgs: U,
1280
+ description: "Returns the variance of numbers in a range",
1281
+ examples: ["VAR(A1:A10)", "VAR(B2:B20)"],
1282
+ category: "Statistical"
1283
+ }), P.register({
1284
+ name: "COUNTA",
1285
+ handler: Vn,
1286
+ minArgs: 1,
1287
+ maxArgs: U,
1288
+ description: "Counts the number of non-empty cells in a range",
1289
+ examples: ["COUNTA(A1:A10)", "COUNTA(B2:B20)"],
1290
+ category: "Statistical"
1291
+ }), P.register({
1292
+ name: "COUNTIF",
1293
+ handler: Hn,
1294
+ minArgs: 2,
1295
+ maxArgs: 2,
1296
+ description: "Counts cells in a range that match a criteria",
1297
+ examples: ["COUNTIF(A1:A10, \">5\")", "COUNTIF(B1:B10, \"Yes\")"],
1298
+ category: "Statistical"
1299
+ }), P.register({
1300
+ name: "SUMIF",
1301
+ handler: (e, t) => {
1302
+ let { criteriaRange: n, valueRange: r, matches: i } = Un(e, t);
1303
+ return Wn(n, r, i).sum;
1304
+ },
1305
+ minArgs: 2,
1306
+ maxArgs: 3,
1307
+ description: "Sums cells in a range that match a criteria",
1308
+ examples: ["SUMIF(A1:A10, \">5\")", "SUMIF(A1:A10, \">5\", B1:B10)"],
1309
+ category: "Statistical"
1310
+ }), P.register({
1311
+ name: "AVERAGEIF",
1312
+ handler: (e, t) => {
1313
+ let { criteriaRange: n, valueRange: r, matches: i } = Un(e, t), { sum: a, count: o } = Wn(n, r, i);
1314
+ return o > 0 ? a / o : b;
1315
+ },
1316
+ minArgs: 2,
1317
+ maxArgs: 3,
1318
+ description: "Averages cells in a range that match a criteria",
1319
+ examples: ["AVERAGEIF(A1:A10, \">5\")", "AVERAGEIF(A1:A10, \">5\", B1:B10)"],
1320
+ category: "Statistical"
1321
+ });
1322
+ //#endregion
1323
+ //#region src/engine/functions/analysis-math.ts
1324
+ var Gn = 2, Kn = 1, qn = 4, G = (e) => e.reduce((e, t) => e + t, 0) / e.length, K = (e) => {
1325
+ let t = G(e);
1326
+ return e.reduce((e, n) => e + (n - t) ** 2, 0);
1327
+ };
1328
+ function Jn(e, t) {
1329
+ if (e.length !== t.length) return C;
1330
+ let n = e.flatMap((e, n) => {
1331
+ let r = t[n];
1332
+ return j(e) && r !== void 0 && j(r) ? [{
1333
+ y: F(e),
1334
+ x: F(r)
1335
+ }] : [];
1336
+ });
1337
+ return {
1338
+ ys: n.map((e) => e.y),
1339
+ xs: n.map((e) => e.x)
1340
+ };
1341
+ }
1342
+ var Yn = ({ ys: e, xs: t }) => {
1343
+ let n = G(e), r = G(t);
1344
+ return e.reduce((e, i, a) => e + (i - n) * ((t[a] ?? r) - r), 0);
1345
+ };
1346
+ function Xn(e) {
1347
+ if (e.ys.length < Gn) return b;
1348
+ let t = Math.sqrt(K(e.ys) * K(e.xs));
1349
+ return t === 0 ? b : Yn(e) / t;
1350
+ }
1351
+ function Zn(e) {
1352
+ if (e.ys.length < Gn) return b;
1353
+ let t = K(e.xs);
1354
+ return t === 0 ? b : Yn(e) / t;
1355
+ }
1356
+ function Qn(e) {
1357
+ let t = Zn(e);
1358
+ return typeof t == "number" ? G(e.ys) - t * G(e.xs) : t;
1359
+ }
1360
+ function $n(e) {
1361
+ let t = Xn(e);
1362
+ return typeof t == "number" ? t * t : t;
1363
+ }
1364
+ function er(e, t) {
1365
+ if (e.length === 0 || t < 0 || t > Kn) return S;
1366
+ let n = [...e].sort((e, t) => e - t), r = t * (n.length - 1), i = n[Math.floor(r)] ?? 0, a = n[Math.ceil(r)] ?? i;
1367
+ return i + (r - Math.floor(r)) * (a - i);
1368
+ }
1369
+ function tr(e, t) {
1370
+ let n = Math.trunc(t);
1371
+ return n < 0 || n > qn ? S : er(e, n / qn);
1372
+ }
1373
+ function nr(e, t) {
1374
+ let n = Math.ceil(t);
1375
+ return n < 1 || n > e.length ? S : [...e].sort((e, t) => t - e)[n - 1] ?? S;
1376
+ }
1377
+ function rr(e, t) {
1378
+ let n = Math.ceil(t);
1379
+ return n < 1 || n > e.length ? S : [...e].sort((e, t) => e - t)[n - 1] ?? S;
1380
+ }
1381
+ function ir(e, t, n) {
1382
+ return t.includes(e) ? t.filter((t) => n ? t < e : t > e).length + 1 : C;
1383
+ }
1384
+ function ar(e) {
1385
+ return e.length === 0 ? b : K(e) / e.length;
1386
+ }
1387
+ function or(e) {
1388
+ let t = ar(e);
1389
+ return typeof t == "number" ? Math.sqrt(t) : t;
1390
+ }
1391
+ function sr(e, t) {
1392
+ return t.some(({ range: t }) => t.length !== e) ? x : Array.from({ length: e }, (e, n) => t.every(({ range: e, matches: t }) => t(e[n] ?? "")));
1393
+ }
1394
+ //#endregion
1395
+ //#region src/engine/functions/statistical-analysis.ts
1396
+ var q = 255, cr = (e, t, n) => ht(t.evaluateFormula(M(t, e, n))), lr = (e, t) => {
1397
+ let n = N(t);
1398
+ return Jn(n(M(t, e, 0)), n(M(t, e, 1)));
1399
+ }, J = (e) => (t, n) => {
1400
+ let r = lr(t, n);
1401
+ return "ys" in r ? e(r) : r;
1402
+ }, Y = (e) => (t, n) => {
1403
+ let r = cr(t, n, 1);
1404
+ return typeof r == "number" ? e(W([M(n, t, 0)], n), r) : r;
1405
+ }, ur = (e, t) => {
1406
+ let n = cr(e, t, 0);
1407
+ if (typeof n != "number") return n;
1408
+ let r = e.length > 2 ? cr(e, t, 2) : 0;
1409
+ return typeof r == "number" ? ir(n, W([M(t, e, 1)], t), r !== 0) : r;
1410
+ }, dr = (e, t, n) => {
1411
+ let r = N(t);
1412
+ return Array.from({ length: Math.ceil((e.length - n) / 2) }, (e, t) => n + t * 2).map((n) => ({
1413
+ range: r(M(t, e, n)),
1414
+ matches: L(M(t, e, n + 1).trim())
1415
+ }));
1416
+ }, fr = (e, t) => {
1417
+ let n = N(t)(M(t, e, 0)), r = sr(n.length, dr(e, t, 1));
1418
+ return Array.isArray(r) ? n.filter((e, t) => r[t]) : r;
1419
+ };
1420
+ [
1421
+ {
1422
+ name: "CORREL",
1423
+ handler: J(Xn),
1424
+ minArgs: 2,
1425
+ maxArgs: 2,
1426
+ description: "Returns the correlation coefficient of two ranges",
1427
+ examples: ["CORREL(A2:A20, B2:B20)"]
1428
+ },
1429
+ {
1430
+ name: "SLOPE",
1431
+ handler: J(Zn),
1432
+ minArgs: 2,
1433
+ maxArgs: 2,
1434
+ description: "Returns the slope of the least-squares line through known_y and known_x",
1435
+ examples: ["SLOPE(B2:B20, A2:A20)"]
1436
+ },
1437
+ {
1438
+ name: "INTERCEPT",
1439
+ handler: J(Qn),
1440
+ minArgs: 2,
1441
+ maxArgs: 2,
1442
+ description: "Returns where the least-squares line crosses the y axis",
1443
+ examples: ["INTERCEPT(B2:B20, A2:A20)"]
1444
+ },
1445
+ {
1446
+ name: "RSQ",
1447
+ handler: J($n),
1448
+ minArgs: 2,
1449
+ maxArgs: 2,
1450
+ description: "Returns the square of the correlation coefficient",
1451
+ examples: ["RSQ(B2:B20, A2:A20)"]
1452
+ },
1453
+ {
1454
+ name: "PERCENTILE",
1455
+ handler: Y(er),
1456
+ minArgs: 2,
1457
+ maxArgs: 2,
1458
+ description: "Returns the k-th percentile (k from 0 to 1), interpolated like PERCENTILE.INC",
1459
+ examples: ["PERCENTILE(A2:A100, 0.9)"]
1460
+ },
1461
+ {
1462
+ name: "QUARTILE",
1463
+ handler: Y(tr),
1464
+ minArgs: 2,
1465
+ maxArgs: 2,
1466
+ description: "Returns a quartile (0 to 4), interpolated like QUARTILE.INC",
1467
+ examples: ["QUARTILE(A2:A100, 1)"]
1468
+ },
1469
+ {
1470
+ name: "LARGE",
1471
+ handler: Y(nr),
1472
+ minArgs: 2,
1473
+ maxArgs: 2,
1474
+ description: "Returns the k-th largest value",
1475
+ examples: ["LARGE(A2:A100, 3)"]
1476
+ },
1477
+ {
1478
+ name: "SMALL",
1479
+ handler: Y(rr),
1480
+ minArgs: 2,
1481
+ maxArgs: 2,
1482
+ description: "Returns the k-th smallest value",
1483
+ examples: ["SMALL(A2:A100, 3)"]
1484
+ },
1485
+ {
1486
+ name: "RANK",
1487
+ handler: ur,
1488
+ minArgs: 2,
1489
+ maxArgs: 3,
1490
+ description: "Returns the rank of a number in a range (largest first unless order is non-zero)",
1491
+ examples: ["RANK(A2, A2:A100)", "RANK(A2, A2:A100, 1)"]
1492
+ },
1493
+ {
1494
+ name: "STDEVP",
1495
+ handler: (e, t) => or(W(e, t)),
1496
+ minArgs: 1,
1497
+ maxArgs: q,
1498
+ description: "Returns the population standard deviation",
1499
+ examples: ["STDEVP(A2:A100)"]
1500
+ },
1501
+ {
1502
+ name: "VARP",
1503
+ handler: (e, t) => ar(W(e, t)),
1504
+ minArgs: 1,
1505
+ maxArgs: q,
1506
+ description: "Returns the population variance",
1507
+ examples: ["VARP(A2:A100)"]
1508
+ },
1509
+ {
1510
+ name: "SUMIFS",
1511
+ handler: (e, t) => {
1512
+ let n = fr(e, t);
1513
+ return Array.isArray(n) ? n.reduce((e, t) => e + F(t), 0) : n;
1514
+ },
1515
+ minArgs: 3,
1516
+ maxArgs: q,
1517
+ description: "Sums the cells whose rows meet every condition",
1518
+ examples: ["SUMIFS(C2:C100, A2:A100, \"East\", B2:B100, \">10\")"]
1519
+ },
1520
+ {
1521
+ name: "COUNTIFS",
1522
+ handler: (e, t) => {
1523
+ let n = dr(e, t, 0), r = sr(n[0]?.range.length ?? 0, n);
1524
+ return Array.isArray(r) ? r.filter(Boolean).length : r;
1525
+ },
1526
+ minArgs: 2,
1527
+ maxArgs: q,
1528
+ description: "Counts the rows that meet every condition",
1529
+ examples: ["COUNTIFS(A2:A100, \"East\", B2:B100, \">10\")"]
1530
+ },
1531
+ {
1532
+ name: "AVERAGEIFS",
1533
+ handler: (e, t) => {
1534
+ let n = fr(e, t);
1535
+ if (!Array.isArray(n)) return n;
1536
+ let r = n.filter(j).map(F);
1537
+ return r.length > 0 ? r.reduce((e, t) => e + t, 0) / r.length : b;
1538
+ },
1539
+ minArgs: 3,
1540
+ maxArgs: q,
1541
+ description: "Averages the cells whose rows meet every condition",
1542
+ examples: ["AVERAGEIFS(C2:C100, A2:A100, \"East\")"]
1543
+ }
1544
+ ].forEach((e) => P.register({
1545
+ ...e,
1546
+ category: "Statistical"
1547
+ }));
1548
+ //#endregion
1549
+ //#region src/engine/math-ops.ts
1550
+ var pr = 10, mr = (e) => pr ** +e;
1551
+ function hr(e, t) {
1552
+ let n = mr(t);
1553
+ return Math.sign(e) * Math.round(Math.abs(e) * n) / n;
1554
+ }
1555
+ function gr(e, t) {
1556
+ let n = mr(t);
1557
+ return Math.sign(e) * Math.ceil(Math.abs(e) * n) / n;
1558
+ }
1559
+ function _r(e, t) {
1560
+ let n = mr(t);
1561
+ return Math.sign(e) * Math.floor(Math.abs(e) * n) / n;
1562
+ }
1563
+ var vr = (e, t) => e === 0 || Math.sign(e) === Math.sign(t);
1564
+ function yr(e, t) {
1565
+ return t === 0 ? b : vr(e, t) ? Math.floor(e / t) * t : S;
1566
+ }
1567
+ function br(e, t) {
1568
+ return t === 0 ? 0 : vr(e, t) ? Math.ceil(e / t) * t : S;
1569
+ }
1570
+ function xr(e, t) {
1571
+ return t === 0 ? b : e - t * Math.floor(e / t);
1572
+ }
1573
+ function Sr(e, t) {
1574
+ return e < 0 && !Number.isInteger(t) ? S : e ** +t;
1575
+ }
1576
+ function Cr(e) {
1577
+ return e <= 0 ? S : Math.log(e);
1578
+ }
1579
+ function wr(e, t) {
1580
+ let n = Cr(e);
1581
+ return w(n) ? n : t <= 0 || t === 1 ? S : n / Math.log(t);
1582
+ }
1583
+ function Tr(e) {
1584
+ return e <= 0 ? S : Math.log10(e);
1585
+ }
1586
+ function Er(e) {
1587
+ return e < 0 ? S : Math.sqrt(e);
1588
+ }
1589
+ P.register({
1590
+ name: "ROUND",
1591
+ handler: (e, t) => hr(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1592
+ minArgs: 2,
1593
+ maxArgs: 2,
1594
+ description: "Rounds a number to a specified number of digits",
1595
+ examples: ["ROUND(3.14159, 2)", "ROUND(A1, 0)"],
1596
+ category: "Mathematical"
1597
+ }), P.register({
1598
+ name: "ROUNDUP",
1599
+ handler: (e, t) => gr(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1600
+ minArgs: 2,
1601
+ maxArgs: 2,
1602
+ description: "Rounds a number up, away from zero",
1603
+ examples: ["ROUNDUP(3.14159, 2)", "ROUNDUP(A1, 0)"],
1604
+ category: "Mathematical"
1605
+ }), P.register({
1606
+ name: "ROUNDDOWN",
1607
+ handler: (e, t) => _r(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1608
+ minArgs: 2,
1609
+ maxArgs: 2,
1610
+ description: "Rounds a number down, toward zero",
1611
+ examples: ["ROUNDDOWN(3.14159, 2)", "ROUNDDOWN(A1, 0)"],
1612
+ category: "Mathematical"
1613
+ }), P.register({
1614
+ name: "FLOOR",
1615
+ handler: (e, t) => yr(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1616
+ minArgs: 2,
1617
+ maxArgs: 2,
1618
+ description: "Rounds a number down to the nearest multiple of significance",
1619
+ examples: ["FLOOR(3.7, 1)", "FLOOR(24, 5)"],
1620
+ category: "Mathematical"
1621
+ }), P.register({
1622
+ name: "CEILING",
1623
+ handler: (e, t) => br(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1624
+ minArgs: 2,
1625
+ maxArgs: 2,
1626
+ description: "Rounds a number up to the nearest multiple of significance",
1627
+ examples: ["CEILING(3.2, 1)", "CEILING(24, 5)"],
1628
+ category: "Mathematical"
1629
+ }), P.register({
1630
+ name: "ABS",
1631
+ handler: (e, t) => {
1632
+ let n = ht(t.evaluateFormula(M(t, e, 0)));
1633
+ return w(n) ? n : Math.abs(n);
1634
+ },
1635
+ minArgs: 1,
1636
+ maxArgs: 1,
1637
+ description: "Returns the absolute value of a number",
1638
+ examples: ["ABS(-5)", "ABS(A1)"],
1639
+ category: "Mathematical"
1640
+ }), P.register({
1641
+ name: "POWER",
1642
+ handler: (e, t) => Sr(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1643
+ minArgs: 2,
1644
+ maxArgs: 2,
1645
+ description: "Returns the result of a number raised to a power",
1646
+ examples: ["POWER(2, 3)", "POWER(A1, 2)"],
1647
+ category: "Mathematical"
1648
+ }), P.register({
1649
+ name: "SQRT",
1650
+ handler: (e, t) => Er(F(t.evaluateFormula(M(t, e, 0)))),
1651
+ minArgs: 1,
1652
+ maxArgs: 1,
1653
+ description: "Returns the square root of a number",
1654
+ examples: ["SQRT(16)", "SQRT(A1)"],
1655
+ category: "Mathematical"
1656
+ }), P.register({
1657
+ name: "MOD",
1658
+ handler: (e, t) => xr(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1)))),
1659
+ minArgs: 2,
1660
+ maxArgs: 2,
1661
+ description: "Returns the remainder after division",
1662
+ examples: ["MOD(10, 3)", "MOD(A1, 2)"],
1663
+ category: "Mathematical"
1664
+ }), P.register({
1665
+ name: "INT",
1666
+ handler: (e, t) => {
1667
+ let n = F(t.evaluateFormula(M(t, e, 0)));
1668
+ return Math.floor(n);
1669
+ },
1670
+ minArgs: 1,
1671
+ maxArgs: 1,
1672
+ description: "Rounds a number down to the nearest integer",
1673
+ examples: ["INT(3.7)", "INT(A1)"],
1674
+ category: "Mathematical"
1675
+ }), P.register({
1676
+ name: "TRUNC",
1677
+ handler: (e, t) => {
1678
+ let n = F(t.evaluateFormula(M(t, e, 0))), r = 10 ** (e.length === 2 ? F(t.evaluateFormula(M(t, e, 1))) : 0);
1679
+ return Math.trunc(n * r) / r;
1680
+ },
1681
+ minArgs: 1,
1682
+ maxArgs: 2,
1683
+ description: "Truncates a number to a specified number of decimal places",
1684
+ examples: ["TRUNC(3.14159, 2)", "TRUNC(A1)"],
1685
+ category: "Mathematical"
1686
+ }), P.register({
1687
+ name: "SIGN",
1688
+ handler: (e, t) => {
1689
+ let n = ht(t.evaluateFormula(M(t, e, 0)));
1690
+ return w(n) ? n : Math.sign(n);
1691
+ },
1692
+ minArgs: 1,
1693
+ maxArgs: 1,
1694
+ description: "Returns the sign of a number (1, 0, or -1)",
1695
+ examples: ["SIGN(-5)", "SIGN(A1)"],
1696
+ category: "Mathematical"
1697
+ }), P.register({
1698
+ name: "PI",
1699
+ handler: () => Math.PI,
1700
+ minArgs: 0,
1701
+ maxArgs: 0,
1702
+ description: "Returns the value of pi (3.14159...)",
1703
+ examples: ["PI()", "PI()*2"],
1704
+ category: "Mathematical"
1705
+ }), P.register({
1706
+ name: "EXP",
1707
+ handler: (e, t) => {
1708
+ let n = F(t.evaluateFormula(M(t, e, 0)));
1709
+ return Math.exp(n);
1710
+ },
1711
+ minArgs: 1,
1712
+ maxArgs: 1,
1713
+ description: "Returns e raised to the power of a number",
1714
+ examples: ["EXP(1)", "EXP(A1)"],
1715
+ category: "Mathematical"
1716
+ }), P.register({
1717
+ name: "LN",
1718
+ handler: (e, t) => Cr(F(t.evaluateFormula(M(t, e, 0)))),
1719
+ minArgs: 1,
1720
+ maxArgs: 1,
1721
+ description: "Returns the natural logarithm of a number",
1722
+ examples: ["LN(10)", "LN(A1)"],
1723
+ category: "Mathematical"
1724
+ }), P.register({
1725
+ name: "LOG",
1726
+ handler: (e, t) => wr(F(t.evaluateFormula(M(t, e, 0))), e.length === 2 ? F(t.evaluateFormula(M(t, e, 1))) : 10),
1727
+ minArgs: 1,
1728
+ maxArgs: 2,
1729
+ description: "Returns the logarithm of a number to a specified base",
1730
+ examples: ["LOG(100)", "LOG(8, 2)"],
1731
+ category: "Mathematical"
1732
+ }), P.register({
1733
+ name: "LOG10",
1734
+ handler: (e, t) => Tr(F(t.evaluateFormula(M(t, e, 0)))),
1735
+ minArgs: 1,
1736
+ maxArgs: 1,
1737
+ description: "Returns the base-10 logarithm of a number",
1738
+ examples: ["LOG10(100)", "LOG10(A1)"],
1739
+ category: "Mathematical"
1740
+ });
1741
+ //#endregion
1742
+ //#region src/engine/coerce-boolean.ts
1743
+ function X(e) {
1744
+ if (typeof e == "boolean") return e;
1745
+ if (e == null) return !1;
1746
+ if (typeof e == "number") return e !== 0;
1747
+ if (w(e)) return !0;
1748
+ let t = e.trim();
1749
+ if (t === "") return !1;
1750
+ let n = t.toLowerCase();
1751
+ if (n === "true") return !0;
1752
+ if (n === "false") return !1;
1753
+ let r = Number(t);
1754
+ return Number.isNaN(r) ? !0 : r !== 0;
1755
+ }
1756
+ P.register({
1757
+ name: "IF",
1758
+ handler: (e, t) => {
1759
+ let n = M(t, e, 0), r = M(t, e, 1), i = M(t, e, 2), a = X(t.evaluateFormula(n)) ? r : i;
1760
+ return /^["'](.*)["']$/.test(a) ? a.slice(1, -1) : t.evaluateFormula(a);
1761
+ },
1762
+ minArgs: 3,
1763
+ maxArgs: 3,
1764
+ description: "Returns one value if a condition is true and another if false",
1765
+ examples: ["IF(A1>10, \"High\", \"Low\")", "IF(B2>=5, SUM(C1:C10), 0)"],
1766
+ category: "Logical"
1767
+ }), P.register({
1768
+ name: "AND",
1769
+ handler: (e, t) => {
1770
+ for (let n of e) if (!X(t.evaluateFormula(n.trim()))) return !1;
1771
+ return !0;
1772
+ },
1773
+ minArgs: 1,
1774
+ description: "Returns TRUE if all arguments are true",
1775
+ examples: ["AND(A1>5, B1<10)", "AND(A1>0, B1>0, C1>0)"],
1776
+ category: "Logical"
1777
+ }), P.register({
1778
+ name: "OR",
1779
+ handler: (e, t) => {
1780
+ for (let n of e) if (X(t.evaluateFormula(n.trim()))) return !0;
1781
+ return !1;
1782
+ },
1783
+ minArgs: 1,
1784
+ description: "Returns TRUE if any argument is true",
1785
+ examples: ["OR(A1>5, B1<10)", "OR(A1>0, B1>0)"],
1786
+ category: "Logical"
1787
+ }), P.register({
1788
+ name: "NOT",
1789
+ handler: (e, t) => !X(t.evaluateFormula(M(t, e, 0))),
1790
+ minArgs: 1,
1791
+ maxArgs: 1,
1792
+ description: "Reverses the logical value of its argument",
1793
+ examples: ["NOT(A1>5)", "NOT(B1)"],
1794
+ category: "Logical"
1795
+ }), P.register({
1796
+ name: "IFERROR",
1797
+ handler: (e, t) => {
1798
+ try {
1799
+ let n = t.evaluateFormula(M(t, e, 0));
1800
+ return Te(n) ? t.evaluateFormula(M(t, e, 1)) : n;
1801
+ } catch {
1802
+ return t.evaluateFormula(M(t, e, 1));
1803
+ }
1804
+ },
1805
+ minArgs: 2,
1806
+ maxArgs: 2,
1807
+ description: "Returns a value if expression is an error, otherwise returns the expression",
1808
+ examples: ["IFERROR(A1/B1, 0)", "IFERROR(VLOOKUP(A1, B1:C10, 2), \"Not found\")"],
1809
+ category: "Logical"
1810
+ }), P.register({
1811
+ name: "IFNA",
1812
+ handler: (e, t) => {
1813
+ let n = t.evaluateFormula(M(t, e, 0)), r = w(n) && n.code === C.code;
1814
+ return n == null || r ? t.evaluateFormula(M(t, e, 1)) : n;
1815
+ },
1816
+ minArgs: 2,
1817
+ maxArgs: 2,
1818
+ description: "Returns a value if expression is #N/A, otherwise returns the expression",
1819
+ examples: ["IFNA(A1, \"N/A\")", "IFNA(MATCH(A1, B1:B10), 0)"],
1820
+ category: "Logical"
1821
+ }), P.register({
1822
+ name: "IFS",
1823
+ handler: (e, t) => {
1824
+ if (e.length < 2 || e.length % 2 != 0) throw Error("IFS requires an even number of arguments (condition-value pairs)");
1825
+ for (let n = 0; n < e.length; n += 2) {
1826
+ let r = M(t, e, n), i = M(t, e, n + 1);
1827
+ if (Fe(Wt(r, Ut(r), (e) => Ie(t.getCellValue(e))), (e) => {
1828
+ let n = je(e);
1829
+ return typeof n == "string" && n === e.trim() ? t.evaluateFormula(e) : n;
1830
+ })) return /^["'](.*)["']$/.test(i) ? i.slice(1, -1) : t.evaluateFormula(i);
1831
+ }
1832
+ return C;
1833
+ },
1834
+ minArgs: 2,
1835
+ description: "Checks multiple conditions and returns the first true result",
1836
+ examples: ["IFS(A1>90, \"A\", A1>80, \"B\", A1>70, \"C\")", "IFS(B1=\"Yes\", 1, B1=\"No\", 0)"],
1837
+ category: "Logical"
1838
+ }), P.register({
1839
+ name: "TRUE",
1840
+ handler: () => !0,
1841
+ minArgs: 0,
1842
+ maxArgs: 0,
1843
+ description: "Returns the logical value TRUE",
1844
+ examples: ["TRUE()", "IF(A1>0, TRUE(), FALSE())"],
1845
+ category: "Logical"
1846
+ }), P.register({
1847
+ name: "FALSE",
1848
+ handler: () => !1,
1849
+ minArgs: 0,
1850
+ maxArgs: 0,
1851
+ description: "Returns the logical value FALSE",
1852
+ examples: ["FALSE()", "IF(A1>0, TRUE(), FALSE())"],
1853
+ category: "Logical"
1854
+ });
1855
+ //#endregion
1856
+ //#region src/engine/textFormat.ts
1857
+ var Dr = 100, Or = "?\\*_[]\"@;/", kr = /[#0][#0,.]*/, Ar = /[#0]/, jr = /0+$/, Mr = (e, t) => Array.from(e).filter((e) => t.includes(e)).length, Nr = (e) => Array.from(e).some((e) => Or.includes(e)), Pr = (e) => {
1858
+ let t = kr.exec(e);
1859
+ if (!t || t[0].endsWith(",")) return null;
1860
+ let n = e.slice(0, t.index), r = e.slice(t.index + t[0].length);
1861
+ if (Ar.test(r) || Nr(n) || Nr(r)) return null;
1862
+ let [i, a = "", ...o] = t[0].split(".");
1863
+ return i === void 0 || o.length > 0 ? null : {
1864
+ prefix: n,
1865
+ suffix: r,
1866
+ useGrouping: i.includes(","),
1867
+ integerMinDigits: Mr(i, "0"),
1868
+ minDecimals: Mr(a, "0"),
1869
+ maxDecimals: Mr(a, "#0"),
1870
+ isPercent: n.includes("%") || r.includes("%")
1871
+ };
1872
+ }, Fr = (e, t) => {
1873
+ let n = e.replace(jr, "");
1874
+ return n.length >= t ? n : e.slice(0, t);
1875
+ }, Ir = (e, t) => {
1876
+ let n = e.toFixed(t.maxDecimals), r = n.indexOf("."), i = r === -1 ? n : n.slice(0, r), a = r === -1 ? "" : n.slice(r + 1), o = i.padStart(t.integerMinDigits, "0"), s = t.useGrouping ? Ze(o) : o, c = Fr(a, t.minDecimals);
1877
+ return c ? `${s}.${c}` : s;
1878
+ }, Lr = (e) => Array.from(e).every((e) => e === "0" || e === "," || e === "."), Rr = (e, t) => {
1879
+ if (!Number.isFinite(e)) return null;
1880
+ let n = Pr(t);
1881
+ if (!n) return null;
1882
+ let r = n.isPercent ? e * Dr : e, i = Ir(Math.abs(r), n);
1883
+ return `${r < 0 && !Lr(i) ? "-" : ""}${n.prefix}${i}${n.suffix}`;
1884
+ }, zr = (e) => /[\p{L}\p{M}]/u.test(e), Br = (e) => {
1885
+ let t = Array.from(e);
1886
+ return t.map((e, n) => {
1887
+ let r = t[n - 1];
1888
+ return r === void 0 || !zr(r) ? e.toUpperCase() : e.toLowerCase();
1889
+ }).join("");
1890
+ }, Vr = (e) => !Number.isFinite(e) || e < 0 ? x : Math.trunc(e), Hr = (e, t) => {
1891
+ let n = Vr(t);
1892
+ return w(n) ? n : e.substring(0, n);
1893
+ }, Ur = (e, t) => {
1894
+ let n = Vr(t);
1895
+ return w(n) ? n : e.substring(e.length - n);
1896
+ }, Wr = (e, t, n, r) => {
1897
+ let i = e.split(t);
1898
+ return r > i.length - 1 ? e : i.slice(0, r).join(t) + n + i.slice(r).join(t);
1899
+ }, Gr = (e, t, n, r) => {
1900
+ if (t === "") return e;
1901
+ if (r === void 0) return e.split(t).join(n);
1902
+ let i = Math.trunc(r);
1903
+ return !Number.isFinite(i) || i <= 0 ? x : Wr(e, t, n, i);
1904
+ }, Kr = (e, t) => e.map((e) => I(t.evaluateFormula(e.trim()))).join(""), qr = Kr, Jr = (e, t) => Hr(I(t.evaluateFormula(M(t, e, 0))), e.length === 2 ? Number(t.evaluateFormula(M(t, e, 1))) : 1), Yr = (e, t) => Ur(I(t.evaluateFormula(M(t, e, 0))), e.length === 2 ? Number(t.evaluateFormula(M(t, e, 1))) : 1), Xr = (e, t, n) => {
1905
+ let r = Vr(n);
1906
+ if (w(r)) return r;
1907
+ if (!Number.isFinite(t) || t < 1) return x;
1908
+ let i = Math.trunc(t) - 1;
1909
+ return e.substring(i, i + r);
1910
+ }, Zr = (e, t) => Xr(I(t.evaluateFormula(M(t, e, 0))), Number(t.evaluateFormula(M(t, e, 1))), Number(t.evaluateFormula(M(t, e, 2)))), Qr = (e, t) => I(t.evaluateFormula(M(t, e, 0))).length, $r = (e, t) => I(t.evaluateFormula(M(t, e, 0))).toUpperCase(), ei = (e, t) => I(t.evaluateFormula(M(t, e, 0))).toLowerCase(), ti = (e, t) => Br(I(t.evaluateFormula(M(t, e, 0)))), ni = (e, t) => I(t.evaluateFormula(M(t, e, 0))).trim().replace(/\s+/g, " "), ri = (e, t) => Gr(I(t.evaluateFormula(M(t, e, 0))), I(t.evaluateFormula(M(t, e, 1))), I(t.evaluateFormula(M(t, e, 2))), e.length === 4 ? Number(t.evaluateFormula(M(t, e, 3))) : void 0), ii = (e, t) => {
1911
+ let n = I(t.evaluateFormula(M(t, e, 0))), r = Number(t.evaluateFormula(M(t, e, 1))) - 1, i = Number(t.evaluateFormula(M(t, e, 2))), a = I(t.evaluateFormula(M(t, e, 3)));
1912
+ return n.substring(0, r) + a + n.substring(r + i);
1913
+ }, ai = (e, t, n, r) => {
1914
+ let i = r.caseInsensitive ? e.toLowerCase() : e, a = (r.caseInsensitive ? t.toLowerCase() : t).indexOf(i, n);
1915
+ return a === -1 ? x : a + 1;
1916
+ }, oi = (e) => (t, n) => ai(I(n.evaluateFormula(M(n, t, 0))), I(n.evaluateFormula(M(n, t, 1))), t.length === 3 ? Number(n.evaluateFormula(M(n, t, 2))) - 1 : 0, { caseInsensitive: e }), si = oi(!1), ci = oi(!0), li = (e) => e.replace(/^["']/, "").replace(/["']$/, ""), ui = (e, t) => {
1917
+ let n = t.evaluateFormula(M(t, e, 0)), r = li(I(t.evaluateFormula(M(t, e, 1))));
1918
+ return typeof n == "number" ? Rr(n, r) ?? I(n) : I(n);
1919
+ }, di = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/, fi = (e) => {
1920
+ if (!di.test(e)) return null;
1921
+ let t = Number(e);
1922
+ return Number.isFinite(t) ? t : null;
1923
+ }, pi = (e) => {
1924
+ let t = e.replace(/[$,]/g, "").trim();
1925
+ if (t.endsWith("%")) {
1926
+ let e = fi(t.slice(0, -1).trim());
1927
+ return e === null ? x : e / 100;
1928
+ }
1929
+ let n = fi(t);
1930
+ return n === null ? x : n;
1931
+ };
1932
+ P.register({
1933
+ name: "CONCATENATE",
1934
+ handler: Kr,
1935
+ minArgs: 1,
1936
+ description: "Joins several text strings into one string",
1937
+ examples: ["CONCATENATE(\"Hello\", \" \", \"World\")", "CONCATENATE(A1, B1)"],
1938
+ category: "Text"
1939
+ }), P.register({
1940
+ name: "CONCAT",
1941
+ handler: qr,
1942
+ minArgs: 1,
1943
+ description: "Joins several text strings into one string (same as CONCATENATE)",
1944
+ examples: ["CONCAT(\"Hello\", \" \", \"World\")", "CONCAT(A1, B1)"],
1945
+ category: "Text"
1946
+ }), P.register({
1947
+ name: "LEFT",
1948
+ handler: Jr,
1949
+ minArgs: 1,
1950
+ maxArgs: 2,
1951
+ description: "Returns the leftmost characters from a text string",
1952
+ examples: ["LEFT(\"Hello\", 2)", "LEFT(A1, 3)"],
1953
+ category: "Text"
1954
+ }), P.register({
1955
+ name: "RIGHT",
1956
+ handler: Yr,
1957
+ minArgs: 1,
1958
+ maxArgs: 2,
1959
+ description: "Returns the rightmost characters from a text string",
1960
+ examples: ["RIGHT(\"Hello\", 2)", "RIGHT(A1, 3)"],
1961
+ category: "Text"
1962
+ }), P.register({
1963
+ name: "MID",
1964
+ handler: Zr,
1965
+ minArgs: 3,
1966
+ maxArgs: 3,
1967
+ description: "Returns characters from the middle of a text string",
1968
+ examples: ["MID(\"Hello\", 2, 3)", "MID(A1, 1, 5)"],
1969
+ category: "Text"
1970
+ }), P.register({
1971
+ name: "LEN",
1972
+ handler: Qr,
1973
+ minArgs: 1,
1974
+ maxArgs: 1,
1975
+ description: "Returns the number of characters in a text string",
1976
+ examples: ["LEN(\"Hello\")", "LEN(A1)"],
1977
+ category: "Text"
1978
+ }), P.register({
1979
+ name: "UPPER",
1980
+ handler: $r,
1981
+ minArgs: 1,
1982
+ maxArgs: 1,
1983
+ description: "Converts text to uppercase",
1984
+ examples: ["UPPER(\"hello\")", "UPPER(A1)"],
1985
+ category: "Text"
1986
+ }), P.register({
1987
+ name: "LOWER",
1988
+ handler: ei,
1989
+ minArgs: 1,
1990
+ maxArgs: 1,
1991
+ description: "Converts text to lowercase",
1992
+ examples: ["LOWER(\"HELLO\")", "LOWER(A1)"],
1993
+ category: "Text"
1994
+ }), P.register({
1995
+ name: "PROPER",
1996
+ handler: ti,
1997
+ minArgs: 1,
1998
+ maxArgs: 1,
1999
+ description: "Capitalizes the first letter of each word",
2000
+ examples: ["PROPER(\"hello world\")", "PROPER(A1)"],
2001
+ category: "Text"
2002
+ }), P.register({
2003
+ name: "TRIM",
2004
+ handler: ni,
2005
+ minArgs: 1,
2006
+ maxArgs: 1,
2007
+ description: "Removes extra spaces from text",
2008
+ examples: ["TRIM(\" hello world \")", "TRIM(A1)"],
2009
+ category: "Text"
2010
+ }), P.register({
2011
+ name: "SUBSTITUTE",
2012
+ handler: ri,
2013
+ minArgs: 3,
2014
+ maxArgs: 4,
2015
+ description: "Replaces old text with new text in a string",
2016
+ examples: ["SUBSTITUTE(\"Hello World\", \"World\", \"Earth\")", "SUBSTITUTE(A1, \"old\", \"new\", 1)"],
2017
+ category: "Text"
2018
+ }), P.register({
2019
+ name: "REPLACE",
2020
+ handler: ii,
2021
+ minArgs: 4,
2022
+ maxArgs: 4,
2023
+ description: "Replaces part of a text string with a different text string",
2024
+ examples: ["REPLACE(\"Hello World\", 7, 5, \"Earth\")", "REPLACE(A1, 1, 3, \"New\")"],
2025
+ category: "Text"
2026
+ }), P.register({
2027
+ name: "FIND",
2028
+ handler: si,
2029
+ minArgs: 2,
2030
+ maxArgs: 3,
2031
+ description: "Finds one text string within another (case-sensitive)",
2032
+ examples: ["FIND(\"o\", \"Hello\")", "FIND(\"World\", A1)"],
2033
+ category: "Text"
2034
+ }), P.register({
2035
+ name: "SEARCH",
2036
+ handler: ci,
2037
+ minArgs: 2,
2038
+ maxArgs: 3,
2039
+ description: "Finds one text string within another (case-insensitive)",
2040
+ examples: ["SEARCH(\"O\", \"Hello\")", "SEARCH(\"world\", A1)"],
2041
+ category: "Text"
2042
+ }), P.register({
2043
+ name: "TEXT",
2044
+ handler: ui,
2045
+ minArgs: 2,
2046
+ maxArgs: 2,
2047
+ description: "Formats a number and converts it to text",
2048
+ examples: ["TEXT(1234.5, \"$#,##0.00\")", "TEXT(0.5, \"0%\")"],
2049
+ category: "Text"
2050
+ }), P.register({
2051
+ name: "VALUE",
2052
+ handler: (e, t) => pi(I(t.evaluateFormula(M(t, e, 0)))),
2053
+ minArgs: 1,
2054
+ maxArgs: 1,
2055
+ description: "Converts a text string to a number",
2056
+ examples: ["VALUE(\"123\")", "VALUE(\"$1,234.56\")"],
2057
+ category: "Text"
2058
+ }), P.register({
2059
+ name: "EXACT",
2060
+ handler: (e, t) => I(t.evaluateFormula(M(t, e, 0))) === I(t.evaluateFormula(M(t, e, 1))),
2061
+ minArgs: 2,
2062
+ maxArgs: 2,
2063
+ description: "Checks if two text strings are exactly the same",
2064
+ examples: ["EXACT(\"Hello\", \"hello\")", "EXACT(A1, B1)"],
2065
+ category: "Text"
2066
+ });
2067
+ //#endregion
2068
+ //#region src/engine/financial-math.ts
2069
+ function mi(e, t, n, r, i) {
2070
+ if (e === 0) return -(r + n * t);
2071
+ let a = (1 + e) ** +t;
2072
+ return -r * a - n * (a - 1) * (1 + e * i) / e;
2073
+ }
2074
+ function hi(e, t, n, r, i) {
2075
+ if (e === 0) return -(r + n) / t;
2076
+ let a = (1 + e) ** +t;
2077
+ return -e * (r + n * a) / ((a - 1) * (1 + e * i));
2078
+ }
2079
+ function gi(e, t, n, r, i, a) {
2080
+ let o = hi(e, n, r, i, a);
2081
+ if (t === 1 && a === 1) return 0;
2082
+ let s = mi(e, a === 1 ? t - 2 : t - 1, o, r, a) * e;
2083
+ return a === 1 ? s / (1 + e) : s;
2084
+ }
2085
+ function _i(e, t, n, r, i, a) {
2086
+ return hi(e, n, r, i, a) - gi(e, t, n, r, i, a);
2087
+ }
2088
+ function vi(e, t, n, r, i) {
2089
+ if (e === 0) return -(r + n * t);
2090
+ let a = (1 + e) ** +t;
2091
+ return (-r - n * (a - 1) * (1 + e * i) / e) / a;
2092
+ }
2093
+ function yi(e, t, n, r, i) {
2094
+ if (e === 0) return -(r + n) / t;
2095
+ let a = t * (1 + e * i);
2096
+ return Math.log((a - r * e) / (a + n * e)) / Math.log(1 + e);
2097
+ }
2098
+ var bi = 100, Z = 1e-7;
2099
+ function xi(e, t, n, r, i, a) {
2100
+ let o = a;
2101
+ for (let a = 0; a < bi; a++) {
2102
+ Math.abs(o) < Z && (o = Z);
2103
+ let a = (1 + o) ** +e, s = n * a + t * ((a - 1) / o) * (1 + o * i) + r, c = e * n * (1 + o) ** (e - 1) + t * (1 + o * i) * (e * (1 + o) ** (e - 1) * o - (a - 1)) / (o * o) + t * i * ((a - 1) / o), l = o - s / c;
2104
+ if (Math.abs(l - o) < Z) return Number.isFinite(l) ? l : S;
2105
+ o = l;
2106
+ }
2107
+ return S;
2108
+ }
2109
+ function Si(e, t) {
2110
+ return t.reduce((t, n, r) => t + n / (1 + e) ** +(r + 1), 0);
2111
+ }
2112
+ function Ci(e, t) {
2113
+ return e.reduce((e, n, r) => {
2114
+ let i = (1 + t) ** +r;
2115
+ return {
2116
+ npv: e.npv + n / i,
2117
+ dnpv: e.dnpv - r * n / (i * (1 + t))
2118
+ };
2119
+ }, {
2120
+ npv: 0,
2121
+ dnpv: 0
2122
+ });
2123
+ }
2124
+ function wi(e, t) {
2125
+ let n = t;
2126
+ for (let t = 0; t < bi; t++) {
2127
+ let { npv: t, dnpv: r } = Ci(e, n);
2128
+ if (Math.abs(t) < Z) return n;
2129
+ if (Math.abs(r) < Z) return S;
2130
+ let i = n - t / r;
2131
+ if (Math.abs(i - n) < Z) return Number.isFinite(i) ? i : S;
2132
+ n = i;
2133
+ }
2134
+ return S;
2135
+ }
2136
+ //#endregion
2137
+ //#region src/engine/functions/financial.ts
2138
+ var Q = (e, t, n, r) => {
2139
+ let i = (n) => F(t.evaluateFormula(M(t, e, n))), a = Array.from({ length: n }, (e, t) => i(t)), o = r.map((t, r) => e.length > n + r ? i(n + r) : t);
2140
+ return [...a, ...o];
2141
+ }, Ti = (e, t) => {
2142
+ let [n, r, i, a, o] = Q(e, t, 3, [0, 0]);
2143
+ return mi(n, r, i, a, o);
2144
+ }, Ei = (e, t) => {
2145
+ let [n, r, i, a, o] = Q(e, t, 3, [0, 0]);
2146
+ return vi(n, r, i, a, o);
2147
+ }, Di = (e, t) => {
2148
+ let [n, r, i, a, o] = Q(e, t, 3, [0, 0]);
2149
+ return hi(n, r, i, a, o);
2150
+ }, Oi = (e, t) => {
2151
+ let [n, r, i, a, o] = Q(e, t, 3, [0, 0]);
2152
+ return yi(n, r, i, a, o);
2153
+ }, ki = (e, t) => {
2154
+ let [n, r, i, a, o, s] = Q(e, t, 3, [
2155
+ 0,
2156
+ 0,
2157
+ .1
2158
+ ]);
2159
+ return xi(n, r, i, a, o, s);
2160
+ }, Ai = (e) => (t, n) => {
2161
+ let [r, i, a, o, s, c] = Q(t, n, 4, [0, 0]);
2162
+ return e(r, i, a, o, s, c);
2163
+ }, ji = Ai(gi), Mi = Ai(_i), Ni = (e, t) => e.flatMap((e) => (e.includes(":") ? t.getRangeValues(e) : [t.evaluateFormula(e)]).map(F));
2164
+ P.register({
2165
+ name: "FV",
2166
+ handler: Ti,
2167
+ minArgs: 3,
2168
+ maxArgs: 5,
2169
+ description: "Calculates the future value of an investment based on periodic, constant payments and a constant interest rate",
2170
+ examples: ["FV(0.06/12, 12, -100, -1000, 1)", "FV(A1, A2, A3)"],
2171
+ category: "Financial"
2172
+ }), P.register({
2173
+ name: "PV",
2174
+ handler: Ei,
2175
+ minArgs: 3,
2176
+ maxArgs: 5,
2177
+ description: "Calculates the present value of an investment based on periodic, constant payments and a constant interest rate",
2178
+ examples: ["PV(0.08/12, 12*20, 500, 0, 0)", "PV(A1, A2, A3)"],
2179
+ category: "Financial"
2180
+ }), P.register({
2181
+ name: "PMT",
2182
+ handler: Di,
2183
+ minArgs: 3,
2184
+ maxArgs: 5,
2185
+ description: "Calculates the payment for a loan based on constant payments and a constant interest rate",
2186
+ examples: ["PMT(0.06/12, 30*12, 250000)", "PMT(A1, A2, A3)"],
2187
+ category: "Financial"
2188
+ }), P.register({
2189
+ name: "NPER",
2190
+ handler: Oi,
2191
+ minArgs: 3,
2192
+ maxArgs: 5,
2193
+ description: "Calculates the number of periods for an investment based on periodic, constant payments and a constant interest rate",
2194
+ examples: ["NPER(0.06/12, -1000, 50000, 0, 0)", "NPER(A1, A2, A3)"],
2195
+ category: "Financial"
2196
+ }), P.register({
2197
+ name: "RATE",
2198
+ handler: ki,
2199
+ minArgs: 3,
2200
+ maxArgs: 6,
2201
+ description: "Calculates the interest rate per period of an annuity using iteration",
2202
+ examples: ["RATE(12, -100, 1000, 0, 0, 0.1)", "RATE(A1, A2, A3)"],
2203
+ category: "Financial"
2204
+ }), P.register({
2205
+ name: "IPMT",
2206
+ handler: ji,
2207
+ minArgs: 4,
2208
+ maxArgs: 6,
2209
+ description: "Calculates the interest payment for a given period for an investment",
2210
+ examples: ["IPMT(0.06/12, 1, 30*12, 250000)", "IPMT(A1, A2, A3, A4)"],
2211
+ category: "Financial"
2212
+ }), P.register({
2213
+ name: "PPMT",
2214
+ handler: Mi,
2215
+ minArgs: 4,
2216
+ maxArgs: 6,
2217
+ description: "Calculates the payment on the principal for a given period for an investment",
2218
+ examples: ["PPMT(0.06/12, 1, 30*12, 250000)", "PPMT(A1, A2, A3, A4)"],
2219
+ category: "Financial"
2220
+ }), P.register({
2221
+ name: "NPV",
2222
+ handler: (e, t) => Si(F(t.evaluateFormula(M(t, e, 0))), Ni(e.slice(1), t)),
2223
+ minArgs: 2,
2224
+ description: "Calculates the net present value of an investment based on a discount rate and a series of future cash flows",
2225
+ examples: ["NPV(0.1, -10000, 3000, 4200, 6800)", "NPV(A1, B1:B10)"],
2226
+ category: "Financial"
2227
+ }), P.register({
2228
+ name: "IRR",
2229
+ handler: (e, t) => {
2230
+ let n = t.getRangeValues(M(t, e, 0)).map(F), r = e.length === 2 ? F(t.evaluateFormula(M(t, e, 1))) : .1;
2231
+ if (n.length === 0) throw Error("IRR requires at least one value");
2232
+ return wi(n, r);
2233
+ },
2234
+ minArgs: 1,
2235
+ maxArgs: 2,
2236
+ description: "Calculates the internal rate of return for a series of cash flows",
2237
+ examples: ["IRR(A1:A5, 0.1)", "IRR(B1:B10)"],
2238
+ category: "Financial"
2239
+ });
2240
+ //#endregion
2241
+ //#region src/engine/functions/lookup-math.ts
2242
+ function Pi(e) {
2243
+ if (typeof e == "boolean") return e;
2244
+ if (typeof e == "number") return e !== 0;
2245
+ if (w(e)) return !1;
2246
+ let t = e.trim().toUpperCase();
2247
+ return t === "TRUE" || t === "1";
2248
+ }
2249
+ //#endregion
2250
+ //#region src/engine/functions/lookup.ts
2251
+ var Fi = (e, t) => Array.from({ length: Math.max(0, t - e + 1) }, (t, n) => e + n), Ii = (e, t, n, r, i) => Fi(r, i).map((r) => e.getCellValue(`${t}${n}${r}`)), Li = (e, t, n, r, i) => Fi(r, i).map((r) => e.getCellValue(`${t}${v(r)}${n}`)), Ri = (e, t) => e.reduce((e, n, r) => t(n) ? r : e, -1), zi = (e, t) => {
2252
+ let n = e.findIndex((e) => !t(e));
2253
+ return (n === -1 ? e.length : n) - 1;
2254
+ }, Bi = (e, t) => typeof e == "number" && typeof t == "number" ? e - t : String(e).localeCompare(String(t)), $ = (e, t, n = 1, r = 1) => {
2255
+ if (n === 0) {
2256
+ let n = typeof e == "string" && (e.includes("*") || e.includes("?")) ? L(e) : (t) => t == e;
2257
+ return r === 1 ? t.findIndex(n) : Ri(t, n);
2258
+ }
2259
+ return n === 1 ? zi(t, (t) => Bi(t, e) <= 0) : n === -1 ? zi(t, (t) => Bi(t, e) >= 0) : -1;
2260
+ };
2261
+ P.register({
2262
+ name: "VLOOKUP",
2263
+ handler: (e, t) => {
2264
+ let n = t.evaluateFormula(M(t, e, 0)), r = B(M(t, e, 1));
2265
+ if (!r) throw Error("Invalid table array range");
2266
+ let i = F(t.evaluateFormula(M(t, e, 2))), a = +!!Pi(e.length !== 4 || t.evaluateFormula(M(t, e, 3))), o = dn(i, r.endCol - r.startCol + 1);
2267
+ if (o === null) return ve;
2268
+ let s = v(r.startCol), c = $(n, Ii(t, r.sheetPrefix, s, r.startRow, r.endRow), a);
2269
+ if (c === -1) return C;
2270
+ let l = v(r.startCol + o), u = r.startRow + c;
2271
+ return t.getCellValue(`${r.sheetPrefix}${l}${u}`);
2272
+ },
2273
+ minArgs: 3,
2274
+ maxArgs: 4,
2275
+ description: "Looks for a value in the leftmost column of a table, and then returns a value in the same row from a column you specify",
2276
+ examples: ["VLOOKUP(105, A2:C10, 2)", "VLOOKUP(\"Smith\", A2:E10, 5, FALSE)"],
2277
+ category: "Lookup & Reference"
2278
+ }), P.register({
2279
+ name: "HLOOKUP",
2280
+ handler: (e, t) => {
2281
+ let n = t.evaluateFormula(M(t, e, 0)), r = B(M(t, e, 1));
2282
+ if (!r) throw Error("Invalid range format");
2283
+ let i = F(t.evaluateFormula(M(t, e, 2))), a = +!!Pi(e.length !== 4 || t.evaluateFormula(M(t, e, 3))), o = dn(i, r.endRow - r.startRow + 1);
2284
+ if (o === null) return ve;
2285
+ let s = $(n, Li(t, r.sheetPrefix, r.startRow, r.startCol, r.endCol), a);
2286
+ if (s === -1) return C;
2287
+ let c = v(r.startCol + s), l = r.startRow + o;
2288
+ return t.getCellValue(`${r.sheetPrefix}${c}${l}`);
2289
+ },
2290
+ minArgs: 3,
2291
+ maxArgs: 4,
2292
+ description: "Looks for a value in the top row of a table, and then returns a value in the same column from a row you specify",
2293
+ examples: ["HLOOKUP(\"Axles\", A1:C10, 2, TRUE)"],
2294
+ category: "Lookup & Reference"
2295
+ }), P.register({
2296
+ name: "MATCH",
2297
+ handler: (e, t) => {
2298
+ let n = t.evaluateFormula(M(t, e, 0)), r = M(t, e, 1), i = e.length === 3 ? F(t.evaluateFormula(M(t, e, 2))) : 1, a = $(n, N(t)(r), i);
2299
+ return a === -1 ? C : a + 1;
2300
+ },
2301
+ minArgs: 2,
2302
+ maxArgs: 3,
2303
+ description: "Returns the relative position of an item in an array that matches a specified value",
2304
+ examples: ["MATCH(25, A1:A10, 0)", "MATCH(\"b\", A1:A5, 0)"],
2305
+ category: "Lookup & Reference"
2306
+ }), P.register({
2307
+ name: "INDEX",
2308
+ handler: (e, t) => {
2309
+ let n = B(M(t, e, 0));
2310
+ if (!n) throw Error("Invalid range format");
2311
+ let r = un(n, F(t.evaluateFormula(M(t, e, 1))), e.length >= 3 ? F(t.evaluateFormula(M(t, e, 2))) : 1);
2312
+ return r ? t.getCellValue(`${n.sheetPrefix}${v(r.colIndex)}${r.row}`) : ve;
2313
+ },
2314
+ minArgs: 2,
2315
+ maxArgs: 4,
2316
+ description: "Returns the value of an element in a table or an array, selected by the row and column number indexes",
2317
+ examples: ["INDEX(A1:B5, 2, 2)", "INDEX(A1:A10, 5)"],
2318
+ category: "Lookup & Reference"
2319
+ }), P.register({
2320
+ name: "XLOOKUP",
2321
+ handler: (e, t) => {
2322
+ let n = t.evaluateFormula(M(t, e, 0)), r = M(t, e, 1), i = M(t, e, 2), a = e.length >= 4 ? t.evaluateFormula(M(t, e, 3)) : C, o = e.length >= 5 ? F(t.evaluateFormula(M(t, e, 4))) : 0, s = e.length >= 6 ? F(t.evaluateFormula(M(t, e, 5))) : 1, c = N(t), l = c(r), u = c(i), d = -1;
2323
+ if (o === 0 || o === 2) d = $(n, l, 0, s);
2324
+ else {
2325
+ let e = Infinity;
2326
+ for (let t = 0; t < l.length; t++) {
2327
+ let r = s === 1 ? t : l.length - 1 - t, i = l[r];
2328
+ if (i == n) {
2329
+ d = r;
2330
+ break;
2331
+ }
2332
+ if (typeof i == "number" && typeof n == "number") {
2333
+ let t = i - n;
2334
+ o === -1 && t < 0 && Math.abs(t) < e ? (e = Math.abs(t), d = r) : o === 1 && t > 0 && t < e && (e = t, d = r);
2335
+ }
2336
+ }
2337
+ }
2338
+ if (d === -1) return a;
2339
+ let f = u[d];
2340
+ return f === void 0 ? C : f;
2341
+ },
2342
+ minArgs: 3,
2343
+ maxArgs: 6,
2344
+ description: "Searches a range or an array, and returns an item corresponding to the first match it finds",
2345
+ examples: ["XLOOKUP(A1, B1:B10, C1:C10)", "XLOOKUP(\"USA\", Countries, Populations)"],
2346
+ category: "Lookup & Reference"
2347
+ }), P.register({
2348
+ name: "NOW",
2349
+ handler: () => {
2350
+ let e = /* @__PURE__ */ new Date();
2351
+ return T(new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate(), e.getHours(), e.getMinutes(), e.getSeconds())));
2352
+ },
2353
+ minArgs: 0,
2354
+ maxArgs: 0,
2355
+ description: "Returns the serial number of the current date and time",
2356
+ examples: ["NOW()"],
2357
+ category: "Date & Time"
2358
+ }), P.register({
2359
+ name: "TODAY",
2360
+ handler: () => {
2361
+ let e = /* @__PURE__ */ new Date();
2362
+ return T(new Date(Date.UTC(e.getFullYear(), e.getMonth(), e.getDate())));
2363
+ },
2364
+ minArgs: 0,
2365
+ maxArgs: 0,
2366
+ description: "Returns the serial number of today's date",
2367
+ examples: ["TODAY()"],
2368
+ category: "Date & Time"
2369
+ }), P.register({
2370
+ name: "DATE",
2371
+ handler: (e, t) => {
2372
+ let n = F(t.evaluateFormula(M(t, e, 0))), r = F(t.evaluateFormula(M(t, e, 1))), i = F(t.evaluateFormula(M(t, e, 2)));
2373
+ return T(new Date(Date.UTC(n, r - 1, i)));
2374
+ },
2375
+ minArgs: 3,
2376
+ maxArgs: 3,
2377
+ description: "Returns the serial number that represents a particular date",
2378
+ examples: ["DATE(2023, 11, 25)"],
2379
+ category: "Date & Time"
2380
+ }), P.register({
2381
+ name: "TIME",
2382
+ handler: (e, t) => {
2383
+ let n = F(t.evaluateFormula(M(t, e, 0))), r = F(t.evaluateFormula(M(t, e, 1))), i = F(t.evaluateFormula(M(t, e, 2))), a = n * 3600 + r * 60 + i, o = 86400;
2384
+ return a % o / o;
2385
+ },
2386
+ minArgs: 3,
2387
+ maxArgs: 3,
2388
+ description: "Returns the serial number of a particular time",
2389
+ examples: ["TIME(14, 30, 0)"],
2390
+ category: "Date & Time"
2391
+ }), P.register({
2392
+ name: "YEAR",
2393
+ handler: (e, t) => E(F(t.evaluateFormula(M(t, e, 0)))).getUTCFullYear(),
2394
+ minArgs: 1,
2395
+ maxArgs: 1,
2396
+ description: "Converts a serial number to a year",
2397
+ examples: ["YEAR(TODAY())", "YEAR(A1)"],
2398
+ category: "Date & Time"
2399
+ }), P.register({
2400
+ name: "MONTH",
2401
+ handler: (e, t) => E(F(t.evaluateFormula(M(t, e, 0)))).getUTCMonth() + 1,
2402
+ minArgs: 1,
2403
+ maxArgs: 1,
2404
+ description: "Converts a serial number to a month",
2405
+ examples: ["MONTH(TODAY())", "MONTH(A1)"],
2406
+ category: "Date & Time"
2407
+ }), P.register({
2408
+ name: "DAY",
2409
+ handler: (e, t) => E(F(t.evaluateFormula(M(t, e, 0)))).getUTCDate(),
2410
+ minArgs: 1,
2411
+ maxArgs: 1,
2412
+ description: "Converts a serial number to a day of the month",
2413
+ examples: ["DAY(TODAY())", "DAY(A1)"],
2414
+ category: "Date & Time"
2415
+ }), P.register({
2416
+ name: "HOUR",
2417
+ handler: (e, t) => {
2418
+ let n = F(t.evaluateFormula(M(t, e, 0))), r = n - Math.floor(n), i = Math.round(r * 86400);
2419
+ return Math.floor(i / 3600);
2420
+ },
2421
+ minArgs: 1,
2422
+ maxArgs: 1,
2423
+ description: "Converts a serial number to an hour",
2424
+ examples: ["HOUR(NOW())", "HOUR(A1)"],
2425
+ category: "Date & Time"
2426
+ }), P.register({
2427
+ name: "MINUTE",
2428
+ handler: (e, t) => {
2429
+ let n = F(t.evaluateFormula(M(t, e, 0))), r = n - Math.floor(n), i = Math.round(r * 86400);
2430
+ return Math.floor(i % 3600 / 60);
2431
+ },
2432
+ minArgs: 1,
2433
+ maxArgs: 1,
2434
+ description: "Converts a serial number to a minute",
2435
+ examples: ["MINUTE(NOW())", "MINUTE(A1)"],
2436
+ category: "Date & Time"
2437
+ }), P.register({
2438
+ name: "SECOND",
2439
+ handler: (e, t) => {
2440
+ let n = F(t.evaluateFormula(M(t, e, 0))), r = n - Math.floor(n);
2441
+ return Math.round(r * 86400) % 60;
2442
+ },
2443
+ minArgs: 1,
2444
+ maxArgs: 1,
2445
+ description: "Converts a serial number to a second",
2446
+ examples: ["SECOND(NOW())", "SECOND(A1)"],
2447
+ category: "Date & Time"
2448
+ }), P.register({
2449
+ name: "DATEDIF",
2450
+ handler: (e, t) => Ke(F(t.evaluateFormula(M(t, e, 0))), F(t.evaluateFormula(M(t, e, 1))), I(t.evaluateFormula(M(t, e, 2)))),
2451
+ minArgs: 3,
2452
+ maxArgs: 3,
2453
+ description: "Calculates the number of days, months, or years between two dates",
2454
+ examples: ["DATEDIF(A1, B1, \"Y\")", "DATEDIF(DATE(2020,1,1), TODAY(), \"D\")"],
2455
+ category: "Date & Time"
2456
+ });
2457
+ //#endregion
2458
+ //#region src/engine/cellBuilder.ts
2459
+ var Vi = /^[-+]?\s*([A-Z][A-Z0-9]*)\s*\(/i, Hi = (e) => {
2460
+ let t = e.match(Vi)?.[1];
2461
+ return t !== void 0 && _t(t);
2462
+ }, Ui = /[A-Z]+\d+\s*[+\-*/^]/, Wi = /\d+\s*[+\-*/^]\s*\d+/, Gi = /^[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;
2463
+ function Ki(e) {
2464
+ return Hi(e) || Ui.test(e) || Wi.test(e);
2465
+ }
2466
+ function qi(e) {
2467
+ let t = e.trim();
2468
+ return t === "" ? "" : Ki(t) ? `=${t}` : Gi.test(t) ? Number(t) : t;
2469
+ }
2470
+ function Ji(e) {
2471
+ if (e.type === "string") return { v: String(e.value) };
2472
+ let t = { v: qi(e.formula ?? "") };
2473
+ return e.format && e.format.length > 0 && (t.f = e.format), t;
2474
+ }
2475
+ //#endregion
2476
+ //#region src/engine/engine.ts
2477
+ var Yi = class {
2478
+ options;
2479
+ constructor(e = {}) {
2480
+ this.options = {
2481
+ maxIterations: e.maxIterations ?? 100,
2482
+ enableCrossSheetRefs: e.enableCrossSheetRefs ?? !0,
2483
+ strictMode: e.strictMode ?? !1,
2484
+ preferDDMMYYYY: e.preferDDMMYYYY ?? !1
2485
+ };
2486
+ }
2487
+ calculate(e, t) {
2488
+ return H(e, t, { preferDDMMYYYY: this.options.preferDDMMYYYY });
2489
+ }
2490
+ calculateWorkbook(e) {
2491
+ return hn(e, { preferDDMMYYYY: this.options.preferDDMMYYYY });
2492
+ }
2493
+ getOptions() {
2494
+ return { ...this.options };
2495
+ }
2496
+ setOptions(e) {
2497
+ this.options = {
2498
+ ...this.options,
2499
+ ...e
2500
+ };
2501
+ }
2502
+ createSheet(e, t) {
2503
+ return {
2504
+ name: e,
2505
+ data: t.map((e) => e.map((e) => a(e) && "v" in e ? e : { v: e }))
2506
+ };
2507
+ }
2508
+ toStringArray(e) {
2509
+ return e.data.map((e) => e.map((e) => String(e ?? "")));
2510
+ }
2511
+ }, Xi = [
2512
+ {
2513
+ name: "Simple Budget",
2514
+ args: {
2515
+ title: "Monthly Budget",
2516
+ sheets: [{
2517
+ name: "Budget",
2518
+ data: [
2519
+ [{ v: "Category" }, { v: "Amount" }],
2520
+ [{ v: "Income" }, {
2521
+ v: 5e3,
2522
+ f: "$#,##0.00"
2523
+ }],
2524
+ [{ v: "Rent" }, {
2525
+ v: -1500,
2526
+ f: "$#,##0.00"
2527
+ }],
2528
+ [{ v: "Utilities" }, {
2529
+ v: -200,
2530
+ f: "$#,##0.00"
2531
+ }],
2532
+ [{ v: "Food" }, {
2533
+ v: -600,
2534
+ f: "$#,##0.00"
2535
+ }],
2536
+ [{ v: "Transport" }, {
2537
+ v: -300,
2538
+ f: "$#,##0.00"
2539
+ }],
2540
+ [{ v: "Total" }, {
2541
+ v: "=SUM(B2:B6)",
2542
+ f: "$#,##0.00"
2543
+ }]
2544
+ ]
2545
+ }]
2546
+ }
2547
+ },
2548
+ {
2549
+ name: "Sales Report",
2550
+ args: {
2551
+ title: "Q1 Sales Report",
2552
+ sheets: [{
2553
+ name: "Sales",
2554
+ data: [
2555
+ [
2556
+ { v: "Product" },
2557
+ { v: "Jan" },
2558
+ { v: "Feb" },
2559
+ { v: "Mar" },
2560
+ { v: "Total" }
2561
+ ],
2562
+ [
2563
+ { v: "Widget A" },
2564
+ { v: 1200 },
2565
+ { v: 1350 },
2566
+ { v: 1500 },
2567
+ { v: "=SUM(B2:D2)" }
2568
+ ],
2569
+ [
2570
+ { v: "Widget B" },
2571
+ { v: 800 },
2572
+ { v: 920 },
2573
+ { v: 1100 },
2574
+ { v: "=SUM(B3:D3)" }
2575
+ ],
2576
+ [
2577
+ { v: "Widget C" },
2578
+ { v: 450 },
2579
+ { v: 480 },
2580
+ { v: 520 },
2581
+ { v: "=SUM(B4:D4)" }
2582
+ ],
2583
+ [
2584
+ { v: "Total" },
2585
+ { v: "=SUM(B2:B4)" },
2586
+ { v: "=SUM(C2:C4)" },
2587
+ { v: "=SUM(D2:D4)" },
2588
+ { v: "=SUM(E2:E4)" }
2589
+ ]
2590
+ ]
2591
+ }]
2592
+ }
2593
+ },
2594
+ {
2595
+ name: "Loan Calculator",
2596
+ args: {
2597
+ title: "Loan Calculator",
2598
+ sheets: [{
2599
+ name: "Calculator",
2600
+ data: [
2601
+ [{ v: "Loan Amount" }, {
2602
+ v: 25e4,
2603
+ f: "$#,##0"
2604
+ }],
2605
+ [{ v: "Interest Rate" }, {
2606
+ v: .065,
2607
+ f: "0.00%"
2608
+ }],
2609
+ [{ v: "Term (Years)" }, { v: 30 }],
2610
+ [{ v: "" }, { v: "" }],
2611
+ [{ v: "Monthly Payment" }, {
2612
+ v: "=PMT(B2/12, B3*12, -B1)",
2613
+ f: "$#,##0.00"
2614
+ }],
2615
+ [{ v: "Total Interest" }, {
2616
+ v: "=B5*B3*12-B1",
2617
+ f: "$#,##0.00"
2618
+ }]
2619
+ ]
2620
+ }]
2621
+ }
2622
+ },
2623
+ {
2624
+ name: "World Population",
2625
+ args: {
2626
+ title: "世界人口(上位10)",
2627
+ sheets: [{
2628
+ name: "世界人口(上位10)",
2629
+ data: [
2630
+ [
2631
+ { v: "順位" },
2632
+ { v: "国・地域" },
2633
+ {
2634
+ v: "人口(概数)",
2635
+ f: "#,##0"
2636
+ },
2637
+ { v: "上位10合計に占める割合" },
2638
+ { v: "世界人口に占める割合" }
2639
+ ],
2640
+ [
2641
+ {
2642
+ v: 1,
2643
+ f: "#,##0"
2644
+ },
2645
+ { v: "インド" },
2646
+ {
2647
+ v: 1428627e3,
2648
+ f: "#,##0"
2649
+ },
2650
+ {
2651
+ v: "=C2/$C$12",
2652
+ f: "0.00%"
2653
+ },
2654
+ {
2655
+ v: "=C2/$C$13",
2656
+ f: "0.00%"
2657
+ }
2658
+ ],
2659
+ [
2660
+ {
2661
+ v: 2,
2662
+ f: "#,##0"
2663
+ },
2664
+ { v: "中国" },
2665
+ {
2666
+ v: 1425671e3,
2667
+ f: "#,##0"
2668
+ },
2669
+ {
2670
+ v: "=C3/$C$12",
2671
+ f: "0.00%"
2672
+ },
2673
+ {
2674
+ v: "=C3/$C$13",
2675
+ f: "0.00%"
2676
+ }
2677
+ ],
2678
+ [
2679
+ {
2680
+ v: 3,
2681
+ f: "#,##0"
2682
+ },
2683
+ { v: "アメリカ合衆国" },
2684
+ {
2685
+ v: 334e6,
2686
+ f: "#,##0"
2687
+ },
2688
+ {
2689
+ v: "=C4/$C$12",
2690
+ f: "0.00%"
2691
+ },
2692
+ {
2693
+ v: "=C4/$C$13",
2694
+ f: "0.00%"
2695
+ }
2696
+ ],
2697
+ [
2698
+ {
2699
+ v: 4,
2700
+ f: "#,##0"
2701
+ },
2702
+ { v: "インドネシア" },
2703
+ {
2704
+ v: 277e6,
2705
+ f: "#,##0"
2706
+ },
2707
+ {
2708
+ v: "=C5/$C$12",
2709
+ f: "0.00%"
2710
+ },
2711
+ {
2712
+ v: "=C5/$C$13",
2713
+ f: "0.00%"
2714
+ }
2715
+ ],
2716
+ [
2717
+ {
2718
+ v: 5,
2719
+ f: "#,##0"
2720
+ },
2721
+ { v: "パキスタン" },
2722
+ {
2723
+ v: 24e7,
2724
+ f: "#,##0"
2725
+ },
2726
+ {
2727
+ v: "=C6/$C$12",
2728
+ f: "0.00%"
2729
+ },
2730
+ {
2731
+ v: "=C6/$C$13",
2732
+ f: "0.00%"
2733
+ }
2734
+ ],
2735
+ [
2736
+ {
2737
+ v: 6,
2738
+ f: "#,##0"
2739
+ },
2740
+ { v: "ナイジェリア" },
2741
+ {
2742
+ v: 219e6,
2743
+ f: "#,##0"
2744
+ },
2745
+ {
2746
+ v: "=C7/$C$12",
2747
+ f: "0.00%"
2748
+ },
2749
+ {
2750
+ v: "=C7/$C$13",
2751
+ f: "0.00%"
2752
+ }
2753
+ ],
2754
+ [
2755
+ {
2756
+ v: 7,
2757
+ f: "#,##0"
2758
+ },
2759
+ { v: "ブラジル" },
2760
+ {
2761
+ v: 216e6,
2762
+ f: "#,##0"
2763
+ },
2764
+ {
2765
+ v: "=C8/$C$12",
2766
+ f: "0.00%"
2767
+ },
2768
+ {
2769
+ v: "=C8/$C$13",
2770
+ f: "0.00%"
2771
+ }
2772
+ ],
2773
+ [
2774
+ {
2775
+ v: 8,
2776
+ f: "#,##0"
2777
+ },
2778
+ { v: "バングラデシュ" },
2779
+ {
2780
+ v: 172e6,
2781
+ f: "#,##0"
2782
+ },
2783
+ {
2784
+ v: "=C9/$C$12",
2785
+ f: "0.00%"
2786
+ },
2787
+ {
2788
+ v: "=C9/$C$13",
2789
+ f: "0.00%"
2790
+ }
2791
+ ],
2792
+ [
2793
+ {
2794
+ v: 9,
2795
+ f: "#,##0"
2796
+ },
2797
+ { v: "ロシア" },
2798
+ {
2799
+ v: 146e6,
2800
+ f: "#,##0"
2801
+ },
2802
+ {
2803
+ v: "=C10/$C$12",
2804
+ f: "0.00%"
2805
+ },
2806
+ {
2807
+ v: "=C10/$C$13",
2808
+ f: "0.00%"
2809
+ }
2810
+ ],
2811
+ [
2812
+ {
2813
+ v: 10,
2814
+ f: "#,##0"
2815
+ },
2816
+ { v: "メキシコ" },
2817
+ {
2818
+ v: 13e7,
2819
+ f: "#,##0"
2820
+ },
2821
+ {
2822
+ v: "=C11/$C$12",
2823
+ f: "0.00%"
2824
+ },
2825
+ {
2826
+ v: "=C11/$C$13",
2827
+ f: "0.00%"
2828
+ }
2829
+ ],
2830
+ [
2831
+ { v: "" },
2832
+ { v: "合計(上位10)" },
2833
+ {
2834
+ v: "=SUM(C2:C11)",
2835
+ f: "#,##0"
2836
+ },
2837
+ { v: "" },
2838
+ { v: "" }
2839
+ ],
2840
+ [
2841
+ { v: "" },
2842
+ { v: "世界推定人口(例)" },
2843
+ {
2844
+ v: 805e7,
2845
+ f: "#,##0"
2846
+ },
2847
+ { v: "" },
2848
+ { v: "" }
2849
+ ]
2850
+ ]
2851
+ }]
2852
+ }
2853
+ }
2854
+ ];
2855
+ //#endregion
2856
+ export { t as S, s as _, pn as a, r as b, z as c, me as d, le as f, g, h, H as i, v as l, ie as m, Yi as n, fn as o, ae as p, Ji as r, B as s, Xi as t, fe as u, a as v, n as x, i as y };