@odoo/o-spreadsheet 18.2.12 → 18.2.13

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.
@@ -2,9 +2,9 @@
2
2
  /**
3
3
  * This file is generated by o-spreadsheet build tools. Do not edit it.
4
4
  * @see https://github.com/odoo/o-spreadsheet
5
- * @version 18.2.12
6
- * @date 2025-05-13T17:52:23.989Z
7
- * @hash ba2ba9b
5
+ * @version 18.2.13
6
+ * @date 2025-05-20T05:57:00.985Z
7
+ * @hash 9872529
8
8
  */
9
9
 
10
10
  'use strict';
@@ -1619,18 +1619,53 @@ function lettersToNumber(letters) {
1619
1619
  let result = 0;
1620
1620
  const l = letters.length;
1621
1621
  for (let i = 0; i < l; i++) {
1622
- const charCode = letters.charCodeAt(i);
1623
- const colIndex = charCode >= 65 && charCode <= 90 ? charCode - 64 : charCode - 96;
1622
+ const colIndex = charToNumber(letters[i]);
1624
1623
  result = result * 26 + colIndex;
1625
1624
  }
1626
1625
  return result - 1;
1627
1626
  }
1627
+ function charToNumber(char) {
1628
+ const charCode = char.charCodeAt(0);
1629
+ return charCode >= 65 && charCode <= 90 ? charCode - 64 : charCode - 96;
1630
+ }
1628
1631
  function isCharALetter(char) {
1629
1632
  return (char >= "A" && char <= "Z") || (char >= "a" && char <= "z");
1630
1633
  }
1631
1634
  function isCharADigit(char) {
1632
1635
  return char >= "0" && char <= "9";
1633
1636
  }
1637
+ // we limit the max column to 3 letters and max row to 7 digits for performance reasons
1638
+ const MAX_COL = lettersToNumber("ZZZ");
1639
+ const MAX_ROW = 9999998;
1640
+ function consumeSpaces(chars) {
1641
+ while (chars.current === " ") {
1642
+ chars.advanceBy(1);
1643
+ }
1644
+ }
1645
+ function consumeLetters(chars) {
1646
+ if (chars.current === "$")
1647
+ chars.advanceBy(1);
1648
+ if (!chars.current || !isCharALetter(chars.current)) {
1649
+ return -1;
1650
+ }
1651
+ let colCoordinate = 0;
1652
+ while (chars.current && isCharALetter(chars.current)) {
1653
+ colCoordinate = colCoordinate * 26 + charToNumber(chars.shift());
1654
+ }
1655
+ return colCoordinate;
1656
+ }
1657
+ function consumeDigits(chars) {
1658
+ if (chars.current === "$")
1659
+ chars.advanceBy(1);
1660
+ if (!chars.current || !isCharADigit(chars.current)) {
1661
+ return -1;
1662
+ }
1663
+ let num = 0;
1664
+ while (chars.current && isCharADigit(chars.current)) {
1665
+ num = num * 10 + Number(chars.shift());
1666
+ }
1667
+ return num;
1668
+ }
1634
1669
  /**
1635
1670
  * Convert a "XC" coordinate to cartesian coordinates.
1636
1671
  *
@@ -1641,33 +1676,17 @@ function isCharADigit(char) {
1641
1676
  * Note: it also accepts lowercase coordinates, but not fixed references
1642
1677
  */
