UNPKG

@microsoft/connected-workbooks

Version:

Microsoft backed, Excel advanced xlsx workbook generation JavaScript library

104 lines (103 loc) 4.5 kB
"use strict"; // 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 };