@odoo/o-spreadsheet 18.0.5 → 18.0.7

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.0.5
6
- * @date 2024-11-22T14:19:19.721Z
7
- * @hash 9eb34d9
5
+ * @version 18.0.7
6
+ * @date 2024-12-05T10:41:39.380Z
7
+ * @hash a2652c5
8
8
  */
9
9
 
10
10
  'use strict';
@@ -334,8 +334,8 @@ const LINE_FILL_TRANSPARENCY = 0.4;
334
334
  const DEBOUNCE_TIME = 200;
335
335
  const MESSAGE_VERSION = 1;
336
336
  // Sheets
337
- const FORBIDDEN_SHEET_CHARS = ["'", "*", "?", "/", "\\", "[", "]"];
338
- const FORBIDDEN_IN_EXCEL_REGEX = /'|\*|\?|\/|\\|\[|\]/;
337
+ const FORBIDDEN_SHEETNAME_CHARS = ["'", "*", "?", "/", "\\", "[", "]"];
338
+ const FORBIDDEN_SHEETNAME_CHARS_IN_EXCEL_REGEX = /'|\*|\?|\/|\\|\[|\]/;
339
339
  // Cells
340
340
  const FORMULA_REF_IDENTIFIER = "|";
341
341
  // Components
@@ -388,6 +388,7 @@ const DEFAULT_CURRENCY = {
388
388
  //------------------------------------------------------------------------------
389
389
  // Miscellaneous
390
390
  //------------------------------------------------------------------------------
391
+ const sanitizeSheetNameRegex = new RegExp(FORBIDDEN_SHEETNAME_CHARS_IN_EXCEL_REGEX, "g");
391
392
  /**
392
393
  * Remove quotes from a quoted string
393
394
  * ```js
@@ -483,6 +484,10 @@ function getCanonicalSymbolName(symbolName) {
483
484
  }
484
485
  return symbolName;
485
486
  }
487
+ /** Replace the excel-excluded characters of a sheetName */
488
+ function sanitizeSheetName(sheetName, replacementChar = " ") {
489
+ return sheetName.replace(sanitizeSheetNameRegex, replacementChar);
490
+ }
486
491
  function clip(val, min, max) {
487
492
  return val < min ? min : val > max ? max : val;
488
493
  }
@@ -3542,7 +3547,6 @@ exports.CommandResult = void 0;
3542
3547
  CommandResult["ValueCellIsInvalidFormula"] = "ValueCellIsInvalidFormula";
3543
3548
  CommandResult["InvalidDefinition"] = "InvalidDefinition";
3544
3549
  CommandResult["InvalidColor"] = "InvalidColor";
3545
- CommandResult["DataBarRangeValuesMismatch"] = "DataBarRangeValuesMismatch";
3546
3550
  })(exports.CommandResult || (exports.CommandResult = {}));
3547
3551
 
