@univerjs/engine-formula 1.0.0-alpha.2 → 1.0.0-alpha.4

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 (87) hide show
  1. package/lib/cjs/facade.js +9 -5
  2. package/lib/cjs/index.js +2017 -356
  3. package/lib/es/facade.js +9 -5
  4. package/lib/es/index.js +1999 -359
  5. package/lib/facade.js +9 -5
  6. package/lib/index.js +1999 -359
  7. package/lib/types/basics/common.d.ts +16 -1
  8. package/lib/types/basics/date.d.ts +2 -2
  9. package/lib/types/basics/regex.d.ts +4 -4
  10. package/lib/types/commands/mutations/set-super-table.mutation.d.ts +4 -1
  11. package/lib/types/controllers/formula-calculation-trigger.controller.d.ts +20 -0
  12. package/lib/types/controllers/super-table-active-dirty.controller.d.ts +22 -0
  13. package/lib/types/engine/analysis/lexer-node.d.ts +3 -3
  14. package/lib/types/engine/analysis/lexer-tree-builder.d.ts +2 -1
  15. package/lib/types/engine/analysis/lexer.d.ts +2 -1
  16. package/lib/types/engine/analysis/parser.d.ts +2 -1
  17. package/lib/types/engine/ast-node/function-node.d.ts +9 -2
  18. package/lib/types/engine/ast-node/operator-node.d.ts +1 -0
  19. package/lib/types/engine/ast-node/prefix-node.d.ts +1 -0
  20. package/lib/types/engine/ast-node/reference-node.d.ts +14 -4
  21. package/lib/types/engine/interpreter/interpreter.d.ts +11 -0
  22. package/lib/types/engine/reference-object/base-reference-object.d.ts +3 -0
  23. package/lib/types/engine/reference-object/cell-reference-object.d.ts +1 -0
  24. package/lib/types/engine/reference-object/table-reference-object.d.ts +2 -0
  25. package/lib/types/engine/utils/generate-ast-node.d.ts +1 -1
  26. package/lib/types/engine/utils/math-kit.d.ts +5 -0
  27. package/lib/types/engine/utils/reference.d.ts +3 -5
  28. package/lib/types/engine/utils/unit-qualifier.d.ts +32 -0
  29. package/lib/types/engine/value-object/array-value-object.d.ts +5 -0
  30. package/lib/types/engine/value-object/base-value-object.d.ts +6 -0
  31. package/lib/types/facade/f-formula.d.ts +9 -5
  32. package/lib/types/functions/base-function.d.ts +21 -1
  33. package/lib/types/functions/cube/cubekpimember/index.d.ts +20 -0
  34. package/lib/types/functions/cube/cubemember/index.d.ts +20 -0
  35. package/lib/types/functions/cube/cubememberproperty/index.d.ts +20 -0
  36. package/lib/types/functions/cube/cuberankedmember/index.d.ts +20 -0
  37. package/lib/types/functions/cube/cubeset/index.d.ts +20 -0
  38. package/lib/types/functions/cube/cubesetcount/index.d.ts +20 -0
  39. package/lib/types/functions/cube/cubevalue/index.d.ts +20 -0
  40. package/lib/types/functions/financial/amordegrc/index.d.ts +20 -0
  41. package/lib/types/functions/information/info/index.d.ts +20 -0
  42. package/lib/types/functions/information/isomitted/index.d.ts +20 -0
  43. package/lib/types/functions/logical/function-map.d.ts +3 -2
  44. package/lib/types/functions/logical/function-names.d.ts +2 -0
  45. package/lib/types/functions/logical/groupby/index.d.ts +46 -0
  46. package/lib/types/functions/logical/if/index.d.ts +5 -0
  47. package/lib/types/functions/logical/iferror/index.d.ts +4 -1
  48. package/lib/types/functions/logical/percentof/index.d.ts +27 -0
  49. package/lib/types/functions/lookup/anchorarray/index.d.ts +23 -0
  50. package/lib/types/functions/lookup/function-names.d.ts +1 -0
  51. package/lib/types/functions/lookup/getpivotdata/index.d.ts +20 -0
  52. package/lib/types/functions/lookup/hlookup/index.d.ts +1 -0
  53. package/lib/types/functions/lookup/indirect/index.d.ts +2 -0
  54. package/lib/types/functions/lookup/rtd/index.d.ts +20 -0
  55. package/lib/types/functions/lookup/vlookup/index.d.ts +2 -0
  56. package/lib/types/functions/lookup/xlookup/index.d.ts +2 -0
  57. package/lib/types/functions/math/iso-ceiling/index.d.ts +20 -0
  58. package/lib/types/functions/math/sum/index.d.ts +1 -0
  59. package/lib/types/functions/meta/compare/index.d.ts +1 -0
  60. package/lib/types/functions/not-implemented-function.d.ts +23 -0
  61. package/lib/types/functions/statistical/average/index.d.ts +1 -0
  62. package/lib/types/functions/statistical/countifs/index.d.ts +1 -0
  63. package/lib/types/functions/statistical/forecast-ets/index.d.ts +20 -0
  64. package/lib/types/functions/statistical/forecast-ets-confint/index.d.ts +20 -0
  65. package/lib/types/functions/statistical/forecast-ets-seasonality/index.d.ts +20 -0
  66. package/lib/types/functions/statistical/forecast-ets-stat/index.d.ts +20 -0
  67. package/lib/types/functions/statistical/linest/index.d.ts +1 -0
  68. package/lib/types/functions/text/call/index.d.ts +20 -0
  69. package/lib/types/functions/text/euroconvert/index.d.ts +20 -0
  70. package/lib/types/functions/text/function-names.d.ts +1 -0
  71. package/lib/types/functions/text/phonetic/index.d.ts +20 -0
  72. package/lib/types/functions/text/register-id/index.d.ts +20 -0
  73. package/lib/types/functions/text/textsplit/index.d.ts +1 -0
  74. package/lib/types/functions/web/filterxml/index.d.ts +22 -0
  75. package/lib/types/functions/web/function-map.d.ts +2 -2
  76. package/lib/types/functions/web/webservice/index.d.ts +20 -0
  77. package/lib/types/index.d.ts +7 -2
  78. package/lib/types/models/formula-data.model.d.ts +4 -2
  79. package/lib/types/services/active-dirty-manager.service.d.ts +2 -1
  80. package/lib/types/services/calculate-formula.service.d.ts +2 -2
  81. package/lib/types/services/current-data.service.d.ts +6 -1
  82. package/lib/types/services/defined-names.service.d.ts +2 -2
  83. package/lib/types/services/formula-calculation-trigger.service.d.ts +43 -0
  84. package/lib/types/services/runtime.service.d.ts +6 -0
  85. package/lib/types/services/unit-reference-resolver.service.d.ts +39 -0
  86. package/lib/umd/index.js +5 -2
  87. package/package.json +5 -5
package/lib/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { AbsoluteRefType, AsyncLock, BooleanNumber, BuildTextUtils, CellValueType, CommandType, DataStreamTreeTokenType, Disposable, DisposableCollection, ICommandService, IConfigService, IUniverInstanceService, Inject, Injector, LRUMap, LifecycleService, LocaleService, LocaleType, MAX_COLUMN_COUNT, MAX_ROW_COUNT, ObjectMatrix, Optional, Plugin, RANGE_TYPE, RTree, Rectangle, RichTextBuilder, Styles, Tools, UniverInstanceType, cellToRange, columnLabelToNumber, createIdentifier, escapeRegExp, generateRandomId, getNumfmtParseValueFilter, hashAlgorithm, isFormulaId, isFormulaString, isNullCell, isRealNum, isTextFormat, isValidRange, merge, moveRangeByOffset, numfmt, requestImmediateMacroTask, sortRules, toDisposable, touchDependencies } from "@univerjs/core";
1
+ import { AbsoluteRefType, AsyncLock, BooleanNumber, BuildTextUtils, CellValueType, CommandType, DataStreamTreeTokenType, Disposable, DisposableCollection, ICommandService, IConfigService, IUniverInstanceService, Inject, Injector, LRUMap, LifecycleService, LifecycleStages, LocaleService, LocaleType, MAX_COLUMN_COUNT, MAX_ROW_COUNT, ObjectMatrix, Optional, Plugin, RANGE_TYPE, RTree, Rectangle, RichTextBuilder, Styles, Tools, UniverInstanceType, cellToRange, columnLabelToNumber, createIdentifier, generateRandomId, getNumfmtParseValueFilter, hashAlgorithm, isFormulaId, isFormulaString, isNodeEnv, isNullCell, isRealNum, isTextFormat, isValidRange, merge, moveRangeByOffset, numfmt, regexp, requestImmediateMacroTask, sortRules, toDisposable, touchDependencies } from "@univerjs/core";
2
2
  import IntervalTree from "@flatten-js/interval-tree";
3
- import { BehaviorSubject, Observable, Subject, bufferWhen, combineLatest, distinctUntilChanged, filter, map, shareReplay, skip } from "rxjs";
3
+ import { BehaviorSubject, Observable, Subject, bufferWhen, combineLatest, distinctUntilChanged, filter, map, shareReplay, skip, take } from "rxjs";
4
4
  import Decimal from "decimal.js";
5
5
  import { DataSyncPrimaryController } from "@univerjs/rpc";
6
6
 
@@ -478,12 +478,14 @@ var BaseValueObject = class extends ObjectClassType {
478
478
  return ErrorValueObject.create("#NAME?");
479
479
  }
