@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.
Files changed (76) hide show
  1. package/dist/agent/index.cjs +246 -29
  2. package/dist/agent/index.cjs.map +1 -1
  3. package/dist/agent/index.d.cts +18 -6
  4. package/dist/agent/index.d.ts +18 -6
  5. package/dist/agent/index.js +226 -9
  6. package/dist/agent/index.js.map +1 -1
  7. package/dist/{builtins-xs7rK6ys.d.cts → builtins-1kqwLUnb.d.cts} +1 -1
  8. package/dist/{builtins-D2nMtw2W.d.ts → builtins-BKYlHH1s.d.ts} +1 -1
  9. package/dist/chart/index.cjs +214 -3541
  10. package/dist/chart/index.cjs.map +1 -1
  11. package/dist/chart/index.d.cts +4 -494
  12. package/dist/chart/index.d.ts +4 -494
  13. package/dist/chart/index.js +135 -3462
  14. package/dist/chart/index.js.map +1 -1
  15. package/dist/{chunk-5VXI5GED.js → chunk-2CJ3LPYQ.js} +3 -3
  16. package/dist/{chunk-ZFBBVGCI.js → chunk-EKYHKQPG.js} +243 -243
  17. package/dist/{chunk-ZFBBVGCI.js.map → chunk-EKYHKQPG.js.map} +1 -1
  18. package/dist/chunk-HXUL3LS7.js +113 -0
  19. package/dist/chunk-HXUL3LS7.js.map +1 -0
  20. package/dist/{chunk-REAGGLXS.js → chunk-JQ3BB3E6.js} +2 -2
  21. package/dist/chunk-LTUM52X6.js +4074 -0
  22. package/dist/chunk-LTUM52X6.js.map +1 -0
  23. package/dist/{chunk-J3R2OWOE.cjs → chunk-MUCYWI6W.cjs} +608 -15
  24. package/dist/chunk-MUCYWI6W.cjs.map +1 -0
  25. package/dist/chunk-PIMCHMZE.cjs +521 -0
  26. package/dist/chunk-PIMCHMZE.cjs.map +1 -0
  27. package/dist/{chunk-TK2XZK6Z.js → chunk-PKBWLEL7.js} +594 -1
  28. package/dist/chunk-PKBWLEL7.js.map +1 -0
  29. package/dist/chunk-PRSJJZBS.cjs +4074 -0
  30. package/dist/chunk-PRSJJZBS.cjs.map +1 -0
  31. package/dist/chunk-U6IZKC7B.cjs +113 -0
  32. package/dist/chunk-U6IZKC7B.cjs.map +1 -0
  33. package/dist/{chunk-SQC26VQV.cjs → chunk-UN33YOXW.cjs} +191 -191
  34. package/dist/{chunk-SQC26VQV.cjs.map → chunk-UN33YOXW.cjs.map} +1 -1
  35. package/dist/{chunk-PQFAHT5O.js → chunk-VKPEPWKZ.js} +27 -94
  36. package/dist/chunk-VKPEPWKZ.js.map +1 -0
  37. package/dist/{chunk-H4PICYNL.cjs → chunk-WXEHCVJQ.cjs} +113 -180
  38. package/dist/chunk-WXEHCVJQ.cjs.map +1 -0
  39. package/dist/{chunk-LYGEEDNR.cjs → chunk-XP5IUZUO.cjs} +242 -242
  40. package/dist/chunk-XP5IUZUO.cjs.map +1 -0
  41. package/dist/{chunk-C3NWJE3K.js → chunk-XUUD43OV.js} +11 -672
  42. package/dist/chunk-XUUD43OV.js.map +1 -0
  43. package/dist/{chunk-BBRK6MOI.cjs → chunk-YU4WQE5M.cjs} +100 -100
  44. package/dist/{chunk-BBRK6MOI.cjs.map → chunk-YU4WQE5M.cjs.map} +1 -1
  45. package/dist/commands/index.d.cts +1 -1
  46. package/dist/commands/index.d.ts +1 -1
  47. package/dist/controller-ChjCCMLl.d.cts +822 -0
  48. package/dist/controller-DtbEo3om.d.ts +822 -0
  49. package/dist/extensions/index.cjs +32 -4
  50. package/dist/extensions/index.cjs.map +1 -1
  51. package/dist/extensions/index.d.cts +4 -2
  52. package/dist/extensions/index.d.ts +4 -2
  53. package/dist/extensions/index.js +31 -3
  54. package/dist/{index-QrqMmZ75.d.cts → index-DoHqT1mq.d.cts} +203 -7
  55. package/dist/{index-CSUCQYAH.d.ts → index-YLZ0fKqE.d.ts} +203 -7
  56. package/dist/index.cjs +37 -12
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.cts +9 -7
  59. package/dist/index.d.ts +9 -7
  60. package/dist/index.js +31 -6
  61. package/dist/index.js.map +1 -1
  62. package/dist/spreadsheet/index.cjs +4 -4
  63. package/dist/spreadsheet/index.js +3 -3
  64. package/package.json +1 -1
  65. package/dist/chunk-C3NWJE3K.js.map +0 -1
  66. package/dist/chunk-H4PICYNL.cjs.map +0 -1
  67. package/dist/chunk-J3R2OWOE.cjs.map +0 -1
  68. package/dist/chunk-LYGEEDNR.cjs.map +0 -1
  69. package/dist/chunk-NEOO6QJD.cjs +0 -1182
  70. package/dist/chunk-NEOO6QJD.cjs.map +0 -1
  71. package/dist/chunk-PQFAHT5O.js.map +0 -1
  72. package/dist/chunk-TK2XZK6Z.js.map +0 -1
  73. package/dist/types-BVqWm3d1.d.cts +0 -320
  74. package/dist/types-BVqWm3d1.d.ts +0 -320
  75. /package/dist/{chunk-5VXI5GED.js.map → chunk-2CJ3LPYQ.js.map} +0 -0
  76. /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-REAGGLXS.js";
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-ZFBBVGCI.js";
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-5VXI5GED.js.map
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 pad2 = (n, width = 2) => String(n).padStart(width, "0");
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 = `${pad2(year, 4)}-${pad2(month)}-${pad2(day)}`;
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} ${pad2(Math.floor(seconds / 3600))}:${pad2(Math.floor(seconds / 60) % 60)}:${pad2(seconds % 60)}`;
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-ZFBBVGCI.js.map
1895
+ //# sourceMappingURL=chunk-EKYHKQPG.js.map