1643
1678
  function toCartesian(xc) {
1644
- xc = xc.trim();
1645
- let letterPart = "";
1646
- let numberPart = "";
1647
- let i = 0;
1648
- // Process letter part
1649
- if (xc[i] === "$")
1650
- i++;
1651
- while (i < xc.length && isCharALetter(xc[i])) {
1652
- letterPart += xc[i++];
1653
- }
1654
- if (letterPart.length === 0 || letterPart.length > 3) {
1655
- // limit to max 3 letters for performance reasons
1679
+ const chars = new TokenizingChars(xc);
1680
+ consumeSpaces(chars);
1681
+ const letterPart = consumeLetters(chars);
1682
+ if (letterPart === -1 || !chars.current) {
1656
1683
  throw new Error(`Invalid cell description: ${xc}`);
1657
1684
  }
1658
- // Process number part
1659
- if (xc[i] === "$")
1660
- i++;
1661
- while (i < xc.length && isCharADigit(xc[i])) {
1662
- numberPart += xc[i++];
1663
- }
1664
- if (i !== xc.length || numberPart.length === 0 || numberPart.length > 7) {
1665
- // limit to max 7 numbers for performance reasons
1666
- throw new Error(`Invalid cell description: ${xc}`);
1667
- }
1668
- const col = lettersToNumber(letterPart);
1669
- const row = Number(numberPart) - 1;
1670
- if (isNaN(row)) {
1685
+ const num = consumeDigits(chars);
1686
+ consumeSpaces(chars);
1687
+ const col = letterPart - 1;
1688
+ const row = num - 1;
1689
+ if (!chars.isOver() || col > MAX_COL || row > MAX_ROW) {
1671
1690
  throw new Error(`Invalid cell description: ${xc}`);
1672
1691
  }
1673
1692
  return { col, row };
@@ -2079,67 +2098,6 @@ class LazyTranslatedString extends String {
2079
2098
  }
2080
2099
  }
2081
2100
 
2082
- /** Reference of a cell (eg. A1, $B$5) */
2083
- const cellReference = new RegExp(/\$?([A-Z]{1,3})\$?([0-9]{1,7})/, "i");
2084
- // Same as above, but matches the exact string (nothing before or after)
2085
- const singleCellReference = new RegExp(/^\$?([A-Z]{1,3})\$?([0-9]{1,7})$/, "i");
2086
- /** Reference of a column header (eg. A, AB, $A) */
2087
- const colHeader = new RegExp(/^\$?([A-Z]{1,3})+$/, "i");
2088
- /** Reference of a row header (eg. 1, $1) */
2089
- const rowHeader = new RegExp(/^\$?([0-9]{1,7})+$/, "i");
2090
- /** Reference of a column (eg. A, $CA, Sheet1!B) */
2091
- const colReference = new RegExp(/^\s*('.+'!|[^']+!)?\$?([A-Z]{1,3})$/, "i");
2092
- /** Reference of a row (eg. 1, 59, Sheet1!9) */
2093
- const rowReference = new RegExp(/^\s*('.+'!|[^']+!)?\$?([0-9]{1,7})$/, "i");
2094
- /** Reference of a normal range or a full row range (eg. A1:B1, 1:$5, $A2:5) */
2095
- const fullRowXc = /(\$?[A-Z]{1,3})?\$?[0-9]{1,7}\s*:\s*(\$?[A-Z]{1,3})?\$?[0-9]{1,7}\s*/i;
2096
- /** Reference of a normal range or a column row range (eg. A1:B1, A:$B, $A1:C) */
2097
- const fullColXc = /\$?[A-Z]{1,3}(\$?[0-9]{1,7})?\s*:\s*\$?[A-Z]{1,3}(\$?[0-9]{1,7})?\s*/i;
2098
- /** Reference of a cell or a range, it can be a bounded range, a full row or a full column */
2099
- const rangeReference = new RegExp(/^\s*('.+'!|[^']+!)?/.source +
2100
- "(" +
2101
- [cellReference.source, fullRowXc.source, fullColXc.source].join("|") +
2102
- ")" +
2103
- /$/.source, "i");
2104
- /**
2105
- * Return true if the given xc is the reference of a column (e.g. A or AC or Sheet1!A)
2106
- */
2107
- function isColReference(xc) {
2108
- return colReference.test(xc);
2109
- }
2110
- /**
2111
- * Return true if the given xc is the reference of a column (e.g. 1 or Sheet1!1)
2112
- */
2113
- function isRowReference(xc) {
2114
- return rowReference.test(xc);
2115
- }
2116
- function isColHeader(str) {
2117
- return colHeader.test(str);
2118
- }
2119
- function isRowHeader(str) {
2120
- return rowHeader.test(str);
2121
- }
2122
- /**
2123
- * Return true if the given xc is the reference of a single cell,
2124
- * without any specified sheet (e.g. A1)
2125
- */
2126
- function isSingleCellReference(xc) {
2127
- return singleCellReference.test(xc);
2128
- }
2129
- function splitReference(ref) {
2130
- if (!ref.includes("!")) {
2131
- return { xc: ref };
2132
- }
2133
- const parts = ref.split("!");
2134
- const xc = parts.pop();
2135
- const sheetName = getUnquotedSheetName(parts.join("!")) || undefined;
2136
- return { sheetName, xc };
2137
- }
2138
- /** Return a reference SheetName!xc from the given arguments */
2139
- function getFullReference(sheetName, xc) {
2140
- return sheetName !== undefined ? `${getCanonicalSymbolName(sheetName)}!${xc}` : xc;
2141
- }
2142
-
2143
2101
  /**
2144
2102
  * Convert from a cartesian reference to a Zone
2145
2103
  * The range boundaries will be kept in the same order as the
@@ -2157,63 +2115,55 @@ function getFullReference(sheetName, xc) {
2157
2115
  *
2158
2116
  */
2159
2117
  function toZoneWithoutBoundaryChanges(xc) {
2160
- if (xc.includes("!")) {
2161
- xc = xc.split("!").at(-1);
2162
- }
2163
- if (xc.includes("$")) {
2164
- xc = xc.replaceAll("$", "");
2165
- }
2166
- let firstRangePart = "";
2167
- let secondRangePart;
2168
- if (xc.includes(":")) {
2169
- [firstRangePart, secondRangePart] = xc.split(":");
2170
- firstRangePart = firstRangePart.trim();
2171
- secondRangePart = secondRangePart.trim();
2172
- }
2173
- else {
2174
- firstRangePart = xc.trim();
2175
- }
2118
+ const chars = new TokenizingChars(xc);
2119
+ consumeSpaces(chars);
2120
+ const sheetSeparatorIndex = xc.indexOf("!");
2121
+ if (sheetSeparatorIndex !== -1) {
2122
+ chars.advanceBy(sheetSeparatorIndex + 1);
2123
+ }
2124
+ const leftLetters = consumeLetters(chars);
2125
+ const leftNumbers = consumeDigits(chars);
2176
2126
  let top, bottom, left, right;
2177
2127
  let fullCol = false;
2178
2128
  let fullRow = false;
2179
2129
  let hasHeader = false;
2180
- if (isColReference(firstRangePart)) {
2181
- left = right = lettersToNumber(firstRangePart);
2130
+ if (leftNumbers === -1) {
2131
+ left = right = leftLetters - 1;
2182
2132
  top = bottom = 0;
2183
2133
  fullCol = true;
2184
2134
  }
2185
- else if (isRowReference(firstRangePart)) {
2186
- top = bottom = parseInt(firstRangePart, 10) - 1;
2135
+ else if (leftLetters === -1) {
2136
+ top = bottom = leftNumbers - 1;
2187
2137
  left = right = 0;
2188
2138
  fullRow = true;
2189
2139
  }
2190
2140
  else {
2191
- const c = toCartesian(firstRangePart);
2192
- left = right = c.col;
2193
- top = bottom = c.row;
2141
+ left = right = leftLetters - 1;
2142
+ top = bottom = leftNumbers - 1;
2194
2143
  hasHeader = true;
2195
2144
  }
2196
- if (secondRangePart) {
2197
- if (isColReference(secondRangePart)) {
2198
- right = lettersToNumber(secondRangePart);
2145
+ consumeSpaces(chars);
2146
+ if (chars.current === ":") {
2147
+ chars.advanceBy(1);
2148
+ consumeSpaces(chars);
2149
+ const rightLetters = consumeLetters(chars);
2150
+ const rightNumbers = consumeDigits(chars);
2151
+ if (rightNumbers === -1) {
2152
+ right = rightLetters - 1;
2199
2153
  fullCol = true;
2200
2154
  }
2201
- else if (isRowReference(secondRangePart)) {
2202
- bottom = parseInt(secondRangePart, 10) - 1;
2155
+ else if (rightLetters === -1) {
2156
+ bottom = rightNumbers - 1;
2203
2157
  fullRow = true;
2204
2158
  }
2205
2159
  else {
2206
- const c = toCartesian(secondRangePart);
2207
- right = c.col;
2208
- bottom = c.row;
2160
+ right = rightLetters - 1;
2161
+ bottom = rightNumbers - 1;
2209
2162
  top = fullCol ? bottom : top;
2210
2163
  left = fullRow ? right : left;
2211
2164
  hasHeader = true;
2212
2165
  }
2213
2166
  }
2214
- if (fullCol && fullRow) {
2215
- throw new Error("Wrong zone xc. The zone cannot be at the same time a full column and a full row");
2216
- }
2217
2167
  const zone = {
2218
2168
  top,
2219
2169
  left,
@@ -2242,7 +2192,16 @@ function toZoneWithoutBoundaryChanges(xc) {
2242
2192
  */
2243
2193
  function toUnboundedZone(xc) {
2244
2194
  const zone = toZoneWithoutBoundaryChanges(xc);
2245
- return reorderZone(zone);
2195
+ const orderedZone = reorderZone(zone);
2196
+ const bottom = orderedZone.bottom;
2197
+ const right = orderedZone.right;
2198
+ if ((bottom !== undefined && bottom > MAX_ROW) || (right !== undefined && right > MAX_COL)) {
2199
+ throw new Error(`Range string out of bounds: ${xc}`); // limit the size of the zone for performance
2200
+ }
2201
+ if (bottom === undefined && right === undefined) {
2202
+ throw new Error("Wrong zone xc. The zone cannot be at the same time a full column and a full row");
2203
+ }
2204
+ return orderedZone;
2246
2205
  }
2247
2206
  /**
2248
2207
  * Convert from a cartesian reference to a Zone.
@@ -5976,6 +5935,67 @@ function scrollDelay(value) {
5976
5935
  return MIN_DELAY + (MAX_DELAY - MIN_DELAY) * Math.exp(-ACCELERATION * (value - 1));
5977
5936
  }
5978
5937
 
5938
+ /** Reference of a cell (eg. A1, $B$5) */
5939
+ const cellReference = new RegExp(/\$?([A-Z]{1,3})\$?([0-9]{1,7})/, "i");
5940
+ // Same as above, but matches the exact string (nothing before or after)
5941
+ const singleCellReference = new RegExp(/^\$?([A-Z]{1,3})\$?([0-9]{1,7})$/, "i");
5942
+ /** Reference of a column header (eg. A, AB, $A) */
5943
+ const colHeader = new RegExp(/^\$?([A-Z]{1,3})+$/, "i");
5944
+ /** Reference of a row header (eg. 1, $1) */
5945
+ const rowHeader = new RegExp(/^\$?([0-9]{1,7})+$/, "i");
5946
+ /** Reference of a column (eg. A, $CA, Sheet1!B) */
5947
+ const colReference = new RegExp(/^\s*('.+'!|[^']+!)?\$?([A-Z]{1,3})$/, "i");
5948
+ /** Reference of a row (eg. 1, 59, Sheet1!9) */
5949
+ const rowReference = new RegExp(/^\s*('.+'!|[^']+!)?\$?([0-9]{1,7})$/, "i");
5950
+ /** Reference of a normal range or a full row range (eg. A1:B1, 1:$5, $A2:5) */
5951
+ const fullRowXc = /(\$?[A-Z]{1,3})?\$?[0-9]{1,7}\s*:\s*(\$?[A-Z]{1,3})?\$?[0-9]{1,7}\s*/i;
5952
+ /** Reference of a normal range or a column row range (eg. A1:B1, A:$B, $A1:C) */
5953
+ const fullColXc = /\$?[A-Z]{1,3}(\$?[0-9]{1,7})?\s*:\s*\$?[A-Z]{1,3}(\$?[0-9]{1,7})?\s*/i;
5954
+ /** Reference of a cell or a range, it can be a bounded range, a full row or a full column */
5955
+ const rangeReference = new RegExp(/^\s*('.+'!|[^']+!)?/.source +
5956
+ "(" +
5957
+ [cellReference.source, fullRowXc.source, fullColXc.source].join("|") +
5958
+ ")" +
5959
+ /$/.source, "i");
5960
+ /**
5961
+ * Return true if the given xc is the reference of a column (e.g. A or AC or Sheet1!A)
5962
+ */
5963
+ function isColReference(xc) {
5964
+ return colReference.test(xc);
5965
+ }
5966
+ /**
5967
+ * Return true if the given xc is the reference of a column (e.g. 1 or Sheet1!1)
5968
+ */
5969
+ function isRowReference(xc) {
5970
+ return rowReference.test(xc);
5971
+ }
5972
+ function isColHeader(str) {
5973
+ return colHeader.test(str);
5974
+ }
5975
+ function isRowHeader(str) {
5976
+ return rowHeader.test(str);
5977
+ }
5978
+ /**
5979
+ * Return true if the given xc is the reference of a single cell,
5980
+ * without any specified sheet (e.g. A1)
5981
+ */
5982
+ function isSingleCellReference(xc) {
5983
+ return singleCellReference.test(xc);
5984
+ }
5985
+ function splitReference(ref) {
5986
+ if (!ref.includes("!")) {
5987
+ return { xc: ref };
5988
+ }
5989
+ const parts = ref.split("!");
5990
+ const xc = parts.pop();
5991
+ const sheetName = getUnquotedSheetName(parts.join("!")) || undefined;
5992
+ return { sheetName, xc };
5993
+ }
5994
+ /** Return a reference SheetName!xc from the given arguments */
5995
+ function getFullReference(sheetName, xc) {
5996
+ return sheetName !== undefined ? `${getCanonicalSymbolName(sheetName)}!${xc}` : xc;
5997
+ }
5998
+
5979
5999
  class RangeImpl {
5980
6000
  getSheetSize;
5981
6001
  _zone;
@@ -41159,12 +41179,13 @@ class StandaloneComposerStore extends AbstractComposerStore {
41159
41179
  return res;
41160
41180
  }
41161
41181
  getComposerContent() {
41182
+ let content = this._currentContent;
41162
41183
  if (this.editionMode === "inactive") {
41163
41184
  // References in the content might not be linked to the current active sheet
41164
41185
  // We here force the sheet name prefix for all references that are not in
41165
41186
  // the current active sheet
41166
41187
  const defaultRangeSheetId = this.args().defaultRangeSheetId;
41167
- return rangeTokenize(this.args().content)
41188
+ content = rangeTokenize(this.args().content)
41168
41189
  .map((token) => {
41169
41190
  if (token.type === "REFERENCE") {
41170
41191
  const range = this.getters.getRangeFromSheetXC(defaultRangeSheetId, token.value);
@@ -41174,7 +41195,7 @@ class StandaloneComposerStore extends AbstractComposerStore {
41174
41195
  })
41175
41196
  .join("");
41176
41197
  }
41177
- return this._currentContent;
41198
+ return localizeContent(content, this.getters.getLocale());
41178
41199
  }
41179
41200
  stopEdition() {
41180
41201
  this._stopEdition();
@@ -45449,6 +45470,9 @@ class PivotMeasureEditor extends owl.Component {
45449
45470
  }
45450
45471
  return undefined;
45451
45472
  }
45473
+ get isCalculatedMeasureInvalid() {
45474
+ return this.env.model.getters.getMeasureCompiledFormula(this.props.measure).isBadExpression;
45475
+ }
45452
45476
  }
45453
45477
 
45454
45478
  css /* scss */ `
@@ -60951,10 +60975,9 @@ class Evaluator {
60951
60975
  return this.evaluatedCells.keysForSheet(sheetId);
60952
60976
  }
60953
60977
  getArrayFormulaSpreadingOn(position) {
60954
- const hasArrayFormulaResult = this.getEvaluatedCell(position).type !== CellValueType.empty &&
60955
- !this.getters.getCell(position)?.isFormula;
60956
- if (!hasArrayFormulaResult) {
60957
- return this.spreadingRelations.isArrayFormula(position) ? position : undefined;
60978
+ const isEmpty = this.getEvaluatedCell(position).type === CellValueType.empty;
60979
+ if (isEmpty) {
60980
+ return undefined;
60958
60981
  }
60959
60982
  const arrayFormulas = this.spreadingRelations.searchFormulaPositionsSpreadingOn(position.sheetId, positionToZone(position));
60960
60983
  return Array.from(arrayFormulas).find((position) => !this.blockedArrayFormulas.has(position));
@@ -76804,6 +76827,6 @@ exports.tokenColors = tokenColors;
76804
76827
  exports.tokenize = tokenize;
76805
76828
 
76806
76829
 
76807
- __info__.version = "18.2.12";
76808
- __info__.date = "2025-05-13T17:52:23.989Z";
76809
- __info__.hash = "ba2ba9b";
76830
+ __info__.version = "18.2.13";
76831
+ __info__.date = "2025-05-20T05:57:00.985Z";
76832
+ __info__.hash = "9872529";
@@ -1275,6 +1275,51 @@ declare class ColorGenerator {
1275
1275
  next(): string;
1276
1276
  }
1277
1277
 
1278
+ interface SearchOptions {
1279
+ matchCase: boolean;
1280
+ exactMatch: boolean;
1281
+ searchFormulas: boolean;
1282
+ searchScope: "allSheets" | "activeSheet" | "specificRange";
1283
+ specificRange?: Range;
1284
+ }
1285
+
1286
+ /**
1287
+ * Deep copy arrays, plain objects and primitive values.
1288
+ * Throws an error for other types such as class instances.
1289
+ * Sparse arrays remain sparse.
1290
+ */
1291
+ declare function deepCopy<T>(obj: T): T;
1292
+ declare function unquote(string: string, quoteChar?: "'" | '"'): string;
1293
+ /** Replace the excel-excluded characters of a sheetName */
1294
+ declare function sanitizeSheetName(sheetName: string, replacementChar?: string): string;
1295
+ declare function isMarkdownLink(str: string): boolean;
1296
+ /**
1297
+ * Build a markdown link from a label and an url
1298
+ */
1299
+ declare function markdownLink(label: string, url: string): string;
1300
+ declare function parseMarkdownLink(str: string): {
1301
+ url: string;
1302
+ label: string;
1303
+ };
1304
+ /**
1305
+ * This helper function can be used as a type guard when filtering arrays.
1306
+ * const foo: number[] = [1, 2, undefined, 4].filter(isDefined)
1307
+ */
1308
+ declare function isDefined<T>(argument: T | undefined): argument is T;
1309
+ /**
1310
+ * Lazy value computed by the provided function.
1311
+ */
1312
+ declare function lazy<T>(fn: (() => T) | T): Lazy<T>;
1313
+ /**
1314
+ * Compares two objects.
1315
+ */
1316
+ declare function deepEquals(o1: any, o2: any): boolean;
1317
+ declare function getUniqueText(text: string, texts: string[], options?: {
1318
+ compute?: (text: string, increment: number) => string;
1319
+ start?: number;
1320
+ computeFirstOne?: boolean;
1321
+ }): string;
1322
+
1278
1323
  /**
1279
1324
  * Convert a (col) number to the corresponding letter.
1280
1325
  *
@@ -1351,51 +1396,6 @@ declare function formatValue(value: CellValue, { format, locale, formatWidth }:
1351
1396
  }): FormattedValue;
1352
1397
  declare function createCurrencyFormat(currency: Partial<Currency>): Format;
1353
1398
 
1354
- interface SearchOptions {
1355
- matchCase: boolean;
1356
- exactMatch: boolean;
1357
- searchFormulas: boolean;
1358
- searchScope: "allSheets" | "activeSheet" | "specificRange";
1359
- specificRange?: Range;
1360
- }
1361
-
1362
- /**
1363
- * Deep copy arrays, plain objects and primitive values.
1364
- * Throws an error for other types such as class instances.
1365
- * Sparse arrays remain sparse.
1366
- */
1367
- declare function deepCopy<T>(obj: T): T;
1368
- declare function unquote(string: string, quoteChar?: "'" | '"'): string;
1369
- /** Replace the excel-excluded characters of a sheetName */
1370
- declare function sanitizeSheetName(sheetName: string, replacementChar?: string): string;
1371
- declare function isMarkdownLink(str: string): boolean;
1372
- /**
1373
- * Build a markdown link from a label and an url
1374
- */
1375
- declare function markdownLink(label: string, url: string): string;
1376
- declare function parseMarkdownLink(str: string): {
1377
- url: string;
1378
- label: string;
1379
- };
1380
- /**
1381
- * This helper function can be used as a type guard when filtering arrays.
1382
- * const foo: number[] = [1, 2, undefined, 4].filter(isDefined)
1383
- */
1384
- declare function isDefined<T>(argument: T | undefined): argument is T;
1385
- /**
1386
- * Lazy value computed by the provided function.
1387
- */
1388
- declare function lazy<T>(fn: (() => T) | T): Lazy<T>;
1389
- /**
1390
- * Compares two objects.
1391
- */
1392
- declare function deepEquals(o1: any, o2: any): boolean;
1393
- declare function getUniqueText(text: string, texts: string[], options?: {
1394
- compute?: (text: string, increment: number) => string;
1395
- start?: number;
1396
- computeFirstOne?: boolean;
1397
- }): string;
1398
-
1399
1399
  /**
1400
1400
  * Return true if the argument is a "number string".
1401
1401
  *
@@ -10249,6 +10249,7 @@ declare class PivotMeasureEditor extends Component<Props$i> {
10249
10249
  toggleMeasureVisibility(): void;
10250
10250
  openShowValuesAs(): void;
10251
10251
  getColoredSymbolToken(token: Token): Color | undefined;
10252
+ get isCalculatedMeasureInvalid(): boolean;
10252
10253
  }
10253
10254
 
10254
10255
  interface Props$h {