@odoo/o-spreadsheet 17.1.16 → 17.1.18

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 17.1.16
6
- * @date 2024-05-24T11:27:23.083Z
7
- * @hash 3a41c3a
5
+ * @version 17.1.18
6
+ * @date 2024-06-10T09:34:55.045Z
7
+ * @hash 0e756ce
8
8
  */
9
9
 
10
10
  'use strict';
@@ -295,7 +295,10 @@ function deepCopy(obj) {
295
295
  * Check if the object is a plain old javascript object.
296
296
  */
297
297
  function isPlainObject(obj) {
298
- return typeof obj === "object" && obj?.constructor === Object;
298
+ return (typeof obj === "object" &&
299
+ obj !== null &&
300
+ // obj.constructor can be undefined when there's no prototype (`Object.create(null, {})`)
301
+ (obj?.constructor === Object || obj?.constructor === undefined));
299
302
  }
300
303
  /**
301
304
  * Sanitize the name of a sheet, by eventually removing quotes
@@ -2607,7 +2610,7 @@ function evaluatePredicate(value, criterion) {
2607
2610
  return false;
2608
2611
  }
2609
2612
  if (typeof operand === "number" && operator === "=") {
2610
- return toString(value) === toString(operand);
2613
+ return value.toString() === operand.toString();
2611
2614
  }
2612
2615
  if (operator === "<>" || operator === "=") {
2613
2616
  let result;
@@ -2667,14 +2670,13 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
2667
2670
  if (countArg % 2 === 1) {
2668
2671
  throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range and criterion to be in pairs."));
2669
2672
  }
2670
- const dimRow = args[0].length;
2671
- const dimCol = args[0][0].length;
2673
+ const firstArg = toMatrix(args[0]);
2674
+ const dimRow = firstArg.length;
2675
+ const dimCol = firstArg[0].length;
2672
2676
  let predicates = [];
2673
2677
  for (let i = 0; i < countArg - 1; i += 2) {
2674
- const criteriaRange = args[i];
2675
- if (!isMatrix(criteriaRange) ||
2676
- criteriaRange.length !== dimRow ||
2677
- criteriaRange[0].length !== dimCol) {
2678
+ const criteriaRange = toMatrix(args[i]);
2679
+ if (criteriaRange.length !== dimRow || criteriaRange[0].length !== dimCol) {
2678
2680
  throw new EvaluationError(_t("Function [[FUNCTION_NAME]] expects criteria_range to have the same dimension"));
2679
2681
  }
2680
2682
  const description = toString(args[i + 1]);
@@ -2684,7 +2686,7 @@ function visitMatchingRanges(args, cb, locale, isQuery = false) {
2684
2686
  for (let j = 0; j < dimCol; j++) {
2685
2687
  let validatedPredicates = true;
2686
2688
  for (let k = 0; k < countArg - 1; k += 2) {
2687
- const criteriaValue = args[k][i][j].value;
2689
+ const criteriaValue = toMatrix(args[k])[i][j].value;
2688
2690
  const criterion = predicates[k / 2];
2689
2691
  validatedPredicates = evaluatePredicate(criteriaValue ?? undefined, criterion);
2690
2692
  if (!validatedPredicates) {
@@ -4372,8 +4374,11 @@ function copyRangeWithNewSheetId(sheetIdFrom, sheetIdTo, range) {
4372
4374
  /**
4373
4375
  * Create a range from a xc. If the xc is empty, this function returns undefined.
4374
4376
  */
4375
- function createRange(getters, sheetId, range) {
4376
- return range ? getters.getRangeFromSheetXC(sheetId, range) : undefined;
4377
+ function createValidRange(getters, sheetId, xc) {
4378
+ if (!xc)
4379
+ return;
4380
+ const range = getters.getRangeFromSheetXC(sheetId, xc);
4381
+ return !(range.invalidSheetName || range.invalidXc) ? range : undefined;
4377
4382
  }
4378
4383
  /**
4379
4384
  * Spread multiple colrows zone to one row/col zone and add a many new input range as needed.
@@ -5304,8 +5309,8 @@ let ScorecardChart$1 = class ScorecardChart extends AbstractChart {
5304
5309
  type = "scorecard";
5305
5310
  constructor(definition, sheetId, getters) {
5306
5311
  super(definition, sheetId, getters);
5307
- this.keyValue = createRange(getters, sheetId, definition.keyValue);
5308
- this.baseline = createRange(getters, sheetId, definition.baseline);
5312
+ this.keyValue = createValidRange(getters, sheetId, definition.keyValue);
5313
+ this.baseline = createValidRange(getters, sheetId, definition.baseline);
5309
5314
  this.baselineMode = definition.baselineMode;
5310
5315
  this.baselineDescr = definition.baselineDescr;
5311
5316
  this.background = definition.background;
@@ -6839,8 +6844,7 @@ function isCtrlKey(ev) {
6839
6844
  */
6840
6845
  function useSpreadsheetRect() {
6841
6846
  const position = owl.useState({ x: 0, y: 0, width: 0, height: 0 });
6842
- let spreadsheetElement = document.querySelector(".o-spreadsheet");
6843
- updatePosition();
6847
+ let spreadsheetElement = null;
6844
6848
  function updatePosition() {
6845
6849
  if (!spreadsheetElement) {
6846
6850
  spreadsheetElement = document.querySelector(".o-spreadsheet");
@@ -8604,7 +8608,7 @@ function chartToImage(runtime, figure, type) {
8604
8608
  if ("chartJsConfig" in runtime) {
8605
8609
  runtime.chartJsConfig.plugins = [backgroundColorChartJSPlugin];
8606
8610
  // @ts-ignore
8607
- const chart = new window.Chart(canvas, runtime.chartJsConfig);
8611
+ const chart = new window.Chart(canvas, deepCopy(runtime.chartJsConfig));
8608
8612
  const imgContent = chart.toBase64Image();
8609
8613
  chart.destroy();
8610
8614
  div.remove();
@@ -8648,7 +8652,7 @@ class BarChart extends AbstractChart {
8648
8652
  constructor(definition, sheetId, getters) {
8649
8653
  super(definition, sheetId, getters);
8650
8654
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
8651
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
8655
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
8652
8656
  this.background = definition.background;
8653
8657
  this.verticalAxisPosition = definition.verticalAxisPosition;
8654
8658
  this.legendPosition = definition.legendPosition;
@@ -8891,7 +8895,7 @@ class GaugeChart extends AbstractChart {
8891
8895
  type = "gauge";
8892
8896
  constructor(definition, sheetId, getters) {
8893
8897
  super(definition, sheetId, getters);
8894
- this.dataRange = createRange(this.getters, this.sheetId, definition.dataRange);
8898
+ this.dataRange = createValidRange(this.getters, this.sheetId, definition.dataRange);
8895
8899
  this.sectionRule = definition.sectionRule;
8896
8900
  this.background = definition.background;
8897
8901
  }
@@ -9225,7 +9229,7 @@ class LineChart extends AbstractChart {
9225
9229
  constructor(definition, sheetId, getters) {
9226
9230
  super(definition, sheetId, getters);
9227
9231
  this.dataSets = createDataSets(this.getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
9228
- this.labelRange = createRange(this.getters, sheetId, definition.labelRange);
9232
+ this.labelRange = createValidRange(this.getters, sheetId, definition.labelRange);
9229
9233
  this.background = definition.background;
9230
9234
  this.verticalAxisPosition = definition.verticalAxisPosition;
9231
9235
  this.legendPosition = definition.legendPosition;
@@ -9545,7 +9549,7 @@ class PieChart extends AbstractChart {
9545
9549
  constructor(definition, sheetId, getters) {
9546
9550
  super(definition, sheetId, getters);
9547
9551
  this.dataSets = createDataSets(getters, definition.dataSets, sheetId, definition.dataSetsHaveTitle);
9548
- this.labelRange = createRange(getters, sheetId, definition.labelRange);
9552
+ this.labelRange = createValidRange(getters, sheetId, definition.labelRange);
9549
9553
  this.background = definition.background;
9550
9554
  this.legendPosition = definition.legendPosition;
9551
9555
  this.aggregated = definition.aggregated;
@@ -11189,6 +11193,9 @@ function makeArg(str, description) {
11189
11193
  if (types.some((t) => t.startsWith("RANGE"))) {
11190
11194
  result.acceptMatrix = true;
11191
11195
  }
11196
+ if (types.every((t) => t.startsWith("RANGE"))) {
11197
+ result.acceptMatrixOnly = true;
11198
+ }
11192
11199
  return result;
11193
11200
  }
11194
11201
  /**
@@ -11470,11 +11477,16 @@ const CHOOSECOLS = {
11470
11477
  compute: function (array, ...columns) {
11471
11478
  const _array = toMatrix(array);
11472
11479
  const _columns = flattenRowFirst(columns, (item) => toInteger(item?.value, this.locale));
11473
- assert(() => _columns.every((col) => col > 0 && col <= _array.length), _t("The columns arguments must be between 1 and %s (got %s).", _array.length.toString(), (_columns.find((col) => col <= 0 || col > _array.length) || 0).toString()));
11480
+ const argOutOfRange = _columns.filter((col) => col === 0 || _array.length < Math.abs(col));
11481
+ assert(() => argOutOfRange.length === 0, _t("The columns arguments must be between -%s and %s (got %s), excluding 0.", _array.length.toString(), _array.length.toString(), argOutOfRange.join(",")));
11474
11482
  const result = Array(_columns.length);
11475
11483
  for (let col = 0; col < _columns.length; col++) {
11476
- const colIndex = _columns[col] - 1; // -1 because columns arguments are 1-indexed
11477
- result[col] = _array[colIndex];
11484
+ if (_columns[col] > 0) {
11485
+ result[col] = _array[_columns[col] - 1]; // -1 because columns arguments are 1-indexed
11486
+ }
11487
+ else {
11488
+ result[col] = _array[_array.length + _columns[col]];
11489
+ }
11478
11490
  }
11479
11491
  return result;
11480
11492
  },
@@ -11495,8 +11507,14 @@ const CHOOSEROWS = {
11495
11507
  const _array = toMatrix(array);
11496
11508
  const _rows = flattenRowFirst(rows, (item) => toInteger(item?.value, this.locale));
11497
11509
  const _nbColumns = _array.length;
11498
- assert(() => _rows.every((row) => row > 0 && row <= _array[0].length), _t("The rows arguments must be between 1 and %s (got %s).", _array[0].length.toString(), (_rows.find((row) => row <= 0 || row > _array[0].length) || 0).toString()));
11499
- return generateMatrix(_nbColumns, _rows.length, (col, row) => _array[col][_rows[row] - 1]); // -1 because rows arguments are 1-indexed
11510
+ const argOutOfRange = _rows.filter((row) => row === 0 || _array[0].length < Math.abs(row));
11511
+ assert(() => argOutOfRange.length === 0, _t("The rows arguments must be between -%s and %s (got %s), excluding 0.", _array[0].length.toString(), _array[0].length.toString(), argOutOfRange.join(",")));
11512
+ return generateMatrix(_nbColumns, _rows.length, (col, row) => {
11513
+ if (_rows[row] > 0) {
11514
+ return _array[col][_rows[row] - 1]; // -1 because columns arguments are 1-indexed
11515
+ }
11516
+ return _array[col][_array[col].length + _rows[row]];
11517
+ });
11500
11518
  },
11501
11519
  isExported: true,
11502
11520
  };
@@ -12404,7 +12422,7 @@ const COUNTUNIQUEIFS = {
12404
12422
  compute: function (range, ...args) {
12405
12423
  let uniqueValues = new Set();
12406
12424
  visitMatchingRanges(args, (i, j) => {
12407
- const data = range[i][j];
12425
+ const data = range[i]?.[j];
12408
12426
  if (isDefined(data)) {
12409
12427
  uniqueValues.add(data.value);
12410
12428
  }
@@ -13034,7 +13052,7 @@ const SUMIF = {
13034
13052
  }
13035
13053
  let sum = 0;
13036
13054
  visitMatchingRanges([criteriaRange, criterion], (i, j) => {
13037
- const value = sumRange[i][j].value;
13055
+ const value = sumRange[i]?.[j]?.value;
13038
13056
  if (typeof value === "number") {
13039
13057
  sum += value;
13040
13058
  }
@@ -13059,7 +13077,7 @@ const SUMIFS = {
13059
13077
  compute: function (sumRange, ...criters) {
13060
13078
  let sum = 0;
13061
13079
  visitMatchingRanges(criters, (i, j) => {
13062
- const value = sumRange[i][j].value;
13080
+ const value = sumRange[i]?.[j]?.value;
13063
13081
  if (typeof value === "number") {
13064
13082
  sum += value;
13065
13083
  }
@@ -13606,7 +13624,7 @@ const AVERAGEIF = {
13606
13624
  let count = 0;
13607
13625
  let sum = 0;
13608
13626
  visitMatchingRanges([criteriaRange, criterion], (i, j) => {
13609
- const value = _averageRange[i][j].value;
13627
+ const value = _averageRange[i]?.[j]?.value;
13610
13628
  if (typeof value === "number") {
13611
13629
  count += 1;
13612
13630
  sum += value;
@@ -13635,7 +13653,7 @@ const AVERAGEIFS = {
13635
13653
  let count = 0;
13636
13654
  let sum = 0;
13637
13655
  visitMatchingRanges(args, (i, j) => {
13638
- const value = _averageRange[i][j].value;
13656
+ const value = _averageRange[i]?.[j]?.value;
13639
13657
  if (typeof value === "number") {
13640
13658
  count += 1;
13641
13659
  sum += value;
@@ -13940,7 +13958,7 @@ const MAXIFS = {
13940
13958
  compute: function (range, ...args) {
13941
13959
  let result = -Infinity;
13942
13960
  visitMatchingRanges(args, (i, j) => {
13943
- const value = range[i][j].value;
13961
+ const value = range[i]?.[j]?.value;
13944
13962
  if (typeof value === "number") {
13945
13963
  result = result < value ? value : result;
13946
13964
  }
@@ -14023,7 +14041,7 @@ const MINIFS = {
14023
14041
  compute: function (range, ...args) {
14024
14042
  let result = Infinity;
14025
14043
  visitMatchingRanges(args, (i, j) => {
14026
- const value = range[i][j].value;
14044
+ const value = range[i]?.[j]?.value;
14027
14045
  if (typeof value === "number") {
14028
14046
  result = result > value ? value : result;
14029
14047
  }
@@ -19800,6 +19818,9 @@ function addInputHandling(descr) {
19800
19818
  }
19801
19819
  args[i] = arg[0][0];
19802
19820
  }
19821
+ if (!isMatrix(arg) && argDefinition.acceptMatrixOnly) {
19822
+ throw new BadExpressionError(_t("Function [[FUNCTION_NAME]] expects the parameter '%s' to be reference to a cell or range.", (i + 1).toString()));
19823
+ }
19803
19824
  }
19804
19825
  return descr.compute.apply(this, args);
19805
19826
  }
@@ -22152,7 +22173,7 @@ class LineBarPieConfigPanel extends owl.Component {
22152
22173
  }
22153
22174
  const getters = this.env.model.getters;
22154
22175
  const sheetId = getters.getActiveSheetId();
22155
- const labelRange = createRange(getters, sheetId, this.labelRange);
22176
+ const labelRange = createValidRange(getters, sheetId, this.labelRange);
22156
22177
  const dataSets = createDataSets(getters, this.dataSeriesRanges, sheetId, this.props.definition.dataSetsHaveTitle);
22157
22178
  if (dataSets.length) {
22158
22179
  return dataSets[0].dataRange.zone.top + 1;
@@ -26275,14 +26296,14 @@ class FigureComponent extends owl.Component {
26275
26296
  }
26276
26297
  onKeyDown(ev) {
26277
26298
  const figure = this.props.figure;
26278
- switch (ev.key) {
26299
+ const keyDownShortcut = keyboardEventToShortcutString(ev);
26300
+ switch (keyDownShortcut) {
26279
26301
  case "Delete":
26280
26302
  this.env.model.dispatch("DELETE_FIGURE", {
26281
26303
  sheetId: this.env.model.getters.getActiveSheetId(),
26282
26304
  id: figure.id,
26283
26305
  });
26284
26306
  this.props.onFigureDeleted();
26285
- ev.stopPropagation();
26286
26307
  ev.preventDefault();
26287
26308
  ev.stopPropagation();
26288
26309
  break;
@@ -26303,7 +26324,22 @@ class FigureComponent extends owl.Component {
26303
26324
  x: figure.x + delta[0],
26304
26325
  y: figure.y + delta[1],
26305
26326
  });
26327
+ ev.preventDefault();
26306
26328
  ev.stopPropagation();
26329
+ break;
26330
+ case "Ctrl+A":
26331
+ // Maybe in the future we will implement a way to select all figures
26332
+ ev.preventDefault();
26333
+ ev.stopPropagation();
26334
+ break;
26335
+ case "Ctrl+Y":
26336
+ case "Ctrl+Z":
26337
+ if (keyDownShortcut === "Ctrl+Y") {
26338
+ this.env.model.dispatch("REQUEST_REDO");
26339
+ }
26340
+ else if (keyDownShortcut === "Ctrl+Z") {
26341
+ this.env.model.dispatch("REQUEST_UNDO");
26342
+ }
26307
26343
  ev.preventDefault();
26308
26344
  ev.stopPropagation();
26309
26345
  break;
@@ -27341,8 +27377,15 @@ class Composer extends owl.Component {
27341
27377
  }
27342
27378
  onPaste(ev) {
27343
27379
  if (this.env.model.getters.getEditionMode() !== "inactive") {
27380
+ // let the browser clipboard work
27344
27381
  ev.stopPropagation();
27345
27382
  }
27383
+ else {
27384
+ // the user meant to paste in the sheet, not open the composer with the pasted content
27385
+ // While we're not editing, we still have the focus and should therefore prevent
27386
+ // the native "paste" to occur.
27387
+ ev.preventDefault();
27388
+ }
27346
27389
  }
27347
27390
  /*
27348
27391
  * Triggered automatically by the content-editable between the keydown and key up
@@ -27351,10 +27394,6 @@ class Composer extends owl.Component {
27351
27394
  if (!this.shouldProcessInputEvents) {
27352
27395
  return;
27353
27396
  }
27354
- if (ev.inputType === "insertFromPaste" &&
27355
- this.env.model.getters.getEditionMode() === "inactive") {
27356
- return;
27357
- }
27358
27397
  ev.stopPropagation();
27359
27398
  let content;
27360
27399
  if (this.env.model.getters.getEditionMode() === "inactive") {
@@ -27795,10 +27834,7 @@ class GridComposer extends owl.Component {
27795
27834
  }
27796
27835
  get containerStyle() {
27797
27836
  if (this.env.model.getters.getEditionMode() === "inactive" || !this.rect) {
27798
- return `
27799
- position: absolute;
27800
- z-index: -1000;
27801
- `;
27837
+ return `z-index: -1000;`;
27802
27838
  }
27803
27839
  const isFormula = this.env.model.getters.getCurrentContent().startsWith("=");
27804
27840
  const cell = this.env.model.getters.getActiveCell();
@@ -35764,12 +35800,6 @@ function compileTokens(tokens) {
35764
35800
  // detect when an argument need to be evaluated as a meta argument
35765
35801
  const isMeta = argTypes.includes("META");
35766
35802
  const hasRange = argTypes.some((t) => isRangeType(t));
35767
- const isRangeOnly = argTypes.every((t) => isRangeType(t));
35768
- if (isRangeOnly) {
35769
- if (!isRangeInput(currentArg)) {
35770
- throw new BadExpressionError(_t("Function %s expects the parameter %s to be reference to a cell or range, not a %s.", functionName, (i + 1).toString(), currentArg.type.toLowerCase()));
35771
- }
35772
- }
35773
35803
  compiledArgs.push(compileAST(currentArg, isMeta, hasRange, {
35774
35804
  functionName,
35775
35805
  paramIndex: i + 1,
@@ -35940,16 +35970,6 @@ function assertEnoughArgs(ast) {
35940
35970
  function isRangeType(type) {
35941
35971
  return type.startsWith("RANGE");
35942
35972
  }
35943
- function isRangeInput(arg) {
35944
- if (arg.type === "REFERENCE") {
35945
- return true;
35946
- }
35947
- if (arg.type === "FUNCALL") {
35948
- const fnDef = functions$1[arg.value.toUpperCase()];
35949
- return fnDef && isRangeType(fnDef.returns[0]);
35950
- }
35951
- return false;
35952
- }
35953
35973
 
35954
35974
  /**
35955
35975
  * Add the following information on tokens:
@@ -39062,6 +39082,9 @@ class RangeAdapter {
39062
39082
  if (range.invalidXc) {
39063
39083
  return range.invalidXc;
39064
39084
  }
39085
+ if (!this.getters.tryGetSheet(range.sheetId)) {
39086
+ return CellErrorType.InvalidReference;
39087
+ }
39065
39088
  if (range.zone.bottom - range.zone.top < 0 || range.zone.right - range.zone.left < 0) {
39066
39089
  return CellErrorType.InvalidReference;
39067
39090
  }
@@ -42509,16 +42532,22 @@ class EvaluationPlugin extends UIPlugin {
42509
42532
  let newContent = undefined;
42510
42533
  let newFormat = undefined;
42511
42534
  let isExported = true;
42535
+ const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
42512
42536
  const formulaCell = this.getCorrespondingFormulaCell(position);
42513
42537
  if (formulaCell) {
42514
42538
  isExported = isExportableToExcel(formulaCell.compiledFormula.tokens);
42515
42539
  isFormula = isExported;
42516
42540
  if (!isExported) {
42517
- newContent = value.toString();
42518
- newFormat = evaluatedCell.format;
42541
+ // If the cell contains a non-exported formula and that is evaluates to
42542
+ // nothing* ,we don't export it.
42543
+ // * non-falsy value are relevant and so are 0 and FALSE, which only leaves
42544
+ // the empty string.
42545
+ if (value !== "") {
42546
+ newContent = value.toString();
42547
+ newFormat = evaluatedCell.format;
42548
+ }
42519
42549
  }
42520
42550
  }
42521
- const exportedSheetData = data.sheets.find((sheet) => sheet.id === position.sheetId);
42522
42551
  const exportedCellData = exportedSheetData.cells[xc] || {};
42523
42552
  const format = newFormat
42524
42553
  ? getItemId(newFormat, data.formats)
@@ -52015,9 +52044,11 @@ class BottomBarSheet extends owl.Component {
52015
52044
  if (ev.key === "Enter") {
52016
52045
  ev.preventDefault();
52017
52046
  this.stopEdition();
52047
+ this.env.focusableElement.focus();
52018
52048
  }
52019
52049
  if (ev.key === "Escape") {
52020
52050
  this.cancelEdition();
52051
+ this.env.focusableElement.focus();
52021
52052
  }
52022
52053
  }
52023
52054
  onClickSheetName(ev) {
@@ -56712,7 +56743,11 @@ function addRows(construct, data, sheet) {
56712
56743
  let cellNode = escapeXml ``;
56713
56744
  // Either formula or static value inside the cell
56714
56745
  if (cell.isFormula) {
56715
- ({ attrs: additionalAttrs, node: cellNode } = addFormula(cell));
56746
+ const res = addFormula(cell);
56747
+ if (!res) {
56748
+ continue;
56749
+ }
56750
+ ({ attrs: additionalAttrs, node: cellNode } = res);
56716
56751
  }
56717
56752
  else if (cell.content && isMarkdownLink(cell.content)) {
56718
56753
  const { label } = parseMarkdownLink(cell.content);
@@ -57742,6 +57777,6 @@ exports.setTranslationMethod = setTranslationMethod;
57742
57777
  exports.tokenize = tokenize;
57743
57778
 
57744
57779
 
57745
- __info__.version = "17.1.16";
57746
- __info__.date = "2024-05-24T11:27:23.083Z";
57747
- __info__.hash = "3a41c3a";
57780
+ __info__.version = "17.1.18";
57781
+ __info__.date = "2024-06-10T09:34:55.045Z";
57782
+ __info__.hash = "0e756ce";
@@ -5200,6 +5200,7 @@ type Getters = {
5200
5200
  type ArgType = "ANY" | "BOOLEAN" | "NUMBER" | "STRING" | "DATE" | "RANGE" | "RANGE<BOOLEAN>" | "RANGE<NUMBER>" | "RANGE<DATE>" | "RANGE<STRING>" | "RANGE<ANY>" | "META";
5201
5201
  interface ArgDefinition {
5202
5202
  acceptMatrix?: boolean;
5203
+ acceptMatrixOnly?: boolean;
5203
5204
  repeating?: boolean;
5204
5205
  optional?: boolean;
5205
5206
  description: string;