480
480
  concatenate(value, concatenateType = 0) {
481
- let currentValue = this.getValue().toString();
481
+ let currentValue = formatValueForFormulaText(this.getValue());
482
482
  if (typeof value === "string") if (concatenateType === 0) currentValue = value + currentValue;
483
483
  else currentValue += value;
484
- else if (typeof value === "number") if (concatenateType === 0) currentValue = value.toString() + currentValue;
485
- else currentValue += value.toString();
486
- else if (typeof value === "boolean") {
484
+ else if (typeof value === "number") {
485
+ const numberString = formatNumberForFormulaText(value);
486
+ if (concatenateType === 0) currentValue = numberString + currentValue;
487
+ else currentValue += numberString;
488
+ } else if (typeof value === "boolean") {
487
489
  const booleanString = value ? "TRUE" : "FALSE";
488
490
  if (concatenateType === 0) currentValue = booleanString + currentValue;
489
491
  else currentValue += booleanString;
@@ -649,6 +651,16 @@ var BaseValueObject = class extends ObjectClassType {
649
651
  return ErrorValueObject.create("#VALUE!");
650
652
  }
651
653
  };
654
+ function formatValueForFormulaText(value) {
655
+ if (typeof value === "number") return formatNumberForFormulaText(value);
656
+ if (typeof value === "boolean") return value ? "TRUE" : "FALSE";
657
+ return value == null ? "" : value.toString();
658
+ }
659
+ function formatNumberForFormulaText(value) {
660
+ if (!Number.isFinite(value)) return value.toString();
661
+ const rounded = Number(value.toPrecision(15));
662
+ return Object.is(rounded, -0) ? "0" : rounded.toString();
663
+ }
652
664
  const Error_CACHE_LRU_COUNT = 1e3;
653
665
  const ErrorValueObjectCache = new FormulaAstLRU(Error_CACHE_LRU_COUNT);
654
666
  var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
@@ -681,6 +693,12 @@ var ErrorValueObject = class ErrorValueObject extends BaseValueObject {
681
693
  isError() {
682
694
  return true;
683
695
  }
696
+ concatenateFront(_valueObject) {
697
+ return this;
698
+ }
699
+ concatenateBack(_valueObject) {
700
+ return this;
701
+ }
684
702
  };
685
703
 
686
704
  //#endregion
@@ -751,6 +769,43 @@ function parseFormattedDate(value) {
751
769
  function parseFormattedTime(value) {
752
770
  return numfmt.parseTime(value);
753
771
  }
772
+ function parseEnglishMonthNameDate(value) {
773
+ const match = value.trim().match(/^(\d{1,2})\s*([A-Za-z]{3,9})\s*(\d{2,4})$/);
774
+ if (!match) return null;
775
+ const [, dayText, monthText, yearText] = match;
776
+ const month = {
777
+ jan: 0,
778
+ january: 0,
779
+ feb: 1,
780
+ february: 1,
781
+ mar: 2,
782
+ march: 2,
783
+ apr: 3,
784
+ april: 3,
785
+ may: 4,
786
+ jun: 5,
787
+ june: 5,
788
+ jul: 6,
789
+ july: 6,
790
+ aug: 7,
791
+ august: 7,
792
+ sep: 8,
793
+ sept: 8,
794
+ september: 8,
795
+ oct: 9,
796
+ october: 9,
797
+ nov: 10,
798
+ november: 10,
799
+ dec: 11,
800
+ december: 11
801
+ }[monthText.toLowerCase()];
802
+ if (month == null) return null;
803
+ const day = Number(dayText);
804
+ const year = Number(yearText.length === 2 ? `20${yearText}` : yearText);
805
+ const date = new Date(Date.UTC(year, month, day));
806
+ if (date.getUTCFullYear() !== year || date.getUTCMonth() !== month || date.getUTCDate() !== day) return null;
807
+ return date;
808
+ }
754
809
  function isDate(format) {
755
810
  return numfmt.getFormatInfo(format).isDate;
756
811
  }
@@ -829,6 +884,7 @@ function getDateSerialNumberByObject(serialNumberObject) {
829
884
  let dateSerial;
830
885
  if (parseFormattedDate(`${dateValue}`)) dateSerial = parseFormattedDate(`${dateValue}`).v;
831
886
  else if (parseFormattedTime(`${dateValue}`)) dateSerial = parseFormattedTime(`${dateValue}`).v;
887
+ else if (parseEnglishMonthNameDate(`${dateValue}`)) dateSerial = parseEnglishMonthNameDate(`${dateValue}`);
832
888
  else if (isRealNum(dateValue)) dateSerial = +dateValue;
833
889
  else return ErrorValueObject.create("#VALUE!");
834
890
  if (dateSerial instanceof Date) dateSerial = excelDateTimeSerial(dateSerial);
@@ -876,10 +932,11 @@ function getDaysByNASD(startDateSerialNumber, endDateSerialNumber) {
876
932
  let endYear = endDateSerialNumber > 0 ? endDateDate.getUTCFullYear() : 1900;
877
933
  let endMonth = endDateSerialNumber > 0 ? endDateDate.getUTCMonth() + 1 : 1;
878
934
  let endDay = endDateSerialNumber > 0 ? endDateDate.getUTCDate() : 0;
879
- if (startMonth === 2) {
880
- if (excelSerialToDate(startDateSerialNumber + 1).getUTCMonth() + 1 === 3) startDay = 30;
881
- } else if (startDay === 31) startDay = 30;
882
- if (endDay === 31) if (startDay < 30) {
935
+ const startIsLastDayOfFebruary = startMonth === 2 && startDay === getDaysInMonth(startYear, startMonth - 1);
936
+ if (startIsLastDayOfFebruary) startDay = 30;
937
+ else if (startDay === 31) startDay = 30;
938
+ if (endMonth === 2 && endDay === getDaysInMonth(endYear, endMonth - 1) && startIsLastDayOfFebruary) endDay = 30;
939
+ else if (endDay === 31) if (startDay < 30) {
883
940
  endDateDate = excelSerialToDate(endDateSerialNumber + 1);
884
941
  endYear = endDateDate.getUTCFullYear();
885
942
  endMonth = endDateDate.getUTCMonth() + 1;
@@ -1166,16 +1223,19 @@ var InvertedIndexCache = class {
1166
1223
  };
1167
1224
  const _value = normalizeValue(value);
1168
1225
  if (ERROR_TYPE_SET.has(_value)) result.errorType = _value;
1169
- else if (_value === 0 || _value === DEFAULT_EMPTY_CELL_KEY) {
1226
+ else if (_value === 0) {
1170
1227
  const rows = [];
1171
1228
  const rowsForZero = columnMap.get(0);
1172
1229
  if (rowsForZero) rows.push(...rowsForZero);
1173
1230
  const rowsForEmpty = columnMap.get(DEFAULT_EMPTY_CELL_KEY);
1174
1231
  if (rowsForEmpty) rows.push(...rowsForEmpty);
1175
1232
  result.matchingRows = rows.filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1176
- } else {
1233
+ } else if (_value === DEFAULT_EMPTY_CELL_KEY) {
1177
1234
  var _columnMap$get;
1178
- result.matchingRows = Array.from((_columnMap$get = columnMap.get(_value)) !== null && _columnMap$get !== void 0 ? _columnMap$get : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1235
+ result.matchingRows = Array.from((_columnMap$get = columnMap.get(DEFAULT_EMPTY_CELL_KEY)) !== null && _columnMap$get !== void 0 ? _columnMap$get : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1236
+ } else {
1237
+ var _columnMap$get2;
1238
+ result.matchingRows = Array.from((_columnMap$get2 = columnMap.get(_value)) !== null && _columnMap$get2 !== void 0 ? _columnMap$get2 : []).filter((row) => rowsInCache.some(([start, end]) => row >= start && row <= end));
1179
1239
  }
1180
1240
  return result;
1181
1241
  }
@@ -1391,12 +1451,13 @@ const REFERENCE_REGEX_SINGLE_COLUMN = `^${UNIT_NAME_SHEET_NAME_REGEX}\\s*?\\${"$
1391
1451
  const REFERENCE_REGEX_SINGLE_COLUMN_PRECOMPILING = new RegExp(REFERENCE_REGEX_SINGLE_COLUMN);
1392
1452
  const TABLE_NAME_REGEX = "((?![~!@#$%^&*()_+<>?:,./;’,。、‘:“《》?~!@#¥%……()【】\\[\\]\\/\\\\]).)+";
1393
1453
  const TABLE_TITLE_REGEX = "\\[#.+\\]\\s*?,\\s*?";
1394
- const TABLE_CONTENT_REGEX = "\\[((?<!#).)*\\]";
1454
+ const TABLE_CONTENT_REGEX = "\\[((?<!#)[\\s\\S])*\\]";
1395
1455
  const TABLE_MULTIPLE_COLUMN_REGEX = `${TABLE_CONTENT_REGEX}${RANGE_SYMBOL}${TABLE_CONTENT_REGEX}`;
1396
- const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}$`;
1397
- const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
1398
- const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}(\\[${TABLE_MULTIPLE_COLUMN_REGEX}\\])?$|^${TABLE_NAME_REGEX}(\\[${TABLE_TITLE_REGEX}${TABLE_MULTIPLE_COLUMN_REGEX}\\])?$`;
1399
- const REFERENCE_TABLE_TITLE_ONLY_ANY_HASH_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}\\[\\s*#([^\\]]+)\\s*\\]$`;
1456
+ const TABLE_UNIT_QUALIFIER_REGEX = `(?:(?:${UNIT_NAME_REGEX}|'(?:[^']|'')+'|[^\\s!\\[\\]]+)!)?(?:${UNIT_NAME_REGEX})?`;
1457
+ const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}$`;
1458
+ const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
1459
+ const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}(\\[${TABLE_MULTIPLE_COLUMN_REGEX}\\])?$|^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}(\\[${TABLE_TITLE_REGEX}${TABLE_MULTIPLE_COLUMN_REGEX}\\])?$`;
1460
+ const REFERENCE_TABLE_TITLE_ONLY_ANY_HASH_REGEX = `^${TABLE_UNIT_QUALIFIER_REGEX}${TABLE_NAME_REGEX}\\[\\s*#([^\\]]+)\\s*\\]$`;
1400
1461
  const REFERENCE_TABLE_ALL_COLUMN_REGEX_PRECOMPILING = new RegExp(REFERENCE_TABLE_ALL_COLUMN_REGEX);
1401
1462
  const REFERENCE_TABLE_SINGLE_COLUMN_REGEX_PRECOMPILING = new RegExp(REFERENCE_TABLE_SINGLE_COLUMN_REGEX);
1402
1463
  const REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX_PRECOMPILING = new RegExp(REFERENCE_TABLE_MULTIPLE_COLUMN_REGEX);
@@ -1647,10 +1708,10 @@ function singleReferenceToGrid(refBody) {
1647
1708
  }
1648
1709
  function handleRefStringInfo(refString) {
1649
1710
  const unitIdMatch = UNIT_NAME_REGEX_PRECOMPILING.exec(refString);
1650
- let unitId = "";
1711
+ let unitQualifier = "";
1651
1712
  if (unitIdMatch != null) {
1652
- unitId = unitIdMatch[0].trim();
1653
- unitId = unquoteSheetName(unitId.slice(1, unitId.length - 1));
1713
+ unitQualifier = unitIdMatch[0].trim();
1714
+ unitQualifier = unquoteSheetName(unitQualifier.slice(1, unitQualifier.length - 1));
1654
1715
  refString = refString.replace(UNIT_NAME_REGEX_PRECOMPILING, "");
1655
1716
  }
1656
1717
  const sheetNameIndex = refString.indexOf("!");
@@ -1665,11 +1726,13 @@ function handleRefStringInfo(refString) {
1665
1726
  return {
1666
1727
  refBody,
1667
1728
  sheetName,
1668
- unitId
1729
+ unitQualifier,
1730
+ /** @deprecated Use unitQualifier. Kept for reference-grid compatibility. */
1731
+ unitId: unitQualifier
1669
1732
  };
1670
1733
  }
1671
1734
  function deserializeRangeWithSheet(refString) {
1672
- const { refBody, sheetName, unitId } = handleRefStringInfo(refString);
1735
+ const { refBody, sheetName, unitQualifier } = handleRefStringInfo(refString);
1673
1736
  const colonIndex = refBody.indexOf(":");
1674
1737
  if (colonIndex === -1) {
1675
1738
  const grid = singleReferenceToGrid(refBody);
@@ -1677,7 +1740,7 @@ function deserializeRangeWithSheet(refString) {
1677
1740
  const column = grid.column;
1678
1741
  const absoluteRefType = grid.absoluteRefType;
1679
1742
  return {
1680
- unitId,
1743
+ unitId: unitQualifier,
1681
1744
  sheetName,
1682
1745
  range: {
1683
1746
  startRow: row,
@@ -1701,7 +1764,7 @@ function deserializeRangeWithSheet(refString) {
1701
1764
  if (Number.isNaN(startRow) && Number.isNaN(endRow)) rangeType = RANGE_TYPE.COLUMN;
1702
1765
  else if (Number.isNaN(startColumn) && Number.isNaN(endColumn)) rangeType = RANGE_TYPE.ROW;
1703
1766
  return {
1704
- unitId,
1767
+ unitId: unitQualifier,
1705
1768
  sheetName,
1706
1769
  range: {
1707
1770
  startRow,
@@ -1835,14 +1898,49 @@ function startsWithNonAlphabetic(name) {
1835
1898
  return !/^\p{Letter}/u.test(name.charAt(0));
1836
1899
  }
1837
1900
  function splitTableStructuredRef(ref) {
1838
- const idx = ref.indexOf("[");
1901
+ let unitQualifier = "";
1902
+ let tableRef = ref.trim();
1903
+ let quoteOpen = false;
1904
+ let bracketDepth = 0;
1905
+ let qualifierEnd = -1;
1906
+ for (let i = 0; i < tableRef.length; i++) {
1907
+ const char = tableRef[i];
1908
+ if (char === "'") {
1909
+ if (quoteOpen && tableRef[i + 1] === "'") {
1910
+ i++;
1911
+ continue;
1912
+ }
1913
+ quoteOpen = !quoteOpen;
1914
+ } else if (!quoteOpen && char === "[") bracketDepth++;
1915
+ else if (!quoteOpen && char === "]") bracketDepth--;
1916
+ else if (!quoteOpen && bracketDepth === 0 && char === "!") {
1917
+ qualifierEnd = i;
1918
+ break;
1919
+ }
1920
+ }
1921
+ if (qualifierEnd >= 0) {
1922
+ unitQualifier = tableRef.slice(0, qualifierEnd).trim();
1923
+ tableRef = tableRef.slice(qualifierEnd + 1);
1924
+ if (unitQualifier.startsWith("'") && unitQualifier.endsWith("'")) unitQualifier = unitQualifier.slice(1, -1);
1925
+ if (unitQualifier.startsWith("[") && unitQualifier.endsWith("]")) unitQualifier = unitQualifier.slice(1, -1);
1926
+ unitQualifier = unquoteSheetName(unitQualifier);
1927
+ } else if (tableRef.startsWith("[")) {
1928
+ const legacyQualifierEnd = tableRef.indexOf("]");
1929
+ if (legacyQualifierEnd > 0) {
1930
+ unitQualifier = unquoteSheetName(tableRef.slice(1, legacyQualifierEnd));
1931
+ tableRef = tableRef.slice(legacyQualifierEnd + 1);
1932
+ }
1933
+ }
1934
+ const idx = tableRef.indexOf("[");
1839
1935
  if (idx === -1) return {
1840
- tableName: ref,
1841
- struct: ""
1936
+ unitQualifier,
1937
+ tableName: tableRef,
1938
+ columnStruct: ""
1842
1939
  };
1843
1940
  return {
1844
- tableName: ref.slice(0, idx),
1845
- columnStruct: ref.slice(idx)
1941
+ unitQualifier,
1942
+ tableName: tableRef.slice(0, idx),
1943
+ columnStruct: tableRef.slice(idx)
1846
1944
  };
1847
1945
  }
1848
1946
 
@@ -1970,16 +2068,38 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
1970
2068
  getDefinedNameMap(unitId) {
1971
2069
  return this._definedNameMap[unitId];
1972
2070
  }
1973
- getValueByName(unitId, name) {
1974
- const cachedMap = this._nameCacheMap[unitId];
1975
- if (cachedMap) return cachedMap[name.toLowerCase()] || null;
2071
+ getValueByName(unitId, name, sheetId) {
1976
2072
  const nameMap = this._definedNameMap[unitId];
1977
2073
  if (nameMap === void 0) return null;
2074
+ if (sheetId) {
2075
+ var _workbookScope;
2076
+ const normalizedName = name.toLowerCase();
2077
+ let workbookScope = null;
2078
+ let firstMatch = null;
2079
+ for (const item of Object.values(nameMap)) {
2080
+ if (item.name.toLowerCase() !== normalizedName) continue;
2081
+ if (firstMatch == null) firstMatch = item;
2082
+ if (item.localSheetId === sheetId) return item;
2083
+ if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null) {
2084
+ if (workbookScope == null) workbookScope = item;
2085
+ }
2086
+ }
2087
+ return (_workbookScope = workbookScope) !== null && _workbookScope !== void 0 ? _workbookScope : firstMatch;
2088
+ }
2089
+ const cachedMap = this._nameCacheMap[unitId];
2090
+ if (cachedMap) return cachedMap[name.toLowerCase()] || null;
1978
2091
  let result = null;
1979
- for (const item of Object.values(nameMap)) if (item.name === name) {
2092
+ const normalizedName = name.toLowerCase();
2093
+ for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName && (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null)) {
1980
2094
  result = item;
1981
2095
  break;
1982
2096
  }
2097
+ if (!result) {
2098
+ for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName) {
2099
+ result = item;
2100
+ break;
2101
+ }
2102
+ }
1983
2103
  if (result) {
1984
2104
  this._nameCacheMap[unitId] = this._nameCacheMap[unitId] || {};
1985
2105
  this._nameCacheMap[unitId][name.toLowerCase()] = result;
@@ -2014,7 +2134,10 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
2014
2134
  return;
2015
2135
  }
2016
2136
  this._nameCacheMap[unitId] = {};
2017
- for (const item of Object.values(nameMap)) this._nameCacheMap[unitId][item.name.toLowerCase()] = item;
2137
+ for (const item of Object.values(nameMap)) {
2138
+ const normalizedName = item.name.toLowerCase();
2139
+ if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null || this._nameCacheMap[unitId][normalizedName] == null) this._nameCacheMap[unitId][normalizedName] = item;
2140
+ }
2018
2141
  }
2019
2142
  _isDeepDefinedNameMapEmpty() {
2020
2143
  for (const unitId in this._definedNameMap) if (this.hasDefinedName(unitId)) return false;
@@ -2587,6 +2710,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2587
2710
  FUNCTION_NAMES_LOGICAL["BYCOL"] = "BYCOL";
2588
2711
  FUNCTION_NAMES_LOGICAL["BYROW"] = "BYROW";
2589
2712
  FUNCTION_NAMES_LOGICAL["FALSE"] = "FALSE";
2713
+ FUNCTION_NAMES_LOGICAL["GROUPBY"] = "GROUPBY";
2590
2714
  FUNCTION_NAMES_LOGICAL["IF"] = "IF";
2591
2715
  FUNCTION_NAMES_LOGICAL["IFERROR"] = "IFERROR";
2592
2716
  FUNCTION_NAMES_LOGICAL["IFNA"] = "IFNA";
@@ -2597,6 +2721,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2597
2721
  FUNCTION_NAMES_LOGICAL["MAP"] = "MAP";
2598
2722
  FUNCTION_NAMES_LOGICAL["NOT"] = "NOT";
2599
2723
  FUNCTION_NAMES_LOGICAL["OR"] = "OR";
2724
+ FUNCTION_NAMES_LOGICAL["PERCENTOF"] = "PERCENTOF";
2600
2725
  FUNCTION_NAMES_LOGICAL["REDUCE"] = "REDUCE";
2601
2726
  FUNCTION_NAMES_LOGICAL["SCAN"] = "SCAN";
2602
2727
  FUNCTION_NAMES_LOGICAL["SWITCH"] = "SWITCH";
@@ -2624,6 +2749,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2624
2749
  */
2625
2750
  let FUNCTION_NAMES_LOOKUP = /* @__PURE__ */ function(FUNCTION_NAMES_LOOKUP) {
2626
2751
  FUNCTION_NAMES_LOOKUP["ADDRESS"] = "ADDRESS";
2752
+ FUNCTION_NAMES_LOOKUP["ANCHORARRAY"] = "ANCHORARRAY";
2627
2753
  FUNCTION_NAMES_LOOKUP["AREAS"] = "AREAS";
2628
2754
  FUNCTION_NAMES_LOOKUP["CHOOSE"] = "CHOOSE";
2629
2755
  FUNCTION_NAMES_LOOKUP["CHOOSECOLS"] = "CHOOSECOLS";
@@ -2946,6 +3072,7 @@ let FUNCTION_NAMES_TEXT = /* @__PURE__ */ function(FUNCTION_NAMES_TEXT) {
2946
3072
  FUNCTION_NAMES_TEXT["PROPER"] = "PROPER";
2947
3073
  FUNCTION_NAMES_TEXT["REGEXEXTRACT"] = "REGEXEXTRACT";
2948
3074
  FUNCTION_NAMES_TEXT["REGEXMATCH"] = "REGEXMATCH";
3075
+ FUNCTION_NAMES_TEXT["REGEXTEST"] = "REGEXTEST";
2949
3076
  FUNCTION_NAMES_TEXT["REGEXREPLACE"] = "REGEXREPLACE";
2950
3077
  FUNCTION_NAMES_TEXT["REPLACE"] = "REPLACE";
2951
3078
  FUNCTION_NAMES_TEXT["REPLACEB"] = "REPLACEB";
@@ -3057,6 +3184,7 @@ const NEW_EXCEL_FUNCTIONS = /* @__PURE__ */ new Set([
3057
3184
  "SHEETS",
3058
3185
  "IFNA",
3059
3186
  "IFS",
3187
+ "GROUPBY",
3060
3188
  "SWITCH",
3061
3189
  "XOR",
3062
3190
  "BETA.DIST",
@@ -3151,7 +3279,7 @@ function deserializeRangeWithSheetWithCache(refString) {
3151
3279
  if (refCache) return refCache;
3152
3280
  const result = deserializeRangeWithSheet(refString);
3153
3281
  referenceToRangeCache.set(refString, result);
3154
- return deserializeRangeWithSheet(refString);
3282
+ return result;
3155
3283
  }
3156
3284
  function clearReferenceToRangeCache() {
3157
3285
  referenceToRangeCache.clear();
@@ -3710,7 +3838,7 @@ var LexerTreeBuilder = class extends Disposable {
3710
3838
  return this._currentLexerNode;
3711
3839
  }
3712
3840
  _handleDefinedName(sequenceArray, param) {
3713
- const { unitId, getValueByName, getSheetName } = param;
3841
+ const { unitId, sheetId, getValueByName, getSheetName } = param;
3714
3842
  if (unitId == null) return {
3715
3843
  sequenceString: "",
3716
3844
  hasDefinedName: false,
@@ -3730,14 +3858,15 @@ var LexerTreeBuilder = class extends Disposable {
3730
3858
  let token = tokenRaw;
3731
3859
  if (nodeType === 4 || nodeType === 3) {
3732
3860
  if (nodeType === 3) token = this._getHasSheetNameDefinedName(tokenRaw, unitId, param);
3733
- const definedContent = getValueByName(unitId, token);
3861
+ const definedNameToken = token.trim();
3862
+ const definedContent = getValueByName(unitId, definedNameToken, sheetId);
3734
3863
  if (definedContent) {
3735
3864
  const refString = definedContent.formulaOrRefString;
3736
3865
  const nestedDefinedNameParam = this._handleNestedDefinedName(refString, param);
3737
3866
  if (nestedDefinedNameParam == null || typeof nestedDefinedNameParam !== "object") {
3738
3867
  sequenceString += nestedDefinedNameParam || "#NAME?";
3739
3868
  hasDefinedName = true;
3740
- definedNames.push(token);
3869
+ definedNames.push(definedNameToken);
3741
3870
  } else if (typeof nestedDefinedNameParam === "object") {
3742
3871
  const { sequenceString: nestedSequenceString, definedNames: nestedDefinedNames } = nestedDefinedNameParam;
3743
3872
  sequenceString += nestedSequenceString;
@@ -3746,10 +3875,10 @@ var LexerTreeBuilder = class extends Disposable {
3746
3875
  });
3747
3876
  hasDefinedName = true;
3748
3877
  }
3749
- } else if (this._checkDefinedNameDirty(token, param)) {
3878
+ } else if (this._checkDefinedNameDirty(definedNameToken, param)) {
3750
3879
  sequenceString += "#NAME?";
3751
3880
  hasDefinedName = true;
3752
- definedNames.push(token);
3881
+ definedNames.push(definedNameToken);
3753
3882
  } else sequenceString += token;
3754
3883
  } else sequenceString += token;
3755
3884
  }
@@ -4163,7 +4292,7 @@ var LexerTreeBuilder = class extends Disposable {
4163
4292
  }
4164
4293
  }
4165
4294
  _nodeMaker(formulaStringRaw, sequenceArray, matchCurrentNodeIndex) {
4166
- let formulaString = formulaStringRaw.replace(/\r\n$|\r|\n/g, " ");
4295
+ let formulaString = formulaStringRaw.replace(/(?:\r\n|\r|\n)$/g, " ");
4167
4296
  if (formulaString.substring(0, 1) === "=") formulaString = formulaString.substring(1);
4168
4297
  const formulaChars = formulaString.split("");
4169
4298
  const charsCount = formulaChars.length;
@@ -4917,7 +5046,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4917
5046
  for (let j = 0; j < worksheets.length; j++) {
4918
5047
  const worksheet = worksheets[j];
4919
5048
  const cellMatrix = worksheet.getCellMatrix();
4920
- initSheetFormulaData(formulaData, unitId, worksheet.getSheetId(), cellMatrix);
5049
+ const sheetId = worksheet.getSheetId();
5050
+ this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
5051
+ initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
4921
5052
  }
4922
5053
  }
4923
5054
  const allBases = this._univerInstanceService.getAllUnitsForType(UniverInstanceType.UNIVER_BASE);
@@ -4929,7 +5060,6 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4929
5060
  const tables = Object.values(snapshot.tables);
4930
5061
  for (let j = 0; j < tables.length; j++) {
4931
5062
  const table = tables[j];
4932
- if (table.deleted) continue;
4933
5063
  const tableFormulaData = {};
4934
5064
  const recordOrder = table.recordOrder;
4935
5065
  if (!recordOrder) {
@@ -4938,13 +5068,12 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4938
5068
  }
4939
5069
  for (let row = 0; row < recordOrder.length; row++) {
4940
5070
  const recordId = recordOrder[row];
4941
- const record = table.records[recordId];
4942
- if (!record || record.deleted) continue;
5071
+ if (!table.records[recordId]) continue;
4943
5072
  for (let col = 0; col < table.fieldOrder.length; col++) {
4944
5073
  var _field$config$formula, _field$config, _row, _tableFormulaData$_ro;
4945
5074
  const fieldId = table.fieldOrder[col];
4946
5075
  const field = table.fields[fieldId];
4947
- if (!field || field.deleted || field.type !== "formula") continue;
5076
+ if (!field || field.type !== "formula") continue;
4948
5077
  const formula = String((_field$config$formula = (_field$config = field.config) === null || _field$config === void 0 ? void 0 : _field$config.formula) !== null && _field$config$formula !== void 0 ? _field$config$formula : "").trim();
4949
5078
  if (!formula) continue;
4950
5079
  (_tableFormulaData$_ro = tableFormulaData[_row = row]) !== null && _tableFormulaData$_ro !== void 0 || (tableFormulaData[_row] = {});
@@ -4966,7 +5095,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4966
5095
  formulaData[unitId] = {};
4967
5096
  const worksheet = workbook.getSheetBySheetId(sheetId);
4968
5097
  if (worksheet == null) return {};
4969
- initSheetFormulaData(formulaData, unitId, sheetId, worksheet.getCellMatrix());
5098
+ const cellMatrix = worksheet.getCellMatrix();
5099
+ this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
5100
+ initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
4970
5101
  return formulaData[unitId][sheetId];
4971
5102
  }
4972
5103
  getArrayFormulaRange() {
@@ -5037,8 +5168,13 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5037
5168
  const allUnitData = {};
5038
5169
  const unitStylesData = {};
5039
5170
  const unitSheetNameMap = {};
5171
+ const unitNameMap = {};
5040
5172
  for (const workbook of unitAllSheet) {
5041
5173
  const unitId = workbook.getUnitId();
5174
+ unitNameMap[unitId] = {
5175
+ name: workbook.name,
5176
+ unitType: UniverInstanceType.UNIVER_SHEET
5177
+ };
5042
5178
  const sheets = workbook.getSheets();
5043
5179
  const sheetData = {};
5044
5180
  const sheetNameMap = {};
@@ -5064,20 +5200,18 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5064
5200
  for (const base of unitAllBases) {
5065
5201
  const snapshot = base.getSnapshot();
5066
5202
  const unitId = base.getUnitId();
5203
+ unitNameMap[unitId] = {
5204
+ name: snapshot.name,
5205
+ unitType: UniverInstanceType.UNIVER_BASE
5206
+ };
5067
5207
  const baseData = {};
5068
5208
  const tableNameMap = {};
5069
- for (const table of Object.values(snapshot.tables).filter((item) => !item.deleted)) {
5070
- var _table$recordOrder$fi, _table$recordOrder;
5209
+ for (const table of Object.values(snapshot.tables)) {
5210
+ var _table$recordOrder$le, _table$recordOrder;
5071
5211
  baseData[table.id] = {
5072
5212
  cellData: new ObjectMatrix(buildBaseRuntimeCellData(table)),
5073
- rowCount: (_table$recordOrder$fi = (_table$recordOrder = table.recordOrder) === null || _table$recordOrder === void 0 ? void 0 : _table$recordOrder.filter((recordId) => {
5074
- var _table$records$record;
5075
- return !((_table$records$record = table.records[recordId]) === null || _table$records$record === void 0 ? void 0 : _table$records$record.deleted);
5076
- }).length) !== null && _table$recordOrder$fi !== void 0 ? _table$recordOrder$fi : 0,
5077
- columnCount: table.fieldOrder.filter((fieldId) => {
5078
- var _table$fields$fieldId;
5079
- return !((_table$fields$fieldId = table.fields[fieldId]) === null || _table$fields$fieldId === void 0 ? void 0 : _table$fields$fieldId.deleted);
5080
- }).length,
5213
+ rowCount: (_table$recordOrder$le = (_table$recordOrder = table.recordOrder) === null || _table$recordOrder === void 0 ? void 0 : _table$recordOrder.length) !== null && _table$recordOrder$le !== void 0 ? _table$recordOrder$le : 0,
5214
+ columnCount: table.fieldOrder.length,
5081
5215
  rowData: {},
5082
5216
  columnData: {}
5083
5217
  };
@@ -5090,7 +5224,8 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5090
5224
  return {
5091
5225
  allUnitData,
5092
5226
  unitStylesData,
5093
- unitSheetNameMap
5227
+ unitSheetNameMap,
5228
+ unitNameMap
5094
5229
  };
5095
5230
  }
5096
5231
  /**
@@ -5118,18 +5253,51 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5118
5253
  return rowData;
5119
5254
  }
5120
5255
  updateFormulaData(unitId, sheetId, cellValue) {
5256
+ var _this$_univerInstance, _formulaData$unitId$s, _formulaData$unitId;
5121
5257
  const cellMatrix = new ObjectMatrix(cellValue);
5122
- const formulaIdMap = this._getSheetFormulaIdMap(unitId, sheetId);
5123
- const deleteFormulaIdMap = /* @__PURE__ */ new Map();
5124
- const formulaData = this.getFormulaData();
5125
- if (formulaData[unitId] == null) formulaData[unitId] = {};
5126
- const workbookFormulaData = formulaData[unitId];
5127
- if (workbookFormulaData[sheetId] == null) workbookFormulaData[sheetId] = {};
5128
- const sheetFormulaDataMatrix = new ObjectMatrix(workbookFormulaData[sheetId] || {});
5129
5258
  const newSheetFormulaDataMatrix = new ObjectMatrix();
5259
+ const worksheetCellMatrix = (_this$_univerInstance = this._univerInstanceService.getUnit(unitId)) === null || _this$_univerInstance === void 0 || (_this$_univerInstance = _this$_univerInstance.getSheetBySheetId(sheetId)) === null || _this$_univerInstance === void 0 ? void 0 : _this$_univerInstance.getCellMatrix();
5260
+ const affectedFormulaIds = /* @__PURE__ */ new Set();
5261
+ cellMatrix.forValue((r, c, cell) => {
5262
+ const currentCell = worksheetCellMatrix === null || worksheetCellMatrix === void 0 ? void 0 : worksheetCellMatrix.getValue(r, c);
5263
+ const currentFormulaId = currentCell === null || currentCell === void 0 ? void 0 : currentCell.si;
5264
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5265
+ const hasCurrentFormulaId = isFormulaId(currentFormulaId);
5266
+ const hasFormulaId = isFormulaId(formulaId);
5267
+ const formulaString = cell === null || cell === void 0 ? void 0 : cell.f;
5268
+ if (hasCurrentFormulaId) affectedFormulaIds.add(String(currentFormulaId));
5269
+ if (hasFormulaId) affectedFormulaIds.add(String(formulaId));
5270
+ if (!hasCurrentFormulaId && !hasFormulaId) {
5271
+ if (typeof formulaString === "string" && isFormulaString(formulaString)) newSheetFormulaDataMatrix.setValue(r, c, { f: formulaString });
5272
+ else if (isFormulaString(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f)) newSheetFormulaDataMatrix.setValue(r, c, null);
5273
+ }
5274
+ });
5275
+ if (affectedFormulaIds.size === 0) return newSheetFormulaDataMatrix.getMatrix();
5276
+ const formulaIdMap = {};
5277
+ const sharedFormulaCellMatrix = new ObjectMatrix();
5278
+ worksheetCellMatrix === null || worksheetCellMatrix === void 0 || worksheetCellMatrix.forValue((r, c, cell) => {
5279
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5280
+ if (!isFormulaId(formulaId) || !affectedFormulaIds.has(String(formulaId))) return;
5281
+ sharedFormulaCellMatrix.setValue(r, c, cell);
5282
+ if (typeof (cell === null || cell === void 0 ? void 0 : cell.f) === "string" && isFormulaString(cell.f)) formulaIdMap[String(formulaId)] = {
5283
+ f: cell.f,
5284
+ r,
5285
+ c
5286
+ };
5287
+ });
5288
+ const formulaData = {};
5289
+ initSheetFormulaData(formulaData, unitId, sheetId, sharedFormulaCellMatrix);
5290
+ const deleteFormulaIdMap = /* @__PURE__ */ new Map();
5291
+ const sheetFormulaDataMatrix = new ObjectMatrix((_formulaData$unitId$s = (_formulaData$unitId = formulaData[unitId]) === null || _formulaData$unitId === void 0 ? void 0 : _formulaData$unitId[sheetId]) !== null && _formulaData$unitId$s !== void 0 ? _formulaData$unitId$s : {});
5130
5292
  cellMatrix.forValue((r, c, cell) => {
5293
+ var _worksheetCellMatrix$;
5294
+ if (!isFormulaId(worksheetCellMatrix === null || worksheetCellMatrix === void 0 || (_worksheetCellMatrix$ = worksheetCellMatrix.getValue(r, c)) === null || _worksheetCellMatrix$ === void 0 ? void 0 : _worksheetCellMatrix$.si) && !isFormulaId(cell === null || cell === void 0 ? void 0 : cell.si)) return;
5131
5295
  updateFormulaDataByCellValue(sheetFormulaDataMatrix, newSheetFormulaDataMatrix, formulaIdMap, deleteFormulaIdMap, r, c, cell);
5132
5296
  });
5297
+ this._rebindSharedFormulaData(sheetFormulaDataMatrix, newSheetFormulaDataMatrix, formulaIdMap, deleteFormulaIdMap);
5298
+ return newSheetFormulaDataMatrix.getMatrix();
5299
+ }
5300
+ _rebindSharedFormulaData(sheetFormulaDataMatrix, newSheetFormulaDataMatrix, formulaIdMap, deleteFormulaIdMap) {
5133
5301
  sheetFormulaDataMatrix.forValue((r, c, cell) => {
5134
5302
  const formulaString = (cell === null || cell === void 0 ? void 0 : cell.f) || "";
5135
5303
  const formulaId = (cell === null || cell === void 0 ? void 0 : cell.si) || "";
@@ -5187,7 +5355,6 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5187
5355
  }
5188
5356
  }
5189
5357
  });
5190
- return newSheetFormulaDataMatrix.getMatrix();
5191
5358
  }
5192
5359
  updateArrayFormulaRange(unitId, sheetId, cellValue) {
5193
5360
  var _this$_arrayFormulaRa5;
@@ -5263,7 +5430,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5263
5430
  for (const unitId in formulaData) {
5264
5431
  const workbook = formulaData[unitId];
5265
5432
  if (!workbook) continue;
5266
- const workbookInstance = this._univerInstanceService.getUnit(unitId);
5433
+ const workbookInstance = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET);
5267
5434
  if (!workbookInstance) continue;
5268
5435
  for (const sheetId in workbook) {
5269
5436
  const sheet = workbook[sheetId];
@@ -5277,7 +5444,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5277
5444
  const column = Number(columnStr);
5278
5445
  const currentCell = sheetInstance.getCellRaw(row, column);
5279
5446
  const isFormula = isFormulaString(currentCell === null || currentCell === void 0 ? void 0 : currentCell.f) || isFormulaId(currentCell === null || currentCell === void 0 ? void 0 : currentCell.si);
5280
- const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === "" || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === "0";
5447
+ const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null;
5281
5448
  if (!(isFormula && noValue)) continue;
5282
5449
  if (!columnRanges[column]) columnRanges[column] = [];
5283
5450
  const lastRange = columnRanges[column].slice(-1)[0];
@@ -5309,22 +5476,38 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5309
5476
  }
5310
5477
  return dirtyRanges;
5311
5478
  }
5312
- _getSheetFormulaIdMap(unitId, sheetId) {
5313
- const formulaIdMap = {};
5314
- const workbook = this._univerInstanceService.getUnit(unitId);
5315
- if (workbook == null) return formulaIdMap;
5316
- const worksheet = workbook.getSheetBySheetId(sheetId);
5317
- if (worksheet == null) return formulaIdMap;
5318
- worksheet.getCellMatrix().forValue((r, c, cell) => {
5319
- if (cell == null) return true;
5320
- const { f, si } = cell;
5321
- if (isFormulaString(f) && isFormulaId(si)) formulaIdMap[si] = {
5322
- f,
5323
- r,
5324
- c
5325
- };
5479
+ _initSheetArrayFormulaData(unitId, sheetId, cellMatrix) {
5480
+ let arrayFormulaRangeMatrix;
5481
+ let arrayFormulaCellDataMatrix;
5482
+ const formulaIds = /* @__PURE__ */ new Set();
5483
+ cellMatrix.forValue((_, __, cell) => {
5484
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5485
+ if (isFormulaString(cell === null || cell === void 0 ? void 0 : cell.f) && isFormulaId(formulaId)) formulaIds.add(String(formulaId));
5486
+ });
5487
+ cellMatrix.forValue((row, column, cell) => {
5488
+ var _arrayFormulaRangeMat, _this$_arrayFormulaRa7, _arrayFormulaCellData, _this$_arrayFormulaCe5;
5489
+ const ref = cell === null || cell === void 0 ? void 0 : cell.ref;
5490
+ const formula = cell === null || cell === void 0 ? void 0 : cell.f;
5491
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5492
+ const hasOwnFormula = isFormulaString(formula);
5493
+ const hasSharedFormula = isFormulaId(formulaId) && formulaIds.has(String(formulaId));
5494
+ if (!hasOwnFormula && !hasSharedFormula || typeof ref !== "string" || ref.length === 0) return true;
5495
+ const { range } = deserializeRangeWithSheet(ref);
5496
+ if (!Number.isFinite(range.startRow) || !Number.isFinite(range.startColumn) || !Number.isFinite(range.endRow) || !Number.isFinite(range.endColumn)) return true;
5497
+ if (range.startRow === row && range.endRow === row && range.startColumn === column && range.endColumn === column && !isArrayConstantFormula(formula)) return true;
5498
+ if (!this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId] = {};
5499
+ if (!this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId] = {};
5500
+ (_arrayFormulaRangeMat = arrayFormulaRangeMatrix) !== null && _arrayFormulaRangeMat !== void 0 || (arrayFormulaRangeMatrix = new ObjectMatrix((_this$_arrayFormulaRa7 = this._arrayFormulaRange[unitId]) === null || _this$_arrayFormulaRa7 === void 0 ? void 0 : _this$_arrayFormulaRa7[sheetId]));
5501
+ (_arrayFormulaCellData = arrayFormulaCellDataMatrix) !== null && _arrayFormulaCellData !== void 0 || (arrayFormulaCellDataMatrix = new ObjectMatrix((_this$_arrayFormulaCe5 = this._arrayFormulaCellData[unitId]) === null || _this$_arrayFormulaCe5 === void 0 ? void 0 : _this$_arrayFormulaCe5[sheetId]));
5502
+ if (arrayFormulaRangeMatrix.getValue(row, column) == null) arrayFormulaRangeMatrix.setValue(row, column, range);
5503
+ for (let r = range.startRow; r <= range.endRow; r++) for (let c = range.startColumn; c <= range.endColumn; c++) {
5504
+ if (arrayFormulaCellDataMatrix.getValue(r, c) != null) continue;
5505
+ const rangeCell = cellMatrix.getValue(r, c);
5506
+ if (rangeCell != null) arrayFormulaCellDataMatrix.setValue(r, c, { ...rangeCell });
5507
+ }
5326
5508
  });
5327
- return formulaIdMap;
5509
+ if (arrayFormulaRangeMatrix && this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId][sheetId] = arrayFormulaRangeMatrix.getData();
5510
+ if (arrayFormulaCellDataMatrix && this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId][sheetId] = arrayFormulaCellDataMatrix.getData();
5328
5511
  }
5329
5512
  };
5330
5513
  FormulaDataModel = __decorate([__decorateParam(0, IUniverInstanceService), __decorateParam(1, Inject(LexerTreeBuilder))], FormulaDataModel);
@@ -5360,9 +5543,9 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
5360
5543
  if (isFormulaId(formulaId) && !isFormulaString(formulaString)) {
5361
5544
  const formulaInfo = formulaIdMap.get(formulaId);
5362
5545
  if (formulaInfo) {
5363
- const f = formulaInfo.f;
5364
5546
  const x = c - formulaInfo.c;
5365
5547
  const y = r - formulaInfo.r;
5548
+ const f = formulaInfo.f;
5366
5549
  sheetFormulaDataMatrix.setValue(r, c, {
5367
5550
  f,
5368
5551
  si: formulaId,
@@ -5378,12 +5561,13 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
5378
5561
  const BASE_LEGACY_FIELD_REF_PATTERN = /\{([^}]+)\}/g;
5379
5562
  const BASE_TABLE_FIELD_REF_PATTERN = /\b([A-Z_]\w*)\[([^\]]+)\]/gi;
5380
5563
  const BASE_BRACKET_FIELD_REF_PATTERN = /(^|[^A-Za-z0-9_\]\[])\[([^\]]+)\]/g;
5564
+ const BASE_EXTERNAL_A1_REF_PATTERN = /(?:'\[[^\]]+\](?:[^']|'')+'|\[[^\]]+\][^\s'!]+)!\$?[A-Z]{1,3}\$?\d+(?::\$?[A-Z]{1,3}\$?\d+)?/gi;
5381
5565
  function normalizeBaseFormulaForEngine(formula, currentTable, snapshot) {
5382
5566
  const refs = [];
5383
5567
  const hold = (ref) => {
5384
5568
  return `__BASE_FORMULA_REF_${refs.push(ref) - 1}__`;
5385
5569
  };
5386
- return formula.replace(BASE_LEGACY_FIELD_REF_PATTERN, (_match, fieldName) => hold(createEngineThisRowRef(currentTable, fieldName, snapshot))).replace(BASE_TABLE_FIELD_REF_PATTERN, (_match, sourceTableName, fieldName) => {
5570
+ return formula.replace(BASE_EXTERNAL_A1_REF_PATTERN, (reference) => hold(reference)).replace(BASE_LEGACY_FIELD_REF_PATTERN, (_match, fieldName) => hold(createEngineThisRowRef(currentTable, fieldName, snapshot))).replace(BASE_TABLE_FIELD_REF_PATTERN, (_match, sourceTableName, fieldName) => {
5387
5571
  const targetTable = resolveBaseFormulaTable(sourceTableName, currentTable, snapshot);
5388
5572
  return targetTable ? hold(createEngineThisRowRef(targetTable, fieldName, snapshot)) : `${sourceTableName}[${fieldName}]`;
5389
5573
  }).replace(BASE_BRACKET_FIELD_REF_PATTERN, (_match, prefix, fieldName) => `${prefix}${hold(createEngineThisRowRef(currentTable, fieldName, snapshot))}`).replace(/__BASE_FORMULA_REF_(\d+)__/g, (_match, index) => {
@@ -5397,12 +5581,9 @@ function createEngineThisRowRef(table, fieldName, snapshot) {
5397
5581
  function getEngineBaseTableName(table, snapshot) {
5398
5582
  const tables = Object.values(snapshot.tables);
5399
5583
  let sameNameCount = 0;
5400
- for (let i = 0; i < tables.length; i++) {
5401
- const item = tables[i];
5402
- if (!item.deleted && item.name === table.name) {
5403
- sameNameCount++;
5404
- if (sameNameCount > 1) break;
5405
- }
5584
+ for (let i = 0; i < tables.length; i++) if (tables[i].name === table.name) {
5585
+ sameNameCount++;
5586
+ if (sameNameCount > 1) break;
5406
5587
  }
5407
5588
  return sameNameCount === 1 ? table.name : table.id;
5408
5589
  }
@@ -5411,14 +5592,14 @@ function buildBaseRuntimeCellData(table) {
5411
5592
  const fieldOrder = [];
5412
5593
  for (let i = 0; i < table.fieldOrder.length; i++) {
5413
5594
  const fieldId = table.fieldOrder[i];
5414
- if (table.fields[fieldId] && !table.fields[fieldId].deleted) fieldOrder.push(fieldId);
5595
+ if (table.fields[fieldId]) fieldOrder.push(fieldId);
5415
5596
  }
5416
5597
  let recordOrder;
5417
5598
  if (table.recordOrder) {
5418
5599
  recordOrder = [];
5419
5600
  for (let i = 0; i < table.recordOrder.length; i++) {
5420
5601
  const recordId = table.recordOrder[i];
5421
- if (table.records[recordId] && !table.records[recordId].deleted) recordOrder.push(recordId);
5602
+ if (table.records[recordId]) recordOrder.push(recordId);
5422
5603
  }
5423
5604
  } else {
5424
5605
  var _table$records;
@@ -5426,7 +5607,7 @@ function buildBaseRuntimeCellData(table) {
5426
5607
  const records = [];
5427
5608
  for (let i = 0; i < allRecords.length; i++) {
5428
5609
  const record = allRecords[i];
5429
- if (!record.deleted) records.push(record);
5610
+ records.push(record);
5430
5611
  }
5431
5612
  records.sort((a, b) => a.orderKey.localeCompare(b.orderKey));
5432
5613
  recordOrder = [];
@@ -5438,7 +5619,7 @@ function buildBaseRuntimeCellData(table) {
5438
5619
  for (let row = 0; row < recordOrder.length; row++) {
5439
5620
  const recordId = recordOrder[row];
5440
5621
  const record = table.records[recordId];
5441
- if (!record || record.deleted) continue;
5622
+ if (!record) continue;
5442
5623
  cellData[row] = { ...cellData[row] };
5443
5624
  for (let col = 0; col < fieldOrder.length; col++) {
5444
5625
  var _record$values;
@@ -5490,14 +5671,17 @@ function inferBaseRuntimeCellType(value) {
5490
5671
  if (typeof value === "string") return CellValueType.STRING;
5491
5672
  return null;
5492
5673
  }
5674
+ function isArrayConstantFormula(formula) {
5675
+ return typeof formula === "string" && /^=\s*\{/.test(formula);
5676
+ }
5493
5677
  function isBaseCellData(value) {
5494
5678
  return !!value && typeof value === "object" && (Object.prototype.hasOwnProperty.call(value, "v") || Object.prototype.hasOwnProperty.call(value, "t") || Object.prototype.hasOwnProperty.call(value, "p") || Object.prototype.hasOwnProperty.call(value, "f") || Object.prototype.hasOwnProperty.call(value, "si"));
5495
5679
  }
5496
5680
  function resolveBaseFormulaTable(tableName, currentTable, snapshot) {
5497
5681
  if (!tableName || tableName === "table" || tableName === currentTable.id || tableName === currentTable.name) return currentTable;
5498
5682
  const byId = snapshot.tables[tableName];
5499
- if (byId && !byId.deleted) return byId;
5500
- const matches = Object.values(snapshot.tables).filter((table) => !table.deleted && table.name === tableName);
5683
+ if (byId) return byId;
5684
+ const matches = Object.values(snapshot.tables).filter((table) => table.name === tableName);
5501
5685
  return matches.length === 1 ? matches[0] : void 0;
5502
5686
  }
5503
5687
 
@@ -5549,6 +5733,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5549
5733
  _defineProperty(this, "_arrayFormulaRange", {});
5550
5734
  _defineProperty(this, "_formulaData", {});
5551
5735
  _defineProperty(this, "_sheetNameMap", {});
5736
+ _defineProperty(this, "_unitNameMap", {});
5552
5737
  _defineProperty(this, "_forceCalculate", false);
5553
5738
  _defineProperty(this, "_clearDependencyTreeCache", {});
5554
5739
  _defineProperty(this, "_dirtyRanges", []);
@@ -5570,6 +5755,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5570
5755
  this._arrayFormulaRange = {};
5571
5756
  this._formulaData = {};
5572
5757
  this._sheetNameMap = {};
5758
+ this._unitNameMap = {};
5573
5759
  this._clearDependencyTreeCache = {};
5574
5760
  this._dirtyRanges = [];
5575
5761
  this._dirtyNameMap = {};
@@ -5613,6 +5799,9 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5613
5799
  getSheetNameMap() {
5614
5800
  return this._sheetNameMap;
5615
5801
  }
5802
+ getUnitNameMap() {
5803
+ return this._unitNameMap;
5804
+ }
5616
5805
  isForceCalculate() {
5617
5806
  return this._forceCalculate;
5618
5807
  }
@@ -5678,11 +5867,13 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5678
5867
  this._unitData = config.allUnitData;
5679
5868
  this._unitStylesData = config.unitStylesData;
5680
5869
  this._sheetNameMap = config.unitSheetNameMap;
5870
+ this._unitNameMap = config.unitNameMap || {};
5681
5871
  } else {
5682
- const { allUnitData, unitSheetNameMap, unitStylesData } = this._loadSheetData();
5872
+ const { allUnitData, unitNameMap, unitSheetNameMap, unitStylesData } = this._loadSheetData();
5683
5873
  this._unitData = allUnitData;
5684
5874
  this._unitStylesData = unitStylesData;
5685
5875
  this._sheetNameMap = unitSheetNameMap;
5876
+ this._unitNameMap = unitNameMap;
5686
5877
  }
5687
5878
  if (config.rowData) this._applyUnitRowData(config.rowData);
5688
5879
  this._formulaData = config.formulaData;
@@ -5700,10 +5891,11 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5700
5891
  this._mergeNameMap(this._sheetNameMap, this._dirtyNameMap);
5701
5892
  }
5702
5893
  loadDataLite(rowData) {
5703
- const { allUnitData, unitSheetNameMap, unitStylesData } = this._loadSheetData();
5894
+ const { allUnitData, unitNameMap, unitSheetNameMap, unitStylesData } = this._loadSheetData();
5704
5895
  this._unitData = allUnitData;
5705
5896
  this._unitStylesData = unitStylesData;
5706
5897
  this._sheetNameMap = unitSheetNameMap;
5898
+ this._unitNameMap = unitNameMap;
5707
5899
  this._formulaData = this._formulaDataModel.getFormulaData();
5708
5900
  this._arrayFormulaCellData = convertUnitDataToRuntime(this._formulaDataModel.getArrayFormulaCellData());
5709
5901
  this._arrayFormulaRange = this._formulaDataModel.getArrayFormulaRange();
@@ -5738,6 +5930,9 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5738
5930
  registerSheetNameMap(sheetNameMap) {
5739
5931
  this._sheetNameMap = sheetNameMap;
5740
5932
  }
5933
+ registerUnitNameMap(unitNameMap) {
5934
+ this._unitNameMap = unitNameMap;
5935
+ }
5741
5936
  _mergeNameMap(unitSheetNameMap, dirtyNameMap) {
5742
5937
  Object.keys(dirtyNameMap).forEach((unitId) => {
5743
5938
  if (dirtyNameMap[unitId]) Object.keys(dirtyNameMap[unitId]).forEach((sheetId) => {
@@ -5758,7 +5953,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5758
5953
  const workbook = this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_SHEET);
5759
5954
  const worksheet = workbook === null || workbook === void 0 ? void 0 : workbook.getActiveSheet();
5760
5955
  const base = workbook ? null : this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_BASE);
5761
- const table = base ? getFirstLiveBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
5956
+ const table = base ? getFirstBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
5762
5957
  this._executeUnitId = (_workbook$getUnitId = workbook === null || workbook === void 0 ? void 0 : workbook.getUnitId()) !== null && _workbook$getUnitId !== void 0 ? _workbook$getUnitId : base === null || base === void 0 ? void 0 : base.getUnitId();
5763
5958
  this._executeSubUnitId = (_worksheet$getSheetId = worksheet === null || worksheet === void 0 ? void 0 : worksheet.getSheetId()) !== null && _worksheet$getSheetId !== void 0 ? _worksheet$getSheetId : table === null || table === void 0 ? void 0 : table.id;
5764
5959
  return this._formulaDataModel.getCalculateData();
@@ -5791,33 +5986,18 @@ FormulaCurrentConfigService = __decorate([
5791
5986
  __decorateParam(2, Inject(FormulaDataModel)),
5792
5987
  __decorateParam(3, Inject(ISheetRowFilteredService))
5793
5988
  ], FormulaCurrentConfigService);
5794
- function getFirstLiveBaseTable(tables, tableOrder) {
5795
- var _Object$values$find;
5989
+ function getFirstBaseTable(tables, tableOrder) {
5990
+ var _Object$values$;
5796
5991
  for (const tableId of tableOrder) {
5797
5992
  const table = tables[tableId];
5798
- if (table && !table.deleted) return table;
5993
+ if (table) return table;
5799
5994
  }
5800
- return (_Object$values$find = Object.values(tables).find((table) => !table.deleted)) !== null && _Object$values$find !== void 0 ? _Object$values$find : null;
5995
+ return (_Object$values$ = Object.values(tables)[0]) !== null && _Object$values$ !== void 0 ? _Object$values$ : null;
5801
5996
  }
5802
5997
  const IFormulaCurrentConfigService = createIdentifier("univer.formula.current-data.service");
5803
5998
 
5804
5999
  //#endregion
5805
6000
  //#region src/engine/analysis/lexer.ts
5806
- /**
5807
- * Copyright 2023-present DreamNum Co., Ltd.
5808
- *
5809
- * Licensed under the Apache License, Version 2.0 (the "License");
5810
- * you may not use this file except in compliance with the License.
5811
- * You may obtain a copy of the License at
5812
- *
5813
- * http://www.apache.org/licenses/LICENSE-2.0
5814
- *
5815
- * Unless required by applicable law or agreed to in writing, software
5816
- * distributed under the License is distributed on an "AS IS" BASIS,
5817
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
5818
- * See the License for the specific language governing permissions and
5819
- * limitations under the License.
5820
- */
5821
6001
  let Lexer = class Lexer extends Disposable {
5822
6002
  constructor(_definedNamesService, _lexerTreeBuilder, _formulaCurrentConfigService) {
5823
6003
  super();
@@ -5825,10 +6005,11 @@ let Lexer = class Lexer extends Disposable {
5825
6005
  this._lexerTreeBuilder = _lexerTreeBuilder;
5826
6006
  this._formulaCurrentConfigService = _formulaCurrentConfigService;
5827
6007
  }
5828
- treeBuilder(formulaString, transformSuffix = true) {
6008
+ treeBuilder(formulaString, transformSuffix = true, unitId) {
5829
6009
  if (this._definedNamesService.getAllDefinedNamesIsEmpty()) return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix);
5830
6010
  return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix, {
5831
- unitId: this._formulaCurrentConfigService.getExecuteUnitId(),
6011
+ unitId: unitId !== null && unitId !== void 0 ? unitId : this._formulaCurrentConfigService.getExecuteUnitId(),
6012
+ sheetId: this._formulaCurrentConfigService.getExecuteSubUnitId(),
5832
6013
  getValueByName: this._definedNamesService.getValueByName.bind(this._definedNamesService),
5833
6014
  getDirtyDefinedNameMap: this._formulaCurrentConfigService.getDirtyDefinedNameMap.bind(this._formulaCurrentConfigService),
5834
6015
  getSheetName: this._formulaCurrentConfigService.getSheetName.bind(this._formulaCurrentConfigService)
@@ -5850,10 +6031,13 @@ function getCellValue(cell) {
5850
6031
  const body = cell === null || cell === void 0 ? void 0 : cell.p.body;
5851
6032
  if (body == null) return 0;
5852
6033
  const data = body.dataStream;
5853
- return BuildTextUtils.transform.getPlainText(data);
6034
+ return normalizeRichTextFormulaValue(BuildTextUtils.transform.getPlainText(data));
5854
6035
  }
5855
6036
  return (_cell$v = cell === null || cell === void 0 ? void 0 : cell.v) !== null && _cell$v !== void 0 ? _cell$v : 0;
5856
6037
  }
6038
+ function normalizeRichTextFormulaValue(value) {
6039
+ return value.replace(/\r\n|\r|\n/g, "\r\n");
6040
+ }
5857
6041
  /**
5858
6042
  * Extract the formula error from the cell
5859
6043
  * @param cell
@@ -6092,24 +6276,16 @@ function reverseCompareOperator(operator) {
6092
6276
  Reference https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
6093
6277
  */
6094
6278
  function plus(a, b) {
6095
- const result = a + b;
6096
- if (Number.isSafeInteger(result)) return result;
6097
- return new Decimal(a).add(b).toNumber();
6279
+ return a + b;
6098
6280
  }
6099
6281
  function minus(a, b) {
6100
- const result = a - b;
6101
- if (Number.isSafeInteger(result)) return result;
6102
- return new Decimal(a).sub(b).toNumber();
6282
+ return a - b;
6103
6283
  }
6104
6284
  function multiply(a, b) {
6105
- const result = a * b;
6106
- if (Number.isSafeInteger(result)) return result;
6107
- return new Decimal(a).mul(b).toNumber();
6285
+ return a * b;
6108
6286
  }
6109
6287
  function divide(a, b) {
6110
- const result = a / b;
6111
- if (Number.isSafeInteger(result)) return result;
6112
- return new Decimal(a).div(b).toNumber();
6288
+ return a / b;
6113
6289
  }
6114
6290
  /**
6115
6291
  * Rounds a number to a specified number of decimal places.
@@ -6181,7 +6357,7 @@ function sqrt(base) {
6181
6357
  * @returns True if numbers are equal, false otherwise.
6182
6358
  */
6183
6359
  function equals(a, b) {
6184
- return a === b;
6360
+ return a === b || stripErrorMargin(a) === stripErrorMargin(b);
6185
6361
  }
6186
6362
  /**
6187
6363
  * Checks if the first number is greater than the second number.
@@ -6190,7 +6366,7 @@ function equals(a, b) {
6190
6366
  * @returns True if a is greater than b, false otherwise.
6191
6367
  */
6192
6368
  function greaterThan(a, b) {
6193
- return a > b;
6369
+ return !equals(a, b) && stripErrorMargin(a) > stripErrorMargin(b);
6194
6370
  }
6195
6371
  /**
6196
6372
  * Checks if the first number is greater than or equal to the second number.
@@ -6199,7 +6375,7 @@ function greaterThan(a, b) {
6199
6375
  * @returns True if a is greater than or equal to b, false otherwise.
6200
6376
  */
6201
6377
  function greaterThanOrEquals(a, b) {
6202
- return a >= b;
6378
+ return equals(a, b) || stripErrorMargin(a) > stripErrorMargin(b);
6203
6379
  }
6204
6380
  /**
6205
6381
  * Checks if the first number is less than the second number.
@@ -6208,7 +6384,7 @@ function greaterThanOrEquals(a, b) {
6208
6384
  * @returns True if a is less than b, false otherwise.
6209
6385
  */
6210
6386
  function lessThan(a, b) {
6211
- return a < b;
6387
+ return !equals(a, b) && stripErrorMargin(a) < stripErrorMargin(b);
6212
6388
  }
6213
6389
  /**
6214
6390
  * Checks if the first number is less than or equal to the second number.
@@ -6217,7 +6393,7 @@ function lessThan(a, b) {
6217
6393
  * @returns True if a is less than or equal to b, false otherwise.
6218
6394
  */
6219
6395
  function lessThanOrEquals(a, b) {
6220
- return a <= b;
6396
+ return equals(a, b) || stripErrorMargin(a) < stripErrorMargin(b);
6221
6397
  }
6222
6398
  /**
6223
6399
  * Complete the number to the specified accuracy and solve the accuracy error,
@@ -6485,8 +6661,8 @@ var BooleanValueObject = class BooleanValueObject extends BaseValueObject {
6485
6661
  case ">=": return true;
6486
6662
  case "=":
6487
6663
  case "<":
6488
- case "<=":
6489
- case "<>": return false;
6664
+ case "<=": return false;
6665
+ case "<>": return true;
6490
6666
  }
6491
6667
  }
6492
6668
  concatenateFront(valueObject) {
@@ -7108,12 +7284,13 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
7108
7284
  return BooleanValueObject.create(result);
7109
7285
  }
7110
7286
  _compareString(currentValue, value, operator) {
7287
+ const compareResult = currentValue.localeCompare(value);
7111
7288
  switch (operator) {
7112
7289
  case "=": return currentValue === value;
7113
- case ">": return currentValue > value;
7114
- case ">=": return currentValue >= value;
7115
- case "<": return currentValue < value;
7116
- case "<=": return currentValue <= value;
7290
+ case ">": return compareResult > 0;
7291
+ case ">=": return currentValue === value || compareResult > 0;
7292
+ case "<": return compareResult < 0;
7293
+ case "<=": return currentValue === value || compareResult < 0;
7117
7294
  case "<>": return currentValue !== value;
7118
7295
  }
7119
7296
  }
@@ -7139,6 +7316,7 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
7139
7316
  }
7140
7317
  convertToNumberObjectValue() {
7141
7318
  const rawValue = this.getValue();
7319
+ if (rawValue.trim() === "") return ErrorValueObject.create("#VALUE!");
7142
7320
  const parseData = getNumfmtParseValueFilter(rawValue);
7143
7321
  if (parseData && parseData.z) return createNumberValueObjectByRawValue(parseData.v, parseData.z);
7144
7322
  return createNumberValueObjectByRawValue(rawValue);
@@ -7247,6 +7425,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7247
7425
  _defineProperty(this, "_sheetId", "");
7248
7426
  _defineProperty(this, "_currentRow", -1);
7249
7427
  _defineProperty(this, "_currentColumn", -1);
7428
+ _defineProperty(this, "_useInvertedIndexCache", false);
7429
+ _defineProperty(this, "_legacyImplicitForAggregate", false);
7250
7430
  _defineProperty(this, "_sliceCache", /* @__PURE__ */ new Map());
7251
7431
  _defineProperty(this, "_flattenCache", void 0);
7252
7432
  _defineProperty(this, "_defaultValue", null);
@@ -7298,6 +7478,15 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7298
7478
  getCurrentColumn() {
7299
7479
  return this._currentColumn;
7300
7480
  }
7481
+ usesInvertedIndexCache() {
7482
+ return this._useInvertedIndexCache;
7483
+ }
7484
+ usesLegacyImplicitForAggregate() {
7485
+ return this._legacyImplicitForAggregate;
7486
+ }
7487
+ setLegacyImplicitForAggregate(value) {
7488
+ this._legacyImplicitForAggregate = value;
7489
+ }
7301
7490
  getArrayValue() {
7302
7491
  return this._values;
7303
7492
  }
@@ -7564,6 +7753,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7564
7753
  if (itemValue == null || itemValue.isNull()) return true;
7565
7754
  let matchObject;
7566
7755
  if (isFuzzyMatching === true) matchObject = itemValue.compare(valueObject, "=");
7756
+ else if (searchType === 0 && itemValue.isNumber() && valueObject.isNumber()) matchObject = BooleanValueObject.create(Number(itemValue.getValue()) === Number(valueObject.getValue()));
7567
7757
  else matchObject = itemValue.isEqual(valueObject);
7568
7758
  if ((matchObject === null || matchObject === void 0 ? void 0 : matchObject.getValue()) === true) {
7569
7759
  result = itemValue;
@@ -7686,7 +7876,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7686
7876
  return false;
7687
7877
  }
7688
7878
  if (valueObject.isString() || valueObject.isNull() || valueObject.isBoolean()) return true;
7689
- if (accumulatorAll.isLessThan(valueObject).getValue()) accumulatorAll = valueObject;
7879
+ if (Number(accumulatorAll.getValue()) < Number(valueObject.getValue())) accumulatorAll = valueObject;
7690
7880
  });
7691
7881
  return accumulatorAll;
7692
7882
  }
@@ -7727,7 +7917,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7727
7917
  return accumulatorAll;
7728
7918
  }
7729
7919
  getNegative() {
7730
- return ArrayValueObject.create("{0}").minus(this);
7920
+ return this.mapValue((valueObject) => NumberValueObject.create(0).minus(valueObject));
7731
7921
  }
7732
7922
  getReciprocal() {
7733
7923
  return ArrayValueObject.create("{1}").divided(this);
@@ -7779,12 +7969,10 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7779
7969
  for (let c = 0; c < columnCount; c++) {
7780
7970
  var _this$_values;
7781
7971
  const row = (_this$_values = this._values) === null || _this$_values === void 0 ? void 0 : _this$_values[r];
7782
- if (row == null) rowList[c] = ErrorValueObject.create("#VALUE!");
7783
- else {
7784
- const currentValue = row[c] || this._defaultValue;
7785
- if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
7786
- else rowList[c] = NullValueObject.create();
7787
- }
7972
+ const currentValue = this.getValueOrDefault(r, c);
7973
+ if (row == null && currentValue == null) rowList[c] = ErrorValueObject.create("#VALUE!");
7974
+ else if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
7975
+ else rowList[c] = NullValueObject.create();
7788
7976
  }
7789
7977
  result.push(rowList);
7790
7978
  }
@@ -8094,7 +8282,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8094
8282
  * If comparison operations are conducted for a single numerical value,
8095
8283
  * then retrieve the judgment from the inverted index. This enhances performance.
8096
8284
  */
8097
- if (batchOperatorType === 5) {
8285
+ if (batchOperatorType === 5 && this._useInvertedIndexCache) {
8098
8286
  const { rowsInCache, rowsNotInCache } = CELL_INVERTED_INDEX_CACHE.canUseCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8099
8287
  if (rowsInCache.length > 0) {
8100
8288
  if (operator === "=" && !(valueObject.isString() && isWildcard(valueObject.getValue()))) {
@@ -8128,13 +8316,13 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8128
8316
  if (rowsNotInCache.length > 0) for (const interval of rowsNotInCache) {
8129
8317
  const [start, end] = interval;
8130
8318
  for (let r = start; r <= end; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r - startRow, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
8131
- CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
8319
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
8132
8320
  }
8133
8321
  return;
8134
8322
  }
8135
8323
  }
8136
8324
  for (let r = 0; r < rowCount; r++) this.__batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive);
8137
- CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8325
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8138
8326
  }
8139
8327
  __batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive) {
8140
8328
  const currentValue = this.getValueOrDefault(r, column);
@@ -8184,7 +8372,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8184
8372
  break;
8185
8373
  }
8186
8374
  else result[r][column] = ErrorValueObject.create("#N/A");
8187
- CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
8375
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column + startColumn, (currentValue === null || currentValue === void 0 ? void 0 : currentValue.isNull()) ? null : currentValue === null || currentValue === void 0 ? void 0 : currentValue.getValue(), r + startRow);
8188
8376
  }
8189
8377
  _batchOperatorArray(valueObject, batchOperatorType, operator, isCaseSensitive) {
8190
8378
  let rowCount = valueObject.getRowCount();
@@ -8255,7 +8443,9 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8255
8443
  }
8256
8444
  result.push(rowList);
8257
8445
  }
8258
- return this._createNewArray(result, rowCount, columnCount);
8446
+ const newArray = this._createNewArray(result, rowCount, columnCount);
8447
+ if (batchOperatorType === 1) newArray.setLegacyImplicitForAggregate(true);
8448
+ return newArray;
8259
8449
  }
8260
8450
  _checkArrayCalculateType(valueObject) {
8261
8451
  if (valueObject.getRowCount() === 1 && valueObject.getColumnCount() === 1) return 3;
@@ -8272,6 +8462,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8272
8462
  this._sheetId = rawValue.sheetId;
8273
8463
  this._currentRow = rawValue.row;
8274
8464
  this._currentColumn = rawValue.column;
8465
+ this._useInvertedIndexCache = rawValue.useInvertedIndexCache === true;
8466
+ this._legacyImplicitForAggregate = rawValue.legacyImplicitForAggregate === true;
8275
8467
  return rawValue.calculateValueList;
8276
8468
  }
8277
8469
  rawValue = rawValue.slice(1, -1);
@@ -8294,7 +8486,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8294
8486
  this._columnCount = maxColumnCount;
8295
8487
  return result;
8296
8488
  }
8297
- _createNewArray(result, rowCount, columnCount, row = -1, column = -1) {
8489
+ _createNewArray(result, rowCount, columnCount, row = this._currentRow, column = this._currentColumn) {
8298
8490
  if (this._currentColumn === -1 || this._currentRow === -1) {
8299
8491
  row = -1;
8300
8492
  column = -1;
@@ -8359,6 +8551,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8359
8551
  _defineProperty(this, "_filteredOutRows", []);
8360
8552
  _defineProperty(this, "_defaultUnitId", "");
8361
8553
  _defineProperty(this, "_forcedUnitId", "");
8554
+ _defineProperty(this, "_unitQualifier", "");
8362
8555
  _defineProperty(this, "_runtimeData", {});
8363
8556
  _defineProperty(this, "_arrayFormulaCellData", {});
8364
8557
  _defineProperty(this, "_arrayFormulaRange", {});
@@ -8410,14 +8603,14 @@ var BaseReferenceObject = class extends ObjectClassType {
8410
8603
  }
8411
8604
  iterator(callback) {
8412
8605
  const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
8413
- if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#VALUE!"), startRow, startColumn);
8606
+ if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#REF!"), startRow, startColumn);
8414
8607
  const unitId = this._forcedUnitId || this._defaultUnitId;
8415
8608
  const sheetId = this._forcedSheetId || this._defaultSheetId;
8416
8609
  for (let r = startRow; r <= endRow; r++) for (let c = startColumn; c <= endColumn; c++) {
8417
8610
  if (r < 0 || c < 0) return callback(ErrorValueObject.create("#REF!"), r, c);
8418
8611
  const cell = this.getCellData(r, c);
8419
8612
  let result = false;
8420
- if (isNullCell(cell)) {
8613
+ if (isNullCell(cell) && !isTypedEmptyStringCell(cell)) {
8421
8614
  result = callback(null, r, c);
8422
8615
  continue;
8423
8616
  }
@@ -8434,7 +8627,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8434
8627
  }
8435
8628
  }
8436
8629
  getFirstCell() {
8437
- if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#VALUE!");
8630
+ if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#REF!");
8438
8631
  const { startRow, startColumn } = this.getRangePosition();
8439
8632
  const cell = this.getCellData(startRow, startColumn);
8440
8633
  if (!cell) return NumberValueObject.create(0);
@@ -8465,6 +8658,12 @@ var BaseReferenceObject = class extends ObjectClassType {
8465
8658
  setForcedUnitIdDirect(unitId) {
8466
8659
  if (unitId.length > 0) this._forcedUnitId = unitId;
8467
8660
  }
8661
+ setUnitQualifier(unitQualifier) {
8662
+ this._unitQualifier = unitQualifier;
8663
+ }
8664
+ getUnitQualifier() {
8665
+ return this._unitQualifier;
8666
+ }
8468
8667
  getForcedUnitId() {
8469
8668
  return this._forcedUnitId;
8470
8669
  }
@@ -8613,14 +8812,15 @@ var BaseReferenceObject = class extends ObjectClassType {
8613
8812
  }
8614
8813
  getCellValueObject(cell) {
8615
8814
  const value = getCellValue(cell);
8815
+ const cellValueType = Number(cell.t);
8616
8816
  if (ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
8617
- if (cell.t === CellValueType.NUMBER) {
8817
+ if (cellValueType === CellValueType.NUMBER) {
8618
8818
  const pattern = this._getPatternByCell(cell);
8619
8819
  if (isTextFormat(pattern)) return StringValueObject.create(value.toString());
8620
8820
  return createNumberValueObjectByRawValue(value, pattern);
8621
8821
  }
8622
- if (cell.t === CellValueType.STRING || cell.t === CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
8623
- if (cell.t === CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
8822
+ if (cellValueType === CellValueType.STRING || cellValueType === CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
8823
+ if (cellValueType === CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
8624
8824
  return ValueObjectFactory.create(value);
8625
8825
  }
8626
8826
  _getPatternByCell(cell) {
@@ -8696,7 +8896,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8696
8896
  if (!row) row = rangeData.startRow;
8697
8897
  if (!column) column = rangeData.startColumn;
8698
8898
  const cell = this.getCellData(row, column);
8699
- if (!cell) return ErrorValueObject.create("#VALUE!");
8899
+ if (!cell) return NullValueObject.create();
8700
8900
  return this.getCellValueObject(cell);
8701
8901
  }
8702
8902
  setCurrentRowAndColumn(row, column) {
@@ -8750,7 +8950,8 @@ var BaseReferenceObject = class extends ObjectClassType {
8750
8950
  unitId: this.getUnitId(),
8751
8951
  sheetId: this.getSheetId(),
8752
8952
  row: startRow,
8753
- column: startColumn
8953
+ column: startColumn,
8954
+ useInvertedIndexCache: true
8754
8955
  };
8755
8956
  const arrayValueObject = ArrayValueObject.create(arrayValueObjectData);
8756
8957
  useCache && FORMULA_REF_TO_ARRAY_CACHE.set(key, arrayValueObject);
@@ -8780,6 +8981,9 @@ var BaseReferenceObject = class extends ObjectClassType {
8780
8981
  return ArrayValueObject.create(arrayValueObjectData);
8781
8982
  }
8782
8983
  };
8984
+ function isTypedEmptyStringCell(cell) {
8985
+ return (cell === null || cell === void 0 ? void 0 : cell.v) === "" && (cell.t === CellValueType.STRING || cell.t === CellValueType.FORCE_STRING);
8986
+ }
8783
8987
  var AsyncObject = class extends ObjectClassType {
8784
8988
  constructor(_promise) {
8785
8989
  super();
@@ -8841,10 +9045,13 @@ var RangeReferenceObject = class extends BaseReferenceObject {
8841
9045
 
8842
9046
  //#endregion
8843
9047
  //#region src/engine/reference-object/cell-reference-object.ts
9048
+ const EXCEL_MAX_ROWS = 1048576;
9049
+ const EXCEL_MAX_COLUMNS = 16384;
8844
9050
  var CellReferenceObject = class extends BaseReferenceObject {
8845
9051
  constructor(token) {
8846
9052
  super(token);
8847
9053
  const grid = deserializeRangeWithSheetWithCache(token);
9054
+ this.setUnitQualifier(grid.unitId);
8848
9055
  this.setForcedUnitIdDirect(grid.unitId);
8849
9056
  this.setForcedSheetName(grid.sheetName);
8850
9057
  this.setRangeData(grid.range);
@@ -8852,6 +9059,12 @@ var CellReferenceObject = class extends BaseReferenceObject {
8852
9059
  isCell() {
8853
9060
  return true;
8854
9061
  }
9062
+ isExceedRange() {
9063
+ var _this$getForcedSheetI;
9064
+ if ((this.getForcedSheetId() == null || ((_this$getForcedSheetI = this.getForcedSheetId()) === null || _this$getForcedSheetI === void 0 ? void 0 : _this$getForcedSheetI.length) === 0) && this.getForcedSheetName().length > 0) return true;
9065
+ const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
9066
+ return startRow < 0 || startColumn < 0 || endRow >= EXCEL_MAX_ROWS || endColumn >= EXCEL_MAX_COLUMNS;
9067
+ }
8855
9068
  unionBy(referenceObject) {
8856
9069
  if (!referenceObject.isCell()) return ErrorValueObject.create("#REF!");
8857
9070
  const cellReferenceObject = referenceObject;
@@ -8914,6 +9127,7 @@ var ColumnReferenceObject = class extends BaseReferenceObject {
8914
9127
  constructor(token) {
8915
9128
  super(token);
8916
9129
  const grid = deserializeRangeWithSheetWithCache(token);
9130
+ this.setUnitQualifier(grid.unitId);
8917
9131
  this.setForcedUnitIdDirect(grid.unitId);
8918
9132
  this.setForcedSheetName(grid.sheetName);
8919
9133
  const range = {
@@ -8956,6 +9170,7 @@ var RowReferenceObject = class extends BaseReferenceObject {
8956
9170
  constructor(token) {
8957
9171
  super(token);
8958
9172
  const grid = deserializeRangeWithSheetWithCache(token);
9173
+ this.setUnitQualifier(grid.unitId);
8959
9174
  this.setForcedUnitIdDirect(grid.unitId);
8960
9175
  this.setForcedSheetName(grid.sheetName);
8961
9176
  const range = {
@@ -9335,11 +9550,11 @@ function getPairedRangeAndCriteriaResult(variants, params) {
9335
9550
  result = sum.divided(count);
9336
9551
  } else if (formulaName === "MAXIFS") {
9337
9552
  const picked = targetRange.pick(finalCompareResult);
9338
- if (picked.getColumnCount() === 0) result = ArrayValueObject.create("0");
9553
+ if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
9339
9554
  else result = picked.max();
9340
9555
  } else if (formulaName === "MINIFS") {
9341
9556
  const picked = targetRange.pick(finalCompareResult);
9342
- if (picked.getColumnCount() === 0) result = ArrayValueObject.create("0");
9557
+ if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
9343
9558
  else result = picked.min();
9344
9559
  }
9345
9560
  if (!results[rowIndex]) results[rowIndex] = [];
@@ -9351,13 +9566,25 @@ function getPairedRangeAndCriteriaResult(variants, params) {
9351
9566
  * Two ArrayValueObject of the same type can be compared
9352
9567
  */
9353
9568
  function filterSameValueObjectResult(array, range, criteria) {
9354
- const [operator, criteriaObject] = findCompareToken(`${criteria.getValue()}`);
9569
+ const [operator, criteriaObject] = criteria.isString() ? findCompareToken(`${criteria.getValue()}`) : ["=", criteria];
9355
9570
  return array.mapValue((valueObject, r, c) => {
9356
9571
  const rangeValueObject = range.get(r, c);
9572
+ const isBlankStringCriteria = criteriaObject.isString() && criteriaObject.getValue() === "";
9573
+ if (operator === "<>" && isBlankStringCriteria && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && rangeValueObject.getValue() === "") return BooleanValueObject.create(true);
9574
+ if (criteriaObject.isString() && criteriaObject.getValue() !== "" && (operator === "<" || operator === "<=") && (rangeValueObject == null || rangeValueObject.isNull() || rangeValueObject.isString() && rangeValueObject.getValue() === "")) return BooleanValueObject.create(false);
9575
+ if (criteriaObject.isString() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && (operator === "<" || operator === "<=") && isSameLowerBoundBucket(rangeValueObject.getValue(), criteriaObject.getValue())) return BooleanValueObject.create(false);
9576
+ if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
9577
+ const criteriaNumber = criteriaObject.convertToNumberObjectValue();
9578
+ if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
9579
+ }
9580
+ if (criteriaObject.isNumber() && criteriaObject.isDateFormat() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
9581
+ const rangeNumber = rangeValueObject.convertToNumberObjectValue();
9582
+ if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
9583
+ }
9357
9584
  if (rangeValueObject && isSameValueObjectType(rangeValueObject, criteriaObject)) return valueObject;
9358
9585
  if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isError()) && criteriaObject.isError() && rangeValueObject.getValue() === criteriaObject.getValue()) return BooleanValueObject.create(true);
9359
9586
  /**
9360
- * If the operator is '=' or '<>', we can compare numbers and strings directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
9587
+ * If the operator is '=' or '<>', we can compare string numbers against numeric criteria directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
9361
9588
  * Other operators require both valueObjects to be of the same type.
9362
9589
  * For example:
9363
9590
  * | A1 | B1 |
@@ -9369,10 +9596,6 @@ function filterSameValueObjectResult(array, range, criteria) {
9369
9596
  * =COUNTIF(A1:B1, '<=123') will return 1
9370
9597
  */
9371
9598
  if (operator === "=" || operator === "<>") {
9372
- if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
9373
- const criteriaNumber = criteriaObject.convertToNumberObjectValue();
9374
- if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
9375
- }
9376
9599
  if (criteriaObject.isNumber() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
9377
9600
  const rangeNumber = rangeValueObject.convertToNumberObjectValue();
9378
9601
  if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
@@ -9383,6 +9606,11 @@ function filterSameValueObjectResult(array, range, criteria) {
9383
9606
  return BooleanValueObject.create(false);
9384
9607
  });
9385
9608
  }
9609
+ function isSameLowerBoundBucket(rangeValue, criteriaValue) {
9610
+ const criteriaMatch = criteriaValue.match(/^(\d+)\|/);
9611
+ const rangeMatch = rangeValue.match(/^(\d+)-/);
9612
+ return criteriaMatch != null && rangeMatch != null && criteriaMatch[1] === rangeMatch[1];
9613
+ }
9386
9614
  /**
9387
9615
  * Check if the two valueObjects are of the same type
9388
9616
  * @param left
@@ -9483,6 +9711,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9483
9711
  _defineProperty(this, "_currentColumn", -1);
9484
9712
  _defineProperty(this, "_currentRowCount", Number.NEGATIVE_INFINITY);
9485
9713
  _defineProperty(this, "_currentColumnCount", Number.NEGATIVE_INFINITY);
9714
+ _defineProperty(this, "_functionRefInfoOverrideStack", []);
9486
9715
  _defineProperty(this, "_currentSubUnitId", "");
9487
9716
  _defineProperty(this, "_currentUnitId", "");
9488
9717
  _defineProperty(this, "_runtimeData", {});
@@ -9511,10 +9740,12 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9511
9740
  return this._currentColumn;
9512
9741
  }
9513
9742
  get currentRowCount() {
9514
- return this._currentRowCount;
9743
+ var _this$_functionRefInf, _this$_functionRefInf2;
9744
+ return (_this$_functionRefInf = (_this$_functionRefInf2 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf2 === void 0 ? void 0 : _this$_functionRefInf2.rowCount) !== null && _this$_functionRefInf !== void 0 ? _this$_functionRefInf : this._currentRowCount;
9515
9745
  }
9516
9746
  get currentColumnCount() {
9517
- return this._currentColumnCount;
9747
+ var _this$_functionRefInf3, _this$_functionRefInf4;
9748
+ return (_this$_functionRefInf3 = (_this$_functionRefInf4 = this._functionRefInfoOverrideStack[this._functionRefInfoOverrideStack.length - 1]) === null || _this$_functionRefInf4 === void 0 ? void 0 : _this$_functionRefInf4.columnCount) !== null && _this$_functionRefInf3 !== void 0 ? _this$_functionRefInf3 : this._currentColumnCount;
9518
9749
  }
9519
9750
  get currentSubUnitId() {
9520
9751
  return this._currentSubUnitId;
@@ -9608,6 +9839,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9608
9839
  this._isCycleDependency = false;
9609
9840
  this._totalFormulasToCalculate = 0;
9610
9841
  this._completedFormulasCount = 0;
9842
+ this._functionRefInfoOverrideStack = [];
9611
9843
  this.clearReferenceAndNumberformatCache();
9612
9844
  }
9613
9845
  clearReferenceAndNumberformatCache() {
@@ -9623,6 +9855,15 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9623
9855
  this._currentSubUnitId = sheetId;
9624
9856
  this._currentUnitId = unitId;
9625
9857
  }
9858
+ setFunctionRefInfoOverride(rowCount, columnCount) {
9859
+ this._functionRefInfoOverrideStack.push({
9860
+ rowCount,
9861
+ columnCount
9862
+ });
9863
+ return () => {
9864
+ this._functionRefInfoOverrideStack.pop();
9865
+ };
9866
+ }
9626
9867
  clearFunctionDefinitionPrivacyVar() {
9627
9868
  this._functionDefinitionPrivacyVar.clear();
9628
9869
  }
@@ -9686,13 +9927,22 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9686
9927
  * then it is not treated as an array range and is directly assigned.
9687
9928
  */
9688
9929
  if (startRow === endRow && startColumn === endColumn) {
9689
- const firstCell = objectValueRefOrArray.getFirstCell();
9930
+ const firstCellRaw = objectValueRefOrArray.getFirstCell();
9931
+ const firstCell = firstCellRaw.isNull() ? NumberValueObject.create(0) : firstCellRaw;
9690
9932
  const valueObject = this._getValueObjectOfRuntimeData(firstCell);
9691
9933
  sheetData.setValue(row, column, valueObject);
9692
9934
  clearArrayUnitData.setValue(row, column, valueObject);
9693
9935
  CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, firstCell.getValue(), row, true);
9694
9936
  return;
9695
9937
  }
9938
+ if (this._isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column)) {
9939
+ const errorObject = this._getValueObjectOfRuntimeData(ErrorValueObject.create("#VALUE!"));
9940
+ sheetData.setValue(row, column, errorObject);
9941
+ clearArrayUnitData.setValue(row, column, errorObject);
9942
+ runtimeArrayUnitData.setValue(row, column, errorObject);
9943
+ CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, "#VALUE!", row, true);
9944
+ return;
9945
+ }
9696
9946
  const arrayRange = {
9697
9947
  startRow: row,
9698
9948
  startColumn: column,
@@ -9904,6 +10154,11 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9904
10154
  });
9905
10155
  return isCellOverlapping;
9906
10156
  }
10157
+ _isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column) {
10158
+ var _this$_currentConfigS4;
10159
+ const range = (_this$_currentConfigS4 = this._currentConfigService.getArrayFormulaRange()[unitId]) === null || _this$_currentConfigS4 === void 0 || (_this$_currentConfigS4 = _this$_currentConfigS4[sheetId]) === null || _this$_currentConfigS4 === void 0 || (_this$_currentConfigS4 = _this$_currentConfigS4[row]) === null || _this$_currentConfigS4 === void 0 ? void 0 : _this$_currentConfigS4[column];
10160
+ return range != null && range.startRow === range.endRow && range.startColumn === range.endColumn;
10161
+ }
9907
10162
  _isInArrayFormulaRange(range, r, c) {
9908
10163
  if (range == null) return false;
9909
10164
  const { startRow, startColumn, endRow, endColumn } = range;
@@ -10142,18 +10397,23 @@ const FORMULA_CACHE_LRU_COUNT = 5e3;
10142
10397
  const FORMULA_AST_CACHE = new FormulaAstLRU(FORMULA_CACHE_LRU_COUNT);
10143
10398
  const DIRTY_DEFINED_NAME_SET_CACHE = /* @__PURE__ */ new WeakMap();
10144
10399
  const DIRTY_SUPER_TABLE_PATTERN_CACHE = /* @__PURE__ */ new WeakMap();
10145
- function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService) {
10146
- let astNode = FORMULA_AST_CACHE.get(`${unitId}${formulaString}`);
10147
- const noCache = checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService);
10148
- if (!noCache && astNode && !isDirtyDefinedForNode(astNode, currentConfigService)) return astNode;
10149
- const lexerNode = lexer.treeBuilder(formulaString);
10400
+ function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService, subUnitId) {
10401
+ var _ref;
10402
+ if (subUnitId) {
10403
+ currentConfigService.setExecuteUnitId(unitId);
10404
+ currentConfigService.setExecuteSubUnitId(subUnitId);
10405
+ }
10406
+ const cacheKey = `${unitId}:${(_ref = subUnitId !== null && subUnitId !== void 0 ? subUnitId : currentConfigService.getExecuteSubUnitId()) !== null && _ref !== void 0 ? _ref : ""}:${formulaString}`;
10407
+ let astNode = FORMULA_AST_CACHE.get(cacheKey);
10408
+ if (!(checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService)) && astNode && !isDirtyDefinedForNode(astNode, currentConfigService, unitId)) return astNode;
10409
+ const lexerNode = lexer.treeBuilder(formulaString, true, unitId);
10150
10410
  if (ERROR_TYPE_SET.has(lexerNode)) return ErrorNode.create(lexerNode);
10151
10411
  astNode = astTreeBuilder.parse(lexerNode);
10152
10412
  if (astNode == null) {
10153
10413
  console.error("generateAstNode astNode is null");
10154
10414
  return ErrorNode.create(lexerNode);
10155
10415
  }
10156
- if (!noCache) FORMULA_AST_CACHE.set(`${unitId}${formulaString}`, astNode);
10416
+ FORMULA_AST_CACHE.set(cacheKey, astNode);
10157
10417
  return astNode;
10158
10418
  }
10159
10419
  function checkIsChangedByDefinedName(unitId, formula, currentConfigService) {
@@ -10184,15 +10444,15 @@ function getNormalizedDirtyDefinedNameSet(unitDefinedNameMap) {
10184
10444
  function getDirtySuperTableReferencePattern(unitSuperTableMap) {
10185
10445
  let tableReferencePattern = DIRTY_SUPER_TABLE_PATTERN_CACHE.get(unitSuperTableMap);
10186
10446
  if (tableReferencePattern === void 0) {
10187
- const escapedTableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0).map(escapeRegExp);
10188
- tableReferencePattern = escapedTableNames.length > 0 ? new RegExp(`(^|[^A-Za-z0-9_])(?:${escapedTableNames.join("|")})(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
10447
+ const tableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0);
10448
+ tableReferencePattern = tableNames.length > 0 ? regexp.createRegExpFromSafeFragment(`(^|[^A-Za-z0-9_])${regexp.or(...tableNames)}(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
10189
10449
  DIRTY_SUPER_TABLE_PATTERN_CACHE.set(unitSuperTableMap, tableReferencePattern);
10190
10450
  }
10191
10451
  return tableReferencePattern;
10192
10452
  }
10193
- function isDirtyDefinedForNode(node, currentConfigService) {
10453
+ function isDirtyDefinedForNode(node, currentConfigService, unitId) {
10194
10454
  const definedNameMap = currentConfigService.getDirtyDefinedNameMap();
10195
- const executeUnitId = currentConfigService.getExecuteUnitId();
10455
+ const executeUnitId = unitId;
10196
10456
  if (executeUnitId != null && definedNameMap[executeUnitId] != null) {
10197
10457
  const names = Object.keys(definedNameMap[executeUnitId]);
10198
10458
  for (let i = 0, len = names.length; i < len; i++) {
@@ -10207,7 +10467,7 @@ function includeDefinedName(tree, node, currentConfigService) {
10207
10467
  * Detect whether the dirty map contains a defined name.
10208
10468
  */
10209
10469
  if (node != null) {
10210
- if (isDirtyDefinedForNode(node, currentConfigService)) return true;
10470
+ if (isDirtyDefinedForNode(node, currentConfigService, tree.unitId)) return true;
10211
10471
  }
10212
10472
  return false;
10213
10473
  }
@@ -10286,6 +10546,49 @@ var FunctionService = class extends Disposable {
10286
10546
  }
10287
10547
  };
10288
10548
 
10549
+ //#endregion
10550
+ //#region src/services/unit-reference-resolver.service.ts
10551
+ const IFormulaUnitReferenceResolver = createIdentifier("univer.formula.unit-reference-resolver");
10552
+ const EXCEL_WORKBOOK_EXTENSION = /\.(?:xlsx|xlsm|xlsb|xltx|xltm|xls)$/i;
10553
+ function normalizeFormulaUnitName(name) {
10554
+ return name.replace(EXCEL_WORKBOOK_EXTENSION, "").toLowerCase();
10555
+ }
10556
+ let FormulaUnitReferenceResolver = class FormulaUnitReferenceResolver {
10557
+ constructor(_currentConfigService) {
10558
+ this._currentConfigService = _currentConfigService;
10559
+ }
10560
+ resolve({ hostUnitId, qualifier, referenceKind }) {
10561
+ const unitNameMap = this._currentConfigService.getUnitNameMap();
10562
+ const unitData = this._currentConfigService.getUnitData();
10563
+ const address = qualifier || hostUnitId;
10564
+ const direct = unitNameMap[address];
10565
+ if (direct || unitData[address]) return this._validateReferenceKind(hostUnitId, referenceKind, {
10566
+ unitId: address,
10567
+ unitType: direct === null || direct === void 0 ? void 0 : direct.unitType
10568
+ }, unitNameMap);
10569
+ if (!qualifier) return "#REF!";
10570
+ const namedUnits = Object.entries(unitNameMap).filter(([, item]) => item.name.length > 0);
10571
+ const normalizedQualifier = qualifier.toLowerCase();
10572
+ const exactMatches = namedUnits.filter(([, item]) => item.name.toLowerCase() === normalizedQualifier);
10573
+ const matches = exactMatches.length > 0 ? exactMatches : namedUnits.filter(([, item]) => normalizeFormulaUnitName(item.name) === normalizeFormulaUnitName(qualifier));
10574
+ if (matches.length !== 1) return "#REF!";
10575
+ const [unitId, item] = matches[0];
10576
+ return this._validateReferenceKind(hostUnitId, referenceKind, {
10577
+ unitId,
10578
+ unitType: item.unitType
10579
+ }, unitNameMap);
10580
+ }
10581
+ _validateReferenceKind(hostUnitId, referenceKind, resolution, unitNameMap) {
10582
+ var _unitNameMap$hostUnit;
10583
+ if (referenceKind !== "a1" || resolution.unitId === hostUnitId) return resolution;
10584
+ const hostType = (_unitNameMap$hostUnit = unitNameMap[hostUnitId]) === null || _unitNameMap$hostUnit === void 0 ? void 0 : _unitNameMap$hostUnit.unitType;
10585
+ if (resolution.unitType === UniverInstanceType.UNIVER_BASE) return "#REF!";
10586
+ if (hostType === UniverInstanceType.UNIVER_BASE && resolution.unitType !== UniverInstanceType.UNIVER_SHEET) return "#REF!";
10587
+ return resolution;
10588
+ }
10589
+ };
10590
+ FormulaUnitReferenceResolver = __decorate([__decorateParam(0, IFormulaCurrentConfigService)], FormulaUnitReferenceResolver);
10591
+
10289
10592
  //#endregion
10290
10593
  //#region src/engine/ast-node/prefix-node.ts
10291
10594
  var PrefixNode = class extends BaseAstNode {
@@ -10317,6 +10620,7 @@ var PrefixNode = class extends BaseAstNode {
10317
10620
  if (!value.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
10318
10621
  const currentValue = value;
10319
10622
  if (currentValue.isCell()) return ErrorValueObject.create("#VALUE!");
10623
+ if (this._preserveAtRangeForFormula2LookupArray()) return currentValue;
10320
10624
  const runtimeService = this._runtimeService;
10321
10625
  const currentRow = runtimeService.currentRow || 0;
10322
10626
  const currentColumn = runtimeService.currentColumn || 0;
@@ -10328,6 +10632,22 @@ var PrefixNode = class extends BaseAstNode {
10328
10632
  if (currentValue.isTable()) return currentValue.getCellByPosition(currentRow);
10329
10633
  return ErrorValueObject.create("#VALUE!");
10330
10634
  }
10635
+ _preserveAtRangeForFormula2LookupArray() {
10636
+ let node = this;
10637
+ let parent = node.getParent();
10638
+ let sawCompareOperator = false;
10639
+ while (parent != null) {
10640
+ if (parent.nodeType === 3) sawCompareOperator || (sawCompareOperator = OPERATOR_TOKEN_COMPARE_SET.has(parent.getToken()));
10641
+ if (parent.nodeType === 4) {
10642
+ const functionName = parent.getToken().toUpperCase();
10643
+ if (sawCompareOperator && functionName === "XMATCH") return parent.getChildren().indexOf(node) === 1;
10644
+ return false;
10645
+ }
10646
+ node = parent;
10647
+ parent = parent.getParent();
10648
+ }
10649
+ return false;
10650
+ }
10331
10651
  };
10332
10652
  let PrefixNodeFactory = class PrefixNodeFactory extends BaseAstNodeFactory {
10333
10653
  constructor(_functionService, _runtimeService) {
@@ -10385,58 +10705,62 @@ function prefixHandler(tokenTrimParam, functionService, runtimeService) {
10385
10705
  //#endregion
10386
10706
  //#region src/engine/ast-node/function-node.ts
10387
10707
  var FunctionNode = class extends BaseAstNode {
10388
- constructor(token, _functionExecutor, _currentConfigService, _runtimeService, _definedNamesService, _formulaDataModel) {
10708
+ constructor(token, _functionExecutor, _currentConfigService, _runtimeService, _definedNamesService, _formulaDataModel, _unitReferenceResolver) {
10389
10709
  super(token);
10390
10710
  this._functionExecutor = _functionExecutor;
10391
10711
  this._currentConfigService = _currentConfigService;
10392
10712
  this._runtimeService = _runtimeService;
10393
10713
  this._definedNamesService = _definedNamesService;
10394
10714
  this._formulaDataModel = _formulaDataModel;
10715
+ this._unitReferenceResolver = _unitReferenceResolver;
10395
10716
  if (this._functionExecutor.isAsync()) this.setAsync();
10396
10717
  if (this._functionExecutor.isAddress()) this.setAddress();
10397
10718
  if (this._functionExecutor.needsLocale) this._setLocale();
10398
10719
  if (this._functionExecutor.needsSheetsInfo) this._setSheetsInfo();
10399
10720
  if (this._functionExecutor.needsFormulaDataModel) this._functionExecutor.setFormulaDataModel(this._formulaDataModel);
10721
+ if (this._functionExecutor.needsUnitReferenceResolver) this._functionExecutor.setUnitReferenceResolver(this._unitReferenceResolver);
10400
10722
  }
10401
10723
  get nodeType() {
10402
10724
  return 4;
10403
10725
  }
10404
10726
  async executeAsync() {
10405
- const variants = [];
10406
10727
  const children = this.getChildren();
10407
- const childrenCount = children.length;
10408
10728
  this._compatibility();
10409
- for (let i = 0; i < childrenCount; i++) {
10410
- const object = children[i].getValue();
10411
- if (object == null) continue;
10412
- if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
10413
- else variants.push(object);
10414
- }
10415
- const resultVariant = await this._calculateAsync(variants);
10729
+ const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : await this._calculateAsync(this._collectVariants(children));
10416
10730
  let result;
10417
10731
  if (resultVariant.isAsyncObject() || resultVariant.isAsyncArrayObject()) result = await resultVariant.getValue();
10418
10732
  else result = resultVariant;
10733
+ result = this._normalizeTopLevelLegacyArrayResult(result);
10419
10734
  this._setEmbeddedArrayFormulaToResult(result);
10420
10735
  this._setRefData(result);
10421
10736
  this.setValue(result);
10422
10737
  return Promise.resolve(0);
10423
10738
  }
10424
10739
  execute() {
10425
- const variants = [];
10426
10740
  const children = this.getChildren();
10427
- const childrenCount = children.length;
10428
10741
  this._compatibility();
10742
+ const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : this._calculate(this._collectVariants(children));
10743
+ const result = this._normalizeTopLevelLegacyArrayResult(resultVariant);
10744
+ this._setEmbeddedArrayFormulaToResult(result);
10745
+ this._setRefData(result);
10746
+ this.setValue(result);
10747
+ }
10748
+ _collectVariants(children) {
10749
+ const variants = [];
10750
+ const childrenCount = children.length;
10429
10751
  for (let i = 0; i < childrenCount; i++) {
10430
- const object = children[i].getValue();
10752
+ const object = this._getChildVariant(children[i]);
10431
10753
  if (object == null) continue;
10432
- if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
10433
- if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) variants.push(object.toArrayValueObject());
10434
- else variants.push(object);
10754
+ variants.push(object);
10435
10755
  }
10436
- const resultVariant = this._calculate(variants);
10437
- this._setEmbeddedArrayFormulaToResult(resultVariant);
10438
- this._setRefData(resultVariant);
10439
- this.setValue(resultVariant);
10756
+ return variants;
10757
+ }
10758
+ _getChildVariant(child) {
10759
+ const object = child.getValue();
10760
+ if (object == null) return;
10761
+ if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
10762
+ if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) return object.toArrayValueObject();
10763
+ return object;
10440
10764
  }
10441
10765
  isFunctionExecutorArgumentsIgnoreNumberPattern() {
10442
10766
  return this._functionExecutor.isArgumentsIgnoreNumberPattern();
@@ -10451,6 +10775,14 @@ var FunctionNode = class extends BaseAstNode {
10451
10775
  if (rowCount <= 1 && colCount <= 1) return;
10452
10776
  this._runtimeService.setUnitArrayFormulaEmbeddedMap();
10453
10777
  }
10778
+ _normalizeTopLevelLegacyArrayResult(result) {
10779
+ const parent = this.getParent();
10780
+ const isTopLevel = parent == null || parent.nodeType === 9;
10781
+ if (!this._functionExecutor.returnsLegacyArrayAsScalar || !isTopLevel || !result.isArray()) return result;
10782
+ const array = result;
10783
+ if (array.getRowCount() <= 1 && array.getColumnCount() <= 1) return result;
10784
+ return array.getFirstCell();
10785
+ }
10454
10786
  /**
10455
10787
  * Compatibility handling for special functions.
10456
10788
  */
@@ -10535,6 +10867,16 @@ var FunctionNode = class extends BaseAstNode {
10535
10867
  }
10536
10868
  return resultVariant;
10537
10869
  }
10870
+ _calculateAst(children) {
10871
+ const { minParams, maxParams } = this._functionExecutor;
10872
+ if (minParams !== -1 && maxParams !== -1 && (children.length < minParams || children.length > maxParams)) return ErrorValueObject.create("#N/A");
10873
+ this._setRefInfo();
10874
+ this._handleAddressFunction();
10875
+ return this._functionExecutor.calculateAst(children, (node) => {
10876
+ var _this$_getChildVarian;
10877
+ return (_this$_getChildVarian = this._getChildVariant(node)) !== null && _this$_getChildVarian !== void 0 ? _this$_getChildVarian : null;
10878
+ });
10879
+ }
10538
10880
  async _calculateAsync(variants) {
10539
10881
  const { minParams, maxParams } = this._functionExecutor;
10540
10882
  if (minParams !== -1 && maxParams !== -1 && (variants.length < minParams || variants.length > maxParams)) return ErrorValueObject.create("#N/A");
@@ -10550,15 +10892,15 @@ var FunctionNode = class extends BaseAstNode {
10550
10892
  return resultVariant;
10551
10893
  }
10552
10894
  _setDefinedNamesForFunction() {
10553
- const editorUnitId = this._currentConfigService.getExecuteUnitId();
10895
+ const editorUnitId = this._runtimeService.currentUnitId;
10554
10896
  if (editorUnitId == null) return;
10555
10897
  const definedNames = this._definedNamesService.getDefinedNameMap(editorUnitId);
10556
10898
  if (definedNames == null) return;
10557
10899
  this._functionExecutor.setDefinedNames(definedNames);
10558
10900
  }
10559
10901
  _setRefInfo() {
10560
- const { currentUnitId, currentSubUnitId, currentRow, currentColumn } = this._runtimeService;
10561
- this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn);
10902
+ const { currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount } = this._runtimeService;
10903
+ this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount);
10562
10904
  if (this._functionExecutor.needsSheetRowColumnCount) {
10563
10905
  const { rowCount, columnCount } = this._currentConfigService.getSheetRowColumnCount(currentUnitId, currentSubUnitId);
10564
10906
  this._functionExecutor.setSheetRowColumnCount(rowCount, columnCount);
@@ -10604,7 +10946,7 @@ var ErrorFunctionNode = class extends BaseAstNode {
10604
10946
  }
10605
10947
  };
10606
10948
  let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
10607
- constructor(_functionService, _currentConfigService, _runtimeService, _definedNamesService, _injector, _formulaDataModel) {
10949
+ constructor(_functionService, _currentConfigService, _runtimeService, _definedNamesService, _injector, _formulaDataModel, _unitReferenceResolver) {
10608
10950
  super();
10609
10951
  this._functionService = _functionService;
10610
10952
  this._currentConfigService = _currentConfigService;
@@ -10612,6 +10954,7 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
10612
10954
  this._definedNamesService = _definedNamesService;
10613
10955
  this._injector = _injector;
10614
10956
  this._formulaDataModel = _formulaDataModel;
10957
+ this._unitReferenceResolver = _unitReferenceResolver;
10615
10958
  }
10616
10959
  get zIndex() {
10617
10960
  return NODE_ORDER_MAP.get(4) || 100;
@@ -10622,14 +10965,14 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
10622
10965
  console.error(`No function ${token}`);
10623
10966
  return ErrorNode.create("#NAME?");
10624
10967
  }
10625
- return new FunctionNode(token, functionExecutor, this._currentConfigService, this._runtimeService, this._definedNamesService, this._formulaDataModel);
10968
+ return new FunctionNode(token, functionExecutor, this._currentConfigService, this._runtimeService, this._definedNamesService, this._formulaDataModel, this._unitReferenceResolver);
10626
10969
  }
10627
10970
  checkAndCreateNodeType(param) {
10628
10971
  if (typeof param === "string") return;
10629
10972
  const { tokenTrim, minusPrefixNode, atPrefixNode } = prefixHandler(param.getToken().trim(), this._functionService, this._runtimeService);
10630
10973
  const isColon = this._isParentUnionNode(param);
10631
10974
  if (!Number.isNaN(Number(tokenTrim)) && !isColon) return ErrorNode.create("#VALUE!");
10632
- const tokenTrimUpper = tokenTrim.toUpperCase();
10975
+ const tokenTrimUpper = normalizeFunctionToken(tokenTrim.toUpperCase());
10633
10976
  if (isColon && COLUMN_LIKE_FUNCTION_NAMES.has(tokenTrimUpper)) return;
10634
10977
  if (this._functionService.hasExecutor(tokenTrimUpper)) {
10635
10978
  const functionNode = this.create(tokenTrimUpper);
@@ -10649,8 +10992,18 @@ FunctionNodeFactory = __decorate([
10649
10992
  __decorateParam(2, IFormulaRuntimeService),
10650
10993
  __decorateParam(3, IDefinedNamesService),
10651
10994
  __decorateParam(4, Inject(Injector)),
10652
- __decorateParam(5, Inject(FormulaDataModel))
10995
+ __decorateParam(5, Inject(FormulaDataModel)),
10996
+ __decorateParam(6, IFormulaUnitReferenceResolver)
10653
10997
  ], FunctionNodeFactory);
10998
+ function normalizeFunctionToken(token) {
10999
+ if (token === "REGEXTEST" || token === "_XLFN.REGEXTEST") return "REGEXMATCH";
11000
+ for (const prefix of [
11001
+ "_XLFN.",
11002
+ "_XLWS.",
11003
+ "_XLETA."
11004
+ ]) if (token.startsWith(prefix)) return token.slice(prefix.length);
11005
+ return token;
11006
+ }
10654
11007
 
10655
11008
  //#endregion
10656
11009
  //#region src/engine/interpreter/interpreter.ts
@@ -10701,6 +11054,7 @@ let Interpreter = class Interpreter extends Disposable {
10701
11054
  }
10702
11055
  async _executeAsync(node, refOffsetX = 0, refOffsetY = 0) {
10703
11056
  if (this._runtimeService.isStopExecution()) return Promise.resolve(1);
11057
+ if (await this._executeLazyFunctionAsync(node, refOffsetX, refOffsetY)) return Promise.resolve(0);
10704
11058
  const children = node.getChildren();
10705
11059
  const childrenCount = children.length;
10706
11060
  for (let i = 0; i < childrenCount; i++) {
@@ -10721,6 +11075,7 @@ let Interpreter = class Interpreter extends Disposable {
10721
11075
  }
10722
11076
  _execute(node, refOffsetX = 0, refOffsetY = 0) {
10723
11077
  if (this._runtimeService.isStopExecution()) return 1;
11078
+ if (this._executeLazyFunction(node, refOffsetX, refOffsetY)) return 0;
10724
11079
  const children = node.getChildren();
10725
11080
  const childrenCount = children.length;
10726
11081
  for (let i = 0; i < childrenCount; i++) {
@@ -10738,6 +11093,161 @@ let Interpreter = class Interpreter extends Disposable {
10738
11093
  node.execute();
10739
11094
  return 0;
10740
11095
  }
11096
+ async _executeLazyFunctionAsync(node, refOffsetX, refOffsetY) {
11097
+ if (node.nodeType !== 4) return false;
11098
+ const token = node.getToken().toUpperCase();
11099
+ if (token === "IF") return await this._executeLazyIfAsync(node, refOffsetX, refOffsetY);
11100
+ if (token === "IFERROR") return await this._executeLazyIfErrorAsync(node, refOffsetX, refOffsetY);
11101
+ return false;
11102
+ }
11103
+ _executeLazyFunction(node, refOffsetX, refOffsetY) {
11104
+ if (node.nodeType !== 4) return false;
11105
+ const token = node.getToken().toUpperCase();
11106
+ if (token === "IF") return this._executeLazyIf(node, refOffsetX, refOffsetY);
11107
+ if (token === "IFERROR") return this._executeLazyIfError(node, refOffsetX, refOffsetY);
11108
+ return false;
11109
+ }
11110
+ async _executeLazyIfAsync(node, refOffsetX, refOffsetY) {
11111
+ const children = node.getChildren();
11112
+ if (children.length < 2 || children.length > 3) return false;
11113
+ await this._executeAsync(children[0], refOffsetX, refOffsetY);
11114
+ const condition = children[0].getValue();
11115
+ if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
11116
+ if (condition.isError()) {
11117
+ node.setValue(condition);
11118
+ return true;
11119
+ }
11120
+ const selected = condition.getValue() ? children[1] : children[2];
11121
+ if (selected == null) {
11122
+ node.setValue(BooleanValueObject.create(false));
11123
+ return true;
11124
+ }
11125
+ await this._executeAsync(selected, refOffsetX, refOffsetY);
11126
+ node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
11127
+ return true;
11128
+ }
11129
+ _executeLazyIf(node, refOffsetX, refOffsetY) {
11130
+ const children = node.getChildren();
11131
+ if (children.length < 2 || children.length > 3) return false;
11132
+ this._execute(children[0], refOffsetX, refOffsetY);
11133
+ const condition = children[0].getValue();
11134
+ if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
11135
+ if (condition.isError()) {
11136
+ node.setValue(condition);
11137
+ return true;
11138
+ }
11139
+ const selected = condition.getValue() ? children[1] : children[2];
11140
+ if (selected == null) {
11141
+ node.setValue(BooleanValueObject.create(false));
11142
+ return true;
11143
+ }
11144
+ this._execute(selected, refOffsetX, refOffsetY);
11145
+ node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
11146
+ return true;
11147
+ }
11148
+ async _executeLazyIfErrorAsync(node, refOffsetX, refOffsetY) {
11149
+ var _children$1$getValue;
11150
+ const children = node.getChildren();
11151
+ if (children.length !== 2) return false;
11152
+ await this._executeAsync(children[0], refOffsetX, refOffsetY);
11153
+ const rawValue = children[0].getValue();
11154
+ const value = this._toLazyIfErrorValue(rawValue);
11155
+ if (value == null || value.isArray()) return false;
11156
+ if (!value.isError()) {
11157
+ node.setValue(value);
11158
+ return true;
11159
+ }
11160
+ await this._executeAsync(children[1], refOffsetX, refOffsetY);
11161
+ node.setValue((_children$1$getValue = children[1].getValue()) !== null && _children$1$getValue !== void 0 ? _children$1$getValue : ErrorValueObject.create("#VALUE!"));
11162
+ return true;
11163
+ }
11164
+ _executeLazyIfError(node, refOffsetX, refOffsetY) {
11165
+ var _children$1$getValue2;
11166
+ const children = node.getChildren();
11167
+ if (children.length !== 2) return false;
11168
+ this._execute(children[0], refOffsetX, refOffsetY);
11169
+ const rawValue = children[0].getValue();
11170
+ const value = this._toLazyIfErrorValue(rawValue);
11171
+ if (value == null || value.isArray()) return false;
11172
+ if (!value.isError()) {
11173
+ node.setValue(value);
11174
+ return true;
11175
+ }
11176
+ this._execute(children[1], refOffsetX, refOffsetY);
11177
+ node.setValue((_children$1$getValue2 = children[1].getValue()) !== null && _children$1$getValue2 !== void 0 ? _children$1$getValue2 : ErrorValueObject.create("#VALUE!"));
11178
+ return true;
11179
+ }
11180
+ _toLazyIfErrorValue(value) {
11181
+ if (value == null) return null;
11182
+ if (!value.isReferenceObject()) {
11183
+ const baseValue = value;
11184
+ return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
11185
+ }
11186
+ const reference = value;
11187
+ if (reference.getRowCount() !== 1 || reference.getColumnCount() !== 1) return reference.toArrayValueObject();
11188
+ const cellValue = reference.getCellByPosition();
11189
+ return cellValue.isNull() ? NumberValueObject.create(0) : cellValue;
11190
+ }
11191
+ _toLazyIfSelectedValue(value, node) {
11192
+ if (value == null) return ErrorValueObject.create("#VALUE!");
11193
+ if (value.isReferenceObject()) {
11194
+ const reference = value;
11195
+ if (this._preserveLazyIfSelectedReferenceArray(node)) return reference.toArrayValueObject();
11196
+ value = this._implicitLazyIfReferenceValue(reference);
11197
+ }
11198
+ if (value.isArray()) value = this._implicitLazyIfArrayValue(value);
11199
+ if (!value.isArray()) {
11200
+ const baseValue = value;
11201
+ return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
11202
+ }
11203
+ return value;
11204
+ }
11205
+ _implicitLazyIfReferenceValue(reference) {
11206
+ const range = reference.getRangePosition();
11207
+ const currentRow = this._runtimeService.currentRow || 0;
11208
+ const currentColumn = this._runtimeService.currentColumn || 0;
11209
+ const { startRow, startColumn, endRow, endColumn } = range;
11210
+ if (startRow === endRow && startColumn === endColumn) return reference.getCellByPosition();
11211
+ if (endRow === startRow && currentColumn >= startColumn && currentColumn <= endColumn) return reference.getCellByColumn(currentColumn);
11212
+ if (startColumn === endColumn && currentRow >= startRow && currentRow <= endRow) return reference.getCellByRow(currentRow);
11213
+ return ErrorValueObject.create("#VALUE!");
11214
+ }
11215
+ _preserveLazyIfSelectedReferenceArray(node) {
11216
+ let child = node;
11217
+ let parent = child.getParent();
11218
+ while (parent != null) {
11219
+ if (parent.nodeType === 4) return parent.getToken().toUpperCase() === "MATCH" && parent.getChildren().indexOf(child) === 1;
11220
+ child = parent;
11221
+ parent = parent.getParent();
11222
+ }
11223
+ return false;
11224
+ }
11225
+ _implicitLazyIfArrayValue(array) {
11226
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return array;
11227
+ const startRow = array.getCurrentRow();
11228
+ const startColumn = array.getCurrentColumn();
11229
+ const rowCount = array.getRowCount();
11230
+ const columnCount = array.getColumnCount();
11231
+ const currentRow = this._runtimeService.currentRow || 0;
11232
+ const currentColumn = this._runtimeService.currentColumn || 0;
11233
+ let rowIndex = -1;
11234
+ let columnIndex = -1;
11235
+ if (rowCount === 1 && columnCount === 1) {
11236
+ rowIndex = 0;
11237
+ columnIndex = 0;
11238
+ } else if (rowCount === 1) {
11239
+ rowIndex = 0;
11240
+ columnIndex = currentColumn - startColumn;
11241
+ } else if (columnCount === 1) {
11242
+ rowIndex = currentRow - startRow;
11243
+ columnIndex = 0;
11244
+ } else {
11245
+ rowIndex = currentRow - startRow;
11246
+ columnIndex = currentColumn - startColumn;
11247
+ }
11248
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
11249
+ return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
11250
+ }
10741
11251
  };
10742
11252
  Interpreter = __decorate([__decorateParam(0, IFormulaRuntimeService)], Interpreter);
10743
11253
 
@@ -10956,9 +11466,10 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
10956
11466
  for (let i = 0; i < parameterArray.length; i++) {
10957
11467
  const parameter = parameterArray[i];
10958
11468
  if (parameter instanceof LexerNode) {
10959
- const variant = parameter.getChildren()[0];
11469
+ const variant = getLambdaParameterName(parameter);
11470
+ if (variant == null) return ErrorNode.create("#VALUE!");
10960
11471
  parameter.setToken(DEFAULT_TOKEN_TYPE_LAMBDA_OMIT_PARAMETER);
10961
- currentLambdaPrivacyVar.set(variant.trim(), void 0);
11472
+ currentLambdaPrivacyVar.set(variant, void 0);
10962
11473
  } else return ErrorNode.create("#VALUE!");
10963
11474
  }
10964
11475
  this._runtimeService.registerFunctionDefinitionPrivacyVar(lambdaId, currentLambdaPrivacyVar);
@@ -10975,6 +11486,20 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
10975
11486
  }
10976
11487
  };
10977
11488
  LambdaNodeFactory = __decorate([__decorateParam(0, IFormulaRuntimeService), __decorateParam(1, Inject(Interpreter))], LambdaNodeFactory);
11489
+ function getLambdaParameterName(parameter) {
11490
+ const children = parameter.getChildren();
11491
+ for (let i = 0; i < children.length; i++) {
11492
+ const child = children[i];
11493
+ if (typeof child === "string") {
11494
+ const token = child.trim();
11495
+ if (token.length > 0) return token;
11496
+ } else {
11497
+ const token = getLambdaParameterName(child);
11498
+ if (token != null) return token;
11499
+ }
11500
+ }
11501
+ return null;
11502
+ }
10978
11503
 
10979
11504
  //#endregion
10980
11505
  //#region src/engine/ast-node/lambda-parameter-node.ts
@@ -11085,12 +11610,17 @@ var OperatorNode = class extends BaseAstNode {
11085
11610
  }
11086
11611
  if (object1 == null) object1 = NullValueObject.create();
11087
11612
  if (object2 == null) object2 = NullValueObject.create();
11088
- if (object1.isReferenceObject()) object1 = object1.toArrayValueObject();
11089
- if (object2.isReferenceObject()) object2 = object2.toArrayValueObject();
11613
+ if (object1.isReferenceObject()) object1 = this._referenceToOperatorValue(object1);
11614
+ if (object2.isReferenceObject()) object2 = this._referenceToOperatorValue(object2);
11090
11615
  const result = this._functionExecutor.calculate(object1, object2);
11091
11616
  this._setEmbeddedArrayFormulaToResult(result);
11092
11617
  this.setValue(result);
11093
11618
  }
11619
+ _referenceToOperatorValue(reference) {
11620
+ const array = reference.toArrayValueObject();
11621
+ if (array.getRowCount() === 1 && array.getColumnCount() === 1) return array.get(0, 0);
11622
+ return array;
11623
+ }
11094
11624
  /**
11095
11625
  * If it contains an array formula, set the current cell to the cache and send itself as a ref outward
11096
11626
  */
@@ -11167,6 +11697,7 @@ var TableReferenceObject = class extends BaseReferenceObject {
11167
11697
  const { startColumn, endColumn, type } = this._parseStructuredRef(this._columnDataString, titleMap);
11168
11698
  const tableStartRow = range.startRow;
11169
11699
  const tableEndRow = range.endRow;
11700
+ const dataStartRow = tableStartRow + (this._tableData.showHeader === false ? 0 : 1);
11170
11701
  let startRow = -1;
11171
11702
  let endRow = -1;
11172
11703
  switch (type) {
@@ -11175,10 +11706,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
11175
11706
  endRow = tableEndRow;
11176
11707
  break;
11177
11708
  case "#Data":
11178
- startRow = tableStartRow + 1;
11709
+ startRow = dataStartRow;
11179
11710
  endRow = tableEndRow;
11180
11711
  break;
11181
11712
  case "#Headers":
11713
+ if (this._tableData.showHeader === false) {
11714
+ startRow = -1;
11715
+ endRow = -1;
11716
+ break;
11717
+ }
11182
11718
  startRow = tableStartRow;
11183
11719
  endRow = tableStartRow;
11184
11720
  break;
@@ -11193,7 +11729,7 @@ var TableReferenceObject = class extends BaseReferenceObject {
11193
11729
  break;
11194
11730
  }
11195
11731
  default:
11196
- startRow = tableStartRow + 1;
11732
+ startRow = dataStartRow;
11197
11733
  endRow = tableEndRow;
11198
11734
  break;
11199
11735
  }
@@ -11218,6 +11754,13 @@ var TableReferenceObject = class extends BaseReferenceObject {
11218
11754
  }
11219
11755
  return rangeData;
11220
11756
  }
11757
+ getCellData(row, column) {
11758
+ if (this._isCurrentRowForRange) {
11759
+ const { startRow, endRow } = this._tableData.range;
11760
+ if (row < startRow || row > endRow) return { v: "#N/A" };
11761
+ }
11762
+ return super.getCellData(row, column);
11763
+ }
11221
11764
  getRefOffset() {
11222
11765
  return {
11223
11766
  x: 0,
@@ -11394,12 +11937,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
11394
11937
  }
11395
11938
  /** Column title → column index; returns -1 if not found (caller should handle as parse error) */
11396
11939
  _titleToIndex(name, titleMap) {
11397
- var _titleMap$get;
11398
11940
  const key = name.trim();
11399
11941
  const hit = titleMap.get(key);
11400
11942
  if (hit !== void 0) return hit;
11401
11943
  const keyNorm = key.replace(/\u3000/g, " ").trim();
11402
- return (_titleMap$get = titleMap.get(keyNorm)) !== null && _titleMap$get !== void 0 ? _titleMap$get : -1;
11944
+ const normalizedHit = titleMap.get(keyNorm);
11945
+ if (normalizedHit !== void 0) return normalizedHit;
11946
+ const lineBreakNorm = keyNorm.replace(/\r\n?/g, "\n");
11947
+ for (const [title, index] of titleMap.entries()) if (title.replace(/\u3000/g, " ").trim().replace(/\r\n?/g, "\n") === lineBreakNorm) return index;
11948
+ return -1;
11403
11949
  }
11404
11950
  /** Resolve #This Row's row number; takes first data row (tableStartRow+1) when no context available */
11405
11951
  _resolveThisRow(tableStartRow, tableEndRow) {
@@ -11411,13 +11957,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
11411
11957
  //#endregion
11412
11958
  //#region src/engine/ast-node/reference-node.ts
11413
11959
  var ReferenceNode = class extends BaseAstNode {
11414
- constructor(_currentConfigService, _runtimeService, operatorString, _referenceObjectType, _isPrepareMerge = false, _tableReferenceObject) {
11960
+ constructor(_currentConfigService, _runtimeService, operatorString, _referenceObjectType, _unitReferenceResolver, _superTableService, _isPrepareMerge = false, _tableReference) {
11415
11961
  super(operatorString);
11416
11962
  this._currentConfigService = _currentConfigService;
11417
11963
  this._runtimeService = _runtimeService;
11418
11964
  this._referenceObjectType = _referenceObjectType;
11965
+ this._unitReferenceResolver = _unitReferenceResolver;
11966
+ this._superTableService = _superTableService;
11419
11967
  this._isPrepareMerge = _isPrepareMerge;
11420
- this._tableReferenceObject = _tableReferenceObject;
11968
+ this._tableReference = _tableReference;
11421
11969
  _defineProperty(this, "_refOffsetX", 0);
11422
11970
  _defineProperty(this, "_refOffsetY", 0);
11423
11971
  }
@@ -11427,7 +11975,49 @@ var ReferenceNode = class extends BaseAstNode {
11427
11975
  execute() {
11428
11976
  const currentConfigService = this._currentConfigService;
11429
11977
  const runtimeService = this._runtimeService;
11430
- const referenceObject = this._tableReferenceObject || getReferenceObjectFromCache(this.getToken(), this._referenceObjectType);
11978
+ let referenceObject;
11979
+ if (this._tableReference) {
11980
+ var _Array$from$find;
11981
+ const { unitQualifier, tableName, columnStruct } = this._tableReference;
11982
+ const resolution = this._unitReferenceResolver.resolve({
11983
+ hostUnitId: runtimeService.currentUnitId,
11984
+ qualifier: unitQualifier,
11985
+ referenceKind: "table"
11986
+ });
11987
+ if (typeof resolution === "string") {
11988
+ this.setValue(ErrorValueObject.create(resolution));
11989
+ return;
11990
+ }
11991
+ const tableMap = this._superTableService.getTableMap(resolution.unitId);
11992
+ const tableData = (_Array$from$find = Array.from((tableMap === null || tableMap === void 0 ? void 0 : tableMap.entries()) || []).find(([name]) => name.toLocaleLowerCase() === tableName.toLocaleLowerCase())) === null || _Array$from$find === void 0 ? void 0 : _Array$from$find[1];
11993
+ if (!tableData) {
11994
+ this.setValue(ErrorValueObject.create("#REF!"));
11995
+ return;
11996
+ }
11997
+ referenceObject = new TableReferenceObject(this.getToken(), tableData, columnStruct, this._superTableService.getTableOptionMap());
11998
+ referenceObject.setUnitQualifier(unitQualifier);
11999
+ referenceObject.setForcedUnitIdDirect(resolution.unitId);
12000
+ } else {
12001
+ referenceObject = getReferenceObjectFromCache(this.getToken(), this._referenceObjectType);
12002
+ const unitQualifier = referenceObject.getUnitQualifier();
12003
+ if (unitQualifier) {
12004
+ const resolution = this._unitReferenceResolver.resolve({
12005
+ hostUnitId: runtimeService.currentUnitId,
12006
+ qualifier: unitQualifier,
12007
+ referenceKind: "a1"
12008
+ });
12009
+ if (typeof resolution === "string") {
12010
+ this.setValue(ErrorValueObject.create(resolution));
12011
+ return;
12012
+ }
12013
+ referenceObject.setForcedUnitIdDirect(resolution.unitId);
12014
+ }
12015
+ }
12016
+ this._configureReferenceObject(referenceObject, currentConfigService, runtimeService);
12017
+ if (!this._isPrepareMerge && referenceObject.isExceedRange()) this.setValue(ErrorValueObject.create("#NAME?"));
12018
+ else this.setValue(referenceObject);
12019
+ }
12020
+ _configureReferenceObject(referenceObject, currentConfigService, runtimeService) {
11431
12021
  referenceObject.setDefaultUnitId(runtimeService.currentUnitId);
11432
12022
  referenceObject.setDefaultSheetId(runtimeService.currentSubUnitId);
11433
12023
  referenceObject.setForcedSheetId(currentConfigService.getSheetNameMap());
@@ -11439,13 +12029,9 @@ var ReferenceNode = class extends BaseAstNode {
11439
12029
  referenceObject.setRuntimeArrayFormulaCellData(runtimeService.getRuntimeArrayFormulaCellData());
11440
12030
  referenceObject.setRuntimeArrayFormulaRange(runtimeService.getUnitArrayFormula());
11441
12031
  referenceObject.setRuntimeFeatureCellData(runtimeService.getRuntimeFeatureCellData());
11442
- const currentRow = runtimeService.currentRow;
11443
- const currentCol = runtimeService.currentColumn;
11444
- referenceObject.setCurrentRowAndColumn(currentRow, currentCol);
12032
+ referenceObject.setCurrentRowAndColumn(runtimeService.currentRow, runtimeService.currentColumn);
11445
12033
  const { x, y } = this.getRefOffset();
11446
12034
  referenceObject.setRefOffset(x, y);
11447
- if (!this._isPrepareMerge && referenceObject.isExceedRange()) this.setValue(ErrorValueObject.create("#NAME?"));
11448
- else this.setValue(referenceObject);
11449
12035
  }
11450
12036
  setRefOffset(x = 0, y = 0) {
11451
12037
  this._refOffsetX = x;
@@ -11459,12 +12045,13 @@ var ReferenceNode = class extends BaseAstNode {
11459
12045
  }
11460
12046
  };
11461
12047
  let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory {
11462
- constructor(_currentConfigService, _formulaRuntimeService, _functionService, _superTableService) {
12048
+ constructor(_currentConfigService, _formulaRuntimeService, _functionService, _superTableService, _unitReferenceResolver) {
11463
12049
  super();
11464
12050
  this._currentConfigService = _currentConfigService;
11465
12051
  this._formulaRuntimeService = _formulaRuntimeService;
11466
12052
  this._functionService = _functionService;
11467
12053
  this._superTableService = _superTableService;
12054
+ this._unitReferenceResolver = _unitReferenceResolver;
11468
12055
  }
11469
12056
  get zIndex() {
11470
12057
  return NODE_ORDER_MAP.get(1) || 100;
@@ -11493,7 +12080,7 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
11493
12080
  }
11494
12081
  }
11495
12082
  _getTableMap() {
11496
- const unitId = this._currentConfigService.getExecuteUnitId();
12083
+ const unitId = this._formulaRuntimeService.currentUnitId;
11497
12084
  if (!unitId) return;
11498
12085
  return this._superTableService.getTableMap(unitId);
11499
12086
  }
@@ -11501,25 +12088,25 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
11501
12088
  var _tableMap$has;
11502
12089
  const currentConfigService = this._currentConfigService;
11503
12090
  const runtimeService = this._formulaRuntimeService;
11504
- const makeRef = (type) => new ReferenceNode(currentConfigService, runtimeService, tokenTrim, type, isPrepareMerge);
12091
+ const makeRef = (type) => new ReferenceNode(currentConfigService, runtimeService, tokenTrim, type, this._unitReferenceResolver, this._superTableService, isPrepareMerge);
11505
12092
  const tableMap = this._getTableMap();
11506
- if ((_tableMap$has = tableMap === null || tableMap === void 0 ? void 0 : tableMap.has(tokenTrim)) !== null && _tableMap$has !== void 0 ? _tableMap$has : false) return this._getTableReferenceNode(tokenTrim, isLexerNode, isPrepareMerge, true);
12093
+ if ((_tableMap$has = tableMap === null || tableMap === void 0 ? void 0 : tableMap.has(tokenTrim)) !== null && _tableMap$has !== void 0 ? _tableMap$has : false) return this._getTableReferenceNode(tokenTrim, isPrepareMerge, true);
11507
12094
  if (regexTestSingeRange(tokenTrim)) return makeRef(0);
11508
12095
  const parentIsUnion = isLexerNode && this._checkParentIsUnionOperator(param);
11509
12096
  if (parentIsUnion && regexTestSingleRow(tokenTrim)) return makeRef(2);
11510
12097
  if (parentIsUnion && regexTestSingleColumn(tokenTrim)) return makeRef(1);
11511
- return this._getTableReferenceNode(tokenTrim, isLexerNode, isPrepareMerge, false);
12098
+ return this._getTableReferenceNode(tokenTrim, isPrepareMerge, false);
11512
12099
  }
11513
- _getTableReferenceNode(tokenTrim, isLexerNode, isPrepareMerge, isSuperTableDirectly = false) {
12100
+ _getTableReferenceNode(tokenTrim, isPrepareMerge, isSuperTableDirectly = false) {
11514
12101
  if (!this._checkTokenIsTableReference(tokenTrim) && !isSuperTableDirectly) return;
11515
- const { tableName, columnStruct } = splitTableStructuredRef(tokenTrim);
12102
+ const { unitQualifier, tableName, columnStruct } = splitTableStructuredRef(tokenTrim);
11516
12103
  const tableMap = this._getTableMap();
11517
- if (!isLexerNode && (tableMap === null || tableMap === void 0 ? void 0 : tableMap.has(tableName))) {
11518
- const columnDataString = columnStruct;
11519
- const tableData = tableMap.get(tableName);
11520
- const tableOption = this._superTableService.getTableOptionMap();
11521
- return new ReferenceNode(this._currentConfigService, this._formulaRuntimeService, tokenTrim, 1, isPrepareMerge, new TableReferenceObject(tokenTrim, tableData, columnDataString, tableOption));
11522
- }
12104
+ const hasLocalTable = Array.from((tableMap === null || tableMap === void 0 ? void 0 : tableMap.keys()) || []).some((name) => name.toLocaleLowerCase() === tableName.toLocaleLowerCase());
12105
+ if (unitQualifier || hasLocalTable) return new ReferenceNode(this._currentConfigService, this._formulaRuntimeService, tokenTrim, 1, this._unitReferenceResolver, this._superTableService, isPrepareMerge, {
12106
+ unitQualifier,
12107
+ tableName,
12108
+ columnStruct
12109
+ });
11523
12110
  }
11524
12111
  _checkTokenIsTableReference(token) {
11525
12112
  return regexTestReferenceTableAllColumn(token) || regexTestReferenceTableSingleColumn(token) || regexTestReferenceTableMultipleColumn(token) || regexTestReferenceTableTitleOnlyAnyHash(token);
@@ -11533,7 +12120,8 @@ ReferenceNodeFactory = __decorate([
11533
12120
  __decorateParam(0, IFormulaCurrentConfigService),
11534
12121
  __decorateParam(1, IFormulaRuntimeService),
11535
12122
  __decorateParam(2, IFunctionService),
11536
- __decorateParam(3, ISuperTableService)
12123
+ __decorateParam(3, ISuperTableService),
12124
+ __decorateParam(4, IFormulaUnitReferenceResolver)
11537
12125
  ], ReferenceNodeFactory);
11538
12126
 
11539
12127
  //#endregion
@@ -11579,7 +12167,7 @@ var SuffixNode = class extends BaseAstNode {
11579
12167
  const formulaData = this._currentConfigService.getFormulaData();
11580
12168
  const formulaString = formulaData === null || formulaData === void 0 || (_formulaData$unitId = formulaData[unitId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[sheetId]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startRow]) === null || _formulaData$unitId === void 0 || (_formulaData$unitId = _formulaData$unitId[range.startColumn]) === null || _formulaData$unitId === void 0 ? void 0 : _formulaData$unitId.f;
11581
12169
  if (!formulaString) return ErrorValueObject.create("#VALUE!");
11582
- this._lexer.treeBuilder(formulaString);
12170
+ this._lexer.treeBuilder(formulaString, true, unitId);
11583
12171
  return ErrorValueObject.create("#VALUE!");
11584
12172
  /** todo */
11585
12173
  }
@@ -11680,13 +12268,19 @@ var ValueNode = class extends BaseAstNode {
11680
12268
  return 2;
11681
12269
  }
11682
12270
  execute() {
12271
+ const token = this.getToken();
12272
+ const tokenTrim = token.trim();
12273
+ if (tokenTrim.startsWith("\"") && tokenTrim.endsWith("\"")) {
12274
+ this.setValue(StringValueObject.create(tokenTrim.slice(1, -1).replace(/""/g, "\"")));
12275
+ return;
12276
+ }
11683
12277
  const parent = this.getParent();
11684
12278
  let isIgnoreNumberPattern = true;
11685
12279
  if ((parent === null || parent === void 0 ? void 0 : parent.nodeType) === 4) {
11686
12280
  var _isFunctionExecutorAr, _isFunctionExecutorAr2;
11687
12281
  isIgnoreNumberPattern = (_isFunctionExecutorAr = (_isFunctionExecutorAr2 = parent.isFunctionExecutorArgumentsIgnoreNumberPattern) === null || _isFunctionExecutorAr2 === void 0 ? void 0 : _isFunctionExecutorAr2.call(parent)) !== null && _isFunctionExecutorAr !== void 0 ? _isFunctionExecutorAr : true;
11688
12282
  }
11689
- this.setValue(ValueObjectFactory.create(this.getToken(), isIgnoreNumberPattern));
12283
+ this.setValue(ValueObjectFactory.create(token, isIgnoreNumberPattern));
11690
12284
  }
11691
12285
  };
11692
12286
  var ValueNodeFactory = class extends BaseAstNodeFactory {
@@ -11852,6 +12446,9 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
11852
12446
  astNode = getAstNodeTopParent(astNode);
11853
12447
  if (astNode == null || (astNode === null || astNode === void 0 ? void 0 : astNode.nodeType) === 7) return astNode;
11854
12448
  switch (astNode.nodeType) {
12449
+ case 8:
12450
+ calculateStack.push(astNode);
12451
+ break;
11855
12452
  case 4: {
11856
12453
  const token = astNode.getToken().trim().toUpperCase();
11857
12454
  if (FORCED_RECALCULATION_FUNCTION_NAME.has(token)) astNode.setForcedCalculateFunction();
@@ -11903,9 +12500,20 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
11903
12500
  astNode = this._astNodeFactoryList[x].checkAndCreateNodeType(item);
11904
12501
  if (astNode != null) break;
11905
12502
  }
11906
- if (astNode == null) return new ErrorFunctionNode();
12503
+ if (astNode == null) {
12504
+ const aggregatorNode = this._createGroupByAggregatorTokenNode(item);
12505
+ if (aggregatorNode != null) return aggregatorNode;
12506
+ return new ErrorFunctionNode();
12507
+ }
11907
12508
  return astNode;
11908
12509
  }
12510
+ _createGroupByAggregatorTokenNode(param) {
12511
+ const token = (typeof param === "string" ? param : param.getToken()).trim().toUpperCase();
12512
+ if (!token.startsWith("_XLETA.")) return null;
12513
+ const name = token.slice(7);
12514
+ if (name !== "SUM" && name !== "COUNT" && name !== "COUNTA" && name !== "PERCENTOF" && name !== "MIN" && name !== "MAX" && name !== "ARRAYTOTEXT") return null;
12515
+ return new BaseAstNode(name);
12516
+ }
11909
12517
  _initializeAstNode() {
11910
12518
  this._astNodeFactoryList = [
11911
12519
  this._astRootNodeFactory,
@@ -13122,7 +13730,7 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
13122
13730
  return this._dependencyTreeCache.get(treeId);
13123
13731
  }
13124
13732
  _getTreeNode(tree) {
13125
- return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
13733
+ return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
13126
13734
  }
13127
13735
  *_traverse(treeList, skippedTreeIds) {
13128
13736
  const stack = treeList;
@@ -13248,12 +13856,12 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
13248
13856
  for (let i = 0, len = treeList.length; i < len; i++) {
13249
13857
  const tree = treeList[i];
13250
13858
  if (!tree.formula) continue;
13859
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13251
13860
  const node = this._getTreeNode(tree);
13252
13861
  tree.isDirty = this._includeTree(tree, node);
13253
13862
  const addressFunctionNodes = this._getAddressFunctionNodeList(node);
13254
13863
  if (addressFunctionNodes.length > 0) tree.addressFunctionNodes = addressFunctionNodes;
13255
13864
  if (tree.isVirtual) continue;
13256
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13257
13865
  const rangeList = await this._getRangeListByNode({
13258
13866
  node,
13259
13867
  refOffsetX: tree.refOffsetX,
@@ -13458,13 +14066,13 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
13458
14066
  async _calculateAddressFunctionRuntimeData(treeDependencyCache, preCalculateTreeList) {
13459
14067
  while (preCalculateTreeList.length > 0) {
13460
14068
  const tree = preCalculateTreeList.pop();
14069
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13461
14070
  const nodeData = {
13462
14071
  node: this._getTreeNode(tree),
13463
14072
  refOffsetX: tree.refOffsetX,
13464
14073
  refOffsetY: tree.refOffsetY
13465
14074
  };
13466
14075
  await this._calculateAddressFunction(treeDependencyCache, tree);
13467
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13468
14076
  let value;
13469
14077
  if (this._interpreter.checkAsyncNode(nodeData.node)) value = await this._interpreter.executeAsync(nodeData);
13470
14078
  else value = this._interpreter.execute(nodeData);
@@ -13805,9 +14413,10 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
13805
14413
  this._executeLock.acquire("FORMULA_EXECUTION_LOCK", async () => {
13806
14414
  for (let i = 0; i < cycleReferenceCount; i++) {
13807
14415
  this._runtimeService.setFormulaCycleIndex(i);
13808
- await this._executeStep();
14416
+ const executed = await this._executeStep();
13809
14417
  FORMULA_REF_TO_ARRAY_CACHE.clear();
13810
- if (!this._runtimeService.isCycleDependency()) break;
14418
+ const isCycleDependency = this._runtimeService.isCycleDependency();
14419
+ if (!executed || !isCycleDependency) break;
13811
14420
  }
13812
14421
  this._runtimeService.setFormulaExecuteStage(8);
13813
14422
  this._executionInProgressListener$.next(this._runtimeService.getRuntimeState());
@@ -13891,7 +14500,8 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
13891
14500
  const treeCount = treeList.length;
13892
14501
  while (treeList.length > 0) {
13893
14502
  const tree = treeList.pop();
13894
- const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
14503
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
14504
+ const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
13895
14505
  const nodeData = {
13896
14506
  node,
13897
14507
  refOffsetX: tree.refOffsetX,
@@ -13917,11 +14527,9 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
13917
14527
  if (this._runtimeService.isStopExecution() || nodeData == null && getDirtyData == null) {
13918
14528
  this._runtimeService.setFormulaExecuteStage(0);
13919
14529
  this._runtimeService.markedAsStopFunctionsExecuted();
13920
- this._executionCompleteListener$.next(this._runtimeService.getAllRuntimeData());
13921
14530
  return;
13922
14531
  }
13923
14532
  }
13924
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13925
14533
  let value;
13926
14534
  if (getDirtyData != null && tree.featureId != null) {
13927
14535
  /**
@@ -14014,8 +14622,9 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
14014
14622
  }
14015
14623
  return result;
14016
14624
  }
14017
- async calculate(formulaString) {
14018
- const lexerNode = this._lexer.treeBuilder(formulaString);
14625
+ async calculate(formulaString, transformSuffix = true, unitId) {
14626
+ const executeUnitId = unitId || this._runtimeService.currentUnitId || this._currentConfigService.getExecuteUnitId();
14627
+ const lexerNode = this._lexer.treeBuilder(formulaString, transformSuffix, executeUnitId);
14019
14628
  if (Object.values(ErrorType).includes(lexerNode)) return;
14020
14629
  const astNode = this._astTreeBuilder.parse(lexerNode);
14021
14630
  const interpreter = this._interpreter;
@@ -14203,6 +14812,86 @@ CalculateController = __decorate([
14203
14812
  __decorateParam(2, Inject(FormulaDataModel))
14204
14813
  ], CalculateController);
14205
14814
 
14815
+ //#endregion
14816
+ //#region src/services/active-dirty-manager.service.ts
14817
+ /**
14818
+ * Actively mark as dirty, calculate the dirty area based on the command,
14819
+ * and plugins can register the ref range they affect into the formula engine.
14820
+ */
14821
+ var ActiveDirtyManagerService = class extends Disposable {
14822
+ constructor(..._args) {
14823
+ super(..._args);
14824
+ _defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
14825
+ }
14826
+ dispose() {
14827
+ this._dirtyConversionMap.clear();
14828
+ }
14829
+ remove(commandId) {
14830
+ this._dirtyConversionMap.delete(commandId);
14831
+ }
14832
+ get(commandId) {
14833
+ return this._dirtyConversionMap.get(commandId);
14834
+ }
14835
+ has(commandId) {
14836
+ return this._dirtyConversionMap.has(commandId);
14837
+ }
14838
+ register(commandId, dirtyConversion) {
14839
+ this._dirtyConversionMap.set(commandId, dirtyConversion);
14840
+ }
14841
+ getDirtyConversionMap() {
14842
+ return this._dirtyConversionMap;
14843
+ }
14844
+ };
14845
+ const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
14846
+
14847
+ //#endregion
14848
+ //#region src/controllers/super-table-active-dirty.controller.ts
14849
+ let SuperTableActiveDirtyController = class SuperTableActiveDirtyController extends Disposable {
14850
+ constructor(_activeDirtyManagerService) {
14851
+ super();
14852
+ this._activeDirtyManagerService = _activeDirtyManagerService;
14853
+ this._initialize();
14854
+ }
14855
+ _initialize() {
14856
+ this._activeDirtyManagerService.register(SetSuperTableMutation.id, {
14857
+ commandId: SetSuperTableMutation.id,
14858
+ getDirtyData: (command) => {
14859
+ const params = command.params;
14860
+ const tableNames = [params.tableName, params.oldTableName].filter((name) => Boolean(name));
14861
+ return {
14862
+ dirtyRanges: [{
14863
+ unitId: params.unitId,
14864
+ sheetId: params.reference.sheetId,
14865
+ range: params.reference.range
14866
+ }],
14867
+ dirtySuperTableMap: { [params.unitId]: Object.fromEntries(tableNames.map((name) => [name, "1"])) },
14868
+ clearDependencyTreeCache: { [params.unitId]: { [params.reference.sheetId]: "1" } }
14869
+ };
14870
+ }
14871
+ });
14872
+ this._activeDirtyManagerService.register(RemoveSuperTableMutation.id, {
14873
+ commandId: RemoveSuperTableMutation.id,
14874
+ getDirtyData: (command) => {
14875
+ const params = command.params;
14876
+ return {
14877
+ dirtyRanges: params.reference ? [{
14878
+ unitId: params.unitId,
14879
+ sheetId: params.reference.sheetId,
14880
+ range: params.reference.range
14881
+ }] : void 0,
14882
+ dirtySuperTableMap: { [params.unitId]: { [params.tableName]: "1" } },
14883
+ clearDependencyTreeCache: params.reference ? { [params.unitId]: { [params.reference.sheetId]: "1" } } : void 0
14884
+ };
14885
+ }
14886
+ });
14887
+ this.disposeWithMe(toDisposable(() => {
14888
+ this._activeDirtyManagerService.remove(SetSuperTableMutation.id);
14889
+ this._activeDirtyManagerService.remove(RemoveSuperTableMutation.id);
14890
+ }));
14891
+ }
14892
+ };
14893
+ SuperTableActiveDirtyController = __decorate([__decorateParam(0, IActiveDirtyManagerService)], SuperTableActiveDirtyController);
14894
+
14206
14895
  //#endregion
14207
14896
  //#region src/engine/utils/r1c1-reference.ts
14208
14897
  const $relativeRegex = /[\[\]]/g;
@@ -14222,7 +14911,7 @@ function singleReference(refBody, currentRow = 0, currentColumn = 0) {
14222
14911
  };
14223
14912
  }
14224
14913
  function deserializeRangeForR1C1(refString, currentRow = 0, currentColumn = 0) {
14225
- const { refBody, sheetName, unitId } = handleRefStringInfo(refString);
14914
+ const { refBody, sheetName, unitQualifier } = handleRefStringInfo(refString);
14226
14915
  const colonIndex = refBody.indexOf(":");
14227
14916
  if (colonIndex === -1) {
14228
14917
  const grid = singleReference(refBody, currentRow, currentColumn);
@@ -14230,7 +14919,7 @@ function deserializeRangeForR1C1(refString, currentRow = 0, currentColumn = 0) {
14230
14919
  const column = grid.column;
14231
14920
  const absoluteRefType = grid.absoluteRefType;
14232
14921
  return {
14233
- unitId,
14922
+ unitId: unitQualifier,
14234
14923
  sheetName,
14235
14924
  range: {
14236
14925
  startRow: row,
@@ -14247,7 +14936,7 @@ function deserializeRangeForR1C1(refString, currentRow = 0, currentColumn = 0) {
14247
14936
  const startGrid = singleReference(refStartString, currentRow, currentColumn);
14248
14937
  const endGrid = singleReference(refEndString, currentRow, currentColumn);
14249
14938
  return {
14250
- unitId,
14939
+ unitId: unitQualifier,
14251
14940
  sheetName,
14252
14941
  range: {
14253
14942
  startRow: startGrid.row,
@@ -14277,6 +14966,91 @@ function getR1C1Ref(index, absoluteRefType = AbsoluteRefType.ALL, isRow) {
14277
14966
  }
14278
14967
  }
14279
14968
 
14969
+ //#endregion
14970
+ //#region src/engine/utils/unit-qualifier.ts
14971
+ /**
14972
+ * Copyright 2023-present DreamNum Co., Ltd.
14973
+ *
14974
+ * Licensed under the Apache License, Version 2.0 (the "License");
14975
+ * you may not use this file except in compliance with the License.
14976
+ * You may obtain a copy of the License at
14977
+ *
14978
+ * http://www.apache.org/licenses/LICENSE-2.0
14979
+ *
14980
+ * Unless required by applicable law or agreed to in writing, software
14981
+ * distributed under the License is distributed on an "AS IS" BASIS,
14982
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14983
+ * See the License for the specific language governing permissions and
14984
+ * limitations under the License.
14985
+ */
14986
+ const A1_UNIT_QUALIFIER = /('?)\[([^\]]+)\]((?:[^']|'')+)\1!(?=\$?[A-Z]{1,3}\$?\d+)/gi;
14987
+ const TABLE_UNIT_QUALIFIER = /(^|[^\w.])(?:'((?:[^']|'')+)'|\[([^\]]+)\]|([A-Za-z0-9_.-]+))!(?=[^\s!\[\]]+\[)/g;
14988
+ const INDIRECT_LITERAL = /\bINDIRECT\s*\(\s*"((?:[^"]|"")*)"/gi;
14989
+ function equalsQualifier(actual, expected) {
14990
+ return actual.replace(/''/g, "'").toLocaleLowerCase() === expected.toLocaleLowerCase();
14991
+ }
14992
+ function quoteQualifier(name) {
14993
+ return /^[A-Za-z0-9_.-]+$/.test(name) ? name : `'${name.replace(/'/g, "''")}'`;
14994
+ }
14995
+ function refactorReferenceSegment(segment, oldName, newName) {
14996
+ return segment.replace(A1_UNIT_QUALIFIER, (token, quote, qualifier, sheetName) => {
14997
+ if (!equalsQualifier(qualifier, oldName)) return token;
14998
+ const escapedName = newName.replace(/'/g, "''");
14999
+ return quote ? `'[${escapedName}]${sheetName}'!` : `[${newName}]${sheetName}!`;
15000
+ }).replace(TABLE_UNIT_QUALIFIER, (token, boundary, quoted, bracketed, plain) => {
15001
+ var _ref, _ref2;
15002
+ if (!equalsQualifier((_ref = (_ref2 = quoted !== null && quoted !== void 0 ? quoted : bracketed) !== null && _ref2 !== void 0 ? _ref2 : plain) !== null && _ref !== void 0 ? _ref : "", oldName)) return token;
15003
+ if (quoted != null) return `${boundary}'${newName.replace(/'/g, "''")}'!`;
15004
+ if (bracketed != null) return `${boundary}[${newName}]!`;
15005
+ return `${boundary}${quoteQualifier(newName)}!`;
15006
+ });
15007
+ }
15008
+ function refactorOutsideStrings(formula, oldName, newName) {
15009
+ let result = "";
15010
+ let chunk = "";
15011
+ let inString = false;
15012
+ for (let index = 0; index < formula.length; index++) {
15013
+ const character = formula[index];
15014
+ if (character !== "\"") {
15015
+ chunk += character;
15016
+ continue;
15017
+ }
15018
+ if (inString && formula[index + 1] === "\"") {
15019
+ chunk += "\"\"";
15020
+ index++;
15021
+ continue;
15022
+ }
15023
+ result += inString ? chunk : refactorReferenceSegment(chunk, oldName, newName);
15024
+ result += "\"";
15025
+ chunk = "";
15026
+ inString = !inString;
15027
+ }
15028
+ return result + (inString ? chunk : refactorReferenceSegment(chunk, oldName, newName));
15029
+ }
15030
+ /** Refactors only parsed reference qualifiers and INDIRECT literal references, never arbitrary text. */
15031
+ function refactorFormulaUnitQualifier(formula, oldName, newName) {
15032
+ if (!oldName || oldName === newName) return formula;
15033
+ return refactorOutsideStrings(formula.replace(INDIRECT_LITERAL, (token, literal) => {
15034
+ const next = refactorReferenceSegment(literal.replace(/""/g, "\""), oldName, newName).replace(/"/g, "\"\"");
15035
+ return token.replace(literal, next);
15036
+ }), oldName, newName);
15037
+ }
15038
+ /**
15039
+ * Copyright 2023-present DreamNum Co., Ltd.
15040
+ *
15041
+ * Licensed under the Apache License, Version 2.0 (the "License");
15042
+ * you may not use this file except in compliance with the License.
15043
+ * You may obtain a copy of the License at
15044
+ *
15045
+ * http://www.apache.org/licenses/LICENSE-2.0
15046
+ *
15047
+ * Unless required by applicable law or agreed to in writing, software
15048
+ * distributed under the License is distributed on an "AS IS" BASIS,
15049
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15050
+ * See the License for the specific language governing permissions and
15051
+ * limitations under the License.
15052
+ */
15053
+
14280
15054
  //#endregion
14281
15055
  //#region src/engine/utils/check-variant-error.ts
14282
15056
  function checkVariantErrorIsArray(variant) {
@@ -14374,11 +15148,14 @@ var BaseFunction = class {
14374
15148
  _defineProperty(this, "_subUnitId", void 0);
14375
15149
  _defineProperty(this, "_row", -1);
14376
15150
  _defineProperty(this, "_column", -1);
15151
+ _defineProperty(this, "_currentFormulaRowCount", 1);
15152
+ _defineProperty(this, "_currentFormulaColumnCount", 1);
14377
15153
  _defineProperty(this, "_definedNames", void 0);
14378
15154
  _defineProperty(this, "_locale", void 0);
14379
15155
  _defineProperty(this, "_sheetOrder", void 0);
14380
15156
  _defineProperty(this, "_sheetNameMap", void 0);
14381
15157
  _defineProperty(this, "_formulaDataModel", void 0);
15158
+ _defineProperty(this, "_unitReferenceResolver", void 0);
14382
15159
  _defineProperty(this, "_rowCount", -1);
14383
15160
  _defineProperty(this, "_columnCount", -1);
14384
15161
  _defineProperty(
@@ -14421,6 +15198,12 @@ var BaseFunction = class {
14421
15198
  "needsFormulaDataModel",
14422
15199
  false
14423
15200
  );
15201
+ _defineProperty(
15202
+ this,
15203
+ /** Whether the function resolves external Unit qualifiers. */
15204
+ "needsUnitReferenceResolver",
15205
+ false
15206
+ );
14424
15207
  _defineProperty(
14425
15208
  this,
14426
15209
  /**
@@ -14437,6 +15220,23 @@ var BaseFunction = class {
14437
15220
  "needsFilteredOutRows",
14438
15221
  false
14439
15222
  );
15223
+ _defineProperty(
15224
+ this,
15225
+ /**
15226
+ * Whether the function needs unevaluated AST children.
15227
+ */
15228
+ "needsAstChildren",
15229
+ false
15230
+ );
15231
+ _defineProperty(
15232
+ this,
15233
+ /**
15234
+ * Legacy CSE-style array functions should write only the first result cell
15235
+ * when they are used as a top-level normal formula.
15236
+ */
15237
+ "returnsLegacyArrayAsScalar",
15238
+ false
15239
+ );
14440
15240
  _defineProperty(
14441
15241
  this,
14442
15242
  /**
@@ -14469,6 +15269,12 @@ var BaseFunction = class {
14469
15269
  get column() {
14470
15270
  return this._column;
14471
15271
  }
15272
+ get currentFormulaRowCount() {
15273
+ return this._currentFormulaRowCount;
15274
+ }
15275
+ get currentFormulaColumnCount() {
15276
+ return this._currentFormulaColumnCount;
15277
+ }
14472
15278
  dispose() {}
14473
15279
  /**
14474
15280
  * In Excel, to inject a defined name into a function that has positioning capabilities,
@@ -14479,8 +15285,9 @@ var BaseFunction = class {
14479
15285
  getDefinedName(name) {
14480
15286
  const nameMap = this._definedNames;
14481
15287
  if (nameMap == null) return null;
15288
+ const normalizedName = name.toLowerCase();
14482
15289
  return Object.values(nameMap).find((value) => {
14483
- return value.name === name;
15290
+ return value.name.toLowerCase() === normalizedName;
14484
15291
  });
14485
15292
  }
14486
15293
  setDefinedNames(definedNames) {
@@ -14505,6 +15312,9 @@ var BaseFunction = class {
14505
15312
  setFormulaDataModel(_formulaDataModel) {
14506
15313
  this._formulaDataModel = _formulaDataModel;
14507
15314
  }
15315
+ setUnitReferenceResolver(unitReferenceResolver) {
15316
+ this._unitReferenceResolver = unitReferenceResolver;
15317
+ }
14508
15318
  setSheetRowColumnCount(rowCount, columnCount) {
14509
15319
  this._rowCount = rowCount;
14510
15320
  this._columnCount = columnCount;
@@ -14521,11 +15331,13 @@ var BaseFunction = class {
14521
15331
  isArgumentsIgnoreNumberPattern() {
14522
15332
  return false;
14523
15333
  }
14524
- setRefInfo(unitId, subUnitId, row, column) {
15334
+ setRefInfo(unitId, subUnitId, row, column, rowCount = 1, columnCount = 1) {
14525
15335
  this._unitId = unitId;
14526
15336
  this._subUnitId = subUnitId;
14527
15337
  this._row = row;
14528
15338
  this._column = column;
15339
+ this._currentFormulaRowCount = rowCount;
15340
+ this._currentFormulaColumnCount = columnCount;
14529
15341
  }
14530
15342
  calculateCustom(...arg) {
14531
15343
  return null;
@@ -14533,6 +15345,9 @@ var BaseFunction = class {
14533
15345
  calculate(...arg) {
14534
15346
  return ErrorValueObject.create("#VALUE!");
14535
15347
  }
15348
+ calculateAst(_children, _getVariant) {
15349
+ return ErrorValueObject.create("#VALUE!");
15350
+ }
14536
15351
  checkArrayType(variant) {
14537
15352
  return variant.isReferenceObject() || variant.isValueObject() && variant.isArray();
14538
15353
  }
@@ -16630,7 +17445,12 @@ function getArrayValuesByAggregateIgnoreOptions(array, options, formulaDataModel
16630
17445
  if (ignoreErrorValues) continue;
16631
17446
  return valueObject;
16632
17447
  }
16633
- if (!valueObject || valueObject.isNull() || valueObject.isBoolean() || valueObject.isString()) continue;
17448
+ if (!valueObject || valueObject.isNull() || valueObject.isString()) continue;
17449
+ if (!array.isArray() && valueObject.isBoolean()) {
17450
+ values.push(valueObject.getValue() ? 1 : 0);
17451
+ continue;
17452
+ }
17453
+ if (valueObject.isBoolean()) continue;
16634
17454
  const value = valueObject.getValue();
16635
17455
  if (!isRealNum(value)) continue;
16636
17456
  values.push(+value);
@@ -18358,6 +19178,11 @@ var Normsdist = class extends BaseFunction {
18358
19178
 
18359
19179
  //#endregion
18360
19180
  //#region src/functions/compatibility/rank/index.ts
19181
+ function isSameRankNumber$2(left, right) {
19182
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
19183
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
19184
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
19185
+ }
18361
19186
  var Rank = class extends BaseFunction {
18362
19187
  constructor(..._args) {
18363
19188
  super(..._args);
@@ -18383,7 +19208,7 @@ var Rank = class extends BaseFunction {
18383
19208
  const numberValue = +numberObject.getValue();
18384
19209
  const orderValue = +orderObject.getValue();
18385
19210
  if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
18386
- const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).indexOf(numberValue);
19211
+ const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber$2(refNumber, numberValue));
18387
19212
  if (result === -1) return ErrorValueObject.create("#N/A");
18388
19213
  return NumberValueObject.create(result + 1);
18389
19214
  });
@@ -18394,12 +19219,12 @@ var Rank = class extends BaseFunction {
18394
19219
  let refHasError = false;
18395
19220
  let refErrorObject = ErrorValueObject.create("#N/A");
18396
19221
  const refNumbers = [];
18397
- if (!ref.isReferenceObject()) return {
19222
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
18398
19223
  refHasError: true,
18399
19224
  refErrorObject,
18400
19225
  refNumbers
18401
19226
  };
18402
- ref.toArrayValueObject().iterator((refObject) => {
19227
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
18403
19228
  const _refObject = refObject;
18404
19229
  if (_refObject.isError()) {
18405
19230
  refHasError = true;
@@ -19465,7 +20290,8 @@ var Edate = class extends BaseFunction {
19465
20290
  const year = _startDate.getUTCFullYear();
19466
20291
  const month = _startDate.getUTCMonth() + monthsValue;
19467
20292
  const day = _startDate.getUTCDate();
19468
- const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, day)));
20293
+ const lastDayOfTargetMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
20294
+ const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, Math.min(day, lastDayOfTargetMonth))));
19469
20295
  return NumberValueObject.create(currentSerial, DEFAULT_DATE_FORMAT);
19470
20296
  });
19471
20297
  }
@@ -19749,8 +20575,12 @@ var Networkdays = class extends BaseFunction {
19749
20575
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
19750
20576
  const cell = holidays.get(r, c);
19751
20577
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20578
+ if (cell.isNull()) continue;
19752
20579
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
19753
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20580
+ if (typeof holidaySerialNumber !== "number") {
20581
+ if (cell.isString()) continue;
20582
+ return holidaySerialNumber;
20583
+ }
19754
20584
  holidaysValueArray.push(holidaySerialNumber);
19755
20585
  }
19756
20586
  } else {
@@ -19821,8 +20651,12 @@ var NetworkdaysIntl = class extends BaseFunction {
19821
20651
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
19822
20652
  const cell = holidays.get(r, c);
19823
20653
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20654
+ if (cell.isNull()) continue;
19824
20655
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
19825
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20656
+ if (typeof holidaySerialNumber !== "number") {
20657
+ if (cell.isString()) continue;
20658
+ return holidaySerialNumber;
20659
+ }
19826
20660
  holidaysValueArray.push(holidaySerialNumber);
19827
20661
  }
19828
20662
  } else {
@@ -20275,8 +21109,12 @@ var Workday = class extends BaseFunction {
20275
21109
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
20276
21110
  const cell = holidays.get(r, c);
20277
21111
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
21112
+ if (cell.isNull()) continue;
20278
21113
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
20279
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
21114
+ if (typeof holidaySerialNumber !== "number") {
21115
+ if (cell.isString()) continue;
21116
+ return holidaySerialNumber;
21117
+ }
20280
21118
  holidaysValueArray.push(holidaySerialNumber);
20281
21119
  }
20282
21120
  } else {
@@ -20346,8 +21184,12 @@ var WorkdayIntl = class extends BaseFunction {
20346
21184
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
20347
21185
  const cell = holidays.get(r, c);
20348
21186
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
21187
+ if (cell.isNull()) continue;
20349
21188
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
20350
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
21189
+ if (typeof holidaySerialNumber !== "number") {
21190
+ if (cell.isString()) continue;
21191
+ return holidaySerialNumber;
21192
+ }
20351
21193
  holidaysValueArray.push(holidaySerialNumber);
20352
21194
  }
20353
21195
  } else {
@@ -27810,6 +28652,232 @@ var False = class extends BaseFunction {
27810
28652
  }
27811
28653
  };
27812
28654
 
28655
+ //#endregion
28656
+ //#region src/functions/logical/groupby/index.ts
28657
+ var Groupby = class extends BaseFunction {
28658
+ constructor(..._args) {
28659
+ super(..._args);
28660
+ _defineProperty(this, "minParams", 3);
28661
+ _defineProperty(this, "maxParams", 7);
28662
+ _defineProperty(this, "needsReferenceObject", true);
28663
+ _defineProperty(this, "needsAstChildren", true);
28664
+ }
28665
+ calculateAst(children, getVariant) {
28666
+ const rowFields = this._arrayInput(getVariant(children[0]));
28667
+ if (rowFields instanceof ErrorValueObject) return rowFields;
28668
+ const values = this._arrayInput(getVariant(children[1]));
28669
+ if (values instanceof ErrorValueObject) return values;
28670
+ const aggregators = this._aggregators(children[2]);
28671
+ if (aggregators.length === 0) return ErrorValueObject.create("#VALUE!");
28672
+ if (values.rowCount !== rowFields.rowCount) return ErrorValueObject.create("#VALUE!");
28673
+ const includeTotal = children[4] == null ? true : this._numberValue(getVariant(children[4])) !== 0;
28674
+ const sortColumnValue = children[5] == null ? 0 : this._numberValue(getVariant(children[5]));
28675
+ const sortColumn = sortColumnValue === 0 ? void 0 : Math.trunc(sortColumnValue);
28676
+ const filter = children[6] == null ? void 0 : this._arrayInput(getVariant(children[6]));
28677
+ if (filter instanceof ErrorValueObject) return filter;
28678
+ const groupColumnCount = rowFields.columnCount;
28679
+ const valueColumnCount = values.columnCount;
28680
+ const outputValueColumnCount = this._outputValueColumnCount(valueColumnCount, aggregators.length);
28681
+ const groups = [];
28682
+ const allValues = Array.from({ length: valueColumnCount }, () => []);
28683
+ for (let row = 0; row < rowFields.rowCount; row++) {
28684
+ if (filter != null && !this._truthy(filter.valueAt(row, 0))) continue;
28685
+ const key = [];
28686
+ for (let column = 0; column < groupColumnCount; column++) key.push(rowFields.valueAt(row, column));
28687
+ let group = groups.find((item) => this._keysEqual(item.key, key));
28688
+ if (group == null) {
28689
+ group = {
28690
+ key,
28691
+ values: Array.from({ length: valueColumnCount }, () => [])
28692
+ };
28693
+ groups.push(group);
28694
+ }
28695
+ for (let column = 0; column < valueColumnCount; column++) {
28696
+ const value = values.valueAt(row, column);
28697
+ group.values[column].push(value);
28698
+ allValues[column].push(value);
28699
+ }
28700
+ }
28701
+ this._sortGroups(groups, sortColumn);
28702
+ const includeHeader = aggregators.length > 1;
28703
+ const rowCount = groups.length + (includeHeader ? 1 : 0) + (includeTotal ? 1 : 0);
28704
+ const columnCount = groupColumnCount + outputValueColumnCount;
28705
+ const result = [];
28706
+ if (includeHeader) {
28707
+ const header = [];
28708
+ for (let column = 0; column < groupColumnCount; column++) header.push(StringValueObject.create(""));
28709
+ for (let column = 0; column < outputValueColumnCount; column++) header.push(StringValueObject.create(this._aggregatorHeader(this._aggregatorForOutput(aggregators, valueColumnCount, column))));
28710
+ result.push(header);
28711
+ }
28712
+ for (const group of groups) {
28713
+ const row = [...group.key];
28714
+ for (let column = 0; column < outputValueColumnCount; column++) {
28715
+ const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
28716
+ const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
28717
+ row.push(this._applyAggregator(aggregator, group.values[valueColumn], allValues[valueColumn]));
28718
+ }
28719
+ result.push(row);
28720
+ }
28721
+ if (includeTotal) {
28722
+ const row = [];
28723
+ for (let column = 0; column < groupColumnCount; column++) row.push(StringValueObject.create(column === 0 ? "Total" : ""));
28724
+ for (let column = 0; column < outputValueColumnCount; column++) {
28725
+ const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
28726
+ const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
28727
+ row.push(this._applyAggregator(aggregator, allValues[valueColumn], allValues[valueColumn]));
28728
+ }
28729
+ result.push(row);
28730
+ }
28731
+ return ArrayValueObject.create({
28732
+ calculateValueList: result,
28733
+ rowCount,
28734
+ columnCount,
28735
+ unitId: this.unitId,
28736
+ sheetId: this.subUnitId,
28737
+ row: this.row,
28738
+ column: this.column
28739
+ });
28740
+ }
28741
+ _arrayInput(variant) {
28742
+ if (variant == null) return ErrorValueObject.create("#VALUE!");
28743
+ let value = variant;
28744
+ if (value.isReferenceObject()) value = value.toArrayValueObject();
28745
+ if (value.isError()) return value;
28746
+ if (value.isArray()) {
28747
+ const array = value;
28748
+ return {
28749
+ rowCount: array.getRowCount(),
28750
+ columnCount: array.getColumnCount(),
28751
+ valueAt: (row, column) => {
28752
+ var _array$get;
28753
+ return (_array$get = array.get(row, column)) !== null && _array$get !== void 0 ? _array$get : NullValueObject.create();
28754
+ }
28755
+ };
28756
+ }
28757
+ return {
28758
+ rowCount: 1,
28759
+ columnCount: 1,
28760
+ valueAt: (row, column) => row === 0 && column === 0 ? value : NullValueObject.create()
28761
+ };
28762
+ }
28763
+ _aggregators(node) {
28764
+ const name = this._normalizedFunctionName(node.getToken());
28765
+ if (name === "GROUPBY") return [];
28766
+ if (name === "HSTACK") return node.getChildren().flatMap((child) => this._aggregators(child));
28767
+ if (this._isAggregatorName(name)) return [name];
28768
+ return [];
28769
+ }
28770
+ _normalizedFunctionName(token) {
28771
+ let normalized = token.toUpperCase();
28772
+ for (;;) {
28773
+ const prefix = [
28774
+ "_XLFN.",
28775
+ "_XLWS.",
28776
+ "_XLETA."
28777
+ ].find((item) => normalized.startsWith(item));
28778
+ if (prefix == null) return normalized;
28779
+ normalized = normalized.slice(prefix.length);
28780
+ }
28781
+ }
28782
+ _isAggregatorName(name) {
28783
+ return name === "SUM" || name === "COUNT" || name === "COUNTA" || name === "PERCENTOF" || name === "MIN" || name === "MAX" || name === "ARRAYTOTEXT";
28784
+ }
28785
+ _outputValueColumnCount(valueColumnCount, aggregatorCount) {
28786
+ if (valueColumnCount === 1) return aggregatorCount;
28787
+ if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return valueColumnCount;
28788
+ return Math.min(valueColumnCount, aggregatorCount);
28789
+ }
28790
+ _valueColumnForOutput(valueColumnCount, aggregatorCount, outputColumn) {
28791
+ if (valueColumnCount === 1) return 0;
28792
+ if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return Math.min(outputColumn, valueColumnCount - 1);
28793
+ return Math.min(outputColumn, valueColumnCount - 1);
28794
+ }
28795
+ _aggregatorForOutput(aggregators, valueColumnCount, outputColumn) {
28796
+ if (aggregators.length === 1 || valueColumnCount === aggregators.length) return aggregators[Math.min(outputColumn, aggregators.length - 1)];
28797
+ return aggregators[Math.min(outputColumn, aggregators.length - 1)];
28798
+ }
28799
+ _aggregatorHeader(aggregator) {
28800
+ return aggregator === "PERCENTOF" ? "%" : aggregator;
28801
+ }
28802
+ _applyAggregator(aggregator, groupValues, allValues) {
28803
+ switch (aggregator) {
28804
+ case "SUM": return NumberValueObject.create(this._sum(groupValues));
28805
+ case "COUNT": return NumberValueObject.create(groupValues.filter((value) => value.isNumber()).length);
28806
+ case "COUNTA": return NumberValueObject.create(groupValues.filter((value) => !value.isNull() && !(value.isString() && value.getValue() === "")).length);
28807
+ case "PERCENTOF": {
28808
+ const allTotal = this._sum(allValues);
28809
+ if (allTotal === 0) return ErrorValueObject.create("#DIV/0!");
28810
+ return NumberValueObject.create(this._sum(groupValues) / allTotal);
28811
+ }
28812
+ case "MIN": {
28813
+ const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
28814
+ return NumberValueObject.create(values.length === 0 ? 0 : Math.min(...values));
28815
+ }
28816
+ case "MAX": {
28817
+ const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
28818
+ return NumberValueObject.create(values.length === 0 ? 0 : Math.max(...values));
28819
+ }
28820
+ case "ARRAYTOTEXT": return StringValueObject.create(groupValues.map((value) => this._textValue(value)).filter(Boolean).join(", "));
28821
+ }
28822
+ }
28823
+ _sum(values) {
28824
+ return values.reduce((sum, value) => {
28825
+ var _this$_numericValue;
28826
+ return sum + ((_this$_numericValue = this._numericValue(value)) !== null && _this$_numericValue !== void 0 ? _this$_numericValue : 0);
28827
+ }, 0);
28828
+ }
28829
+ _numericValue(value) {
28830
+ return value.isNumber() ? Number(value.getValue()) : void 0;
28831
+ }
28832
+ _numberValue(variant) {
28833
+ if (variant == null || variant.isError()) return 0;
28834
+ if (variant.isReferenceObject()) variant = variant.getFirstCell();
28835
+ if (variant.isArray()) {
28836
+ var _get;
28837
+ variant = (_get = variant.get(0, 0)) !== null && _get !== void 0 ? _get : NullValueObject.create();
28838
+ }
28839
+ const value = variant.getValue();
28840
+ return typeof value === "number" ? Math.trunc(value) : Math.trunc(Number(value) || 0);
28841
+ }
28842
+ _truthy(value) {
28843
+ if (value.isError() || value.isNull()) return false;
28844
+ return Boolean(value.getValue());
28845
+ }
28846
+ _keysEqual(left, right) {
28847
+ return left.length === right.length && left.every((value, index) => this._keyValue(value) === this._keyValue(right[index]));
28848
+ }
28849
+ _keyValue(value) {
28850
+ if (value.isError()) return `error:${value.getErrorType()}`;
28851
+ if (value.isNull()) return "null:";
28852
+ return `${typeof value.getValue()}:${String(value.getValue())}`;
28853
+ }
28854
+ _sortGroups(groups, sortColumn) {
28855
+ const descending = sortColumn != null && sortColumn < 0;
28856
+ const sortIndex = sortColumn == null ? void 0 : Math.abs(sortColumn) - 1;
28857
+ groups.sort((left, right) => {
28858
+ const compare = sortIndex != null && sortIndex < left.key.length ? this._compareValue(left.key[sortIndex], right.key[sortIndex]) : this._compareKey(left.key, right.key);
28859
+ return descending ? -compare : compare;
28860
+ });
28861
+ }
28862
+ _compareKey(left, right) {
28863
+ for (let index = 0; index < Math.min(left.length, right.length); index++) {
28864
+ const compare = this._compareValue(left[index], right[index]);
28865
+ if (compare !== 0) return compare;
28866
+ }
28867
+ return left.length - right.length;
28868
+ }
28869
+ _compareValue(left, right) {
28870
+ const leftNumber = this._numericValue(left);
28871
+ const rightNumber = this._numericValue(right);
28872
+ if (leftNumber != null && rightNumber != null) return leftNumber - rightNumber;
28873
+ return this._textValue(left).toUpperCase().localeCompare(this._textValue(right).toUpperCase());
28874
+ }
28875
+ _textValue(value) {
28876
+ if (value.isNull()) return "";
28877
+ return String(value.getValue());
28878
+ }
28879
+ };
28880
+
27813
28881
  //#endregion
27814
28882
  //#region src/functions/logical/if/index.ts
27815
28883
  var If = class extends BaseFunction {
@@ -27820,12 +28888,18 @@ var If = class extends BaseFunction {
27820
28888
  }
27821
28889
  calculate(logicalTest, valueIfTrue, valueIfFalse = BooleanValueObject.create(false)) {
27822
28890
  let _logicalTest = logicalTest;
28891
+ let useLegacyImplicitSelectedValue = false;
27823
28892
  if (logicalTest.isArray()) {
27824
- const rowCount = logicalTest.getRowCount();
27825
- const columnCount = logicalTest.getColumnCount();
27826
- if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTest.get(0, 0);
28893
+ const logicalTestArray = logicalTest;
28894
+ const rowCount = logicalTestArray.getRowCount();
28895
+ const columnCount = logicalTestArray.getColumnCount();
28896
+ if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTestArray.get(0, 0);
28897
+ else if (!this._isCurrentArrayFormula() && logicalTestArray.getUnitId() !== "" && logicalTestArray.getSheetId() !== "" && logicalTestArray.getCurrentRow() >= 0 && logicalTestArray.getCurrentColumn() >= 0) {
28898
+ _logicalTest = this._legacyImplicitArrayValue(logicalTestArray);
28899
+ useLegacyImplicitSelectedValue = true;
28900
+ }
27827
28901
  }
27828
- if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse);
28902
+ if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue);
27829
28903
  const maxRowLength = Math.max(_logicalTest.isArray() ? _logicalTest.getRowCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getRowCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getRowCount() : 1);
27830
28904
  const maxColumnLength = Math.max(_logicalTest.isArray() ? _logicalTest.getColumnCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getColumnCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getColumnCount() : 1);
27831
28905
  const logicalTestArray = expandArrayValueObject(maxRowLength, maxColumnLength, _logicalTest, ErrorValueObject.create("#N/A"));
@@ -27834,12 +28908,63 @@ var If = class extends BaseFunction {
27834
28908
  return logicalTestArray.mapValue((logicalTestValue, rowIndex, columnIndex) => {
27835
28909
  const valueIfTrueValue = valueIfTrueArray.get(rowIndex, columnIndex);
27836
28910
  const valueIfFalseValue = valueIfFalseArray.get(rowIndex, columnIndex);
27837
- return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue);
28911
+ return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue, false);
27838
28912
  });
27839
28913
  }
27840
- _handleSingleObject(logicalTest, valueIfTrue, valueIfFalse) {
28914
+ _handleSingleObject(logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue) {
27841
28915
  if (logicalTest.isError()) return logicalTest;
27842
- return logicalTest.getValue() ? valueIfTrue : valueIfFalse;
28916
+ const logicalTestValue = this._coerceLogicalTest(logicalTest);
28917
+ if (logicalTestValue.isError()) return logicalTestValue;
28918
+ let selectedValue = logicalTestValue.getValue() ? valueIfTrue : valueIfFalse;
28919
+ if (useLegacyImplicitSelectedValue) selectedValue = this._legacyImplicitSelectedValue(selectedValue);
28920
+ return this._coerceSelectedValue(selectedValue);
28921
+ }
28922
+ _coerceSelectedValue(value) {
28923
+ return value.isNull() ? NumberValueObject.create(0) : value;
28924
+ }
28925
+ _coerceLogicalTest(logicalTest) {
28926
+ if (logicalTest.isNull()) return BooleanValueObject.create(false);
28927
+ if (logicalTest.isBoolean()) return logicalTest;
28928
+ if (logicalTest.isNumber()) return BooleanValueObject.create(Number(logicalTest.getValue()) !== 0);
28929
+ if (logicalTest.isString()) {
28930
+ const value = `${logicalTest.getValue()}`.trim().toUpperCase();
28931
+ if (value === "TRUE") return BooleanValueObject.create(true);
28932
+ if (value === "FALSE") return BooleanValueObject.create(false);
28933
+ }
28934
+ return ErrorValueObject.create("#VALUE!");
28935
+ }
28936
+ _legacyImplicitSelectedValue(value) {
28937
+ if (!value.isArray()) return value;
28938
+ const array = value;
28939
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return value;
28940
+ return this._legacyImplicitArrayValue(array);
28941
+ }
28942
+ _legacyImplicitArrayValue(logicalTest) {
28943
+ const startRow = logicalTest.getCurrentRow();
28944
+ const startColumn = logicalTest.getCurrentColumn();
28945
+ const rowCount = logicalTest.getRowCount();
28946
+ const columnCount = logicalTest.getColumnCount();
28947
+ if (startRow < 0 || startColumn < 0) return ErrorValueObject.create("#VALUE!");
28948
+ let rowIndex = -1;
28949
+ let columnIndex = -1;
28950
+ if (rowCount === 1 && columnCount === 1) {
28951
+ rowIndex = 0;
28952
+ columnIndex = 0;
28953
+ } else if (rowCount === 1) {
28954
+ rowIndex = 0;
28955
+ columnIndex = this.column - startColumn;
28956
+ } else if (columnCount === 1) {
28957
+ rowIndex = this.row - startRow;
28958
+ columnIndex = 0;
28959
+ } else {
28960
+ rowIndex = this.row - startRow;
28961
+ columnIndex = this.column - startColumn;
28962
+ }
28963
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
28964
+ return logicalTest.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
28965
+ }
28966
+ _isCurrentArrayFormula() {
28967
+ return this.currentFormulaRowCount > 1 || this.currentFormulaColumnCount > 1;
27843
28968
  }
27844
28969
  };
27845
28970
 
@@ -27850,8 +28975,11 @@ var Iferror = class extends BaseFunction {
27850
28975
  super(..._args);
27851
28976
  _defineProperty(this, "minParams", 2);
27852
28977
  _defineProperty(this, "maxParams", 2);
28978
+ _defineProperty(this, "needsReferenceObject", true);
27853
28979
  }
27854
28980
  calculate(value, valueIfError) {
28981
+ value = this._toValueObject(value);
28982
+ valueIfError = this._toValueObject(valueIfError);
27855
28983
  if (!value.isArray()) return value.isError() ? valueIfError : value;
27856
28984
  const maxRowLength = Math.max(value.isArray() ? value.getRowCount() : 1, valueIfError.isArray() ? valueIfError.getRowCount() : 1);
27857
28985
  const maxColumnLength = Math.max(value.isArray() ? value.getColumnCount() : 1, valueIfError.isArray() ? valueIfError.getColumnCount() : 1);
@@ -27862,6 +28990,12 @@ var Iferror = class extends BaseFunction {
27862
28990
  });
27863
28991
  return valueArray;
27864
28992
  }
28993
+ _toValueObject(value) {
28994
+ if (!value.isReferenceObject()) return value;
28995
+ const reference = value;
28996
+ if (reference.getRowCount() === 1 && reference.getColumnCount() === 1) return reference.getCellByPosition();
28997
+ return reference.toArrayValueObject();
28998
+ }
27865
28999
  };
27866
29000
 
27867
29001
  //#endregion
@@ -28138,6 +29272,23 @@ var Or = class extends BaseFunction {
28138
29272
  }
28139
29273
  };
28140
29274
 
29275
+ //#endregion
29276
+ //#region src/functions/logical/percentof/index.ts
29277
+ /**
29278
+ * PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
29279
+ * AST path, not as a standalone scalar function.
29280
+ */
29281
+ var Percentof = class extends BaseFunction {
29282
+ constructor(..._args) {
29283
+ super(..._args);
29284
+ _defineProperty(this, "minParams", 0);
29285
+ _defineProperty(this, "maxParams", 0);
29286
+ }
29287
+ calculate(..._variants) {
29288
+ return ErrorValueObject.create("#VALUE!");
29289
+ }
29290
+ };
29291
+
28141
29292
  //#endregion
28142
29293
  //#region src/functions/logical/reduce/index.ts
28143
29294
  var Reduce = class extends BaseFunction {
@@ -28421,6 +29572,7 @@ const functionLogical = [
28421
29572
  [Bycol, "BYCOL"],
28422
29573
  [Byrow, "BYROW"],
28423
29574
  [False, "FALSE"],
29575
+ [Groupby, "GROUPBY"],
28424
29576
  [If, "IF"],
28425
29577
  [Iferror, "IFERROR"],
28426
29578
  [Ifna, "IFNA"],
@@ -28431,6 +29583,7 @@ const functionLogical = [
28431
29583
  [Map$1, "MAP"],
28432
29584
  [Not, "NOT"],
28433
29585
  [Or, "OR"],
29586
+ [Percentof, "PERCENTOF"],
28434
29587
  [Reduce, "REDUCE"],
28435
29588
  [Scan, "SCAN"],
28436
29589
  [Switch, "SWITCH"],
@@ -28452,9 +29605,9 @@ var Address = class extends BaseFunction {
28452
29605
  if (absNumber === null || absNumber === void 0 ? void 0 : absNumber.isError()) return absNumber;
28453
29606
  if (a1 === null || a1 === void 0 ? void 0 : a1.isError()) return a1;
28454
29607
  if (sheetText === null || sheetText === void 0 ? void 0 : sheetText.isError()) return sheetText;
28455
- const _absNumber = absNumber !== null && absNumber !== void 0 ? absNumber : NumberValueObject.create(1);
28456
- const _a1 = a1 !== null && a1 !== void 0 ? a1 : BooleanValueObject.create(true);
28457
- const _sheetText = sheetText !== null && sheetText !== void 0 ? sheetText : StringValueObject.create("");
29608
+ const _absNumber = absNumber == null || absNumber.isNull() ? NumberValueObject.create(1) : absNumber;
29609
+ const _a1 = a1 == null || a1.isNull() ? BooleanValueObject.create(true) : a1;
29610
+ const _sheetText = sheetText == null || sheetText.isNull() ? StringValueObject.create("") : sheetText;
28458
29611
  const maxRowLength = Math.max(rowNumber.isArray() ? rowNumber.getRowCount() : 1, columnNumber.isArray() ? columnNumber.getRowCount() : 1, _absNumber.isArray() ? _absNumber.getRowCount() : 1, _a1.isArray() ? _a1.getRowCount() : 1, _sheetText.isArray() ? _sheetText.getRowCount() : 1);
28459
29612
  const maxColumnLength = Math.max(rowNumber.isArray() ? rowNumber.getColumnCount() : 1, columnNumber.isArray() ? columnNumber.getColumnCount() : 1, _absNumber.isArray() ? _absNumber.getColumnCount() : 1, _a1.isArray() ? _a1.getColumnCount() : 1, _sheetText.isArray() ? _sheetText.getColumnCount() : 1);
28460
29613
  const rowNumArray = expandArrayValueObject(maxRowLength, maxColumnLength, rowNumber, ErrorValueObject.create("#N/A"));
@@ -28505,6 +29658,20 @@ function transformAbsoluteRefType(number) {
28505
29658
  }
28506
29659
  }
28507
29660
 
29661
+ //#endregion
29662
+ //#region src/functions/lookup/anchorarray/index.ts
29663
+ var Anchorarray = class extends BaseFunction {
29664
+ constructor(..._args) {
29665
+ super(..._args);
29666
+ _defineProperty(this, "minParams", 1);
29667
+ _defineProperty(this, "maxParams", 1);
29668
+ _defineProperty(this, "needsReferenceObject", true);
29669
+ }
29670
+ calculate(reference) {
29671
+ return reference;
29672
+ }
29673
+ };
29674
+
28508
29675
  //#endregion
28509
29676
  //#region src/functions/lookup/areas/index.ts
28510
29677
  var Areas = class extends BaseFunction {
@@ -29015,9 +30182,13 @@ var Hlookup = class extends BaseFunction {
29015
30182
  return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
29016
30183
  }
29017
30184
  _handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
29018
- if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
30185
+ if (rangeLookupValue === 0) return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
29019
30186
  return this.binarySearch(value, searchArray, resultArray);
29020
30187
  }
30188
+ _blankResultAsZero(value) {
30189
+ if (value.isNull()) return NumberValueObject.create(0);
30190
+ return value;
30191
+ }
29021
30192
  };
29022
30193
 
29023
30194
  //#endregion
@@ -29289,11 +30460,23 @@ var Index = class extends BaseFunction {
29289
30460
 
29290
30461
  //#endregion
29291
30462
  //#region src/functions/lookup/indirect/index.ts
30463
+ const INDIRECT_ERROR_LITERALS = [
30464
+ "#NULL!",
30465
+ "#DIV/0!",
30466
+ "#VALUE!",
30467
+ "#REF!",
30468
+ "#NAME?",
30469
+ "#NUM!",
30470
+ "#N/A",
30471
+ "#CYCLE!",
30472
+ "#CALC!"
30473
+ ];
29292
30474
  var Indirect = class extends BaseFunction {
29293
30475
  constructor(..._args) {
29294
30476
  super(..._args);
29295
30477
  _defineProperty(this, "minParams", 1);
29296
30478
  _defineProperty(this, "maxParams", 2);
30479
+ _defineProperty(this, "needsUnitReferenceResolver", true);
29297
30480
  }
29298
30481
  isAddress() {
29299
30482
  return true;
@@ -29317,10 +30500,13 @@ var Indirect = class extends BaseFunction {
29317
30500
  _handleSingleObject(refTextObject, a1Value) {
29318
30501
  const refTextValue = `${refTextObject.getValue()}`;
29319
30502
  if (refTextValue.trim() === "") return ErrorValueObject.create("#REF!");
30503
+ const embeddedError = this._matchErrorLiteral(refTextValue);
30504
+ if (embeddedError != null) return ErrorValueObject.create(embeddedError);
29320
30505
  const refTextV = this._convertToDefinedName(refTextValue);
29321
30506
  if (a1Value === 0) {
29322
30507
  const { range, sheetName, unitId } = deserializeRangeForR1C1(refTextV);
29323
30508
  const rangeReferenceObject = new RangeReferenceObject(range);
30509
+ rangeReferenceObject.setUnitQualifier(unitId);
29324
30510
  rangeReferenceObject.setForcedUnitIdDirect(unitId);
29325
30511
  rangeReferenceObject.setForcedSheetName(sheetName);
29326
30512
  return this._setDefault(rangeReferenceObject);
@@ -29331,12 +30517,23 @@ var Indirect = class extends BaseFunction {
29331
30517
  const { range, sheetName, unitId } = deserializeRangeWithSheetWithCache(refTextV);
29332
30518
  if (Number.isNaN(range.startRow) || range.endRow + 1 > MAX_ROW_COUNT || Number.isNaN(range.startColumn) || range.endColumn + 1 > MAX_COLUMN_COUNT) return ErrorValueObject.create("#REF!");
29333
30519
  const rangeReferenceObject = new RangeReferenceObject(range);
30520
+ rangeReferenceObject.setUnitQualifier(unitId);
29334
30521
  rangeReferenceObject.setForcedUnitIdDirect(unitId);
29335
30522
  rangeReferenceObject.setForcedSheetName(sheetName);
29336
30523
  return this._setDefault(rangeReferenceObject);
29337
30524
  }
29338
30525
  _setDefault(object) {
29339
30526
  if (this.unitId == null || this.subUnitId == null) return ErrorValueObject.create("#REF!");
30527
+ const unitQualifier = object.getUnitQualifier();
30528
+ if (unitQualifier && this._unitReferenceResolver) {
30529
+ const resolution = this._unitReferenceResolver.resolve({
30530
+ hostUnitId: this.unitId,
30531
+ qualifier: unitQualifier,
30532
+ referenceKind: "a1"
30533
+ });
30534
+ if (typeof resolution === "string") return ErrorValueObject.create(resolution);
30535
+ object.setForcedUnitIdDirect(resolution.unitId);
30536
+ }
29340
30537
  object.setDefaultUnitId(this.unitId);
29341
30538
  object.setDefaultSheetId(this.subUnitId);
29342
30539
  return object;
@@ -29355,6 +30552,10 @@ var Indirect = class extends BaseFunction {
29355
30552
  if (formulaOrRefString.startsWith("=")) return formulaOrRefString.slice(1);
29356
30553
  return formulaOrRefString;
29357
30554
  }
30555
+ _matchErrorLiteral(refText) {
30556
+ const normalizedRefText = refText.toUpperCase();
30557
+ return INDIRECT_ERROR_LITERALS.find((errorType) => normalizedRefText.includes(errorType));
30558
+ }
29358
30559
  };
29359
30560
 
29360
30561
  //#endregion
@@ -29422,7 +30623,7 @@ var Match = class extends BaseFunction {
29422
30623
  const columnCountLookup = lookupArray.getColumnCount();
29423
30624
  if (rowCountLookup !== 1 && columnCountLookup !== 1) return ErrorValueObject.create("#N/A");
29424
30625
  if (matchType === null || matchType === void 0 ? void 0 : matchType.isError()) return ErrorValueObject.create("#N/A");
29425
- const matchTypeValue = this.getMatchTypeValue(matchType);
30626
+ const matchTypeValue = (matchType === null || matchType === void 0 ? void 0 : matchType.isNull()) ? 0 : this.getMatchTypeValue(matchType);
29426
30627
  if (matchTypeValue == null) return ErrorValueObject.create("#VALUE!");
29427
30628
  if (lookupValue.isArray()) return lookupValue.map((value) => this._handleSingleObject(value, lookupArray, matchTypeValue));
29428
30629
  return this._handleSingleObject(lookupValue, lookupArray, matchTypeValue);
@@ -29841,9 +31042,10 @@ var Sort = class extends BaseFunction {
29841
31042
  }
29842
31043
  calculate(array, sortIndex, sortOrder, byCol) {
29843
31044
  let _sortIndex = sortIndex !== null && sortIndex !== void 0 ? sortIndex : NumberValueObject.create(1);
29844
- const _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
31045
+ let _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
29845
31046
  const _byCol = byCol !== null && byCol !== void 0 ? byCol : BooleanValueObject.create(false);
29846
31047
  if (_sortIndex.isNull()) _sortIndex = NumberValueObject.create(1);
31048
+ if (_sortOrder.isNull()) _sortOrder = NumberValueObject.create(1);
29847
31049
  if (_byCol.isArray()) {
29848
31050
  const byColRowCount = _byCol.getRowCount();
29849
31051
  const byColColumnCount = _byCol.getColumnCount();
@@ -30608,9 +31810,26 @@ var Vlookup = class extends BaseFunction {
30608
31810
  return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
30609
31811
  }
30610
31812
  _handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
30611
- if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
31813
+ if (rangeLookupValue === 0) {
31814
+ if (value.isNull()) return this._equalSearchBlankLookupValue(searchArray, resultArray);
31815
+ return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
31816
+ }
30612
31817
  return this.binarySearch(value, searchArray, resultArray);
30613
31818
  }
31819
+ _equalSearchBlankLookupValue(searchArray, resultArray) {
31820
+ var _resultArrayValue$;
31821
+ const zero = NumberValueObject.create(0);
31822
+ const matched = searchArray.mapValue((value) => {
31823
+ if (value.isNull()) return BooleanValueObject.create(false);
31824
+ return value.isEqual(zero);
31825
+ });
31826
+ const resultArrayValue = resultArray.pickRaw(matched);
31827
+ return this._blankResultAsZero(((_resultArrayValue$ = resultArrayValue[0]) === null || _resultArrayValue$ === void 0 ? void 0 : _resultArrayValue$[0]) || ErrorValueObject.create("#N/A"));
31828
+ }
31829
+ _blankResultAsZero(value) {
31830
+ if (value.isNull()) return NumberValueObject.create(0);
31831
+ return value;
31832
+ }
30614
31833
  };
30615
31834
 
30616
31835
  //#endregion
@@ -30780,7 +31999,8 @@ var Xlookup = class extends BaseFunction {
30780
31999
  if (matchMode === null || matchMode === void 0 ? void 0 : matchMode.isNull()) _matchMode = NumberValueObject.create(0);
30781
32000
  let _searchMode = searchMode !== null && searchMode !== void 0 ? searchMode : NumberValueObject.create(1);
30782
32001
  if (searchMode === null || searchMode === void 0 ? void 0 : searchMode.isNull()) _searchMode = NumberValueObject.create(1);
30783
- if (lookupValue.isError()) return lookupValue;
32002
+ const _lookupValue = this._legacyImplicitLookupValue(lookupValue);
32003
+ if (_lookupValue.isError()) return _lookupValue;
30784
32004
  const rowCountLookup = lookupArray.isArray() ? lookupArray.getRowCount() : 1;
30785
32005
  const columnCountLookup = lookupArray.isArray() ? lookupArray.getColumnCount() : 1;
30786
32006
  const rowCountReturn = returnArray.isArray() ? returnArray.getRowCount() : 1;
@@ -30792,7 +32012,7 @@ var Xlookup = class extends BaseFunction {
30792
32012
  if (matchModeValue instanceof ErrorValueObject) return matchModeValue;
30793
32013
  const searchModeValue = this.getIndexNumValue(_searchMode);
30794
32014
  if (searchModeValue instanceof ErrorValueObject) return searchModeValue;
30795
- return this._getResult(lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
32015
+ return this._getResult(_lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
30796
32016
  }
30797
32017
  _getResult(lookupValue, lookupArray, returnArray, ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn) {
30798
32018
  const lookupValueRowCount = lookupValue.isArray() ? lookupValue.getRowCount() : 1;
@@ -30807,7 +32027,7 @@ var Xlookup = class extends BaseFunction {
30807
32027
  if (checkErrorCombination) return checkErrorCombination;
30808
32028
  const result = this._handleSingleObject(value, lookupArray, resultArray, matchModeValue, searchModeValue);
30809
32029
  if (result.isError()) return ifNotFound;
30810
- return result;
32030
+ return this._blankResultAsZero(result);
30811
32031
  });
30812
32032
  }
30813
32033
  const _lookupValue = lookupValue.isArray() ? lookupValue.get(0, 0) : lookupValue;
@@ -30816,7 +32036,7 @@ var Xlookup = class extends BaseFunction {
30816
32036
  if (checkErrorCombination) return checkErrorCombination;
30817
32037
  const result = this._handleSingleObject(_lookupValue, lookupArray, returnArray, matchModeValue, searchModeValue);
30818
32038
  if (result.isError()) return ifNotFound;
30819
- return result;
32039
+ return this._blankResultAsZero(result);
30820
32040
  }
30821
32041
  let axis = 0;
30822
32042
  /**
@@ -30828,6 +32048,32 @@ var Xlookup = class extends BaseFunction {
30828
32048
  if (resultArray == null) return ErrorValueObject.create("#N/A");
30829
32049
  return resultArray;
30830
32050
  }
32051
+ _legacyImplicitLookupValue(lookupValue) {
32052
+ if (!lookupValue.isArray()) return lookupValue;
32053
+ const array = lookupValue;
32054
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return lookupValue;
32055
+ const startRow = array.getCurrentRow();
32056
+ const startColumn = array.getCurrentColumn();
32057
+ const rowCount = array.getRowCount();
32058
+ const columnCount = array.getColumnCount();
32059
+ let rowIndex = -1;
32060
+ let columnIndex = -1;
32061
+ if (rowCount === 1 && columnCount === 1) {
32062
+ rowIndex = 0;
32063
+ columnIndex = 0;
32064
+ } else if (rowCount === 1) {
32065
+ rowIndex = 0;
32066
+ columnIndex = this.column - startColumn;
32067
+ } else if (columnCount === 1) {
32068
+ rowIndex = this.row - startRow;
32069
+ columnIndex = 0;
32070
+ } else {
32071
+ rowIndex = this.row - startRow;
32072
+ columnIndex = this.column - startColumn;
32073
+ }
32074
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
32075
+ return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
32076
+ }
30831
32077
  _handleExpandObject(value, searchArray, resultArray, matchModeValue, searchModeValue, axis = 0) {
30832
32078
  if ((searchModeValue === 2 || searchModeValue === -2) && matchModeValue !== 2) {
30833
32079
  const searchType = getSearchModeValue(searchModeValue);
@@ -30848,6 +32094,10 @@ var Xlookup = class extends BaseFunction {
30848
32094
  if (matchModeValue === -1 || matchModeValue === 1) return this.orderSearch(value, searchArray, resultArray, matchModeValue === 1 ? 2 : 1, searchModeValue === -1);
30849
32095
  return this.equalSearch(value, searchArray, resultArray, searchModeValue !== -1);
30850
32096
  }
32097
+ _blankResultAsZero(value) {
32098
+ if (value.isNull()) return NumberValueObject.create(0);
32099
+ return value;
32100
+ }
30851
32101
  /**
30852
32102
  * Wildcard matching and binary search cannot appear at the same time
30853
32103
  * @param matchModeValue
@@ -30964,6 +32214,7 @@ var Xmatch = class extends BaseFunction {
30964
32214
  */
30965
32215
  const functionLookup = [
30966
32216
  [Address, "ADDRESS"],
32217
+ [Anchorarray, "ANCHORARRAY"],
30967
32218
  [Areas, "AREAS"],
30968
32219
  [Choose, "CHOOSE"],
30969
32220
  [Choosecols, "CHOOSECOLS"],
@@ -32069,7 +33320,7 @@ var Int = class extends BaseFunction {
32069
33320
  let _number = number;
32070
33321
  if (_number.isString()) _number = _number.convertToNumberObjectValue();
32071
33322
  if (_number.isError()) return _number;
32072
- const numberValue = Math.floor(+_number.getValue());
33323
+ const numberValue = Math.floor(stripErrorMargin(+_number.getValue()));
32073
33324
  return NumberValueObject.create(numberValue);
32074
33325
  }
32075
33326
  };
@@ -33421,6 +34672,7 @@ var Sum = class extends BaseFunction {
33421
34672
  let accumulatorAll = NumberValueObject.create(0);
33422
34673
  for (let i = 0; i < variants.length; i++) {
33423
34674
  let variant = variants[i];
34675
+ variant = this._legacyImplicitDerivedArray(variant);
33424
34676
  if (variant.isString()) variant = variant.convertToNumberObjectValue();
33425
34677
  if (variant.isError()) return variant;
33426
34678
  if (variant.isArray()) variant = variant.sum();
@@ -33430,6 +34682,30 @@ var Sum = class extends BaseFunction {
33430
34682
  }
33431
34683
  return accumulatorAll;
33432
34684
  }
34685
+ _legacyImplicitDerivedArray(variant) {
34686
+ if (!variant.isArray()) return variant;
34687
+ const array = variant;
34688
+ if (array.usesInvertedIndexCache() || !array.usesLegacyImplicitForAggregate()) return variant;
34689
+ const startRow = array.getCurrentRow();
34690
+ const startColumn = array.getCurrentColumn();
34691
+ if (startRow < 0 || startColumn < 0) return variant;
34692
+ const rowCount = array.getRowCount();
34693
+ const columnCount = array.getColumnCount();
34694
+ let rowIndex = -1;
34695
+ let columnIndex = -1;
34696
+ if (rowCount === 1) {
34697
+ rowIndex = 0;
34698
+ columnIndex = this.column - startColumn;
34699
+ } else if (columnCount === 1) {
34700
+ rowIndex = this.row - startRow;
34701
+ columnIndex = 0;
34702
+ } else {
34703
+ rowIndex = this.row - startRow;
34704
+ columnIndex = this.column - startColumn;
34705
+ }
34706
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
34707
+ return array.get(rowIndex, columnIndex) || variant;
34708
+ }
33433
34709
  };
33434
34710
 
33435
34711
  //#endregion
@@ -34003,8 +35279,17 @@ var Compare = class extends BaseFunction {
34003
35279
  calculate(variant1, variant2) {
34004
35280
  if (variant1.isError()) return variant1;
34005
35281
  if (variant2.isError()) return variant2;
35282
+ const variant1Error = this._coerceErrorLiteral(variant1);
35283
+ if (variant1Error) return variant1Error;
35284
+ const variant2Error = this._coerceErrorLiteral(variant2);
35285
+ if (variant2Error) return variant2Error;
34006
35286
  return variant1.compare(variant2, this._compareType);
34007
35287
  }
35288
+ _coerceErrorLiteral(variant) {
35289
+ const value = variant.getValue();
35290
+ if (typeof value === "string" && ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
35291
+ return null;
35292
+ }
34008
35293
  };
34009
35294
 
34010
35295
  //#endregion
@@ -34262,6 +35547,7 @@ var Average = class extends BaseFunction {
34262
35547
  let accumulatorCount = NumberValueObject.create(0);
34263
35548
  for (let i = 0; i < variants.length; i++) {
34264
35549
  let variant = variants[i];
35550
+ variant = this._legacyImplicitDerivedArray(variant);
34265
35551
  if (variant.isString() || variant.isBoolean()) variant = variant.convertToNumberObjectValue();
34266
35552
  if (variant.isError()) return variant;
34267
35553
  if (variant.isArray()) {
@@ -34275,6 +35561,30 @@ var Average = class extends BaseFunction {
34275
35561
  }
34276
35562
  return accumulatorSum.divided(accumulatorCount);
34277
35563
  }
35564
+ _legacyImplicitDerivedArray(variant) {
35565
+ if (!variant.isArray()) return variant;
35566
+ const array = variant;
35567
+ if (array.usesInvertedIndexCache()) return variant;
35568
+ const startRow = array.getCurrentRow();
35569
+ const startColumn = array.getCurrentColumn();
35570
+ if (startRow < 0 || startColumn < 0) return variant;
35571
+ const rowCount = array.getRowCount();
35572
+ const columnCount = array.getColumnCount();
35573
+ let rowIndex = -1;
35574
+ let columnIndex = -1;
35575
+ if (rowCount === 1) {
35576
+ rowIndex = 0;
35577
+ columnIndex = this.column - startColumn;
35578
+ } else if (columnCount === 1) {
35579
+ rowIndex = this.row - startRow;
35580
+ columnIndex = 0;
35581
+ } else {
35582
+ rowIndex = this.row - startRow;
35583
+ columnIndex = this.column - startColumn;
35584
+ }
35585
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
35586
+ return array.get(rowIndex, columnIndex) || variant;
35587
+ }
34278
35588
  };
34279
35589
 
34280
35590
  //#endregion
@@ -34807,7 +36117,13 @@ var Countif = class extends BaseFunction {
34807
36117
  calculate(range, criteria) {
34808
36118
  if (!range.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
34809
36119
  let _criteria = criteria;
34810
- if (criteria.isReferenceObject()) _criteria = criteria.toArrayValueObject();
36120
+ if (criteria.isReferenceObject()) {
36121
+ _criteria = criteria.toArrayValueObject();
36122
+ if (_criteria.getRowCount() === 1 && _criteria.getColumnCount() === 1) {
36123
+ const firstCriteria = _criteria.get(0, 0);
36124
+ _criteria = firstCriteria.isNull() ? NumberValueObject.create(0) : firstCriteria;
36125
+ }
36126
+ }
34811
36127
  if (_criteria.isArray()) {
34812
36128
  const resultArray = _criteria.mapValue((criteriaObject) => this._handleSingleObject(range, criteriaObject));
34813
36129
  if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
@@ -34842,7 +36158,7 @@ var Countifs = class extends BaseFunction {
34842
36158
  _defineProperty(this, "needsReferenceObject", true);
34843
36159
  }
34844
36160
  calculate(...variants) {
34845
- const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(variants);
36161
+ const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(this._legacyImplicitDerivedCriteria(variants));
34846
36162
  if (isError) return errorObject;
34847
36163
  if (rangeIsDifferentSize) {
34848
36164
  if (criteriaMaxRowLength === 1 && criteriaMaxColumnLength === 1) return ErrorValueObject.create("#VALUE!");
@@ -34865,6 +36181,32 @@ var Countifs = class extends BaseFunction {
34865
36181
  column: this.column
34866
36182
  });
34867
36183
  }
36184
+ _legacyImplicitDerivedCriteria(variants) {
36185
+ return variants.map((variant, index) => {
36186
+ if (index % 2 === 0 || !variant.isArray()) return variant;
36187
+ const array = variant;
36188
+ if (array.usesInvertedIndexCache()) return variant;
36189
+ const startRow = array.getCurrentRow();
36190
+ const startColumn = array.getCurrentColumn();
36191
+ if (startRow < 0 || startColumn < 0) return variant;
36192
+ const rowCount = array.getRowCount();
36193
+ const columnCount = array.getColumnCount();
36194
+ let rowIndex = -1;
36195
+ let columnIndex = -1;
36196
+ if (rowCount === 1) {
36197
+ rowIndex = 0;
36198
+ columnIndex = this.column - startColumn;
36199
+ } else if (columnCount === 1) {
36200
+ rowIndex = this.row - startRow;
36201
+ columnIndex = 0;
36202
+ } else {
36203
+ rowIndex = this.row - startRow;
36204
+ columnIndex = this.column - startColumn;
36205
+ }
36206
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
36207
+ return array.get(rowIndex, columnIndex) || variant;
36208
+ });
36209
+ }
34868
36210
  };
34869
36211
 
34870
36212
  //#endregion
@@ -35642,6 +36984,7 @@ var Linest = class extends BaseFunction {
35642
36984
  super(..._args);
35643
36985
  _defineProperty(this, "minParams", 1);
35644
36986
  _defineProperty(this, "maxParams", 4);
36987
+ _defineProperty(this, "returnsLegacyArrayAsScalar", true);
35645
36988
  }
35646
36989
  calculate(knownYs, knownXs, constb, stats) {
35647
36990
  const { isError, errorObject } = checkKnownsArrayDimensions(knownYs, knownXs);
@@ -36171,7 +37514,11 @@ var Median = class extends BaseFunction {
36171
37514
  if (isError) return errorObject;
36172
37515
  } else {
36173
37516
  if (variant.isError()) return variant;
36174
- if (variant.isNull() || variant.isBoolean()) continue;
37517
+ if (variant.isNull()) continue;
37518
+ if (variant.isBoolean()) {
37519
+ values.push(variant.getValue() ? 1 : 0);
37520
+ continue;
37521
+ }
36175
37522
  if (variant.isString()) {
36176
37523
  const _variant = variant.convertToNumberObjectValue();
36177
37524
  if (_variant.isError()) return _variant;
@@ -36781,6 +38128,11 @@ var QuartileExc = class extends BaseFunction {
36781
38128
 
36782
38129
  //#endregion
36783
38130
  //#region src/functions/statistical/rank-avg/index.ts
38131
+ function isSameRankNumber$1(left, right) {
38132
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
38133
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
38134
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
38135
+ }
36784
38136
  var RankAvg = class extends BaseFunction {
36785
38137
  constructor(..._args) {
36786
38138
  super(..._args);
@@ -36812,14 +38164,9 @@ var RankAvg = class extends BaseFunction {
36812
38164
  return resultArray;
36813
38165
  }
36814
38166
  _getResult(numberValue, orderValue, refNumbers) {
36815
- const refOrderNumbers = refNumbers.sort((a, b) => !orderValue ? b - a : a - b);
36816
- let index = refOrderNumbers.indexOf(numberValue);
38167
+ const refOrderNumbers = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b);
36817
38168
  const results = [];
36818
- while (index >= 0) {
36819
- const start = index + 1;
36820
- results.push(start);
36821
- index = refOrderNumbers.indexOf(numberValue, start);
36822
- }
38169
+ for (let index = 0; index < refOrderNumbers.length; index++) if (isSameRankNumber$1(refOrderNumbers[index], numberValue)) results.push(index + 1);
36823
38170
  if (results.length === 0) return ErrorValueObject.create("#N/A");
36824
38171
  const result = results.reduce((acc, cur) => acc + cur, 0) / results.length;
36825
38172
  return NumberValueObject.create(result);
@@ -36828,12 +38175,12 @@ var RankAvg = class extends BaseFunction {
36828
38175
  let refHasError = false;
36829
38176
  let refErrorObject = ErrorValueObject.create("#N/A");
36830
38177
  const refNumbers = [];
36831
- if (!ref.isReferenceObject()) return {
38178
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
36832
38179
  refHasError: true,
36833
38180
  refErrorObject,
36834
38181
  refNumbers
36835
38182
  };
36836
- ref.toArrayValueObject().iterator((refObject) => {
38183
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
36837
38184
  const _refObject = refObject;
36838
38185
  if (_refObject.isError()) {
36839
38186
  refHasError = true;
@@ -36855,6 +38202,11 @@ var RankAvg = class extends BaseFunction {
36855
38202
 
36856
38203
  //#endregion
36857
38204
  //#region src/functions/statistical/rank-eq/index.ts
38205
+ function isSameRankNumber(left, right) {
38206
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
38207
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
38208
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
38209
+ }
36858
38210
  var RankEq = class extends BaseFunction {
36859
38211
  constructor(..._args) {
36860
38212
  super(..._args);
@@ -36880,7 +38232,7 @@ var RankEq = class extends BaseFunction {
36880
38232
  const numberValue = +numberObject.getValue();
36881
38233
  const orderValue = +orderObject.getValue();
36882
38234
  if (Number.isNaN(numberValue) || Number.isNaN(orderValue)) return ErrorValueObject.create("#VALUE!");
36883
- const result = refNumbers.sort((a, b) => !orderValue ? b - a : a - b).indexOf(numberValue);
38235
+ const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber(refNumber, numberValue));
36884
38236
  if (result === -1) return ErrorValueObject.create("#N/A");
36885
38237
  return NumberValueObject.create(result + 1);
36886
38238
  });
@@ -36891,12 +38243,12 @@ var RankEq = class extends BaseFunction {
36891
38243
  let refHasError = false;
36892
38244
  let refErrorObject = ErrorValueObject.create("#N/A");
36893
38245
  const refNumbers = [];
36894
- if (!ref.isReferenceObject()) return {
38246
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
36895
38247
  refHasError: true,
36896
38248
  refErrorObject,
36897
38249
  refNumbers
36898
38250
  };
36899
- ref.toArrayValueObject().iterator((refObject) => {
38251
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
36900
38252
  const _refObject = refObject;
36901
38253
  if (_refObject.isError()) {
36902
38254
  refHasError = true;
@@ -37968,11 +39320,10 @@ var Concat = class extends BaseFunction {
37968
39320
  isError = valueObject;
37969
39321
  return false;
37970
39322
  }
37971
- if (valueObject.isBoolean()) concatenatedString += `${valueObject.getValue()}`.toLocaleUpperCase();
37972
- else if (valueObject.isString() || valueObject.isNumber()) concatenatedString += valueObject.getValue();
39323
+ concatenatedString += formatValueForFormulaText(valueObject.getValue());
37973
39324
  });
37974
39325
  if (isError) return isError;
37975
- } else if (!textValue.isError() && !textValue.isNull()) concatenatedString += textValue.getValue();
39326
+ } else if (!textValue.isError() && !textValue.isNull()) concatenatedString += formatValueForFormulaText(textValue.getValue());
37976
39327
  return StringValueObject.create(concatenatedString);
37977
39328
  }
37978
39329
  };
@@ -37999,20 +39350,27 @@ var Concatenate = class extends BaseFunction {
37999
39350
  }
38000
39351
  });
38001
39352
  let result = null;
39353
+ const referenceSource = textValues.find((textValue) => {
39354
+ if (!textValue.isArray()) return false;
39355
+ const arrayValue = textValue;
39356
+ return arrayValue.getUnitId() !== "" && arrayValue.getSheetId() !== "" && arrayValue.getCurrentRow() >= 0 && arrayValue.getCurrentColumn() >= 0;
39357
+ });
38002
39358
  for (const textValue of textValues) result = expandArrayValueObject(maxRowLength, maxColumnLength, textValue, ErrorValueObject.create("#N/A")).mapValue((textValueObject, rowIndex, columnIndex) => {
38003
- var _resultValue, _textValue;
39359
+ var _resultValueObject$ge, _textValueObject$getV;
38004
39360
  const resultValueObject = result && result.get(rowIndex, columnIndex);
38005
39361
  if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isError()) return resultValueObject;
38006
39362
  if (textValueObject.isError()) return textValueObject;
38007
- let resultValue = resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.getValue();
38008
- let textValue = textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.getValue();
38009
- if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isBoolean()) resultValue = `${resultValue}`.toLocaleUpperCase();
38010
- if (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isBoolean()) textValue = `${textValue}`.toLocaleUpperCase();
38011
- const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : (_resultValue = resultValue) !== null && _resultValue !== void 0 ? _resultValue : "";
38012
- const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : (_textValue = textValue) !== null && _textValue !== void 0 ? _textValue : "";
39363
+ const resultValueObjectString = (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isNull()) ? "" : formatValueForFormulaText((_resultValueObject$ge = resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.getValue()) !== null && _resultValueObject$ge !== void 0 ? _resultValueObject$ge : null);
39364
+ const textValueObjectString = (textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.isNull()) ? "" : formatValueForFormulaText((_textValueObject$getV = textValueObject === null || textValueObject === void 0 ? void 0 : textValueObject.getValue()) !== null && _textValueObject$getV !== void 0 ? _textValueObject$getV : null);
38013
39365
  return StringValueObject.create(`${resultValueObjectString}${textValueObjectString}`);
38014
39366
  });
38015
39367
  if (!result) return ErrorValueObject.create("#VALUE!");
39368
+ if (referenceSource && result.isArray()) {
39369
+ const resultArray = result;
39370
+ resultArray.setUnitId(referenceSource.getUnitId());
39371
+ resultArray.setSheetId(referenceSource.getSheetId());
39372
+ resultArray.setCurrent(referenceSource.getCurrentRow(), referenceSource.getCurrentColumn());
39373
+ }
38016
39374
  return result;
38017
39375
  }
38018
39376
  };
@@ -39779,13 +41137,17 @@ var Text = class extends BaseFunction {
39779
41137
  }
39780
41138
  if (formatTextValue.isNull()) formatTextValue = StringValueObject.create(" ");
39781
41139
  const formatTextValueString = `${formatTextValue.getValue()}`;
39782
- const previewText = getFormatPreview(formatTextValueString, textValueNumber);
41140
+ const previewText = getFormatPreview(normalizeExcelWeekdayFormat(formatTextValueString), textValueNumber);
39783
41141
  return StringValueObject.create(formatTextValueString === " " ? previewText.trimEnd() : previewText);
39784
41142
  });
39785
41143
  if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
39786
41144
  return resultArray;
39787
41145
  }
39788
41146
  };
41147
+ function normalizeExcelWeekdayFormat(formatText) {
41148
+ if (!formatText.includes("Å")) return formatText;
41149
+ return formatText.replace(/\u00C5{4,}/g, "dddd").replace(/\u00C5{1,3}/g, "ddd");
41150
+ }
39789
41151
 
39790
41152
  //#endregion
39791
41153
  //#region src/functions/text/textafter/index.ts
@@ -40160,9 +41522,19 @@ var Textsplit = class extends BaseFunction {
40160
41522
  const _ignoreEmpty = ignoreEmpty !== null && ignoreEmpty !== void 0 ? ignoreEmpty : NumberValueObject.create(0);
40161
41523
  const _matchMode = matchMode !== null && matchMode !== void 0 ? matchMode : NumberValueObject.create(0);
40162
41524
  const _padWith = padWith !== null && padWith !== void 0 ? padWith : StringValueObject.create("#N/A");
40163
- const { _variant: _colDelimiter, values: colDelimiterValue } = this._getStringValues(colDelimiter);
40164
41525
  const { _variant, values: rowDelimiterValue } = this._getStringValues(_rowDelimiter, false);
40165
41526
  _rowDelimiter = _variant;
41527
+ const allowBlankColDelimiter = rowDelimiter != null && !rowDelimiter.isNull() && !_rowDelimiter.isError() && rowDelimiterValue.length > 0;
41528
+ let _colDelimiter;
41529
+ let colDelimiterValue;
41530
+ if (allowBlankColDelimiter && this._isBlankScalarDelimiter(colDelimiter)) {
41531
+ _colDelimiter = colDelimiter;
41532
+ colDelimiterValue = [];
41533
+ } else {
41534
+ const { _variant: colDelimiterVariant, values } = this._getStringValues(colDelimiter);
41535
+ _colDelimiter = colDelimiterVariant;
41536
+ colDelimiterValue = values;
41537
+ }
40166
41538
  const maxRowLength = Math.max(text.isArray() ? text.getRowCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getRowCount() : 1, _matchMode.isArray() ? _matchMode.getRowCount() : 1);
40167
41539
  const maxColumnLength = Math.max(text.isArray() ? text.getColumnCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getColumnCount() : 1, _matchMode.isArray() ? _matchMode.getColumnCount() : 1);
40168
41540
  const textArray = expandArrayValueObject(maxRowLength, maxColumnLength, text, ErrorValueObject.create("#N/A"));
@@ -40240,7 +41612,7 @@ var Textsplit = class extends BaseFunction {
40240
41612
  const resultRows = textValue.split(rowDelimiterRegExp);
40241
41613
  let resultColsMaxCount = 1;
40242
41614
  let result = resultRows.map((row) => {
40243
- let cols = row.split(colDelimiterRegExp);
41615
+ let cols = colDelimiterValue.length > 0 ? row.split(colDelimiterRegExp) : [row];
40244
41616
  if (ignoreEmptyValue) cols = cols.filter((col) => col !== "");
40245
41617
  resultColsMaxCount = Math.max(resultColsMaxCount, cols.length);
40246
41618
  return cols;
@@ -40264,7 +41636,10 @@ var Textsplit = class extends BaseFunction {
40264
41636
  if (valueObject.isNull()) value = "\\s";
40265
41637
  if (valueObject.isBoolean()) value = value ? "TRUE" : "FALSE";
40266
41638
  value += "";
40267
- return escapeRegExp(value);
41639
+ return regexp.escapeRegExp(value);
41640
+ }
41641
+ _isBlankScalarDelimiter(valueObject) {
41642
+ return !valueObject.isArray() && (valueObject.isNull() || `${valueObject.getValue()}` === "");
40268
41643
  }
40269
41644
  };
40270
41645
 
@@ -40493,6 +41868,7 @@ const functionText = [
40493
41868
  [Numbervalue, "NUMBERVALUE"],
40494
41869
  [Regexextract, "REGEXEXTRACT"],
40495
41870
  [Regexmatch, "REGEXMATCH"],
41871
+ [Regexmatch, "REGEXTEST"],
40496
41872
  [Regexreplace, "REGEXREPLACE"],
40497
41873
  [Proper, "PROPER"],
40498
41874
  [Replace, "REPLACE"],
@@ -40560,6 +41936,58 @@ var Encodeurl = class extends BaseFunction {
40560
41936
  }
40561
41937
  };
40562
41938
 
41939
+ //#endregion
41940
+ //#region src/functions/web/filterxml/index.ts
41941
+ var Filterxml = class extends BaseFunction {
41942
+ constructor(..._args) {
41943
+ super(..._args);
41944
+ _defineProperty(this, "minParams", 2);
41945
+ _defineProperty(this, "maxParams", 2);
41946
+ }
41947
+ calculate(xml, xpath) {
41948
+ if (xml.isError()) return xml;
41949
+ if (xpath.isError()) return xpath;
41950
+ const tagName = getDescendantTagName(`${xpath.getValue()}`);
41951
+ if (tagName == null) return ErrorValueObject.create("#VALUE!");
41952
+ const values = extractTagTexts(`${xml.getValue()}`, tagName);
41953
+ if (values.length === 0) return ErrorValueObject.create("#VALUE!");
41954
+ return ArrayValueObject.create({
41955
+ calculateValueList: transformToValueObject(values.map((value) => [value])),
41956
+ rowCount: values.length,
41957
+ columnCount: 1,
41958
+ unitId: "",
41959
+ sheetId: "",
41960
+ row: 0,
41961
+ column: 0
41962
+ });
41963
+ }
41964
+ };
41965
+ function getDescendantTagName(xpath) {
41966
+ const text = xpath.trim();
41967
+ if (!text.startsWith("//")) return null;
41968
+ const tagName = text.slice(2).replace(/\/text\(\)$/, "").trim();
41969
+ return /^[A-Za-z0-9_.-]+$/.test(tagName) ? tagName : null;
41970
+ }
41971
+ function extractTagTexts(xml, tagName) {
41972
+ const open = `<${tagName}>`;
41973
+ const close = `</${tagName}>`;
41974
+ const values = [];
41975
+ let offset = 0;
41976
+ while (offset < xml.length) {
41977
+ const openIndex = xml.indexOf(open, offset);
41978
+ if (openIndex < 0) break;
41979
+ const valueStart = openIndex + open.length;
41980
+ const closeIndex = xml.indexOf(close, valueStart);
41981
+ if (closeIndex < 0) break;
41982
+ values.push(decodeXmlEntities(xml.slice(valueStart, closeIndex)));
41983
+ offset = closeIndex + close.length;
41984
+ }
41985
+ return values;
41986
+ }
41987
+ function decodeXmlEntities(value) {
41988
+ return value.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");
41989
+ }
41990
+
40563
41991
  //#endregion
40564
41992
  //#region src/functions/web/function-map.ts
40565
41993
  /**
@@ -40577,7 +42005,7 @@ var Encodeurl = class extends BaseFunction {
40577
42005
  * See the License for the specific language governing permissions and
40578
42006
  * limitations under the License.
40579
42007
  */
40580
- const functionWeb = [[Encodeurl, "ENCODEURL"]];
42008
+ const functionWeb = [[Encodeurl, "ENCODEURL"], [Filterxml, "FILTERXML"]];
40581
42009
 
40582
42010
  //#endregion
40583
42011
  //#region src/functions/index.ts
@@ -40647,7 +42075,7 @@ function getObjectValue(result, isUseStrip = false) {
40647
42075
  //#endregion
40648
42076
  //#region package.json
40649
42077
  var name = "@univerjs/engine-formula";
40650
- var version = "1.0.0-alpha.2";
42078
+ var version = "1.0.0-alpha.4";
40651
42079
 
40652
42080
  //#endregion
40653
42081
  //#region src/services/global-computing-status.service.ts
@@ -40716,6 +42144,242 @@ let ComputingStatusReporterController = class ComputingStatusReporterController
40716
42144
  };
40717
42145
  ComputingStatusReporterController = __decorate([__decorateParam(0, ICommandService), __decorateParam(1, Inject(GlobalComputingStatusService))], ComputingStatusReporterController);
40718
42146
 
42147
+ //#endregion
42148
+ //#region src/services/formula-calculation-trigger.service.ts
42149
+ const LOCAL_ONLY = { onlyLocal: true };
42150
+ const CALCULATION_DEBOUNCE_TIME = 10;
42151
+ let FormulaCalculationTriggerService = class FormulaCalculationTriggerService extends Disposable {
42152
+ constructor(_commandService, _activeDirtyManagerService) {
42153
+ super();
42154
+ this._commandService = _commandService;
42155
+ this._activeDirtyManagerService = _activeDirtyManagerService;
42156
+ _defineProperty(this, "_waitingCommandQueue", []);
42157
+ _defineProperty(this, "_pendingDirtyData", createEmptyDirtyData());
42158
+ _defineProperty(this, "_runningDirtyData", createEmptyDirtyData());
42159
+ _defineProperty(this, "_timer", void 0);
42160
+ _defineProperty(this, "_started", false);
42161
+ _defineProperty(this, "_executionInProgress", false);
42162
+ _defineProperty(this, "_hasPendingCalculation", false);
42163
+ _defineProperty(this, "_stopRequested", false);
42164
+ this._initialize();
42165
+ }
42166
+ start() {
42167
+ if (this._started) return;
42168
+ this._started = true;
42169
+ this._scheduleFlush();
42170
+ }
42171
+ dispose() {
42172
+ clearTimeout(this._timer);
42173
+ this._waitingCommandQueue = [];
42174
+ this._pendingDirtyData = createEmptyDirtyData();
42175
+ this._runningDirtyData = createEmptyDirtyData();
42176
+ super.dispose();
42177
+ }
42178
+ _initialize() {
42179
+ this.disposeWithMe(this._commandService.onCommandExecuted((command, options) => {
42180
+ var _conversion$shouldTri;
42181
+ if (command.id === SetFormulaCalculationStartMutation.id) {
42182
+ this._executionInProgress = true;
42183
+ return;
42184
+ }
42185
+ if (command.id === SetFormulaCalculationNotificationMutation.id) {
42186
+ this._handleCalculationNotification(command.params);
42187
+ return;
42188
+ }
42189
+ const conversion = this._activeDirtyManagerService.get(command.id);
42190
+ if (!conversion) return;
42191
+ if (((_conversion$shouldTri = conversion.shouldTrigger) === null || _conversion$shouldTri === void 0 ? void 0 : _conversion$shouldTri.call(conversion, command, options)) === false) return;
42192
+ this._waitingCommandQueue.push(command);
42193
+ this._scheduleFlush();
42194
+ }));
42195
+ }
42196
+ _scheduleFlush() {
42197
+ if (!this._started || this._waitingCommandQueue.length === 0 && !this._hasPendingCalculation) return;
42198
+ clearTimeout(this._timer);
42199
+ this._timer = setTimeout(() => this._flush(), CALCULATION_DEBOUNCE_TIME);
42200
+ }
42201
+ _flush() {
42202
+ const commands = this._waitingCommandQueue;
42203
+ const dirtyData = this._generateDirty(commands);
42204
+ this._waitingCommandQueue = [];
42205
+ this._timer = void 0;
42206
+ if (hasDirtyData(dirtyData) || commands.some(({ id }) => id === SetTriggerFormulaCalculationStartMutation.id)) {
42207
+ this._pendingDirtyData = mergeDirtyData(this._pendingDirtyData, dirtyData);
42208
+ this._hasPendingCalculation = true;
42209
+ }
42210
+ if (!this._hasPendingCalculation) return;
42211
+ if (this._executionInProgress) {
42212
+ if (!this._stopRequested && dirtyDataIntersects(this._runningDirtyData, this._pendingDirtyData)) {
42213
+ this._stopRequested = true;
42214
+ this._commandService.executeCommand(SetFormulaCalculationStopMutation.id, {}, LOCAL_ONLY);
42215
+ }
42216
+ return;
42217
+ }
42218
+ this._startCalculation();
42219
+ }
42220
+ _startCalculation() {
42221
+ this._runningDirtyData = this._pendingDirtyData;
42222
+ this._pendingDirtyData = createEmptyDirtyData();
42223
+ this._hasPendingCalculation = false;
42224
+ this._executionInProgress = true;
42225
+ this._stopRequested = false;
42226
+ this._commandService.executeCommand(SetFormulaCalculationStartMutation.id, { ...this._runningDirtyData }, LOCAL_ONLY);
42227
+ }
42228
+ _handleCalculationNotification(params) {
42229
+ if (params.stageInfo != null) {
42230
+ this._executionInProgress = true;
42231
+ return;
42232
+ }
42233
+ const state = params.functionsExecutedState;
42234
+ if (state == null) return;
42235
+ if (!(state === 1 || state === 3 || state === 2) || !this._executionInProgress) return;
42236
+ this._executionInProgress = false;
42237
+ this._stopRequested = false;
42238
+ if (state === 1) this._pendingDirtyData = mergeDirtyData(this._runningDirtyData, this._pendingDirtyData);
42239
+ this._runningDirtyData = createEmptyDirtyData();
42240
+ if (this._hasPendingCalculation || this._waitingCommandQueue.length > 0) this._scheduleFlush();
42241
+ }
42242
+ _generateDirty(commands) {
42243
+ return commands.reduce((result, command) => {
42244
+ const conversion = this._activeDirtyManagerService.get(command.id);
42245
+ return conversion ? mergeDirtyData(result, conversion.getDirtyData(command)) : result;
42246
+ }, createEmptyDirtyData());
42247
+ }
42248
+ };
42249
+ FormulaCalculationTriggerService = __decorate([__decorateParam(0, ICommandService), __decorateParam(1, IActiveDirtyManagerService)], FormulaCalculationTriggerService);
42250
+ function createEmptyDirtyData() {
42251
+ return {
42252
+ forceCalculation: false,
42253
+ dirtyRanges: [],
42254
+ dirtyNameMap: {},
42255
+ dirtyDefinedNameMap: {},
42256
+ dirtySuperTableMap: {},
42257
+ dirtyUnitFeatureMap: {},
42258
+ dirtyUnitOtherFormulaMap: {},
42259
+ clearDependencyTreeCache: {}
42260
+ };
42261
+ }
42262
+ function mergeDirtyData(left, right) {
42263
+ var _right$dirtyRanges, _left$dirtySuperTable;
42264
+ const dirtyRanges = [...left.dirtyRanges];
42265
+ mergeDirtyRanges(dirtyRanges, (_right$dirtyRanges = right.dirtyRanges) !== null && _right$dirtyRanges !== void 0 ? _right$dirtyRanges : []);
42266
+ return {
42267
+ dirtyRanges,
42268
+ dirtyNameMap: mergeDirtyUnitStringMap(left.dirtyNameMap, right.dirtyNameMap),
42269
+ dirtyDefinedNameMap: mergeDirtyUnitStringMap(left.dirtyDefinedNameMap, right.dirtyDefinedNameMap),
42270
+ dirtySuperTableMap: mergeDirtyUnitStringMap((_left$dirtySuperTable = left.dirtySuperTableMap) !== null && _left$dirtySuperTable !== void 0 ? _left$dirtySuperTable : {}, right.dirtySuperTableMap),
42271
+ dirtyUnitFeatureMap: mergeDirtyUnitNestedMap(left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap),
42272
+ dirtyUnitOtherFormulaMap: mergeDirtyUnitNestedMap(left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap),
42273
+ clearDependencyTreeCache: mergeDirtyUnitStringMap(left.clearDependencyTreeCache, right.clearDependencyTreeCache),
42274
+ forceCalculation: left.forceCalculation || Boolean(right.forceCalculation)
42275
+ };
42276
+ }
42277
+ function mergeDirtyRanges(target, source) {
42278
+ const keys = new Set(target.map(getDirtyRangeKey));
42279
+ source.forEach((range) => {
42280
+ const key = getDirtyRangeKey(range);
42281
+ if (!keys.has(key)) {
42282
+ keys.add(key);
42283
+ target.push(range);
42284
+ }
42285
+ });
42286
+ }
42287
+ function getDirtyRangeKey({ unitId, sheetId, range }) {
42288
+ return JSON.stringify([
42289
+ unitId,
42290
+ sheetId,
42291
+ range.startRow,
42292
+ range.startColumn,
42293
+ range.endRow,
42294
+ range.endColumn,
42295
+ range.rangeType
42296
+ ]);
42297
+ }
42298
+ function mergeDirtyUnitStringMap(left, right) {
42299
+ const result = { ...left };
42300
+ Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, values]) => {
42301
+ result[unitId] = {
42302
+ ...result[unitId],
42303
+ ...values
42304
+ };
42305
+ });
42306
+ return result;
42307
+ }
42308
+ function mergeDirtyUnitNestedMap(left, right) {
42309
+ const result = { ...left };
42310
+ Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, sheets]) => {
42311
+ const unitResult = { ...result[unitId] };
42312
+ Object.entries(sheets !== null && sheets !== void 0 ? sheets : {}).forEach(([sheetId, values]) => {
42313
+ unitResult[sheetId] = {
42314
+ ...unitResult[sheetId],
42315
+ ...values
42316
+ };
42317
+ });
42318
+ result[unitId] = unitResult;
42319
+ });
42320
+ return result;
42321
+ }
42322
+ function hasDirtyData(dirtyData) {
42323
+ return dirtyData.forceCalculation || dirtyData.dirtyRanges.length > 0 || hasNestedValue(dirtyData.dirtyNameMap) || hasNestedValue(dirtyData.dirtyDefinedNameMap) || hasNestedValue(dirtyData.dirtySuperTableMap) || hasNestedValue(dirtyData.dirtyUnitFeatureMap) || hasNestedValue(dirtyData.dirtyUnitOtherFormulaMap) || hasNestedValue(dirtyData.clearDependencyTreeCache);
42324
+ }
42325
+ function hasNestedValue(value) {
42326
+ if (value == null) return false;
42327
+ if (typeof value !== "object") return true;
42328
+ return Object.values(value).some(hasNestedValue);
42329
+ }
42330
+ function dirtyDataIntersects(left, right) {
42331
+ if (left.forceCalculation || right.forceCalculation) return true;
42332
+ if (left.dirtyRanges.some((leftRange) => right.dirtyRanges.some((rightRange) => leftRange.unitId === rightRange.unitId && leftRange.sheetId === rightRange.sheetId && Rectangle.intersects(leftRange.range, rightRange.range))) || clearedSheetIntersects(left, right) || clearedSheetIntersects(right, left)) return true;
42333
+ return [
42334
+ [left.dirtyNameMap, right.dirtyNameMap],
42335
+ [left.dirtyDefinedNameMap, right.dirtyDefinedNameMap],
42336
+ [left.dirtySuperTableMap, right.dirtySuperTableMap],
42337
+ [left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap],
42338
+ [left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap],
42339
+ [left.clearDependencyTreeCache, right.clearDependencyTreeCache]
42340
+ ].some(([leftMap, rightMap]) => hasSameNestedKey(leftMap, rightMap));
42341
+ }
42342
+ function clearedSheetIntersects(cleared, dirty) {
42343
+ return Object.entries(cleared.clearDependencyTreeCache).some(([unitId, sheets]) => Object.keys(sheets !== null && sheets !== void 0 ? sheets : {}).some((sheetId) => {
42344
+ var _dirty$dirtyNameMap$u, _dirty$dirtyUnitFeatu, _dirty$dirtyUnitOther;
42345
+ return dirty.dirtyRanges.some((range) => range.unitId === unitId && range.sheetId === sheetId) || ((_dirty$dirtyNameMap$u = dirty.dirtyNameMap[unitId]) === null || _dirty$dirtyNameMap$u === void 0 ? void 0 : _dirty$dirtyNameMap$u[sheetId]) != null || ((_dirty$dirtyUnitFeatu = dirty.dirtyUnitFeatureMap[unitId]) === null || _dirty$dirtyUnitFeatu === void 0 ? void 0 : _dirty$dirtyUnitFeatu[sheetId]) != null || ((_dirty$dirtyUnitOther = dirty.dirtyUnitOtherFormulaMap[unitId]) === null || _dirty$dirtyUnitOther === void 0 ? void 0 : _dirty$dirtyUnitOther[sheetId]) != null;
42346
+ }));
42347
+ }
42348
+ function hasSameNestedKey(left, right) {
42349
+ if (left == null || right == null || typeof left !== "object" || typeof right !== "object") return left != null && right != null;
42350
+ const rightRecord = right;
42351
+ return Object.entries(left).some(([key, value]) => Object.prototype.hasOwnProperty.call(rightRecord, key) && hasSameNestedKey(value, rightRecord[key]));
42352
+ }
42353
+
42354
+ //#endregion
42355
+ //#region src/controllers/formula-calculation-trigger.controller.ts
42356
+ /**
42357
+ * Copyright 2023-present DreamNum Co., Ltd.
42358
+ *
42359
+ * Licensed under the Apache License, Version 2.0 (the "License");
42360
+ * you may not use this file except in compliance with the License.
42361
+ * You may obtain a copy of the License at
42362
+ *
42363
+ * http://www.apache.org/licenses/LICENSE-2.0
42364
+ *
42365
+ * Unless required by applicable law or agreed to in writing, software
42366
+ * distributed under the License is distributed on an "AS IS" BASIS,
42367
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
42368
+ * See the License for the specific language governing permissions and
42369
+ * limitations under the License.
42370
+ */
42371
+ let FormulaCalculationTriggerController = class FormulaCalculationTriggerController extends Disposable {
42372
+ constructor(formulaCalculationTriggerService, lifecycleService) {
42373
+ super();
42374
+ if (isNodeEnv()) {
42375
+ formulaCalculationTriggerService.start();
42376
+ return;
42377
+ }
42378
+ this.disposeWithMe(lifecycleService.lifecycle$.pipe(filter((stage) => stage >= LifecycleStages.Rendered), take(1)).subscribe(() => formulaCalculationTriggerService.start()));
42379
+ }
42380
+ };
42381
+ FormulaCalculationTriggerController = __decorate([__decorateParam(0, Inject(FormulaCalculationTriggerService)), __decorateParam(1, Inject(LifecycleService))], FormulaCalculationTriggerController);
42382
+
40719
42383
  //#endregion
40720
42384
  //#region src/controllers/formula.controller.ts
40721
42385
  let FormulaController = class FormulaController extends Disposable {
@@ -40937,38 +42601,6 @@ SetOtherFormulaController = __decorate([
40937
42601
  __decorateParam(2, IDependencyManagerService)
40938
42602
  ], SetOtherFormulaController);
40939
42603
 
40940
- //#endregion
40941
- //#region src/services/active-dirty-manager.service.ts
40942
- /**
40943
- * Actively mark as dirty, calculate the dirty area based on the command,
40944
- * and plugins can register the ref range they affect into the formula engine.
40945
- */
40946
- var ActiveDirtyManagerService = class extends Disposable {
40947
- constructor(..._args) {
40948
- super(..._args);
40949
- _defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
40950
- }
40951
- dispose() {
40952
- this._dirtyConversionMap.clear();
40953
- }
40954
- remove(commandId) {
40955
- this._dirtyConversionMap.delete(commandId);
40956
- }
40957
- get(commandId) {
40958
- return this._dirtyConversionMap.get(commandId);
40959
- }
40960
- has(commandId) {
40961
- return this._dirtyConversionMap.has(commandId);
40962
- }
40963
- register(commandId, dirtyConversion) {
40964
- this._dirtyConversionMap.set(commandId, dirtyConversion);
40965
- }
40966
- getDirtyConversionMap() {
40967
- return this._dirtyConversionMap;
40968
- }
40969
- };
40970
- const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
40971
-
40972
42604
  //#endregion
40973
42605
  //#region src/services/formula-common.ts
40974
42606
  let FormulaResultStatus = /* @__PURE__ */ function(FormulaResultStatus) {
@@ -41169,7 +42801,11 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41169
42801
  }
41170
42802
  onReady() {
41171
42803
  var _this$_config;
41172
- touchDependencies(this._injector, [[FormulaController]]);
42804
+ touchDependencies(this._injector, [
42805
+ [FormulaController],
42806
+ [FormulaCalculationTriggerController],
42807
+ [SuperTableActiveDirtyController]
42808
+ ]);
41173
42809
  if (!((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.notExecuteFormula)) touchDependencies(this._injector, [
41174
42810
  [SetOtherFormulaController],
41175
42811
  [SetFeatureCalculationController],
@@ -41187,6 +42823,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41187
42823
  [IFunctionService, { useClass: FunctionService }],
41188
42824
  [IDefinedNamesService, { useClass: DefinedNamesService }],
41189
42825
  [IActiveDirtyManagerService, { useClass: ActiveDirtyManagerService }],
42826
+ [FormulaCalculationTriggerService],
41190
42827
  [RegisterOtherFormulaService],
41191
42828
  [IHyperlinkEngineFormulaService, { useClass: HyperlinkEngineFormulaService }],
41192
42829
  [ISheetRowFilteredService, { useClass: SheetRowFilteredService }],
@@ -41194,6 +42831,8 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41194
42831
  [GlobalComputingStatusService],
41195
42832
  [FormulaDataModel],
41196
42833
  [FormulaController],
42834
+ [FormulaCalculationTriggerController],
42835
+ [SuperTableActiveDirtyController],
41197
42836
  [ComputingStatusReporterController]
41198
42837
  ];
41199
42838
  if (shouldPerformComputing) dependencies.push([IOtherFormulaManagerService, { useClass: OtherFormulaManagerService }], [IFormulaRuntimeService, { useClass: FormulaRuntimeService }], [IFormulaCurrentConfigService, { useClass: FormulaCurrentConfigService }], [IFeatureCalculationManagerService, { useClass: FeatureCalculationManagerService }], [CalculateController], [SetOtherFormulaController], [SetDependencyController], [SetFeatureCalculationController], [Interpreter], [AstTreeBuilder], [Lexer], [AstRootNodeFactory], [FunctionNodeFactory], [LambdaNodeFactory], [LambdaParameterNodeFactory], [OperatorNodeFactory], [PrefixNodeFactory], [ReferenceNodeFactory], [SuffixNodeFactory], [UnionNodeFactory], [ValueNodeFactory]);
@@ -41205,7 +42844,8 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41205
42844
  if (!((_this$_config3 = this._config) === null || _this$_config3 === void 0 ? void 0 : _this$_config3.notExecuteFormula)) [
41206
42845
  [ICalculateFormulaService, { useClass: CalculateFormulaService }],
41207
42846
  [IDependencyManagerService, { useClass: DependencyManagerService }],
41208
- [IFormulaDependencyGenerator, { useClass: FormulaDependencyGenerator }]
42847
+ [IFormulaDependencyGenerator, { useClass: FormulaDependencyGenerator }],
42848
+ [IFormulaUnitReferenceResolver, { useClass: FormulaUnitReferenceResolver }]
41209
42849
  ].forEach((dependency) => this._injector.add(dependency));
41210
42850
  }
41211
42851
  };
@@ -41215,4 +42855,4 @@ _defineProperty(UniverFormulaEnginePlugin, "version", version);
41215
42855
  UniverFormulaEnginePlugin = __decorate([__decorateParam(1, Inject(Injector)), __decorateParam(2, IConfigService)], UniverFormulaEnginePlugin);
41216
42856
 
41217
42857
  //#endregion
41218
- export { ALL_IMPLEMENTED_FUNCTIONS, ALL_IMPLEMENTED_FUNCTIONS_SET, ActiveDirtyManagerService, ArrayValueObject, AstRootNodeFactory, AstTreeBuilder, AsyncArrayObject, AsyncCustomFunction, AsyncObject, BaseFunction, BaseReferenceObject, BaseValueObject, BooleanValue, BooleanValueObject, CELL_INVERTED_INDEX_CACHE, CalculateController, CalculateFormulaService, CustomFunction, DEFAULT_CYCLE_REFERENCE_COUNT, DEFAULT_INTERVAL_COUNT, DEFAULT_TOKEN_LAMBDA_FUNCTION_NAME, DEFAULT_TOKEN_LET_FUNCTION_NAME, DEFAULT_TOKEN_TYPE_LAMBDA_PARAMETER, DEFAULT_TOKEN_TYPE_PARAMETER, DEFAULT_TOKEN_TYPE_ROOT, DefinedNamesService, DependencyManagerBaseService, DependencyManagerService, ENGINE_FORMULA_CYCLE_REFERENCE_COUNT, ENGINE_FORMULA_PLUGIN_CONFIG_KEY, ENGINE_FORMULA_RETURN_DEPENDENCY_TREE, ERROR_TYPE_SET, ErrorType, ErrorValueObject, FORMULA_REF_TO_ARRAY_CACHE, FUNCTION_NAMES_ARRAY, FUNCTION_NAMES_COMPATIBILITY, FUNCTION_NAMES_CUBE, FUNCTION_NAMES_DATABASE, FUNCTION_NAMES_DATE, FUNCTION_NAMES_ENGINEERING, FUNCTION_NAMES_FINANCIAL, FUNCTION_NAMES_INFORMATION, FUNCTION_NAMES_LOGICAL, FUNCTION_NAMES_LOOKUP, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, FUNCTION_NAMES_TEXT, FUNCTION_NAMES_UNIVER, FUNCTION_NAMES_WEB, FeatureCalculationManagerService, FormulaCurrentConfigService, FormulaDataModel, FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeModel, FormulaDependencyTreeType, FormulaDependencyTreeVirtual, FormulaExecuteStageType, FormulaExecutedStateType, FormulaResultStatus, FormulaRuntimeService, FunctionNodeFactory, FunctionService, FunctionType, GlobalComputingStatusService, HyperlinkEngineFormulaService, IActiveDirtyManagerService, ICalculateFormulaService, IDefinedNamesService, IDependencyManagerService, IFeatureCalculationManagerService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, IFunctionService, IHyperlinkEngineFormulaService, IOtherFormulaManagerService, ISheetRowFilteredService, ISuperTableService, Interpreter, LambdaNodeFactory, LambdaParameterNodeFactory, LambdaValueObjectObject, Lexer, LexerNode, LexerTreeBuilder, NEW_EXCEL_FUNCTIONS, NullValueObject, NumberValueObject, OPERATOR_TOKEN_SET, OperatorNodeFactory, OtherFormulaBizType, OtherFormulaManagerService, OtherFormulaMarkDirty, PrefixNodeFactory, RangeReferenceObject, ReferenceNodeFactory, RegisterFunctionMutation, RegisterOtherFormulaService, RemoveDefinedNameMutation, RemoveFeatureCalculationMutation, RemoveOtherFormulaMutation, RemoveSuperTableMutation, SUFFIX_TOKEN_SET, SetArrayFormulaDataMutation, SetCellFormulaDependencyCalculationMutation, SetCellFormulaDependencyCalculationResultMutation, SetDefinedNameMutation, SetDefinedNameMutationFactory, SetFeatureCalculationMutation, SetFormulaCalculationNotificationMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetFormulaCalculationStopMutation, SetFormulaDataMutation, SetFormulaDependencyCalculationMutation, SetFormulaDependencyCalculationResultMutation, SetFormulaStringBatchCalculationMutation, SetFormulaStringBatchCalculationResultMutation, SetImageFormulaDataMutation, SetOtherFormulaMutation, SetQueryFormulaDependencyAllMutation, SetQueryFormulaDependencyAllResultMutation, SetQueryFormulaDependencyMutation, SetQueryFormulaDependencyResultMutation, SetSuperTableMutation, SetSuperTableOptionMutation, SetTriggerFormulaCalculationStartMutation, SheetRowFilteredService, StringValueObject, SuffixNodeFactory, SuperTableService, UnionNodeFactory, UniverFormulaEnginePlugin, ValueNodeFactory, ValueObjectFactory, compareToken, convertUnitDataToRuntime, deserializeRangeForR1C1, deserializeRangeWithSheet, deserializeRangeWithSheetWithCache, excelDateSerial, extractFormulaError, functionArray, functionCompatibility, functionCube, functionDatabase, functionDate, functionEngineering, functionFinancial, functionInformation, functionLogical, functionLookup, functionMath, functionMeta, functionStatistical, functionText, functionUniver, functionWeb, generateAstNode, generateExecuteAstNodeData, generateRandomDependencyTreeId, generateStringWithSequence, getAbsoluteRefTypeWitString, getAbsoluteRefTypeWithSingleString, getObjectValue, getRangeWithRefsString, handleNumfmtInCell, handleRefStringInfo, includeFormulaLexerToken, initSheetFormulaData, isFormulaLexerToken, isInDirtyRange, isReferenceString, isReferenceStringWithEffectiveColumn, isReferenceStrings, matchRefDrawToken, matchToken, needsQuoting, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };
42858
+ export { ALL_IMPLEMENTED_FUNCTIONS, ALL_IMPLEMENTED_FUNCTIONS_SET, ActiveDirtyManagerService, ArrayValueObject, AstRootNodeFactory, AstTreeBuilder, AsyncArrayObject, AsyncCustomFunction, AsyncObject, BaseFunction, BaseReferenceObject, BaseValueObject, BooleanValue, BooleanValueObject, CELL_INVERTED_INDEX_CACHE, CalculateController, CalculateFormulaService, CustomFunction, DEFAULT_CYCLE_REFERENCE_COUNT, DEFAULT_INTERVAL_COUNT, DEFAULT_TOKEN_LAMBDA_FUNCTION_NAME, DEFAULT_TOKEN_LET_FUNCTION_NAME, DEFAULT_TOKEN_TYPE_LAMBDA_PARAMETER, DEFAULT_TOKEN_TYPE_PARAMETER, DEFAULT_TOKEN_TYPE_ROOT, DefinedNamesService, DependencyManagerBaseService, DependencyManagerService, ENGINE_FORMULA_CYCLE_REFERENCE_COUNT, ENGINE_FORMULA_PLUGIN_CONFIG_KEY, ENGINE_FORMULA_RETURN_DEPENDENCY_TREE, ERROR_TYPE_SET, ErrorType, ErrorValueObject, FORMULA_REF_TO_ARRAY_CACHE, FUNCTION_NAMES_ARRAY, FUNCTION_NAMES_COMPATIBILITY, FUNCTION_NAMES_CUBE, FUNCTION_NAMES_DATABASE, FUNCTION_NAMES_DATE, FUNCTION_NAMES_ENGINEERING, FUNCTION_NAMES_FINANCIAL, FUNCTION_NAMES_INFORMATION, FUNCTION_NAMES_LOGICAL, FUNCTION_NAMES_LOOKUP, FUNCTION_NAMES_MATH, FUNCTION_NAMES_STATISTICAL, FUNCTION_NAMES_TEXT, FUNCTION_NAMES_UNIVER, FUNCTION_NAMES_WEB, FeatureCalculationManagerService, FormulaCalculationTriggerService, FormulaCurrentConfigService, FormulaDataModel, FormulaDependencyGenerator, FormulaDependencyTree, FormulaDependencyTreeModel, FormulaDependencyTreeType, FormulaDependencyTreeVirtual, FormulaExecuteStageType, FormulaExecutedStateType, FormulaResultStatus, FormulaRuntimeService, FormulaUnitReferenceResolver, FunctionNodeFactory, FunctionService, FunctionType, GlobalComputingStatusService, HyperlinkEngineFormulaService, IActiveDirtyManagerService, ICalculateFormulaService, IDefinedNamesService, IDependencyManagerService, IFeatureCalculationManagerService, IFormulaCurrentConfigService, IFormulaDependencyGenerator, IFormulaRuntimeService, IFormulaUnitReferenceResolver, IFunctionService, IHyperlinkEngineFormulaService, IOtherFormulaManagerService, ISheetRowFilteredService, ISuperTableService, Interpreter, LambdaNodeFactory, LambdaParameterNodeFactory, LambdaValueObjectObject, Lexer, LexerNode, LexerTreeBuilder, NEW_EXCEL_FUNCTIONS, NullValueObject, NumberValueObject, OPERATOR_TOKEN_SET, OperatorNodeFactory, OtherFormulaBizType, OtherFormulaManagerService, OtherFormulaMarkDirty, PrefixNodeFactory, RangeReferenceObject, ReferenceNodeFactory, RegisterFunctionMutation, RegisterOtherFormulaService, RemoveDefinedNameMutation, RemoveFeatureCalculationMutation, RemoveOtherFormulaMutation, RemoveSuperTableMutation, SUFFIX_TOKEN_SET, SetArrayFormulaDataMutation, SetCellFormulaDependencyCalculationMutation, SetCellFormulaDependencyCalculationResultMutation, SetDefinedNameMutation, SetDefinedNameMutationFactory, SetFeatureCalculationMutation, SetFormulaCalculationNotificationMutation, SetFormulaCalculationResultMutation, SetFormulaCalculationStartMutation, SetFormulaCalculationStopMutation, SetFormulaDataMutation, SetFormulaDependencyCalculationMutation, SetFormulaDependencyCalculationResultMutation, SetFormulaStringBatchCalculationMutation, SetFormulaStringBatchCalculationResultMutation, SetImageFormulaDataMutation, SetOtherFormulaMutation, SetQueryFormulaDependencyAllMutation, SetQueryFormulaDependencyAllResultMutation, SetQueryFormulaDependencyMutation, SetQueryFormulaDependencyResultMutation, SetSuperTableMutation, SetSuperTableOptionMutation, SetTriggerFormulaCalculationStartMutation, SheetRowFilteredService, StringValueObject, SuffixNodeFactory, SuperTableActiveDirtyController, SuperTableService, UnionNodeFactory, UniverFormulaEnginePlugin, ValueNodeFactory, ValueObjectFactory, compareToken, convertUnitDataToRuntime, deserializeRangeForR1C1, deserializeRangeWithSheet, deserializeRangeWithSheetWithCache, excelDateSerial, extractFormulaError, functionArray, functionCompatibility, functionCube, functionDatabase, functionDate, functionEngineering, functionFinancial, functionInformation, functionLogical, functionLookup, functionMath, functionMeta, functionStatistical, functionText, functionUniver, functionWeb, generateAstNode, generateExecuteAstNodeData, generateRandomDependencyTreeId, generateStringWithSequence, getAbsoluteRefTypeWitString, getAbsoluteRefTypeWithSingleString, getObjectValue, getRangeWithRefsString, handleNumfmtInCell, handleRefStringInfo, includeFormulaLexerToken, initSheetFormulaData, isFormulaLexerToken, isInDirtyRange, isReferenceString, isReferenceStringWithEffectiveColumn, isReferenceStrings, matchRefDrawToken, matchToken, needsQuoting, normalizeFormulaUnitName, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, refactorFormulaUnitQualifier, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };