@pixerate/editor 0.47.0 → 0.48.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 +246 -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 +226 -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 +214 -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 +135 -3462
- package/dist/chart/index.js.map +1 -1
- package/dist/{chunk-5VXI5GED.js → chunk-2CJ3LPYQ.js} +3 -3
- 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-HXUL3LS7.js +113 -0
- package/dist/chunk-HXUL3LS7.js.map +1 -0
- package/dist/{chunk-REAGGLXS.js → chunk-JQ3BB3E6.js} +2 -2
- package/dist/chunk-LTUM52X6.js +4074 -0
- package/dist/chunk-LTUM52X6.js.map +1 -0
- package/dist/{chunk-J3R2OWOE.cjs → chunk-MUCYWI6W.cjs} +608 -15
- package/dist/chunk-MUCYWI6W.cjs.map +1 -0
- package/dist/chunk-PIMCHMZE.cjs +521 -0
- package/dist/chunk-PIMCHMZE.cjs.map +1 -0
- package/dist/{chunk-TK2XZK6Z.js → chunk-PKBWLEL7.js} +594 -1
- package/dist/chunk-PKBWLEL7.js.map +1 -0
- package/dist/chunk-PRSJJZBS.cjs +4074 -0
- package/dist/chunk-PRSJJZBS.cjs.map +1 -0
- package/dist/chunk-U6IZKC7B.cjs +113 -0
- package/dist/chunk-U6IZKC7B.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-PQFAHT5O.js → chunk-VKPEPWKZ.js} +27 -94
- package/dist/chunk-VKPEPWKZ.js.map +1 -0
- package/dist/{chunk-H4PICYNL.cjs → chunk-WXEHCVJQ.cjs} +113 -180
- package/dist/chunk-WXEHCVJQ.cjs.map +1 -0
- package/dist/{chunk-LYGEEDNR.cjs → chunk-XP5IUZUO.cjs} +242 -242
- package/dist/chunk-XP5IUZUO.cjs.map +1 -0
- package/dist/{chunk-C3NWJE3K.js → chunk-XUUD43OV.js} +11 -672
- package/dist/chunk-XUUD43OV.js.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/extensions/index.cjs +32 -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 +31 -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 +37 -12
- 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 +31 -6
- 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-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/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
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
parseFormula,
|
|
10
10
|
searchFormulaFunctions,
|
|
11
11
|
tokenizeFormula
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-JQ3BB3E6.js";
|
|
13
13
|
import {
|
|
14
14
|
NumberFormat,
|
|
15
15
|
colNameToIndex,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
sortCompareValues,
|
|
28
28
|
toBoolean,
|
|
29
29
|
toText
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-EKYHKQPG.js";
|
|
31
31
|
import {
|
|
32
32
|
parseCsv,
|
|
33
33
|
parseTsv,
|
|
@@ -6803,4 +6803,4 @@ export {
|
|
|
6803
6803
|
getSpreadsheetScrollToCell,
|
|
6804
6804
|
sameSpreadsheetViewWindow
|
|
6805
6805
|
};
|
|
6806
|
-
//# sourceMappingURL=chunk-
|
|
6806
|
+
//# sourceMappingURL=chunk-2CJ3LPYQ.js.map
|
|
@@ -1,239 +1,3 @@
|
|
|
1
|
-
// src/spreadsheet/formula/values.ts
|
|
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 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 parseIsoDate(value)?.getTime() ?? 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
1
|
// src/spreadsheet/formula/parse-input.ts
|
|
238
2
|
var MONTH_NAMES = [
|
|
239
3
|
"January",
|
|
@@ -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 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 parseIsoDate(value)?.getTime() ?? 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) {
|
|
@@ -1850,9 +1850,6 @@ function numberFormatColorToCss(color) {
|
|
|
1850
1850
|
}
|
|
1851
1851
|
|
|
1852
1852
|
export {
|
|
1853
|
-
serialFromYmd,
|
|
1854
|
-
parseCellInput,
|
|
1855
|
-
parseNumberText,
|
|
1856
1853
|
FORMULA_ERRORS,
|
|
1857
1854
|
isFormulaError,
|
|
1858
1855
|
isBlank,
|
|
@@ -1881,6 +1878,9 @@ export {
|
|
|
1881
1878
|
formatIsoDate,
|
|
1882
1879
|
formatIsoDateTime,
|
|
1883
1880
|
daysBetween,
|
|
1881
|
+
serialFromYmd,
|
|
1882
|
+
parseCellInput,
|
|
1883
|
+
parseNumberText,
|
|
1884
1884
|
formatGeneralFit,
|
|
1885
1885
|
builtinNumberFormat,
|
|
1886
1886
|
builtinNumberFormatId,
|
|
@@ -1892,4 +1892,4 @@ export {
|
|
|
1892
1892
|
formatTextFunction,
|
|
1893
1893
|
numberFormatColorToCss
|
|
1894
1894
|
};
|
|
1895
|
-
//# sourceMappingURL=chunk-
|
|
1895
|
+
//# sourceMappingURL=chunk-EKYHKQPG.js.map
|