@microsoft/connected-workbooks 3.0.0 → 3.1.1-beta.2
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.
- package/README.md +17 -4
- package/dist/generators.js +7 -12
- package/dist/index.js +4 -30
- package/dist/main.js +383 -0
- package/dist/src/types.d.ts +54 -0
- package/dist/src/utils/documentUtils.js +2 -1
- package/dist/src/utils/index.d.ts +8 -0
- package/dist/src/utils/mashupDocumentParser.js +5 -5
- package/dist/src/utils/pqUtils.js +4 -3
- package/dist/src/utils/tableUtils.js +9 -8
- package/dist/src/utils/xmlInnerPartsUtils.js +18 -17
- package/dist/tests/mocks/index.d.ts +3 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +6 -9
- package/dist/utils/arrayUtils.js +28 -26
- package/dist/utils/constants.js +73 -68
- package/dist/utils/documentUtils.js +88 -52
- package/dist/utils/gridUtils.js +27 -29
- package/dist/utils/htmlUtils.js +8 -10
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.js +8 -22
- package/dist/utils/mashupDocumentParser.js +128 -108
- package/dist/utils/pqUtils.js +143 -71
- package/dist/utils/tableUtils.js +140 -101
- package/dist/utils/xmlInnerPartsUtils.js +228 -172
- package/dist/utils/xmlPartsUtils.js +116 -55
- package/dist/workbookManager.d.ts +1 -0
- package/dist/workbookManager.js +174 -72
- package/dist/workbookTemplate.js +2 -5
- package/package.json +1 -1
- package/dist/gridParser.js +0 -58
- package/dist/gridUtils.js +0 -58
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright (c) Microsoft Corporation.
|
|
3
2
|
// Licensed under the MIT license.
|
|
4
3
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
@@ -10,93 +9,130 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
9
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
10
|
});
|
|
12
11
|
};
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
13
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
14
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
15
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
16
|
+
function step(op) {
|
|
17
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
18
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
19
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
20
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
21
|
+
switch (op[0]) {
|
|
22
|
+
case 0: case 1: t = op; break;
|
|
23
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
24
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
25
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
26
|
+
default:
|
|
27
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
28
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
29
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
30
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
31
|
+
if (t[2]) _.ops.pop();
|
|
32
|
+
_.trys.pop(); continue;
|
|
33
|
+
}
|
|
34
|
+
op = body.call(thisArg, _);
|
|
35
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
36
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
import { dataTypeKind, docPropsCoreXmlPath, docPropsRootElement, element, elementAttributes, falseStr, textResultType, trueStr, xmlTextResultType, } from "./constants";
|
|
40
|
+
import { DataTypes } from "../types";
|
|
41
|
+
var createOrUpdateProperty = function (doc, parent, property, value) {
|
|
17
42
|
if (value === undefined) {
|
|
18
43
|
return;
|
|
19
44
|
}
|
|
20
|
-
|
|
45
|
+
var elements = parent.getElementsByTagName(property);
|
|
21
46
|
if ((elements === null || elements === void 0 ? void 0 : elements.length) === 0) {
|
|
22
|
-
|
|
47
|
+
var newElement = doc.createElement(property);
|
|
23
48
|
newElement.textContent = value;
|
|
24
49
|
parent.appendChild(newElement);
|
|
25
50
|
}
|
|
26
51
|
else if (elements.length > 1) {
|
|
27
|
-
throw new Error(
|
|
52
|
+
throw new Error("Invalid DocProps core.xml, multiple ".concat(property, " elements"));
|
|
28
53
|
}
|
|
29
54
|
else if ((elements === null || elements === void 0 ? void 0 : elements.length) > 0) {
|
|
30
55
|
elements[0].textContent = value;
|
|
31
56
|
}
|
|
32
57
|
};
|
|
33
|
-
|
|
58
|
+
var getDocPropsProperties = function (zip) { return __awaiter(void 0, void 0, void 0, function () {
|
|
59
|
+
var docPropsCoreXmlString, parser, doc, properties;
|
|
34
60
|
var _a;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
61
|
+
return __generator(this, function (_b) {
|
|
62
|
+
switch (_b.label) {
|
|
63
|
+
case 0: return [4 /*yield*/, ((_a = zip.file(docPropsCoreXmlPath)) === null || _a === void 0 ? void 0 : _a.async(textResultType))];
|
|
64
|
+
case 1:
|
|
65
|
+
docPropsCoreXmlString = _b.sent();
|
|
66
|
+
if (docPropsCoreXmlString === undefined) {
|
|
67
|
+
throw new Error("DocProps core.xml was not found in template");
|
|
68
|
+
}
|
|
69
|
+
parser = new DOMParser();
|
|
70
|
+
doc = parser.parseFromString(docPropsCoreXmlString, xmlTextResultType);
|
|
71
|
+
properties = doc.getElementsByTagName(docPropsRootElement).item(0);
|
|
72
|
+
if (properties === null) {
|
|
73
|
+
throw new Error("Invalid DocProps core.xml");
|
|
74
|
+
}
|
|
75
|
+
return [2 /*return*/, { doc: doc, properties: properties }];
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}); };
|
|
79
|
+
var getCellReferenceAbsolute = function (col, row) {
|
|
48
80
|
// 65 is the ascii value of first column 'A'
|
|
49
81
|
return "$" + String.fromCharCode(col + 65) + "$" + row.toString();
|
|
50
82
|
};
|
|
51
|
-
|
|
83
|
+
var getCellReferenceRelative = function (col, row) {
|
|
52
84
|
// 65 is the ascii value of first column 'A'
|
|
53
85
|
return String.fromCharCode(col + 65) + row.toString();
|
|
54
86
|
};
|
|
55
|
-
|
|
56
|
-
return
|
|
87
|
+
var getTableReference = function (numberOfCols, numberOfRows) {
|
|
88
|
+
return "A1:".concat(getCellReferenceRelative(numberOfCols, numberOfRows));
|
|
57
89
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
cell.setAttribute(
|
|
61
|
-
|
|
90
|
+
var createCellElement = function (doc, colIndex, rowIndex, data) {
|
|
91
|
+
var cell = doc.createElementNS(doc.documentElement.namespaceURI, element.kindCell);
|
|
92
|
+
cell.setAttribute(elementAttributes.row, getCellReferenceRelative(colIndex, rowIndex + 1));
|
|
93
|
+
var cellData = doc.createElementNS(doc.documentElement.namespaceURI, element.cellValue);
|
|
62
94
|
updateCellData(data, cell, cellData, rowIndex === 0);
|
|
63
95
|
cell.appendChild(cellData);
|
|
64
96
|
return cell;
|
|
65
97
|
};
|
|
66
|
-
|
|
98
|
+
var updateCellData = function (data, cell, cellData, rowHeader) {
|
|
67
99
|
switch (resolveType(data, rowHeader)) {
|
|
68
|
-
case
|
|
69
|
-
cell.setAttribute(
|
|
100
|
+
case DataTypes.string:
|
|
101
|
+
cell.setAttribute(element.text, dataTypeKind.string);
|
|
70
102
|
break;
|
|
71
|
-
case
|
|
72
|
-
cell.setAttribute(
|
|
103
|
+
case DataTypes.number:
|
|
104
|
+
cell.setAttribute(element.text, dataTypeKind.number);
|
|
73
105
|
break;
|
|
74
|
-
case
|
|
75
|
-
cell.setAttribute(
|
|
106
|
+
case DataTypes.boolean:
|
|
107
|
+
cell.setAttribute(element.text, dataTypeKind.boolean);
|
|
76
108
|
break;
|
|
77
109
|
}
|
|
110
|
+
if (data.startsWith(" ") || data.endsWith(" ")) {
|
|
111
|
+
cellData.setAttribute(elementAttributes.space, "preserve");
|
|
112
|
+
}
|
|
78
113
|
cellData.textContent = data;
|
|
79
114
|
};
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (rowHeader) {
|
|
83
|
-
// Headers should be string by default.
|
|
84
|
-
return
|
|
115
|
+
var resolveType = function (originalData, rowHeader) {
|
|
116
|
+
var data = originalData;
|
|
117
|
+
if ((rowHeader) || (data.trim() === "")) {
|
|
118
|
+
// Headers and whitespace should be string by default.
|
|
119
|
+
return DataTypes.string;
|
|
85
120
|
}
|
|
86
|
-
|
|
87
|
-
if (dataType ==
|
|
88
|
-
if (data.trim() ==
|
|
89
|
-
dataType =
|
|
121
|
+
var dataType = isNaN(Number(data)) ? DataTypes.string : DataTypes.number;
|
|
122
|
+
if (dataType == DataTypes.string) {
|
|
123
|
+
if (data.trim() == trueStr || data.trim() == falseStr) {
|
|
124
|
+
dataType = DataTypes.boolean;
|
|
90
125
|
}
|
|
91
126
|
}
|
|
92
127
|
return dataType;
|
|
93
128
|
};
|
|
94
|
-
|
|
95
|
-
createOrUpdateProperty,
|
|
96
|
-
getDocPropsProperties,
|
|
97
|
-
getCellReferenceRelative,
|
|
98
|
-
getCellReferenceAbsolute,
|
|
129
|
+
export default {
|
|
130
|
+
createOrUpdateProperty: createOrUpdateProperty,
|
|
131
|
+
getDocPropsProperties: getDocPropsProperties,
|
|
132
|
+
getCellReferenceRelative: getCellReferenceRelative,
|
|
133
|
+
getCellReferenceAbsolute: getCellReferenceAbsolute,
|
|
99
134
|
createCell: createCellElement,
|
|
100
|
-
getTableReference,
|
|
101
|
-
|
|
135
|
+
getTableReference: getTableReference,
|
|
136
|
+
updateCellData: updateCellData,
|
|
137
|
+
resolveType: resolveType,
|
|
102
138
|
};
|
package/dist/utils/gridUtils.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright (c) Microsoft Corporation.
|
|
3
2
|
// Licensed under the MIT license.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const parseToTableData = (grid) => {
|
|
3
|
+
import { arrayIsntMxNErr, defaults, promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr, unexpectedErr } from "../utils/constants";
|
|
4
|
+
var parseToTableData = function (grid) {
|
|
7
5
|
var _a, _b, _c, _d;
|
|
8
6
|
if (grid === null || grid === undefined) {
|
|
9
7
|
grid = { data: [] };
|
|
@@ -11,16 +9,16 @@ const parseToTableData = (grid) => {
|
|
|
11
9
|
if (grid.data === null || grid.data === undefined) {
|
|
12
10
|
grid.data = [];
|
|
13
11
|
}
|
|
14
|
-
|
|
12
|
+
var mergedGrid = {
|
|
15
13
|
config: {
|
|
16
14
|
promoteHeaders: (_b = (_a = grid.config) === null || _a === void 0 ? void 0 : _a.promoteHeaders) !== null && _b !== void 0 ? _b : false,
|
|
17
15
|
adjustColumnNames: (_d = (_c = grid.config) === null || _c === void 0 ? void 0 : _c.adjustColumnNames) !== null && _d !== void 0 ? _d : true,
|
|
18
16
|
},
|
|
19
|
-
data: grid.data.map((row)
|
|
17
|
+
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 : ""; }); }),
|
|
20
18
|
};
|
|
21
19
|
correctGrid(mergedGrid);
|
|
22
20
|
validateGrid(mergedGrid);
|
|
23
|
-
|
|
21
|
+
var columnNames = [];
|
|
24
22
|
if (mergedGrid.config.promoteHeaders && mergedGrid.config.adjustColumnNames) {
|
|
25
23
|
columnNames = getAdjustedColumnNames(mergedGrid.data.shift());
|
|
26
24
|
}
|
|
@@ -29,23 +27,23 @@ const parseToTableData = (grid) => {
|
|
|
29
27
|
columnNames = mergedGrid.data.shift();
|
|
30
28
|
}
|
|
31
29
|
else {
|
|
32
|
-
columnNames = Array.from({ length: mergedGrid.data[0].length }, (_, index)
|
|
30
|
+
columnNames = Array.from({ length: mergedGrid.data[0].length }, function (_, index) { return "".concat(defaults.columnName, " ").concat(index + 1); });
|
|
33
31
|
}
|
|
34
32
|
return { columnNames: columnNames, rows: mergedGrid.data };
|
|
35
33
|
};
|
|
36
|
-
|
|
34
|
+
var correctGrid = function (grid) {
|
|
37
35
|
if (grid.data.length === 0) {
|
|
38
36
|
// empty grid fix
|
|
39
37
|
grid.config.promoteHeaders = false;
|
|
40
38
|
grid.data.push([""]);
|
|
41
39
|
return;
|
|
42
40
|
}
|
|
43
|
-
|
|
41
|
+
var getEmptyArray = function (n) { return Array.from({ length: n }, function () { return ""; }); };
|
|
44
42
|
if (grid.data[0].length === 0) {
|
|
45
43
|
grid.data[0] = [""];
|
|
46
44
|
}
|
|
47
45
|
// replace empty rows
|
|
48
|
-
grid.data.forEach((row, index)
|
|
46
|
+
grid.data.forEach(function (row, index) {
|
|
49
47
|
if (row.length === 0) {
|
|
50
48
|
grid.data[index] = getEmptyArray(grid.data[0].length);
|
|
51
49
|
}
|
|
@@ -61,43 +59,43 @@ const correctGrid = (grid) => {
|
|
|
61
59
|
* - MxN structure.
|
|
62
60
|
* - If promoteHeaders is true - has at least 1 row, and in case adjustColumnNames is false, first row is unique and non empty.
|
|
63
61
|
*/
|
|
64
|
-
|
|
62
|
+
var validateGrid = function (grid) {
|
|
65
63
|
validateDataArrayDimensions(grid.data);
|
|
66
64
|
if (grid.config.promoteHeaders && grid.config.adjustColumnNames === false && !validateUniqueAndValidDataArray(grid.data[0])) {
|
|
67
|
-
throw new Error(
|
|
65
|
+
throw new Error(promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr);
|
|
68
66
|
}
|
|
69
67
|
};
|
|
70
|
-
|
|
68
|
+
var validateDataArrayDimensions = function (arr) {
|
|
71
69
|
if (arr.length === 0 || arr[0].length === 0) {
|
|
72
|
-
throw new Error(
|
|
70
|
+
throw new Error(unexpectedErr);
|
|
73
71
|
}
|
|
74
|
-
if (!arr.every((innerArr)
|
|
75
|
-
throw new Error(
|
|
72
|
+
if (!arr.every(function (innerArr) { return innerArr.length === arr[0].length; })) {
|
|
73
|
+
throw new Error(arrayIsntMxNErr);
|
|
76
74
|
}
|
|
77
75
|
};
|
|
78
|
-
|
|
79
|
-
if (arr.some((element)
|
|
76
|
+
var validateUniqueAndValidDataArray = function (arr) {
|
|
77
|
+
if (arr.some(function (element) { return element === ""; })) {
|
|
80
78
|
return false; // Array contains empty elements
|
|
81
79
|
}
|
|
82
|
-
|
|
80
|
+
var uniqueSet = new Set(arr);
|
|
83
81
|
return uniqueSet.size === arr.length;
|
|
84
82
|
};
|
|
85
|
-
|
|
83
|
+
var getAdjustedColumnNames = function (columnNames) {
|
|
86
84
|
if (columnNames === undefined) {
|
|
87
|
-
throw new Error(
|
|
85
|
+
throw new Error(unexpectedErr);
|
|
88
86
|
}
|
|
89
|
-
|
|
87
|
+
var i = 1;
|
|
90
88
|
// replace empty column names with default names, can still conflict if columns exist, but we handle that later
|
|
91
|
-
columnNames = columnNames.map((columnName)
|
|
92
|
-
|
|
93
|
-
return columnNames.map((name)
|
|
94
|
-
|
|
89
|
+
columnNames = columnNames.map(function (columnName) { return columnName || "".concat(defaults.columnName, " ").concat(i++); });
|
|
90
|
+
var uniqueNames = new Set();
|
|
91
|
+
return columnNames.map(function (name) {
|
|
92
|
+
var uniqueName = name;
|
|
95
93
|
i = 1;
|
|
96
94
|
while (uniqueNames.has(uniqueName)) {
|
|
97
|
-
uniqueName =
|
|
95
|
+
uniqueName = "".concat(name, " (").concat(i++, ")");
|
|
98
96
|
}
|
|
99
97
|
uniqueNames.add(uniqueName);
|
|
100
98
|
return uniqueName;
|
|
101
99
|
});
|
|
102
100
|
};
|
|
103
|
-
|
|
101
|
+
export default { parseToTableData: parseToTableData };
|
package/dist/utils/htmlUtils.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright (c) Microsoft Corporation.
|
|
3
2
|
// Licensed under the MIT license.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const rows = [];
|
|
3
|
+
var extractTableValues = function (table) {
|
|
4
|
+
var rows = [];
|
|
7
5
|
// Extract values from each row
|
|
8
|
-
for (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
for (
|
|
12
|
-
|
|
6
|
+
for (var i = 0; i < table.rows.length; i++) {
|
|
7
|
+
var row = table.rows[i];
|
|
8
|
+
var rowData = [];
|
|
9
|
+
for (var j = 0; j < row.cells.length; j++) {
|
|
10
|
+
var cell = row.cells[j];
|
|
13
11
|
rowData.push(cell.textContent || "");
|
|
14
12
|
}
|
|
15
13
|
rows.push(rowData);
|
|
16
14
|
}
|
|
17
15
|
return rows;
|
|
18
16
|
};
|
|
19
|
-
|
|
17
|
+
export default { extractTableValues: extractTableValues };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { default as pqUtils } from "./pqUtils";
|
|
2
|
+
export { default as arrayUtils } from "./arrayUtils";
|
|
3
|
+
export { default as documentUtils } from "./documentUtils";
|
|
4
|
+
export { default as xmlPartsUtils } from "./xmlPartsUtils";
|
|
5
|
+
export { default as xmlInnerPartsUtils } from "./xmlInnerPartsUtils";
|
|
6
|
+
export { default as tableUtils } from "./tableUtils";
|
|
7
|
+
export { default as htmlUtils } from "./htmlUtils";
|
|
8
|
+
export { default as gridUtils } from "./gridUtils";
|
package/dist/utils/index.js
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
// Copyright (c) Microsoft Corporation.
|
|
3
2
|
// Licensed under the MIT license.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Object.defineProperty(exports, "arrayUtils", { enumerable: true, get: function () { return __importDefault(arrayUtils_1).default; } });
|
|
13
|
-
var documentUtils_1 = require("./documentUtils");
|
|
14
|
-
Object.defineProperty(exports, "documentUtils", { enumerable: true, get: function () { return __importDefault(documentUtils_1).default; } });
|
|
15
|
-
var xmlPartsUtils_1 = require("./xmlPartsUtils");
|
|
16
|
-
Object.defineProperty(exports, "xmlPartsUtils", { enumerable: true, get: function () { return __importDefault(xmlPartsUtils_1).default; } });
|
|
17
|
-
var xmlInnerPartsUtils_1 = require("./xmlInnerPartsUtils");
|
|
18
|
-
Object.defineProperty(exports, "xmlInnerPartsUtils", { enumerable: true, get: function () { return __importDefault(xmlInnerPartsUtils_1).default; } });
|
|
19
|
-
var tableUtils_1 = require("./tableUtils");
|
|
20
|
-
Object.defineProperty(exports, "tableUtils", { enumerable: true, get: function () { return __importDefault(tableUtils_1).default; } });
|
|
21
|
-
var htmlUtils_1 = require("./htmlUtils");
|
|
22
|
-
Object.defineProperty(exports, "htmlUtils", { enumerable: true, get: function () { return __importDefault(htmlUtils_1).default; } });
|
|
23
|
-
var gridUtils_1 = require("./gridUtils");
|
|
24
|
-
Object.defineProperty(exports, "gridUtils", { enumerable: true, get: function () { return __importDefault(gridUtils_1).default; } });
|
|
3
|
+
export { default as pqUtils } from "./pqUtils";
|
|
4
|
+
export { default as arrayUtils } from "./arrayUtils";
|
|
5
|
+
export { default as documentUtils } from "./documentUtils";
|
|
6
|
+
export { default as xmlPartsUtils } from "./xmlPartsUtils";
|
|
7
|
+
export { default as xmlInnerPartsUtils } from "./xmlInnerPartsUtils";
|
|
8
|
+
export { default as tableUtils } from "./tableUtils";
|
|
9
|
+
export { default as htmlUtils } from "./htmlUtils";
|
|
10
|
+
export { default as gridUtils } from "./gridUtils";
|