ooxml-core 1.2.0 → 1.2.1

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 (82) hide show
  1. package/dist/{PptxHandler-SJTINPU4.mjs → PptxHandler-VQQS4VS6.mjs} +2 -2
  2. package/dist/automation/index.cjs +1059 -328
  3. package/dist/automation/index.mjs +1059 -328
  4. package/dist/chart/bar-cluster-geometry.d.ts +6 -0
  5. package/dist/chart/bar-cluster-geometry.d.ts.map +1 -1
  6. package/dist/chart/index.cjs +5 -2
  7. package/dist/chart/index.mjs +5 -3
  8. package/dist/chart/render/chart-spacing.d.ts.map +1 -1
  9. package/dist/{chunk-TEOAOAIF.mjs → chunk-5U27IVB7.mjs} +3 -3
  10. package/dist/{chunk-VYTA2OUN.mjs → chunk-5VLNF4OX.mjs} +1 -1
  11. package/dist/{chunk-CQQAPUAG.mjs → chunk-V2BIGIH4.mjs} +11 -9
  12. package/dist/{chunk-FI4RSJ24.mjs → chunk-XBNSBDNT.mjs} +1 -1
  13. package/dist/{chunk-XCZ7U3GZ.mjs → chunk-XSFHGZFH.mjs} +11 -9
  14. package/dist/docx/index.cjs +4 -2
  15. package/dist/docx/index.mjs +4 -2
  16. package/dist/docx/layout/index.cjs +4 -2
  17. package/dist/docx/layout/index.mjs +4 -2
  18. package/dist/docx/ui/index.cjs +4 -2
  19. package/dist/docx/ui/index.mjs +4 -2
  20. package/dist/index.cjs +5 -2
  21. package/dist/index.mjs +5 -2
  22. package/dist/pptx/automation/index.cjs +27 -17
  23. package/dist/pptx/automation/index.mjs +5 -5
  24. package/dist/pptx/chunks/index-EZJZ7USt.d.ts.map +1 -1
  25. package/dist/pptx/cli/index.cjs +27 -17
  26. package/dist/pptx/cli/index.mjs +4 -4
  27. package/dist/pptx/converter/index.mjs +2 -2
  28. package/dist/pptx/index.cjs +27 -17
  29. package/dist/pptx/index.mjs +5 -5
  30. package/dist/teams/index.cjs +157 -82
  31. package/dist/teams/index.mjs +157 -82
  32. package/dist/xlsx/edit/context.d.ts +3 -1
  33. package/dist/xlsx/edit/context.d.ts.map +1 -1
  34. package/dist/xlsx/edit/history.d.ts +18 -0
  35. package/dist/xlsx/edit/history.d.ts.map +1 -1
  36. package/dist/xlsx/edit/session-calc.d.ts +30 -8
  37. package/dist/xlsx/edit/session-calc.d.ts.map +1 -1
  38. package/dist/xlsx/edit/session.d.ts.map +1 -1
  39. package/dist/xlsx/edit/sheets.d.ts.map +1 -1
  40. package/dist/xlsx/edit/types.d.ts +23 -3
  41. package/dist/xlsx/edit/types.d.ts.map +1 -1
  42. package/dist/xlsx/formula/engine-core.d.ts.map +1 -1
  43. package/dist/xlsx/formula/engine-host.d.ts +6 -2
  44. package/dist/xlsx/formula/engine-host.d.ts.map +1 -1
  45. package/dist/xlsx/formula/engine-prepare.d.ts +33 -0
  46. package/dist/xlsx/formula/engine-prepare.d.ts.map +1 -0
  47. package/dist/xlsx/formula/engine-structure.d.ts +40 -0
  48. package/dist/xlsx/formula/engine-structure.d.ts.map +1 -0
  49. package/dist/xlsx/formula/engine-types.d.ts +26 -0
  50. package/dist/xlsx/formula/engine-types.d.ts.map +1 -1
  51. package/dist/xlsx/formula/engine.d.ts.map +1 -1
  52. package/dist/xlsx/formula/formula-shape.d.ts +28 -0
  53. package/dist/xlsx/formula/formula-shape.d.ts.map +1 -0
  54. package/dist/xlsx/formula/graph-index.d.ts +3 -1
  55. package/dist/xlsx/formula/graph-index.d.ts.map +1 -1
  56. package/dist/xlsx/formula/graph.d.ts +5 -0
  57. package/dist/xlsx/formula/graph.d.ts.map +1 -1
  58. package/dist/xlsx/formula/lexemes.d.ts.map +1 -1
  59. package/dist/xlsx/formula/parse-cache.d.ts +9 -0
  60. package/dist/xlsx/formula/parse-cache.d.ts.map +1 -0
  61. package/dist/xlsx/formula/parser.d.ts +3 -0
  62. package/dist/xlsx/formula/parser.d.ts.map +1 -1
  63. package/dist/xlsx/formula/ref-text.d.ts +14 -0
  64. package/dist/xlsx/formula/ref-text.d.ts.map +1 -0
  65. package/dist/xlsx/formula/references.d.ts.map +1 -1
  66. package/dist/xlsx/formula/shift-formula.d.ts +19 -0
  67. package/dist/xlsx/formula/shift-formula.d.ts.map +1 -0
  68. package/dist/xlsx/formula/shift-graph.d.ts +42 -0
  69. package/dist/xlsx/formula/shift-graph.d.ts.map +1 -0
  70. package/dist/xlsx/formula/transform.d.ts +2 -23
  71. package/dist/xlsx/formula/transform.d.ts.map +1 -1
  72. package/dist/xlsx/index.cjs +1069 -329
  73. package/dist/xlsx/index.mjs +1069 -330
  74. package/dist/xlsx/layout/index.d.ts +1 -1
  75. package/dist/xlsx/layout/index.d.ts.map +1 -1
  76. package/dist/xlsx/layout/sheet-queries.d.ts +7 -0
  77. package/dist/xlsx/layout/sheet-queries.d.ts.map +1 -1
  78. package/dist/xlsx/load/index.cjs +152 -90
  79. package/dist/xlsx/load/index.mjs +152 -90
  80. package/dist/xlsx/ui/index.cjs +1071 -340
  81. package/dist/xlsx/ui/index.mjs +1071 -340
  82. package/package.json +1 -1
