hyperformula-dc
Version:
HyperFormula is a JavaScript engine for efficient processing of spreadsheet-like data and formulas
1,276 lines (1,111 loc) • 53 kB
JavaScript
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
import "core-js/modules/es.array.map.js";
import "core-js/modules/es.number.constructor.js";
import "core-js/modules/es.array.iterator.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/web.dom-collections.iterator.js";
import "core-js/modules/es.array.concat.js";
import "core-js/modules/es.object.assign.js";
import "core-js/modules/es.array.filter.js";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.array.sort.js";
import "core-js/modules/es.array.reduce.js";
import "core-js/modules/es.number.is-integer.js";
import "core-js/modules/es.array.slice.js";
import "core-js/modules/es.array.from.js";
import "core-js/modules/es.string.iterator.js";
import "core-js/modules/es.symbol.js";
import "core-js/modules/es.symbol.description.js";
import "core-js/modules/es.symbol.iterator.js";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
/**
* @license
* Copyright (c) 2021 Handsoncode. All rights reserved.
*/
import { AbsoluteCellRange } from './AbsoluteCellRange';
import { absolutizeDependencies, filterDependenciesOutOfScope } from './absolutizeDependencies';
import { ArraySize } from './ArraySize';
import { equalSimpleCellAddress, invalidSimpleCellAddress, simpleCellAddress } from './Cell';
import { CellContent } from './CellContentParser';
import { ClipboardCellType } from './ClipboardOperations';
import { ContentChanges } from './ContentChanges';
import { ArrayVertex, EmptyCellVertex, FormulaCellVertex, ParsingErrorVertex, SparseStrategy, ValueCellVertex } from './DependencyGraph';
import { FormulaVertex } from './DependencyGraph/FormulaCellVertex';
import { AddColumnsTransformer } from './dependencyTransformers/AddColumnsTransformer';
import { AddRowsTransformer } from './dependencyTransformers/AddRowsTransformer';
import { CleanOutOfScopeDependenciesTransformer } from './dependencyTransformers/CleanOutOfScopeDependenciesTransformer';
import { MoveCellsTransformer } from './dependencyTransformers/MoveCellsTransformer';
import { RemoveColumnsTransformer } from './dependencyTransformers/RemoveColumnsTransformer';
import { RemoveRowsTransformer } from './dependencyTransformers/RemoveRowsTransformer';
import { RemoveSheetTransformer } from './dependencyTransformers/RemoveSheetTransformer';
import { InvalidArgumentsError, NamedExpressionDoesNotExistError, NoRelativeAddressesAllowedError, SheetSizeLimitExceededError, SourceLocationHasArrayError, TargetLocationHasArrayError } from './errors';
import { EmptyValue, getRawValue } from './interpreter/InterpreterValue';
import { doesContainRelativeReferences } from './NamedExpressions';
import { NamedExpressionDependency } from './parser';
import { findBoundaries } from './Sheet';
import { ColumnsSpan, RowsSpan } from './Span';
import { StatType } from './statistics';
export var RemoveRowsCommand = /*#__PURE__*/function () {
function RemoveRowsCommand(sheet, indexes) {
_classCallCheck(this, RemoveRowsCommand);
this.sheet = sheet;
this.indexes = indexes;
}
_createClass(RemoveRowsCommand, [{
key: "normalizedIndexes",
value: function normalizedIndexes() {
return normalizeRemovedIndexes(this.indexes);
}
}, {
key: "rowsSpans",
value: function rowsSpans() {
var _this = this;
return this.normalizedIndexes().map(function (normalizedIndex) {
return RowsSpan.fromNumberOfRows(_this.sheet, normalizedIndex[0], normalizedIndex[1]);
});
}
}]);
return RemoveRowsCommand;
}();
export var AddRowsCommand = /*#__PURE__*/function () {
function AddRowsCommand(sheet, indexes) {
_classCallCheck(this, AddRowsCommand);
this.sheet = sheet;
this.indexes = indexes;
}
_createClass(AddRowsCommand, [{
key: "normalizedIndexes",
value: function normalizedIndexes() {
return normalizeAddedIndexes(this.indexes);
}
}, {
key: "rowsSpans",
value: function rowsSpans() {
var _this2 = this;
return this.normalizedIndexes().map(function (normalizedIndex) {
return RowsSpan.fromNumberOfRows(_this2.sheet, normalizedIndex[0], normalizedIndex[1]);
});
}
}]);
return AddRowsCommand;
}();
export var AddColumnsCommand = /*#__PURE__*/function () {
function AddColumnsCommand(sheet, indexes) {
_classCallCheck(this, AddColumnsCommand);
this.sheet = sheet;
this.indexes = indexes;
}
_createClass(AddColumnsCommand, [{
key: "normalizedIndexes",
value: function normalizedIndexes() {
return normalizeAddedIndexes(this.indexes);
}
}, {
key: "columnsSpans",
value: function columnsSpans() {
var _this3 = this;
return this.normalizedIndexes().map(function (normalizedIndex) {
return ColumnsSpan.fromNumberOfColumns(_this3.sheet, normalizedIndex[0], normalizedIndex[1]);
});
}
}]);
return AddColumnsCommand;
}();
export var RemoveColumnsCommand = /*#__PURE__*/function () {
function RemoveColumnsCommand(sheet, indexes) {
_classCallCheck(this, RemoveColumnsCommand);
this.sheet = sheet;
this.indexes = indexes;
}
_createClass(RemoveColumnsCommand, [{
key: "normalizedIndexes",
value: function normalizedIndexes() {
return normalizeRemovedIndexes(this.indexes);
}
}, {
key: "columnsSpans",
value: function columnsSpans() {
var _this4 = this;
return this.normalizedIndexes().map(function (normalizedIndex) {
return ColumnsSpan.fromNumberOfColumns(_this4.sheet, normalizedIndex[0], normalizedIndex[1]);
});
}
}]);
return RemoveColumnsCommand;
}();
export var Operations = /*#__PURE__*/function () {
function Operations(config, dependencyGraph, columnSearch, cellContentParser, parser, stats, lazilyTransformingAstService, namedExpressions, arraySizePredictor) {
_classCallCheck(this, Operations);
this.dependencyGraph = dependencyGraph;
this.columnSearch = columnSearch;
this.cellContentParser = cellContentParser;
this.parser = parser;
this.stats = stats;
this.lazilyTransformingAstService = lazilyTransformingAstService;
this.namedExpressions = namedExpressions;
this.arraySizePredictor = arraySizePredictor;
this.changes = ContentChanges.empty();
this.allocateNamedExpressionAddressSpace();
this.maxColumns = config.maxColumns;
this.maxRows = config.maxRows;
}
_createClass(Operations, [{
key: "removeRows",
value: function removeRows(cmd) {
var rowsRemovals = [];
var _iterator = _createForOfIteratorHelper(cmd.rowsSpans()),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var rowsToRemove = _step.value;
var rowsRemoval = this.doRemoveRows(rowsToRemove);
if (rowsRemoval) {
rowsRemovals.push(rowsRemoval);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return rowsRemovals;
}
}, {
key: "addRows",
value: function addRows(cmd) {
var _iterator2 = _createForOfIteratorHelper(cmd.rowsSpans()),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var addedRows = _step2.value;
this.doAddRows(addedRows);
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
}
}, {
key: "addColumns",
value: function addColumns(cmd) {
var _iterator3 = _createForOfIteratorHelper(cmd.columnsSpans()),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var addedColumns = _step3.value;
this.doAddColumns(addedColumns);
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
}
}, {
key: "removeColumns",
value: function removeColumns(cmd) {
var columnsRemovals = [];
var _iterator4 = _createForOfIteratorHelper(cmd.columnsSpans()),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var columnsToRemove = _step4.value;
var columnsRemoval = this.doRemoveColumns(columnsToRemove);
if (columnsRemoval) {
columnsRemovals.push(columnsRemoval);
}
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
return columnsRemovals;
}
}, {
key: "removeSheet",
value: function removeSheet(sheetId) {
var _this5 = this;
this.dependencyGraph.removeSheet(sheetId);
var version;
this.stats.measure(StatType.TRANSFORM_ASTS, function () {
var transformation = new RemoveSheetTransformer(sheetId);
transformation.performEagerTransformations(_this5.dependencyGraph, _this5.parser);
version = _this5.lazilyTransformingAstService.addTransformation(transformation);
});
this.sheetMapping.removeSheet(sheetId);
this.columnSearch.removeSheet(sheetId);
var scopedNamedExpressions = this.namedExpressions.getAllNamedExpressionsForScope(sheetId).map(function (namedexpression) {
return _this5.removeNamedExpression(namedexpression.normalizeExpressionName(), sheetId);
});
return {
version: version,
scopedNamedExpressions: scopedNamedExpressions
};
}
}, {
key: "removeSheetByName",
value: function removeSheetByName(sheetName) {
var sheetId = this.sheetMapping.fetch(sheetName);
return this.removeSheet(sheetId);
}
}, {
key: "clearSheet",
value: function clearSheet(sheetId) {
this.dependencyGraph.clearSheet(sheetId);
this.columnSearch.removeSheet(sheetId);
}
}, {
key: "addSheet",
value: function addSheet(name) {
var sheetId = this.sheetMapping.addSheet(name);
var sheet = [];
this.dependencyGraph.addressMapping.autoAddSheet(sheetId, sheet, findBoundaries(sheet));
return this.sheetMapping.fetchDisplayName(sheetId);
}
}, {
key: "renameSheet",
value: function renameSheet(sheetId, newName) {
return this.sheetMapping.renameSheet(sheetId, newName);
}
}, {
key: "moveRows",
value: function moveRows(sheet, startRow, numberOfRows, targetRow) {
var rowsToAdd = RowsSpan.fromNumberOfRows(sheet, targetRow, numberOfRows);
this.lazilyTransformingAstService.beginCombinedMode(sheet);
this.doAddRows(rowsToAdd);
if (targetRow < startRow) {
startRow += numberOfRows;
}
var startAddress = simpleCellAddress(sheet, 0, startRow);
var targetAddress = simpleCellAddress(sheet, 0, targetRow);
this.moveCells(startAddress, Number.POSITIVE_INFINITY, numberOfRows, targetAddress);
var rowsToRemove = RowsSpan.fromNumberOfRows(sheet, startRow, numberOfRows);
this.doRemoveRows(rowsToRemove);
return this.lazilyTransformingAstService.commitCombinedMode();
}
}, {
key: "moveColumns",
value: function moveColumns(sheet, startColumn, numberOfColumns, targetColumn) {
var columnsToAdd = ColumnsSpan.fromNumberOfColumns(sheet, targetColumn, numberOfColumns);
this.lazilyTransformingAstService.beginCombinedMode(sheet);
this.doAddColumns(columnsToAdd);
if (targetColumn < startColumn) {
startColumn += numberOfColumns;
}
var startAddress = simpleCellAddress(sheet, startColumn, 0);
var targetAddress = simpleCellAddress(sheet, targetColumn, 0);
this.moveCells(startAddress, numberOfColumns, Number.POSITIVE_INFINITY, targetAddress);
var columnsToRemove = ColumnsSpan.fromNumberOfColumns(sheet, startColumn, numberOfColumns);
this.doRemoveColumns(columnsToRemove);
return this.lazilyTransformingAstService.commitCombinedMode();
}
}, {
key: "moveCells",
value: function moveCells(sourceLeftCorner, width, height, destinationLeftCorner) {
var _this6 = this;
this.ensureItIsPossibleToMoveCells(sourceLeftCorner, width, height, destinationLeftCorner);
var sourceRange = AbsoluteCellRange.spanFrom(sourceLeftCorner, width, height);
var targetRange = AbsoluteCellRange.spanFrom(destinationLeftCorner, width, height);
var toRight = destinationLeftCorner.col - sourceLeftCorner.col;
var toBottom = destinationLeftCorner.row - sourceLeftCorner.row;
var toSheet = destinationLeftCorner.sheet;
var currentDataAtTarget = this.getRangeClipboardCells(targetRange);
var valuesToRemove = this.dependencyGraph.rawValuesFromRange(targetRange);
this.columnSearch.removeValues(valuesToRemove);
var valuesToMove = this.dependencyGraph.rawValuesFromRange(sourceRange);
this.columnSearch.moveValues(valuesToMove, toRight, toBottom, toSheet);
var version;
this.stats.measure(StatType.TRANSFORM_ASTS, function () {
var transformation = new MoveCellsTransformer(sourceRange, toRight, toBottom, toSheet);
transformation.performEagerTransformations(_this6.dependencyGraph, _this6.parser);
version = _this6.lazilyTransformingAstService.addTransformation(transformation);
});
this.dependencyGraph.moveCells(sourceRange, toRight, toBottom, toSheet);
var addedGlobalNamedExpressions = this.updateNamedExpressionsForMovedCells(sourceLeftCorner, width, height, destinationLeftCorner);
return {
version: version,
overwrittenCellsData: currentDataAtTarget,
addedGlobalNamedExpressions: addedGlobalNamedExpressions
};
}
}, {
key: "setRowOrder",
value: function setRowOrder(sheetId, rowMapping) {
var _this7 = this;
var buffer = [];
var oldContent = [];
var _iterator5 = _createForOfIteratorHelper(rowMapping),
_step5;
try {
var _loop = function _loop() {
var _step5$value = _slicedToArray(_step5.value, 2),
source = _step5$value[0],
target = _step5$value[1];
if (source !== target) {
var rowRange = AbsoluteCellRange.spanFrom({
sheet: sheetId,
col: 0,
row: source
}, Infinity, 1);
var row = _this7.getRangeClipboardCells(rowRange);
oldContent = oldContent.concat(row);
buffer.push(row.map(function (_ref) {
var _ref2 = _slicedToArray(_ref, 2),
_ref2$ = _ref2[0],
sheet = _ref2$.sheet,
col = _ref2$.col,
cell = _ref2[1];
return [{
sheet: sheet,
col: col,
row: target
}, cell];
}));
}
};
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
_loop();
}
} catch (err) {
_iterator5.e(err);
} finally {
_iterator5.f();
}
buffer.forEach(function (row) {
return _this7.restoreClipboardCells(sheetId, row.values());
});
return oldContent;
}
}, {
key: "setColumnOrder",
value: function setColumnOrder(sheetId, columnMapping) {
var _this8 = this;
var buffer = [];
var oldContent = [];
var _iterator6 = _createForOfIteratorHelper(columnMapping),
_step6;
try {
var _loop2 = function _loop2() {
var _step6$value = _slicedToArray(_step6.value, 2),
source = _step6$value[0],
target = _step6$value[1];
if (source !== target) {
var rowRange = AbsoluteCellRange.spanFrom({
sheet: sheetId,
col: source,
row: 0
}, 1, Infinity);
var column = _this8.getRangeClipboardCells(rowRange);
oldContent = oldContent.concat(column);
buffer.push(column.map(function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 2),
_ref4$ = _ref4[0],
sheet = _ref4$.sheet,
col = _ref4$.col,
row = _ref4$.row,
cell = _ref4[1];
return [{
sheet: sheet,
col: target,
row: row
}, cell];
}));
}
};
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
_loop2();
}
} catch (err) {
_iterator6.e(err);
} finally {
_iterator6.f();
}
buffer.forEach(function (column) {
return _this8.restoreClipboardCells(sheetId, column.values());
});
return oldContent;
}
}, {
key: "addNamedExpression",
value: function addNamedExpression(expressionName, expression, sheetId, options) {
var namedExpression = this.namedExpressions.addNamedExpression(expressionName, sheetId, options);
this.storeNamedExpressionInCell(namedExpression.address, expression);
this.adjustNamedExpressionEdges(namedExpression, expressionName, sheetId);
}
}, {
key: "restoreNamedExpression",
value: function restoreNamedExpression(namedExpression, content, sheetId) {
var expressionName = namedExpression.displayName;
this.restoreCell(namedExpression.address, content);
var restoredNamedExpression = this.namedExpressions.restoreNamedExpression(namedExpression, sheetId);
this.adjustNamedExpressionEdges(restoredNamedExpression, expressionName, sheetId);
}
}, {
key: "changeNamedExpressionExpression",
value: function changeNamedExpressionExpression(expressionName, newExpression, sheetId, options) {
var namedExpression = this.namedExpressions.namedExpressionForScope(expressionName, sheetId);
if (!namedExpression) {
throw new NamedExpressionDoesNotExistError(expressionName);
}
var oldNamedExpression = namedExpression.copy();
namedExpression.options = options;
var content = this.getClipboardCell(namedExpression.address);
this.storeNamedExpressionInCell(namedExpression.address, newExpression);
return [oldNamedExpression, content];
}
}, {
key: "removeNamedExpression",
value: function removeNamedExpression(expressionName, sheetId) {
var namedExpression = this.namedExpressions.namedExpressionForScope(expressionName, sheetId);
if (!namedExpression) {
throw new NamedExpressionDoesNotExistError(expressionName);
}
this.namedExpressions.remove(namedExpression.displayName, sheetId);
var content = this.getClipboardCell(namedExpression.address);
if (sheetId !== undefined) {
var globalNamedExpression = this.namedExpressions.workbookNamedExpressionOrPlaceholder(expressionName);
this.dependencyGraph.exchangeNode(namedExpression.address, globalNamedExpression.address);
} else {
this.dependencyGraph.setCellEmpty(namedExpression.address);
}
return [namedExpression, content];
}
}, {
key: "ensureItIsPossibleToMoveCells",
value: function ensureItIsPossibleToMoveCells(sourceLeftCorner, width, height, destinationLeftCorner) {
if (invalidSimpleCellAddress(sourceLeftCorner) || !(isPositiveInteger(width) && isPositiveInteger(height) || isRowOrColumnRange(sourceLeftCorner, width, height)) || invalidSimpleCellAddress(destinationLeftCorner) || !this.sheetMapping.hasSheetWithId(sourceLeftCorner.sheet) || !this.sheetMapping.hasSheetWithId(destinationLeftCorner.sheet)) {
throw new InvalidArgumentsError('a valid range of cells to move.');
}
var sourceRange = AbsoluteCellRange.spanFrom(sourceLeftCorner, width, height);
var targetRange = AbsoluteCellRange.spanFrom(destinationLeftCorner, width, height);
if (targetRange.exceedsSheetSizeLimits(this.maxColumns, this.maxRows)) {
throw new SheetSizeLimitExceededError();
}
if (this.dependencyGraph.arrayMapping.isFormulaArrayInRange(sourceRange)) {
throw new SourceLocationHasArrayError();
}
if (this.dependencyGraph.arrayMapping.isFormulaArrayInRange(targetRange)) {
throw new TargetLocationHasArrayError();
}
}
}, {
key: "restoreClipboardCells",
value: function restoreClipboardCells(sourceSheetId, cells) {
var addedNamedExpressions = [];
var _iterator7 = _createForOfIteratorHelper(cells),
_step7;
try {
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
var _step7$value = _slicedToArray(_step7.value, 2),
address = _step7$value[0],
clipboardCell = _step7$value[1];
this.restoreCell(address, clipboardCell);
if (clipboardCell.type === ClipboardCellType.FORMULA) {
var _this$parser$fetchCac = this.parser.fetchCachedResult(clipboardCell.hash),
dependencies = _this$parser$fetchCac.dependencies;
addedNamedExpressions.push.apply(addedNamedExpressions, _toConsumableArray(this.updateNamedExpressionsForTargetAddress(sourceSheetId, address, dependencies)));
}
}
} catch (err) {
_iterator7.e(err);
} finally {
_iterator7.f();
}
return addedNamedExpressions;
}
}, {
key: "restoreCell",
value: function restoreCell(address, clipboardCell) {
switch (clipboardCell.type) {
case ClipboardCellType.VALUE:
{
this.setValueToCell(clipboardCell, address);
break;
}
case ClipboardCellType.FORMULA:
{
this.setFormulaToCellFromCache(clipboardCell.hash, address);
break;
}
case ClipboardCellType.EMPTY:
{
this.setCellEmpty(address);
break;
}
case ClipboardCellType.PARSING_ERROR:
{
this.setParsingErrorToCell(clipboardCell.rawInput, clipboardCell.errors, address);
break;
}
}
}
/**
* Removes multiple rows from sheet. </br>
* Does nothing if rows are outside of effective sheet size.
*
* @param sheet - sheet id from which rows will be removed
* @param rowStart - number of the first row to be deleted
* @param rowEnd - number of the last row to be deleted
* */
}, {
key: "doRemoveRows",
value: function doRemoveRows(rowsToRemove) {
var _this9 = this;
if (this.rowEffectivelyNotInSheet(rowsToRemove.rowStart, rowsToRemove.sheet)) {
return;
}
var removedCells = [];
var _iterator8 = _createForOfIteratorHelper(this.dependencyGraph.entriesFromRowsSpan(rowsToRemove)),
_step8;
try {
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
var _step8$value = _slicedToArray(_step8.value, 1),
address = _step8$value[0];
removedCells.push({
address: address,
cellType: this.getClipboardCell(address)
});
}
} catch (err) {
_iterator8.e(err);
} finally {
_iterator8.f();
}
var _this$dependencyGraph = this.dependencyGraph.removeRows(rowsToRemove),
affectedArrays = _this$dependencyGraph.affectedArrays,
contentChanges = _this$dependencyGraph.contentChanges;
this.columnSearch.applyChanges(contentChanges.getChanges());
var version;
this.stats.measure(StatType.TRANSFORM_ASTS, function () {
var transformation = new RemoveRowsTransformer(rowsToRemove);
transformation.performEagerTransformations(_this9.dependencyGraph, _this9.parser);
version = _this9.lazilyTransformingAstService.addTransformation(transformation);
});
this.rewriteAffectedArrays(affectedArrays);
return {
version: version,
removedCells: removedCells,
rowFrom: rowsToRemove.rowStart,
rowCount: rowsToRemove.numberOfRows
};
}
/**
* Removes multiple columns from sheet. </br>
* Does nothing if columns are outside of effective sheet size.
*
* @param sheet - sheet id from which columns will be removed
* @param columnStart - number of the first column to be deleted
* @param columnEnd - number of the last row to be deleted
*/
}, {
key: "doRemoveColumns",
value: function doRemoveColumns(columnsToRemove) {
var _this10 = this;
if (this.columnEffectivelyNotInSheet(columnsToRemove.columnStart, columnsToRemove.sheet)) {
return;
}
var removedCells = [];
var _iterator9 = _createForOfIteratorHelper(this.dependencyGraph.entriesFromColumnsSpan(columnsToRemove)),
_step9;
try {
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
var _step9$value = _slicedToArray(_step9.value, 1),
address = _step9$value[0];
removedCells.push({
address: address,
cellType: this.getClipboardCell(address)
});
}
} catch (err) {
_iterator9.e(err);
} finally {
_iterator9.f();
}
var _this$dependencyGraph2 = this.dependencyGraph.removeColumns(columnsToRemove),
affectedArrays = _this$dependencyGraph2.affectedArrays,
contentChanges = _this$dependencyGraph2.contentChanges;
this.columnSearch.applyChanges(contentChanges.getChanges());
this.columnSearch.removeColumns(columnsToRemove);
var version;
this.stats.measure(StatType.TRANSFORM_ASTS, function () {
var transformation = new RemoveColumnsTransformer(columnsToRemove);
transformation.performEagerTransformations(_this10.dependencyGraph, _this10.parser);
version = _this10.lazilyTransformingAstService.addTransformation(transformation);
});
this.rewriteAffectedArrays(affectedArrays);
return {
version: version,
removedCells: removedCells,
columnFrom: columnsToRemove.columnStart,
columnCount: columnsToRemove.numberOfColumns
};
}
/**
* Add multiple rows to sheet. </br>
* Does nothing if rows are outside of effective sheet size.
*
* @param sheet - sheet id in which rows will be added
* @param row - row number above which the rows will be added
* @param numberOfRowsToAdd - number of rows to add
*/
}, {
key: "doAddRows",
value: function doAddRows(addedRows) {
var _this11 = this;
if (this.rowEffectivelyNotInSheet(addedRows.rowStart, addedRows.sheet)) {
return;
}
var _this$dependencyGraph3 = this.dependencyGraph.addRows(addedRows),
affectedArrays = _this$dependencyGraph3.affectedArrays;
this.stats.measure(StatType.TRANSFORM_ASTS, function () {
var transformation = new AddRowsTransformer(addedRows);
transformation.performEagerTransformations(_this11.dependencyGraph, _this11.parser);
_this11.lazilyTransformingAstService.addTransformation(transformation);
});
this.rewriteAffectedArrays(affectedArrays);
}
}, {
key: "rewriteAffectedArrays",
value: function rewriteAffectedArrays(affectedArrays) {
var _iterator10 = _createForOfIteratorHelper(affectedArrays.values()),
_step10;
try {
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
var arrayVertex = _step10.value;
if (arrayVertex.array.size.isRef) {
continue;
}
var ast = arrayVertex.getFormula(this.lazilyTransformingAstService);
var address = arrayVertex.getAddress(this.lazilyTransformingAstService);
var hash = this.parser.computeHashFromAst(ast);
this.setFormulaToCellFromCache(hash, address);
}
} catch (err) {
_iterator10.e(err);
} finally {
_iterator10.f();
}
}
/**
* Add multiple columns to sheet </br>
* Does nothing if columns are outside of effective sheet size
*
* @param sheet - sheet id in which columns will be added
* @param column - column number above which the columns will be added
* @param numberOfColumns - number of columns to add
*/
}, {
key: "doAddColumns",
value: function doAddColumns(addedColumns) {
var _this12 = this;
if (this.columnEffectivelyNotInSheet(addedColumns.columnStart, addedColumns.sheet)) {
return;
}
var _this$dependencyGraph4 = this.dependencyGraph.addColumns(addedColumns),
affectedArrays = _this$dependencyGraph4.affectedArrays,
contentChanges = _this$dependencyGraph4.contentChanges;
this.columnSearch.addColumns(addedColumns);
this.columnSearch.applyChanges(contentChanges.getChanges());
this.stats.measure(StatType.TRANSFORM_ASTS, function () {
var transformation = new AddColumnsTransformer(addedColumns);
transformation.performEagerTransformations(_this12.dependencyGraph, _this12.parser);
_this12.lazilyTransformingAstService.addTransformation(transformation);
});
this.rewriteAffectedArrays(affectedArrays);
}
}, {
key: "getOldContent",
value: function getOldContent(address) {
var vertex = this.dependencyGraph.getCell(address);
if (vertex === undefined || vertex instanceof EmptyCellVertex) {
return [address, {
type: ClipboardCellType.EMPTY
}];
} else if (vertex instanceof ValueCellVertex) {
return [address, Object.assign({
type: ClipboardCellType.VALUE
}, vertex.getValues())];
} else if (vertex instanceof FormulaVertex) {
return [vertex.getAddress(this.lazilyTransformingAstService), {
type: ClipboardCellType.FORMULA,
hash: this.parser.computeHashFromAst(vertex.getFormula(this.lazilyTransformingAstService))
}];
} else if (vertex instanceof ParsingErrorVertex) {
return [address, {
type: ClipboardCellType.PARSING_ERROR,
rawInput: vertex.rawInput,
errors: vertex.errors
}];
}
throw Error('Trying to copy unsupported type');
}
}, {
key: "getClipboardCell",
value: function getClipboardCell(address) {
var vertex = this.dependencyGraph.getCell(address);
if (vertex === undefined || vertex instanceof EmptyCellVertex) {
return {
type: ClipboardCellType.EMPTY
};
} else if (vertex instanceof ValueCellVertex) {
return Object.assign({
type: ClipboardCellType.VALUE
}, vertex.getValues());
} else if (vertex instanceof ArrayVertex) {
var val = vertex.getArrayCellValue(address);
if (val === EmptyValue) {
return {
type: ClipboardCellType.EMPTY
};
}
return {
type: ClipboardCellType.VALUE,
parsedValue: val,
rawValue: vertex.getArrayCellRawValue(address)
};
} else if (vertex instanceof FormulaCellVertex) {
return {
type: ClipboardCellType.FORMULA,
hash: this.parser.computeHashFromAst(vertex.getFormula(this.lazilyTransformingAstService))
};
} else if (vertex instanceof ParsingErrorVertex) {
return {
type: ClipboardCellType.PARSING_ERROR,
rawInput: vertex.rawInput,
errors: vertex.errors
};
}
throw Error('Trying to copy unsupported type');
}
}, {
key: "getSheetClipboardCells",
value: function getSheetClipboardCells(sheet) {
var sheetHeight = this.dependencyGraph.getSheetHeight(sheet);
var sheetWidth = this.dependencyGraph.getSheetWidth(sheet);
var arr = new Array(sheetHeight);
for (var i = 0; i < sheetHeight; i++) {
arr[i] = new Array(sheetWidth);
for (var j = 0; j < sheetWidth; j++) {
var address = simpleCellAddress(sheet, j, i);
arr[i][j] = this.getClipboardCell(address);
}
}
return arr;
}
}, {
key: "getRangeClipboardCells",
value: function getRangeClipboardCells(range) {
var result = [];
var _iterator11 = _createForOfIteratorHelper(range.addresses(this.dependencyGraph)),
_step11;
try {
for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) {
var address = _step11.value;
result.push([address, this.getClipboardCell(address)]);
}
} catch (err) {
_iterator11.e(err);
} finally {
_iterator11.f();
}
return result;
}
}, {
key: "setCellContent",
value: function setCellContent(address, newCellContent) {
var parsedCellContent = this.cellContentParser.parse(newCellContent);
var oldContent = this.getOldContent(address);
if (parsedCellContent instanceof CellContent.Formula) {
var parserResult = this.parser.parse(parsedCellContent.formula, address);
var ast = parserResult.ast,
errors = parserResult.errors;
if (errors.length > 0) {
this.setParsingErrorToCell(parsedCellContent.formula, errors, address);
} else {
var size = this.arraySizePredictor.checkArraySize(ast, address);
this.setFormulaToCell(address, size, parserResult);
}
} else if (parsedCellContent instanceof CellContent.Empty) {
this.setCellEmpty(address);
} else {
this.setValueToCell({
parsedValue: parsedCellContent.value,
rawValue: newCellContent
}, address);
}
return oldContent;
}
}, {
key: "setSheetContent",
value: function setSheetContent(sheetId, newSheetContent) {
this.clearSheet(sheetId);
for (var i = 0; i < newSheetContent.length; i++) {
for (var j = 0; j < newSheetContent[i].length; j++) {
var address = simpleCellAddress(sheetId, j, i);
this.setCellContent(address, newSheetContent[i][j]);
}
}
}
}, {
key: "setParsingErrorToCell",
value: function setParsingErrorToCell(rawInput, errors, address) {
var oldValue = this.dependencyGraph.getCellValue(address);
var vertex = new ParsingErrorVertex(errors, rawInput);
var arrayChanges = this.dependencyGraph.setParsingErrorToCell(address, vertex);
this.columnSearch.remove(getRawValue(oldValue), address);
this.columnSearch.applyChanges(arrayChanges.getChanges());
this.changes.addAll(arrayChanges);
this.changes.addChange(vertex.getCellValue(), address);
}
}, {
key: "setFormulaToCell",
value: function setFormulaToCell(address, size, _ref5) {
var ast = _ref5.ast,
hasVolatileFunction = _ref5.hasVolatileFunction,
hasStructuralChangeFunction = _ref5.hasStructuralChangeFunction,
dependencies = _ref5.dependencies;
var oldValue = this.dependencyGraph.getCellValue(address);
var arrayChanges = this.dependencyGraph.setFormulaToCell(address, ast, absolutizeDependencies(dependencies, address), size, hasVolatileFunction, hasStructuralChangeFunction);
this.columnSearch.remove(getRawValue(oldValue), address);
this.columnSearch.applyChanges(arrayChanges.getChanges());
this.changes.addAll(arrayChanges);
}
}, {
key: "setValueToCell",
value: function setValueToCell(value, address) {
var oldValue = this.dependencyGraph.getCellValue(address);
var arrayChanges = this.dependencyGraph.setValueToCell(address, value);
this.columnSearch.change(getRawValue(oldValue), getRawValue(value.parsedValue), address);
this.columnSearch.applyChanges(arrayChanges.getChanges().filter(function (change) {
return !equalSimpleCellAddress(change.address, address);
}));
this.changes.addAll(arrayChanges);
this.changes.addChange(value.parsedValue, address);
}
}, {
key: "setCellEmpty",
value: function setCellEmpty(address) {
if (this.dependencyGraph.isArrayInternalCell(address)) {
return;
}
var oldValue = this.dependencyGraph.getCellValue(address);
var arrayChanges = this.dependencyGraph.setCellEmpty(address);
this.columnSearch.remove(getRawValue(oldValue), address);
this.columnSearch.applyChanges(arrayChanges.getChanges());
this.changes.addAll(arrayChanges);
this.changes.addChange(EmptyValue, address);
}
}, {
key: "setFormulaToCellFromCache",
value: function setFormulaToCellFromCache(formulaHash, address) {
var _this$parser$fetchCac2 = this.parser.fetchCachedResult(formulaHash),
ast = _this$parser$fetchCac2.ast,
hasVolatileFunction = _this$parser$fetchCac2.hasVolatileFunction,
hasStructuralChangeFunction = _this$parser$fetchCac2.hasStructuralChangeFunction,
dependencies = _this$parser$fetchCac2.dependencies;
var absoluteDependencies = absolutizeDependencies(dependencies, address);
var _CleanOutOfScopeDepen = new CleanOutOfScopeDependenciesTransformer(address.sheet).transformSingleAst(ast, address),
_CleanOutOfScopeDepen2 = _slicedToArray(_CleanOutOfScopeDepen, 1),
cleanedAst = _CleanOutOfScopeDepen2[0];
this.parser.rememberNewAst(cleanedAst);
var cleanedDependencies = filterDependenciesOutOfScope(absoluteDependencies);
var size = this.arraySizePredictor.checkArraySize(ast, address);
this.dependencyGraph.setFormulaToCell(address, cleanedAst, cleanedDependencies, size, hasVolatileFunction, hasStructuralChangeFunction);
}
/**
* Returns true if row number is outside of given sheet.
*
* @param row - row number
* @param sheet - sheet id number
*/
}, {
key: "rowEffectivelyNotInSheet",
value: function rowEffectivelyNotInSheet(row, sheet) {
var height = this.dependencyGraph.addressMapping.getHeight(sheet);
return row >= height;
}
}, {
key: "getAndClearContentChanges",
value: function getAndClearContentChanges() {
var changes = this.changes;
this.changes = ContentChanges.empty();
return changes;
}
}, {
key: "forceApplyPostponedTransformations",
value: function forceApplyPostponedTransformations() {
this.dependencyGraph.forceApplyPostponedTransformations();
}
}, {
key: "sheetMapping",
get: function get() {
return this.dependencyGraph.sheetMapping;
}
/**
* Returns true if row number is outside of given sheet.
*
* @param column - row number
* @param sheet - sheet id number
*/
}, {
key: "columnEffectivelyNotInSheet",
value: function columnEffectivelyNotInSheet(column, sheet) {
var width = this.dependencyGraph.addressMapping.getWidth(sheet);
return column >= width;
}
}, {
key: "adjustNamedExpressionEdges",
value: function adjustNamedExpressionEdges(namedExpression, expressionName, sheetId) {
if (sheetId === undefined) {
return;
}
var localVertex = this.dependencyGraph.fetchCellOrCreateEmpty(namedExpression.address);
var globalNamedExpression = this.namedExpressions.workbookNamedExpressionOrPlaceholder(expressionName);
var globalVertex = this.dependencyGraph.fetchCellOrCreateEmpty(globalNamedExpression.address);
var _iterator12 = _createForOfIteratorHelper(this.dependencyGraph.graph.adjacentNodes(globalVertex)),
_step12;
try {
for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) {
var adjacentNode = _step12.value;
if (adjacentNode instanceof FormulaCellVertex && adjacentNode.getAddress(this.lazilyTransformingAstService).sheet === sheetId) {
var ast = adjacentNode.getFormula(this.lazilyTransformingAstService);
var formulaAddress = adjacentNode.getAddress(this.lazilyTransformingAstService);
var _this$parser$fetchCac3 = this.parser.fetchCachedResultForAst(ast),
dependencies = _this$parser$fetchCac3.dependencies;
var _iterator13 = _createForOfIteratorHelper(absolutizeDependencies(dependencies, formulaAddress)),
_step13;
try {
for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) {
var dependency = _step13.value;
if (dependency instanceof NamedExpressionDependency && dependency.name.toLowerCase() === namedExpression.displayName.toLowerCase()) {
this.dependencyGraph.graph.removeEdge(globalVertex, adjacentNode);
this.dependencyGraph.graph.addEdge(localVertex, adjacentNode);
}
}
} catch (err) {
_iterator13.e(err);
} finally {
_iterator13.f();
}
}
}
} catch (err) {
_iterator12.e(err);
} finally {
_iterator12.f();
}
}
}, {
key: "storeNamedExpressionInCell",
value: function storeNamedExpressionInCell(address, expression) {
var parsedCellContent = this.cellContentParser.parse(expression);
if (parsedCellContent instanceof CellContent.Formula) {
var parsingResult = this.parser.parse(parsedCellContent.formula, simpleCellAddress(-1, 0, 0));
if (doesContainRelativeReferences(parsingResult.ast)) {
throw new NoRelativeAddressesAllowedError();
}
var ast = parsingResult.ast,
hasVolatileFunction = parsingResult.hasVolatileFunction,
hasStructuralChangeFunction = parsingResult.hasStructuralChangeFunction,
dependencies = parsingResult.dependencies;
this.dependencyGraph.setFormulaToCell(address, ast, absolutizeDependencies(dependencies, address), ArraySize.scalar(), hasVolatileFunction, hasStructuralChangeFunction);
} else if (parsedCellContent instanceof CellContent.Empty) {
this.setCellEmpty(address);
} else {
this.setValueToCell({
parsedValue: parsedCellContent.value,
rawValue: expression
}, address);
}
}
}, {
key: "updateNamedExpressionsForMovedCells",
value: function updateNamedExpressionsForMovedCells(sourceLeftCorner, width, height, destinationLeftCorner) {
if (sourceLeftCorner.sheet === destinationLeftCorner.sheet) {
return [];
}
var addedGlobalNamedExpressions = [];
var targetRange = AbsoluteCellRange.spanFrom(destinationLeftCorner, width, height);
var _iterator14 = _createForOfIteratorHelper(targetRange.addresses(this.dependencyGraph)),
_step14;
try {
for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) {
var formulaAddress = _step14.value;
var vertex = this.addressMapping.fetchCell(formulaAddress);
if (vertex instanceof FormulaCellVertex && formulaAddress.sheet !== sourceLeftCorner.sheet) {
var ast = vertex.getFormula(this.lazilyTransformingAstService);
var _this$parser$fetchCac4 = this.parser.fetchCachedResultForAst(ast),
dependencies = _this$parser$fetchCac4.dependencies;
addedGlobalNamedExpressions.push.apply(addedGlobalNamedExpressions, _toConsumableArray(this.updateNamedExpressionsForTargetAddress(sourceLeftCorner.sheet, formulaAddress, dependencies)));
}
}
} catch (err) {
_iterator14.e(err);
} finally {
_iterator14.f();
}
return addedGlobalNamedExpressions;
}
}, {
key: "updateNamedExpressionsForTargetAddress",
value: function updateNamedExpressionsForTargetAddress(sourceSheet, targetAddress, dependencies) {
if (sourceSheet === targetAddress.sheet) {
return [];
}
var addedGlobalNamedExpressions = [];
var vertex = this.addressMapping.fetchCell(targetAddress);
var _iterator15 = _createForOfIteratorHelper(absolutizeDependencies(dependencies, targetAddress)),
_step15;
try {
for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) {
var namedExpressionDependency = _step15.value;
if (!(namedExpressionDependency instanceof NamedExpressionDependency)) {
continue;
}
var expressionName = namedExpressionDependency.name;
var sourceVertex = this.dependencyGraph.fetchNamedExpressionVertex(expressionName, sourceSheet);
var namedExpressionInTargetScope = this.namedExpressions.isExpressionInScope(expressionName, targetAddress.sheet);
var targetScopeExpressionVertex = namedExpressionInTargetScope ? this.dependencyGraph.fetchNamedExpressionVertex(expressionName, targetAddress.sheet) : this.copyOrFetchGlobalNamedExpressionVertex(expressionName, sourceVertex, addedGlobalNamedExpressions);
if (targetScopeExpressionVertex !== sourceVertex) {
this.dependencyGraph.graph.softRemoveEdge(sourceVertex, vertex);
this.dependencyGraph.graph.addEdge(targetScopeExpressionVertex, vertex);
}
}
} catch (err) {
_iterator15.e(err);
} finally {
_iterator15.f();
}
return addedGlobalNamedExpressions;
}
}, {
key: "allocateNamedExpressionAddressSpace",
value: function allocateNamedExpressionAddressSpace() {
this.dependencyGraph.addressMapping.addSheet(-1, new SparseStrategy(0, 0));
}
}, {
key: "copyOrFetchGlobalNamedExpressionVertex",
value: function copyOrFetchGlobalNamedExpressionVertex(expressionName, sourceVertex, addedNamedExpressions) {
var expression = this.namedExpressions.namedExpressionForScope(expressionName);
if (expression === undefined) {
expression = this.namedExpressions.addNamedExpression(expressionName);
addedNamedExpressions.push(expression.normalizeExpressionName());
if (sourceVertex instanceof FormulaCellVertex) {
var parsingResult = this.parser.fetchCachedResultForAst(sourceVertex.getFormula(this.lazilyTransformingAstService));
var ast = parsingResult.ast,
hasVolatileFunction = parsingResult.hasVolatileFunction,
hasStructuralChangeFunction = parsingResult.hasStructuralChangeFunction,