@pixerate/editor 0.47.0 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +248 -29
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +18 -6
- package/dist/agent/index.d.ts +18 -6
- package/dist/agent/index.js +228 -9
- package/dist/agent/index.js.map +1 -1
- package/dist/{builtins-xs7rK6ys.d.cts → builtins-1kqwLUnb.d.cts} +1 -1
- package/dist/{builtins-D2nMtw2W.d.ts → builtins-BKYlHH1s.d.ts} +1 -1
- package/dist/chart/index.cjs +216 -3541
- package/dist/chart/index.cjs.map +1 -1
- package/dist/chart/index.d.cts +4 -494
- package/dist/chart/index.d.ts +4 -494
- package/dist/chart/index.js +155 -3480
- package/dist/chart/index.js.map +1 -1
- package/dist/{chunk-5VXI5GED.js → chunk-2CJ3LPYQ.js} +3 -3
- package/dist/{chunk-TXXNBDQX.cjs → chunk-2Q46FKZK.cjs} +113 -34
- package/dist/chunk-2Q46FKZK.cjs.map +1 -0
- package/dist/chunk-3JNRQVTS.cjs +521 -0
- package/dist/chunk-3JNRQVTS.cjs.map +1 -0
- package/dist/chunk-5TWIN7ZJ.js +113 -0
- package/dist/chunk-5TWIN7ZJ.js.map +1 -0
- package/dist/{chunk-PQFAHT5O.js → chunk-DQPBQXKG.js} +27 -94
- package/dist/chunk-DQPBQXKG.js.map +1 -0
- package/dist/{chunk-ZFBBVGCI.js → chunk-EKYHKQPG.js} +243 -243
- package/dist/{chunk-ZFBBVGCI.js.map → chunk-EKYHKQPG.js.map} +1 -1
- package/dist/{chunk-J3R2OWOE.cjs → chunk-FEMIVHN3.cjs} +610 -15
- package/dist/chunk-FEMIVHN3.cjs.map +1 -0
- package/dist/{chunk-C3NWJE3K.js → chunk-GJBIVWB2.js} +11 -672
- package/dist/chunk-GJBIVWB2.js.map +1 -0
- package/dist/chunk-GTZXF4BI.cjs +3424 -0
- package/dist/chunk-GTZXF4BI.cjs.map +1 -0
- package/dist/chunk-JOX6MJW4.cjs +674 -0
- package/dist/chunk-JOX6MJW4.cjs.map +1 -0
- package/dist/{chunk-REAGGLXS.js → chunk-JQ3BB3E6.js} +2 -2
- package/dist/{chunk-H4PICYNL.cjs → chunk-LNKZPIQD.cjs} +113 -180
- package/dist/chunk-LNKZPIQD.cjs.map +1 -0
- package/dist/chunk-OV7UAKIY.js +674 -0
- package/dist/chunk-OV7UAKIY.js.map +1 -0
- package/dist/{chunk-TK2XZK6Z.js → chunk-QFTVLEVN.js} +596 -1
- package/dist/chunk-QFTVLEVN.js.map +1 -0
- package/dist/{chunk-KRGXUQ2Y.js → chunk-T6XU4B54.js} +82 -3
- package/dist/chunk-T6XU4B54.js.map +1 -0
- package/dist/chunk-TGBCBQFV.cjs +113 -0
- package/dist/chunk-TGBCBQFV.cjs.map +1 -0
- package/dist/{chunk-SQC26VQV.cjs → chunk-UN33YOXW.cjs} +191 -191
- package/dist/{chunk-SQC26VQV.cjs.map → chunk-UN33YOXW.cjs.map} +1 -1
- package/dist/chunk-WBOAXDKD.js +3424 -0
- package/dist/chunk-WBOAXDKD.js.map +1 -0
- package/dist/{chunk-LYGEEDNR.cjs → chunk-XP5IUZUO.cjs} +242 -242
- package/dist/chunk-XP5IUZUO.cjs.map +1 -0
- package/dist/{chunk-BBRK6MOI.cjs → chunk-YU4WQE5M.cjs} +100 -100
- package/dist/{chunk-BBRK6MOI.cjs.map → chunk-YU4WQE5M.cjs.map} +1 -1
- package/dist/commands/index.d.cts +1 -1
- package/dist/commands/index.d.ts +1 -1
- package/dist/controller-ChjCCMLl.d.cts +822 -0
- package/dist/controller-DtbEo3om.d.ts +822 -0
- package/dist/export/index.cjs +4 -2
- package/dist/export/index.cjs.map +1 -1
- package/dist/export/index.d.cts +5 -1
- package/dist/export/index.d.ts +5 -1
- package/dist/export/index.js +3 -1
- package/dist/extensions/index.cjs +33 -4
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +4 -2
- package/dist/extensions/index.d.ts +4 -2
- package/dist/extensions/index.js +32 -3
- package/dist/{index-QrqMmZ75.d.cts → index-DoHqT1mq.d.cts} +203 -7
- package/dist/{index-CSUCQYAH.d.ts → index-YLZ0fKqE.d.ts} +203 -7
- package/dist/index.cjs +39 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -7
- package/dist/index.d.ts +9 -7
- package/dist/index.js +33 -7
- package/dist/index.js.map +1 -1
- package/dist/spreadsheet/index.cjs +4 -4
- package/dist/spreadsheet/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-C3NWJE3K.js.map +0 -1
- package/dist/chunk-H4PICYNL.cjs.map +0 -1
- package/dist/chunk-J3R2OWOE.cjs.map +0 -1
- package/dist/chunk-KRGXUQ2Y.js.map +0 -1
- package/dist/chunk-LYGEEDNR.cjs.map +0 -1
- package/dist/chunk-NEOO6QJD.cjs +0 -1182
- package/dist/chunk-NEOO6QJD.cjs.map +0 -1
- package/dist/chunk-PQFAHT5O.js.map +0 -1
- package/dist/chunk-TK2XZK6Z.js.map +0 -1
- package/dist/chunk-TXXNBDQX.cjs.map +0 -1
- package/dist/types-BVqWm3d1.d.cts +0 -320
- package/dist/types-BVqWm3d1.d.ts +0 -320
- /package/dist/{chunk-5VXI5GED.js.map → chunk-2CJ3LPYQ.js.map} +0 -0
- /package/dist/{chunk-REAGGLXS.js.map → chunk-JQ3BB3E6.js.map} +0 -0
|
@@ -1,240 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;// src/spreadsheet/formula/
|
|
2
|
-
var FORMULA_ERRORS = /* @__PURE__ */ new Set([
|
|
3
|
-
"#DIV/0!",
|
|
4
|
-
"#VALUE!",
|
|
5
|
-
"#REF!",
|
|
6
|
-
"#NAME?",
|
|
7
|
-
"#N/A",
|
|
8
|
-
"#NUM!",
|
|
9
|
-
"#CYCLE!",
|
|
10
|
-
"#ERROR!",
|
|
11
|
-
"#SPILL!",
|
|
12
|
-
"#CALC!"
|
|
13
|
-
]);
|
|
14
|
-
function isFormulaError(value) {
|
|
15
|
-
return typeof value === "string" && FORMULA_ERRORS.has(value);
|
|
16
|
-
}
|
|
17
|
-
var isBlank = (value) => value === "" || value === null || value === void 0;
|
|
18
|
-
function toNumber(value) {
|
|
19
|
-
if (isFormulaError(value)) return value;
|
|
20
|
-
if (isBlank(value)) return 0;
|
|
21
|
-
if (typeof value === "boolean") return value ? 1 : 0;
|
|
22
|
-
if (typeof value === "number") return value;
|
|
23
|
-
return _nullishCoalesce(parseNumberText(String(value)), () => ( "#VALUE!"));
|
|
24
|
-
}
|
|
25
|
-
function toBoolean(value) {
|
|
26
|
-
if (isFormulaError(value)) return value;
|
|
27
|
-
if (isBlank(value)) return false;
|
|
28
|
-
if (typeof value === "boolean") return value;
|
|
29
|
-
if (typeof value === "number") return value !== 0;
|
|
30
|
-
const upper = String(value).trim().toUpperCase();
|
|
31
|
-
if (upper === "TRUE") return true;
|
|
32
|
-
if (upper === "FALSE") return false;
|
|
33
|
-
return "#VALUE!";
|
|
34
|
-
}
|
|
35
|
-
var toText = (value) => isBlank(value) ? "" : typeof value === "boolean" ? value ? "TRUE" : "FALSE" : typeof value === "number" ? numberToText(value) : String(value);
|
|
36
|
-
function numberToText(n) {
|
|
37
|
-
if (n === 0 || !Number.isFinite(n)) return "0";
|
|
38
|
-
const a = Math.abs(n);
|
|
39
|
-
if ((a < 1e-9 || a >= 1e15) && Math.round(a) !== a || a >= 1e15) return sciText(n, 15);
|
|
40
|
-
let mag = Math.floor(Math.log10(a));
|
|
41
|
-
if (a >= Math.pow(10, mag + 1)) mag++;
|
|
42
|
-
const decimals = Math.min(Math.max(14 - mag, 0), 30);
|
|
43
|
-
return trimDecimal(n.toFixed(decimals));
|
|
44
|
-
}
|
|
45
|
-
function trimDecimal(s) {
|
|
46
|
-
if (!s.includes(".")) return s;
|
|
47
|
-
const t = s.replace(/0+$/, "").replace(/\.$/, "");
|
|
48
|
-
return t === "-0" ? "0" : t;
|
|
49
|
-
}
|
|
50
|
-
function sciText(n, sig) {
|
|
51
|
-
const [mantissa, exp] = n.toExponential(Math.max(sig - 1, 0)).split("e");
|
|
52
|
-
const e = Number(exp);
|
|
53
|
-
return `${trimDecimal(mantissa)}E${e < 0 ? "-" : "+"}${String(Math.abs(e)).padStart(2, "0")}`;
|
|
54
|
-
}
|
|
55
|
-
function numericValue(value) {
|
|
56
|
-
if (typeof value === "number") return Number.isFinite(value) ? value : null;
|
|
57
|
-
if (typeof value !== "string" || FORMULA_ERRORS.has(value)) return null;
|
|
58
|
-
const trimmed = value.trim();
|
|
59
|
-
if (trimmed === "") return null;
|
|
60
|
-
const num = Number(trimmed);
|
|
61
|
-
return Number.isFinite(num) ? num : null;
|
|
62
|
-
}
|
|
63
|
-
function normalizeValue(value) {
|
|
64
|
-
const num = typeof value === "string" ? numericValue(value) : null;
|
|
65
|
-
return num === null ? value : num;
|
|
66
|
-
}
|
|
67
|
-
var ERROR_ORDER = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A", "#SPILL!", "#CALC!", "#CYCLE!", "#ERROR!"];
|
|
68
|
-
function valueRank(value) {
|
|
69
|
-
if (isBlank(value)) return 4;
|
|
70
|
-
if (typeof value === "number") return 0;
|
|
71
|
-
if (typeof value === "boolean") return 2;
|
|
72
|
-
if (typeof value === "string" && FORMULA_ERRORS.has(value)) return 3;
|
|
73
|
-
return 1;
|
|
74
|
-
}
|
|
75
|
-
function compareNumbers(a, b) {
|
|
76
|
-
if (a === b) return 0;
|
|
77
|
-
if (Math.abs(a - b) > Math.max(Math.abs(a), Math.abs(b)) * 1e-13) return a < b ? -1 : 1;
|
|
78
|
-
const round15 = (x2) => !Number.isFinite(x2) || x2 === 0 ? x2 : Number(x2.toExponential(14));
|
|
79
|
-
const x = round15(a);
|
|
80
|
-
const y = round15(b);
|
|
81
|
-
return x < y ? -1 : x > y ? 1 : 0;
|
|
82
|
-
}
|
|
83
|
-
function compareText(a, b) {
|
|
84
|
-
const x = a.toLowerCase();
|
|
85
|
-
const y = b.toLowerCase();
|
|
86
|
-
return x < y ? -1 : x > y ? 1 : 0;
|
|
87
|
-
}
|
|
88
|
-
function compareValues(left, right) {
|
|
89
|
-
const lRank = valueRank(left);
|
|
90
|
-
const rRank = valueRank(right);
|
|
91
|
-
if (lRank === 4 || rRank === 4) {
|
|
92
|
-
if (lRank === rRank) return 0;
|
|
93
|
-
const blankFirst = lRank === 4;
|
|
94
|
-
const other = blankFirst ? right : left;
|
|
95
|
-
const otherRank = blankFirst ? rRank : lRank;
|
|
96
|
-
let cmp;
|
|
97
|
-
if (otherRank === 0) cmp = compareNumbers(0, other);
|
|
98
|
-
else if (otherRank === 1) cmp = String(other) === "" ? 0 : -1;
|
|
99
|
-
else if (otherRank === 2) cmp = other ? -1 : 0;
|
|
100
|
-
else return lRank - rRank;
|
|
101
|
-
return blankFirst ? cmp : -cmp;
|
|
102
|
-
}
|
|
103
|
-
if (lRank === 1 && rRank === 1) {
|
|
104
|
-
const a = String(left);
|
|
105
|
-
const b = String(right);
|
|
106
|
-
const ta = isoDateTime(a);
|
|
107
|
-
const tb = ta === null ? null : isoDateTime(b);
|
|
108
|
-
if (ta !== null && tb !== null) return Math.sign(ta - tb);
|
|
109
|
-
return compareText(a, b);
|
|
110
|
-
}
|
|
111
|
-
if (lRank === 0 && rRank === 1 || lRank === 1 && rRank === 0) {
|
|
112
|
-
const date = parseIsoDate(lRank === 1 ? left : right);
|
|
113
|
-
if (date) {
|
|
114
|
-
const serial = dateToSerial(date);
|
|
115
|
-
return lRank === 0 ? compareNumbers(left, serial) : compareNumbers(serial, right);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
if (lRank !== rRank) return lRank - rRank;
|
|
119
|
-
if (lRank === 0) return compareNumbers(left, right);
|
|
120
|
-
if (lRank === 2) return Number(left) - Number(right);
|
|
121
|
-
return Math.sign(ERROR_ORDER.indexOf(left) - ERROR_ORDER.indexOf(right));
|
|
122
|
-
}
|
|
123
|
-
function sortCompareValues(left, right) {
|
|
124
|
-
const lBlank = isBlank(left);
|
|
125
|
-
const rBlank = isBlank(right);
|
|
126
|
-
if (lBlank || rBlank) return lBlank === rBlank ? 0 : lBlank ? 1 : -1;
|
|
127
|
-
if (isFormulaError(left) && isFormulaError(right)) return 0;
|
|
128
|
-
return compareValues(left, right);
|
|
129
|
-
}
|
|
130
|
-
function roundHalfAwayFromZero(value, decimals) {
|
|
131
|
-
const factor = Math.pow(10, decimals);
|
|
132
|
-
const scaled = Number((Math.abs(value) * factor).toPrecision(15));
|
|
133
|
-
return Math.sign(value) * Math.round(scaled) / factor;
|
|
134
|
-
}
|
|
135
|
-
var cleanFloat = (value) => Number(value.toPrecision(15));
|
|
136
|
-
function colNameToIndex(col) {
|
|
137
|
-
let index = 0;
|
|
138
|
-
const upper = col.toUpperCase();
|
|
139
|
-
for (let i = 0; i < upper.length; i++) {
|
|
140
|
-
index = index * 26 + (upper.charCodeAt(i) - 65 + 1);
|
|
141
|
-
}
|
|
142
|
-
return index - 1;
|
|
143
|
-
}
|
|
144
|
-
function indexToColName(index) {
|
|
145
|
-
let num = index + 1;
|
|
146
|
-
let name = "";
|
|
147
|
-
while (num > 0) {
|
|
148
|
-
const mod = (num - 1) % 26;
|
|
149
|
-
name = String.fromCharCode(65 + mod) + name;
|
|
150
|
-
num = Math.floor((num - mod) / 26);
|
|
151
|
-
}
|
|
152
|
-
return name;
|
|
153
|
-
}
|
|
154
|
-
var rangeShapes = /* @__PURE__ */ new WeakMap();
|
|
155
|
-
function withRangeShape(values, rows, cols) {
|
|
156
|
-
rangeShapes.set(values, { rows, cols });
|
|
157
|
-
return values;
|
|
158
|
-
}
|
|
159
|
-
function toFormulaRange(values) {
|
|
160
|
-
const shape = rangeShapes.get(values);
|
|
161
|
-
if (shape && shape.rows * shape.cols === values.length) return { ...shape, values };
|
|
162
|
-
return { rows: values.length, cols: 1, values };
|
|
163
|
-
}
|
|
164
|
-
var rangeGet = (range, row, col) => row < range.rows && col < range.cols ? range.values[col * range.rows + row] : "";
|
|
165
|
-
function sliceRange(range, rowStart, rowCount, colStart, colCount) {
|
|
166
|
-
const out = [];
|
|
167
|
-
for (let c = colStart; c < colStart + colCount; c++) {
|
|
168
|
-
for (let r = rowStart; r < rowStart + rowCount; r++) out.push(rangeGet(range, r, c));
|
|
169
|
-
}
|
|
170
|
-
return withRangeShape(out, rowCount, colCount);
|
|
171
|
-
}
|
|
172
|
-
var MS_PER_DAY = 24 * 60 * 60 * 1e3;
|
|
173
|
-
var pad = (n, width = 2) => String(n).padStart(width, "0");
|
|
174
|
-
function toDate(value) {
|
|
175
|
-
if (value instanceof Date) return isNaN(value.getTime()) ? null : value;
|
|
176
|
-
if (typeof value === "number") return serialToDate(value);
|
|
177
|
-
if (typeof value !== "string" || FORMULA_ERRORS.has(value)) return null;
|
|
178
|
-
const text = value.trim();
|
|
179
|
-
if (text === "") return null;
|
|
180
|
-
const iso = /^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$/.exec(text);
|
|
181
|
-
if (iso) {
|
|
182
|
-
const [, y, m, d, hh = "0", mm = "0", ss = "0"] = iso;
|
|
183
|
-
const date = new Date(Number(y), Number(m) - 1, Number(d), Number(hh), Number(mm), Number(ss));
|
|
184
|
-
return date.getMonth() === Number(m) - 1 ? date : null;
|
|
185
|
-
}
|
|
186
|
-
const serial = numericValue(text);
|
|
187
|
-
if (serial !== null) return serialToDate(serial);
|
|
188
|
-
if (/[a-z/]/i.test(text)) {
|
|
189
|
-
const parsed = Date.parse(text);
|
|
190
|
-
return isNaN(parsed) ? null : new Date(parsed);
|
|
191
|
-
}
|
|
192
|
-
return null;
|
|
193
|
-
}
|
|
194
|
-
var ISO_DATE = /^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$/;
|
|
195
|
-
function parseIsoDate(value) {
|
|
196
|
-
if (typeof value !== "string" || value.length < 8 || value.length > 19) return null;
|
|
197
|
-
const iso = ISO_DATE.exec(value.trim());
|
|
198
|
-
if (!iso) return null;
|
|
199
|
-
const [, y, m, d, hh = "0", mm = "0", ss = "0"] = iso;
|
|
200
|
-
const date = new Date(Number(y), Number(m) - 1, Number(d), Number(hh), Number(mm), Number(ss));
|
|
201
|
-
return date.getMonth() === Number(m) - 1 && date.getDate() === Number(d) ? date : null;
|
|
202
|
-
}
|
|
203
|
-
var isoDateHasTime = (value) => /[ T]\d/.test(value.trim());
|
|
204
|
-
function isoDateTime(value) {
|
|
205
|
-
if (value.length < 8 || value.charCodeAt(4) !== 45) return null;
|
|
206
|
-
return _nullishCoalesce(_optionalChain([parseIsoDate, 'call', _ => _(value), 'optionalAccess', _2 => _2.getTime, 'call', _3 => _3()]), () => ( null));
|
|
207
|
-
}
|
|
208
|
-
function dateToSerial(date) {
|
|
209
|
-
const utc = Date.UTC(
|
|
210
|
-
date.getFullYear(),
|
|
211
|
-
date.getMonth(),
|
|
212
|
-
date.getDate(),
|
|
213
|
-
date.getHours(),
|
|
214
|
-
date.getMinutes(),
|
|
215
|
-
date.getSeconds()
|
|
216
|
-
);
|
|
217
|
-
return cleanFloat((utc - Date.UTC(1899, 11, 30)) / MS_PER_DAY);
|
|
218
|
-
}
|
|
219
|
-
function serialToDate(serial) {
|
|
220
|
-
if (!Number.isFinite(serial)) return null;
|
|
221
|
-
const utc = new Date(Date.UTC(1899, 11, 30) + Math.round(serial * MS_PER_DAY));
|
|
222
|
-
return new Date(
|
|
223
|
-
utc.getUTCFullYear(),
|
|
224
|
-
utc.getUTCMonth(),
|
|
225
|
-
utc.getUTCDate(),
|
|
226
|
-
utc.getUTCHours(),
|
|
227
|
-
utc.getUTCMinutes(),
|
|
228
|
-
utc.getUTCSeconds()
|
|
229
|
-
);
|
|
230
|
-
}
|
|
231
|
-
var formatIsoDate = (date) => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
232
|
-
var formatIsoDateTime = (date) => `${formatIsoDate(date)} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
|
|
233
|
-
var daysBetween = (start, end) => Math.round(
|
|
234
|
-
(Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()) - Date.UTC(start.getFullYear(), start.getMonth(), start.getDate())) / MS_PER_DAY
|
|
235
|
-
);
|
|
236
|
-
|
|
237
|
-
// src/spreadsheet/formula/parse-input.ts
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;// src/spreadsheet/formula/parse-input.ts
|
|
238
2
|
var MONTH_NAMES = [
|
|
239
3
|
"January",
|
|
240
4
|
"February",
|
|
@@ -322,14 +86,14 @@ function formatKindOf(format) {
|
|
|
322
86
|
if (format.includes("%")) return "percentage";
|
|
323
87
|
return "number";
|
|
324
88
|
}
|
|
325
|
-
var
|
|
89
|
+
var pad = (n, width = 2) => String(n).padStart(width, "0");
|
|
326
90
|
function isoText({ year, month, day, time }) {
|
|
327
91
|
if (day > daysInMonth(year, month)) return null;
|
|
328
|
-
const date = `${
|
|
92
|
+
const date = `${pad(year, 4)}-${pad(month)}-${pad(day)}`;
|
|
329
93
|
if (time === void 0) return date;
|
|
330
94
|
let seconds = Math.round(time * 86400);
|
|
331
95
|
if (seconds >= 86400) seconds = 86399;
|
|
332
|
-
return `${date} ${
|
|
96
|
+
return `${date} ${pad(Math.floor(seconds / 3600))}:${pad(Math.floor(seconds / 60) % 60)}:${pad(seconds % 60)}`;
|
|
333
97
|
}
|
|
334
98
|
function parseNumeric(t) {
|
|
335
99
|
if (t === "") return null;
|
|
@@ -510,6 +274,242 @@ function parseDateTime(t) {
|
|
|
510
274
|
return null;
|
|
511
275
|
}
|
|
512
276
|
|
|
277
|
+
// src/spreadsheet/formula/values.ts
|
|
278
|
+
var FORMULA_ERRORS = /* @__PURE__ */ new Set([
|
|
279
|
+
"#DIV/0!",
|
|
280
|
+
"#VALUE!",
|
|
281
|
+
"#REF!",
|
|
282
|
+
"#NAME?",
|
|
283
|
+
"#N/A",
|
|
284
|
+
"#NUM!",
|
|
285
|
+
"#CYCLE!",
|
|
286
|
+
"#ERROR!",
|
|
287
|
+
"#SPILL!",
|
|
288
|
+
"#CALC!"
|
|
289
|
+
]);
|
|
290
|
+
function isFormulaError(value) {
|
|
291
|
+
return typeof value === "string" && FORMULA_ERRORS.has(value);
|
|
292
|
+
}
|
|
293
|
+
var isBlank = (value) => value === "" || value === null || value === void 0;
|
|
294
|
+
function toNumber(value) {
|
|
295
|
+
if (isFormulaError(value)) return value;
|
|
296
|
+
if (isBlank(value)) return 0;
|
|
297
|
+
if (typeof value === "boolean") return value ? 1 : 0;
|
|
298
|
+
if (typeof value === "number") return value;
|
|
299
|
+
return _nullishCoalesce(parseNumberText(String(value)), () => ( "#VALUE!"));
|
|
300
|
+
}
|
|
301
|
+
function toBoolean(value) {
|
|
302
|
+
if (isFormulaError(value)) return value;
|
|
303
|
+
if (isBlank(value)) return false;
|
|
304
|
+
if (typeof value === "boolean") return value;
|
|
305
|
+
if (typeof value === "number") return value !== 0;
|
|
306
|
+
const upper = String(value).trim().toUpperCase();
|
|
307
|
+
if (upper === "TRUE") return true;
|
|
308
|
+
if (upper === "FALSE") return false;
|
|
309
|
+
return "#VALUE!";
|
|
310
|
+
}
|
|
311
|
+
var toText = (value) => isBlank(value) ? "" : typeof value === "boolean" ? value ? "TRUE" : "FALSE" : typeof value === "number" ? numberToText(value) : String(value);
|
|
312
|
+
function numberToText(n) {
|
|
313
|
+
if (n === 0 || !Number.isFinite(n)) return "0";
|
|
314
|
+
const a = Math.abs(n);
|
|
315
|
+
if ((a < 1e-9 || a >= 1e15) && Math.round(a) !== a || a >= 1e15) return sciText(n, 15);
|
|
316
|
+
let mag = Math.floor(Math.log10(a));
|
|
317
|
+
if (a >= Math.pow(10, mag + 1)) mag++;
|
|
318
|
+
const decimals = Math.min(Math.max(14 - mag, 0), 30);
|
|
319
|
+
return trimDecimal(n.toFixed(decimals));
|
|
320
|
+
}
|
|
321
|
+
function trimDecimal(s) {
|
|
322
|
+
if (!s.includes(".")) return s;
|
|
323
|
+
const t = s.replace(/0+$/, "").replace(/\.$/, "");
|
|
324
|
+
return t === "-0" ? "0" : t;
|
|
325
|
+
}
|
|
326
|
+
function sciText(n, sig) {
|
|
327
|
+
const [mantissa, exp] = n.toExponential(Math.max(sig - 1, 0)).split("e");
|
|
328
|
+
const e = Number(exp);
|
|
329
|
+
return `${trimDecimal(mantissa)}E${e < 0 ? "-" : "+"}${String(Math.abs(e)).padStart(2, "0")}`;
|
|
330
|
+
}
|
|
331
|
+
function numericValue(value) {
|
|
332
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : null;
|
|
333
|
+
if (typeof value !== "string" || FORMULA_ERRORS.has(value)) return null;
|
|
334
|
+
const trimmed = value.trim();
|
|
335
|
+
if (trimmed === "") return null;
|
|
336
|
+
const num = Number(trimmed);
|
|
337
|
+
return Number.isFinite(num) ? num : null;
|
|
338
|
+
}
|
|
339
|
+
function normalizeValue(value) {
|
|
340
|
+
const num = typeof value === "string" ? numericValue(value) : null;
|
|
341
|
+
return num === null ? value : num;
|
|
342
|
+
}
|
|
343
|
+
var ERROR_ORDER = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A", "#SPILL!", "#CALC!", "#CYCLE!", "#ERROR!"];
|
|
344
|
+
function valueRank(value) {
|
|
345
|
+
if (isBlank(value)) return 4;
|
|
346
|
+
if (typeof value === "number") return 0;
|
|
347
|
+
if (typeof value === "boolean") return 2;
|
|
348
|
+
if (typeof value === "string" && FORMULA_ERRORS.has(value)) return 3;
|
|
349
|
+
return 1;
|
|
350
|
+
}
|
|
351
|
+
function compareNumbers(a, b) {
|
|
352
|
+
if (a === b) return 0;
|
|
353
|
+
if (Math.abs(a - b) > Math.max(Math.abs(a), Math.abs(b)) * 1e-13) return a < b ? -1 : 1;
|
|
354
|
+
const round15 = (x2) => !Number.isFinite(x2) || x2 === 0 ? x2 : Number(x2.toExponential(14));
|
|
355
|
+
const x = round15(a);
|
|
356
|
+
const y = round15(b);
|
|
357
|
+
return x < y ? -1 : x > y ? 1 : 0;
|
|
358
|
+
}
|
|
359
|
+
function compareText(a, b) {
|
|
360
|
+
const x = a.toLowerCase();
|
|
361
|
+
const y = b.toLowerCase();
|
|
362
|
+
return x < y ? -1 : x > y ? 1 : 0;
|
|
363
|
+
}
|
|
364
|
+
function compareValues(left, right) {
|
|
365
|
+
const lRank = valueRank(left);
|
|
366
|
+
const rRank = valueRank(right);
|
|
367
|
+
if (lRank === 4 || rRank === 4) {
|
|
368
|
+
if (lRank === rRank) return 0;
|
|
369
|
+
const blankFirst = lRank === 4;
|
|
370
|
+
const other = blankFirst ? right : left;
|
|
371
|
+
const otherRank = blankFirst ? rRank : lRank;
|
|
372
|
+
let cmp;
|
|
373
|
+
if (otherRank === 0) cmp = compareNumbers(0, other);
|
|
374
|
+
else if (otherRank === 1) cmp = String(other) === "" ? 0 : -1;
|
|
375
|
+
else if (otherRank === 2) cmp = other ? -1 : 0;
|
|
376
|
+
else return lRank - rRank;
|
|
377
|
+
return blankFirst ? cmp : -cmp;
|
|
378
|
+
}
|
|
379
|
+
if (lRank === 1 && rRank === 1) {
|
|
380
|
+
const a = String(left);
|
|
381
|
+
const b = String(right);
|
|
382
|
+
const ta = isoDateTime(a);
|
|
383
|
+
const tb = ta === null ? null : isoDateTime(b);
|
|
384
|
+
if (ta !== null && tb !== null) return Math.sign(ta - tb);
|
|
385
|
+
return compareText(a, b);
|
|
386
|
+
}
|
|
387
|
+
if (lRank === 0 && rRank === 1 || lRank === 1 && rRank === 0) {
|
|
388
|
+
const date = parseIsoDate(lRank === 1 ? left : right);
|
|
389
|
+
if (date) {
|
|
390
|
+
const serial = dateToSerial(date);
|
|
391
|
+
return lRank === 0 ? compareNumbers(left, serial) : compareNumbers(serial, right);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (lRank !== rRank) return lRank - rRank;
|
|
395
|
+
if (lRank === 0) return compareNumbers(left, right);
|
|
396
|
+
if (lRank === 2) return Number(left) - Number(right);
|
|
397
|
+
return Math.sign(ERROR_ORDER.indexOf(left) - ERROR_ORDER.indexOf(right));
|
|
398
|
+
}
|
|
399
|
+
function sortCompareValues(left, right) {
|
|
400
|
+
const lBlank = isBlank(left);
|
|
401
|
+
const rBlank = isBlank(right);
|
|
402
|
+
if (lBlank || rBlank) return lBlank === rBlank ? 0 : lBlank ? 1 : -1;
|
|
403
|
+
if (isFormulaError(left) && isFormulaError(right)) return 0;
|
|
404
|
+
return compareValues(left, right);
|
|
405
|
+
}
|
|
406
|
+
function roundHalfAwayFromZero(value, decimals) {
|
|
407
|
+
const factor = Math.pow(10, decimals);
|
|
408
|
+
const scaled = Number((Math.abs(value) * factor).toPrecision(15));
|
|
409
|
+
return Math.sign(value) * Math.round(scaled) / factor;
|
|
410
|
+
}
|
|
411
|
+
var cleanFloat = (value) => Number(value.toPrecision(15));
|
|
412
|
+
function colNameToIndex(col) {
|
|
413
|
+
let index = 0;
|
|
414
|
+
const upper = col.toUpperCase();
|
|
415
|
+
for (let i = 0; i < upper.length; i++) {
|
|
416
|
+
index = index * 26 + (upper.charCodeAt(i) - 65 + 1);
|
|
417
|
+
}
|
|
418
|
+
return index - 1;
|
|
419
|
+
}
|
|
420
|
+
function indexToColName(index) {
|
|
421
|
+
let num = index + 1;
|
|
422
|
+
let name = "";
|
|
423
|
+
while (num > 0) {
|
|
424
|
+
const mod = (num - 1) % 26;
|
|
425
|
+
name = String.fromCharCode(65 + mod) + name;
|
|
426
|
+
num = Math.floor((num - mod) / 26);
|
|
427
|
+
}
|
|
428
|
+
return name;
|
|
429
|
+
}
|
|
430
|
+
var rangeShapes = /* @__PURE__ */ new WeakMap();
|
|
431
|
+
function withRangeShape(values, rows, cols) {
|
|
432
|
+
rangeShapes.set(values, { rows, cols });
|
|
433
|
+
return values;
|
|
434
|
+
}
|
|
435
|
+
function toFormulaRange(values) {
|
|
436
|
+
const shape = rangeShapes.get(values);
|
|
437
|
+
if (shape && shape.rows * shape.cols === values.length) return { ...shape, values };
|
|
438
|
+
return { rows: values.length, cols: 1, values };
|
|
439
|
+
}
|
|
440
|
+
var rangeGet = (range, row, col) => row < range.rows && col < range.cols ? range.values[col * range.rows + row] : "";
|
|
441
|
+
function sliceRange(range, rowStart, rowCount, colStart, colCount) {
|
|
442
|
+
const out = [];
|
|
443
|
+
for (let c = colStart; c < colStart + colCount; c++) {
|
|
444
|
+
for (let r = rowStart; r < rowStart + rowCount; r++) out.push(rangeGet(range, r, c));
|
|
445
|
+
}
|
|
446
|
+
return withRangeShape(out, rowCount, colCount);
|
|
447
|
+
}
|
|
448
|
+
var MS_PER_DAY = 24 * 60 * 60 * 1e3;
|
|
449
|
+
var pad2 = (n, width = 2) => String(n).padStart(width, "0");
|
|
450
|
+
function toDate(value) {
|
|
451
|
+
if (value instanceof Date) return isNaN(value.getTime()) ? null : value;
|
|
452
|
+
if (typeof value === "number") return serialToDate(value);
|
|
453
|
+
if (typeof value !== "string" || FORMULA_ERRORS.has(value)) return null;
|
|
454
|
+
const text = value.trim();
|
|
455
|
+
if (text === "") return null;
|
|
456
|
+
const iso = /^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$/.exec(text);
|
|
457
|
+
if (iso) {
|
|
458
|
+
const [, y, m, d, hh = "0", mm = "0", ss = "0"] = iso;
|
|
459
|
+
const date = new Date(Number(y), Number(m) - 1, Number(d), Number(hh), Number(mm), Number(ss));
|
|
460
|
+
return date.getMonth() === Number(m) - 1 ? date : null;
|
|
461
|
+
}
|
|
462
|
+
const serial = numericValue(text);
|
|
463
|
+
if (serial !== null) return serialToDate(serial);
|
|
464
|
+
if (/[a-z/]/i.test(text)) {
|
|
465
|
+
const parsed = Date.parse(text);
|
|
466
|
+
return isNaN(parsed) ? null : new Date(parsed);
|
|
467
|
+
}
|
|
468
|
+
return null;
|
|
469
|
+
}
|
|
470
|
+
var ISO_DATE = /^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{2})(?::(\d{2}))?)?$/;
|
|
471
|
+
function parseIsoDate(value) {
|
|
472
|
+
if (typeof value !== "string" || value.length < 8 || value.length > 19) return null;
|
|
473
|
+
const iso = ISO_DATE.exec(value.trim());
|
|
474
|
+
if (!iso) return null;
|
|
475
|
+
const [, y, m, d, hh = "0", mm = "0", ss = "0"] = iso;
|
|
476
|
+
const date = new Date(Number(y), Number(m) - 1, Number(d), Number(hh), Number(mm), Number(ss));
|
|
477
|
+
return date.getMonth() === Number(m) - 1 && date.getDate() === Number(d) ? date : null;
|
|
478
|
+
}
|
|
479
|
+
var isoDateHasTime = (value) => /[ T]\d/.test(value.trim());
|
|
480
|
+
function isoDateTime(value) {
|
|
481
|
+
if (value.length < 8 || value.charCodeAt(4) !== 45) return null;
|
|
482
|
+
return _nullishCoalesce(_optionalChain([parseIsoDate, 'call', _ => _(value), 'optionalAccess', _2 => _2.getTime, 'call', _3 => _3()]), () => ( null));
|
|
483
|
+
}
|
|
484
|
+
function dateToSerial(date) {
|
|
485
|
+
const utc = Date.UTC(
|
|
486
|
+
date.getFullYear(),
|
|
487
|
+
date.getMonth(),
|
|
488
|
+
date.getDate(),
|
|
489
|
+
date.getHours(),
|
|
490
|
+
date.getMinutes(),
|
|
491
|
+
date.getSeconds()
|
|
492
|
+
);
|
|
493
|
+
return cleanFloat((utc - Date.UTC(1899, 11, 30)) / MS_PER_DAY);
|
|
494
|
+
}
|
|
495
|
+
function serialToDate(serial) {
|
|
496
|
+
if (!Number.isFinite(serial)) return null;
|
|
497
|
+
const utc = new Date(Date.UTC(1899, 11, 30) + Math.round(serial * MS_PER_DAY));
|
|
498
|
+
return new Date(
|
|
499
|
+
utc.getUTCFullYear(),
|
|
500
|
+
utc.getUTCMonth(),
|
|
501
|
+
utc.getUTCDate(),
|
|
502
|
+
utc.getUTCHours(),
|
|
503
|
+
utc.getUTCMinutes(),
|
|
504
|
+
utc.getUTCSeconds()
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
var formatIsoDate = (date) => `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;
|
|
508
|
+
var formatIsoDateTime = (date) => `${formatIsoDate(date)} ${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(date.getSeconds())}`;
|
|
509
|
+
var daysBetween = (start, end) => Math.round(
|
|
510
|
+
(Date.UTC(end.getFullYear(), end.getMonth(), end.getDate()) - Date.UTC(start.getFullYear(), start.getMonth(), start.getDate())) / MS_PER_DAY
|
|
511
|
+
);
|
|
512
|
+
|
|
513
513
|
// src/spreadsheet/numfmt/decimal.ts
|
|
514
514
|
var MAX_DECIMALS = 400;
|
|
515
515
|
function significantDigits(a, n) {
|
|
@@ -1891,5 +1891,5 @@ function numberFormatColorToCss(color) {
|
|
|
1891
1891
|
|
|
1892
1892
|
|
|
1893
1893
|
|
|
1894
|
-
exports.
|
|
1895
|
-
//# sourceMappingURL=chunk-
|
|
1894
|
+
exports.FORMULA_ERRORS = FORMULA_ERRORS; exports.isFormulaError = isFormulaError; exports.isBlank = isBlank; exports.toNumber = toNumber; exports.toBoolean = toBoolean; exports.toText = toText; exports.numberToText = numberToText; exports.numericValue = numericValue; exports.normalizeValue = normalizeValue; exports.compareNumbers = compareNumbers; exports.compareValues = compareValues; exports.sortCompareValues = sortCompareValues; exports.roundHalfAwayFromZero = roundHalfAwayFromZero; exports.cleanFloat = cleanFloat; exports.colNameToIndex = colNameToIndex; exports.indexToColName = indexToColName; exports.withRangeShape = withRangeShape; exports.toFormulaRange = toFormulaRange; exports.rangeGet = rangeGet; exports.sliceRange = sliceRange; exports.toDate = toDate; exports.parseIsoDate = parseIsoDate; exports.isoDateHasTime = isoDateHasTime; exports.dateToSerial = dateToSerial; exports.serialToDate = serialToDate; exports.formatIsoDate = formatIsoDate; exports.formatIsoDateTime = formatIsoDateTime; exports.daysBetween = daysBetween; exports.serialFromYmd = serialFromYmd; exports.parseCellInput = parseCellInput; exports.parseNumberText = parseNumberText; exports.formatGeneralFit = formatGeneralFit; exports.builtinNumberFormat = builtinNumberFormat; exports.builtinNumberFormatId = builtinNumberFormatId; exports.MAX_NUMBER_FORMAT_CODE_CHARS = MAX_NUMBER_FORMAT_CODE_CHARS; exports.NumberFormat = NumberFormat; exports.clearNumberFormatCache = clearNumberFormatCache; exports.dateValueToSerial = dateValueToSerial; exports.formatNumberFormatValue = formatNumberFormatValue; exports.formatTextFunction = formatTextFunction; exports.numberFormatColorToCss = numberFormatColorToCss;
|
|
1895
|
+
//# sourceMappingURL=chunk-XP5IUZUO.cjs.map
|