@@ -5165,7 +5165,7 @@ var init_lexemes = __esm({
5165
5165
  CELL_RE = /^(\$?)([A-Za-z]{1,3})(\$?)(\d{1,7})/;
5166
5166
  COLS_RE = /^(\$?)([A-Za-z]{1,3}):(\$?)([A-Za-z]{1,3})/;
5167
5167
  ROWS_RE = /^(\$?)(\d{1,7}):(\$?)(\d{1,7})/;
5168
- NUMBER_RE = /^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/;
5168
+ NUMBER_RE = /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?/;
5169
5169
  sticky = (re) => new RegExp(re.source.replace(/^\^/, ""), "y");
5170
5170
  CELL_AT = sticky(CELL_RE);
5171
5171
  COLS_AT = sticky(COLS_RE);
@@ -5362,7 +5362,7 @@ var init_tokenizer = __esm({
5362
5362
  }
5363
5363
  });
5364
5364
 
5365
- // xlsx/formula/transform.ts
5365
+ // xlsx/formula/ref-text.ts
5366
5366
  function safeTokens(formula) {
5367
5367
  try {
5368
5368
  return tokenize(formula);
@@ -5376,24 +5376,37 @@ function formatRefSpec(spec2) {
5376
5376
  if (spec2.kind === "cell") return a2;
5377
5377
  return `${a2}:${cornerText(spec2.end, spec2.kind)}`;
5378
5378
  }
5379
- function rewrite(token, ref) {
5379
+ function rewriteRef(token, ref) {
5380
5380
  const prefix = token.prefix?.text ?? "";
5381
5381
  if (!ref) return `${prefix}#REF!`;
5382
5382
  return `${prefix}${formatRefSpec(ref)}${token.spill ? "#" : ""}`;
5383
5383
  }
5384
- function shiftInterval(a2, b, at, count2, max) {
5385
- if (count2 > 0) {
5386
- const na2 = a2 >= at ? a2 + count2 : a2;
5387
- const nb2 = b >= at ? b + count2 : b;
5388
- if (nb2 > max) return na2 > max ? void 0 : [na2, max];
5389
- return [na2, nb2];
5384
+ function prefixText(prefix) {
5385
+ const sheets = prefix.sheet2 !== void 0 ? `${prefix.sheet}:${prefix.sheet2}` : prefix.sheet;
5386
+ const book = prefix.book !== void 0 ? `[${prefix.book}]` : "";
5387
+ const quote2 = needsQuote(prefix.sheet) || prefix.sheet2 !== void 0 && needsQuote(prefix.sheet2);
5388
+ return quote2 ? `'${(book + sheets).replace(/'/g, "''")}'!` : `${book}${sheets}!`;
5389
+ }
5390
+ var cornerText, sameSpec, needsQuote;
5391
+ var init_ref_text = __esm({
5392
+ "xlsx/formula/ref-text.ts"() {
5393
+ init_address();
5394
+ init_ast();
5395
+ init_tokenizer();
5396
+ cornerText = (c2, kind) => {
5397
+ if (kind === "cols") return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}`;
5398
+ if (kind === "rows") return `${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5399
+ return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5400
+ };
5401
+ sameSpec = (a2, b) => a2.kind === b.kind && a2.start.row === b.start.row && a2.start.col === b.start.col && a2.end.row === b.end.row && a2.end.col === b.end.col;
5402
+ needsQuote = (name) => !/^[A-Za-z_¡-￿][A-Za-z0-9_.¡-￿]*$/.test(name) || /^[A-Za-z]{1,3}\d+$/.test(name) || /^(?:R\d*C?\d*|C\d*)$/i.test(name) || /^(?:TRUE|FALSE)$/i.test(name);
5390
5403
  }
5391
- const n = -count2;
5392
- const last = at + n - 1;
5393
- if (a2 >= at && b <= last) return void 0;
5394
- const na = a2 < at ? a2 : a2 <= last ? at : a2 - n;
5395
- const nb = b < at ? b : b <= last ? at - 1 : b - n;
5396
- return [na, nb];
5404
+ });
5405
+
5406
+ // xlsx/formula/shift-formula.ts
5407
+ function remember(text, template) {
5408
+ if (templates.size >= MAX_TEMPLATES) templates.clear();
5409
+ templates.set(text, template);
5397
5410
  }
5398
5411
  function mergeSpacedAreas(tokens2) {
5399
5412
  const out = [];
@@ -5420,83 +5433,141 @@ function mergeSpacedAreas(tokens2) {
5420
5433
  }
5421
5434
  return out;
5422
5435
  }
5423
- function shiftFormula(formula, formulaSheet, spec2) {
5424
- if (spec2.count === 0) return formula;
5436
+ function templateOf(formula) {
5437
+ const cached = templates.get(formula);
5438
+ if (cached !== void 0) return cached;
5425
5439
  const raw2 = safeTokens(formula);
5426
- if (!raw2) return formula;
5427
- const tokens2 = mergeSpacedAreas(raw2);
5428
- const isRow = spec2.axis === "row";
5429
- for (const token of tokens2) {
5430
- if (token.kind !== "ref" || !token.ref || !sheetMatches(token.prefix, formulaSheet, spec2.sheet))
5431
- continue;
5432
- const ref = token.ref;
5433
- if (isRow && ref.kind === "cols" || !isRow && ref.kind === "rows") continue;
5434
- const startFirst = isRow ? ref.start.row <= ref.end.row : ref.start.col <= ref.end.col;
5435
- const lo = startFirst ? ref.start : ref.end;
5436
- const hi = startFirst ? ref.end : ref.start;
5437
- const shifted = shiftInterval(
5438
- isRow ? lo.row : lo.col,
5439
- isRow ? hi.row : hi.col,
5440
- spec2.at,
5441
- spec2.count,
5442
- isRow ? MAX_ROW : MAX_COL
5443
- );
5444
- let next;
5445
- if (shifted) {
5446
- const [a2, b] = shifted;
5447
- const nlo = isRow ? { ...lo, row: a2 } : { ...lo, col: a2 };
5448
- const nhi = isRow ? { ...hi, row: b } : { ...hi, col: b };
5449
- next = { kind: ref.kind, start: startFirst ? nlo : nhi, end: startFirst ? nhi : nlo };
5450
- if (ref.kind === "cell") next.end = next.start;
5440
+ let template = null;
5441
+ if (raw2) {
5442
+ template = [];
5443
+ let literal = "";
5444
+ for (const token of mergeSpacedAreas(raw2)) {
5445
+ if (token.kind !== "ref" && !(token.kind === "name" && token.prefix)) {
5446
+ literal += token.text;
5447
+ continue;
5448
+ }
5449
+ if (literal) template.push(literal);
5450
+ literal = "";
5451
+ const part = { kind: token.kind, text: token.text };
5452
+ if (token.prefix) {
5453
+ part.prefix = token.prefix;
5454
+ if (token.prefix.book === void 0) part.sheet = token.prefix.sheet.toLowerCase();
5455
+ }
5456
+ if (token.ref) part.ref = token.ref;
5457
+ if (token.spill) part.spill = true;
5458
+ template.push(part);
5451
5459
  }
5452
- if (next && sameSpec(next, ref)) continue;
5453
- token.text = rewrite(token, next);
5460
+ if (literal) template.push(literal);
5454
5461
  }
5455
- return joinTokens(tokens2);
5462
+ remember(formula, template);
5463
+ return template;
5456
5464
  }
5457
- function prefixText(prefix) {
5458
- const sheets = prefix.sheet2 !== void 0 ? `${prefix.sheet}:${prefix.sheet2}` : prefix.sheet;
5459
- const book = prefix.book !== void 0 ? `[${prefix.book}]` : "";
5460
- const quote2 = needsQuote(prefix.sheet) || prefix.sheet2 !== void 0 && needsQuote(prefix.sheet2);
5461
- return quote2 ? `'${(book + sheets).replace(/'/g, "''")}'!` : `${book}${sheets}!`;
5465
+ function rewriteTemplate(formula, rewrite2) {
5466
+ const template = templateOf(formula);
5467
+ if (!template) return formula;
5468
+ let next;
5469
+ for (let i = 0; i < template.length; i++) {
5470
+ const part = template[i];
5471
+ if (typeof part === "string") continue;
5472
+ const changed = rewrite2(part);
5473
+ if (!changed) continue;
5474
+ next ??= template.slice();
5475
+ next[i] = changed;
5476
+ }
5477
+ if (!next) return formula;
5478
+ const text = next.map((part) => typeof part === "string" ? part : part.text).join("");
5479
+ remember(text, next);
5480
+ return text;
5481
+ }
5482
+ function shiftInterval(a2, b, at, count2, max) {
5483
+ if (count2 > 0) {
5484
+ const na2 = a2 >= at ? a2 + count2 : a2;
5485
+ const nb2 = b >= at ? b + count2 : b;
5486
+ if (nb2 > max) return na2 > max ? void 0 : [na2, max];
5487
+ return [na2, nb2];
5488
+ }
5489
+ const n = -count2;
5490
+ const last = at + n - 1;
5491
+ if (a2 >= at && b <= last) return void 0;
5492
+ const na = a2 < at ? a2 : a2 <= last ? at : a2 - n;
5493
+ const nb = b < at ? b : b <= last ? at - 1 : b - n;
5494
+ return [na, nb];
5495
+ }
5496
+ function shiftRef(ref, spec2) {
5497
+ const isRow = spec2.axis === "row";
5498
+ if (isRow && ref.kind === "cols" || !isRow && ref.kind === "rows") return ref;
5499
+ const startFirst = isRow ? ref.start.row <= ref.end.row : ref.start.col <= ref.end.col;
5500
+ const lo = startFirst ? ref.start : ref.end;
5501
+ const hi = startFirst ? ref.end : ref.start;
5502
+ const shifted = shiftInterval(
5503
+ isRow ? lo.row : lo.col,
5504
+ isRow ? hi.row : hi.col,
5505
+ spec2.at,
5506
+ spec2.count,
5507
+ isRow ? MAX_ROW : MAX_COL
5508
+ );
5509
+ if (!shifted) return void 0;
5510
+ const [a2, b] = shifted;
5511
+ const nlo = isRow ? { ...lo, row: a2 } : { ...lo, col: a2 };
5512
+ const nhi = isRow ? { ...hi, row: b } : { ...hi, col: b };
5513
+ const next = {
5514
+ kind: ref.kind,
5515
+ start: startFirst ? nlo : nhi,
5516
+ end: startFirst ? nhi : nlo
5517
+ };
5518
+ if (ref.kind === "cell") next.end = next.start;
5519
+ return sameSpec(next, ref) ? ref : next;
5520
+ }
5521
+ function shiftFormula(formula, formulaSheet, spec2) {
5522
+ if (spec2.count === 0) return formula;
5523
+ const sheet = spec2.sheet.toLowerCase();
5524
+ const own = formulaSheet.toLowerCase() === sheet;
5525
+ return rewriteTemplate(formula, (part) => {
5526
+ if (part.kind !== "ref" || !part.ref || (part.prefix ? part.sheet !== sheet : !own))
5527
+ return void 0;
5528
+ const next = shiftRef(part.ref, spec2);
5529
+ if (next === part.ref) return void 0;
5530
+ const out = { kind: "ref", text: rewriteRef(part, next) };
5531
+ if (part.prefix) out.prefix = part.prefix;
5532
+ if (part.sheet !== void 0) out.sheet = part.sheet;
5533
+ if (next) out.ref = next;
5534
+ if (part.spill) out.spill = true;
5535
+ return out;
5536
+ });
5462
5537
  }
5463
5538
  function renameSheetInFormula(formula, oldName, newName) {
5464
- const tokens2 = safeTokens(formula);
5465
- if (!tokens2) return formula;
5466
5539
  const lower2 = oldName.toLowerCase();
5467
- for (const token of tokens2) {
5468
- const prefix = token.prefix;
5469
- if (!prefix || prefix.book !== void 0) continue;
5470
- const first2 = prefix.sheet.toLowerCase() === lower2;
5540
+ return rewriteTemplate(formula, (part) => {
5541
+ const prefix = part.prefix;
5542
+ if (!prefix || part.sheet === void 0) return void 0;
5543
+ const first2 = part.sheet === lower2;
5471
5544
  const second = prefix.sheet2?.toLowerCase() === lower2;
5472
- if (!first2 && !second) continue;
5545
+ if (!first2 && !second) return void 0;
5473
5546
  const renamed = { ...prefix, sheet: first2 ? newName : prefix.sheet };
5474
5547
  if (prefix.sheet2 !== void 0) renamed.sheet2 = second ? newName : prefix.sheet2;
5475
5548
  const text = prefixText(renamed);
5476
- token.text = text + token.text.slice(prefix.text.length);
5477
5549
  renamed.text = text;
5478
- token.prefix = renamed;
5479
- }
5480
- return joinTokens(tokens2);
5550
+ const out = { ...part, text: text + part.text.slice(prefix.text.length) };
5551
+ out.prefix = renamed;
5552
+ out.sheet = renamed.sheet.toLowerCase();
5553
+ return out;
5554
+ });
5481
5555
  }
5482
- var cornerText, sameSpec, sheetMatches, needsQuote;
5556
+ var templates, MAX_TEMPLATES;
5557
+ var init_shift_formula = __esm({
5558
+ "xlsx/formula/shift-formula.ts"() {
5559
+ init_address();
5560
+ init_ref_text();
5561
+ templates = /* @__PURE__ */ new Map();
5562
+ MAX_TEMPLATES = 2e5;
5563
+ }
5564
+ });
5565
+
5566
+ // xlsx/formula/transform.ts
5483
5567
  var init_transform = __esm({
5484
5568
  "xlsx/formula/transform.ts"() {
5485
- init_address();
5486
- init_ast();
5487
- init_tokenizer();
5488
- cornerText = (c2, kind) => {
5489
- if (kind === "cols") return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}`;
5490
- if (kind === "rows") return `${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5491
- return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5492
- };
5493
- sameSpec = (a2, b) => a2.kind === b.kind && a2.start.row === b.start.row && a2.start.col === b.start.col && a2.end.row === b.end.row && a2.end.col === b.end.col;
5494
- sheetMatches = (prefix, formulaSheet, sheet) => {
5495
- if (prefix?.book !== void 0) return false;
5496
- const name = prefix ? prefix.sheet : formulaSheet;
5497
- return name.toLowerCase() === sheet.toLowerCase();
5498
- };
5499
- needsQuote = (name) => !/^[A-Za-z_\u00A1-\uFFFF][A-Za-z0-9_.\u00A1-\uFFFF]*$/.test(name) || /^[A-Za-z]{1,3}\d+$/.test(name) || /^(?:R\d*C?\d*|C\d*)$/i.test(name) || /^(?:TRUE|FALSE)$/i.test(name);
5569
+ init_ref_text();
5570
+ init_shift_formula();
5500
5571
  }
5501
5572
  });
5502
5573
 
@@ -5587,7 +5658,7 @@ var init_formula_storage = __esm({
5587
5658
  });
5588
5659
 
5589
5660
  // xlsx/read/formula-text.ts
5590
- function rewrite2(formula, visit) {
5661
+ function rewrite(formula, visit) {
5591
5662
  const out = [];
5592
5663
  let i = 0;
5593
5664
  while (i < formula.length) {
@@ -5630,7 +5701,7 @@ function rewrite2(formula, visit) {
5630
5701
  }
5631
5702
  function stripFuturePrefixes(formula) {
5632
5703
  if (!formula.includes("_xl")) return formula;
5633
- const plain2 = rewrite2(formula, (token, next, out) => {
5704
+ const plain2 = rewrite(formula, (token, next, out) => {
5634
5705
  if (!next.startsWith("(")) return false;
5635
5706
  const stripped = token.replace(/^(_xlfn\.)?(_xlws\.)?/i, "");
5636
5707
  if (stripped === token) return false;
@@ -5640,7 +5711,7 @@ function stripFuturePrefixes(formula) {
5640
5711
  return fromStoredSyntax(plain2);
5641
5712
  }
5642
5713
  function addFuturePrefixes(formula) {
5643
- return rewrite2(toStoredSyntax(formula), (token, next, out) => {
5714
+ return rewrite(toStoredSyntax(formula), (token, next, out) => {
5644
5715
  if (!next.startsWith("(")) return false;
5645
5716
  const upper2 = token.toUpperCase();
5646
5717
  if (!FUTURE_FUNCTIONS.has(upper2)) return false;
@@ -6943,7 +7014,9 @@ var init_structured = __esm({
6943
7014
 
6944
7015
  // xlsx/formula/parser.ts
6945
7016
  function parseFormula(formula) {
6946
- const all2 = tokenize(formula);
7017
+ return parseTokens(tokenize(formula));
7018
+ }
7019
+ function parseTokens(all2) {
6947
7020
  const tokens2 = [];
6948
7021
  const wsBefore = [];
6949
7022
  let sawWs = false;
@@ -10584,8 +10657,10 @@ var init_financial = __esm({
10584
10657
 
10585
10658
  // xlsx/formula/references.ts
10586
10659
  function sheetIndex(host, name) {
10660
+ const sheets = host.workbook.sheets;
10661
+ for (let i = 0; i < sheets.length; i++) if (sheets[i]?.name === name) return i;
10587
10662
  const lower2 = name.toLowerCase();
10588
- return host.workbook.sheets.findIndex((sheet) => sheet.name.toLowerCase() === lower2);
10663
+ return sheets.findIndex((sheet) => sheet.name.toLowerCase() === lower2);
10589
10664
  }
10590
10665
  var init_references = __esm({
10591
10666
  "xlsx/formula/references.ts"() {
@@ -5138,7 +5138,7 @@ var init_lexemes = __esm({
5138
5138
  CELL_RE = /^(\$?)([A-Za-z]{1,3})(\$?)(\d{1,7})/;
5139
5139
  COLS_RE = /^(\$?)([A-Za-z]{1,3}):(\$?)([A-Za-z]{1,3})/;
5140
5140
  ROWS_RE = /^(\$?)(\d{1,7}):(\$?)(\d{1,7})/;
5141
- NUMBER_RE = /^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/;
5141
+ NUMBER_RE = /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?/;
5142
5142
  sticky = (re) => new RegExp(re.source.replace(/^\^/, ""), "y");
5143
5143
  CELL_AT = sticky(CELL_RE);
5144
5144
  COLS_AT = sticky(COLS_RE);
@@ -5335,7 +5335,7 @@ var init_tokenizer = __esm({
5335
5335
  }
5336
5336
  });
5337
5337
 
5338
- // xlsx/formula/transform.ts
5338
+ // xlsx/formula/ref-text.ts
5339
5339
  function safeTokens(formula) {
5340
5340
  try {
5341
5341
  return tokenize(formula);
@@ -5349,24 +5349,37 @@ function formatRefSpec(spec2) {
5349
5349
  if (spec2.kind === "cell") return a2;
5350
5350
  return `${a2}:${cornerText(spec2.end, spec2.kind)}`;
5351
5351
  }
5352
- function rewrite(token, ref) {
5352
+ function rewriteRef(token, ref) {
5353
5353
  const prefix = token.prefix?.text ?? "";
5354
5354
  if (!ref) return `${prefix}#REF!`;
5355
5355
  return `${prefix}${formatRefSpec(ref)}${token.spill ? "#" : ""}`;
5356
5356
  }
5357
- function shiftInterval(a2, b, at, count2, max) {
5358
- if (count2 > 0) {
5359
- const na2 = a2 >= at ? a2 + count2 : a2;
5360
- const nb2 = b >= at ? b + count2 : b;
5361
- if (nb2 > max) return na2 > max ? void 0 : [na2, max];
5362
- return [na2, nb2];
5357
+ function prefixText(prefix) {
5358
+ const sheets = prefix.sheet2 !== void 0 ? `${prefix.sheet}:${prefix.sheet2}` : prefix.sheet;
5359
+ const book = prefix.book !== void 0 ? `[${prefix.book}]` : "";
5360
+ const quote2 = needsQuote(prefix.sheet) || prefix.sheet2 !== void 0 && needsQuote(prefix.sheet2);
5361
+ return quote2 ? `'${(book + sheets).replace(/'/g, "''")}'!` : `${book}${sheets}!`;
5362
+ }
5363
+ var cornerText, sameSpec, needsQuote;
5364
+ var init_ref_text = __esm({
5365
+ "xlsx/formula/ref-text.ts"() {
5366
+ init_address();
5367
+ init_ast();
5368
+ init_tokenizer();
5369
+ cornerText = (c2, kind) => {
5370
+ if (kind === "cols") return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}`;
5371
+ if (kind === "rows") return `${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5372
+ return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5373
+ };
5374
+ sameSpec = (a2, b) => a2.kind === b.kind && a2.start.row === b.start.row && a2.start.col === b.start.col && a2.end.row === b.end.row && a2.end.col === b.end.col;
5375
+ needsQuote = (name) => !/^[A-Za-z_¡-￿][A-Za-z0-9_.¡-￿]*$/.test(name) || /^[A-Za-z]{1,3}\d+$/.test(name) || /^(?:R\d*C?\d*|C\d*)$/i.test(name) || /^(?:TRUE|FALSE)$/i.test(name);
5363
5376
  }
5364
- const n = -count2;
5365
- const last = at + n - 1;
5366
- if (a2 >= at && b <= last) return void 0;
5367
- const na = a2 < at ? a2 : a2 <= last ? at : a2 - n;
5368
- const nb = b < at ? b : b <= last ? at - 1 : b - n;
5369
- return [na, nb];
5377
+ });
5378
+
5379
+ // xlsx/formula/shift-formula.ts
5380
+ function remember(text, template) {
5381
+ if (templates.size >= MAX_TEMPLATES) templates.clear();
5382
+ templates.set(text, template);
5370
5383
  }
5371
5384
  function mergeSpacedAreas(tokens2) {
5372
5385
  const out = [];
@@ -5393,83 +5406,141 @@ function mergeSpacedAreas(tokens2) {
5393
5406
  }
5394
5407
  return out;
5395
5408
  }
5396
- function shiftFormula(formula, formulaSheet, spec2) {
5397
- if (spec2.count === 0) return formula;
5409
+ function templateOf(formula) {
5410
+ const cached = templates.get(formula);
5411
+ if (cached !== void 0) return cached;
5398
5412
  const raw2 = safeTokens(formula);
5399
- if (!raw2) return formula;
5400
- const tokens2 = mergeSpacedAreas(raw2);
5401
- const isRow = spec2.axis === "row";
5402
- for (const token of tokens2) {
5403
- if (token.kind !== "ref" || !token.ref || !sheetMatches(token.prefix, formulaSheet, spec2.sheet))
5404
- continue;
5405
- const ref = token.ref;
5406
- if (isRow && ref.kind === "cols" || !isRow && ref.kind === "rows") continue;
5407
- const startFirst = isRow ? ref.start.row <= ref.end.row : ref.start.col <= ref.end.col;
5408
- const lo = startFirst ? ref.start : ref.end;
5409
- const hi = startFirst ? ref.end : ref.start;
5410
- const shifted = shiftInterval(
5411
- isRow ? lo.row : lo.col,
5412
- isRow ? hi.row : hi.col,
5413
- spec2.at,
5414
- spec2.count,
5415
- isRow ? MAX_ROW : MAX_COL
5416
- );
5417
- let next;
5418
- if (shifted) {
5419
- const [a2, b] = shifted;
5420
- const nlo = isRow ? { ...lo, row: a2 } : { ...lo, col: a2 };
5421
- const nhi = isRow ? { ...hi, row: b } : { ...hi, col: b };
5422
- next = { kind: ref.kind, start: startFirst ? nlo : nhi, end: startFirst ? nhi : nlo };
5423
- if (ref.kind === "cell") next.end = next.start;
5413
+ let template = null;
5414
+ if (raw2) {
5415
+ template = [];
5416
+ let literal = "";
5417
+ for (const token of mergeSpacedAreas(raw2)) {
5418
+ if (token.kind !== "ref" && !(token.kind === "name" && token.prefix)) {
5419
+ literal += token.text;
5420
+ continue;
5421
+ }
5422
+ if (literal) template.push(literal);
5423
+ literal = "";
5424
+ const part = { kind: token.kind, text: token.text };
5425
+ if (token.prefix) {
5426
+ part.prefix = token.prefix;
5427
+ if (token.prefix.book === void 0) part.sheet = token.prefix.sheet.toLowerCase();
5428
+ }
5429
+ if (token.ref) part.ref = token.ref;
5430
+ if (token.spill) part.spill = true;
5431
+ template.push(part);
5424
5432
  }
5425
- if (next && sameSpec(next, ref)) continue;
5426
- token.text = rewrite(token, next);
5433
+ if (literal) template.push(literal);
5427
5434
  }
5428
- return joinTokens(tokens2);
5435
+ remember(formula, template);
5436
+ return template;
5429
5437
  }
5430
- function prefixText(prefix) {
5431
- const sheets = prefix.sheet2 !== void 0 ? `${prefix.sheet}:${prefix.sheet2}` : prefix.sheet;
5432
- const book = prefix.book !== void 0 ? `[${prefix.book}]` : "";
5433
- const quote2 = needsQuote(prefix.sheet) || prefix.sheet2 !== void 0 && needsQuote(prefix.sheet2);
5434
- return quote2 ? `'${(book + sheets).replace(/'/g, "''")}'!` : `${book}${sheets}!`;
5438
+ function rewriteTemplate(formula, rewrite2) {
5439
+ const template = templateOf(formula);
5440
+ if (!template) return formula;
5441
+ let next;
5442
+ for (let i = 0; i < template.length; i++) {
5443
+ const part = template[i];
5444
+ if (typeof part === "string") continue;
5445
+ const changed = rewrite2(part);
5446
+ if (!changed) continue;
5447
+ next ??= template.slice();
5448
+ next[i] = changed;
5449
+ }
5450
+ if (!next) return formula;
5451
+ const text = next.map((part) => typeof part === "string" ? part : part.text).join("");
5452
+ remember(text, next);
5453
+ return text;
5454
+ }
5455
+ function shiftInterval(a2, b, at, count2, max) {
5456
+ if (count2 > 0) {
5457
+ const na2 = a2 >= at ? a2 + count2 : a2;
5458
+ const nb2 = b >= at ? b + count2 : b;
5459
+ if (nb2 > max) return na2 > max ? void 0 : [na2, max];
5460
+ return [na2, nb2];
5461
+ }
5462
+ const n = -count2;
5463
+ const last = at + n - 1;
5464
+ if (a2 >= at && b <= last) return void 0;
5465
+ const na = a2 < at ? a2 : a2 <= last ? at : a2 - n;
5466
+ const nb = b < at ? b : b <= last ? at - 1 : b - n;
5467
+ return [na, nb];
5468
+ }
5469
+ function shiftRef(ref, spec2) {
5470
+ const isRow = spec2.axis === "row";
5471
+ if (isRow && ref.kind === "cols" || !isRow && ref.kind === "rows") return ref;
5472
+ const startFirst = isRow ? ref.start.row <= ref.end.row : ref.start.col <= ref.end.col;
5473
+ const lo = startFirst ? ref.start : ref.end;
5474
+ const hi = startFirst ? ref.end : ref.start;
5475
+ const shifted = shiftInterval(
5476
+ isRow ? lo.row : lo.col,
5477
+ isRow ? hi.row : hi.col,
5478
+ spec2.at,
5479
+ spec2.count,
5480
+ isRow ? MAX_ROW : MAX_COL
5481
+ );
5482
+ if (!shifted) return void 0;
5483
+ const [a2, b] = shifted;
5484
+ const nlo = isRow ? { ...lo, row: a2 } : { ...lo, col: a2 };
5485
+ const nhi = isRow ? { ...hi, row: b } : { ...hi, col: b };
5486
+ const next = {
5487
+ kind: ref.kind,
5488
+ start: startFirst ? nlo : nhi,
5489
+ end: startFirst ? nhi : nlo
5490
+ };
5491
+ if (ref.kind === "cell") next.end = next.start;
5492
+ return sameSpec(next, ref) ? ref : next;
5493
+ }
5494
+ function shiftFormula(formula, formulaSheet, spec2) {
5495
+ if (spec2.count === 0) return formula;
5496
+ const sheet = spec2.sheet.toLowerCase();
5497
+ const own = formulaSheet.toLowerCase() === sheet;
5498
+ return rewriteTemplate(formula, (part) => {
5499
+ if (part.kind !== "ref" || !part.ref || (part.prefix ? part.sheet !== sheet : !own))
5500
+ return void 0;
5501
+ const next = shiftRef(part.ref, spec2);
5502
+ if (next === part.ref) return void 0;
5503
+ const out = { kind: "ref", text: rewriteRef(part, next) };
5504
+ if (part.prefix) out.prefix = part.prefix;
5505
+ if (part.sheet !== void 0) out.sheet = part.sheet;
5506
+ if (next) out.ref = next;
5507
+ if (part.spill) out.spill = true;
5508
+ return out;
5509
+ });
5435
5510
  }
5436
5511
  function renameSheetInFormula(formula, oldName, newName) {
5437
- const tokens2 = safeTokens(formula);
5438
- if (!tokens2) return formula;
5439
5512
  const lower2 = oldName.toLowerCase();
5440
- for (const token of tokens2) {
5441
- const prefix = token.prefix;
5442
- if (!prefix || prefix.book !== void 0) continue;
5443
- const first2 = prefix.sheet.toLowerCase() === lower2;
5513
+ return rewriteTemplate(formula, (part) => {
5514
+ const prefix = part.prefix;
5515
+ if (!prefix || part.sheet === void 0) return void 0;
5516
+ const first2 = part.sheet === lower2;
5444
5517
  const second = prefix.sheet2?.toLowerCase() === lower2;
5445
- if (!first2 && !second) continue;
5518
+ if (!first2 && !second) return void 0;
5446
5519
  const renamed = { ...prefix, sheet: first2 ? newName : prefix.sheet };
5447
5520
  if (prefix.sheet2 !== void 0) renamed.sheet2 = second ? newName : prefix.sheet2;
5448
5521
  const text = prefixText(renamed);
5449
- token.text = text + token.text.slice(prefix.text.length);
5450
5522
  renamed.text = text;
5451
- token.prefix = renamed;
5452
- }
5453
- return joinTokens(tokens2);
5523
+ const out = { ...part, text: text + part.text.slice(prefix.text.length) };
5524
+ out.prefix = renamed;
5525
+ out.sheet = renamed.sheet.toLowerCase();
5526
+ return out;
5527
+ });
5454
5528
  }
5455
- var cornerText, sameSpec, sheetMatches, needsQuote;
5529
+ var templates, MAX_TEMPLATES;
5530
+ var init_shift_formula = __esm({
5531
+ "xlsx/formula/shift-formula.ts"() {
5532
+ init_address();
5533
+ init_ref_text();
5534
+ templates = /* @__PURE__ */ new Map();
5535
+ MAX_TEMPLATES = 2e5;
5536
+ }
5537
+ });
5538
+
5539
+ // xlsx/formula/transform.ts
5456
5540
  var init_transform = __esm({
5457
5541
  "xlsx/formula/transform.ts"() {
5458
- init_address();
5459
- init_ast();
5460
- init_tokenizer();
5461
- cornerText = (c2, kind) => {
5462
- if (kind === "cols") return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}`;
5463
- if (kind === "rows") return `${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5464
- return `${c2.colAbs ? "$" : ""}${columnLabel(c2.col)}${c2.rowAbs ? "$" : ""}${c2.row + 1}`;
5465
- };
5466
- sameSpec = (a2, b) => a2.kind === b.kind && a2.start.row === b.start.row && a2.start.col === b.start.col && a2.end.row === b.end.row && a2.end.col === b.end.col;
5467
- sheetMatches = (prefix, formulaSheet, sheet) => {
5468
- if (prefix?.book !== void 0) return false;
5469
- const name = prefix ? prefix.sheet : formulaSheet;
5470
- return name.toLowerCase() === sheet.toLowerCase();
5471
- };
5472
- needsQuote = (name) => !/^[A-Za-z_\u00A1-\uFFFF][A-Za-z0-9_.\u00A1-\uFFFF]*$/.test(name) || /^[A-Za-z]{1,3}\d+$/.test(name) || /^(?:R\d*C?\d*|C\d*)$/i.test(name) || /^(?:TRUE|FALSE)$/i.test(name);
5542
+ init_ref_text();
5543
+ init_shift_formula();
5473
5544
  }
5474
5545
  });
5475
5546
 
@@ -5560,7 +5631,7 @@ var init_formula_storage = __esm({
5560
5631
  });
5561
5632
 
5562
5633
  // xlsx/read/formula-text.ts
5563
- function rewrite2(formula, visit) {
5634
+ function rewrite(formula, visit) {
5564
5635
  const out = [];
5565
5636
  let i = 0;
5566
5637
  while (i < formula.length) {
@@ -5603,7 +5674,7 @@ function rewrite2(formula, visit) {
5603
5674
  }
5604
5675
  function stripFuturePrefixes(formula) {
5605
5676
  if (!formula.includes("_xl")) return formula;
5606
- const plain2 = rewrite2(formula, (token, next, out) => {
5677
+ const plain2 = rewrite(formula, (token, next, out) => {
5607
5678
  if (!next.startsWith("(")) return false;
5608
5679
  const stripped = token.replace(/^(_xlfn\.)?(_xlws\.)?/i, "");
5609
5680
  if (stripped === token) return false;
@@ -5613,7 +5684,7 @@ function stripFuturePrefixes(formula) {
5613
5684
  return fromStoredSyntax(plain2);
5614
5685
  }
5615
5686
  function addFuturePrefixes(formula) {
5616
- return rewrite2(toStoredSyntax(formula), (token, next, out) => {
5687
+ return rewrite(toStoredSyntax(formula), (token, next, out) => {
5617
5688
  if (!next.startsWith("(")) return false;
5618
5689
  const upper2 = token.toUpperCase();
5619
5690
  if (!FUTURE_FUNCTIONS.has(upper2)) return false;
@@ -6916,7 +6987,9 @@ var init_structured = __esm({
6916
6987
 
6917
6988
  // xlsx/formula/parser.ts
6918
6989
  function parseFormula(formula) {
6919
- const all2 = tokenize(formula);
6990
+ return parseTokens(tokenize(formula));
6991
+ }
6992
+ function parseTokens(all2) {
6920
6993
  const tokens2 = [];
6921
6994
  const wsBefore = [];
6922
6995
  let sawWs = false;
@@ -10557,8 +10630,10 @@ var init_financial = __esm({
10557
10630
 
10558
10631
  // xlsx/formula/references.ts
10559
10632
  function sheetIndex(host, name) {
10633
+ const sheets = host.workbook.sheets;
10634
+ for (let i = 0; i < sheets.length; i++) if (sheets[i]?.name === name) return i;
10560
10635
  const lower2 = name.toLowerCase();
10561
- return host.workbook.sheets.findIndex((sheet) => sheet.name.toLowerCase() === lower2);
10636
+ return sheets.findIndex((sheet) => sheet.name.toLowerCase() === lower2);
10562
10637
  }
10563
10638
  var init_references = __esm({
10564
10639
  "xlsx/formula/references.ts"() {
@@ -1,12 +1,14 @@
1
1
  import { type CellRange } from '../address.js';
2
2
  import type { Cell, CellValue, Workbook, Worksheet } from '../model.js';
3
3
  import { type CalcEngine } from './deps.js';
4
- import type { EditScope } from './history.js';
4
+ import type { CalcHint, EditScope } from './history.js';
5
5
  import type { WorkbookChangeKind } from './types.js';
6
6
  export interface RunInfo {
7
7
  sheet?: number;
8
8
  ranges?: CellRange[];
9
9
  structural?: boolean;
10
+ /** Lets the calc engine follow this structural edit in place (see `CalcHint`). */
11
+ calc?: CalcHint;
10
12
  }
11
13
  /** What every command module receives from the session. */
12
14
  export interface EditContext {