@univerjs/engine-formula 1.0.0-alpha.1 → 1.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/lib/cjs/facade.js +9 -5
  2. package/lib/cjs/index.js +1530 -268
  3. package/lib/es/facade.js +9 -5
  4. package/lib/es/index.js +1520 -270
  5. package/lib/facade.js +9 -5
  6. package/lib/index.js +1520 -270
  7. package/lib/types/basics/regex.d.ts +2 -2
  8. package/lib/types/commands/mutations/set-super-table.mutation.d.ts +4 -1
  9. package/lib/types/controllers/super-table-active-dirty.controller.d.ts +22 -0
  10. package/lib/types/engine/analysis/lexer-tree-builder.d.ts +2 -1
  11. package/lib/types/engine/analysis/lexer.d.ts +2 -1
  12. package/lib/types/engine/analysis/parser.d.ts +2 -1
  13. package/lib/types/engine/ast-node/function-node.d.ts +4 -0
  14. package/lib/types/engine/ast-node/operator-node.d.ts +1 -0
  15. package/lib/types/engine/ast-node/prefix-node.d.ts +1 -0
  16. package/lib/types/engine/interpreter/interpreter.d.ts +11 -0
  17. package/lib/types/engine/reference-object/cell-reference-object.d.ts +1 -0
  18. package/lib/types/engine/utils/generate-ast-node.d.ts +1 -1
  19. package/lib/types/engine/utils/math-kit.d.ts +5 -0
  20. package/lib/types/engine/value-object/array-value-object.d.ts +5 -0
  21. package/lib/types/engine/value-object/base-value-object.d.ts +6 -0
  22. package/lib/types/facade/f-formula.d.ts +9 -5
  23. package/lib/types/functions/base-function.d.ts +16 -1
  24. package/lib/types/functions/cube/cubekpimember/index.d.ts +20 -0
  25. package/lib/types/functions/cube/cubemember/index.d.ts +20 -0
  26. package/lib/types/functions/cube/cubememberproperty/index.d.ts +20 -0
  27. package/lib/types/functions/cube/cuberankedmember/index.d.ts +20 -0
  28. package/lib/types/functions/cube/cubeset/index.d.ts +20 -0
  29. package/lib/types/functions/cube/cubesetcount/index.d.ts +20 -0
  30. package/lib/types/functions/cube/cubevalue/index.d.ts +20 -0
  31. package/lib/types/functions/financial/amordegrc/index.d.ts +20 -0
  32. package/lib/types/functions/information/info/index.d.ts +20 -0
  33. package/lib/types/functions/information/isomitted/index.d.ts +20 -0
  34. package/lib/types/functions/logical/function-map.d.ts +3 -2
  35. package/lib/types/functions/logical/function-names.d.ts +2 -0
  36. package/lib/types/functions/logical/groupby/index.d.ts +46 -0
  37. package/lib/types/functions/logical/if/index.d.ts +5 -0
  38. package/lib/types/functions/logical/iferror/index.d.ts +4 -1
  39. package/lib/types/functions/logical/percentof/index.d.ts +27 -0
  40. package/lib/types/functions/lookup/anchorarray/index.d.ts +23 -0
  41. package/lib/types/functions/lookup/function-names.d.ts +1 -0
  42. package/lib/types/functions/lookup/getpivotdata/index.d.ts +20 -0
  43. package/lib/types/functions/lookup/hlookup/index.d.ts +1 -0
  44. package/lib/types/functions/lookup/indirect/index.d.ts +1 -0
  45. package/lib/types/functions/lookup/rtd/index.d.ts +20 -0
  46. package/lib/types/functions/lookup/vlookup/index.d.ts +2 -0
  47. package/lib/types/functions/lookup/xlookup/index.d.ts +2 -0
  48. package/lib/types/functions/math/iso-ceiling/index.d.ts +20 -0
  49. package/lib/types/functions/math/sum/index.d.ts +1 -0
  50. package/lib/types/functions/meta/compare/index.d.ts +1 -0
  51. package/lib/types/functions/not-implemented-function.d.ts +23 -0
  52. package/lib/types/functions/statistical/average/index.d.ts +1 -0
  53. package/lib/types/functions/statistical/countifs/index.d.ts +1 -0
  54. package/lib/types/functions/statistical/forecast-ets/index.d.ts +20 -0
  55. package/lib/types/functions/statistical/forecast-ets-confint/index.d.ts +20 -0
  56. package/lib/types/functions/statistical/forecast-ets-seasonality/index.d.ts +20 -0
  57. package/lib/types/functions/statistical/forecast-ets-stat/index.d.ts +20 -0
  58. package/lib/types/functions/statistical/linest/index.d.ts +1 -0
  59. package/lib/types/functions/text/call/index.d.ts +20 -0
  60. package/lib/types/functions/text/euroconvert/index.d.ts +20 -0
  61. package/lib/types/functions/text/function-names.d.ts +1 -0
  62. package/lib/types/functions/text/phonetic/index.d.ts +20 -0
  63. package/lib/types/functions/text/register-id/index.d.ts +20 -0
  64. package/lib/types/functions/text/textsplit/index.d.ts +1 -0
  65. package/lib/types/functions/web/filterxml/index.d.ts +22 -0
  66. package/lib/types/functions/web/function-map.d.ts +2 -2
  67. package/lib/types/functions/web/webservice/index.d.ts +20 -0
  68. package/lib/types/index.d.ts +3 -1
  69. package/lib/types/models/formula-data.model.d.ts +1 -0
  70. package/lib/types/services/active-dirty-manager.service.d.ts +2 -1
  71. package/lib/types/services/calculate-formula.service.d.ts +2 -2
  72. package/lib/types/services/defined-names.service.d.ts +2 -2
  73. package/lib/types/services/formula-calculation-trigger.service.d.ts +38 -0
  74. package/lib/types/services/runtime.service.d.ts +6 -0
  75. package/lib/umd/index.js +5 -2
  76. package/package.json +5 -5
package/lib/es/index.js CHANGED
@@ -1,4 +1,4 @@
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, 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, 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
3
  import { BehaviorSubject, Observable, Subject, bufferWhen, combineLatest, distinctUntilChanged, filter, map, shareReplay, skip } from "rxjs";
4
4
  import Decimal from "decimal.js";
