@allurereport/plugin-classic 3.8.2 → 3.9.0
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/dist/converters.js +1 -1
- package/dist/generators.js +31 -24
- package/dist/writer.d.ts +1 -0
- package/dist/writer.js +32 -13
- package/package.json +7 -6
package/dist/converters.js
CHANGED
package/dist/generators.js
CHANGED
|
@@ -2,7 +2,7 @@ import { readFile } from "node:fs/promises";
|
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { basename, join } from "node:path";
|
|
4
4
|
import { compareBy, createBaseUrlScript, createFontLinkTag, createReportDataScript, stringifyForInlineScript, createScriptTag, createStylesLinkTag, incrementStatistic, nullsLast, ordinal, } from "@allurereport/core-api";
|
|
5
|
-
import { createTreeByCategories, createTreeByLabels,
|
|
5
|
+
import { createTreeByCategories, createTreeByLabels, processTree, } from "@allurereport/plugin-api";
|
|
6
6
|
import { getPieChartValues } from "@allurereport/web-commons";
|
|
7
7
|
import Handlebars from "handlebars";
|
|
8
8
|
import { matchCategories } from "./categories.js";
|
|
@@ -44,6 +44,12 @@ const template = `<!DOCTYPE html>
|
|
|
44
44
|
</body>
|
|
45
45
|
</html>
|
|
46
46
|
`;
|
|
47
|
+
const compiledTemplate = Handlebars.compile(template);
|
|
48
|
+
const writeConcurrently = async (items, write, concurrency = 64) => {
|
|
49
|
+
for (let i = 0; i < items.length; i += concurrency) {
|
|
50
|
+
await Promise.all(items.slice(i, i + concurrency).map(write));
|
|
51
|
+
}
|
|
52
|
+
};
|
|
47
53
|
export const readTemplateManifest = async (singleFileMode) => {
|
|
48
54
|
const templateManifestSource = require.resolve(`@allurereport/web-classic/dist/${singleFileMode ? "single" : "multi"}/manifest.json`);
|
|
49
55
|
const templateManifest = await readFile(templateManifestSource, { encoding: "utf-8" });
|
|
@@ -73,14 +79,15 @@ const createBreadcrumbs = (convertedTr) => {
|
|
|
73
79
|
}, []);
|
|
74
80
|
};
|
|
75
81
|
export const generateTestResults = async (writer, store) => {
|
|
76
|
-
const allTr = await store.allTestResults({
|
|
82
|
+
const allTr = await store.allTestResults({ includeRetries: true });
|
|
83
|
+
const related = await store.relatedByTestResultIds(allTr.map(({ id }) => id));
|
|
84
|
+
const categories = (await store.metadataByKey("allure2_categories")) ?? [];
|
|
77
85
|
let convertedTrs = [];
|
|
78
86
|
for (const tr of allTr) {
|
|
79
|
-
const trFixtures =
|
|
87
|
+
const trFixtures = related.fixturesByTrId.get(tr.id) ?? [];
|
|
80
88
|
const convertedTrFixtures = trFixtures.map(convertFixtureResult);
|
|
81
89
|
const convertedTr = convertTestResult(tr);
|
|
82
90
|
const { error, status, flaky } = convertedTr;
|
|
83
|
-
const categories = (await store.metadataByKey("allure2_categories")) ?? [];
|
|
84
91
|
const matchedCategories = matchCategories(categories, {
|
|
85
92
|
message: error?.message,
|
|
86
93
|
trace: error?.trace,
|
|
@@ -88,12 +95,13 @@ export const generateTestResults = async (writer, store) => {
|
|
|
88
95
|
flaky,
|
|
89
96
|
});
|
|
90
97
|
convertedTr.categories = matchedCategories;
|
|
91
|
-
convertedTr.history =
|
|
92
|
-
convertedTr.retries =
|
|
98
|
+
convertedTr.history = related.historyByTrId.get(tr.id) ?? [];
|
|
99
|
+
convertedTr.retries = related.retriesByTrId.get(tr.id) ?? [];
|
|
93
100
|
convertedTr.retry = convertedTr.retries.length > 0;
|
|
101
|
+
convertedTr.isRetry = tr.isRetry;
|
|
94
102
|
convertedTr.setup = convertedTrFixtures.filter((f) => f.type === "before");
|
|
95
103
|
convertedTr.teardown = convertedTrFixtures.filter((f) => f.type === "after");
|
|
96
|
-
convertedTr.attachments = (
|
|
104
|
+
convertedTr.attachments = (related.attachmentsByTrId.get(tr.id) ?? []).map((attachment) => ({
|
|
97
105
|
link: attachment,
|
|
98
106
|
type: "attachment",
|
|
99
107
|
}));
|
|
@@ -104,14 +112,12 @@ export const generateTestResults = async (writer, store) => {
|
|
|
104
112
|
...tr,
|
|
105
113
|
order: idx + 1,
|
|
106
114
|
}));
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
await writer.writeWidget("nav.json", convertedTrs.filter(({ hidden }) => !hidden).map(({ id }) => id));
|
|
115
|
+
await writeConcurrently(convertedTrs, (convertedTr) => writer.writeTestCase(convertedTr));
|
|
116
|
+
await writer.writeWidget("nav.json", convertedTrs.filter(({ isRetry }) => !isRetry).map(({ id }) => id));
|
|
111
117
|
return convertedTrs;
|
|
112
118
|
};
|
|
113
119
|
export const generateTree = async (writer, treeName, labels, tests) => {
|
|
114
|
-
const visibleTests = tests.filter((test) => !test.
|
|
120
|
+
const visibleTests = tests.filter((test) => !test.isRetry);
|
|
115
121
|
const tree = createTreeByLabels(visibleTests, labels, ({ id, name, status, duration, flaky, transition, start, retries }) => {
|
|
116
122
|
const retriesCount = retries?.length ?? 0;
|
|
117
123
|
return {
|
|
@@ -128,9 +134,10 @@ export const generateTree = async (writer, treeName, labels, tests) => {
|
|
|
128
134
|
}, undefined, (group, leaf) => {
|
|
129
135
|
incrementStatistic(group.statistic, leaf.status);
|
|
130
136
|
});
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
processTree(tree, {
|
|
138
|
+
sort: nullsLast(compareBy("start", ordinal())),
|
|
139
|
+
transform: (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }),
|
|
140
|
+
});
|
|
134
141
|
await writer.writeWidget(`${treeName}.json`, tree);
|
|
135
142
|
};
|
|
136
143
|
export const generateEnvironmentJson = async (writer, env) => {
|
|
@@ -170,7 +177,6 @@ export const generateHistoryDataPoints = async (writer, store) => {
|
|
|
170
177
|
};
|
|
171
178
|
export const generateStaticFiles = async (payload) => {
|
|
172
179
|
const { reportName = "Allure Report", reportLanguage = "en", singleFile, logo = "", theme = "auto", groupBy, reportFiles, reportDataFiles, reportUuid, allureVersion, } = payload;
|
|
173
|
-
const compile = Handlebars.compile(template);
|
|
174
180
|
const manifest = await readTemplateManifest(payload.singleFile);
|
|
175
181
|
const headTags = [];
|
|
176
182
|
const bodyTags = [];
|
|
@@ -213,7 +219,7 @@ export const generateStaticFiles = async (payload) => {
|
|
|
213
219
|
cacheKey: now.toString(),
|
|
214
220
|
};
|
|
215
221
|
try {
|
|
216
|
-
const html =
|
|
222
|
+
const html = compiledTemplate({
|
|
217
223
|
headTags: headTags.join("\n"),
|
|
218
224
|
bodyTags: bodyTags.join("\n"),
|
|
219
225
|
reportFilesScript: createReportDataScript(reportDataFiles),
|
|
@@ -235,7 +241,7 @@ export const generateStaticFiles = async (payload) => {
|
|
|
235
241
|
}
|
|
236
242
|
};
|
|
237
243
|
export const generateTreeByCategories = async (writer, treeName, tests) => {
|
|
238
|
-
const visibleTests = tests.filter((test) => !test.
|
|
244
|
+
const visibleTests = tests.filter((test) => !test.isRetry);
|
|
239
245
|
const tree = createTreeByCategories(visibleTests, ({ id, name, status, duration, flaky, transition, start, retries }) => {
|
|
240
246
|
const retriesCount = retries?.length ?? 0;
|
|
241
247
|
return {
|
|
@@ -252,11 +258,12 @@ export const generateTreeByCategories = async (writer, treeName, tests) => {
|
|
|
252
258
|
}, undefined, (group, leaf) => {
|
|
253
259
|
incrementStatistic(group.statistic, leaf.status);
|
|
254
260
|
});
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
+
processTree(tree, {
|
|
262
|
+
sort: nullsLast(compareBy("start", ordinal())),
|
|
263
|
+
transform: (leaf, idx) => ({
|
|
264
|
+
...leaf,
|
|
265
|
+
groupOrder: idx + 1,
|
|
266
|
+
}),
|
|
267
|
+
});
|
|
261
268
|
await writer.writeWidget(`${treeName}.json`, tree);
|
|
262
269
|
};
|
package/dist/writer.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export interface ClassicDataWriter {
|
|
|
11
11
|
writeAttachment(source: string, file: ResultFile): Promise<void>;
|
|
12
12
|
}
|
|
13
13
|
export declare class FileSystemReportDataWriter implements ClassicDataWriter {
|
|
14
|
+
#private;
|
|
14
15
|
private readonly output;
|
|
15
16
|
constructor(output: string);
|
|
16
17
|
writeData(fileName: string, data: any): Promise<void>;
|
package/dist/writer.js
CHANGED
|
@@ -1,37 +1,56 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
1
7
|
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
8
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
11
|
};
|
|
6
|
-
var _InMemoryReportDataWriter_data;
|
|
12
|
+
var _FileSystemReportDataWriter_dataDir, _FileSystemReportDataWriter_widgetsDir, _FileSystemReportDataWriter_testResultsDir, _FileSystemReportDataWriter_attachmentsDir, _FileSystemReportDataWriter_dataDirReady, _FileSystemReportDataWriter_widgetsDirReady, _FileSystemReportDataWriter_testResultsDirReady, _FileSystemReportDataWriter_attachmentsDirReady, _InMemoryReportDataWriter_data;
|
|
7
13
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
14
|
import { resolve } from "node:path";
|
|
9
15
|
import { joinPosixPath } from "@allurereport/core-api";
|
|
10
16
|
export class FileSystemReportDataWriter {
|
|
11
17
|
constructor(output) {
|
|
12
18
|
this.output = output;
|
|
19
|
+
_FileSystemReportDataWriter_dataDir.set(this, void 0);
|
|
20
|
+
_FileSystemReportDataWriter_widgetsDir.set(this, void 0);
|
|
21
|
+
_FileSystemReportDataWriter_testResultsDir.set(this, void 0);
|
|
22
|
+
_FileSystemReportDataWriter_attachmentsDir.set(this, void 0);
|
|
23
|
+
_FileSystemReportDataWriter_dataDirReady.set(this, void 0);
|
|
24
|
+
_FileSystemReportDataWriter_widgetsDirReady.set(this, void 0);
|
|
25
|
+
_FileSystemReportDataWriter_testResultsDirReady.set(this, void 0);
|
|
26
|
+
_FileSystemReportDataWriter_attachmentsDirReady.set(this, void 0);
|
|
27
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_dataDir, resolve(this.output, "data"), "f");
|
|
28
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_widgetsDir, resolve(this.output, "widgets"), "f");
|
|
29
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_testResultsDir, resolve(this.output, "data", "test-results"), "f");
|
|
30
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_attachmentsDir, resolve(this.output, "data", "attachments"), "f");
|
|
31
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_dataDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_dataDir, "f"), { recursive: true }), "f");
|
|
32
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_widgetsDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_widgetsDir, "f"), { recursive: true }), "f");
|
|
33
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_testResultsDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_testResultsDir, "f"), { recursive: true }), "f");
|
|
34
|
+
__classPrivateFieldSet(this, _FileSystemReportDataWriter_attachmentsDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_attachmentsDir, "f"), { recursive: true }), "f");
|
|
13
35
|
}
|
|
14
36
|
async writeData(fileName, data) {
|
|
15
|
-
|
|
16
|
-
await
|
|
17
|
-
await writeFile(resolve(distFolder, fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
37
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_dataDirReady, "f");
|
|
38
|
+
await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_dataDir, "f"), fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
18
39
|
}
|
|
19
40
|
async writeWidget(fileName, data) {
|
|
20
|
-
|
|
21
|
-
await
|
|
22
|
-
await writeFile(resolve(distFolder, fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
41
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_widgetsDirReady, "f");
|
|
42
|
+
await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_widgetsDir, "f"), fileName), JSON.stringify(data), { encoding: "utf-8" });
|
|
23
43
|
}
|
|
24
44
|
async writeTestCase(test) {
|
|
25
|
-
|
|
26
|
-
await
|
|
27
|
-
await writeFile(resolve(distFolder, `${test.id}.json`), JSON.stringify(test), { encoding: "utf-8" });
|
|
45
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_testResultsDirReady, "f");
|
|
46
|
+
await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_testResultsDir, "f"), `${test.id}.json`), JSON.stringify(test), { encoding: "utf-8" });
|
|
28
47
|
}
|
|
29
48
|
async writeAttachment(source, file) {
|
|
30
|
-
|
|
31
|
-
await
|
|
32
|
-
await file.writeTo(resolve(distFolder, source));
|
|
49
|
+
await __classPrivateFieldGet(this, _FileSystemReportDataWriter_attachmentsDirReady, "f");
|
|
50
|
+
await file.writeTo(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_attachmentsDir, "f"), source));
|
|
33
51
|
}
|
|
34
52
|
}
|
|
53
|
+
_FileSystemReportDataWriter_dataDir = new WeakMap(), _FileSystemReportDataWriter_widgetsDir = new WeakMap(), _FileSystemReportDataWriter_testResultsDir = new WeakMap(), _FileSystemReportDataWriter_attachmentsDir = new WeakMap(), _FileSystemReportDataWriter_dataDirReady = new WeakMap(), _FileSystemReportDataWriter_widgetsDirReady = new WeakMap(), _FileSystemReportDataWriter_testResultsDirReady = new WeakMap(), _FileSystemReportDataWriter_attachmentsDirReady = new WeakMap();
|
|
35
54
|
export class InMemoryReportDataWriter {
|
|
36
55
|
constructor() {
|
|
37
56
|
_InMemoryReportDataWriter_data.set(this, {});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allurereport/plugin-classic",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.9.0",
|
|
4
4
|
"description": "The classic version of Allure HTML report",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"allure",
|
|
@@ -30,11 +30,11 @@
|
|
|
30
30
|
"lint:fix": "oxlint --import-plugin --fix src test features stories"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@allurereport/core-api": "3.
|
|
34
|
-
"@allurereport/plugin-api": "3.
|
|
35
|
-
"@allurereport/web-awesome": "3.
|
|
36
|
-
"@allurereport/web-classic": "3.
|
|
37
|
-
"@allurereport/web-commons": "3.
|
|
33
|
+
"@allurereport/core-api": "3.9.0",
|
|
34
|
+
"@allurereport/plugin-api": "3.9.0",
|
|
35
|
+
"@allurereport/web-awesome": "3.9.0",
|
|
36
|
+
"@allurereport/web-classic": "3.9.0",
|
|
37
|
+
"@allurereport/web-commons": "3.9.0",
|
|
38
38
|
"d3-shape": "^3.2.0",
|
|
39
39
|
"handlebars": "^4.7.9",
|
|
40
40
|
"markdown-it": "^14.1.0"
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"@types/markdown-it": "^14.1.2",
|
|
45
45
|
"@types/node": "^20.17.9",
|
|
46
46
|
"@vitest/runner": "^2.1.9",
|
|
47
|
+
"allure-js-commons": "^3.3.3",
|
|
47
48
|
"allure-vitest": "^3.3.3",
|
|
48
49
|
"rimraf": "^6.0.1",
|
|
49
50
|
"typescript": "^5.6.3",
|