@sme.up/doc-alchemist 1.0.0-SNAPSHOT-20250613100107
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 +129 -0
- package/dist/assets/sample-data.d.ts +21 -0
- package/dist/assets/sample-data.js +235 -0
- package/dist/assets/sample-data.js.map +1 -0
- package/dist/debug.d.ts +1 -0
- package/dist/debug.js +20 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/src/excel/excel-generator.d.ts +14 -0
- package/dist/src/excel/excel-generator.js +415 -0
- package/dist/src/excel/excel-generator.js.map +1 -0
- package/dist/src/excel/excel-generator.types.d.ts +21 -0
- package/dist/src/excel/excel-generator.types.js +26 -0
- package/dist/src/excel/excel-generator.types.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pdf/pdf-generator.d.ts +6 -0
- package/dist/src/pdf/pdf-generator.js +5 -0
- package/dist/src/pdf/pdf-generator.js.map +1 -0
- package/dist/src/types/index.d.ts +38 -0
- package/dist/src/types/index.js +15 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/utils/datastructure-utility.d.ts +2 -0
- package/dist/src/utils/datastructure-utility.js +5 -0
- package/dist/src/utils/datastructure-utility.js.map +1 -0
- package/dist/src/utils/dates-utility.d.ts +10 -0
- package/dist/src/utils/dates-utility.js +55 -0
- package/dist/src/utils/dates-utility.js.map +1 -0
- package/dist/src/utils/generator-utility.d.ts +31 -0
- package/dist/src/utils/generator-utility.js +113 -0
- package/dist/src/utils/generator-utility.js.map +1 -0
- package/dist/src/utils/math-utility.d.ts +10 -0
- package/dist/src/utils/math-utility.js +161 -0
- package/dist/src/utils/math-utility.js.map +1 -0
- package/dist/src/utils/objects-utility.d.ts +4 -0
- package/dist/src/utils/objects-utility.js +16 -0
- package/dist/src/utils/objects-utility.js.map +1 -0
- package/dist/src/utils/regex-utility.d.ts +1 -0
- package/dist/src/utils/regex-utility.js +4 -0
- package/dist/src/utils/regex-utility.js.map +1 -0
- package/dist/tests/excel-generator.test.d.ts +17 -0
- package/dist/tests/excel-generator.test.js +287 -0
- package/dist/tests/excel-generator.test.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import { SmeupDataStructureType, } from "@sme.up/kokos-sdk-node";
|
|
2
|
+
import { addStyleToExceljsRow, dataTableToExcelWorkbook, getExcelNumFormat, smeupFormulaToExcelFormula, } from "../src";
|
|
3
|
+
import { SupportedExportFormats } from "../src/types";
|
|
4
|
+
import ExcelJS from "exceljs";
|
|
5
|
+
import { table_sample_1, table_sample_2 } from "../assets/sample-data.js";
|
|
6
|
+
const Workbook = ExcelJS.Workbook;
|
|
7
|
+
// #region Tests
|
|
8
|
+
describe("Export Manager Test", () => {
|
|
9
|
+
it("Formula conversion", () => {
|
|
10
|
+
const formulaExamples = {
|
|
11
|
+
["[N1]+[N2]"]: "A1+B1", // Row 1
|
|
12
|
+
["1+1"]: "1+1", // Row 2
|
|
13
|
+
["[N1]+[N2]+[N3]+[N4]"]: "A3+B3+C3+D3", // Row 3
|
|
14
|
+
["1,234+1,0001"]: "1.234+1.0001", // Row 4
|
|
15
|
+
["[N1]+[N2]-[N1]-[N2]"]: "A5+B5-A5-B5", // Row 5
|
|
16
|
+
["([N1]+[N2]/[N3]+[N4])/10"]: "(A6+B6/C6+D6)/10", // Row 6
|
|
17
|
+
["[N1]*[N2]"]: "A7*B7", // Row 7
|
|
18
|
+
["[N1]/0"]: "A8/0", // Row 8
|
|
19
|
+
["([N1]+[N2])-[N1]"]: "(A9+B9)-A9", // Row 9
|
|
20
|
+
["([N1]+[N120])"]: "(A10+DP10)", // Row 10
|
|
21
|
+
};
|
|
22
|
+
Object.keys(formulaExamples).forEach((smeupFormula, i) => {
|
|
23
|
+
expect(smeupFormulaToExcelFormula(smeupFormula, i, getColumns(120))).toBe(formulaExamples[smeupFormula]);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
it("Number format creation", () => {
|
|
27
|
+
const cellsFormatNumbers = [
|
|
28
|
+
{
|
|
29
|
+
data: {
|
|
30
|
+
decimals: 0,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
data: {
|
|
35
|
+
decimals: 1,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
data: {
|
|
40
|
+
decimals: 2,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
data: {
|
|
45
|
+
decimals: 3,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
data: {
|
|
50
|
+
decimals: 4,
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
cellsFormatNumbers.forEach((cell, index) => {
|
|
55
|
+
const format = "0." + `${index > 0 ? "0".repeat(index) : "00"}`;
|
|
56
|
+
expect(getExcelNumFormat(cell.data?.decimals ?? 0, cell.data ?? 0)).toBe(format + ";[Red]-" + format);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("SmeupDataTable export", () => {
|
|
60
|
+
it("xlsx format", async () => {
|
|
61
|
+
const workbook = dataTableToExcelWorkbook(table_sample_1, SupportedExportFormats.XLSX, {});
|
|
62
|
+
const worksheet = workbook.getWorksheet(1);
|
|
63
|
+
// Test number of columns
|
|
64
|
+
expect(worksheet?.columnCount).toBe(8);
|
|
65
|
+
// Test number of rows
|
|
66
|
+
expect(worksheet?.actualRowCount).toBe(3);
|
|
67
|
+
});
|
|
68
|
+
it("csv format", async () => {
|
|
69
|
+
const workbook = dataTableToExcelWorkbook(table_sample_1, SupportedExportFormats.CSV, {});
|
|
70
|
+
const worksheet = workbook.getWorksheet(1);
|
|
71
|
+
// Test number of columns
|
|
72
|
+
expect(worksheet?.columnCount).toBe(8);
|
|
73
|
+
// Test number of rows
|
|
74
|
+
expect(worksheet?.actualRowCount).toBe(3);
|
|
75
|
+
});
|
|
76
|
+
it("txt format", async () => {
|
|
77
|
+
const workbook = dataTableToExcelWorkbook(table_sample_1, SupportedExportFormats.TXT, {});
|
|
78
|
+
const worksheet = workbook.getWorksheet(1);
|
|
79
|
+
// Test number of columns
|
|
80
|
+
expect(worksheet?.columnCount).toBe(8);
|
|
81
|
+
// Test number of rows
|
|
82
|
+
expect(worksheet?.actualRowCount).toBe(3);
|
|
83
|
+
});
|
|
84
|
+
it("With groups and outline 2 levels", async () => {
|
|
85
|
+
const workbook = dataTableToExcelWorkbook(table_sample_2, SupportedExportFormats.XLSX, {});
|
|
86
|
+
const worksheet = workbook.getWorksheet(1);
|
|
87
|
+
expect(worksheet?.getRow(2).outlineLevel).toBe(0);
|
|
88
|
+
expect(worksheet?.getRow(3).outlineLevel).toBe(1);
|
|
89
|
+
expect(worksheet?.getRow(4).outlineLevel).toBe(2);
|
|
90
|
+
expect(worksheet?.getRow(5).outlineLevel).toBe(0);
|
|
91
|
+
expect(worksheet?.getRow(6).outlineLevel).toBe(1);
|
|
92
|
+
expect(worksheet?.getRow(7).outlineLevel).toBe(2);
|
|
93
|
+
});
|
|
94
|
+
it("With totals", async () => {
|
|
95
|
+
const table_totals = JSON.parse(JSON.stringify(table_sample_1));
|
|
96
|
+
table_totals.props = {
|
|
97
|
+
...table_totals.props,
|
|
98
|
+
totals: totals_sample_1,
|
|
99
|
+
};
|
|
100
|
+
const workbook = dataTableToExcelWorkbook(table_totals, SupportedExportFormats.XLSX, {});
|
|
101
|
+
const worksheet = workbook.getWorksheet(1);
|
|
102
|
+
// Test number of columns
|
|
103
|
+
expect(worksheet?.columnCount).toBe(8);
|
|
104
|
+
// Test number of rows
|
|
105
|
+
expect(worksheet?.rowCount).toBe(4);
|
|
106
|
+
// Check totals row
|
|
107
|
+
worksheet?.getRow(4).eachCell((cell) => {
|
|
108
|
+
const columnName = worksheet?.getColumn(cell.col).key;
|
|
109
|
+
if (columnName !== undefined) {
|
|
110
|
+
expect(cell.formula).toBe(data_table_totals_result_sample_1[columnName]);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
it("With groups subtotals correct range and action", () => {
|
|
115
|
+
const totalsExpectedFormula = {
|
|
116
|
+
Count: "SUBTOTAL(3,C2:C2)",
|
|
117
|
+
Sum: "SUBTOTAL(9,C2:C2)",
|
|
118
|
+
Max: "SUBTOTAL(4,C2:C2)",
|
|
119
|
+
Min: "SUBTOTAL(5,C2:C2)",
|
|
120
|
+
Average: "SUBTOTAL(1,C2:C2)",
|
|
121
|
+
};
|
|
122
|
+
const totalsExpectedSubAction = {
|
|
123
|
+
Count: "3",
|
|
124
|
+
Sum: "9",
|
|
125
|
+
Max: "4",
|
|
126
|
+
Min: "5",
|
|
127
|
+
Average: "1",
|
|
128
|
+
};
|
|
129
|
+
Object.keys(totalsExpectedFormula).forEach(async (total) => {
|
|
130
|
+
const workbook = dataTableToExcelWorkbook(table_footer_actions(total, [
|
|
131
|
+
{ column: "1", visible: true },
|
|
132
|
+
{ column: "2", visible: true },
|
|
133
|
+
], 2, 2), SupportedExportFormats.XLSX, {});
|
|
134
|
+
const worksheet = workbook.getWorksheet(1);
|
|
135
|
+
const totalKey = total;
|
|
136
|
+
expect(worksheet?.getRow(2).getCell(3).formula).toBe(`SUBTOTAL(${totalsExpectedSubAction[totalKey]},C3:C5)`);
|
|
137
|
+
expect(worksheet?.getRow(3).getCell(3).formula).toBe(`SUBTOTAL(${totalsExpectedSubAction[totalKey]},C4:C5)`);
|
|
138
|
+
expect(worksheet?.getRow(6).getCell(3).formula).toBe(`SUBTOTAL(${totalsExpectedSubAction[totalKey]},C7:C9)`);
|
|
139
|
+
expect(worksheet?.getRow(7).getCell(3).formula).toBe(`SUBTOTAL(${totalsExpectedSubAction[totalKey]},C8:C9)`);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe("Cell to XLSX Style converter", () => {
|
|
145
|
+
const cellStyle = {
|
|
146
|
+
fontWeight: "bold",
|
|
147
|
+
backgroundColor: "#74c0f2",
|
|
148
|
+
color: "#000000",
|
|
149
|
+
};
|
|
150
|
+
const cellResult = {
|
|
151
|
+
fill: {
|
|
152
|
+
type: "pattern",
|
|
153
|
+
pattern: "solid",
|
|
154
|
+
fgColor: { argb: "FF74c0f2" },
|
|
155
|
+
},
|
|
156
|
+
font: { bold: true, color: { argb: "FF000000" } },
|
|
157
|
+
};
|
|
158
|
+
it("SmeupDataCell - Style calculations", async () => {
|
|
159
|
+
const workbook = new Workbook();
|
|
160
|
+
const worksheet = workbook.addWorksheet("Sheet 1");
|
|
161
|
+
const row = worksheet.addRow(["Mario Rossi"]);
|
|
162
|
+
addStyleToExceljsRow(row, [{ name: "A", title: "A" }], {
|
|
163
|
+
cells: {
|
|
164
|
+
A: {
|
|
165
|
+
value: "",
|
|
166
|
+
obj: {
|
|
167
|
+
t: "",
|
|
168
|
+
p: "",
|
|
169
|
+
k: "",
|
|
170
|
+
},
|
|
171
|
+
style: cellStyle,
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
expect(row.getCell(1).style).toStrictEqual(cellResult);
|
|
176
|
+
});
|
|
177
|
+
it("SmeupDataNode - Style calculations", async () => {
|
|
178
|
+
const workbook = new Workbook();
|
|
179
|
+
const worksheet = workbook.addWorksheet("Sheet 1");
|
|
180
|
+
const row = worksheet.addRow(["Mario Rossi"]);
|
|
181
|
+
addStyleToExceljsRow(row, [{ name: "A", title: "A" }], {
|
|
182
|
+
cells: {
|
|
183
|
+
A: {
|
|
184
|
+
value: "",
|
|
185
|
+
obj: {
|
|
186
|
+
t: "",
|
|
187
|
+
p: "",
|
|
188
|
+
k: "",
|
|
189
|
+
},
|
|
190
|
+
style: {},
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
style: cellStyle,
|
|
194
|
+
});
|
|
195
|
+
expect(row.getCell(1).style).toStrictEqual(cellResult);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
// #endregion
|
|
199
|
+
// #region Assets
|
|
200
|
+
const getColumns = (numberColumns) => {
|
|
201
|
+
const columns = [];
|
|
202
|
+
for (let num = 1; num <= numberColumns; num++) {
|
|
203
|
+
columns.push({
|
|
204
|
+
name: `N${num}`,
|
|
205
|
+
title: "",
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
return columns;
|
|
209
|
+
};
|
|
210
|
+
// Define table_sample_1 for use in tests
|
|
211
|
+
const totals_sample_1 = {
|
|
212
|
+
COL1: "Count",
|
|
213
|
+
COL2: "Distinct",
|
|
214
|
+
HIDDEN_COL: "Sum",
|
|
215
|
+
SUM_COL: "Sum",
|
|
216
|
+
AVG_COL: "Average",
|
|
217
|
+
MIN_COL: "Min",
|
|
218
|
+
MAX_COL: "Max",
|
|
219
|
+
DIFF_COL: `${"MATH"}([HIDDEN_COL]-[SUM_COL])`,
|
|
220
|
+
};
|
|
221
|
+
const data_table_totals_result_sample_1 = {
|
|
222
|
+
COL1: "SUBTOTAL(3,A2:A3)",
|
|
223
|
+
HIDDEN_COL: "SUBTOTAL(9,C2:C3)",
|
|
224
|
+
SUM_COL: "SUBTOTAL(9,D2:D3)",
|
|
225
|
+
AVG_COL: "SUBTOTAL(1,E2:E3)",
|
|
226
|
+
MIN_COL: "SUBTOTAL(5,F2:F3)",
|
|
227
|
+
MAX_COL: "SUBTOTAL(4,G2:G3)",
|
|
228
|
+
DIFF_COL: `(C4-D4)`,
|
|
229
|
+
};
|
|
230
|
+
export const table_footer_actions = (action, groups, rowsNumber = 1, rowRepetitions = 1) => {
|
|
231
|
+
const rows = [];
|
|
232
|
+
for (let i = 0; i < rowsNumber; i++) {
|
|
233
|
+
const rowObj = {
|
|
234
|
+
cells: {
|
|
235
|
+
1: {
|
|
236
|
+
obj: { t: "", p: "", k: "" },
|
|
237
|
+
value: `1-${i}`,
|
|
238
|
+
},
|
|
239
|
+
2: {
|
|
240
|
+
obj: { t: "", p: "", k: "" },
|
|
241
|
+
value: `2-${i}`,
|
|
242
|
+
},
|
|
243
|
+
[`${action}`]: {
|
|
244
|
+
obj: { t: "NR", p: "", k: "10" },
|
|
245
|
+
value: `${i + 1}`,
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
id: `${i}`,
|
|
249
|
+
};
|
|
250
|
+
for (let i = 0; i < rowRepetitions; i++) {
|
|
251
|
+
rows.push(rowObj);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
smeupDataTable: {
|
|
256
|
+
type: SmeupDataStructureType.SmeupDataTable,
|
|
257
|
+
columns: [
|
|
258
|
+
{
|
|
259
|
+
name: "1",
|
|
260
|
+
title: "1title",
|
|
261
|
+
visible: true,
|
|
262
|
+
obj: { t: "", p: "" },
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
name: "2",
|
|
266
|
+
title: "2title",
|
|
267
|
+
visible: true,
|
|
268
|
+
obj: { t: "", p: "" },
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
name: `${action}`,
|
|
272
|
+
title: `${action}title`,
|
|
273
|
+
visible: true,
|
|
274
|
+
obj: { t: "NR", p: "" },
|
|
275
|
+
},
|
|
276
|
+
],
|
|
277
|
+
rows,
|
|
278
|
+
},
|
|
279
|
+
props: {
|
|
280
|
+
groups,
|
|
281
|
+
totals: action ? { [`${action}`]: `${action}` } : [],
|
|
282
|
+
filter: [],
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
};
|
|
286
|
+
// #endregion
|
|
287
|
+
//# sourceMappingURL=excel-generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"excel-generator.test.js","sourceRoot":"","sources":["../../tests/excel-generator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SmeupDataCell,\n SmeupDataRow,\n SmeupDataColumn,\n SmeupDataStructureType,\n SmeupDataNode,\n SmeupDataTable,\n} from \"@sme.up/kokos-sdk-node\";\nimport {\n addStyleToExceljsRow,\n dataTableToExcelWorkbook,\n getExcelNumFormat,\n smeupFormulaToExcelFormula,\n} from \"../src\";\nimport { TotalMode } from \"../src/excel/excel-generator.types\";\nimport { SupportedExportFormats, WebupManagerData } from \"../src/types\";\nimport ExcelJS from \"exceljs\";\nimport { table_sample_1, table_sample_2 } from \"../assets/sample-data.js\";\n\ntype Workbook = ExcelJS.Workbook;\ntype Cell = ExcelJS.Cell;\ntype Row = ExcelJS.Row;\ntype Style = ExcelJS.Style;\nconst Workbook = ExcelJS.Workbook;\n\n// #region Tests\ndescribe(\"Export Manager Test\", () => {\n it(\"Formula conversion\", () => {\n const formulaExamples = {\n [\"[N1]+[N2]\"]: \"A1+B1\", // Row 1\n [\"1+1\"]: \"1+1\", // Row 2\n [\"[N1]+[N2]+[N3]+[N4]\"]: \"A3+B3+C3+D3\", // Row 3\n [\"1,234+1,0001\"]: \"1.234+1.0001\", // Row 4\n [\"[N1]+[N2]-[N1]-[N2]\"]: \"A5+B5-A5-B5\", // Row 5\n [\"([N1]+[N2]/[N3]+[N4])/10\"]: \"(A6+B6/C6+D6)/10\", // Row 6\n [\"[N1]*[N2]\"]: \"A7*B7\", // Row 7\n [\"[N1]/0\"]: \"A8/0\", // Row 8\n [\"([N1]+[N2])-[N1]\"]: \"(A9+B9)-A9\", // Row 9\n [\"([N1]+[N120])\"]: \"(A10+DP10)\", // Row 10\n } as Record<string, string>;\n\n Object.keys(formulaExamples).forEach((smeupFormula, i) => {\n expect(smeupFormulaToExcelFormula(smeupFormula, i, getColumns(120))).toBe(\n formulaExamples[smeupFormula],\n );\n });\n });\n\n it(\"Number format creation\", () => {\n const cellsFormatNumbers: Partial<SmeupDataCell>[] = [\n {\n data: {\n decimals: 0,\n },\n },\n {\n data: {\n decimals: 1,\n },\n },\n {\n data: {\n decimals: 2,\n },\n },\n {\n data: {\n decimals: 3,\n },\n },\n {\n data: {\n decimals: 4,\n },\n },\n ];\n\n cellsFormatNumbers.forEach((cell, index) => {\n const format = \"0.\" + `${index > 0 ? \"0\".repeat(index) : \"00\"}`;\n expect(\n getExcelNumFormat(\n (cell.data?.decimals as number) ?? 0,\n (cell.data as unknown as number) ?? 0,\n ),\n ).toBe(format + \";[Red]-\" + format);\n });\n });\n\n describe(\"SmeupDataTable export\", () => {\n it(\"xlsx format\", async () => {\n const workbook: Workbook = dataTableToExcelWorkbook(\n table_sample_1,\n SupportedExportFormats.XLSX,\n {} as WebupManagerData,\n );\n const worksheet = workbook.getWorksheet(1);\n // Test number of columns\n expect(worksheet?.columnCount).toBe(8);\n // Test number of rows\n expect(worksheet?.actualRowCount).toBe(3);\n });\n\n it(\"csv format\", async () => {\n const workbook: Workbook = dataTableToExcelWorkbook(\n table_sample_1,\n SupportedExportFormats.CSV,\n {} as WebupManagerData,\n );\n const worksheet = workbook.getWorksheet(1);\n // Test number of columns\n expect(worksheet?.columnCount).toBe(8);\n // Test number of rows\n expect(worksheet?.actualRowCount).toBe(3);\n });\n\n it(\"txt format\", async () => {\n const workbook: Workbook = dataTableToExcelWorkbook(\n table_sample_1,\n SupportedExportFormats.TXT,\n {} as WebupManagerData,\n );\n const worksheet = workbook.getWorksheet(1);\n // Test number of columns\n expect(worksheet?.columnCount).toBe(8);\n // Test number of rows\n expect(worksheet?.actualRowCount).toBe(3);\n });\n\n it(\"With groups and outline 2 levels\", async () => {\n const workbook: Workbook = dataTableToExcelWorkbook(\n table_sample_2,\n SupportedExportFormats.XLSX,\n {} as WebupManagerData,\n );\n const worksheet = workbook.getWorksheet(1);\n expect(worksheet?.getRow(2).outlineLevel).toBe(0);\n expect(worksheet?.getRow(3).outlineLevel).toBe(1);\n expect(worksheet?.getRow(4).outlineLevel).toBe(2);\n expect(worksheet?.getRow(5).outlineLevel).toBe(0);\n expect(worksheet?.getRow(6).outlineLevel).toBe(1);\n expect(worksheet?.getRow(7).outlineLevel).toBe(2);\n });\n\n it(\"With totals\", async () => {\n const table_totals = JSON.parse(JSON.stringify(table_sample_1));\n table_totals.props = {\n ...table_totals.props,\n totals: totals_sample_1,\n };\n\n const workbook: Workbook = dataTableToExcelWorkbook(\n table_totals,\n SupportedExportFormats.XLSX,\n {} as WebupManagerData,\n );\n const worksheet = workbook.getWorksheet(1);\n\n // Test number of columns\n expect(worksheet?.columnCount).toBe(8);\n // Test number of rows\n expect(worksheet?.rowCount).toBe(4);\n // Check totals row\n worksheet?.getRow(4).eachCell((cell: Cell) => {\n const columnName = worksheet?.getColumn(cell.col).key;\n if (columnName !== undefined) {\n expect(cell.formula).toBe(\n data_table_totals_result_sample_1[columnName],\n );\n }\n });\n });\n\n it(\"With groups subtotals correct range and action\", () => {\n const totalsExpectedFormula = {\n Count: \"SUBTOTAL(3,C2:C2)\",\n Sum: \"SUBTOTAL(9,C2:C2)\",\n Max: \"SUBTOTAL(4,C2:C2)\",\n Min: \"SUBTOTAL(5,C2:C2)\",\n Average: \"SUBTOTAL(1,C2:C2)\",\n };\n const totalsExpectedSubAction = {\n Count: \"3\",\n Sum: \"9\",\n Max: \"4\",\n Min: \"5\",\n Average: \"1\",\n };\n\n Object.keys(totalsExpectedFormula).forEach(async total => {\n const workbook: ExcelJS.Workbook = dataTableToExcelWorkbook(\n table_footer_actions(\n total,\n [\n { column: \"1\", visible: true },\n { column: \"2\", visible: true },\n ],\n 2,\n 2,\n ),\n SupportedExportFormats.XLSX,\n {} as WebupManagerData,\n );\n const worksheet = workbook.getWorksheet(1);\n\n const totalKey = total as keyof typeof totalsExpectedSubAction;\n\n expect(worksheet?.getRow(2).getCell(3).formula).toBe(\n `SUBTOTAL(${totalsExpectedSubAction[totalKey]},C3:C5)`,\n );\n expect(worksheet?.getRow(3).getCell(3).formula).toBe(\n `SUBTOTAL(${totalsExpectedSubAction[totalKey]},C4:C5)`,\n );\n expect(worksheet?.getRow(6).getCell(3).formula).toBe(\n `SUBTOTAL(${totalsExpectedSubAction[totalKey]},C7:C9)`,\n );\n expect(worksheet?.getRow(7).getCell(3).formula).toBe(\n `SUBTOTAL(${totalsExpectedSubAction[totalKey]},C8:C9)`,\n );\n });\n });\n });\n});\n\ndescribe(\"Cell to XLSX Style converter\", () => {\n const cellStyle = {\n fontWeight: \"bold\",\n backgroundColor: \"#74c0f2\",\n color: \"#000000\",\n };\n const cellResult = {\n fill: {\n type: \"pattern\",\n pattern: \"solid\",\n fgColor: { argb: \"FF74c0f2\" },\n },\n font: { bold: true, color: { argb: \"FF000000\" } },\n } as Style;\n\n it(\"SmeupDataCell - Style calculations\", async () => {\n const workbook = new Workbook();\n const worksheet = workbook.addWorksheet(\"Sheet 1\");\n\n const row: Row = worksheet.addRow([\"Mario Rossi\"]);\n addStyleToExceljsRow(row, [{ name: \"A\", title: \"A\" }], {\n cells: {\n A: {\n value: \"\",\n obj: {\n t: \"\",\n p: \"\",\n k: \"\",\n },\n style: cellStyle,\n },\n },\n } as SmeupDataRow);\n expect(row.getCell(1).style).toStrictEqual(cellResult);\n });\n it(\"SmeupDataNode - Style calculations\", async () => {\n const workbook = new Workbook();\n const worksheet = workbook.addWorksheet(\"Sheet 1\");\n const row: Row = worksheet.addRow([\"Mario Rossi\"]);\n addStyleToExceljsRow(row, [{ name: \"A\", title: \"A\" }], {\n cells: {\n A: {\n value: \"\",\n obj: {\n t: \"\",\n p: \"\",\n k: \"\",\n },\n style: {},\n },\n },\n style: cellStyle,\n } as unknown as SmeupDataNode);\n expect(row.getCell(1).style).toStrictEqual(cellResult);\n });\n});\n\n// #endregion\n\n// #region Assets\n\nconst getColumns = (numberColumns: number): SmeupDataColumn[] => {\n const columns: SmeupDataColumn[] = [];\n\n for (let num = 1; num <= numberColumns; num++) {\n columns.push({\n name: `N${num}`,\n title: \"\",\n });\n }\n\n return columns;\n};\n\n// Define table_sample_1 for use in tests\nconst totals_sample_1: { [columnName: string]: TotalMode | string } = {\n COL1: \"Count\" as TotalMode,\n COL2: \"Distinct\" as TotalMode,\n HIDDEN_COL: \"Sum\" as TotalMode,\n SUM_COL: \"Sum\" as TotalMode,\n AVG_COL: \"Average\" as TotalMode,\n MIN_COL: \"Min\" as TotalMode,\n MAX_COL: \"Max\" as TotalMode,\n DIFF_COL: `${\"MATH\" as TotalMode}([HIDDEN_COL]-[SUM_COL])`,\n};\n\nconst data_table_totals_result_sample_1: { [key: string]: string } = {\n COL1: \"SUBTOTAL(3,A2:A3)\",\n HIDDEN_COL: \"SUBTOTAL(9,C2:C3)\",\n SUM_COL: \"SUBTOTAL(9,D2:D3)\",\n AVG_COL: \"SUBTOTAL(1,E2:E3)\",\n MIN_COL: \"SUBTOTAL(5,F2:F3)\",\n MAX_COL: \"SUBTOTAL(4,G2:G3)\",\n DIFF_COL: `(C4-D4)`,\n};\n\nexport const table_footer_actions = (\n action: string,\n groups: { column: string; visible: boolean }[],\n rowsNumber: number = 1,\n rowRepetitions: number = 1,\n) => {\n const rows: Array<{\n cells: {\n [key: string]: {\n obj: { t: string; p: string; k: string };\n value: string;\n };\n };\n id: string;\n }> = [];\n for (let i = 0; i < rowsNumber; i++) {\n const rowObj = {\n cells: {\n 1: {\n obj: { t: \"\", p: \"\", k: \"\" },\n value: `1-${i}`,\n },\n 2: {\n obj: { t: \"\", p: \"\", k: \"\" },\n value: `2-${i}`,\n },\n [`${action}`]: {\n obj: { t: \"NR\", p: \"\", k: \"10\" },\n value: `${i + 1}`,\n },\n },\n id: `${i}`,\n };\n for (let i = 0; i < rowRepetitions; i++) {\n rows.push(rowObj);\n }\n }\n return {\n smeupDataTable: {\n type: SmeupDataStructureType.SmeupDataTable,\n columns: [\n {\n name: \"1\",\n title: \"1title\",\n visible: true,\n obj: { t: \"\", p: \"\" },\n },\n {\n name: \"2\",\n title: \"2title\",\n visible: true,\n obj: { t: \"\", p: \"\" },\n },\n {\n name: `${action}`,\n title: `${action}title`,\n visible: true,\n obj: { t: \"NR\", p: \"\" },\n },\n ],\n rows,\n } as SmeupDataTable,\n props: {\n groups,\n totals: action ? { [`${action}`]: `${action}` } : [],\n filter: [],\n },\n };\n};\n// #endregion\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sme.up/doc-alchemist",
|
|
3
|
+
"version": "1.0.0-SNAPSHOT-20250613100107",
|
|
4
|
+
"description": "Library for generating documents in various formats, including Excel and PDF.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"author": "Smeup LAB <info@smeup.com> (https://www.smeup.com/)",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/smeup/doc-alchemist.git"
|
|
10
|
+
},
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"types": "dist/index.d.ts",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist/**/*"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
18
|
+
"clean": "rimraf node_modules",
|
|
19
|
+
"build": "rimraf dist && npx tsc",
|
|
20
|
+
"start": "tsx debug.ts"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@eslint/js": "^9.28.0",
|
|
26
|
+
"@types/exceljs": "^1.3.2",
|
|
27
|
+
"@types/jest": "^29.5.14",
|
|
28
|
+
"@types/node": "^22.15.30",
|
|
29
|
+
"csstype": "^3.1.3",
|
|
30
|
+
"eslint": "^9.28.0",
|
|
31
|
+
"globals": "^16.2.0",
|
|
32
|
+
"jest": "^29.7.0",
|
|
33
|
+
"prettier": "^3.5.3",
|
|
34
|
+
"ts-jest": "^29.3.4",
|
|
35
|
+
"ts-node": "^10.9.2",
|
|
36
|
+
"tsx": "^4.19.4",
|
|
37
|
+
"typescript": "^5.8.3",
|
|
38
|
+
"typescript-eslint": "^8.33.1"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@sme.up/kokos-sdk-node": "^2.2.0-SNAPSHOT",
|
|
42
|
+
"exceljs": "^4.4.0"
|
|
43
|
+
}
|
|
44
|
+
}
|