@microsoft/connected-workbooks 3.1.2-beta.2 → 3.1.3-beta
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 +2 -2
- package/dist/main.js +357 -106
- package/dist/src/generators.js +7 -6
- package/dist/src/types.d.ts +1 -0
- package/dist/src/utils/arrayUtils.js +26 -21
- package/dist/src/utils/constants.js +18 -8
- package/dist/src/utils/documentUtils.js +92 -42
- package/dist/src/utils/gridUtils.js +23 -23
- package/dist/src/utils/htmlUtils.js +8 -8
- package/dist/src/utils/mashupDocumentParser.js +110 -67
- package/dist/src/utils/pqUtils.js +161 -65
- package/dist/src/utils/tableUtils.js +118 -74
- package/dist/src/utils/xmlInnerPartsUtils.js +213 -152
- package/dist/src/utils/xmlPartsUtils.js +116 -50
- package/dist/tests/arrayUtils.test.js +21 -21
- package/dist/tests/documentUtils.test.js +37 -8
- package/dist/tests/gridUtils.test.js +9 -9
- package/dist/tests/htmlUtils.test.js +48 -47
- package/dist/tests/mashupDocumentParser.test.js +91 -38
- package/dist/tests/mocks/PqMock.js +1 -1
- package/dist/tests/mocks/section1mSimpleQueryMock.js +5 -15
- package/dist/tests/mocks/xmlMocks.js +2 -2
- package/dist/tests/tableUtils.test.js +18 -18
- package/dist/tests/workbookQueryTemplate.test.js +127 -45
- package/dist/tests/workbookTableTemplate.test.js +104 -33
- package/dist/tests/xmlInnerPartsUtils.test.js +118 -37
- package/dist/utils/constants.js +3 -1
- package/dist/workbookManager.js +2 -2
- package/package.json +1 -1
|
@@ -25,41 +25,41 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
return result;
|
|
26
26
|
};
|
|
27
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
describe("ArrayReader tests", ()
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
test("getInt32 test", ()
|
|
34
|
-
|
|
28
|
+
var utils_1 = require("../src/utils/");
|
|
29
|
+
var base64 = __importStar(require("base64-js"));
|
|
30
|
+
describe("ArrayReader tests", function () {
|
|
31
|
+
var buffer = base64.toByteArray("UHJhaXNlIFRoZSBTdW4h").buffer;
|
|
32
|
+
var arrReader = new utils_1.arrayUtils.ArrayReader(buffer);
|
|
33
|
+
test("getInt32 test", function () {
|
|
34
|
+
var int32 = arrReader.getInt32();
|
|
35
35
|
expect(int32).toEqual(1767993936);
|
|
36
36
|
expect(arrReader._position).toEqual(4);
|
|
37
37
|
});
|
|
38
|
-
test("getBytes test", ()
|
|
39
|
-
|
|
38
|
+
test("getBytes test", function () {
|
|
39
|
+
var bytes = arrReader.getBytes(4);
|
|
40
40
|
expect(bytes).toEqual(new Uint8Array([115, 101, 32, 84]));
|
|
41
41
|
expect(arrReader._position).toEqual(8);
|
|
42
42
|
});
|
|
43
|
-
test("reset test", ()
|
|
43
|
+
test("reset test", function () {
|
|
44
44
|
arrReader.reset();
|
|
45
45
|
expect(arrReader._position).toEqual(0);
|
|
46
46
|
});
|
|
47
47
|
});
|
|
48
|
-
test("getInt32Buffer test", ()
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
test("getInt32Buffer test", function () {
|
|
49
|
+
var size = 4;
|
|
50
|
+
var val = 4;
|
|
51
|
+
var packageSizeBuffer = new ArrayBuffer(size);
|
|
52
52
|
new DataView(packageSizeBuffer).setInt32(0, val, true);
|
|
53
|
-
|
|
54
|
-
|
|
53
|
+
var expected = new Uint8Array(packageSizeBuffer);
|
|
54
|
+
var actual = utils_1.arrayUtils.getInt32Buffer(size);
|
|
55
55
|
expect(actual).toStrictEqual(expected);
|
|
56
56
|
});
|
|
57
|
-
test("concatArrays test", ()
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
test("concatArrays test", function () {
|
|
58
|
+
var uIntArr1 = new Uint8Array(4).fill(5);
|
|
59
|
+
var uIntArr2 = new Uint8Array(2).fill(10);
|
|
60
|
+
var expected = new Uint8Array(6);
|
|
61
61
|
expected.set(uIntArr1, 0);
|
|
62
62
|
expected.set(uIntArr2, 4);
|
|
63
|
-
|
|
63
|
+
var actual = utils_1.arrayUtils.concatArrays(uIntArr1, uIntArr2);
|
|
64
64
|
expect(actual).toStrictEqual(expected);
|
|
65
65
|
});
|
|
@@ -2,24 +2,26 @@
|
|
|
2
2
|
// Copyright (c) Microsoft Corporation.
|
|
3
3
|
// Licensed under the MIT license.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
var types_1 = require("../src/types");
|
|
6
|
+
var utils_1 = require("../src/utils");
|
|
7
|
+
var constants_1 = require("../src/utils/constants");
|
|
8
|
+
describe("Document Utils tests", function () {
|
|
9
|
+
test("ResolveType date not supported success", function () {
|
|
9
10
|
expect(utils_1.documentUtils.resolveType("5-4-2023 00:00", false)).toEqual(types_1.DataTypes.string);
|
|
10
11
|
});
|
|
11
|
-
test("ResolveType string success", ()
|
|
12
|
+
test("ResolveType string success", function () {
|
|
12
13
|
expect(utils_1.documentUtils.resolveType("sTrIng", false)).toEqual(types_1.DataTypes.string);
|
|
13
14
|
expect(utils_1.documentUtils.resolveType("True", false)).toEqual(types_1.DataTypes.string);
|
|
14
15
|
expect(utils_1.documentUtils.resolveType("False", false)).toEqual(types_1.DataTypes.string);
|
|
16
|
+
expect(utils_1.documentUtils.resolveType(" ", false)).toEqual(types_1.DataTypes.string);
|
|
15
17
|
});
|
|
16
|
-
test("ResolveType boolean success", ()
|
|
18
|
+
test("ResolveType boolean success", function () {
|
|
17
19
|
expect(utils_1.documentUtils.resolveType("true", false)).toEqual(types_1.DataTypes.boolean);
|
|
18
20
|
expect(utils_1.documentUtils.resolveType(" true", false)).toEqual(types_1.DataTypes.boolean);
|
|
19
21
|
expect(utils_1.documentUtils.resolveType("false", false)).toEqual(types_1.DataTypes.boolean);
|
|
20
22
|
expect(utils_1.documentUtils.resolveType(" false", false)).toEqual(types_1.DataTypes.boolean);
|
|
21
23
|
});
|
|
22
|
-
test("ResolveType number success", ()
|
|
24
|
+
test("ResolveType number success", function () {
|
|
23
25
|
expect(utils_1.documentUtils.resolveType("100000", false)).toEqual(types_1.DataTypes.number);
|
|
24
26
|
expect(utils_1.documentUtils.resolveType("1000.00", false)).toEqual(types_1.DataTypes.number);
|
|
25
27
|
expect(utils_1.documentUtils.resolveType("1000.50", false)).toEqual(types_1.DataTypes.number);
|
|
@@ -27,9 +29,36 @@ describe("Document Utils tests", () => {
|
|
|
27
29
|
expect(utils_1.documentUtils.resolveType("1.23450", false)).toEqual(types_1.DataTypes.number);
|
|
28
30
|
expect(utils_1.documentUtils.resolveType("1.23.4.50", false)).toEqual(types_1.DataTypes.string);
|
|
29
31
|
});
|
|
30
|
-
test("ResolveType header row success", ()
|
|
32
|
+
test("ResolveType header row success", function () {
|
|
31
33
|
expect(utils_1.documentUtils.resolveType("100000", true)).toEqual(types_1.DataTypes.string);
|
|
32
34
|
expect(utils_1.documentUtils.resolveType("true", true)).toEqual(types_1.DataTypes.string);
|
|
33
35
|
expect(utils_1.documentUtils.resolveType("string", true)).toEqual(types_1.DataTypes.string);
|
|
34
36
|
});
|
|
37
|
+
test("Cell Data Element preserves spaces", function () {
|
|
38
|
+
var doc = document.implementation.createDocument("", "", null);
|
|
39
|
+
var cell = doc.createElementNS("", constants_1.element.kindCell);
|
|
40
|
+
var cellData = doc.createElementNS("", constants_1.element.cellValue);
|
|
41
|
+
utils_1.documentUtils.updateCellData(" ", cell, cellData, false);
|
|
42
|
+
expect(cellData.getAttribute("xml:space")).toEqual("preserve");
|
|
43
|
+
cellData.removeAttribute("xml:space");
|
|
44
|
+
utils_1.documentUtils.updateCellData("a ", cell, cellData, false);
|
|
45
|
+
expect(cellData.getAttribute("xml:space")).toEqual("preserve");
|
|
46
|
+
cellData.removeAttribute("xml:space");
|
|
47
|
+
utils_1.documentUtils.updateCellData(" a", cell, cellData, false);
|
|
48
|
+
expect(cellData.getAttribute("xml:space")).toEqual("preserve");
|
|
49
|
+
cellData.removeAttribute("xml:space");
|
|
50
|
+
utils_1.documentUtils.updateCellData("a a", cell, cellData, false);
|
|
51
|
+
expect(cellData.getAttribute("xml:space")).toBeNull();
|
|
52
|
+
});
|
|
53
|
+
test("Test convert column number To Excel Column", function () {
|
|
54
|
+
expect(utils_1.documentUtils.convertToExcelColumn(0)).toEqual("A");
|
|
55
|
+
expect(utils_1.documentUtils.convertToExcelColumn(701)).toEqual("ZZ");
|
|
56
|
+
expect(utils_1.documentUtils.convertToExcelColumn(16383)).toEqual("XFD");
|
|
57
|
+
try {
|
|
58
|
+
utils_1.documentUtils.convertToExcelColumn(16384);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
expect(e.message).toEqual("Column index out of range");
|
|
62
|
+
}
|
|
63
|
+
});
|
|
35
64
|
});
|
|
@@ -3,10 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
describe("Grid Utils tests", ()
|
|
6
|
+
var constants_1 = require("../src/utils/constants");
|
|
7
|
+
var gridUtils_1 = __importDefault(require("../src/utils/gridUtils"));
|
|
8
|
+
var columnName = function (i) { return "".concat(constants_1.defaults.columnName, " ").concat(i); };
|
|
9
|
+
describe("Grid Utils tests", function () {
|
|
10
10
|
test.concurrent.each([
|
|
11
11
|
["null grid", null, { columnNames: [columnName(1)], rows: [[""]] }],
|
|
12
12
|
["null grid data", { data: null }, { columnNames: [columnName(1)], rows: [[""]] }],
|
|
@@ -135,7 +135,7 @@ describe("Grid Utils tests", () => {
|
|
|
135
135
|
rows: [["", ""]],
|
|
136
136
|
},
|
|
137
137
|
],
|
|
138
|
-
])("%s:\n\t%j should be parsed to %j", (scenario, input, expected)
|
|
138
|
+
])("%s:\n\t%j should be parsed to %j", function (scenario, input, expected) {
|
|
139
139
|
expect(gridUtils_1.default.parseToTableData(input)).toEqual(expected);
|
|
140
140
|
});
|
|
141
141
|
// promote headers, without adjust column names, errors
|
|
@@ -150,8 +150,8 @@ describe("Grid Utils tests", () => {
|
|
|
150
150
|
["1", "2"],
|
|
151
151
|
],
|
|
152
152
|
],
|
|
153
|
-
])(
|
|
154
|
-
expect(()
|
|
153
|
+
])("parsing %j should throw \"".concat(constants_1.promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr, "\""), function (input) {
|
|
154
|
+
expect(function () { return gridUtils_1.default.parseToTableData({ data: input, config: { promoteHeaders: true, adjustColumnNames: false } }); }).toThrowError(constants_1.promotedHeadersCannotBeUsedWithoutAdjustingColumnNamesErr);
|
|
155
155
|
});
|
|
156
156
|
// array isn't MxN
|
|
157
157
|
test.concurrent.each([
|
|
@@ -162,7 +162,7 @@ describe("Grid Utils tests", () => {
|
|
|
162
162
|
],
|
|
163
163
|
],
|
|
164
164
|
[[["אבג", "אבג"], ["1", "2"], ["3"]]],
|
|
165
|
-
])(
|
|
166
|
-
expect(()
|
|
165
|
+
])("parsing %j should throw \"".concat(constants_1.arrayIsntMxNErr, "\""), function (input) {
|
|
166
|
+
expect(function () { return gridUtils_1.default.parseToTableData({ data: input, config: { promoteHeaders: true, adjustColumnNames: false } }); }).toThrowError(constants_1.arrayIsntMxNErr);
|
|
167
167
|
});
|
|
168
168
|
});
|
|
@@ -2,105 +2,106 @@
|
|
|
2
2
|
// Copyright (c) Microsoft Corporation.
|
|
3
3
|
// Licensed under the MIT license.
|
|
4
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
var utils_1 = require("../src/utils");
|
|
6
|
+
var jsdom_1 = require("jsdom");
|
|
7
7
|
// Create a JSDOM instance
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
var window = new jsdom_1.JSDOM("<!DOCTYPE html><html><body></body></html>").window;
|
|
9
|
+
var document = window.document;
|
|
10
10
|
// Helper function to create table rows and cells
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
var createRowWithCells = function (cellValues, celltypes) {
|
|
12
|
+
if (celltypes === void 0) { celltypes = "td"; }
|
|
13
|
+
var row = document.createElement("tr");
|
|
14
|
+
cellValues.forEach(function (value) {
|
|
15
|
+
var cell = document.createElement(celltypes);
|
|
15
16
|
cell.textContent = value;
|
|
16
17
|
row.appendChild(cell);
|
|
17
18
|
});
|
|
18
19
|
return row;
|
|
19
20
|
};
|
|
20
|
-
describe("extractTableValues", ()
|
|
21
|
-
test("returns an empty array for an empty table", ()
|
|
21
|
+
describe("extractTableValues", function () {
|
|
22
|
+
test("returns an empty array for an empty table", function () {
|
|
22
23
|
// Create an empty table element
|
|
23
|
-
|
|
24
|
+
var table = document.createElement("table");
|
|
24
25
|
// Call the method and expect an empty array as the result
|
|
25
26
|
expect(utils_1.htmlUtils.extractTableValues(table)).toEqual([]);
|
|
26
27
|
});
|
|
27
|
-
test("returns an empty row for an empty tr", ()
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
test("returns an empty row for an empty tr", function () {
|
|
29
|
+
var table = document.createElement("table");
|
|
30
|
+
var tbody = document.createElement("tbody");
|
|
31
|
+
var row = createRowWithCells([]);
|
|
31
32
|
tbody.appendChild(row);
|
|
32
33
|
table.appendChild(tbody);
|
|
33
34
|
expect(utils_1.htmlUtils.extractTableValues(table)).toEqual([[]]);
|
|
34
35
|
});
|
|
35
|
-
test("extracts values correctly from a table with multiple rows and cells", ()
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
test("extracts values correctly from a table with multiple rows and cells", function () {
|
|
37
|
+
var table = document.createElement("table");
|
|
38
|
+
var tbody = document.createElement("tbody");
|
|
39
|
+
var row1 = createRowWithCells(["A", "B"]);
|
|
40
|
+
var row2 = createRowWithCells(["C", "D"]);
|
|
40
41
|
tbody.appendChild(row1);
|
|
41
42
|
tbody.appendChild(row2);
|
|
42
43
|
table.appendChild(tbody);
|
|
43
|
-
|
|
44
|
+
var expectedResult = [
|
|
44
45
|
["A", "B"],
|
|
45
46
|
["C", "D"],
|
|
46
47
|
];
|
|
47
48
|
expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
|
|
48
49
|
});
|
|
49
|
-
test("handles empty cells by using an empty string", ()
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
test("handles empty cells by using an empty string", function () {
|
|
51
|
+
var table = document.createElement("table");
|
|
52
|
+
var tbody = document.createElement("tbody");
|
|
53
|
+
var row1 = createRowWithCells(["A", ""]);
|
|
54
|
+
var row2 = createRowWithCells(["", "D"]);
|
|
54
55
|
tbody.appendChild(row1);
|
|
55
56
|
tbody.appendChild(row2);
|
|
56
57
|
table.appendChild(tbody);
|
|
57
|
-
|
|
58
|
+
var expectedResult = [
|
|
58
59
|
["A", ""],
|
|
59
60
|
["", "D"],
|
|
60
61
|
];
|
|
61
62
|
expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
|
|
62
63
|
});
|
|
63
|
-
test("handle table header (th) cells", ()
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
test("handle table header (th) cells", function () {
|
|
65
|
+
var table = document.createElement("table");
|
|
66
|
+
var tbody = document.createElement("tbody");
|
|
67
|
+
var headerRow = createRowWithCells(["Header 1", "Header 2"], "th");
|
|
68
|
+
var dataRow = createRowWithCells(["A", "B"]);
|
|
68
69
|
tbody.appendChild(headerRow);
|
|
69
70
|
tbody.appendChild(dataRow);
|
|
70
71
|
table.appendChild(tbody);
|
|
71
|
-
|
|
72
|
+
var expectedResult = [
|
|
72
73
|
["Header 1", "Header 2"],
|
|
73
74
|
["A", "B"],
|
|
74
75
|
];
|
|
75
76
|
expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
|
|
76
77
|
});
|
|
77
|
-
test("handles tables with multiple tbody elements", ()
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
test("handles tables with multiple tbody elements", function () {
|
|
79
|
+
var table = document.createElement("table");
|
|
80
|
+
var tbody1 = document.createElement("tbody");
|
|
81
|
+
var row1 = createRowWithCells(["A", "B"]);
|
|
81
82
|
tbody1.appendChild(row1);
|
|
82
83
|
table.appendChild(tbody1);
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
var tbody2 = document.createElement("tbody");
|
|
85
|
+
var row2 = createRowWithCells(["C", "D"]);
|
|
85
86
|
tbody2.appendChild(row2);
|
|
86
87
|
table.appendChild(tbody2);
|
|
87
|
-
|
|
88
|
+
var expectedResult = [
|
|
88
89
|
["A", "B"],
|
|
89
90
|
["C", "D"],
|
|
90
91
|
];
|
|
91
92
|
expect(utils_1.htmlUtils.extractTableValues(table)).toEqual(expectedResult);
|
|
92
93
|
});
|
|
93
|
-
test("handles tables that are not MxN", ()
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
test("handles tables that are not MxN", function () {
|
|
95
|
+
var table = document.createElement("table");
|
|
96
|
+
var tbody1 = document.createElement("tbody");
|
|
97
|
+
var row1 = createRowWithCells(["A", "B"]);
|
|
97
98
|
tbody1.appendChild(row1);
|
|
98
99
|
table.appendChild(tbody1);
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
var tbody2 = document.createElement("tbody");
|
|
101
|
+
var row2 = createRowWithCells(["C", "D", "E"]);
|
|
101
102
|
tbody2.appendChild(row2);
|
|
102
103
|
table.appendChild(tbody2);
|
|
103
|
-
|
|
104
|
+
var expectedResult = [
|
|
104
105
|
["A", "B"],
|
|
105
106
|
["C", "D", "E"],
|
|
106
107
|
];
|
|
@@ -10,50 +10,103 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
11
|
});
|
|
12
12
|
};
|
|
13
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
14
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
15
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
16
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
17
|
+
function step(op) {
|
|
18
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
19
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
20
|
+
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;
|
|
21
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
22
|
+
switch (op[0]) {
|
|
23
|
+
case 0: case 1: t = op; break;
|
|
24
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
25
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
26
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
27
|
+
default:
|
|
28
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
29
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
30
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
31
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
32
|
+
if (t[2]) _.ops.pop();
|
|
33
|
+
_.trys.pop(); continue;
|
|
34
|
+
}
|
|
35
|
+
op = body.call(thisArg, _);
|
|
36
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
37
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
38
|
+
}
|
|
39
|
+
};
|
|
13
40
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
41
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
42
|
};
|
|
16
43
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
44
|
+
var util_1 = require("util");
|
|
45
|
+
var mashupDocumentParser_1 = require("../src/utils/mashupDocumentParser");
|
|
46
|
+
var utils_1 = require("../src/utils");
|
|
47
|
+
var mocks_1 = require("./mocks");
|
|
48
|
+
var base64_js_1 = __importDefault(require("base64-js"));
|
|
49
|
+
var jszip_1 = __importDefault(require("jszip"));
|
|
50
|
+
var workbookTemplate_1 = require("../src/workbookTemplate");
|
|
51
|
+
var constants_1 = require("../src/utils/constants");
|
|
52
|
+
var util_2 = __importDefault(require("util"));
|
|
26
53
|
global.TextDecoder = util_1.TextDecoder;
|
|
27
54
|
global.TextEncoder = util_1.TextEncoder;
|
|
28
|
-
describe("Mashup Document Parser tests", ()
|
|
29
|
-
test("ReplaceSingleQuery test", ()
|
|
55
|
+
describe("Mashup Document Parser tests", function () {
|
|
56
|
+
test("ReplaceSingleQuery test", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
57
|
+
var defaultZipFile, originalBase64Str, replacedQueryBase64Str, buffer, mashupArray, startArray, packageSize, packageOPC, zip, section1m, mocksection1;
|
|
30
58
|
var _a;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
59
|
+
return __generator(this, function (_b) {
|
|
60
|
+
switch (_b.label) {
|
|
61
|
+
case 0: return [4 /*yield*/, jszip_1.default.loadAsync(workbookTemplate_1.SIMPLE_QUERY_WORKBOOK_TEMPLATE, { base64: true })];
|
|
62
|
+
case 1:
|
|
63
|
+
defaultZipFile = _b.sent();
|
|
64
|
+
return [4 /*yield*/, utils_1.pqUtils.getBase64(defaultZipFile)];
|
|
65
|
+
case 2:
|
|
66
|
+
originalBase64Str = _b.sent();
|
|
67
|
+
if (!originalBase64Str) return [3 /*break*/, 6];
|
|
68
|
+
return [4 /*yield*/, (0, mashupDocumentParser_1.replaceSingleQuery)(originalBase64Str, "newQueryName", mocks_1.section1mNewQueryNameSimpleMock)];
|
|
69
|
+
case 3:
|
|
70
|
+
replacedQueryBase64Str = _b.sent();
|
|
71
|
+
buffer = base64_js_1.default.toByteArray(replacedQueryBase64Str).buffer;
|
|
72
|
+
mashupArray = new utils_1.arrayUtils.ArrayReader(buffer);
|
|
73
|
+
startArray = mashupArray.getBytes(4);
|
|
74
|
+
packageSize = mashupArray.getInt32();
|
|
75
|
+
packageOPC = mashupArray.getBytes(packageSize);
|
|
76
|
+
return [4 /*yield*/, jszip_1.default.loadAsync(packageOPC)];
|
|
77
|
+
case 4:
|
|
78
|
+
zip = _b.sent();
|
|
79
|
+
return [4 /*yield*/, ((_a = zip.file(constants_1.section1mPath)) === null || _a === void 0 ? void 0 : _a.async("text"))];
|
|
80
|
+
case 5:
|
|
81
|
+
section1m = _b.sent();
|
|
82
|
+
if (section1m) {
|
|
83
|
+
mocksection1 = mocks_1.section1mNewQueryNameSimpleMock.replace(/ /g, "");
|
|
84
|
+
expect(section1m.replace(/ /g, "")).toEqual(mocksection1);
|
|
85
|
+
}
|
|
86
|
+
_b.label = 6;
|
|
87
|
+
case 6: return [2 /*return*/];
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}); });
|
|
91
|
+
test("Power Query MetadataXml test", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
92
|
+
var defaultZipFile, originalBase64Str, metadata, newMetadataArray, metadataString;
|
|
93
|
+
return __generator(this, function (_a) {
|
|
94
|
+
switch (_a.label) {
|
|
95
|
+
case 0: return [4 /*yield*/, jszip_1.default.loadAsync(workbookTemplate_1.SIMPLE_QUERY_WORKBOOK_TEMPLATE, { base64: true })];
|
|
96
|
+
case 1:
|
|
97
|
+
defaultZipFile = _a.sent();
|
|
98
|
+
return [4 /*yield*/, utils_1.pqUtils.getBase64(defaultZipFile)];
|
|
99
|
+
case 2:
|
|
100
|
+
originalBase64Str = _a.sent();
|
|
101
|
+
if (originalBase64Str) {
|
|
102
|
+
metadata = (0, mashupDocumentParser_1.getPackageComponents)(originalBase64Str).metadata;
|
|
103
|
+
newMetadataArray = (0, mashupDocumentParser_1.editSingleQueryMetadata)(metadata, { queryName: "newQueryName" });
|
|
104
|
+
metadataString = new util_2.default.TextDecoder("utf-8").decode(newMetadataArray);
|
|
105
|
+
expect(metadataString.replace(/ /g, "")).toContain(mocks_1.pqMetadataXmlMockPart1.replace(/ /g, ""));
|
|
106
|
+
expect(metadataString.replace(/ /g, "")).toContain(mocks_1.pqMetadataXmlMockPart2.replace(/ /g, ""));
|
|
107
|
+
}
|
|
108
|
+
return [2 /*return*/];
|
|
45
109
|
}
|
|
46
|
-
}
|
|
47
|
-
}));
|
|
48
|
-
test("Power Query MetadataXml test", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
-
const defaultZipFile = yield jszip_1.default.loadAsync(workbookTemplate_1.SIMPLE_QUERY_WORKBOOK_TEMPLATE, { base64: true });
|
|
50
|
-
const originalBase64Str = yield utils_1.pqUtils.getBase64(defaultZipFile);
|
|
51
|
-
if (originalBase64Str) {
|
|
52
|
-
const { metadata } = (0, mashupDocumentParser_1.getPackageComponents)(originalBase64Str);
|
|
53
|
-
const newMetadataArray = (0, mashupDocumentParser_1.editSingleQueryMetadata)(metadata, { queryName: "newQueryName" });
|
|
54
|
-
const metadataString = new util_2.default.TextDecoder("utf-8").decode(newMetadataArray);
|
|
55
|
-
expect(metadataString.replace(/ /g, "")).toContain(mocks_1.pqMetadataXmlMockPart1.replace(/ /g, ""));
|
|
56
|
-
expect(metadataString.replace(/ /g, "")).toContain(mocks_1.pqMetadataXmlMockPart2.replace(/ /g, ""));
|
|
57
|
-
}
|
|
58
|
-
}));
|
|
110
|
+
});
|
|
111
|
+
}); });
|
|
59
112
|
});
|
|
@@ -4,4 +4,4 @@ exports.relationshipInfo = exports.item2Path = exports.item1Path = exports.pqEmp
|
|
|
4
4
|
exports.pqEmptySingleQueryBase64 = "AAAAAD8DAABQSwMEFAACAAgANG8kVJyKlF+iAAAA9QAAABIAHABDb25maWcvUGFja2FnZS54bWwgohgAKKAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAhY+xDoIwFEV/hXSnLXUR8iiDqyQmROPaQMVGeBhaLP/m4Cf5C2IUdXO8557h3vv1BtnYNsFF99Z0mJKIchJoLLvKYJ2SwR3CJckkbFR5UrUOJhltMtoqJUfnzglj3nvqF7TrayY4j9g+XxflUbeKfGTzXw4NWqew1ETC7jVGChrHVHBBObCZQW7w24tp7rP9gbAaGjf0WmoMtwWwOQJ7X5APUEsDBBQAAgAIADRvJFQPyumrpAAAAOkAAAATABwAW0NvbnRlbnRfVHlwZXNdLnhtbCCiGAAooBQAAAAAAAAAAAAAAAAAAAAAAAAAAABtjksOwjAMRK8SeZ+6sEAINWUB3IALRMH9iOajxkXhbCw4ElcgbXeIpWfmeebzelfHZAfxoDH23inYFCUIcsbfetcqmLiRezjW1fUZKIocdVFBxxwOiNF0ZHUsfCCXncaPVnM+xxaDNnfdEm7LcofGOybHkucfUFdnavQ0sLikLK+1GQdxWnNzlQKmxLjI+JewP3kdwtAbzdnEJG2UdiFxGV5/AVBLAwQUAAIACAA0byRUPfc/WjsAAABKAAAAEwAcAEZvcm11bGFzL1NlY3Rpb24xLm0gohgAKKAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAK05NLsnMz1MIhtCG1rxcvFzFGYlFqSkKgaWpRZWGCrYKOaklvFwKQBCcX1qUnAoUUVLi5crMQxa0BgBQSwECLQAUAAIACAA0byRUnIqUX6IAAAD1AAAAEgAAAAAAAAAAAAAAAAAAAAAAQ29uZmlnL1BhY2thZ2UueG1sUEsBAi0AFAACAAgANG8kVA/K6aukAAAA6QAAABMAAAAAAAAAAAAAAAAA7gAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAIACAA0byRUPfc/WjsAAABKAAAAEwAAAAAAAAAAAAAAAADfAQAARm9ybXVsYXMvU2VjdGlvbjEubVBLBQYAAAAAAwADAMIAAABnAgAAAAAQAQAA77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48UGVybWlzc2lvbkxpc3QgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PENhbkV2YWx1YXRlRnV0dXJlUGFja2FnZXM+ZmFsc2U8L0NhbkV2YWx1YXRlRnV0dXJlUGFja2FnZXM+PEZpcmV3YWxsRW5hYmxlZD50cnVlPC9GaXJld2FsbEVuYWJsZWQ+PC9QZXJtaXNzaW9uTGlzdD5XBwAAAAAAADUHAADvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxMb2NhbFBhY2thZ2VNZXRhZGF0YUZpbGUgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+PEl0ZW1zPjxJdGVtPjxJdGVtTG9jYXRpb24+PEl0ZW1UeXBlPkFsbEZvcm11bGFzPC9JdGVtVHlwZT48SXRlbVBhdGggLz48L0l0ZW1Mb2NhdGlvbj48U3RhYmxlRW50cmllcyAvPjwvSXRlbT48SXRlbT48SXRlbUxvY2F0aW9uPjxJdGVtVHlwZT5Gb3JtdWxhPC9JdGVtVHlwZT48SXRlbVBhdGg+U2VjdGlvbjEvUXVlcnkxPC9JdGVtUGF0aD48L0l0ZW1Mb2NhdGlvbj48U3RhYmxlRW50cmllcz48RW50cnkgVHlwZT0iSXNQcml2YXRlIiBWYWx1ZT0ibDAiIC8+PEVudHJ5IFR5cGU9IkZpbGxFbmFibGVkIiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IkZpbGxPYmplY3RUeXBlIiBWYWx1ZT0ic1RhYmxlIiAvPjxFbnRyeSBUeXBlPSJGaWxsVG9EYXRhTW9kZWxFbmFibGVkIiBWYWx1ZT0ibDAiIC8+PEVudHJ5IFR5cGU9IkJ1ZmZlck5leHRSZWZyZXNoIiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IlJlc3VsdFR5cGUiIFZhbHVlPSJzVGV4dCIgLz48RW50cnkgVHlwZT0iTmFtZVVwZGF0ZWRBZnRlckZpbGwiIFZhbHVlPSJsMCIgLz48RW50cnkgVHlwZT0iTmF2aWdhdGlvblN0ZXBOYW1lIiBWYWx1ZT0ic05hdmlnYXRpb24iIC8+PEVudHJ5IFR5cGU9IkZpbGxUYXJnZXQiIFZhbHVlPSJzUXVlcnkxIiAvPjxFbnRyeSBUeXBlPSJGaWxsZWRDb21wbGV0ZVJlc3VsdFRvV29ya3NoZWV0IiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IkFkZGVkVG9EYXRhTW9kZWwiIFZhbHVlPSJsMCIgLz48RW50cnkgVHlwZT0iRmlsbENvdW50IiBWYWx1ZT0ibDEiIC8+PEVudHJ5IFR5cGU9IkZpbGxFcnJvckNvZGUiIFZhbHVlPSJzVW5rbm93biIgLz48RW50cnkgVHlwZT0iRmlsbEVycm9yQ291bnQiIFZhbHVlPSJsMCIgLz48RW50cnkgVHlwZT0iRmlsbExhc3RVcGRhdGVkIiBWYWx1ZT0iZDIwMjItMDEtMDRUMTM6NTc6NDEuNDI4Njg3NloiIC8+PEVudHJ5IFR5cGU9IkZpbGxDb2x1bW5UeXBlcyIgVmFsdWU9InNCZz09IiAvPjxFbnRyeSBUeXBlPSJGaWxsQ29sdW1uTmFtZXMiIFZhbHVlPSJzWyZxdW90O1F1ZXJ5MSZxdW90O10iIC8+PEVudHJ5IFR5cGU9IkZpbGxTdGF0dXMiIFZhbHVlPSJzQ29tcGxldGUiIC8+PEVudHJ5IFR5cGU9IlJlbGF0aW9uc2hpcEluZm9Db250YWluZXIiIFZhbHVlPSJzeyZxdW90O2NvbHVtbkNvdW50JnF1b3Q7OjEsJnF1b3Q7a2V5Q29sdW1uTmFtZXMmcXVvdDs6W10sJnF1b3Q7cXVlcnlSZWxhdGlvbnNoaXBzJnF1b3Q7OltdLCZxdW90O2NvbHVtbklkZW50aXRpZXMmcXVvdDs6WyZxdW90O1NlY3Rpb24xL1F1ZXJ5MS9BdXRvUmVtb3ZlZENvbHVtbnMxLntRdWVyeTEsMH0mcXVvdDtdLCZxdW90O0NvbHVtbkNvdW50JnF1b3Q7OjEsJnF1b3Q7S2V5Q29sdW1uTmFtZXMmcXVvdDs6W10sJnF1b3Q7Q29sdW1uSWRlbnRpdGllcyZxdW90OzpbJnF1b3Q7U2VjdGlvbjEvUXVlcnkxL0F1dG9SZW1vdmVkQ29sdW1uczEue1F1ZXJ5MSwwfSZxdW90O10sJnF1b3Q7UmVsYXRpb25zaGlwSW5mbyZxdW90OzpbXX0iIC8+PC9TdGFibGVFbnRyaWVzPjwvSXRlbT48SXRlbT48SXRlbUxvY2F0aW9uPjxJdGVtVHlwZT5Gb3JtdWxhPC9JdGVtVHlwZT48SXRlbVBhdGg+U2VjdGlvbjEvUXVlcnkxL1NvdXJjZTwvSXRlbVBhdGg+PC9JdGVtTG9jYXRpb24+PFN0YWJsZUVudHJpZXMgLz48L0l0ZW0+PC9JdGVtcz48L0xvY2FsUGFja2FnZU1ldGFkYXRhRmlsZT4WAAAAUEsFBgAAAAAAAAAAAAAAAAAAAAAAANoAAAABAAAA0Iyd3wEV0RGMegDAT8KX6wEAAABs6pJSrvyBRolDTEcY9br+AAAAAAIAAAAAAANmAADAAAAAEAAAAM2ABqrkUHWLIjutmwT8aSwAAAAABIAAAKAAAAAQAAAAB++4pk2c38nl+B8CQ1xQ8lAAAACDTggVTXdcei1dA4QpS2EM3j9zDxuLROzPcF+VlD3TOHucdUilnfVGiFgRj6oDphatETwcwgkP+xXB4TixbYvDp90yn7ajFFbVBH41sxK+ExQAAADnUwPj8oZDOcsaCAlZ2Clo8VQMmw==";
|
|
5
5
|
exports.item1Path = "customXml/item1.xml";
|
|
6
6
|
exports.item2Path = "customXml/item2.xml";
|
|
7
|
-
exports.relationshipInfo =
|
|
7
|
+
exports.relationshipInfo = "s{\"columnCount\":1,\"keyColumnNames\":[],\"queryRelationships\":[],\"columnIdentities\":[\"Section1/newQueryName/AutoRemovedColumns1.{newQueryName,0}\"],\"ColumnCount\":1,\"KeyColumnNames\":[],\"ColumnIdentities\":[\"Section1/newQueryName/AutoRemovedColumns1.{newQueryName,0}\"],\"RelationshipInfo\":[]}";
|
|
@@ -1,18 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.section1mNewQueryNameBlankMock = exports.section1mNewQueryNameSimpleMock = exports.section1mBlankQueryMock = exports.section1mSimpleQueryMock = exports.simpleQueryMock = void 0;
|
|
4
|
-
exports.simpleQueryMock =
|
|
5
|
-
|
|
6
|
-
Source =
|
|
7
|
-
|
|
8
|
-
Source
|
|
9
|
-
exports.section1mSimpleQueryMock = `section Section1;
|
|
10
|
-
|
|
11
|
-
shared Query1 =
|
|
12
|
-
${exports.simpleQueryMock};`;
|
|
13
|
-
exports.section1mBlankQueryMock = `section Section1;\r\n\r\nshared Query1 = let\r\n Source = ""\r\nin\r\n Source;`;
|
|
14
|
-
exports.section1mNewQueryNameSimpleMock = `section Section1;
|
|
15
|
-
|
|
16
|
-
shared newQueryName =
|
|
17
|
-
${exports.simpleQueryMock};`;
|
|
18
|
-
exports.section1mNewQueryNameBlankMock = `section Section1;\r\n\r\nshared newQueryName = let\r\n Source = ""\r\nin\r\n Source;`;
|
|
4
|
+
exports.simpleQueryMock = "shared newQueryName = \n let\n Source = Folder.Files(\"C:\\Users\\user1\\Desktop\\test\")\nin\n Source";
|
|
5
|
+
exports.section1mSimpleQueryMock = "section Section1;\n\n shared Query1 =\n ".concat(exports.simpleQueryMock, ";");
|
|
6
|
+
exports.section1mBlankQueryMock = "section Section1;\r\n\r\nshared Query1 = let\r\n Source = \"\"\r\nin\r\n Source;";
|
|
7
|
+
exports.section1mNewQueryNameSimpleMock = "section Section1;\n\n shared newQueryName =\n ".concat(exports.simpleQueryMock, ";");
|
|
8
|
+
exports.section1mNewQueryNameBlankMock = "section Section1;\r\n\r\nshared newQueryName = let\r\n Source = \"\"\r\nin\r\n Source;";
|
|
@@ -6,7 +6,7 @@ exports.sheetsXmlMock = '<sheetData><row r="1" spans="1:2" x14ac:dyDescent="0.3"
|
|
|
6
6
|
exports.addZeroSheetsXmlMock = '<sheetData><row r="1" spans="1:2" x14ac:dyDescent="0.3"><c r="A1" t="str"><v>Column1</v></c><c r="B1" t="str"><v>Column2</v></c></row><row r="2" spans="1:2" x14ac:dyDescent="0.3"><c r="A2" t="str"><v>one</v></c><c r="B2" t="1"><v>0</v></c></row><row r="3" spans="1:2" x14ac:dyDescent="0.3"><c r="A3" t="str"><v>two</v></c><c r="B3" t="1"><v>2</v></c></row></sheetData>';
|
|
7
7
|
exports.workbookXmlMock = '<definedName name="ExternalData_1" localSheetId="0" hidden="1">Sheet1!$A$1:$B$2</definedName>';
|
|
8
8
|
exports.queryTableMock = '<queryTableRefresh nextId="3"><queryTableFields count="2"><queryTableField id="1" name="Column1" tableColumnId="1"/><queryTableField id="2" name="Column2" tableColumnId="2"/></queryTableFields></queryTableRefresh></queryTable>';
|
|
9
|
-
exports.sharedStringsXmlMock =
|
|
10
|
-
exports.existingSharedStringsXmlMock =
|
|
9
|
+
exports.sharedStringsXmlMock = "<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"2\" uniqueCount=\"2\"><si><t>Query1</t></si><si><t/></si><si><t>newQueryName</t></si></sst>";
|
|
10
|
+
exports.existingSharedStringsXmlMock = "<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"1\" uniqueCount=\"1\"><si><t>newQueryName</t></si><si><t/></si></sst>";
|
|
11
11
|
exports.pqMetadataXmlMockPart1 = '<LocalPackageMetadataFile xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Items> <Item> <ItemLocation> <ItemType>AllFormulas</ItemType> <ItemPath/> </ItemLocation> <StableEntries/> </Item> <Item> <ItemLocation> <ItemType>Formula</ItemType> <ItemPath>Section1/newQueryName</ItemPath> </ItemLocation> <StableEntries> <Entry Type="IsPrivate" Value="l0"/> <Entry Type="FillEnabled" Value="l1"/> <Entry Type="FillObjectType" Value="sTable"/> <Entry Type="FillToDataModelEnabled" Value="l0"/> <Entry Type="BufferNextRefresh" Value="l1"/> <Entry Type="ResultType" Value="sTable"/> <Entry Type="NameUpdatedAfterFill" Value="l0"/> <Entry Type="NavigationStepName" Value="sNavigation"/> <Entry Type="FillTarget" Value="sQuery1"/> <Entry Type="FilledCompleteResultToWorksheet" Value="l1"/> <Entry Type="AddedToDataModel" Value="l0"/> <Entry Type="FillCount" Value="l1"/> <Entry Type="FillErrorCode" Value="sUnknown"/> <Entry Type="FillErrorCount" Value="l0"/>';
|
|
12
12
|
exports.pqMetadataXmlMockPart2 = '<Entry Type="FillColumnTypes" Value="sBg=="/> <Entry Type="FillColumnNames" Value="s["Query1"]"/> <Entry Type="FillStatus" Value="sComplete"/> <Entry Type="RelationshipInfoContainer" Value="s{"columnCount":1,"keyColumnNames":[],"queryRelationships":[],"columnIdentities":["Section1/Query1/AutoRemovedColumns1.{Query1,0}"],"ColumnCount":1,"KeyColumnNames":[],"ColumnIdentities":["Section1/Query1/AutoRemovedColumns1.{Query1,0}"],"RelationshipInfo":[]}"/> </StableEntries> </Item> <Item> <ItemLocation> <ItemType>Formula</ItemType> <ItemPath>Section1/newQueryName/Source</ItemPath> </ItemLocation> <StableEntries/> </Item> </Items> </LocalPackageMetadataFile>';
|