@microsoft/connected-workbooks
Version:
Microsoft backed, Excel advanced xlsx workbook generation JavaScript library
104 lines (103 loc) • 4.5 kB
JavaScript
;
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
Object.defineProperty(exports, "__esModule", { value: true });
var constants_1 = require("../utils/constants");
var parseToTableData = function (grid) {
var _a, _b, _c, _d;
if (grid === null || grid === undefined) {
grid = { data: [] };
}
if (grid.data === null || grid.data === undefined) {
grid.data = [];
}
var mergedGrid = {
config: {
promoteHeaders: (_b = (_a = grid.config) === null || _a === void 0 ? void 0 : _a.promoteHeaders) !== null && _b !== void 0 ? _b : false,
adjustColumnNames: (_d = (_c = grid.config) === null || _c === void 0 ? void 0 : _c.adjustColumnNames) !== null && _d !== void 0 ? _d : true,
},
data: grid.data.map(function (row) { return row.map(function (value) { var _a; return (_a = value === null || value === void 0 ? void 0 : value.toString()) !== null && _a !== void 0 ? _a : ""; }); }),
};
correctGrid(mergedGrid);
validateGrid(mergedGrid);
var columnNames = [];
if (mergedGrid.config.promoteHeaders && mergedGrid.config.adjustColumnNames) {
columnNames = getAdjustedColumnNames(mergedGrid.data.shift());
}
else if (mergedGrid.config.promoteHeaders && !mergedGrid.config.adjustColumnNames) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
columnNames = mergedGrid.data.shift();
}
else {
columnNames = Array.from({ length: mergedGrid.data[0].length }, function (_, index) { return "".concat(constants_1.defaults.columnName, " ").concat(index + 1); });
}
return { columnNames: columnNames, rows: mergedGrid.data };
};
var correctGrid = function (grid) {
if (grid.data.length === 0) {
// empty grid fix
grid.config.promoteHeaders = false;
grid.data.push([""]);
return;
}
var getEmptyArray = function (n) { return Array.from({ length: n }, function () { return ""; }); };
if (grid.data[0].length === 0) {
grid.data[0] = [""];
}
// replace empty rows
grid.data.forEach(function (row, index) {
if (row.length === 0) {
grid.data[index] = getEmptyArray(grid.data[0].length);
}
});
if (grid.config.promoteHeaders && grid.data.length === 1) {
// table in Excel should have at least 2 rows
grid.data.push(getEmptyArray(grid.data[0].length));
}
};
/*
* Validates the grid, throws an error if the grid is invalid.
* A valid grid has:
* - MxN structure.
* - If promoteHeaders is true - has at least 1 row, and in case adjustColumnNames is false, first row is unique and non empty.
*/
var validateGrid = function (grid) {
validateDataArrayDimensions(grid.data);
if (grid.config.promoteHeaders && grid.config.adjustColumnNames === false && !validateUniqueAndValidDataArray(grid.data[0])) {
throw new Error(constants_1.promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr);
}
};
var validateDataArrayDimensions = function (arr) {
if (arr.length === 0 || arr[0].length === 0) {
throw new Error(constants_1.unexpectedErr);
}
if (!arr.every(function (innerArr) { return innerArr.length === arr[0].length; })) {
throw new Error(constants_1.arrayIsntMxNErr);
}
};
var validateUniqueAndValidDataArray = function (arr) {
if (arr.some(function (element) { return element === ""; })) {
return false; // Array contains empty elements
}
var uniqueSet = new Set(arr);
return uniqueSet.size === arr.length;
};
var getAdjustedColumnNames = function (columnNames) {
if (columnNames === undefined) {
throw new Error(constants_1.unexpectedErr);
}
var i = 1;
// replace empty column names with default names, can still conflict if columns exist, but we handle that later
columnNames = columnNames.map(function (columnName) { return columnName || "".concat(constants_1.defaults.columnName, " ").concat(i++); });
var uniqueNames = new Set();
return columnNames.map(function (name) {
var uniqueName = name;
i = 1;
while (uniqueNames.has(uniqueName)) {
uniqueName = "".concat(name, " (").concat(i++, ")");
}
uniqueNames.add(uniqueName);
return uniqueName;
});
};
exports.default = { parseToTableData: parseToTableData };