3548
3552
  const DEFAULT_LOCALES = [
@@ -9417,34 +9421,42 @@ function interpolateData(config, values, labels, newLabels) {
9417
9421
  const labelRange = labelMax - labelMin;
9418
9422
  const normalizedLabels = labels.map((v) => (v - labelMin) / labelRange);
9419
9423
  const normalizedNewLabels = newLabels.map((v) => (v - labelMin) / labelRange);
9420
- switch (config.type) {
9421
- case "polynomial": {
9422
- const order = config.order ?? 2;
9423
- if (order === 1) {
9424
- return predictLinearValues([values], [normalizedLabels], [normalizedNewLabels], true)[0];
9425
- }
9426
- const coeffs = polynomialRegression(values, normalizedLabels, order, true).flat();
9427
- return normalizedNewLabels.map((v) => evaluatePolynomial(coeffs, v, order));
9428
- }
9429
- case "exponential": {
9430
- const positiveLogValues = [];
9431
- const filteredLabels = [];
9432
- for (let i = 0; i < values.length; i++) {
9433
- if (values[i] > 0) {
9434
- positiveLogValues.push(Math.log(values[i]));
9435
- filteredLabels.push(normalizedLabels[i]);
9424
+ try {
9425
+ switch (config.type) {
9426
+ case "polynomial": {
9427
+ const order = config.order;
9428
+ if (!order) {
9429
+ return Array.from({ length: newLabels.length }, () => NaN);
9430
+ }
9431
+ if (order === 1) {
9432
+ return predictLinearValues([values], [normalizedLabels], [normalizedNewLabels], true)[0];
9433
+ }
9434
+ const coeffs = polynomialRegression(values, normalizedLabels, order, true).flat();
9435
+ return normalizedNewLabels.map((v) => evaluatePolynomial(coeffs, v, order));
9436
+ }
9437
+ case "exponential": {
9438
+ const positiveLogValues = [];
9439
+ const filteredLabels = [];
9440
+ for (let i = 0; i < values.length; i++) {
9441
+ if (values[i] > 0) {
9442
+ positiveLogValues.push(Math.log(values[i]));
9443
+ filteredLabels.push(normalizedLabels[i]);
9444
+ }
9436
9445
  }
9446
+ if (!filteredLabels.length) {
9447
+ return Array.from({ length: newLabels.length }, () => NaN);
9448
+ }
9449
+ return expM(predictLinearValues([positiveLogValues], [filteredLabels], [normalizedNewLabels], true))[0];
9437
9450
  }
9438
- if (!filteredLabels.length) {
9439
- return [];
9451
+ case "logarithmic": {
9452
+ return predictLinearValues([values], logM([normalizedLabels]), logM([normalizedNewLabels]), true)[0];
9440
9453
  }
9441
- return expM(predictLinearValues([positiveLogValues], [filteredLabels], [normalizedNewLabels], true))[0];
9442
- }
9443
- case "logarithmic": {
9444
- return predictLinearValues([values], logM([normalizedLabels]), logM([normalizedNewLabels]), true)[0];
9454
+ default:
9455
+ return [];
9445
9456
  }
9446
- default:
9447
- return [];
9457
+ }
9458
+ catch (e) {
9459
+ return Array.from({ length: newLabels.length }, () => NaN);
9448
9460
  }
9449
9461
  }
9450
9462
  function formatTickValue(localeFormat) {
@@ -27243,13 +27255,12 @@ migrationStepRegistry
27243
27255
  versionFrom: "7",
27244
27256
  migrate(data) {
27245
27257
  const namesTaken = [];
27246
- const globalForbiddenInExcel = new RegExp(FORBIDDEN_IN_EXCEL_REGEX, "g");
27247
27258
  for (let sheet of data.sheets || []) {
27248
27259
  if (!sheet.name) {
27249
27260
  continue;
27250
27261
  }
27251
27262
  const oldName = sheet.name;
27252
- const escapedName = oldName.replace(globalForbiddenInExcel, "_");
27263
+ const escapedName = sanitizeSheetName(oldName, "_");
27253
27264
  let i = 1;
27254
27265
  let newName = escapedName;
27255
27266
  while (namesTaken.includes(newName)) {
@@ -27922,7 +27933,6 @@ const CfTerms = {
27922
27933
  ["ValueLowerInvalidFormula" /* CommandResult.ValueLowerInvalidFormula */]: _t("Invalid lower inflection point formula"),
27923
27934
  ["EmptyRange" /* CommandResult.EmptyRange */]: _t("A range needs to be defined"),
27924
27935
  ["ValueCellIsInvalidFormula" /* CommandResult.ValueCellIsInvalidFormula */]: _t("At least one of the provided values is an invalid formula"),
27925
- ["DataBarRangeValuesMismatch" /* CommandResult.DataBarRangeValuesMismatch */]: _t("All the ranges and the range values must have the same size"),
27926
27936
  Unexpected: _t("The rule is invalid for an unknown reason"),
27927
27937
  },
27928
27938
  ColorScale: _t("Color scale"),
@@ -30107,9 +30117,12 @@ function createPyramidChartRuntime(chart, getters) {
30107
30117
  if (datasets && datasets[1]) {
30108
30118
  datasets[1].data = datasets[1].data.map((value) => (value > 0 ? -value : 0));
30109
30119
  }
30120
+ const maxValue = Math.max(...config.data?.datasets.map((dataSet) => Math.max(...dataSet.data.map(Math.abs))));
30110
30121
  const scales = config.options.scales;
30111
30122
  const scalesXCallback = scales.x.ticks.callback;
30112
30123
  scales.x.ticks.callback = (value) => scalesXCallback(Math.abs(value));
30124
+ scales.x.suggestedMin = -maxValue;
30125
+ scales.x.suggestedMax = maxValue;
30113
30126
  const tooltipLabelCallback = config.options.plugins.tooltip.callbacks.label;
30114
30127
  config.options.plugins.tooltip.callbacks.label = (item) => {
30115
30128
  const tooltipItem = { ...item, parsed: { y: item.parsed.y, x: Math.abs(item.parsed.x) } };
@@ -37461,7 +37474,7 @@ class ChartWithAxisDesignPanel extends owl.Component {
37461
37474
  case "polynomial":
37462
37475
  config = {
37463
37476
  type: "polynomial",
37464
- order: type === "linear" ? 1 : 2,
37477
+ order: type === "linear" ? 1 : this.getMaxPolynomialDegree(),
37465
37478
  };
37466
37479
  break;
37467
37480
  case "exponential":
@@ -38537,20 +38550,8 @@ class AbstractComposerStore extends SpreadsheetStore {
38537
38550
  replaceSelectedRange(zone) {
38538
38551
  const ref = this.getZoneReference(zone);
38539
38552
  const currentToken = this.tokenAtCursor;
38540
- let replaceStart = this.selectionStart;
38541
- if (currentToken?.type === "REFERENCE") {
38542
- replaceStart = currentToken.start;
38543
- }
38544
- else if (currentToken?.type === "RIGHT_PAREN") {
38545
- // match left parenthesis
38546
- const leftParenthesisIndex = this.currentTokens.findIndex((token) => token.type === "LEFT_PAREN" && token.parenIndex === currentToken.parenIndex);
38547
- const functionToken = this.currentTokens[leftParenthesisIndex - 1];
38548
- if (functionToken === undefined) {
38549
- return;
38550
- }
38551
- replaceStart = functionToken.start;
38552
- }
38553
- this.replaceText(ref, replaceStart, this.selectionEnd);
38553
+ const start = currentToken?.type === "REFERENCE" ? currentToken.start : this.selectionStart;
38554
+ this.replaceText(ref, start, this.selectionEnd);
38554
38555
  }
38555
38556
  /**
38556
38557
  * Replace the reference of the old zone by the new one.
@@ -38583,17 +38584,6 @@ class AbstractComposerStore extends SpreadsheetStore {
38583
38584
  getZoneReference(zone) {
38584
38585
  const inputSheetId = this.sheetId;
38585
38586
  const sheetId = this.getters.getActiveSheetId();
38586
- if (zone.top === zone.bottom && zone.left === zone.right) {
38587
- const position = { sheetId, col: zone.left, row: zone.top };
38588
- const pivotId = this.getters.getPivotIdFromPosition(position);
38589
- const pivotCell = this.getters.getPivotCellFromPosition(position);
38590
- const cell = this.getters.getCell(position);
38591
- if (pivotId && pivotCell.type !== "EMPTY" && !cell?.isFormula) {
38592
- const formulaPivotId = this.getters.getPivotFormulaId(pivotId);
38593
- const formula = createPivotFormula(formulaPivotId, pivotCell);
38594
- return localizeFormula(formula, this.getters.getLocale()).slice(1); // strip leading =
38595
- }
38596
- }
38597
38587
  const range = this.getters.getRangeFromZone(sheetId, zone);
38598
38588
  return this.getters.getSelectionRangeString(range, inputSheetId);
38599
38589
  }
@@ -38664,35 +38654,19 @@ class AbstractComposerStore extends SpreadsheetStore {
38664
38654
  const colorIndex = this.colorIndexByRange[rangeString];
38665
38655
  return colors$1[colorIndex % colors$1.length];
38666
38656
  };
38667
- const highlights = [];
38668
- for (const range of this.getReferencedRanges()) {
38657
+ return this.getReferencedRanges().map((range) => {
38669
38658
  const rangeString = this.getters.getRangeString(range, editionSheetId);
38670
38659
  const { numberOfRows, numberOfCols } = zoneToDimension(range.zone);
38671
38660
  const zone = numberOfRows * numberOfCols === 1
38672
38661
  ? this.getters.expandZone(range.sheetId, range.zone)
38673
38662
  : range.zone;
38674
- highlights.push({
38663
+ return {
38675
38664
  zone,
38676
38665
  color: rangeColor(rangeString),
38677
38666
  sheetId: range.sheetId,
38678
38667
  interactive: true,
38679
- });
38680
- }
38681
- const activeSheetId = this.getters.getActiveSheetId();
38682
- const selectionZone = this.model.selection.getAnchor().zone;
38683
- const isSelectionHightlighted = highlights.find((highlight) => highlight.sheetId === activeSheetId && isEqual(highlight.zone, selectionZone));
38684
- if (this.editionMode === "selecting" && !isSelectionHightlighted) {
38685
- highlights.push({
38686
- zone: selectionZone,
38687
- color: "#445566",
38688
- sheetId: activeSheetId,
38689
- dashed: true,
38690
- interactive: false,
38691
- noFill: true,
38692
- thinLine: true,
38693
- });
38694
- }
38695
- return highlights;
38668
+ };
38669
+ });
38696
38670
  }
38697
38671
  /**
38698
38672
  * Return ranges currently referenced in the composer
@@ -51863,8 +51837,6 @@ class ConditionalFormatPlugin extends CorePlugin {
51863
51837
  case "IconSetRule": {
51864
51838
  return this.checkValidations(rule, this.chainValidations(this.checkInflectionPoints(this.checkNaN), this.checkLowerBiggerThanUpper), this.chainValidations(this.checkInflectionPoints(this.checkFormulaCompilation)));
51865
51839
  }
51866
- case "DataBarRule":
51867
- return this.checkDataBarRangeValues(rule, cmd.ranges, cmd.sheetId);
51868
51840
  }
51869
51841
  return "Success" /* CommandResult.Success */;
51870
51842
  }
@@ -51984,18 +51956,6 @@ class ConditionalFormatPlugin extends CorePlugin {
51984
51956
  }
51985
51957
  return "Success" /* CommandResult.Success */;
51986
51958
  }
51987
- checkDataBarRangeValues(rule, ranges, sheetId) {
51988
- if (rule.rangeValues) {
51989
- const { numberOfCols, numberOfRows } = zoneToDimension(this.getters.getRangeFromSheetXC(sheetId, rule.rangeValues).zone);
51990
- for (const range of ranges) {
51991
- const dimensions = zoneToDimension(this.getters.getRangeFromRangeData(range).zone);
51992
- if (numberOfCols !== dimensions.numberOfCols || numberOfRows !== dimensions.numberOfRows) {
51993
- return "DataBarRangeValuesMismatch" /* CommandResult.DataBarRangeValuesMismatch */;
51994
- }
51995
- }
51996
- }
51997
- return "Success" /* CommandResult.Success */;
51998
- }
51999
51959
  removeConditionalFormatting(id, sheet) {
52000
51960
  const cfIndex = this.cfRules[sheet].findIndex((s) => s.id === id);
52001
51961
  if (cfIndex !== -1) {
@@ -54292,7 +54252,7 @@ class SheetPlugin extends CorePlugin {
54292
54252
  if (orderedSheetIds.find((id) => sheets[id]?.name.toLowerCase() === name && id !== cmd.sheetId)) {
54293
54253
  return "DuplicatedSheetName" /* CommandResult.DuplicatedSheetName */;
54294
54254
  }
54295
- if (FORBIDDEN_IN_EXCEL_REGEX.test(name)) {
54255
+ if (FORBIDDEN_SHEETNAME_CHARS_IN_EXCEL_REGEX.test(name)) {
54296
54256
  return "ForbiddenCharactersInSheetName" /* CommandResult.ForbiddenCharactersInSheetName */;
54297
54257
  }
54298
54258
  return "Success" /* CommandResult.Success */;
@@ -58376,8 +58336,12 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
58376
58336
  const zoneOfValues = rangeValues.zone;
58377
58337
  for (let row = zone.top; row <= zone.bottom; row++) {
58378
58338
  for (let col = zone.left; col <= zone.right; col++) {
58379
- const cell = this.getEvaluatedCellInZone(sheetId, zone, col, row, zoneOfValues);
58380
- if (cell.type !== CellValueType.number || cell.value <= 0) {
58339
+ const targetCol = col - zone.left + zoneOfValues.left;
58340
+ const targetRow = row - zone.top + zoneOfValues.top;
58341
+ const cell = this.getters.getEvaluatedCell({ sheetId, col: targetCol, row: targetRow });
58342
+ if (!isInside(targetCol, targetRow, zoneOfValues) ||
58343
+ cell.type !== CellValueType.number ||
58344
+ cell.value <= 0) {
58381
58345
  // values negatives or 0 are ignored
58382
58346
  continue;
58383
58347
  }
@@ -58390,11 +58354,6 @@ class EvaluationConditionalFormatPlugin extends UIPlugin {
58390
58354
  }
58391
58355
  }
58392
58356
  }
58393
- getEvaluatedCellInZone(sheetId, zone, col, row, targetZone) {
58394
- const targetCol = col - zone.left + targetZone.left;
58395
- const targetRow = row - zone.top + targetZone.top;
58396
- return this.getters.getEvaluatedCell({ sheetId, col: targetCol, row: targetRow });
58397
- }
58398
58357
  /** Compute the color scale for the given range and CF rule, and apply in in the given computedStyle object */
58399
58358
  applyColorScale(sheetId, range, rule, computedStyle) {
58400
58359
  const minValue = this.parsePoint(sheetId, range, rule.minimum, "min");
@@ -59696,11 +59655,13 @@ class PivotUIPlugin extends UIPlugin {
59696
59655
  return EMPTY_PIVOT_CELL;
59697
59656
  }
59698
59657
  if (functionName === "PIVOT") {
59699
- const includeTotal = args[2] === false ? false : undefined;
59700
- const includeColumnHeaders = args[3] === false ? false : undefined;
59658
+ const includeTotal = toScalar(args[2]);
59659
+ const shouldIncludeTotal = includeTotal === undefined ? true : toBoolean(includeTotal);
59660
+ const includeColumnHeaders = toScalar(args[3]);
59661
+ const shouldIncludeColumnHeaders = includeColumnHeaders === undefined ? true : toBoolean(includeColumnHeaders);
59701
59662
  const pivotCells = pivot
59702
59663
  .getTableStructure()
59703
- .getPivotCells(includeTotal, includeColumnHeaders);
59664
+ .getPivotCells(shouldIncludeTotal, shouldIncludeColumnHeaders);
59704
59665
  const pivotCol = position.col - mainPosition.col;
59705
59666
  const pivotRow = position.row - mainPosition.row;
59706
59667
  return pivotCells[pivotCol][pivotRow];
@@ -61856,7 +61817,7 @@ class InsertPivotPlugin extends UIPlugin {
61856
61817
  getPivotDuplicateSheetName(pivotName) {
61857
61818
  let i = 1;
61858
61819
  const names = this.getters.getSheetIds().map((id) => this.getters.getSheetName(id));
61859
- const sanitizedName = pivotName.replace(new RegExp(FORBIDDEN_IN_EXCEL_REGEX, "g"), " ");
61820
+ const sanitizedName = sanitizeSheetName(pivotName);
61860
61821
  let name = sanitizedName;
61861
61822
  while (names.includes(name)) {
61862
61823
  name = `${sanitizedName} (${i})`;
@@ -65936,7 +65897,7 @@ function interactiveRenameSheet(env, sheetId, name, errorCallback) {
65936
65897
  env.raiseError(_t("A sheet with the name %s already exists. Please select another name.", name), errorCallback);
65937
65898
  }
65938
65899
  else if (result.reasons.includes("ForbiddenCharactersInSheetName" /* CommandResult.ForbiddenCharactersInSheetName */)) {
65939
- env.raiseError(_t("Some used characters are not allowed in a sheet name (Forbidden characters are %s).", FORBIDDEN_SHEET_CHARS.join(" ")), errorCallback);
65900
+ env.raiseError(_t("Some used characters are not allowed in a sheet name (Forbidden characters are %s).", FORBIDDEN_SHEETNAME_CHARS.join(" ")), errorCallback);
65940
65901
  }
65941
65902
  }
65942
65903
 
@@ -67166,7 +67127,7 @@ class ActionButton extends owl.Component {
67166
67127
  setup() {
67167
67128
  owl.onWillUpdateProps((nextProps) => {
67168
67129
  if (nextProps.action !== this.props.action) {
67169
- this.actionButton = createAction(this.props.action);
67130
+ this.actionButton = createAction(nextProps.action);
67170
67131
  }
67171
67132
  });
67172
67133
  }
@@ -69345,9 +69306,6 @@ class SelectionStreamProcessorImpl {
69345
69306
  getBackToDefault() {
69346
69307
  this.stream.getBackToDefault();
69347
69308
  }
69348
- getAnchor() {
69349
- return this.anchor;
69350
- }
69351
69309
  modifyAnchor(anchor, mode, options) {
69352
69310
  const sheetId = this.getters.getActiveSheetId();
69353
69311
  anchor = {
@@ -72435,6 +72393,7 @@ const helpers = {
72435
72393
  areDomainArgsFieldsValid,
72436
72394
  splitReference,
72437
72395
  formatTickValue,
72396
+ sanitizeSheetName,
72438
72397
  };
72439
72398
  const links = {
72440
72399
  isMarkdownLink,
@@ -72570,6 +72529,6 @@ exports.tokenColors = tokenColors;
72570
72529
  exports.tokenize = tokenize;
72571
72530
 
72572
72531
 
72573
- __info__.version = "18.0.5";
72574
- __info__.date = "2024-11-22T14:19:19.721Z";
72575
- __info__.hash = "9eb34d9";
72532
+ __info__.version = "18.0.7";
72533
+ __info__.date = "2024-12-05T10:41:39.380Z";
72534
+ __info__.hash = "a2652c5";
@@ -1306,7 +1306,6 @@ type StatefulStream<Event, State> = {
1306
1306
  * Allows to select cells in the grid and update the selection
1307
1307
  */
1308
1308
  interface SelectionProcessor {
1309
- getAnchor(): Immutable<AnchorZone>;
1310
1309
  selectZone(anchor: AnchorZone, options?: SelectionEventOptions): DispatchResult;
1311
1310
  selectCell(col: number, row: number): DispatchResult;
1312
1311
  moveAnchorCell(direction: Direction$1, step: SelectionStep): DispatchResult;
@@ -2670,8 +2669,7 @@ declare const enum CommandResult {
2670
2669
  EmptyName = "EmptyName",
2671
2670
  ValueCellIsInvalidFormula = "ValueCellIsInvalidFormula",
2672
2671
  InvalidDefinition = "InvalidDefinition",
2673
- InvalidColor = "InvalidColor",
2674
- DataBarRangeValuesMismatch = "DataBarRangeValuesMismatch"
2672
+ InvalidColor = "InvalidColor"
2675
2673
  }
2676
2674
  interface CommandHandler<T> {
2677
2675
  allowDispatch(command: T): CommandResult | CommandResult[];
@@ -3921,7 +3919,6 @@ declare class ConditionalFormatPlugin extends CorePlugin<ConditionalFormatState>
3921
3919
  private checkMidBiggerThanMax;
3922
3920
  private checkMinBiggerThanMid;
3923
3921
  private checkCFValues;
3924
- private checkDataBarRangeValues;
3925
3922
  private removeConditionalFormatting;
3926
3923
  private changeCFPriority;
3927
3924
  }
@@ -4628,7 +4625,6 @@ declare class EvaluationConditionalFormatPlugin extends UIPlugin {
4628
4625
  private applyIcon;
4629
4626
  private computeIcon;
4630
4627
  private applyDataBar;
4631
- private getEvaluatedCellInZone;
4632
4628
  /** Compute the color scale for the given range and CF rule, and apply in in the given computedStyle object */
4633
4629
  private applyColorScale;
4634
4630
  private computeColorDiffUnits;
@@ -5709,6 +5705,8 @@ declare function createCurrencyFormat(currency: Partial<Currency>): Format;
5709
5705
  */
5710
5706
  declare function deepCopy<T>(obj: T): T;
5711
5707
  declare function unquote(string: string, quoteChar?: "'" | '"'): string;
5708
+ /** Replace the excel-excluded characters of a sheetName */
5709
+ declare function sanitizeSheetName(sheetName: string, replacementChar?: string): string;
5712
5710
  declare function isMarkdownLink(str: string): boolean;
5713
5711
  /**
5714
5712
  * Build a markdown link from a label and an url
@@ -12088,6 +12086,7 @@ declare const helpers: {
12088
12086
  areDomainArgsFieldsValid: typeof areDomainArgsFieldsValid;
12089
12087
  splitReference: typeof splitReference;
12090
12088
  formatTickValue: typeof formatTickValue;
12089
+ sanitizeSheetName: typeof sanitizeSheetName;
12091
12090
  };
12092
12091
  declare const links: {
12093
12092
  isMarkdownLink: typeof isMarkdownLink;