@@ -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,7 +1451,7 @@ 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
1456
  const REFERENCE_TABLE_ALL_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}$`;
1397
1457
  const REFERENCE_TABLE_SINGLE_COLUMN_REGEX = `^(${UNIT_NAME_REGEX})?${TABLE_NAME_REGEX}(${TABLE_CONTENT_REGEX}|\\[${TABLE_TITLE_REGEX}${TABLE_CONTENT_REGEX}\\])+$`;
@@ -1970,16 +2030,38 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
1970
2030
  getDefinedNameMap(unitId) {
1971
2031
  return this._definedNameMap[unitId];
1972
2032
  }
1973
- getValueByName(unitId, name) {
1974
- const cachedMap = this._nameCacheMap[unitId];
1975
- if (cachedMap) return cachedMap[name.toLowerCase()] || null;
2033
+ getValueByName(unitId, name, sheetId) {
1976
2034
  const nameMap = this._definedNameMap[unitId];
1977
2035
  if (nameMap === void 0) return null;
2036
+ if (sheetId) {
2037
+ var _workbookScope;
2038
+ const normalizedName = name.toLowerCase();
2039
+ let workbookScope = null;
2040
+ let firstMatch = null;
2041
+ for (const item of Object.values(nameMap)) {
2042
+ if (item.name.toLowerCase() !== normalizedName) continue;
2043
+ if (firstMatch == null) firstMatch = item;
2044
+ if (item.localSheetId === sheetId) return item;
2045
+ if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null) {
2046
+ if (workbookScope == null) workbookScope = item;
2047
+ }
2048
+ }
2049
+ return (_workbookScope = workbookScope) !== null && _workbookScope !== void 0 ? _workbookScope : firstMatch;
2050
+ }
2051
+ const cachedMap = this._nameCacheMap[unitId];
2052
+ if (cachedMap) return cachedMap[name.toLowerCase()] || null;
1978
2053
  let result = null;
1979
- for (const item of Object.values(nameMap)) if (item.name === name) {
2054
+ const normalizedName = name.toLowerCase();
2055
+ for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName && (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null)) {
1980
2056
  result = item;
1981
2057
  break;
1982
2058
  }
2059
+ if (!result) {
2060
+ for (const item of Object.values(nameMap)) if (item.name.toLowerCase() === normalizedName) {
2061
+ result = item;
2062
+ break;
2063
+ }
2064
+ }
1983
2065
  if (result) {
1984
2066
  this._nameCacheMap[unitId] = this._nameCacheMap[unitId] || {};
1985
2067
  this._nameCacheMap[unitId][name.toLowerCase()] = result;
@@ -2014,7 +2096,10 @@ let DefinedNamesService = class DefinedNamesService extends Disposable {
2014
2096
  return;
2015
2097
  }
2016
2098
  this._nameCacheMap[unitId] = {};
2017
- for (const item of Object.values(nameMap)) this._nameCacheMap[unitId][item.name.toLowerCase()] = item;
2099
+ for (const item of Object.values(nameMap)) {
2100
+ const normalizedName = item.name.toLowerCase();
2101
+ if (item.localSheetId === "AllDefaultWorkbook" || item.localSheetId == null || this._nameCacheMap[unitId][normalizedName] == null) this._nameCacheMap[unitId][normalizedName] = item;
2102
+ }
2018
2103
  }
2019
2104
  _isDeepDefinedNameMapEmpty() {
2020
2105
  for (const unitId in this._definedNameMap) if (this.hasDefinedName(unitId)) return false;
@@ -2587,6 +2672,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2587
2672
  FUNCTION_NAMES_LOGICAL["BYCOL"] = "BYCOL";
2588
2673
  FUNCTION_NAMES_LOGICAL["BYROW"] = "BYROW";
2589
2674
  FUNCTION_NAMES_LOGICAL["FALSE"] = "FALSE";
2675
+ FUNCTION_NAMES_LOGICAL["GROUPBY"] = "GROUPBY";
2590
2676
  FUNCTION_NAMES_LOGICAL["IF"] = "IF";
2591
2677
  FUNCTION_NAMES_LOGICAL["IFERROR"] = "IFERROR";
2592
2678
  FUNCTION_NAMES_LOGICAL["IFNA"] = "IFNA";
@@ -2597,6 +2683,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2597
2683
  FUNCTION_NAMES_LOGICAL["MAP"] = "MAP";
2598
2684
  FUNCTION_NAMES_LOGICAL["NOT"] = "NOT";
2599
2685
  FUNCTION_NAMES_LOGICAL["OR"] = "OR";
2686
+ FUNCTION_NAMES_LOGICAL["PERCENTOF"] = "PERCENTOF";
2600
2687
  FUNCTION_NAMES_LOGICAL["REDUCE"] = "REDUCE";
2601
2688
  FUNCTION_NAMES_LOGICAL["SCAN"] = "SCAN";
2602
2689
  FUNCTION_NAMES_LOGICAL["SWITCH"] = "SWITCH";
@@ -2624,6 +2711,7 @@ let FUNCTION_NAMES_LOGICAL = /* @__PURE__ */ function(FUNCTION_NAMES_LOGICAL) {
2624
2711
  */
2625
2712
  let FUNCTION_NAMES_LOOKUP = /* @__PURE__ */ function(FUNCTION_NAMES_LOOKUP) {
2626
2713
  FUNCTION_NAMES_LOOKUP["ADDRESS"] = "ADDRESS";
2714
+ FUNCTION_NAMES_LOOKUP["ANCHORARRAY"] = "ANCHORARRAY";
2627
2715
  FUNCTION_NAMES_LOOKUP["AREAS"] = "AREAS";
2628
2716
  FUNCTION_NAMES_LOOKUP["CHOOSE"] = "CHOOSE";
2629
2717
  FUNCTION_NAMES_LOOKUP["CHOOSECOLS"] = "CHOOSECOLS";
@@ -2946,6 +3034,7 @@ let FUNCTION_NAMES_TEXT = /* @__PURE__ */ function(FUNCTION_NAMES_TEXT) {
2946
3034
  FUNCTION_NAMES_TEXT["PROPER"] = "PROPER";
2947
3035
  FUNCTION_NAMES_TEXT["REGEXEXTRACT"] = "REGEXEXTRACT";
2948
3036
  FUNCTION_NAMES_TEXT["REGEXMATCH"] = "REGEXMATCH";
3037
+ FUNCTION_NAMES_TEXT["REGEXTEST"] = "REGEXTEST";
2949
3038
  FUNCTION_NAMES_TEXT["REGEXREPLACE"] = "REGEXREPLACE";
2950
3039
  FUNCTION_NAMES_TEXT["REPLACE"] = "REPLACE";
2951
3040
  FUNCTION_NAMES_TEXT["REPLACEB"] = "REPLACEB";
@@ -3057,6 +3146,7 @@ const NEW_EXCEL_FUNCTIONS = /* @__PURE__ */ new Set([
3057
3146
  "SHEETS",
3058
3147
  "IFNA",
3059
3148
  "IFS",
3149
+ "GROUPBY",
3060
3150
  "SWITCH",
3061
3151
  "XOR",
3062
3152
  "BETA.DIST",
@@ -3151,7 +3241,7 @@ function deserializeRangeWithSheetWithCache(refString) {
3151
3241
  if (refCache) return refCache;
3152
3242
  const result = deserializeRangeWithSheet(refString);
3153
3243
  referenceToRangeCache.set(refString, result);
3154
- return deserializeRangeWithSheet(refString);
3244
+ return result;
3155
3245
  }
3156
3246
  function clearReferenceToRangeCache() {
3157
3247
  referenceToRangeCache.clear();
@@ -3710,7 +3800,7 @@ var LexerTreeBuilder = class extends Disposable {
3710
3800
  return this._currentLexerNode;
3711
3801
  }
3712
3802
  _handleDefinedName(sequenceArray, param) {
3713
- const { unitId, getValueByName, getSheetName } = param;
3803
+ const { unitId, sheetId, getValueByName, getSheetName } = param;
3714
3804
  if (unitId == null) return {
3715
3805
  sequenceString: "",
3716
3806
  hasDefinedName: false,
@@ -3730,14 +3820,15 @@ var LexerTreeBuilder = class extends Disposable {
3730
3820
  let token = tokenRaw;
3731
3821
  if (nodeType === 4 || nodeType === 3) {
3732
3822
  if (nodeType === 3) token = this._getHasSheetNameDefinedName(tokenRaw, unitId, param);
3733
- const definedContent = getValueByName(unitId, token);
3823
+ const definedNameToken = token.trim();
3824
+ const definedContent = getValueByName(unitId, definedNameToken, sheetId);
3734
3825
  if (definedContent) {
3735
3826
  const refString = definedContent.formulaOrRefString;
3736
3827
  const nestedDefinedNameParam = this._handleNestedDefinedName(refString, param);
3737
3828
  if (nestedDefinedNameParam == null || typeof nestedDefinedNameParam !== "object") {
3738
3829
  sequenceString += nestedDefinedNameParam || "#NAME?";
3739
3830
  hasDefinedName = true;
3740
- definedNames.push(token);
3831
+ definedNames.push(definedNameToken);
3741
3832
  } else if (typeof nestedDefinedNameParam === "object") {
3742
3833
  const { sequenceString: nestedSequenceString, definedNames: nestedDefinedNames } = nestedDefinedNameParam;
3743
3834
  sequenceString += nestedSequenceString;
@@ -3746,10 +3837,10 @@ var LexerTreeBuilder = class extends Disposable {
3746
3837
  });
3747
3838
  hasDefinedName = true;
3748
3839
  }
3749
- } else if (this._checkDefinedNameDirty(token, param)) {
3840
+ } else if (this._checkDefinedNameDirty(definedNameToken, param)) {
3750
3841
  sequenceString += "#NAME?";
3751
3842
  hasDefinedName = true;
3752
- definedNames.push(token);
3843
+ definedNames.push(definedNameToken);
3753
3844
  } else sequenceString += token;
3754
3845
  } else sequenceString += token;
3755
3846
  }
@@ -4163,7 +4254,7 @@ var LexerTreeBuilder = class extends Disposable {
4163
4254
  }
4164
4255
  }
4165
4256
  _nodeMaker(formulaStringRaw, sequenceArray, matchCurrentNodeIndex) {
4166
- let formulaString = formulaStringRaw.replace(/\r\n$|\r|\n/g, " ");
4257
+ let formulaString = formulaStringRaw.replace(/(?:\r\n|\r|\n)$/g, " ");
4167
4258
  if (formulaString.substring(0, 1) === "=") formulaString = formulaString.substring(1);
4168
4259
  const formulaChars = formulaString.split("");
4169
4260
  const charsCount = formulaChars.length;
@@ -4917,7 +5008,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4917
5008
  for (let j = 0; j < worksheets.length; j++) {
4918
5009
  const worksheet = worksheets[j];
4919
5010
  const cellMatrix = worksheet.getCellMatrix();
4920
- initSheetFormulaData(formulaData, unitId, worksheet.getSheetId(), cellMatrix);
5011
+ const sheetId = worksheet.getSheetId();
5012
+ this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
5013
+ initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
4921
5014
  }
4922
5015
  }
4923
5016
  const allBases = this._univerInstanceService.getAllUnitsForType(UniverInstanceType.UNIVER_BASE);
@@ -4929,7 +5022,6 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4929
5022
  const tables = Object.values(snapshot.tables);
4930
5023
  for (let j = 0; j < tables.length; j++) {
4931
5024
  const table = tables[j];
4932
- if (table.deleted) continue;
4933
5025
  const tableFormulaData = {};
4934
5026
  const recordOrder = table.recordOrder;
4935
5027
  if (!recordOrder) {
@@ -4938,13 +5030,12 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4938
5030
  }
4939
5031
  for (let row = 0; row < recordOrder.length; row++) {
4940
5032
  const recordId = recordOrder[row];
4941
- const record = table.records[recordId];
4942
- if (!record || record.deleted) continue;
5033
+ if (!table.records[recordId]) continue;
4943
5034
  for (let col = 0; col < table.fieldOrder.length; col++) {
4944
5035
  var _field$config$formula, _field$config, _row, _tableFormulaData$_ro;
4945
5036
  const fieldId = table.fieldOrder[col];
4946
5037
  const field = table.fields[fieldId];
4947
- if (!field || field.deleted || field.type !== "formula") continue;
5038
+ if (!field || field.type !== "formula") continue;
4948
5039
  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
5040
  if (!formula) continue;
4950
5041
  (_tableFormulaData$_ro = tableFormulaData[_row = row]) !== null && _tableFormulaData$_ro !== void 0 || (tableFormulaData[_row] = {});
@@ -4966,7 +5057,9 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
4966
5057
  formulaData[unitId] = {};
4967
5058
  const worksheet = workbook.getSheetBySheetId(sheetId);
4968
5059
  if (worksheet == null) return {};
4969
- initSheetFormulaData(formulaData, unitId, sheetId, worksheet.getCellMatrix());
5060
+ const cellMatrix = worksheet.getCellMatrix();
5061
+ this._initSheetArrayFormulaData(unitId, sheetId, cellMatrix);
5062
+ initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix);
4970
5063
  return formulaData[unitId][sheetId];
4971
5064
  }
4972
5065
  getArrayFormulaRange() {
@@ -5066,18 +5159,12 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5066
5159
  const unitId = base.getUnitId();
5067
5160
  const baseData = {};
5068
5161
  const tableNameMap = {};
5069
- for (const table of Object.values(snapshot.tables).filter((item) => !item.deleted)) {
5070
- var _table$recordOrder$fi, _table$recordOrder;
5162
+ for (const table of Object.values(snapshot.tables)) {
5163
+ var _table$recordOrder$le, _table$recordOrder;
5071
5164
  baseData[table.id] = {
5072
5165
  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,
5166
+ 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,
5167
+ columnCount: table.fieldOrder.length,
5081
5168
  rowData: {},
5082
5169
  columnData: {}
5083
5170
  };
@@ -5263,7 +5350,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5263
5350
  for (const unitId in formulaData) {
5264
5351
  const workbook = formulaData[unitId];
5265
5352
  if (!workbook) continue;
5266
- const workbookInstance = this._univerInstanceService.getUnit(unitId);
5353
+ const workbookInstance = this._univerInstanceService.getUnit(unitId, UniverInstanceType.UNIVER_SHEET);
5267
5354
  if (!workbookInstance) continue;
5268
5355
  for (const sheetId in workbook) {
5269
5356
  const sheet = workbook[sheetId];
@@ -5277,7 +5364,7 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5277
5364
  const column = Number(columnStr);
5278
5365
  const currentCell = sheetInstance.getCellRaw(row, column);
5279
5366
  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";
5367
+ const noValue = (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === void 0 || (currentCell === null || currentCell === void 0 ? void 0 : currentCell.v) === null;
5281
5368
  if (!(isFormula && noValue)) continue;
5282
5369
  if (!columnRanges[column]) columnRanges[column] = [];
5283
5370
  const lastRange = columnRanges[column].slice(-1)[0];
@@ -5326,6 +5413,39 @@ let FormulaDataModel = class FormulaDataModel extends Disposable {
5326
5413
  });
5327
5414
  return formulaIdMap;
5328
5415
  }
5416
+ _initSheetArrayFormulaData(unitId, sheetId, cellMatrix) {
5417
+ let arrayFormulaRangeMatrix;
5418
+ let arrayFormulaCellDataMatrix;
5419
+ const formulaIds = /* @__PURE__ */ new Set();
5420
+ cellMatrix.forValue((_, __, cell) => {
5421
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5422
+ if (isFormulaString(cell === null || cell === void 0 ? void 0 : cell.f) && isFormulaId(formulaId)) formulaIds.add(String(formulaId));
5423
+ });
5424
+ cellMatrix.forValue((row, column, cell) => {
5425
+ var _arrayFormulaRangeMat, _this$_arrayFormulaRa7, _arrayFormulaCellData, _this$_arrayFormulaCe5;
5426
+ const ref = cell === null || cell === void 0 ? void 0 : cell.ref;
5427
+ const formula = cell === null || cell === void 0 ? void 0 : cell.f;
5428
+ const formulaId = cell === null || cell === void 0 ? void 0 : cell.si;
5429
+ const hasOwnFormula = isFormulaString(formula);
5430
+ const hasSharedFormula = isFormulaId(formulaId) && formulaIds.has(String(formulaId));
5431
+ if (!hasOwnFormula && !hasSharedFormula || typeof ref !== "string" || ref.length === 0) return true;
5432
+ const { range } = deserializeRangeWithSheet(ref);
5433
+ if (!Number.isFinite(range.startRow) || !Number.isFinite(range.startColumn) || !Number.isFinite(range.endRow) || !Number.isFinite(range.endColumn)) return true;
5434
+ if (range.startRow === row && range.endRow === row && range.startColumn === column && range.endColumn === column && !isArrayConstantFormula(formula)) return true;
5435
+ if (!this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId] = {};
5436
+ if (!this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId] = {};
5437
+ (_arrayFormulaRangeMat = arrayFormulaRangeMatrix) !== null && _arrayFormulaRangeMat !== void 0 || (arrayFormulaRangeMatrix = new ObjectMatrix((_this$_arrayFormulaRa7 = this._arrayFormulaRange[unitId]) === null || _this$_arrayFormulaRa7 === void 0 ? void 0 : _this$_arrayFormulaRa7[sheetId]));
5438
+ (_arrayFormulaCellData = arrayFormulaCellDataMatrix) !== null && _arrayFormulaCellData !== void 0 || (arrayFormulaCellDataMatrix = new ObjectMatrix((_this$_arrayFormulaCe5 = this._arrayFormulaCellData[unitId]) === null || _this$_arrayFormulaCe5 === void 0 ? void 0 : _this$_arrayFormulaCe5[sheetId]));
5439
+ if (arrayFormulaRangeMatrix.getValue(row, column) == null) arrayFormulaRangeMatrix.setValue(row, column, range);
5440
+ for (let r = range.startRow; r <= range.endRow; r++) for (let c = range.startColumn; c <= range.endColumn; c++) {
5441
+ if (arrayFormulaCellDataMatrix.getValue(r, c) != null) continue;
5442
+ const rangeCell = cellMatrix.getValue(r, c);
5443
+ if (rangeCell != null) arrayFormulaCellDataMatrix.setValue(r, c, { ...rangeCell });
5444
+ }
5445
+ });
5446
+ if (arrayFormulaRangeMatrix && this._arrayFormulaRange[unitId]) this._arrayFormulaRange[unitId][sheetId] = arrayFormulaRangeMatrix.getData();
5447
+ if (arrayFormulaCellDataMatrix && this._arrayFormulaCellData[unitId]) this._arrayFormulaCellData[unitId][sheetId] = arrayFormulaCellDataMatrix.getData();
5448
+ }
5329
5449
  };
5330
5450
  FormulaDataModel = __decorate([__decorateParam(0, IUniverInstanceService), __decorateParam(1, Inject(LexerTreeBuilder))], FormulaDataModel);
5331
5451
  function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
@@ -5360,9 +5480,9 @@ function initSheetFormulaData(formulaData, unitId, sheetId, cellMatrix) {
5360
5480
  if (isFormulaId(formulaId) && !isFormulaString(formulaString)) {
5361
5481
  const formulaInfo = formulaIdMap.get(formulaId);
5362
5482
  if (formulaInfo) {
5363
- const f = formulaInfo.f;
5364
5483
  const x = c - formulaInfo.c;
5365
5484
  const y = r - formulaInfo.r;
5485
+ const f = formulaInfo.f;
5366
5486
  sheetFormulaDataMatrix.setValue(r, c, {
5367
5487
  f,
5368
5488
  si: formulaId,
@@ -5397,12 +5517,9 @@ function createEngineThisRowRef(table, fieldName, snapshot) {
5397
5517
  function getEngineBaseTableName(table, snapshot) {
5398
5518
  const tables = Object.values(snapshot.tables);
5399
5519
  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
- }
5520
+ for (let i = 0; i < tables.length; i++) if (tables[i].name === table.name) {
5521
+ sameNameCount++;
5522
+ if (sameNameCount > 1) break;
5406
5523
  }
5407
5524
  return sameNameCount === 1 ? table.name : table.id;
5408
5525
  }
@@ -5411,14 +5528,14 @@ function buildBaseRuntimeCellData(table) {
5411
5528
  const fieldOrder = [];
5412
5529
  for (let i = 0; i < table.fieldOrder.length; i++) {
5413
5530
  const fieldId = table.fieldOrder[i];
5414
- if (table.fields[fieldId] && !table.fields[fieldId].deleted) fieldOrder.push(fieldId);
5531
+ if (table.fields[fieldId]) fieldOrder.push(fieldId);
5415
5532
  }
5416
5533
  let recordOrder;
5417
5534
  if (table.recordOrder) {
5418
5535
  recordOrder = [];
5419
5536
  for (let i = 0; i < table.recordOrder.length; i++) {
5420
5537
  const recordId = table.recordOrder[i];
5421
- if (table.records[recordId] && !table.records[recordId].deleted) recordOrder.push(recordId);
5538
+ if (table.records[recordId]) recordOrder.push(recordId);
5422
5539
  }
5423
5540
  } else {
5424
5541
  var _table$records;
@@ -5426,7 +5543,7 @@ function buildBaseRuntimeCellData(table) {
5426
5543
  const records = [];
5427
5544
  for (let i = 0; i < allRecords.length; i++) {
5428
5545
  const record = allRecords[i];
5429
- if (!record.deleted) records.push(record);
5546
+ records.push(record);
5430
5547
  }
5431
5548
  records.sort((a, b) => a.orderKey.localeCompare(b.orderKey));
5432
5549
  recordOrder = [];
@@ -5438,7 +5555,7 @@ function buildBaseRuntimeCellData(table) {
5438
5555
  for (let row = 0; row < recordOrder.length; row++) {
5439
5556
  const recordId = recordOrder[row];
5440
5557
  const record = table.records[recordId];
5441
- if (!record || record.deleted) continue;
5558
+ if (!record) continue;
5442
5559
  cellData[row] = { ...cellData[row] };
5443
5560
  for (let col = 0; col < fieldOrder.length; col++) {
5444
5561
  var _record$values;
@@ -5490,14 +5607,17 @@ function inferBaseRuntimeCellType(value) {
5490
5607
  if (typeof value === "string") return CellValueType.STRING;
5491
5608
  return null;
5492
5609
  }
5610
+ function isArrayConstantFormula(formula) {
5611
+ return typeof formula === "string" && /^=\s*\{/.test(formula);
5612
+ }
5493
5613
  function isBaseCellData(value) {
5494
5614
  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
5615
  }
5496
5616
  function resolveBaseFormulaTable(tableName, currentTable, snapshot) {
5497
5617
  if (!tableName || tableName === "table" || tableName === currentTable.id || tableName === currentTable.name) return currentTable;
5498
5618
  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);
5619
+ if (byId) return byId;
5620
+ const matches = Object.values(snapshot.tables).filter((table) => table.name === tableName);
5501
5621
  return matches.length === 1 ? matches[0] : void 0;
5502
5622
  }
5503
5623
 
@@ -5758,7 +5878,7 @@ let FormulaCurrentConfigService = class FormulaCurrentConfigService extends Disp
5758
5878
  const workbook = this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_SHEET);
5759
5879
  const worksheet = workbook === null || workbook === void 0 ? void 0 : workbook.getActiveSheet();
5760
5880
  const base = workbook ? null : this._univerInstanceService.getCurrentUnitOfType(UniverInstanceType.UNIVER_BASE);
5761
- const table = base ? getFirstLiveBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
5881
+ const table = base ? getFirstBaseTable(base.getSnapshot().tables, base.getSnapshot().tableOrder) : null;
5762
5882
  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
5883
  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
5884
  return this._formulaDataModel.getCalculateData();
@@ -5791,33 +5911,18 @@ FormulaCurrentConfigService = __decorate([
5791
5911
  __decorateParam(2, Inject(FormulaDataModel)),
5792
5912
  __decorateParam(3, Inject(ISheetRowFilteredService))
5793
5913
  ], FormulaCurrentConfigService);
5794
- function getFirstLiveBaseTable(tables, tableOrder) {
5795
- var _Object$values$find;
5914
+ function getFirstBaseTable(tables, tableOrder) {
5915
+ var _Object$values$;
5796
5916
  for (const tableId of tableOrder) {
5797
5917
  const table = tables[tableId];
5798
- if (table && !table.deleted) return table;
5918
+ if (table) return table;
5799
5919
  }
5800
- return (_Object$values$find = Object.values(tables).find((table) => !table.deleted)) !== null && _Object$values$find !== void 0 ? _Object$values$find : null;
5920
+ return (_Object$values$ = Object.values(tables)[0]) !== null && _Object$values$ !== void 0 ? _Object$values$ : null;
5801
5921
  }
5802
5922
  const IFormulaCurrentConfigService = createIdentifier("univer.formula.current-data.service");
5803
5923
 
5804
5924
  //#endregion
5805
5925
  //#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
5926
  let Lexer = class Lexer extends Disposable {
5822
5927
  constructor(_definedNamesService, _lexerTreeBuilder, _formulaCurrentConfigService) {
5823
5928
  super();
@@ -5825,10 +5930,11 @@ let Lexer = class Lexer extends Disposable {
5825
5930
  this._lexerTreeBuilder = _lexerTreeBuilder;
5826
5931
  this._formulaCurrentConfigService = _formulaCurrentConfigService;
5827
5932
  }
5828
- treeBuilder(formulaString, transformSuffix = true) {
5933
+ treeBuilder(formulaString, transformSuffix = true, unitId) {
5829
5934
  if (this._definedNamesService.getAllDefinedNamesIsEmpty()) return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix);
5830
5935
  return this._lexerTreeBuilder.treeBuilder(formulaString, transformSuffix, {
5831
- unitId: this._formulaCurrentConfigService.getExecuteUnitId(),
5936
+ unitId: unitId !== null && unitId !== void 0 ? unitId : this._formulaCurrentConfigService.getExecuteUnitId(),
5937
+ sheetId: this._formulaCurrentConfigService.getExecuteSubUnitId(),
5832
5938
  getValueByName: this._definedNamesService.getValueByName.bind(this._definedNamesService),
5833
5939
  getDirtyDefinedNameMap: this._formulaCurrentConfigService.getDirtyDefinedNameMap.bind(this._formulaCurrentConfigService),
5834
5940
  getSheetName: this._formulaCurrentConfigService.getSheetName.bind(this._formulaCurrentConfigService)
@@ -5850,10 +5956,13 @@ function getCellValue(cell) {
5850
5956
  const body = cell === null || cell === void 0 ? void 0 : cell.p.body;
5851
5957
  if (body == null) return 0;
5852
5958
  const data = body.dataStream;
5853
- return BuildTextUtils.transform.getPlainText(data);
5959
+ return normalizeRichTextFormulaValue(BuildTextUtils.transform.getPlainText(data));
5854
5960
  }
5855
5961
  return (_cell$v = cell === null || cell === void 0 ? void 0 : cell.v) !== null && _cell$v !== void 0 ? _cell$v : 0;
5856
5962
  }
5963
+ function normalizeRichTextFormulaValue(value) {
5964
+ return value.replace(/\r\n|\r|\n/g, "\r\n");
5965
+ }
5857
5966
  /**
5858
5967
  * Extract the formula error from the cell
5859
5968
  * @param cell
@@ -6092,24 +6201,16 @@ function reverseCompareOperator(operator) {
6092
6201
  Reference https://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excel
6093
6202
  */
6094
6203
  function plus(a, b) {
6095
- const result = a + b;
6096
- if (Number.isSafeInteger(result)) return result;
6097
- return new Decimal(a).add(b).toNumber();
6204
+ return a + b;
6098
6205
  }
6099
6206
  function minus(a, b) {
6100
- const result = a - b;
6101
- if (Number.isSafeInteger(result)) return result;
6102
- return new Decimal(a).sub(b).toNumber();
6207
+ return a - b;
6103
6208
  }
6104
6209
  function multiply(a, b) {
6105
- const result = a * b;
6106
- if (Number.isSafeInteger(result)) return result;
6107
- return new Decimal(a).mul(b).toNumber();
6210
+ return a * b;
6108
6211
  }
6109
6212
  function divide(a, b) {
6110
- const result = a / b;
6111
- if (Number.isSafeInteger(result)) return result;
6112
- return new Decimal(a).div(b).toNumber();
6213
+ return a / b;
6113
6214
  }
6114
6215
  /**
6115
6216
  * Rounds a number to a specified number of decimal places.
@@ -6181,7 +6282,7 @@ function sqrt(base) {
6181
6282
  * @returns True if numbers are equal, false otherwise.
6182
6283
  */
6183
6284
  function equals(a, b) {
6184
- return a === b;
6285
+ return a === b || stripErrorMargin(a) === stripErrorMargin(b);
6185
6286
  }
6186
6287
  /**
6187
6288
  * Checks if the first number is greater than the second number.
@@ -6190,7 +6291,7 @@ function equals(a, b) {
6190
6291
  * @returns True if a is greater than b, false otherwise.
6191
6292
  */
6192
6293
  function greaterThan(a, b) {
6193
- return a > b;
6294
+ return !equals(a, b) && stripErrorMargin(a) > stripErrorMargin(b);
6194
6295
  }
6195
6296
  /**
6196
6297
  * Checks if the first number is greater than or equal to the second number.
@@ -6199,7 +6300,7 @@ function greaterThan(a, b) {
6199
6300
  * @returns True if a is greater than or equal to b, false otherwise.
6200
6301
  */
6201
6302
  function greaterThanOrEquals(a, b) {
6202
- return a >= b;
6303
+ return equals(a, b) || stripErrorMargin(a) > stripErrorMargin(b);
6203
6304
  }
6204
6305
  /**
6205
6306
  * Checks if the first number is less than the second number.
@@ -6208,7 +6309,7 @@ function greaterThanOrEquals(a, b) {
6208
6309
  * @returns True if a is less than b, false otherwise.
6209
6310
  */
6210
6311
  function lessThan(a, b) {
6211
- return a < b;
6312
+ return !equals(a, b) && stripErrorMargin(a) < stripErrorMargin(b);
6212
6313
  }
6213
6314
  /**
6214
6315
  * Checks if the first number is less than or equal to the second number.
@@ -6217,7 +6318,7 @@ function lessThan(a, b) {
6217
6318
  * @returns True if a is less than or equal to b, false otherwise.
6218
6319
  */
6219
6320
  function lessThanOrEquals(a, b) {
6220
- return a <= b;
6321
+ return equals(a, b) || stripErrorMargin(a) < stripErrorMargin(b);
6221
6322
  }
6222
6323
  /**
6223
6324
  * Complete the number to the specified accuracy and solve the accuracy error,
@@ -6485,8 +6586,8 @@ var BooleanValueObject = class BooleanValueObject extends BaseValueObject {
6485
6586
  case ">=": return true;
6486
6587
  case "=":
6487
6588
  case "<":
6488
- case "<=":
6489
- case "<>": return false;
6589
+ case "<=": return false;
6590
+ case "<>": return true;
6490
6591
  }
6491
6592
  }
6492
6593
  concatenateFront(valueObject) {
@@ -7108,12 +7209,13 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
7108
7209
  return BooleanValueObject.create(result);
7109
7210
  }
7110
7211
  _compareString(currentValue, value, operator) {
7212
+ const compareResult = currentValue.localeCompare(value);
7111
7213
  switch (operator) {
7112
7214
  case "=": return currentValue === value;
7113
- case ">": return currentValue > value;
7114
- case ">=": return currentValue >= value;
7115
- case "<": return currentValue < value;
7116
- case "<=": return currentValue <= value;
7215
+ case ">": return compareResult > 0;
7216
+ case ">=": return currentValue === value || compareResult > 0;
7217
+ case "<": return compareResult < 0;
7218
+ case "<=": return currentValue === value || compareResult < 0;
7117
7219
  case "<>": return currentValue !== value;
7118
7220
  }
7119
7221
  }
@@ -7139,6 +7241,7 @@ var StringValueObject = class StringValueObject extends BaseValueObject {
7139
7241
  }
7140
7242
  convertToNumberObjectValue() {
7141
7243
  const rawValue = this.getValue();
7244
+ if (rawValue.trim() === "") return ErrorValueObject.create("#VALUE!");
7142
7245
  const parseData = getNumfmtParseValueFilter(rawValue);
7143
7246
  if (parseData && parseData.z) return createNumberValueObjectByRawValue(parseData.v, parseData.z);
7144
7247
  return createNumberValueObjectByRawValue(rawValue);
@@ -7247,6 +7350,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7247
7350
  _defineProperty(this, "_sheetId", "");
7248
7351
  _defineProperty(this, "_currentRow", -1);
7249
7352
  _defineProperty(this, "_currentColumn", -1);
7353
+ _defineProperty(this, "_useInvertedIndexCache", false);
7354
+ _defineProperty(this, "_legacyImplicitForAggregate", false);
7250
7355
  _defineProperty(this, "_sliceCache", /* @__PURE__ */ new Map());
7251
7356
  _defineProperty(this, "_flattenCache", void 0);
7252
7357
  _defineProperty(this, "_defaultValue", null);
@@ -7298,6 +7403,15 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7298
7403
  getCurrentColumn() {
7299
7404
  return this._currentColumn;
7300
7405
  }
7406
+ usesInvertedIndexCache() {
7407
+ return this._useInvertedIndexCache;
7408
+ }
7409
+ usesLegacyImplicitForAggregate() {
7410
+ return this._legacyImplicitForAggregate;
7411
+ }
7412
+ setLegacyImplicitForAggregate(value) {
7413
+ this._legacyImplicitForAggregate = value;
7414
+ }
7301
7415
  getArrayValue() {
7302
7416
  return this._values;
7303
7417
  }
@@ -7564,6 +7678,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7564
7678
  if (itemValue == null || itemValue.isNull()) return true;
7565
7679
  let matchObject;
7566
7680
  if (isFuzzyMatching === true) matchObject = itemValue.compare(valueObject, "=");
7681
+ else if (searchType === 0 && itemValue.isNumber() && valueObject.isNumber()) matchObject = BooleanValueObject.create(Number(itemValue.getValue()) === Number(valueObject.getValue()));
7567
7682
  else matchObject = itemValue.isEqual(valueObject);
7568
7683
  if ((matchObject === null || matchObject === void 0 ? void 0 : matchObject.getValue()) === true) {
7569
7684
  result = itemValue;
@@ -7686,7 +7801,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7686
7801
  return false;
7687
7802
  }
7688
7803
  if (valueObject.isString() || valueObject.isNull() || valueObject.isBoolean()) return true;
7689
- if (accumulatorAll.isLessThan(valueObject).getValue()) accumulatorAll = valueObject;
7804
+ if (Number(accumulatorAll.getValue()) < Number(valueObject.getValue())) accumulatorAll = valueObject;
7690
7805
  });
7691
7806
  return accumulatorAll;
7692
7807
  }
@@ -7727,7 +7842,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7727
7842
  return accumulatorAll;
7728
7843
  }
7729
7844
  getNegative() {
7730
- return ArrayValueObject.create("{0}").minus(this);
7845
+ return this.mapValue((valueObject) => NumberValueObject.create(0).minus(valueObject));
7731
7846
  }
7732
7847
  getReciprocal() {
7733
7848
  return ArrayValueObject.create("{1}").divided(this);
@@ -7779,12 +7894,10 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
7779
7894
  for (let c = 0; c < columnCount; c++) {
7780
7895
  var _this$_values;
7781
7896
  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
- }
7897
+ const currentValue = this.getValueOrDefault(r, c);
7898
+ if (row == null && currentValue == null) rowList[c] = ErrorValueObject.create("#VALUE!");
7899
+ else if (currentValue) rowList[c] = callbackFn(currentValue, r, c);
7900
+ else rowList[c] = NullValueObject.create();
7788
7901
  }
7789
7902
  result.push(rowList);
7790
7903
  }
@@ -8094,7 +8207,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8094
8207
  * If comparison operations are conducted for a single numerical value,
8095
8208
  * then retrieve the judgment from the inverted index. This enhances performance.
8096
8209
  */
8097
- if (batchOperatorType === 5) {
8210
+ if (batchOperatorType === 5 && this._useInvertedIndexCache) {
8098
8211
  const { rowsInCache, rowsNotInCache } = CELL_INVERTED_INDEX_CACHE.canUseCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8099
8212
  if (rowsInCache.length > 0) {
8100
8213
  if (operator === "=" && !(valueObject.isString() && isWildcard(valueObject.getValue()))) {
@@ -8128,13 +8241,13 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8128
8241
  if (rowsNotInCache.length > 0) for (const interval of rowsNotInCache) {
8129
8242
  const [start, end] = interval;
8130
8243
  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);
8244
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, start, end);
8132
8245
  }
8133
8246
  return;
8134
8247
  }
8135
8248
  }
8136
8249
  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);
8250
+ if (this._useInvertedIndexCache) CELL_INVERTED_INDEX_CACHE.setContinueBuildingCache(unitId, sheetId, column + startColumn, startRow, startRow + rowCount - 1);
8138
8251
  }
8139
8252
  __batchOperatorRowValue(valueObject, column, result, batchOperatorType, r, unitId, sheetId, startRow, startColumn, operator, isCaseSensitive) {
8140
8253
  const currentValue = this.getValueOrDefault(r, column);
@@ -8184,7 +8297,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8184
8297
  break;
8185
8298
  }
8186
8299
  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);
8300
+ 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
8301
  }
8189
8302
  _batchOperatorArray(valueObject, batchOperatorType, operator, isCaseSensitive) {
8190
8303
  let rowCount = valueObject.getRowCount();
@@ -8255,7 +8368,9 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8255
8368
  }
8256
8369
  result.push(rowList);
8257
8370
  }
8258
- return this._createNewArray(result, rowCount, columnCount);
8371
+ const newArray = this._createNewArray(result, rowCount, columnCount);
8372
+ if (batchOperatorType === 1) newArray.setLegacyImplicitForAggregate(true);
8373
+ return newArray;
8259
8374
  }
8260
8375
  _checkArrayCalculateType(valueObject) {
8261
8376
  if (valueObject.getRowCount() === 1 && valueObject.getColumnCount() === 1) return 3;
@@ -8272,6 +8387,8 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8272
8387
  this._sheetId = rawValue.sheetId;
8273
8388
  this._currentRow = rawValue.row;
8274
8389
  this._currentColumn = rawValue.column;
8390
+ this._useInvertedIndexCache = rawValue.useInvertedIndexCache === true;
8391
+ this._legacyImplicitForAggregate = rawValue.legacyImplicitForAggregate === true;
8275
8392
  return rawValue.calculateValueList;
8276
8393
  }
8277
8394
  rawValue = rawValue.slice(1, -1);
@@ -8294,7 +8411,7 @@ var ArrayValueObject = class ArrayValueObject extends BaseValueObject {
8294
8411
  this._columnCount = maxColumnCount;
8295
8412
  return result;
8296
8413
  }
8297
- _createNewArray(result, rowCount, columnCount, row = -1, column = -1) {
8414
+ _createNewArray(result, rowCount, columnCount, row = this._currentRow, column = this._currentColumn) {
8298
8415
  if (this._currentColumn === -1 || this._currentRow === -1) {
8299
8416
  row = -1;
8300
8417
  column = -1;
@@ -8410,14 +8527,14 @@ var BaseReferenceObject = class extends ObjectClassType {
8410
8527
  }
8411
8528
  iterator(callback) {
8412
8529
  const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
8413
- if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#VALUE!"), startRow, startColumn);
8530
+ if (this._checkIfWorksheetMiss()) return callback(ErrorValueObject.create("#REF!"), startRow, startColumn);
8414
8531
  const unitId = this._forcedUnitId || this._defaultUnitId;
8415
8532
  const sheetId = this._forcedSheetId || this._defaultSheetId;
8416
8533
  for (let r = startRow; r <= endRow; r++) for (let c = startColumn; c <= endColumn; c++) {
8417
8534
  if (r < 0 || c < 0) return callback(ErrorValueObject.create("#REF!"), r, c);
8418
8535
  const cell = this.getCellData(r, c);
8419
8536
  let result = false;
8420
- if (isNullCell(cell)) {
8537
+ if (isNullCell(cell) && !isTypedEmptyStringCell(cell)) {
8421
8538
  result = callback(null, r, c);
8422
8539
  continue;
8423
8540
  }
@@ -8434,7 +8551,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8434
8551
  }
8435
8552
  }
8436
8553
  getFirstCell() {
8437
- if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#VALUE!");
8554
+ if (this._checkIfWorksheetMiss()) return ErrorValueObject.create("#REF!");
8438
8555
  const { startRow, startColumn } = this.getRangePosition();
8439
8556
  const cell = this.getCellData(startRow, startColumn);
8440
8557
  if (!cell) return NumberValueObject.create(0);
@@ -8613,14 +8730,15 @@ var BaseReferenceObject = class extends ObjectClassType {
8613
8730
  }
8614
8731
  getCellValueObject(cell) {
8615
8732
  const value = getCellValue(cell);
8733
+ const cellValueType = Number(cell.t);
8616
8734
  if (ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
8617
- if (cell.t === CellValueType.NUMBER) {
8735
+ if (cellValueType === CellValueType.NUMBER) {
8618
8736
  const pattern = this._getPatternByCell(cell);
8619
8737
  if (isTextFormat(pattern)) return StringValueObject.create(value.toString());
8620
8738
  return createNumberValueObjectByRawValue(value, pattern);
8621
8739
  }
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);
8740
+ if (cellValueType === CellValueType.STRING || cellValueType === CellValueType.FORCE_STRING) return StringValueObject.create(value.toString());
8741
+ if (cellValueType === CellValueType.BOOLEAN) return createBooleanValueObjectByRawValue(value);
8624
8742
  return ValueObjectFactory.create(value);
8625
8743
  }
8626
8744
  _getPatternByCell(cell) {
@@ -8696,7 +8814,7 @@ var BaseReferenceObject = class extends ObjectClassType {
8696
8814
  if (!row) row = rangeData.startRow;
8697
8815
  if (!column) column = rangeData.startColumn;
8698
8816
  const cell = this.getCellData(row, column);
8699
- if (!cell) return ErrorValueObject.create("#VALUE!");
8817
+ if (!cell) return NullValueObject.create();
8700
8818
  return this.getCellValueObject(cell);
8701
8819
  }
8702
8820
  setCurrentRowAndColumn(row, column) {
@@ -8750,7 +8868,8 @@ var BaseReferenceObject = class extends ObjectClassType {
8750
8868
  unitId: this.getUnitId(),
8751
8869
  sheetId: this.getSheetId(),
8752
8870
  row: startRow,
8753
- column: startColumn
8871
+ column: startColumn,
8872
+ useInvertedIndexCache: true
8754
8873
  };
8755
8874
  const arrayValueObject = ArrayValueObject.create(arrayValueObjectData);
8756
8875
  useCache && FORMULA_REF_TO_ARRAY_CACHE.set(key, arrayValueObject);
@@ -8780,6 +8899,9 @@ var BaseReferenceObject = class extends ObjectClassType {
8780
8899
  return ArrayValueObject.create(arrayValueObjectData);
8781
8900
  }
8782
8901
  };
8902
+ function isTypedEmptyStringCell(cell) {
8903
+ return (cell === null || cell === void 0 ? void 0 : cell.v) === "" && (cell.t === CellValueType.STRING || cell.t === CellValueType.FORCE_STRING);
8904
+ }
8783
8905
  var AsyncObject = class extends ObjectClassType {
8784
8906
  constructor(_promise) {
8785
8907
  super();
@@ -8841,6 +8963,8 @@ var RangeReferenceObject = class extends BaseReferenceObject {
8841
8963
 
8842
8964
  //#endregion
8843
8965
  //#region src/engine/reference-object/cell-reference-object.ts
8966
+ const EXCEL_MAX_ROWS = 1048576;
8967
+ const EXCEL_MAX_COLUMNS = 16384;
8844
8968
  var CellReferenceObject = class extends BaseReferenceObject {
8845
8969
  constructor(token) {
8846
8970
  super(token);
@@ -8852,6 +8976,12 @@ var CellReferenceObject = class extends BaseReferenceObject {
8852
8976
  isCell() {
8853
8977
  return true;
8854
8978
  }
8979
+ isExceedRange() {
8980
+ var _this$getForcedSheetI;
8981
+ 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;
8982
+ const { startRow, endRow, startColumn, endColumn } = this.getRangePosition();
8983
+ return startRow < 0 || startColumn < 0 || endRow >= EXCEL_MAX_ROWS || endColumn >= EXCEL_MAX_COLUMNS;
8984
+ }
8855
8985
  unionBy(referenceObject) {
8856
8986
  if (!referenceObject.isCell()) return ErrorValueObject.create("#REF!");
8857
8987
  const cellReferenceObject = referenceObject;
@@ -9335,11 +9465,11 @@ function getPairedRangeAndCriteriaResult(variants, params) {
9335
9465
  result = sum.divided(count);
9336
9466
  } else if (formulaName === "MAXIFS") {
9337
9467
  const picked = targetRange.pick(finalCompareResult);
9338
- if (picked.getColumnCount() === 0) result = ArrayValueObject.create("0");
9468
+ if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
9339
9469
  else result = picked.max();
9340
9470
  } else if (formulaName === "MINIFS") {
9341
9471
  const picked = targetRange.pick(finalCompareResult);
9342
- if (picked.getColumnCount() === 0) result = ArrayValueObject.create("0");
9472
+ if (picked.getColumnCount() === 0) result = NumberValueObject.create(0);
9343
9473
  else result = picked.min();
9344
9474
  }
9345
9475
  if (!results[rowIndex]) results[rowIndex] = [];
@@ -9351,13 +9481,25 @@ function getPairedRangeAndCriteriaResult(variants, params) {
9351
9481
  * Two ArrayValueObject of the same type can be compared
9352
9482
  */
9353
9483
  function filterSameValueObjectResult(array, range, criteria) {
9354
- const [operator, criteriaObject] = findCompareToken(`${criteria.getValue()}`);
9484
+ const [operator, criteriaObject] = criteria.isString() ? findCompareToken(`${criteria.getValue()}`) : ["=", criteria];
9355
9485
  return array.mapValue((valueObject, r, c) => {
9356
9486
  const rangeValueObject = range.get(r, c);
9487
+ const isBlankStringCriteria = criteriaObject.isString() && criteriaObject.getValue() === "";
9488
+ if (operator === "<>" && isBlankStringCriteria && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && rangeValueObject.getValue() === "") return BooleanValueObject.create(true);
9489
+ if (criteriaObject.isString() && criteriaObject.getValue() !== "" && (operator === "<" || operator === "<=") && (rangeValueObject == null || rangeValueObject.isNull() || rangeValueObject.isString() && rangeValueObject.getValue() === "")) return BooleanValueObject.create(false);
9490
+ if (criteriaObject.isString() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString()) && (operator === "<" || operator === "<=") && isSameLowerBoundBucket(rangeValueObject.getValue(), criteriaObject.getValue())) return BooleanValueObject.create(false);
9491
+ if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isNumber()) && criteriaObject.isString()) {
9492
+ const criteriaNumber = criteriaObject.convertToNumberObjectValue();
9493
+ if (criteriaNumber.isNumber()) return rangeValueObject.compare(criteriaNumber, operator);
9494
+ }
9495
+ if (criteriaObject.isNumber() && criteriaObject.isDateFormat() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
9496
+ const rangeNumber = rangeValueObject.convertToNumberObjectValue();
9497
+ if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
9498
+ }
9357
9499
  if (rangeValueObject && isSameValueObjectType(rangeValueObject, criteriaObject)) return valueObject;
9358
9500
  if ((rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isError()) && criteriaObject.isError() && rangeValueObject.getValue() === criteriaObject.getValue()) return BooleanValueObject.create(true);
9359
9501
  /**
9360
- * If the operator is '=' or '<>', we can compare numbers and strings directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
9502
+ * If the operator is '=' or '<>', we can compare string numbers against numeric criteria directly in COUNTIF, COUNTIFS, SUMIF, SUMIFS, etc.
9361
9503
  * Other operators require both valueObjects to be of the same type.
9362
9504
  * For example:
9363
9505
  * | A1 | B1 |
@@ -9369,10 +9511,6 @@ function filterSameValueObjectResult(array, range, criteria) {
9369
9511
  * =COUNTIF(A1:B1, '<=123') will return 1
9370
9512
  */
9371
9513
  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
9514
  if (criteriaObject.isNumber() && (rangeValueObject === null || rangeValueObject === void 0 ? void 0 : rangeValueObject.isString())) {
9377
9515
  const rangeNumber = rangeValueObject.convertToNumberObjectValue();
9378
9516
  if (rangeNumber.isNumber()) return rangeNumber.compare(criteriaObject, operator);
@@ -9383,6 +9521,11 @@ function filterSameValueObjectResult(array, range, criteria) {
9383
9521
  return BooleanValueObject.create(false);
9384
9522
  });
9385
9523
  }
9524
+ function isSameLowerBoundBucket(rangeValue, criteriaValue) {
9525
+ const criteriaMatch = criteriaValue.match(/^(\d+)\|/);
9526
+ const rangeMatch = rangeValue.match(/^(\d+)-/);
9527
+ return criteriaMatch != null && rangeMatch != null && criteriaMatch[1] === rangeMatch[1];
9528
+ }
9386
9529
  /**
9387
9530
  * Check if the two valueObjects are of the same type
9388
9531
  * @param left
@@ -9483,6 +9626,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9483
9626
  _defineProperty(this, "_currentColumn", -1);
9484
9627
  _defineProperty(this, "_currentRowCount", Number.NEGATIVE_INFINITY);
9485
9628
  _defineProperty(this, "_currentColumnCount", Number.NEGATIVE_INFINITY);
9629
+ _defineProperty(this, "_functionRefInfoOverrideStack", []);
9486
9630
  _defineProperty(this, "_currentSubUnitId", "");
9487
9631
  _defineProperty(this, "_currentUnitId", "");
9488
9632
  _defineProperty(this, "_runtimeData", {});
@@ -9511,10 +9655,12 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9511
9655
  return this._currentColumn;
9512
9656
  }
9513
9657
  get currentRowCount() {
9514
- return this._currentRowCount;
9658
+ var _this$_functionRefInf, _this$_functionRefInf2;
9659
+ 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
9660
  }
9516
9661
  get currentColumnCount() {
9517
- return this._currentColumnCount;
9662
+ var _this$_functionRefInf3, _this$_functionRefInf4;
9663
+ 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
9664
  }
9519
9665
  get currentSubUnitId() {
9520
9666
  return this._currentSubUnitId;
@@ -9608,6 +9754,7 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9608
9754
  this._isCycleDependency = false;
9609
9755
  this._totalFormulasToCalculate = 0;
9610
9756
  this._completedFormulasCount = 0;
9757
+ this._functionRefInfoOverrideStack = [];
9611
9758
  this.clearReferenceAndNumberformatCache();
9612
9759
  }
9613
9760
  clearReferenceAndNumberformatCache() {
@@ -9623,6 +9770,15 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9623
9770
  this._currentSubUnitId = sheetId;
9624
9771
  this._currentUnitId = unitId;
9625
9772
  }
9773
+ setFunctionRefInfoOverride(rowCount, columnCount) {
9774
+ this._functionRefInfoOverrideStack.push({
9775
+ rowCount,
9776
+ columnCount
9777
+ });
9778
+ return () => {
9779
+ this._functionRefInfoOverrideStack.pop();
9780
+ };
9781
+ }
9626
9782
  clearFunctionDefinitionPrivacyVar() {
9627
9783
  this._functionDefinitionPrivacyVar.clear();
9628
9784
  }
@@ -9686,13 +9842,22 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9686
9842
  * then it is not treated as an array range and is directly assigned.
9687
9843
  */
9688
9844
  if (startRow === endRow && startColumn === endColumn) {
9689
- const firstCell = objectValueRefOrArray.getFirstCell();
9845
+ const firstCellRaw = objectValueRefOrArray.getFirstCell();
9846
+ const firstCell = firstCellRaw.isNull() ? NumberValueObject.create(0) : firstCellRaw;
9690
9847
  const valueObject = this._getValueObjectOfRuntimeData(firstCell);
9691
9848
  sheetData.setValue(row, column, valueObject);
9692
9849
  clearArrayUnitData.setValue(row, column, valueObject);
9693
9850
  CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, firstCell.getValue(), row, true);
9694
9851
  return;
9695
9852
  }
9853
+ if (this._isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column)) {
9854
+ const errorObject = this._getValueObjectOfRuntimeData(ErrorValueObject.create("#VALUE!"));
9855
+ sheetData.setValue(row, column, errorObject);
9856
+ clearArrayUnitData.setValue(row, column, errorObject);
9857
+ runtimeArrayUnitData.setValue(row, column, errorObject);
9858
+ CELL_INVERTED_INDEX_CACHE.set(unitId, sheetId, column, "#VALUE!", row, true);
9859
+ return;
9860
+ }
9696
9861
  const arrayRange = {
9697
9862
  startRow: row,
9698
9863
  startColumn: column,
@@ -9904,6 +10069,11 @@ let FormulaRuntimeService = class FormulaRuntimeService extends Disposable {
9904
10069
  });
9905
10070
  return isCellOverlapping;
9906
10071
  }
10072
+ _isCurrentSingleCellArrayFormulaRange(unitId, sheetId, row, column) {
10073
+ var _this$_currentConfigS4;
10074
+ 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];
10075
+ return range != null && range.startRow === range.endRow && range.startColumn === range.endColumn;
10076
+ }
9907
10077
  _isInArrayFormulaRange(range, r, c) {
9908
10078
  if (range == null) return false;
9909
10079
  const { startRow, startColumn, endRow, endColumn } = range;
@@ -10142,18 +10312,23 @@ const FORMULA_CACHE_LRU_COUNT = 5e3;
10142
10312
  const FORMULA_AST_CACHE = new FormulaAstLRU(FORMULA_CACHE_LRU_COUNT);
10143
10313
  const DIRTY_DEFINED_NAME_SET_CACHE = /* @__PURE__ */ new WeakMap();
10144
10314
  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);
10315
+ function generateAstNode(unitId, formulaString, lexer, astTreeBuilder, currentConfigService, subUnitId) {
10316
+ var _ref;
10317
+ if (subUnitId) {
10318
+ currentConfigService.setExecuteUnitId(unitId);
10319
+ currentConfigService.setExecuteSubUnitId(subUnitId);
10320
+ }
10321
+ const cacheKey = `${unitId}:${(_ref = subUnitId !== null && subUnitId !== void 0 ? subUnitId : currentConfigService.getExecuteSubUnitId()) !== null && _ref !== void 0 ? _ref : ""}:${formulaString}`;
10322
+ let astNode = FORMULA_AST_CACHE.get(cacheKey);
10323
+ if (!(checkIsChangedByDefinedName(unitId, formulaString, currentConfigService) || checkIsChangedBySuperTable(unitId, formulaString, currentConfigService)) && astNode && !isDirtyDefinedForNode(astNode, currentConfigService, unitId)) return astNode;
10324
+ const lexerNode = lexer.treeBuilder(formulaString, true, unitId);
10150
10325
  if (ERROR_TYPE_SET.has(lexerNode)) return ErrorNode.create(lexerNode);
10151
10326
  astNode = astTreeBuilder.parse(lexerNode);
10152
10327
  if (astNode == null) {
10153
10328
  console.error("generateAstNode astNode is null");
10154
10329
  return ErrorNode.create(lexerNode);
10155
10330
  }
10156
- if (!noCache) FORMULA_AST_CACHE.set(`${unitId}${formulaString}`, astNode);
10331
+ FORMULA_AST_CACHE.set(cacheKey, astNode);
10157
10332
  return astNode;
10158
10333
  }
10159
10334
  function checkIsChangedByDefinedName(unitId, formula, currentConfigService) {
@@ -10184,15 +10359,15 @@ function getNormalizedDirtyDefinedNameSet(unitDefinedNameMap) {
10184
10359
  function getDirtySuperTableReferencePattern(unitSuperTableMap) {
10185
10360
  let tableReferencePattern = DIRTY_SUPER_TABLE_PATTERN_CACHE.get(unitSuperTableMap);
10186
10361
  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;
10362
+ const tableNames = Object.keys(unitSuperTableMap).filter((tableName) => tableName.length > 0);
10363
+ tableReferencePattern = tableNames.length > 0 ? regexp.createRegExpFromSafeFragment(`(^|[^A-Za-z0-9_])${regexp.or(...tableNames)}(\\s*\\[|$|[^A-Za-z0-9_])`, "i") : null;
10189
10364
  DIRTY_SUPER_TABLE_PATTERN_CACHE.set(unitSuperTableMap, tableReferencePattern);
10190
10365
  }
10191
10366
  return tableReferencePattern;
10192
10367
  }
10193
- function isDirtyDefinedForNode(node, currentConfigService) {
10368
+ function isDirtyDefinedForNode(node, currentConfigService, unitId) {
10194
10369
  const definedNameMap = currentConfigService.getDirtyDefinedNameMap();
10195
- const executeUnitId = currentConfigService.getExecuteUnitId();
10370
+ const executeUnitId = unitId;
10196
10371
  if (executeUnitId != null && definedNameMap[executeUnitId] != null) {
10197
10372
  const names = Object.keys(definedNameMap[executeUnitId]);
10198
10373
  for (let i = 0, len = names.length; i < len; i++) {
@@ -10207,7 +10382,7 @@ function includeDefinedName(tree, node, currentConfigService) {
10207
10382
  * Detect whether the dirty map contains a defined name.
10208
10383
  */
10209
10384
  if (node != null) {
10210
- if (isDirtyDefinedForNode(node, currentConfigService)) return true;
10385
+ if (isDirtyDefinedForNode(node, currentConfigService, tree.unitId)) return true;
10211
10386
  }
10212
10387
  return false;
10213
10388
  }
@@ -10317,6 +10492,7 @@ var PrefixNode = class extends BaseAstNode {
10317
10492
  if (!value.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
10318
10493
  const currentValue = value;
10319
10494
  if (currentValue.isCell()) return ErrorValueObject.create("#VALUE!");
10495
+ if (this._preserveAtRangeForFormula2LookupArray()) return currentValue;
10320
10496
  const runtimeService = this._runtimeService;
10321
10497
  const currentRow = runtimeService.currentRow || 0;
10322
10498
  const currentColumn = runtimeService.currentColumn || 0;
@@ -10328,6 +10504,22 @@ var PrefixNode = class extends BaseAstNode {
10328
10504
  if (currentValue.isTable()) return currentValue.getCellByPosition(currentRow);
10329
10505
  return ErrorValueObject.create("#VALUE!");
10330
10506
  }
10507
+ _preserveAtRangeForFormula2LookupArray() {
10508
+ let node = this;
10509
+ let parent = node.getParent();
10510
+ let sawCompareOperator = false;
10511
+ while (parent != null) {
10512
+ if (parent.nodeType === 3) sawCompareOperator || (sawCompareOperator = OPERATOR_TOKEN_COMPARE_SET.has(parent.getToken()));
10513
+ if (parent.nodeType === 4) {
10514
+ const functionName = parent.getToken().toUpperCase();
10515
+ if (sawCompareOperator && functionName === "XMATCH") return parent.getChildren().indexOf(node) === 1;
10516
+ return false;
10517
+ }
10518
+ node = parent;
10519
+ parent = parent.getParent();
10520
+ }
10521
+ return false;
10522
+ }
10331
10523
  };
10332
10524
  let PrefixNodeFactory = class PrefixNodeFactory extends BaseAstNodeFactory {
10333
10525
  constructor(_functionService, _runtimeService) {
@@ -10402,41 +10594,43 @@ var FunctionNode = class extends BaseAstNode {
10402
10594
  return 4;
10403
10595
  }
10404
10596
  async executeAsync() {
10405
- const variants = [];
10406
10597
  const children = this.getChildren();
10407
- const childrenCount = children.length;
10408
10598
  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);
10599
+ const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : await this._calculateAsync(this._collectVariants(children));
10416
10600
  let result;
10417
10601
  if (resultVariant.isAsyncObject() || resultVariant.isAsyncArrayObject()) result = await resultVariant.getValue();
10418
10602
  else result = resultVariant;
10603
+ result = this._normalizeTopLevelLegacyArrayResult(result);
10419
10604
  this._setEmbeddedArrayFormulaToResult(result);
10420
10605
  this._setRefData(result);
10421
10606
  this.setValue(result);
10422
10607
  return Promise.resolve(0);
10423
10608
  }
10424
10609
  execute() {
10425
- const variants = [];
10426
10610
  const children = this.getChildren();
10427
- const childrenCount = children.length;
10428
10611
  this._compatibility();
10612
+ const resultVariant = this._functionExecutor.needsAstChildren ? this._calculateAst(children) : this._calculate(this._collectVariants(children));
10613
+ const result = this._normalizeTopLevelLegacyArrayResult(resultVariant);
10614
+ this._setEmbeddedArrayFormulaToResult(result);
10615
+ this._setRefData(result);
10616
+ this.setValue(result);
10617
+ }
10618
+ _collectVariants(children) {
10619
+ const variants = [];
10620
+ const childrenCount = children.length;
10429
10621
  for (let i = 0; i < childrenCount; i++) {
10430
- const object = children[i].getValue();
10622
+ const object = this._getChildVariant(children[i]);
10431
10623
  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);
10624
+ variants.push(object);
10435
10625
  }
10436
- const resultVariant = this._calculate(variants);
10437
- this._setEmbeddedArrayFormulaToResult(resultVariant);
10438
- this._setRefData(resultVariant);
10439
- this.setValue(resultVariant);
10626
+ return variants;
10627
+ }
10628
+ _getChildVariant(child) {
10629
+ const object = child.getValue();
10630
+ if (object == null) return;
10631
+ if (object.isReferenceObject() && this._functionExecutor.needsFilteredOutRows) this._setFilteredOutRows(object);
10632
+ if (object.isReferenceObject() && !this._functionExecutor.needsReferenceObject) return object.toArrayValueObject();
10633
+ return object;
10440
10634
  }
10441
10635
  isFunctionExecutorArgumentsIgnoreNumberPattern() {
10442
10636
  return this._functionExecutor.isArgumentsIgnoreNumberPattern();
@@ -10451,6 +10645,14 @@ var FunctionNode = class extends BaseAstNode {
10451
10645
  if (rowCount <= 1 && colCount <= 1) return;
10452
10646
  this._runtimeService.setUnitArrayFormulaEmbeddedMap();
10453
10647
  }
10648
+ _normalizeTopLevelLegacyArrayResult(result) {
10649
+ const parent = this.getParent();
10650
+ const isTopLevel = parent == null || parent.nodeType === 9;
10651
+ if (!this._functionExecutor.returnsLegacyArrayAsScalar || !isTopLevel || !result.isArray()) return result;
10652
+ const array = result;
10653
+ if (array.getRowCount() <= 1 && array.getColumnCount() <= 1) return result;
10654
+ return array.getFirstCell();
10655
+ }
10454
10656
  /**
10455
10657
  * Compatibility handling for special functions.
10456
10658
  */
@@ -10535,6 +10737,16 @@ var FunctionNode = class extends BaseAstNode {
10535
10737
  }
10536
10738
  return resultVariant;
10537
10739
  }
10740
+ _calculateAst(children) {
10741
+ const { minParams, maxParams } = this._functionExecutor;
10742
+ if (minParams !== -1 && maxParams !== -1 && (children.length < minParams || children.length > maxParams)) return ErrorValueObject.create("#N/A");
10743
+ this._setRefInfo();
10744
+ this._handleAddressFunction();
10745
+ return this._functionExecutor.calculateAst(children, (node) => {
10746
+ var _this$_getChildVarian;
10747
+ return (_this$_getChildVarian = this._getChildVariant(node)) !== null && _this$_getChildVarian !== void 0 ? _this$_getChildVarian : null;
10748
+ });
10749
+ }
10538
10750
  async _calculateAsync(variants) {
10539
10751
  const { minParams, maxParams } = this._functionExecutor;
10540
10752
  if (minParams !== -1 && maxParams !== -1 && (variants.length < minParams || variants.length > maxParams)) return ErrorValueObject.create("#N/A");
@@ -10550,15 +10762,15 @@ var FunctionNode = class extends BaseAstNode {
10550
10762
  return resultVariant;
10551
10763
  }
10552
10764
  _setDefinedNamesForFunction() {
10553
- const editorUnitId = this._currentConfigService.getExecuteUnitId();
10765
+ const editorUnitId = this._runtimeService.currentUnitId;
10554
10766
  if (editorUnitId == null) return;
10555
10767
  const definedNames = this._definedNamesService.getDefinedNameMap(editorUnitId);
10556
10768
  if (definedNames == null) return;
10557
10769
  this._functionExecutor.setDefinedNames(definedNames);
10558
10770
  }
10559
10771
  _setRefInfo() {
10560
- const { currentUnitId, currentSubUnitId, currentRow, currentColumn } = this._runtimeService;
10561
- this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn);
10772
+ const { currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount } = this._runtimeService;
10773
+ this._functionExecutor.setRefInfo(currentUnitId, currentSubUnitId, currentRow, currentColumn, currentRowCount, currentColumnCount);
10562
10774
  if (this._functionExecutor.needsSheetRowColumnCount) {
10563
10775
  const { rowCount, columnCount } = this._currentConfigService.getSheetRowColumnCount(currentUnitId, currentSubUnitId);
10564
10776
  this._functionExecutor.setSheetRowColumnCount(rowCount, columnCount);
@@ -10629,7 +10841,7 @@ let FunctionNodeFactory = class FunctionNodeFactory extends BaseAstNodeFactory {
10629
10841
  const { tokenTrim, minusPrefixNode, atPrefixNode } = prefixHandler(param.getToken().trim(), this._functionService, this._runtimeService);
10630
10842
  const isColon = this._isParentUnionNode(param);
10631
10843
  if (!Number.isNaN(Number(tokenTrim)) && !isColon) return ErrorNode.create("#VALUE!");
10632
- const tokenTrimUpper = tokenTrim.toUpperCase();
10844
+ const tokenTrimUpper = normalizeFunctionToken(tokenTrim.toUpperCase());
10633
10845
  if (isColon && COLUMN_LIKE_FUNCTION_NAMES.has(tokenTrimUpper)) return;
10634
10846
  if (this._functionService.hasExecutor(tokenTrimUpper)) {
10635
10847
  const functionNode = this.create(tokenTrimUpper);
@@ -10651,6 +10863,15 @@ FunctionNodeFactory = __decorate([
10651
10863
  __decorateParam(4, Inject(Injector)),
10652
10864
  __decorateParam(5, Inject(FormulaDataModel))
10653
10865
  ], FunctionNodeFactory);
10866
+ function normalizeFunctionToken(token) {
10867
+ if (token === "REGEXTEST" || token === "_XLFN.REGEXTEST") return "REGEXMATCH";
10868
+ for (const prefix of [
10869
+ "_XLFN.",
10870
+ "_XLWS.",
10871
+ "_XLETA."
10872
+ ]) if (token.startsWith(prefix)) return token.slice(prefix.length);
10873
+ return token;
10874
+ }
10654
10875
 
10655
10876
  //#endregion
10656
10877
  //#region src/engine/interpreter/interpreter.ts
@@ -10701,6 +10922,7 @@ let Interpreter = class Interpreter extends Disposable {
10701
10922
  }
10702
10923
  async _executeAsync(node, refOffsetX = 0, refOffsetY = 0) {
10703
10924
  if (this._runtimeService.isStopExecution()) return Promise.resolve(1);
10925
+ if (await this._executeLazyFunctionAsync(node, refOffsetX, refOffsetY)) return Promise.resolve(0);
10704
10926
  const children = node.getChildren();
10705
10927
  const childrenCount = children.length;
10706
10928
  for (let i = 0; i < childrenCount; i++) {
@@ -10721,6 +10943,7 @@ let Interpreter = class Interpreter extends Disposable {
10721
10943
  }
10722
10944
  _execute(node, refOffsetX = 0, refOffsetY = 0) {
10723
10945
  if (this._runtimeService.isStopExecution()) return 1;
10946
+ if (this._executeLazyFunction(node, refOffsetX, refOffsetY)) return 0;
10724
10947
  const children = node.getChildren();
10725
10948
  const childrenCount = children.length;
10726
10949
  for (let i = 0; i < childrenCount; i++) {
@@ -10738,6 +10961,161 @@ let Interpreter = class Interpreter extends Disposable {
10738
10961
  node.execute();
10739
10962
  return 0;
10740
10963
  }
10964
+ async _executeLazyFunctionAsync(node, refOffsetX, refOffsetY) {
10965
+ if (node.nodeType !== 4) return false;
10966
+ const token = node.getToken().toUpperCase();
10967
+ if (token === "IF") return await this._executeLazyIfAsync(node, refOffsetX, refOffsetY);
10968
+ if (token === "IFERROR") return await this._executeLazyIfErrorAsync(node, refOffsetX, refOffsetY);
10969
+ return false;
10970
+ }
10971
+ _executeLazyFunction(node, refOffsetX, refOffsetY) {
10972
+ if (node.nodeType !== 4) return false;
10973
+ const token = node.getToken().toUpperCase();
10974
+ if (token === "IF") return this._executeLazyIf(node, refOffsetX, refOffsetY);
10975
+ if (token === "IFERROR") return this._executeLazyIfError(node, refOffsetX, refOffsetY);
10976
+ return false;
10977
+ }
10978
+ async _executeLazyIfAsync(node, refOffsetX, refOffsetY) {
10979
+ const children = node.getChildren();
10980
+ if (children.length < 2 || children.length > 3) return false;
10981
+ await this._executeAsync(children[0], refOffsetX, refOffsetY);
10982
+ const condition = children[0].getValue();
10983
+ if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
10984
+ if (condition.isError()) {
10985
+ node.setValue(condition);
10986
+ return true;
10987
+ }
10988
+ const selected = condition.getValue() ? children[1] : children[2];
10989
+ if (selected == null) {
10990
+ node.setValue(BooleanValueObject.create(false));
10991
+ return true;
10992
+ }
10993
+ await this._executeAsync(selected, refOffsetX, refOffsetY);
10994
+ node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
10995
+ return true;
10996
+ }
10997
+ _executeLazyIf(node, refOffsetX, refOffsetY) {
10998
+ const children = node.getChildren();
10999
+ if (children.length < 2 || children.length > 3) return false;
11000
+ this._execute(children[0], refOffsetX, refOffsetY);
11001
+ const condition = children[0].getValue();
11002
+ if (condition == null || condition.isReferenceObject() || condition.isArray()) return false;
11003
+ if (condition.isError()) {
11004
+ node.setValue(condition);
11005
+ return true;
11006
+ }
11007
+ const selected = condition.getValue() ? children[1] : children[2];
11008
+ if (selected == null) {
11009
+ node.setValue(BooleanValueObject.create(false));
11010
+ return true;
11011
+ }
11012
+ this._execute(selected, refOffsetX, refOffsetY);
11013
+ node.setValue(this._toLazyIfSelectedValue(selected.getValue(), node));
11014
+ return true;
11015
+ }
11016
+ async _executeLazyIfErrorAsync(node, refOffsetX, refOffsetY) {
11017
+ var _children$1$getValue;
11018
+ const children = node.getChildren();
11019
+ if (children.length !== 2) return false;
11020
+ await this._executeAsync(children[0], refOffsetX, refOffsetY);
11021
+ const rawValue = children[0].getValue();
11022
+ const value = this._toLazyIfErrorValue(rawValue);
11023
+ if (value == null || value.isArray()) return false;
11024
+ if (!value.isError()) {
11025
+ node.setValue(value);
11026
+ return true;
11027
+ }
11028
+ await this._executeAsync(children[1], refOffsetX, refOffsetY);
11029
+ node.setValue((_children$1$getValue = children[1].getValue()) !== null && _children$1$getValue !== void 0 ? _children$1$getValue : ErrorValueObject.create("#VALUE!"));
11030
+ return true;
11031
+ }
11032
+ _executeLazyIfError(node, refOffsetX, refOffsetY) {
11033
+ var _children$1$getValue2;
11034
+ const children = node.getChildren();
11035
+ if (children.length !== 2) return false;
11036
+ this._execute(children[0], refOffsetX, refOffsetY);
11037
+ const rawValue = children[0].getValue();
11038
+ const value = this._toLazyIfErrorValue(rawValue);
11039
+ if (value == null || value.isArray()) return false;
11040
+ if (!value.isError()) {
11041
+ node.setValue(value);
11042
+ return true;
11043
+ }
11044
+ this._execute(children[1], refOffsetX, refOffsetY);
11045
+ node.setValue((_children$1$getValue2 = children[1].getValue()) !== null && _children$1$getValue2 !== void 0 ? _children$1$getValue2 : ErrorValueObject.create("#VALUE!"));
11046
+ return true;
11047
+ }
11048
+ _toLazyIfErrorValue(value) {
11049
+ if (value == null) return null;
11050
+ if (!value.isReferenceObject()) {
11051
+ const baseValue = value;
11052
+ return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
11053
+ }
11054
+ const reference = value;
11055
+ if (reference.getRowCount() !== 1 || reference.getColumnCount() !== 1) return reference.toArrayValueObject();
11056
+ const cellValue = reference.getCellByPosition();
11057
+ return cellValue.isNull() ? NumberValueObject.create(0) : cellValue;
11058
+ }
11059
+ _toLazyIfSelectedValue(value, node) {
11060
+ if (value == null) return ErrorValueObject.create("#VALUE!");
11061
+ if (value.isReferenceObject()) {
11062
+ const reference = value;
11063
+ if (this._preserveLazyIfSelectedReferenceArray(node)) return reference.toArrayValueObject();
11064
+ value = this._implicitLazyIfReferenceValue(reference);
11065
+ }
11066
+ if (value.isArray()) value = this._implicitLazyIfArrayValue(value);
11067
+ if (!value.isArray()) {
11068
+ const baseValue = value;
11069
+ return baseValue.isNull() ? NumberValueObject.create(0) : baseValue;
11070
+ }
11071
+ return value;
11072
+ }
11073
+ _implicitLazyIfReferenceValue(reference) {
11074
+ const range = reference.getRangePosition();
11075
+ const currentRow = this._runtimeService.currentRow || 0;
11076
+ const currentColumn = this._runtimeService.currentColumn || 0;
11077
+ const { startRow, startColumn, endRow, endColumn } = range;
11078
+ if (startRow === endRow && startColumn === endColumn) return reference.getCellByPosition();
11079
+ if (endRow === startRow && currentColumn >= startColumn && currentColumn <= endColumn) return reference.getCellByColumn(currentColumn);
11080
+ if (startColumn === endColumn && currentRow >= startRow && currentRow <= endRow) return reference.getCellByRow(currentRow);
11081
+ return ErrorValueObject.create("#VALUE!");
11082
+ }
11083
+ _preserveLazyIfSelectedReferenceArray(node) {
11084
+ let child = node;
11085
+ let parent = child.getParent();
11086
+ while (parent != null) {
11087
+ if (parent.nodeType === 4) return parent.getToken().toUpperCase() === "MATCH" && parent.getChildren().indexOf(child) === 1;
11088
+ child = parent;
11089
+ parent = parent.getParent();
11090
+ }
11091
+ return false;
11092
+ }
11093
+ _implicitLazyIfArrayValue(array) {
11094
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return array;
11095
+ const startRow = array.getCurrentRow();
11096
+ const startColumn = array.getCurrentColumn();
11097
+ const rowCount = array.getRowCount();
11098
+ const columnCount = array.getColumnCount();
11099
+ const currentRow = this._runtimeService.currentRow || 0;
11100
+ const currentColumn = this._runtimeService.currentColumn || 0;
11101
+ let rowIndex = -1;
11102
+ let columnIndex = -1;
11103
+ if (rowCount === 1 && columnCount === 1) {
11104
+ rowIndex = 0;
11105
+ columnIndex = 0;
11106
+ } else if (rowCount === 1) {
11107
+ rowIndex = 0;
11108
+ columnIndex = currentColumn - startColumn;
11109
+ } else if (columnCount === 1) {
11110
+ rowIndex = currentRow - startRow;
11111
+ columnIndex = 0;
11112
+ } else {
11113
+ rowIndex = currentRow - startRow;
11114
+ columnIndex = currentColumn - startColumn;
11115
+ }
11116
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
11117
+ return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
11118
+ }
10741
11119
  };
10742
11120
  Interpreter = __decorate([__decorateParam(0, IFormulaRuntimeService)], Interpreter);
10743
11121
 
@@ -10956,9 +11334,10 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
10956
11334
  for (let i = 0; i < parameterArray.length; i++) {
10957
11335
  const parameter = parameterArray[i];
10958
11336
  if (parameter instanceof LexerNode) {
10959
- const variant = parameter.getChildren()[0];
11337
+ const variant = getLambdaParameterName(parameter);
11338
+ if (variant == null) return ErrorNode.create("#VALUE!");
10960
11339
  parameter.setToken(DEFAULT_TOKEN_TYPE_LAMBDA_OMIT_PARAMETER);
10961
- currentLambdaPrivacyVar.set(variant.trim(), void 0);
11340
+ currentLambdaPrivacyVar.set(variant, void 0);
10962
11341
  } else return ErrorNode.create("#VALUE!");
10963
11342
  }
10964
11343
  this._runtimeService.registerFunctionDefinitionPrivacyVar(lambdaId, currentLambdaPrivacyVar);
@@ -10975,6 +11354,20 @@ let LambdaNodeFactory = class LambdaNodeFactory extends BaseAstNodeFactory {
10975
11354
  }
10976
11355
  };
10977
11356
  LambdaNodeFactory = __decorate([__decorateParam(0, IFormulaRuntimeService), __decorateParam(1, Inject(Interpreter))], LambdaNodeFactory);
11357
+ function getLambdaParameterName(parameter) {
11358
+ const children = parameter.getChildren();
11359
+ for (let i = 0; i < children.length; i++) {
11360
+ const child = children[i];
11361
+ if (typeof child === "string") {
11362
+ const token = child.trim();
11363
+ if (token.length > 0) return token;
11364
+ } else {
11365
+ const token = getLambdaParameterName(child);
11366
+ if (token != null) return token;
11367
+ }
11368
+ }
11369
+ return null;
11370
+ }
10978
11371
 
10979
11372
  //#endregion
10980
11373
  //#region src/engine/ast-node/lambda-parameter-node.ts
@@ -11085,12 +11478,17 @@ var OperatorNode = class extends BaseAstNode {
11085
11478
  }
11086
11479
  if (object1 == null) object1 = NullValueObject.create();
11087
11480
  if (object2 == null) object2 = NullValueObject.create();
11088
- if (object1.isReferenceObject()) object1 = object1.toArrayValueObject();
11089
- if (object2.isReferenceObject()) object2 = object2.toArrayValueObject();
11481
+ if (object1.isReferenceObject()) object1 = this._referenceToOperatorValue(object1);
11482
+ if (object2.isReferenceObject()) object2 = this._referenceToOperatorValue(object2);
11090
11483
  const result = this._functionExecutor.calculate(object1, object2);
11091
11484
  this._setEmbeddedArrayFormulaToResult(result);
11092
11485
  this.setValue(result);
11093
11486
  }
11487
+ _referenceToOperatorValue(reference) {
11488
+ const array = reference.toArrayValueObject();
11489
+ if (array.getRowCount() === 1 && array.getColumnCount() === 1) return array.get(0, 0);
11490
+ return array;
11491
+ }
11094
11492
  /**
11095
11493
  * If it contains an array formula, set the current cell to the cache and send itself as a ref outward
11096
11494
  */
@@ -11394,12 +11792,15 @@ var TableReferenceObject = class extends BaseReferenceObject {
11394
11792
  }
11395
11793
  /** Column title → column index; returns -1 if not found (caller should handle as parse error) */
11396
11794
  _titleToIndex(name, titleMap) {
11397
- var _titleMap$get;
11398
11795
  const key = name.trim();
11399
11796
  const hit = titleMap.get(key);
11400
11797
  if (hit !== void 0) return hit;
11401
11798
  const keyNorm = key.replace(/\u3000/g, " ").trim();
11402
- return (_titleMap$get = titleMap.get(keyNorm)) !== null && _titleMap$get !== void 0 ? _titleMap$get : -1;
11799
+ const normalizedHit = titleMap.get(keyNorm);
11800
+ if (normalizedHit !== void 0) return normalizedHit;
11801
+ const lineBreakNorm = keyNorm.replace(/\r\n?/g, "\n");
11802
+ for (const [title, index] of titleMap.entries()) if (title.replace(/\u3000/g, " ").trim().replace(/\r\n?/g, "\n") === lineBreakNorm) return index;
11803
+ return -1;
11403
11804
  }
11404
11805
  /** Resolve #This Row's row number; takes first data row (tableStartRow+1) when no context available */
11405
11806
  _resolveThisRow(tableStartRow, tableEndRow) {
@@ -11493,7 +11894,7 @@ let ReferenceNodeFactory = class ReferenceNodeFactory extends BaseAstNodeFactory
11493
11894
  }
11494
11895
  }
11495
11896
  _getTableMap() {
11496
- const unitId = this._currentConfigService.getExecuteUnitId();
11897
+ const unitId = this._formulaRuntimeService.currentUnitId;
11497
11898
  if (!unitId) return;
11498
11899
  return this._superTableService.getTableMap(unitId);
11499
11900
  }
@@ -11579,7 +11980,7 @@ var SuffixNode = class extends BaseAstNode {
11579
11980
  const formulaData = this._currentConfigService.getFormulaData();
11580
11981
  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
11982
  if (!formulaString) return ErrorValueObject.create("#VALUE!");
11582
- this._lexer.treeBuilder(formulaString);
11983
+ this._lexer.treeBuilder(formulaString, true, unitId);
11583
11984
  return ErrorValueObject.create("#VALUE!");
11584
11985
  /** todo */
11585
11986
  }
@@ -11680,13 +12081,19 @@ var ValueNode = class extends BaseAstNode {
11680
12081
  return 2;
11681
12082
  }
11682
12083
  execute() {
12084
+ const token = this.getToken();
12085
+ const tokenTrim = token.trim();
12086
+ if (tokenTrim.startsWith("\"") && tokenTrim.endsWith("\"")) {
12087
+ this.setValue(StringValueObject.create(tokenTrim.slice(1, -1).replace(/""/g, "\"")));
12088
+ return;
12089
+ }
11683
12090
  const parent = this.getParent();
11684
12091
  let isIgnoreNumberPattern = true;
11685
12092
  if ((parent === null || parent === void 0 ? void 0 : parent.nodeType) === 4) {
11686
12093
  var _isFunctionExecutorAr, _isFunctionExecutorAr2;
11687
12094
  isIgnoreNumberPattern = (_isFunctionExecutorAr = (_isFunctionExecutorAr2 = parent.isFunctionExecutorArgumentsIgnoreNumberPattern) === null || _isFunctionExecutorAr2 === void 0 ? void 0 : _isFunctionExecutorAr2.call(parent)) !== null && _isFunctionExecutorAr !== void 0 ? _isFunctionExecutorAr : true;
11688
12095
  }
11689
- this.setValue(ValueObjectFactory.create(this.getToken(), isIgnoreNumberPattern));
12096
+ this.setValue(ValueObjectFactory.create(token, isIgnoreNumberPattern));
11690
12097
  }
11691
12098
  };
11692
12099
  var ValueNodeFactory = class extends BaseAstNodeFactory {
@@ -11852,6 +12259,9 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
11852
12259
  astNode = getAstNodeTopParent(astNode);
11853
12260
  if (astNode == null || (astNode === null || astNode === void 0 ? void 0 : astNode.nodeType) === 7) return astNode;
11854
12261
  switch (astNode.nodeType) {
12262
+ case 8:
12263
+ calculateStack.push(astNode);
12264
+ break;
11855
12265
  case 4: {
11856
12266
  const token = astNode.getToken().trim().toUpperCase();
11857
12267
  if (FORCED_RECALCULATION_FUNCTION_NAME.has(token)) astNode.setForcedCalculateFunction();
@@ -11903,9 +12313,20 @@ let AstTreeBuilder = class AstTreeBuilder extends Disposable {
11903
12313
  astNode = this._astNodeFactoryList[x].checkAndCreateNodeType(item);
11904
12314
  if (astNode != null) break;
11905
12315
  }
11906
- if (astNode == null) return new ErrorFunctionNode();
12316
+ if (astNode == null) {
12317
+ const aggregatorNode = this._createGroupByAggregatorTokenNode(item);
12318
+ if (aggregatorNode != null) return aggregatorNode;
12319
+ return new ErrorFunctionNode();
12320
+ }
11907
12321
  return astNode;
11908
12322
  }
12323
+ _createGroupByAggregatorTokenNode(param) {
12324
+ const token = (typeof param === "string" ? param : param.getToken()).trim().toUpperCase();
12325
+ if (!token.startsWith("_XLETA.")) return null;
12326
+ const name = token.slice(7);
12327
+ if (name !== "SUM" && name !== "COUNT" && name !== "COUNTA" && name !== "PERCENTOF" && name !== "MIN" && name !== "MAX" && name !== "ARRAYTOTEXT") return null;
12328
+ return new BaseAstNode(name);
12329
+ }
11909
12330
  _initializeAstNode() {
11910
12331
  this._astNodeFactoryList = [
11911
12332
  this._astRootNodeFactory,
@@ -13122,7 +13543,7 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
13122
13543
  return this._dependencyTreeCache.get(treeId);
13123
13544
  }
13124
13545
  _getTreeNode(tree) {
13125
- return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
13546
+ return generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
13126
13547
  }
13127
13548
  *_traverse(treeList, skippedTreeIds) {
13128
13549
  const stack = treeList;
@@ -13248,12 +13669,12 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
13248
13669
  for (let i = 0, len = treeList.length; i < len; i++) {
13249
13670
  const tree = treeList[i];
13250
13671
  if (!tree.formula) continue;
13672
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13251
13673
  const node = this._getTreeNode(tree);
13252
13674
  tree.isDirty = this._includeTree(tree, node);
13253
13675
  const addressFunctionNodes = this._getAddressFunctionNodeList(node);
13254
13676
  if (addressFunctionNodes.length > 0) tree.addressFunctionNodes = addressFunctionNodes;
13255
13677
  if (tree.isVirtual) continue;
13256
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13257
13678
  const rangeList = await this._getRangeListByNode({
13258
13679
  node,
13259
13680
  refOffsetX: tree.refOffsetX,
@@ -13458,13 +13879,13 @@ let FormulaDependencyGenerator = class FormulaDependencyGenerator extends Dispos
13458
13879
  async _calculateAddressFunctionRuntimeData(treeDependencyCache, preCalculateTreeList) {
13459
13880
  while (preCalculateTreeList.length > 0) {
13460
13881
  const tree = preCalculateTreeList.pop();
13882
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13461
13883
  const nodeData = {
13462
13884
  node: this._getTreeNode(tree),
13463
13885
  refOffsetX: tree.refOffsetX,
13464
13886
  refOffsetY: tree.refOffsetY
13465
13887
  };
13466
13888
  await this._calculateAddressFunction(treeDependencyCache, tree);
13467
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13468
13889
  let value;
13469
13890
  if (this._interpreter.checkAsyncNode(nodeData.node)) value = await this._interpreter.executeAsync(nodeData);
13470
13891
  else value = this._interpreter.execute(nodeData);
@@ -13891,7 +14312,8 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
13891
14312
  const treeCount = treeList.length;
13892
14313
  while (treeList.length > 0) {
13893
14314
  const tree = treeList.pop();
13894
- const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService);
14315
+ this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
14316
+ const node = generateAstNode(tree.unitId, tree.formula, this._lexer, this._astTreeBuilder, this._currentConfigService, tree.subUnitId);
13895
14317
  const nodeData = {
13896
14318
  node,
13897
14319
  refOffsetX: tree.refOffsetX,
@@ -13921,7 +14343,6 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
13921
14343
  return;
13922
14344
  }
13923
14345
  }
13924
- this._runtimeService.setCurrent(tree.row, tree.column, tree.rowCount, tree.columnCount, tree.subUnitId, tree.unitId);
13925
14346
  let value;
13926
14347
  if (getDirtyData != null && tree.featureId != null) {
13927
14348
  /**
@@ -14014,8 +14435,9 @@ let CalculateFormulaService = class CalculateFormulaService extends Disposable {
14014
14435
  }
14015
14436
  return result;
14016
14437
  }
14017
- async calculate(formulaString) {
14018
- const lexerNode = this._lexer.treeBuilder(formulaString);
14438
+ async calculate(formulaString, transformSuffix = true, unitId) {
14439
+ const executeUnitId = unitId || this._runtimeService.currentUnitId || this._currentConfigService.getExecuteUnitId();
14440
+ const lexerNode = this._lexer.treeBuilder(formulaString, transformSuffix, executeUnitId);
14019
14441
  if (Object.values(ErrorType).includes(lexerNode)) return;
14020
14442
  const astNode = this._astTreeBuilder.parse(lexerNode);
14021
14443
  const interpreter = this._interpreter;
@@ -14203,6 +14625,86 @@ CalculateController = __decorate([
14203
14625
  __decorateParam(2, Inject(FormulaDataModel))
14204
14626
  ], CalculateController);
14205
14627
 
14628
+ //#endregion
14629
+ //#region src/services/active-dirty-manager.service.ts
14630
+ /**
14631
+ * Actively mark as dirty, calculate the dirty area based on the command,
14632
+ * and plugins can register the ref range they affect into the formula engine.
14633
+ */
14634
+ var ActiveDirtyManagerService = class extends Disposable {
14635
+ constructor(..._args) {
14636
+ super(..._args);
14637
+ _defineProperty(this, "_dirtyConversionMap", /* @__PURE__ */ new Map());
14638
+ }
14639
+ dispose() {
14640
+ this._dirtyConversionMap.clear();
14641
+ }
14642
+ remove(commandId) {
14643
+ this._dirtyConversionMap.delete(commandId);
14644
+ }
14645
+ get(commandId) {
14646
+ return this._dirtyConversionMap.get(commandId);
14647
+ }
14648
+ has(commandId) {
14649
+ return this._dirtyConversionMap.has(commandId);
14650
+ }
14651
+ register(commandId, dirtyConversion) {
14652
+ this._dirtyConversionMap.set(commandId, dirtyConversion);
14653
+ }
14654
+ getDirtyConversionMap() {
14655
+ return this._dirtyConversionMap;
14656
+ }
14657
+ };
14658
+ const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
14659
+
14660
+ //#endregion
14661
+ //#region src/controllers/super-table-active-dirty.controller.ts
14662
+ let SuperTableActiveDirtyController = class SuperTableActiveDirtyController extends Disposable {
14663
+ constructor(_activeDirtyManagerService) {
14664
+ super();
14665
+ this._activeDirtyManagerService = _activeDirtyManagerService;
14666
+ this._initialize();
14667
+ }
14668
+ _initialize() {
14669
+ this._activeDirtyManagerService.register(SetSuperTableMutation.id, {
14670
+ commandId: SetSuperTableMutation.id,
14671
+ getDirtyData: (command) => {
14672
+ const params = command.params;
14673
+ const tableNames = [params.tableName, params.oldTableName].filter((name) => Boolean(name));
14674
+ return {
14675
+ dirtyRanges: [{
14676
+ unitId: params.unitId,
14677
+ sheetId: params.reference.sheetId,
14678
+ range: params.reference.range
14679
+ }],
14680
+ dirtySuperTableMap: { [params.unitId]: Object.fromEntries(tableNames.map((name) => [name, "1"])) },
14681
+ clearDependencyTreeCache: { [params.unitId]: { [params.reference.sheetId]: "1" } }
14682
+ };
14683
+ }
14684
+ });
14685
+ this._activeDirtyManagerService.register(RemoveSuperTableMutation.id, {
14686
+ commandId: RemoveSuperTableMutation.id,
14687
+ getDirtyData: (command) => {
14688
+ const params = command.params;
14689
+ return {
14690
+ dirtyRanges: params.reference ? [{
14691
+ unitId: params.unitId,
14692
+ sheetId: params.reference.sheetId,
14693
+ range: params.reference.range
14694
+ }] : void 0,
14695
+ dirtySuperTableMap: { [params.unitId]: { [params.tableName]: "1" } },
14696
+ clearDependencyTreeCache: params.reference ? { [params.unitId]: { [params.reference.sheetId]: "1" } } : void 0
14697
+ };
14698
+ }
14699
+ });
14700
+ this.disposeWithMe(toDisposable(() => {
14701
+ this._activeDirtyManagerService.remove(SetSuperTableMutation.id);
14702
+ this._activeDirtyManagerService.remove(RemoveSuperTableMutation.id);
14703
+ }));
14704
+ }
14705
+ };
14706
+ SuperTableActiveDirtyController = __decorate([__decorateParam(0, IActiveDirtyManagerService)], SuperTableActiveDirtyController);
14707
+
14206
14708
  //#endregion
14207
14709
  //#region src/engine/utils/r1c1-reference.ts
14208
14710
  const $relativeRegex = /[\[\]]/g;
@@ -14374,6 +14876,8 @@ var BaseFunction = class {
14374
14876
  _defineProperty(this, "_subUnitId", void 0);
14375
14877
  _defineProperty(this, "_row", -1);
14376
14878
  _defineProperty(this, "_column", -1);
14879
+ _defineProperty(this, "_currentFormulaRowCount", 1);
14880
+ _defineProperty(this, "_currentFormulaColumnCount", 1);
14377
14881
  _defineProperty(this, "_definedNames", void 0);
14378
14882
  _defineProperty(this, "_locale", void 0);
14379
14883
  _defineProperty(this, "_sheetOrder", void 0);
@@ -14437,6 +14941,23 @@ var BaseFunction = class {
14437
14941
  "needsFilteredOutRows",
14438
14942
  false
14439
14943
  );
14944
+ _defineProperty(
14945
+ this,
14946
+ /**
14947
+ * Whether the function needs unevaluated AST children.
14948
+ */
14949
+ "needsAstChildren",
14950
+ false
14951
+ );
14952
+ _defineProperty(
14953
+ this,
14954
+ /**
14955
+ * Legacy CSE-style array functions should write only the first result cell
14956
+ * when they are used as a top-level normal formula.
14957
+ */
14958
+ "returnsLegacyArrayAsScalar",
14959
+ false
14960
+ );
14440
14961
  _defineProperty(
14441
14962
  this,
14442
14963
  /**
@@ -14469,6 +14990,12 @@ var BaseFunction = class {
14469
14990
  get column() {
14470
14991
  return this._column;
14471
14992
  }
14993
+ get currentFormulaRowCount() {
14994
+ return this._currentFormulaRowCount;
14995
+ }
14996
+ get currentFormulaColumnCount() {
14997
+ return this._currentFormulaColumnCount;
14998
+ }
14472
14999
  dispose() {}
14473
15000
  /**
14474
15001
  * In Excel, to inject a defined name into a function that has positioning capabilities,
@@ -14479,8 +15006,9 @@ var BaseFunction = class {
14479
15006
  getDefinedName(name) {
14480
15007
  const nameMap = this._definedNames;
14481
15008
  if (nameMap == null) return null;
15009
+ const normalizedName = name.toLowerCase();
14482
15010
  return Object.values(nameMap).find((value) => {
14483
- return value.name === name;
15011
+ return value.name.toLowerCase() === normalizedName;
14484
15012
  });
14485
15013
  }
14486
15014
  setDefinedNames(definedNames) {
@@ -14521,11 +15049,13 @@ var BaseFunction = class {
14521
15049
  isArgumentsIgnoreNumberPattern() {
14522
15050
  return false;
14523
15051
  }
14524
- setRefInfo(unitId, subUnitId, row, column) {
15052
+ setRefInfo(unitId, subUnitId, row, column, rowCount = 1, columnCount = 1) {
14525
15053
  this._unitId = unitId;
14526
15054
  this._subUnitId = subUnitId;
14527
15055
  this._row = row;
14528
15056
  this._column = column;
15057
+ this._currentFormulaRowCount = rowCount;
15058
+ this._currentFormulaColumnCount = columnCount;
14529
15059
  }
14530
15060
  calculateCustom(...arg) {
14531
15061
  return null;
@@ -14533,6 +15063,9 @@ var BaseFunction = class {
14533
15063
  calculate(...arg) {
14534
15064
  return ErrorValueObject.create("#VALUE!");
14535
15065
  }
15066
+ calculateAst(_children, _getVariant) {
15067
+ return ErrorValueObject.create("#VALUE!");
15068
+ }
14536
15069
  checkArrayType(variant) {
14537
15070
  return variant.isReferenceObject() || variant.isValueObject() && variant.isArray();
14538
15071
  }
@@ -16630,7 +17163,12 @@ function getArrayValuesByAggregateIgnoreOptions(array, options, formulaDataModel
16630
17163
  if (ignoreErrorValues) continue;
16631
17164
  return valueObject;
16632
17165
  }
16633
- if (!valueObject || valueObject.isNull() || valueObject.isBoolean() || valueObject.isString()) continue;
17166
+ if (!valueObject || valueObject.isNull() || valueObject.isString()) continue;
17167
+ if (!array.isArray() && valueObject.isBoolean()) {
17168
+ values.push(valueObject.getValue() ? 1 : 0);
17169
+ continue;
17170
+ }
17171
+ if (valueObject.isBoolean()) continue;
16634
17172
  const value = valueObject.getValue();
16635
17173
  if (!isRealNum(value)) continue;
16636
17174
  values.push(+value);
@@ -18358,6 +18896,11 @@ var Normsdist = class extends BaseFunction {
18358
18896
 
18359
18897
  //#endregion
18360
18898
  //#region src/functions/compatibility/rank/index.ts
18899
+ function isSameRankNumber$2(left, right) {
18900
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
18901
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
18902
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
18903
+ }
18361
18904
  var Rank = class extends BaseFunction {
18362
18905
  constructor(..._args) {
18363
18906
  super(..._args);
@@ -18383,7 +18926,7 @@ var Rank = class extends BaseFunction {
18383
18926
  const numberValue = +numberObject.getValue();
18384
18927
  const orderValue = +orderObject.getValue();
18385
18928
  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);
18929
+ const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber$2(refNumber, numberValue));
18387
18930
  if (result === -1) return ErrorValueObject.create("#N/A");
18388
18931
  return NumberValueObject.create(result + 1);
18389
18932
  });
@@ -18394,12 +18937,12 @@ var Rank = class extends BaseFunction {
18394
18937
  let refHasError = false;
18395
18938
  let refErrorObject = ErrorValueObject.create("#N/A");
18396
18939
  const refNumbers = [];
18397
- if (!ref.isReferenceObject()) return {
18940
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
18398
18941
  refHasError: true,
18399
18942
  refErrorObject,
18400
18943
  refNumbers
18401
18944
  };
18402
- ref.toArrayValueObject().iterator((refObject) => {
18945
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
18403
18946
  const _refObject = refObject;
18404
18947
  if (_refObject.isError()) {
18405
18948
  refHasError = true;
@@ -19465,7 +20008,8 @@ var Edate = class extends BaseFunction {
19465
20008
  const year = _startDate.getUTCFullYear();
19466
20009
  const month = _startDate.getUTCMonth() + monthsValue;
19467
20010
  const day = _startDate.getUTCDate();
19468
- const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, day)));
20011
+ const lastDayOfTargetMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
20012
+ const currentSerial = excelDateSerial(new Date(Date.UTC(year, month, Math.min(day, lastDayOfTargetMonth))));
19469
20013
  return NumberValueObject.create(currentSerial, DEFAULT_DATE_FORMAT);
19470
20014
  });
19471
20015
  }
@@ -19749,8 +20293,12 @@ var Networkdays = class extends BaseFunction {
19749
20293
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
19750
20294
  const cell = holidays.get(r, c);
19751
20295
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20296
+ if (cell.isNull()) continue;
19752
20297
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
19753
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20298
+ if (typeof holidaySerialNumber !== "number") {
20299
+ if (cell.isString()) continue;
20300
+ return holidaySerialNumber;
20301
+ }
19754
20302
  holidaysValueArray.push(holidaySerialNumber);
19755
20303
  }
19756
20304
  } else {
@@ -19821,8 +20369,12 @@ var NetworkdaysIntl = class extends BaseFunction {
19821
20369
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
19822
20370
  const cell = holidays.get(r, c);
19823
20371
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20372
+ if (cell.isNull()) continue;
19824
20373
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
19825
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20374
+ if (typeof holidaySerialNumber !== "number") {
20375
+ if (cell.isString()) continue;
20376
+ return holidaySerialNumber;
20377
+ }
19826
20378
  holidaysValueArray.push(holidaySerialNumber);
19827
20379
  }
19828
20380
  } else {
@@ -20275,8 +20827,12 @@ var Workday = class extends BaseFunction {
20275
20827
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
20276
20828
  const cell = holidays.get(r, c);
20277
20829
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20830
+ if (cell.isNull()) continue;
20278
20831
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
20279
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20832
+ if (typeof holidaySerialNumber !== "number") {
20833
+ if (cell.isString()) continue;
20834
+ return holidaySerialNumber;
20835
+ }
20280
20836
  holidaysValueArray.push(holidaySerialNumber);
20281
20837
  }
20282
20838
  } else {
@@ -20346,8 +20902,12 @@ var WorkdayIntl = class extends BaseFunction {
20346
20902
  for (let r = 0; r < rowCount; r++) for (let c = 0; c < columnCount; c++) {
20347
20903
  const cell = holidays.get(r, c);
20348
20904
  if (cell.isBoolean()) return ErrorValueObject.create("#VALUE!");
20905
+ if (cell.isNull()) continue;
20349
20906
  const holidaySerialNumber = getDateSerialNumberByObject(cell);
20350
- if (typeof holidaySerialNumber !== "number") return holidaySerialNumber;
20907
+ if (typeof holidaySerialNumber !== "number") {
20908
+ if (cell.isString()) continue;
20909
+ return holidaySerialNumber;
20910
+ }
20351
20911
  holidaysValueArray.push(holidaySerialNumber);
20352
20912
  }
20353
20913
  } else {
@@ -27810,6 +28370,232 @@ var False = class extends BaseFunction {
27810
28370
  }
27811
28371
  };
27812
28372
 
28373
+ //#endregion
28374
+ //#region src/functions/logical/groupby/index.ts
28375
+ var Groupby = class extends BaseFunction {
28376
+ constructor(..._args) {
28377
+ super(..._args);
28378
+ _defineProperty(this, "minParams", 3);
28379
+ _defineProperty(this, "maxParams", 7);
28380
+ _defineProperty(this, "needsReferenceObject", true);
28381
+ _defineProperty(this, "needsAstChildren", true);
28382
+ }
28383
+ calculateAst(children, getVariant) {
28384
+ const rowFields = this._arrayInput(getVariant(children[0]));
28385
+ if (rowFields instanceof ErrorValueObject) return rowFields;
28386
+ const values = this._arrayInput(getVariant(children[1]));
28387
+ if (values instanceof ErrorValueObject) return values;
28388
+ const aggregators = this._aggregators(children[2]);
28389
+ if (aggregators.length === 0) return ErrorValueObject.create("#VALUE!");
28390
+ if (values.rowCount !== rowFields.rowCount) return ErrorValueObject.create("#VALUE!");
28391
+ const includeTotal = children[4] == null ? true : this._numberValue(getVariant(children[4])) !== 0;
28392
+ const sortColumnValue = children[5] == null ? 0 : this._numberValue(getVariant(children[5]));
28393
+ const sortColumn = sortColumnValue === 0 ? void 0 : Math.trunc(sortColumnValue);
28394
+ const filter = children[6] == null ? void 0 : this._arrayInput(getVariant(children[6]));
28395
+ if (filter instanceof ErrorValueObject) return filter;
28396
+ const groupColumnCount = rowFields.columnCount;
28397
+ const valueColumnCount = values.columnCount;
28398
+ const outputValueColumnCount = this._outputValueColumnCount(valueColumnCount, aggregators.length);
28399
+ const groups = [];
28400
+ const allValues = Array.from({ length: valueColumnCount }, () => []);
28401
+ for (let row = 0; row < rowFields.rowCount; row++) {
28402
+ if (filter != null && !this._truthy(filter.valueAt(row, 0))) continue;
28403
+ const key = [];
28404
+ for (let column = 0; column < groupColumnCount; column++) key.push(rowFields.valueAt(row, column));
28405
+ let group = groups.find((item) => this._keysEqual(item.key, key));
28406
+ if (group == null) {
28407
+ group = {
28408
+ key,
28409
+ values: Array.from({ length: valueColumnCount }, () => [])
28410
+ };
28411
+ groups.push(group);
28412
+ }
28413
+ for (let column = 0; column < valueColumnCount; column++) {
28414
+ const value = values.valueAt(row, column);
28415
+ group.values[column].push(value);
28416
+ allValues[column].push(value);
28417
+ }
28418
+ }
28419
+ this._sortGroups(groups, sortColumn);
28420
+ const includeHeader = aggregators.length > 1;
28421
+ const rowCount = groups.length + (includeHeader ? 1 : 0) + (includeTotal ? 1 : 0);
28422
+ const columnCount = groupColumnCount + outputValueColumnCount;
28423
+ const result = [];
28424
+ if (includeHeader) {
28425
+ const header = [];
28426
+ for (let column = 0; column < groupColumnCount; column++) header.push(StringValueObject.create(""));
28427
+ for (let column = 0; column < outputValueColumnCount; column++) header.push(StringValueObject.create(this._aggregatorHeader(this._aggregatorForOutput(aggregators, valueColumnCount, column))));
28428
+ result.push(header);
28429
+ }
28430
+ for (const group of groups) {
28431
+ const row = [...group.key];
28432
+ for (let column = 0; column < outputValueColumnCount; column++) {
28433
+ const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
28434
+ const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
28435
+ row.push(this._applyAggregator(aggregator, group.values[valueColumn], allValues[valueColumn]));
28436
+ }
28437
+ result.push(row);
28438
+ }
28439
+ if (includeTotal) {
28440
+ const row = [];
28441
+ for (let column = 0; column < groupColumnCount; column++) row.push(StringValueObject.create(column === 0 ? "Total" : ""));
28442
+ for (let column = 0; column < outputValueColumnCount; column++) {
28443
+ const valueColumn = this._valueColumnForOutput(valueColumnCount, aggregators.length, column);
28444
+ const aggregator = this._aggregatorForOutput(aggregators, valueColumnCount, column);
28445
+ row.push(this._applyAggregator(aggregator, allValues[valueColumn], allValues[valueColumn]));
28446
+ }
28447
+ result.push(row);
28448
+ }
28449
+ return ArrayValueObject.create({
28450
+ calculateValueList: result,
28451
+ rowCount,
28452
+ columnCount,
28453
+ unitId: this.unitId,
28454
+ sheetId: this.subUnitId,
28455
+ row: this.row,
28456
+ column: this.column
28457
+ });
28458
+ }
28459
+ _arrayInput(variant) {
28460
+ if (variant == null) return ErrorValueObject.create("#VALUE!");
28461
+ let value = variant;
28462
+ if (value.isReferenceObject()) value = value.toArrayValueObject();
28463
+ if (value.isError()) return value;
28464
+ if (value.isArray()) {
28465
+ const array = value;
28466
+ return {
28467
+ rowCount: array.getRowCount(),
28468
+ columnCount: array.getColumnCount(),
28469
+ valueAt: (row, column) => {
28470
+ var _array$get;
28471
+ return (_array$get = array.get(row, column)) !== null && _array$get !== void 0 ? _array$get : NullValueObject.create();
28472
+ }
28473
+ };
28474
+ }
28475
+ return {
28476
+ rowCount: 1,
28477
+ columnCount: 1,
28478
+ valueAt: (row, column) => row === 0 && column === 0 ? value : NullValueObject.create()
28479
+ };
28480
+ }
28481
+ _aggregators(node) {
28482
+ const name = this._normalizedFunctionName(node.getToken());
28483
+ if (name === "GROUPBY") return [];
28484
+ if (name === "HSTACK") return node.getChildren().flatMap((child) => this._aggregators(child));
28485
+ if (this._isAggregatorName(name)) return [name];
28486
+ return [];
28487
+ }
28488
+ _normalizedFunctionName(token) {
28489
+ let normalized = token.toUpperCase();
28490
+ for (;;) {
28491
+ const prefix = [
28492
+ "_XLFN.",
28493
+ "_XLWS.",
28494
+ "_XLETA."
28495
+ ].find((item) => normalized.startsWith(item));
28496
+ if (prefix == null) return normalized;
28497
+ normalized = normalized.slice(prefix.length);
28498
+ }
28499
+ }
28500
+ _isAggregatorName(name) {
28501
+ return name === "SUM" || name === "COUNT" || name === "COUNTA" || name === "PERCENTOF" || name === "MIN" || name === "MAX" || name === "ARRAYTOTEXT";
28502
+ }
28503
+ _outputValueColumnCount(valueColumnCount, aggregatorCount) {
28504
+ if (valueColumnCount === 1) return aggregatorCount;
28505
+ if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return valueColumnCount;
28506
+ return Math.min(valueColumnCount, aggregatorCount);
28507
+ }
28508
+ _valueColumnForOutput(valueColumnCount, aggregatorCount, outputColumn) {
28509
+ if (valueColumnCount === 1) return 0;
28510
+ if (aggregatorCount === 1 || valueColumnCount === aggregatorCount) return Math.min(outputColumn, valueColumnCount - 1);
28511
+ return Math.min(outputColumn, valueColumnCount - 1);
28512
+ }
28513
+ _aggregatorForOutput(aggregators, valueColumnCount, outputColumn) {
28514
+ if (aggregators.length === 1 || valueColumnCount === aggregators.length) return aggregators[Math.min(outputColumn, aggregators.length - 1)];
28515
+ return aggregators[Math.min(outputColumn, aggregators.length - 1)];
28516
+ }
28517
+ _aggregatorHeader(aggregator) {
28518
+ return aggregator === "PERCENTOF" ? "%" : aggregator;
28519
+ }
28520
+ _applyAggregator(aggregator, groupValues, allValues) {
28521
+ switch (aggregator) {
28522
+ case "SUM": return NumberValueObject.create(this._sum(groupValues));
28523
+ case "COUNT": return NumberValueObject.create(groupValues.filter((value) => value.isNumber()).length);
28524
+ case "COUNTA": return NumberValueObject.create(groupValues.filter((value) => !value.isNull() && !(value.isString() && value.getValue() === "")).length);
28525
+ case "PERCENTOF": {
28526
+ const allTotal = this._sum(allValues);
28527
+ if (allTotal === 0) return ErrorValueObject.create("#DIV/0!");
28528
+ return NumberValueObject.create(this._sum(groupValues) / allTotal);
28529
+ }
28530
+ case "MIN": {
28531
+ const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
28532
+ return NumberValueObject.create(values.length === 0 ? 0 : Math.min(...values));
28533
+ }
28534
+ case "MAX": {
28535
+ const values = groupValues.map((value) => this._numericValue(value)).filter((value) => value != null);
28536
+ return NumberValueObject.create(values.length === 0 ? 0 : Math.max(...values));
28537
+ }
28538
+ case "ARRAYTOTEXT": return StringValueObject.create(groupValues.map((value) => this._textValue(value)).filter(Boolean).join(", "));
28539
+ }
28540
+ }
28541
+ _sum(values) {
28542
+ return values.reduce((sum, value) => {
28543
+ var _this$_numericValue;
28544
+ return sum + ((_this$_numericValue = this._numericValue(value)) !== null && _this$_numericValue !== void 0 ? _this$_numericValue : 0);
28545
+ }, 0);
28546
+ }
28547
+ _numericValue(value) {
28548
+ return value.isNumber() ? Number(value.getValue()) : void 0;
28549
+ }
28550
+ _numberValue(variant) {
28551
+ if (variant == null || variant.isError()) return 0;
28552
+ if (variant.isReferenceObject()) variant = variant.getFirstCell();
28553
+ if (variant.isArray()) {
28554
+ var _get;
28555
+ variant = (_get = variant.get(0, 0)) !== null && _get !== void 0 ? _get : NullValueObject.create();
28556
+ }
28557
+ const value = variant.getValue();
28558
+ return typeof value === "number" ? Math.trunc(value) : Math.trunc(Number(value) || 0);
28559
+ }
28560
+ _truthy(value) {
28561
+ if (value.isError() || value.isNull()) return false;
28562
+ return Boolean(value.getValue());
28563
+ }
28564
+ _keysEqual(left, right) {
28565
+ return left.length === right.length && left.every((value, index) => this._keyValue(value) === this._keyValue(right[index]));
28566
+ }
28567
+ _keyValue(value) {
28568
+ if (value.isError()) return `error:${value.getErrorType()}`;
28569
+ if (value.isNull()) return "null:";
28570
+ return `${typeof value.getValue()}:${String(value.getValue())}`;
28571
+ }
28572
+ _sortGroups(groups, sortColumn) {
28573
+ const descending = sortColumn != null && sortColumn < 0;
28574
+ const sortIndex = sortColumn == null ? void 0 : Math.abs(sortColumn) - 1;
28575
+ groups.sort((left, right) => {
28576
+ const compare = sortIndex != null && sortIndex < left.key.length ? this._compareValue(left.key[sortIndex], right.key[sortIndex]) : this._compareKey(left.key, right.key);
28577
+ return descending ? -compare : compare;
28578
+ });
28579
+ }
28580
+ _compareKey(left, right) {
28581
+ for (let index = 0; index < Math.min(left.length, right.length); index++) {
28582
+ const compare = this._compareValue(left[index], right[index]);
28583
+ if (compare !== 0) return compare;
28584
+ }
28585
+ return left.length - right.length;
28586
+ }
28587
+ _compareValue(left, right) {
28588
+ const leftNumber = this._numericValue(left);
28589
+ const rightNumber = this._numericValue(right);
28590
+ if (leftNumber != null && rightNumber != null) return leftNumber - rightNumber;
28591
+ return this._textValue(left).toUpperCase().localeCompare(this._textValue(right).toUpperCase());
28592
+ }
28593
+ _textValue(value) {
28594
+ if (value.isNull()) return "";
28595
+ return String(value.getValue());
28596
+ }
28597
+ };
28598
+
27813
28599
  //#endregion
27814
28600
  //#region src/functions/logical/if/index.ts
27815
28601
  var If = class extends BaseFunction {
@@ -27820,12 +28606,18 @@ var If = class extends BaseFunction {
27820
28606
  }
27821
28607
  calculate(logicalTest, valueIfTrue, valueIfFalse = BooleanValueObject.create(false)) {
27822
28608
  let _logicalTest = logicalTest;
28609
+ let useLegacyImplicitSelectedValue = false;
27823
28610
  if (logicalTest.isArray()) {
27824
- const rowCount = logicalTest.getRowCount();
27825
- const columnCount = logicalTest.getColumnCount();
27826
- if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTest.get(0, 0);
28611
+ const logicalTestArray = logicalTest;
28612
+ const rowCount = logicalTestArray.getRowCount();
28613
+ const columnCount = logicalTestArray.getColumnCount();
28614
+ if (rowCount === 1 && columnCount === 1) _logicalTest = logicalTestArray.get(0, 0);
28615
+ else if (!this._isCurrentArrayFormula() && logicalTestArray.getUnitId() !== "" && logicalTestArray.getSheetId() !== "" && logicalTestArray.getCurrentRow() >= 0 && logicalTestArray.getCurrentColumn() >= 0) {
28616
+ _logicalTest = this._legacyImplicitArrayValue(logicalTestArray);
28617
+ useLegacyImplicitSelectedValue = true;
28618
+ }
27827
28619
  }
27828
- if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse);
28620
+ if (!_logicalTest.isArray()) return this._handleSingleObject(_logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue);
27829
28621
  const maxRowLength = Math.max(_logicalTest.isArray() ? _logicalTest.getRowCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getRowCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getRowCount() : 1);
27830
28622
  const maxColumnLength = Math.max(_logicalTest.isArray() ? _logicalTest.getColumnCount() : 1, valueIfTrue.isArray() ? valueIfTrue.getColumnCount() : 1, valueIfFalse.isArray() ? valueIfFalse.getColumnCount() : 1);
27831
28623
  const logicalTestArray = expandArrayValueObject(maxRowLength, maxColumnLength, _logicalTest, ErrorValueObject.create("#N/A"));
@@ -27834,12 +28626,63 @@ var If = class extends BaseFunction {
27834
28626
  return logicalTestArray.mapValue((logicalTestValue, rowIndex, columnIndex) => {
27835
28627
  const valueIfTrueValue = valueIfTrueArray.get(rowIndex, columnIndex);
27836
28628
  const valueIfFalseValue = valueIfFalseArray.get(rowIndex, columnIndex);
27837
- return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue);
28629
+ return this._handleSingleObject(logicalTestValue, valueIfTrueValue, valueIfFalseValue, false);
27838
28630
  });
27839
28631
  }
27840
- _handleSingleObject(logicalTest, valueIfTrue, valueIfFalse) {
28632
+ _handleSingleObject(logicalTest, valueIfTrue, valueIfFalse, useLegacyImplicitSelectedValue) {
27841
28633
  if (logicalTest.isError()) return logicalTest;
27842
- return logicalTest.getValue() ? valueIfTrue : valueIfFalse;
28634
+ const logicalTestValue = this._coerceLogicalTest(logicalTest);
28635
+ if (logicalTestValue.isError()) return logicalTestValue;
28636
+ let selectedValue = logicalTestValue.getValue() ? valueIfTrue : valueIfFalse;
28637
+ if (useLegacyImplicitSelectedValue) selectedValue = this._legacyImplicitSelectedValue(selectedValue);
28638
+ return this._coerceSelectedValue(selectedValue);
28639
+ }
28640
+ _coerceSelectedValue(value) {
28641
+ return value.isNull() ? NumberValueObject.create(0) : value;
28642
+ }
28643
+ _coerceLogicalTest(logicalTest) {
28644
+ if (logicalTest.isNull()) return BooleanValueObject.create(false);
28645
+ if (logicalTest.isBoolean()) return logicalTest;
28646
+ if (logicalTest.isNumber()) return BooleanValueObject.create(Number(logicalTest.getValue()) !== 0);
28647
+ if (logicalTest.isString()) {
28648
+ const value = `${logicalTest.getValue()}`.trim().toUpperCase();
28649
+ if (value === "TRUE") return BooleanValueObject.create(true);
28650
+ if (value === "FALSE") return BooleanValueObject.create(false);
28651
+ }
28652
+ return ErrorValueObject.create("#VALUE!");
28653
+ }
28654
+ _legacyImplicitSelectedValue(value) {
28655
+ if (!value.isArray()) return value;
28656
+ const array = value;
28657
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return value;
28658
+ return this._legacyImplicitArrayValue(array);
28659
+ }
28660
+ _legacyImplicitArrayValue(logicalTest) {
28661
+ const startRow = logicalTest.getCurrentRow();
28662
+ const startColumn = logicalTest.getCurrentColumn();
28663
+ const rowCount = logicalTest.getRowCount();
28664
+ const columnCount = logicalTest.getColumnCount();
28665
+ if (startRow < 0 || startColumn < 0) return ErrorValueObject.create("#VALUE!");
28666
+ let rowIndex = -1;
28667
+ let columnIndex = -1;
28668
+ if (rowCount === 1 && columnCount === 1) {
28669
+ rowIndex = 0;
28670
+ columnIndex = 0;
28671
+ } else if (rowCount === 1) {
28672
+ rowIndex = 0;
28673
+ columnIndex = this.column - startColumn;
28674
+ } else if (columnCount === 1) {
28675
+ rowIndex = this.row - startRow;
28676
+ columnIndex = 0;
28677
+ } else {
28678
+ rowIndex = this.row - startRow;
28679
+ columnIndex = this.column - startColumn;
28680
+ }
28681
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
28682
+ return logicalTest.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
28683
+ }
28684
+ _isCurrentArrayFormula() {
28685
+ return this.currentFormulaRowCount > 1 || this.currentFormulaColumnCount > 1;
27843
28686
  }
27844
28687
  };
27845
28688
 
@@ -27850,8 +28693,11 @@ var Iferror = class extends BaseFunction {
27850
28693
  super(..._args);
27851
28694
  _defineProperty(this, "minParams", 2);
27852
28695
  _defineProperty(this, "maxParams", 2);
28696
+ _defineProperty(this, "needsReferenceObject", true);
27853
28697
  }
27854
28698
  calculate(value, valueIfError) {
28699
+ value = this._toValueObject(value);
28700
+ valueIfError = this._toValueObject(valueIfError);
27855
28701
  if (!value.isArray()) return value.isError() ? valueIfError : value;
27856
28702
  const maxRowLength = Math.max(value.isArray() ? value.getRowCount() : 1, valueIfError.isArray() ? valueIfError.getRowCount() : 1);
27857
28703
  const maxColumnLength = Math.max(value.isArray() ? value.getColumnCount() : 1, valueIfError.isArray() ? valueIfError.getColumnCount() : 1);
@@ -27862,6 +28708,12 @@ var Iferror = class extends BaseFunction {
27862
28708
  });
27863
28709
  return valueArray;
27864
28710
  }
28711
+ _toValueObject(value) {
28712
+ if (!value.isReferenceObject()) return value;
28713
+ const reference = value;
28714
+ if (reference.getRowCount() === 1 && reference.getColumnCount() === 1) return reference.getCellByPosition();
28715
+ return reference.toArrayValueObject();
28716
+ }
27865
28717
  };
27866
28718
 
27867
28719
  //#endregion
@@ -28138,6 +28990,23 @@ var Or = class extends BaseFunction {
28138
28990
  }
28139
28991
  };
28140
28992
 
28993
+ //#endregion
28994
+ //#region src/functions/logical/percentof/index.ts
28995
+ /**
28996
+ * PERCENTOF is an Excel GROUPBY aggregator token. It is evaluated by GROUPBY's
28997
+ * AST path, not as a standalone scalar function.
28998
+ */
28999
+ var Percentof = class extends BaseFunction {
29000
+ constructor(..._args) {
29001
+ super(..._args);
29002
+ _defineProperty(this, "minParams", 0);
29003
+ _defineProperty(this, "maxParams", 0);
29004
+ }
29005
+ calculate(..._variants) {
29006
+ return ErrorValueObject.create("#VALUE!");
29007
+ }
29008
+ };
29009
+
28141
29010
  //#endregion
28142
29011
  //#region src/functions/logical/reduce/index.ts
28143
29012
  var Reduce = class extends BaseFunction {
@@ -28421,6 +29290,7 @@ const functionLogical = [
28421
29290
  [Bycol, "BYCOL"],
28422
29291
  [Byrow, "BYROW"],
28423
29292
  [False, "FALSE"],
29293
+ [Groupby, "GROUPBY"],
28424
29294
  [If, "IF"],
28425
29295
  [Iferror, "IFERROR"],
28426
29296
  [Ifna, "IFNA"],
@@ -28431,6 +29301,7 @@ const functionLogical = [
28431
29301
  [Map$1, "MAP"],
28432
29302
  [Not, "NOT"],
28433
29303
  [Or, "OR"],
29304
+ [Percentof, "PERCENTOF"],
28434
29305
  [Reduce, "REDUCE"],
28435
29306
  [Scan, "SCAN"],
28436
29307
  [Switch, "SWITCH"],
@@ -28452,9 +29323,9 @@ var Address = class extends BaseFunction {
28452
29323
  if (absNumber === null || absNumber === void 0 ? void 0 : absNumber.isError()) return absNumber;
28453
29324
  if (a1 === null || a1 === void 0 ? void 0 : a1.isError()) return a1;
28454
29325
  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("");
29326
+ const _absNumber = absNumber == null || absNumber.isNull() ? NumberValueObject.create(1) : absNumber;
29327
+ const _a1 = a1 == null || a1.isNull() ? BooleanValueObject.create(true) : a1;
29328
+ const _sheetText = sheetText == null || sheetText.isNull() ? StringValueObject.create("") : sheetText;
28458
29329
  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
29330
  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
29331
  const rowNumArray = expandArrayValueObject(maxRowLength, maxColumnLength, rowNumber, ErrorValueObject.create("#N/A"));
@@ -28505,6 +29376,20 @@ function transformAbsoluteRefType(number) {
28505
29376
  }
28506
29377
  }
28507
29378
 
29379
+ //#endregion
29380
+ //#region src/functions/lookup/anchorarray/index.ts
29381
+ var Anchorarray = class extends BaseFunction {
29382
+ constructor(..._args) {
29383
+ super(..._args);
29384
+ _defineProperty(this, "minParams", 1);
29385
+ _defineProperty(this, "maxParams", 1);
29386
+ _defineProperty(this, "needsReferenceObject", true);
29387
+ }
29388
+ calculate(reference) {
29389
+ return reference;
29390
+ }
29391
+ };
29392
+
28508
29393
  //#endregion
28509
29394
  //#region src/functions/lookup/areas/index.ts
28510
29395
  var Areas = class extends BaseFunction {
@@ -29015,9 +29900,13 @@ var Hlookup = class extends BaseFunction {
29015
29900
  return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
29016
29901
  }
29017
29902
  _handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
29018
- if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
29903
+ if (rangeLookupValue === 0) return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
29019
29904
  return this.binarySearch(value, searchArray, resultArray);
29020
29905
  }
29906
+ _blankResultAsZero(value) {
29907
+ if (value.isNull()) return NumberValueObject.create(0);
29908
+ return value;
29909
+ }
29021
29910
  };
29022
29911
 
29023
29912
  //#endregion
@@ -29289,6 +30178,17 @@ var Index = class extends BaseFunction {
29289
30178
 
29290
30179
  //#endregion
29291
30180
  //#region src/functions/lookup/indirect/index.ts
30181
+ const INDIRECT_ERROR_LITERALS = [
30182
+ "#NULL!",
30183
+ "#DIV/0!",
30184
+ "#VALUE!",
30185
+ "#REF!",
30186
+ "#NAME?",
30187
+ "#NUM!",
30188
+ "#N/A",
30189
+ "#CYCLE!",
30190
+ "#CALC!"
30191
+ ];
29292
30192
  var Indirect = class extends BaseFunction {
29293
30193
  constructor(..._args) {
29294
30194
  super(..._args);
@@ -29317,6 +30217,8 @@ var Indirect = class extends BaseFunction {
29317
30217
  _handleSingleObject(refTextObject, a1Value) {
29318
30218
  const refTextValue = `${refTextObject.getValue()}`;
29319
30219
  if (refTextValue.trim() === "") return ErrorValueObject.create("#REF!");
30220
+ const embeddedError = this._matchErrorLiteral(refTextValue);
30221
+ if (embeddedError != null) return ErrorValueObject.create(embeddedError);
29320
30222
  const refTextV = this._convertToDefinedName(refTextValue);
29321
30223
  if (a1Value === 0) {
29322
30224
  const { range, sheetName, unitId } = deserializeRangeForR1C1(refTextV);
@@ -29355,6 +30257,10 @@ var Indirect = class extends BaseFunction {
29355
30257
  if (formulaOrRefString.startsWith("=")) return formulaOrRefString.slice(1);
29356
30258
  return formulaOrRefString;
29357
30259
  }
30260
+ _matchErrorLiteral(refText) {
30261
+ const normalizedRefText = refText.toUpperCase();
30262
+ return INDIRECT_ERROR_LITERALS.find((errorType) => normalizedRefText.includes(errorType));
30263
+ }
29358
30264
  };
29359
30265
 
29360
30266
  //#endregion
@@ -29422,7 +30328,7 @@ var Match = class extends BaseFunction {
29422
30328
  const columnCountLookup = lookupArray.getColumnCount();
29423
30329
  if (rowCountLookup !== 1 && columnCountLookup !== 1) return ErrorValueObject.create("#N/A");
29424
30330
  if (matchType === null || matchType === void 0 ? void 0 : matchType.isError()) return ErrorValueObject.create("#N/A");
29425
- const matchTypeValue = this.getMatchTypeValue(matchType);
30331
+ const matchTypeValue = (matchType === null || matchType === void 0 ? void 0 : matchType.isNull()) ? 0 : this.getMatchTypeValue(matchType);
29426
30332
  if (matchTypeValue == null) return ErrorValueObject.create("#VALUE!");
29427
30333
  if (lookupValue.isArray()) return lookupValue.map((value) => this._handleSingleObject(value, lookupArray, matchTypeValue));
29428
30334
  return this._handleSingleObject(lookupValue, lookupArray, matchTypeValue);
@@ -29841,9 +30747,10 @@ var Sort = class extends BaseFunction {
29841
30747
  }
29842
30748
  calculate(array, sortIndex, sortOrder, byCol) {
29843
30749
  let _sortIndex = sortIndex !== null && sortIndex !== void 0 ? sortIndex : NumberValueObject.create(1);
29844
- const _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
30750
+ let _sortOrder = sortOrder !== null && sortOrder !== void 0 ? sortOrder : NumberValueObject.create(1);
29845
30751
  const _byCol = byCol !== null && byCol !== void 0 ? byCol : BooleanValueObject.create(false);
29846
30752
  if (_sortIndex.isNull()) _sortIndex = NumberValueObject.create(1);
30753
+ if (_sortOrder.isNull()) _sortOrder = NumberValueObject.create(1);
29847
30754
  if (_byCol.isArray()) {
29848
30755
  const byColRowCount = _byCol.getRowCount();
29849
30756
  const byColColumnCount = _byCol.getColumnCount();
@@ -30608,9 +31515,26 @@ var Vlookup = class extends BaseFunction {
30608
31515
  return this._handleSingleObject(lookupValue, searchArray, resultArray, rangeLookupValue);
30609
31516
  }
30610
31517
  _handleSingleObject(value, searchArray, resultArray, rangeLookupValue) {
30611
- if (rangeLookupValue === 0) return this.equalSearch(value, searchArray, resultArray);
31518
+ if (rangeLookupValue === 0) {
31519
+ if (value.isNull()) return this._equalSearchBlankLookupValue(searchArray, resultArray);
31520
+ return this._blankResultAsZero(this.equalSearch(value, searchArray, resultArray));
31521
+ }
30612
31522
  return this.binarySearch(value, searchArray, resultArray);
30613
31523
  }
31524
+ _equalSearchBlankLookupValue(searchArray, resultArray) {
31525
+ var _resultArrayValue$;
31526
+ const zero = NumberValueObject.create(0);
31527
+ const matched = searchArray.mapValue((value) => {
31528
+ if (value.isNull()) return BooleanValueObject.create(false);
31529
+ return value.isEqual(zero);
31530
+ });
31531
+ const resultArrayValue = resultArray.pickRaw(matched);
31532
+ return this._blankResultAsZero(((_resultArrayValue$ = resultArrayValue[0]) === null || _resultArrayValue$ === void 0 ? void 0 : _resultArrayValue$[0]) || ErrorValueObject.create("#N/A"));
31533
+ }
31534
+ _blankResultAsZero(value) {
31535
+ if (value.isNull()) return NumberValueObject.create(0);
31536
+ return value;
31537
+ }
30614
31538
  };
30615
31539
 
30616
31540
  //#endregion
@@ -30780,7 +31704,8 @@ var Xlookup = class extends BaseFunction {
30780
31704
  if (matchMode === null || matchMode === void 0 ? void 0 : matchMode.isNull()) _matchMode = NumberValueObject.create(0);
30781
31705
  let _searchMode = searchMode !== null && searchMode !== void 0 ? searchMode : NumberValueObject.create(1);
30782
31706
  if (searchMode === null || searchMode === void 0 ? void 0 : searchMode.isNull()) _searchMode = NumberValueObject.create(1);
30783
- if (lookupValue.isError()) return lookupValue;
31707
+ const _lookupValue = this._legacyImplicitLookupValue(lookupValue);
31708
+ if (_lookupValue.isError()) return _lookupValue;
30784
31709
  const rowCountLookup = lookupArray.isArray() ? lookupArray.getRowCount() : 1;
30785
31710
  const columnCountLookup = lookupArray.isArray() ? lookupArray.getColumnCount() : 1;
30786
31711
  const rowCountReturn = returnArray.isArray() ? returnArray.getRowCount() : 1;
@@ -30792,7 +31717,7 @@ var Xlookup = class extends BaseFunction {
30792
31717
  if (matchModeValue instanceof ErrorValueObject) return matchModeValue;
30793
31718
  const searchModeValue = this.getIndexNumValue(_searchMode);
30794
31719
  if (searchModeValue instanceof ErrorValueObject) return searchModeValue;
30795
- return this._getResult(lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
31720
+ return this._getResult(_lookupValue, baseValueObjectToArrayValueObject(lookupArray), baseValueObjectToArrayValueObject(returnArray), _ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn);
30796
31721
  }
30797
31722
  _getResult(lookupValue, lookupArray, returnArray, ifNotFound, matchModeValue, searchModeValue, rowCountLookup, columnCountLookup, rowCountReturn, columnCountReturn) {
30798
31723
  const lookupValueRowCount = lookupValue.isArray() ? lookupValue.getRowCount() : 1;
@@ -30807,7 +31732,7 @@ var Xlookup = class extends BaseFunction {
30807
31732
  if (checkErrorCombination) return checkErrorCombination;
30808
31733
  const result = this._handleSingleObject(value, lookupArray, resultArray, matchModeValue, searchModeValue);
30809
31734
  if (result.isError()) return ifNotFound;
30810
- return result;
31735
+ return this._blankResultAsZero(result);
30811
31736
  });
30812
31737
  }
30813
31738
  const _lookupValue = lookupValue.isArray() ? lookupValue.get(0, 0) : lookupValue;
@@ -30816,7 +31741,7 @@ var Xlookup = class extends BaseFunction {
30816
31741
  if (checkErrorCombination) return checkErrorCombination;
30817
31742
  const result = this._handleSingleObject(_lookupValue, lookupArray, returnArray, matchModeValue, searchModeValue);
30818
31743
  if (result.isError()) return ifNotFound;
30819
- return result;
31744
+ return this._blankResultAsZero(result);
30820
31745
  }
30821
31746
  let axis = 0;
30822
31747
  /**
@@ -30828,6 +31753,32 @@ var Xlookup = class extends BaseFunction {
30828
31753
  if (resultArray == null) return ErrorValueObject.create("#N/A");
30829
31754
  return resultArray;
30830
31755
  }
31756
+ _legacyImplicitLookupValue(lookupValue) {
31757
+ if (!lookupValue.isArray()) return lookupValue;
31758
+ const array = lookupValue;
31759
+ if (array.getUnitId() === "" || array.getSheetId() === "" || array.getCurrentRow() < 0 || array.getCurrentColumn() < 0) return lookupValue;
31760
+ const startRow = array.getCurrentRow();
31761
+ const startColumn = array.getCurrentColumn();
31762
+ const rowCount = array.getRowCount();
31763
+ const columnCount = array.getColumnCount();
31764
+ let rowIndex = -1;
31765
+ let columnIndex = -1;
31766
+ if (rowCount === 1 && columnCount === 1) {
31767
+ rowIndex = 0;
31768
+ columnIndex = 0;
31769
+ } else if (rowCount === 1) {
31770
+ rowIndex = 0;
31771
+ columnIndex = this.column - startColumn;
31772
+ } else if (columnCount === 1) {
31773
+ rowIndex = this.row - startRow;
31774
+ columnIndex = 0;
31775
+ } else {
31776
+ rowIndex = this.row - startRow;
31777
+ columnIndex = this.column - startColumn;
31778
+ }
31779
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return ErrorValueObject.create("#VALUE!");
31780
+ return array.get(rowIndex, columnIndex) || ErrorValueObject.create("#VALUE!");
31781
+ }
30831
31782
  _handleExpandObject(value, searchArray, resultArray, matchModeValue, searchModeValue, axis = 0) {
30832
31783
  if ((searchModeValue === 2 || searchModeValue === -2) && matchModeValue !== 2) {
30833
31784
  const searchType = getSearchModeValue(searchModeValue);
@@ -30848,6 +31799,10 @@ var Xlookup = class extends BaseFunction {
30848
31799
  if (matchModeValue === -1 || matchModeValue === 1) return this.orderSearch(value, searchArray, resultArray, matchModeValue === 1 ? 2 : 1, searchModeValue === -1);
30849
31800
  return this.equalSearch(value, searchArray, resultArray, searchModeValue !== -1);
30850
31801
  }
31802
+ _blankResultAsZero(value) {
31803
+ if (value.isNull()) return NumberValueObject.create(0);
31804
+ return value;
31805
+ }
30851
31806
  /**
30852
31807
  * Wildcard matching and binary search cannot appear at the same time
30853
31808
  * @param matchModeValue
@@ -30964,6 +31919,7 @@ var Xmatch = class extends BaseFunction {
30964
31919
  */
30965
31920
  const functionLookup = [
30966
31921
  [Address, "ADDRESS"],
31922
+ [Anchorarray, "ANCHORARRAY"],
30967
31923
  [Areas, "AREAS"],
30968
31924
  [Choose, "CHOOSE"],
30969
31925
  [Choosecols, "CHOOSECOLS"],
@@ -32069,7 +33025,7 @@ var Int = class extends BaseFunction {
32069
33025
  let _number = number;
32070
33026
  if (_number.isString()) _number = _number.convertToNumberObjectValue();
32071
33027
  if (_number.isError()) return _number;
32072
- const numberValue = Math.floor(+_number.getValue());
33028
+ const numberValue = Math.floor(stripErrorMargin(+_number.getValue()));
32073
33029
  return NumberValueObject.create(numberValue);
32074
33030
  }
32075
33031
  };
@@ -33421,6 +34377,7 @@ var Sum = class extends BaseFunction {
33421
34377
  let accumulatorAll = NumberValueObject.create(0);
33422
34378
  for (let i = 0; i < variants.length; i++) {
33423
34379
  let variant = variants[i];
34380
+ variant = this._legacyImplicitDerivedArray(variant);
33424
34381
  if (variant.isString()) variant = variant.convertToNumberObjectValue();
33425
34382
  if (variant.isError()) return variant;
33426
34383
  if (variant.isArray()) variant = variant.sum();
@@ -33430,6 +34387,30 @@ var Sum = class extends BaseFunction {
33430
34387
  }
33431
34388
  return accumulatorAll;
33432
34389
  }
34390
+ _legacyImplicitDerivedArray(variant) {
34391
+ if (!variant.isArray()) return variant;
34392
+ const array = variant;
34393
+ if (array.usesInvertedIndexCache() || !array.usesLegacyImplicitForAggregate()) return variant;
34394
+ const startRow = array.getCurrentRow();
34395
+ const startColumn = array.getCurrentColumn();
34396
+ if (startRow < 0 || startColumn < 0) return variant;
34397
+ const rowCount = array.getRowCount();
34398
+ const columnCount = array.getColumnCount();
34399
+ let rowIndex = -1;
34400
+ let columnIndex = -1;
34401
+ if (rowCount === 1) {
34402
+ rowIndex = 0;
34403
+ columnIndex = this.column - startColumn;
34404
+ } else if (columnCount === 1) {
34405
+ rowIndex = this.row - startRow;
34406
+ columnIndex = 0;
34407
+ } else {
34408
+ rowIndex = this.row - startRow;
34409
+ columnIndex = this.column - startColumn;
34410
+ }
34411
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
34412
+ return array.get(rowIndex, columnIndex) || variant;
34413
+ }
33433
34414
  };
33434
34415
 
33435
34416
  //#endregion
@@ -34003,8 +34984,17 @@ var Compare = class extends BaseFunction {
34003
34984
  calculate(variant1, variant2) {
34004
34985
  if (variant1.isError()) return variant1;
34005
34986
  if (variant2.isError()) return variant2;
34987
+ const variant1Error = this._coerceErrorLiteral(variant1);
34988
+ if (variant1Error) return variant1Error;
34989
+ const variant2Error = this._coerceErrorLiteral(variant2);
34990
+ if (variant2Error) return variant2Error;
34006
34991
  return variant1.compare(variant2, this._compareType);
34007
34992
  }
34993
+ _coerceErrorLiteral(variant) {
34994
+ const value = variant.getValue();
34995
+ if (typeof value === "string" && ERROR_TYPE_SET.has(value)) return ErrorValueObject.create(value);
34996
+ return null;
34997
+ }
34008
34998
  };
34009
34999
 
34010
35000
  //#endregion
@@ -34262,6 +35252,7 @@ var Average = class extends BaseFunction {
34262
35252
  let accumulatorCount = NumberValueObject.create(0);
34263
35253
  for (let i = 0; i < variants.length; i++) {
34264
35254
  let variant = variants[i];
35255
+ variant = this._legacyImplicitDerivedArray(variant);
34265
35256
  if (variant.isString() || variant.isBoolean()) variant = variant.convertToNumberObjectValue();
34266
35257
  if (variant.isError()) return variant;
34267
35258
  if (variant.isArray()) {
@@ -34275,6 +35266,30 @@ var Average = class extends BaseFunction {
34275
35266
  }
34276
35267
  return accumulatorSum.divided(accumulatorCount);
34277
35268
  }
35269
+ _legacyImplicitDerivedArray(variant) {
35270
+ if (!variant.isArray()) return variant;
35271
+ const array = variant;
35272
+ if (array.usesInvertedIndexCache()) return variant;
35273
+ const startRow = array.getCurrentRow();
35274
+ const startColumn = array.getCurrentColumn();
35275
+ if (startRow < 0 || startColumn < 0) return variant;
35276
+ const rowCount = array.getRowCount();
35277
+ const columnCount = array.getColumnCount();
35278
+ let rowIndex = -1;
35279
+ let columnIndex = -1;
35280
+ if (rowCount === 1) {
35281
+ rowIndex = 0;
35282
+ columnIndex = this.column - startColumn;
35283
+ } else if (columnCount === 1) {
35284
+ rowIndex = this.row - startRow;
35285
+ columnIndex = 0;
35286
+ } else {
35287
+ rowIndex = this.row - startRow;
35288
+ columnIndex = this.column - startColumn;
35289
+ }
35290
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
35291
+ return array.get(rowIndex, columnIndex) || variant;
35292
+ }
34278
35293
  };
34279
35294
 
34280
35295
  //#endregion
@@ -34807,7 +35822,13 @@ var Countif = class extends BaseFunction {
34807
35822
  calculate(range, criteria) {
34808
35823
  if (!range.isReferenceObject()) return ErrorValueObject.create("#VALUE!");
34809
35824
  let _criteria = criteria;
34810
- if (criteria.isReferenceObject()) _criteria = criteria.toArrayValueObject();
35825
+ if (criteria.isReferenceObject()) {
35826
+ _criteria = criteria.toArrayValueObject();
35827
+ if (_criteria.getRowCount() === 1 && _criteria.getColumnCount() === 1) {
35828
+ const firstCriteria = _criteria.get(0, 0);
35829
+ _criteria = firstCriteria.isNull() ? NumberValueObject.create(0) : firstCriteria;
35830
+ }
35831
+ }
34811
35832
  if (_criteria.isArray()) {
34812
35833
  const resultArray = _criteria.mapValue((criteriaObject) => this._handleSingleObject(range, criteriaObject));
34813
35834
  if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
@@ -34842,7 +35863,7 @@ var Countifs = class extends BaseFunction {
34842
35863
  _defineProperty(this, "needsReferenceObject", true);
34843
35864
  }
34844
35865
  calculate(...variants) {
34845
- const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(variants);
35866
+ const { isError, errorObject, rangeIsDifferentSize, criteriaMaxRowLength, criteriaMaxColumnLength, variants: _variants } = parsePairedRangeAndCriteria(this._legacyImplicitDerivedCriteria(variants));
34846
35867
  if (isError) return errorObject;
34847
35868
  if (rangeIsDifferentSize) {
34848
35869
  if (criteriaMaxRowLength === 1 && criteriaMaxColumnLength === 1) return ErrorValueObject.create("#VALUE!");
@@ -34865,6 +35886,32 @@ var Countifs = class extends BaseFunction {
34865
35886
  column: this.column
34866
35887
  });
34867
35888
  }
35889
+ _legacyImplicitDerivedCriteria(variants) {
35890
+ return variants.map((variant, index) => {
35891
+ if (index % 2 === 0 || !variant.isArray()) return variant;
35892
+ const array = variant;
35893
+ if (array.usesInvertedIndexCache()) return variant;
35894
+ const startRow = array.getCurrentRow();
35895
+ const startColumn = array.getCurrentColumn();
35896
+ if (startRow < 0 || startColumn < 0) return variant;
35897
+ const rowCount = array.getRowCount();
35898
+ const columnCount = array.getColumnCount();
35899
+ let rowIndex = -1;
35900
+ let columnIndex = -1;
35901
+ if (rowCount === 1) {
35902
+ rowIndex = 0;
35903
+ columnIndex = this.column - startColumn;
35904
+ } else if (columnCount === 1) {
35905
+ rowIndex = this.row - startRow;
35906
+ columnIndex = 0;
35907
+ } else {
35908
+ rowIndex = this.row - startRow;
35909
+ columnIndex = this.column - startColumn;
35910
+ }
35911
+ if (rowIndex < 0 || rowIndex >= rowCount || columnIndex < 0 || columnIndex >= columnCount) return variant;
35912
+ return array.get(rowIndex, columnIndex) || variant;
35913
+ });
35914
+ }
34868
35915
  };
34869
35916
 
34870
35917
  //#endregion
@@ -35642,6 +36689,7 @@ var Linest = class extends BaseFunction {
35642
36689
  super(..._args);
35643
36690
  _defineProperty(this, "minParams", 1);
35644
36691
  _defineProperty(this, "maxParams", 4);
36692
+ _defineProperty(this, "returnsLegacyArrayAsScalar", true);
35645
36693
  }
35646
36694
  calculate(knownYs, knownXs, constb, stats) {
35647
36695
  const { isError, errorObject } = checkKnownsArrayDimensions(knownYs, knownXs);
@@ -36171,7 +37219,11 @@ var Median = class extends BaseFunction {
36171
37219
  if (isError) return errorObject;
36172
37220
  } else {
36173
37221
  if (variant.isError()) return variant;
36174
- if (variant.isNull() || variant.isBoolean()) continue;
37222
+ if (variant.isNull()) continue;
37223
+ if (variant.isBoolean()) {
37224
+ values.push(variant.getValue() ? 1 : 0);
37225
+ continue;
37226
+ }
36175
37227
  if (variant.isString()) {
36176
37228
  const _variant = variant.convertToNumberObjectValue();
36177
37229
  if (_variant.isError()) return _variant;
@@ -36781,6 +37833,11 @@ var QuartileExc = class extends BaseFunction {
36781
37833
 
36782
37834
  //#endregion
36783
37835
  //#region src/functions/statistical/rank-avg/index.ts
37836
+ function isSameRankNumber$1(left, right) {
37837
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
37838
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
37839
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
37840
+ }
36784
37841
  var RankAvg = class extends BaseFunction {
36785
37842
  constructor(..._args) {
36786
37843
  super(..._args);
@@ -36812,14 +37869,9 @@ var RankAvg = class extends BaseFunction {
36812
37869
  return resultArray;
36813
37870
  }
36814
37871
  _getResult(numberValue, orderValue, refNumbers) {
36815
- const refOrderNumbers = refNumbers.sort((a, b) => !orderValue ? b - a : a - b);
36816
- let index = refOrderNumbers.indexOf(numberValue);
37872
+ const refOrderNumbers = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b);
36817
37873
  const results = [];
36818
- while (index >= 0) {
36819
- const start = index + 1;
36820
- results.push(start);
36821
- index = refOrderNumbers.indexOf(numberValue, start);
36822
- }
37874
+ for (let index = 0; index < refOrderNumbers.length; index++) if (isSameRankNumber$1(refOrderNumbers[index], numberValue)) results.push(index + 1);
36823
37875
  if (results.length === 0) return ErrorValueObject.create("#N/A");
36824
37876
  const result = results.reduce((acc, cur) => acc + cur, 0) / results.length;
36825
37877
  return NumberValueObject.create(result);
@@ -36828,12 +37880,12 @@ var RankAvg = class extends BaseFunction {
36828
37880
  let refHasError = false;
36829
37881
  let refErrorObject = ErrorValueObject.create("#N/A");
36830
37882
  const refNumbers = [];
36831
- if (!ref.isReferenceObject()) return {
37883
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
36832
37884
  refHasError: true,
36833
37885
  refErrorObject,
36834
37886
  refNumbers
36835
37887
  };
36836
- ref.toArrayValueObject().iterator((refObject) => {
37888
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
36837
37889
  const _refObject = refObject;
36838
37890
  if (_refObject.isError()) {
36839
37891
  refHasError = true;
@@ -36855,6 +37907,11 @@ var RankAvg = class extends BaseFunction {
36855
37907
 
36856
37908
  //#endregion
36857
37909
  //#region src/functions/statistical/rank-eq/index.ts
37910
+ function isSameRankNumber(left, right) {
37911
+ if (left === right || Number.isInteger(left) || Number.isInteger(right)) return left === right;
37912
+ const scale = Math.max(1, Math.abs(left), Math.abs(right));
37913
+ return Math.abs(left - right) <= Number.EPSILON * scale * 2;
37914
+ }
36858
37915
  var RankEq = class extends BaseFunction {
36859
37916
  constructor(..._args) {
36860
37917
  super(..._args);
@@ -36880,7 +37937,7 @@ var RankEq = class extends BaseFunction {
36880
37937
  const numberValue = +numberObject.getValue();
36881
37938
  const orderValue = +orderObject.getValue();
36882
37939
  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);
37940
+ const result = [...refNumbers].sort((a, b) => !orderValue ? b - a : a - b).findIndex((refNumber) => isSameRankNumber(refNumber, numberValue));
36884
37941
  if (result === -1) return ErrorValueObject.create("#N/A");
36885
37942
  return NumberValueObject.create(result + 1);
36886
37943
  });
@@ -36891,12 +37948,12 @@ var RankEq = class extends BaseFunction {
36891
37948
  let refHasError = false;
36892
37949
  let refErrorObject = ErrorValueObject.create("#N/A");
36893
37950
  const refNumbers = [];
36894
- if (!ref.isReferenceObject()) return {
37951
+ if (!ref.isReferenceObject() && !ref.isArray()) return {
36895
37952
  refHasError: true,
36896
37953
  refErrorObject,
36897
37954
  refNumbers
36898
37955
  };
36899
- ref.toArrayValueObject().iterator((refObject) => {
37956
+ (ref.isReferenceObject() ? ref.toArrayValueObject() : ref).iterator((refObject) => {
36900
37957
  const _refObject = refObject;
36901
37958
  if (_refObject.isError()) {
36902
37959
  refHasError = true;
@@ -37968,11 +39025,10 @@ var Concat = class extends BaseFunction {
37968
39025
  isError = valueObject;
37969
39026
  return false;
37970
39027
  }
37971
- if (valueObject.isBoolean()) concatenatedString += `${valueObject.getValue()}`.toLocaleUpperCase();
37972
- else if (valueObject.isString() || valueObject.isNumber()) concatenatedString += valueObject.getValue();
39028
+ concatenatedString += formatValueForFormulaText(valueObject.getValue());
37973
39029
  });
37974
39030
  if (isError) return isError;
37975
- } else if (!textValue.isError() && !textValue.isNull()) concatenatedString += textValue.getValue();
39031
+ } else if (!textValue.isError() && !textValue.isNull()) concatenatedString += formatValueForFormulaText(textValue.getValue());
37976
39032
  return StringValueObject.create(concatenatedString);
37977
39033
  }
37978
39034
  };
@@ -37999,20 +39055,27 @@ var Concatenate = class extends BaseFunction {
37999
39055
  }
38000
39056
  });
38001
39057
  let result = null;
39058
+ const referenceSource = textValues.find((textValue) => {
39059
+ if (!textValue.isArray()) return false;
39060
+ const arrayValue = textValue;
39061
+ return arrayValue.getUnitId() !== "" && arrayValue.getSheetId() !== "" && arrayValue.getCurrentRow() >= 0 && arrayValue.getCurrentColumn() >= 0;
39062
+ });
38002
39063
  for (const textValue of textValues) result = expandArrayValueObject(maxRowLength, maxColumnLength, textValue, ErrorValueObject.create("#N/A")).mapValue((textValueObject, rowIndex, columnIndex) => {
38003
- var _resultValue, _textValue;
39064
+ var _resultValueObject$ge, _textValueObject$getV;
38004
39065
  const resultValueObject = result && result.get(rowIndex, columnIndex);
38005
39066
  if (resultValueObject === null || resultValueObject === void 0 ? void 0 : resultValueObject.isError()) return resultValueObject;
38006
39067
  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 : "";
39068
+ 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);
39069
+ 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
39070
  return StringValueObject.create(`${resultValueObjectString}${textValueObjectString}`);
38014
39071
  });
38015
39072
  if (!result) return ErrorValueObject.create("#VALUE!");
39073
+ if (referenceSource && result.isArray()) {
39074
+ const resultArray = result;
39075
+ resultArray.setUnitId(referenceSource.getUnitId());
39076
+ resultArray.setSheetId(referenceSource.getSheetId());
39077
+ resultArray.setCurrent(referenceSource.getCurrentRow(), referenceSource.getCurrentColumn());
39078
+ }
38016
39079
  return result;
38017
39080
  }
38018
39081
  };
@@ -39779,13 +40842,17 @@ var Text = class extends BaseFunction {
39779
40842
  }
39780
40843
  if (formatTextValue.isNull()) formatTextValue = StringValueObject.create(" ");
39781
40844
  const formatTextValueString = `${formatTextValue.getValue()}`;
39782
- const previewText = getFormatPreview(formatTextValueString, textValueNumber);
40845
+ const previewText = getFormatPreview(normalizeExcelWeekdayFormat(formatTextValueString), textValueNumber);
39783
40846
  return StringValueObject.create(formatTextValueString === " " ? previewText.trimEnd() : previewText);
39784
40847
  });
39785
40848
  if (resultArray.getRowCount() === 1 && resultArray.getColumnCount() === 1) return resultArray.get(0, 0);
39786
40849
  return resultArray;
39787
40850
  }
39788
40851
  };
40852
+ function normalizeExcelWeekdayFormat(formatText) {
40853
+ if (!formatText.includes("Å")) return formatText;
40854
+ return formatText.replace(/\u00C5{4,}/g, "dddd").replace(/\u00C5{1,3}/g, "ddd");
40855
+ }
39789
40856
 
39790
40857
  //#endregion
39791
40858
  //#region src/functions/text/textafter/index.ts
@@ -40160,9 +41227,19 @@ var Textsplit = class extends BaseFunction {
40160
41227
  const _ignoreEmpty = ignoreEmpty !== null && ignoreEmpty !== void 0 ? ignoreEmpty : NumberValueObject.create(0);
40161
41228
  const _matchMode = matchMode !== null && matchMode !== void 0 ? matchMode : NumberValueObject.create(0);
40162
41229
  const _padWith = padWith !== null && padWith !== void 0 ? padWith : StringValueObject.create("#N/A");
40163
- const { _variant: _colDelimiter, values: colDelimiterValue } = this._getStringValues(colDelimiter);
40164
41230
  const { _variant, values: rowDelimiterValue } = this._getStringValues(_rowDelimiter, false);
40165
41231
  _rowDelimiter = _variant;
41232
+ const allowBlankColDelimiter = rowDelimiter != null && !rowDelimiter.isNull() && !_rowDelimiter.isError() && rowDelimiterValue.length > 0;
41233
+ let _colDelimiter;
41234
+ let colDelimiterValue;
41235
+ if (allowBlankColDelimiter && this._isBlankScalarDelimiter(colDelimiter)) {
41236
+ _colDelimiter = colDelimiter;
41237
+ colDelimiterValue = [];
41238
+ } else {
41239
+ const { _variant: colDelimiterVariant, values } = this._getStringValues(colDelimiter);
41240
+ _colDelimiter = colDelimiterVariant;
41241
+ colDelimiterValue = values;
41242
+ }
40166
41243
  const maxRowLength = Math.max(text.isArray() ? text.getRowCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getRowCount() : 1, _matchMode.isArray() ? _matchMode.getRowCount() : 1);
40167
41244
  const maxColumnLength = Math.max(text.isArray() ? text.getColumnCount() : 1, _ignoreEmpty.isArray() ? _ignoreEmpty.getColumnCount() : 1, _matchMode.isArray() ? _matchMode.getColumnCount() : 1);
40168
41245
  const textArray = expandArrayValueObject(maxRowLength, maxColumnLength, text, ErrorValueObject.create("#N/A"));
@@ -40240,7 +41317,7 @@ var Textsplit = class extends BaseFunction {
40240
41317
  const resultRows = textValue.split(rowDelimiterRegExp);
40241
41318
  let resultColsMaxCount = 1;
40242
41319
  let result = resultRows.map((row) => {
40243
- let cols = row.split(colDelimiterRegExp);
41320
+ let cols = colDelimiterValue.length > 0 ? row.split(colDelimiterRegExp) : [row];
40244
41321
  if (ignoreEmptyValue) cols = cols.filter((col) => col !== "");
40245
41322
  resultColsMaxCount = Math.max(resultColsMaxCount, cols.length);
40246
41323
  return cols;
@@ -40264,7 +41341,10 @@ var Textsplit = class extends BaseFunction {
40264
41341
  if (valueObject.isNull()) value = "\\s";
40265
41342
  if (valueObject.isBoolean()) value = value ? "TRUE" : "FALSE";
40266
41343
  value += "";
40267
- return escapeRegExp(value);
41344
+ return regexp.escapeRegExp(value);
41345
+ }
41346
+ _isBlankScalarDelimiter(valueObject) {
41347
+ return !valueObject.isArray() && (valueObject.isNull() || `${valueObject.getValue()}` === "");
40268
41348
  }
40269
41349
  };
40270
41350
 
@@ -40493,6 +41573,7 @@ const functionText = [
40493
41573
  [Numbervalue, "NUMBERVALUE"],
40494
41574
  [Regexextract, "REGEXEXTRACT"],
40495
41575
  [Regexmatch, "REGEXMATCH"],
41576
+ [Regexmatch, "REGEXTEST"],
40496
41577
  [Regexreplace, "REGEXREPLACE"],
40497
41578
  [Proper, "PROPER"],
40498
41579
  [Replace, "REPLACE"],
@@ -40560,6 +41641,58 @@ var Encodeurl = class extends BaseFunction {
40560
41641
  }
40561
41642
  };
40562
41643
 
41644
+ //#endregion
41645
+ //#region src/functions/web/filterxml/index.ts
41646
+ var Filterxml = class extends BaseFunction {
41647
+ constructor(..._args) {
41648
+ super(..._args);
41649
+ _defineProperty(this, "minParams", 2);
41650
+ _defineProperty(this, "maxParams", 2);
41651
+ }
41652
+ calculate(xml, xpath) {
41653
+ if (xml.isError()) return xml;
41654
+ if (xpath.isError()) return xpath;
41655
+ const tagName = getDescendantTagName(`${xpath.getValue()}`);
41656
+ if (tagName == null) return ErrorValueObject.create("#VALUE!");
41657
+ const values = extractTagTexts(`${xml.getValue()}`, tagName);
41658
+ if (values.length === 0) return ErrorValueObject.create("#VALUE!");
41659
+ return ArrayValueObject.create({
41660
+ calculateValueList: transformToValueObject(values.map((value) => [value])),
41661
+ rowCount: values.length,
41662
+ columnCount: 1,
41663
+ unitId: "",
41664
+ sheetId: "",
41665
+ row: 0,
41666
+ column: 0
41667
+ });
41668
+ }
41669
+ };
41670
+ function getDescendantTagName(xpath) {
41671
+ const text = xpath.trim();
41672
+ if (!text.startsWith("//")) return null;
41673
+ const tagName = text.slice(2).replace(/\/text\(\)$/, "").trim();
41674
+ return /^[A-Za-z0-9_.-]+$/.test(tagName) ? tagName : null;
41675
+ }
41676
+ function extractTagTexts(xml, tagName) {
41677
+ const open = `<${tagName}>`;
41678
+ const close = `</${tagName}>`;
41679
+ const values = [];
41680
+ let offset = 0;
41681
+ while (offset < xml.length) {
41682
+ const openIndex = xml.indexOf(open, offset);
41683
+ if (openIndex < 0) break;
41684
+ const valueStart = openIndex + open.length;
41685
+ const closeIndex = xml.indexOf(close, valueStart);
41686
+ if (closeIndex < 0) break;
41687
+ values.push(decodeXmlEntities(xml.slice(valueStart, closeIndex)));
41688
+ offset = closeIndex + close.length;
41689
+ }
41690
+ return values;
41691
+ }
41692
+ function decodeXmlEntities(value) {
41693
+ return value.replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&").replace(/&quot;/g, "\"").replace(/&apos;/g, "'");
41694
+ }
41695
+
40563
41696
  //#endregion
40564
41697
  //#region src/functions/web/function-map.ts
40565
41698
  /**
@@ -40577,7 +41710,7 @@ var Encodeurl = class extends BaseFunction {
40577
41710
  * See the License for the specific language governing permissions and
40578
41711
  * limitations under the License.
40579
41712
  */
40580
- const functionWeb = [[Encodeurl, "ENCODEURL"]];
41713
+ const functionWeb = [[Encodeurl, "ENCODEURL"], [Filterxml, "FILTERXML"]];
40581
41714
 
40582
41715
  //#endregion
40583
41716
  //#region src/functions/index.ts
@@ -40647,7 +41780,7 @@ function getObjectValue(result, isUseStrip = false) {
40647
41780
  //#endregion
40648
41781
  //#region package.json
40649
41782
  var name = "@univerjs/engine-formula";
40650
- var version = "1.0.0-alpha.1";
41783
+ var version = "1.0.0-alpha.3";
40651
41784
 
40652
41785
  //#endregion
40653
41786
  //#region src/services/global-computing-status.service.ts
@@ -40938,36 +42071,151 @@ SetOtherFormulaController = __decorate([
40938
42071
  ], SetOtherFormulaController);
40939
42072
 
40940
42073
  //#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());
42074
+ //#region src/services/formula-calculation-trigger.service.ts
42075
+ const LOCAL_ONLY = { onlyLocal: true };
42076
+ const CALCULATION_DEBOUNCE_TIME = 100;
42077
+ let FormulaCalculationTriggerService = class FormulaCalculationTriggerService extends Disposable {
42078
+ constructor(_commandService, _activeDirtyManagerService) {
42079
+ super();
42080
+ this._commandService = _commandService;
42081
+ this._activeDirtyManagerService = _activeDirtyManagerService;
42082
+ _defineProperty(this, "_waitingCommandQueue", []);
42083
+ _defineProperty(this, "_executingDirtyData", createEmptyDirtyData());
42084
+ _defineProperty(this, "_timer", void 0);
42085
+ _defineProperty(this, "_executionInProgress", false);
42086
+ _defineProperty(this, "_restartCalculation", false);
42087
+ this._initialize();
40950
42088
  }
40951
42089
  dispose() {
40952
- this._dirtyConversionMap.clear();
42090
+ clearTimeout(this._timer);
42091
+ this._waitingCommandQueue = [];
42092
+ this._executingDirtyData = createEmptyDirtyData();
42093
+ super.dispose();
40953
42094
  }
40954
- remove(commandId) {
40955
- this._dirtyConversionMap.delete(commandId);
42095
+ _initialize() {
42096
+ this.disposeWithMe(this._commandService.onCommandExecuted((command, options) => {
42097
+ var _conversion$shouldTri;
42098
+ if (command.id === SetFormulaCalculationStartMutation.id) {
42099
+ this._executionInProgress = true;
42100
+ return;
42101
+ }
42102
+ if (command.id === SetFormulaCalculationNotificationMutation.id) {
42103
+ this._handleCalculationNotification(command.params);
42104
+ return;
42105
+ }
42106
+ const conversion = this._activeDirtyManagerService.get(command.id);
42107
+ if (!conversion) return;
42108
+ if (((_conversion$shouldTri = conversion.shouldTrigger) === null || _conversion$shouldTri === void 0 ? void 0 : _conversion$shouldTri.call(conversion, command, options)) === false) return;
42109
+ this._waitingCommandQueue.push(command);
42110
+ clearTimeout(this._timer);
42111
+ this._timer = setTimeout(() => this._flush(), CALCULATION_DEBOUNCE_TIME);
42112
+ }));
40956
42113
  }
40957
- get(commandId) {
40958
- return this._dirtyConversionMap.get(commandId);
42114
+ _flush() {
42115
+ const dirtyData = this._generateDirty(this._waitingCommandQueue);
42116
+ this._waitingCommandQueue = [];
42117
+ this._timer = void 0;
42118
+ if (!hasDirtyData(dirtyData)) return;
42119
+ this._executingDirtyData = mergeDirtyData(this._executingDirtyData, dirtyData);
42120
+ if (this._executionInProgress) {
42121
+ this._restartCalculation = true;
42122
+ this._commandService.executeCommand(SetFormulaCalculationStopMutation.id, {}, LOCAL_ONLY);
42123
+ return;
42124
+ }
42125
+ this._startCalculation();
40959
42126
  }
40960
- has(commandId) {
40961
- return this._dirtyConversionMap.has(commandId);
42127
+ _startCalculation() {
42128
+ this._executionInProgress = true;
42129
+ this._commandService.executeCommand(SetFormulaCalculationStartMutation.id, { ...this._executingDirtyData }, LOCAL_ONLY);
40962
42130
  }
40963
- register(commandId, dirtyConversion) {
40964
- this._dirtyConversionMap.set(commandId, dirtyConversion);
42131
+ _handleCalculationNotification(params) {
42132
+ if (params.stageInfo != null) {
42133
+ this._executionInProgress = true;
42134
+ return;
42135
+ }
42136
+ const state = params.functionsExecutedState;
42137
+ if (state == null) return;
42138
+ this._executionInProgress = false;
42139
+ if (state === 1 && this._restartCalculation) {
42140
+ this._restartCalculation = false;
42141
+ this._startCalculation();
42142
+ return;
42143
+ }
42144
+ this._restartCalculation = false;
42145
+ this._executingDirtyData = createEmptyDirtyData();
40965
42146
  }
40966
- getDirtyConversionMap() {
40967
- return this._dirtyConversionMap;
42147
+ _generateDirty(commands) {
42148
+ return commands.reduce((result, command) => {
42149
+ const conversion = this._activeDirtyManagerService.get(command.id);
42150
+ return conversion ? mergeDirtyData(result, conversion.getDirtyData(command)) : result;
42151
+ }, createEmptyDirtyData());
40968
42152
  }
40969
42153
  };
40970
- const IActiveDirtyManagerService = createIdentifier("univer.formula.active-dirty-manager.service");
42154
+ FormulaCalculationTriggerService = __decorate([__decorateParam(0, ICommandService), __decorateParam(1, IActiveDirtyManagerService)], FormulaCalculationTriggerService);
42155
+ function createEmptyDirtyData() {
42156
+ return {
42157
+ forceCalculation: false,
42158
+ dirtyRanges: [],
42159
+ dirtyNameMap: {},
42160
+ dirtyDefinedNameMap: {},
42161
+ dirtySuperTableMap: {},
42162
+ dirtyUnitFeatureMap: {},
42163
+ dirtyUnitOtherFormulaMap: {},
42164
+ clearDependencyTreeCache: {}
42165
+ };
42166
+ }
42167
+ function mergeDirtyData(left, right) {
42168
+ var _right$dirtyRanges, _left$dirtySuperTable;
42169
+ const dirtyRanges = [...left.dirtyRanges];
42170
+ mergeDirtyRanges(dirtyRanges, (_right$dirtyRanges = right.dirtyRanges) !== null && _right$dirtyRanges !== void 0 ? _right$dirtyRanges : []);
42171
+ return {
42172
+ dirtyRanges,
42173
+ dirtyNameMap: mergeDirtyUnitStringMap(left.dirtyNameMap, right.dirtyNameMap),
42174
+ dirtyDefinedNameMap: mergeDirtyUnitStringMap(left.dirtyDefinedNameMap, right.dirtyDefinedNameMap),
42175
+ dirtySuperTableMap: mergeDirtyUnitStringMap((_left$dirtySuperTable = left.dirtySuperTableMap) !== null && _left$dirtySuperTable !== void 0 ? _left$dirtySuperTable : {}, right.dirtySuperTableMap),
42176
+ dirtyUnitFeatureMap: mergeDirtyUnitNestedMap(left.dirtyUnitFeatureMap, right.dirtyUnitFeatureMap),
42177
+ dirtyUnitOtherFormulaMap: mergeDirtyUnitNestedMap(left.dirtyUnitOtherFormulaMap, right.dirtyUnitOtherFormulaMap),
42178
+ clearDependencyTreeCache: mergeDirtyUnitStringMap(left.clearDependencyTreeCache, right.clearDependencyTreeCache),
42179
+ forceCalculation: left.forceCalculation || Boolean(right.forceCalculation)
42180
+ };
42181
+ }
42182
+ function mergeDirtyRanges(target, source) {
42183
+ source.forEach((range) => {
42184
+ if (!target.some((item) => item.unitId === range.unitId && item.sheetId === range.sheetId && item.range.startRow === range.range.startRow && item.range.startColumn === range.range.startColumn && item.range.endRow === range.range.endRow && item.range.endColumn === range.range.endColumn)) target.push(range);
42185
+ });
42186
+ }
42187
+ function mergeDirtyUnitStringMap(left, right) {
42188
+ const result = { ...left };
42189
+ Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, values]) => {
42190
+ result[unitId] = {
42191
+ ...result[unitId],
42192
+ ...values
42193
+ };
42194
+ });
42195
+ return result;
42196
+ }
42197
+ function mergeDirtyUnitNestedMap(left, right) {
42198
+ const result = { ...left };
42199
+ Object.entries(right !== null && right !== void 0 ? right : {}).forEach(([unitId, sheets]) => {
42200
+ const unitResult = { ...result[unitId] };
42201
+ Object.entries(sheets !== null && sheets !== void 0 ? sheets : {}).forEach(([sheetId, values]) => {
42202
+ unitResult[sheetId] = {
42203
+ ...unitResult[sheetId],
42204
+ ...values
42205
+ };
42206
+ });
42207
+ result[unitId] = unitResult;
42208
+ });
42209
+ return result;
42210
+ }
42211
+ function hasDirtyData(dirtyData) {
42212
+ 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);
42213
+ }
42214
+ function hasNestedValue(value) {
42215
+ if (value == null) return false;
42216
+ if (typeof value !== "object") return true;
42217
+ return Object.values(value).some(hasNestedValue);
42218
+ }
40971
42219
 
40972
42220
  //#endregion
40973
42221
  //#region src/services/formula-common.ts
@@ -41169,7 +42417,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41169
42417
  }
41170
42418
  onReady() {
41171
42419
  var _this$_config;
41172
- touchDependencies(this._injector, [[FormulaController]]);
42420
+ touchDependencies(this._injector, [[FormulaController], [SuperTableActiveDirtyController]]);
41173
42421
  if (!((_this$_config = this._config) === null || _this$_config === void 0 ? void 0 : _this$_config.notExecuteFormula)) touchDependencies(this._injector, [
41174
42422
  [SetOtherFormulaController],
41175
42423
  [SetFeatureCalculationController],
@@ -41187,6 +42435,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41187
42435
  [IFunctionService, { useClass: FunctionService }],
41188
42436
  [IDefinedNamesService, { useClass: DefinedNamesService }],
41189
42437
  [IActiveDirtyManagerService, { useClass: ActiveDirtyManagerService }],
42438
+ [FormulaCalculationTriggerService],
41190
42439
  [RegisterOtherFormulaService],
41191
42440
  [IHyperlinkEngineFormulaService, { useClass: HyperlinkEngineFormulaService }],
41192
42441
  [ISheetRowFilteredService, { useClass: SheetRowFilteredService }],
@@ -41194,6 +42443,7 @@ let UniverFormulaEnginePlugin = class UniverFormulaEnginePlugin extends Plugin {
41194
42443
  [GlobalComputingStatusService],
41195
42444
  [FormulaDataModel],
41196
42445
  [FormulaController],
42446
+ [SuperTableActiveDirtyController],
41197
42447
  [ComputingStatusReporterController]
41198
42448
  ];
41199
42449
  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]);
@@ -41215,4 +42465,4 @@ _defineProperty(UniverFormulaEnginePlugin, "version", version);
41215
42465
  UniverFormulaEnginePlugin = __decorate([__decorateParam(1, Inject(Injector)), __decorateParam(2, IConfigService)], UniverFormulaEnginePlugin);
41216
42466
 
41217
42467
  //#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 };
42468
+ 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, 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, 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, normalizeSheetName, operatorToken, prefixToken, quoteSheetName, sequenceNodeType, serializeRange, serializeRangeToRefString, serializeRangeWithSheet, serializeRangeWithSpreadsheet, singleReferenceToGrid, splitTableStructuredRef, strip, stripErrorMargin, unquoteSheetName };