@allurereport/plugin-allure2 3.8.1 → 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.
@@ -161,11 +161,11 @@ export const convertTestResult = (context, test) => {
161
161
  beforeStages,
162
162
  testStage: testStage,
163
163
  flaky,
164
- hidden: test.hidden,
164
+ isRetry: test.isRetry,
165
165
  newFailed,
166
166
  newBroken,
167
167
  newPassed,
168
- retry: test.hidden,
168
+ retry: test.isRetry,
169
169
  retriesStatusChange,
170
170
  retriesCount: retries.length,
171
171
  hostId: test.hostId,
@@ -6,6 +6,11 @@ import { findUp } from "find-up";
6
6
  import Handlebars from "handlebars";
7
7
  import { byLabels, collapseTree, createTree, createWidget } from "./tree.js";
8
8
  import { updateStatistic, updateTime } from "./utils.js";
9
+ const writeConcurrently = async (items, write, concurrency = 64) => {
10
+ for (let i = 0; i < items.length; i += concurrency) {
11
+ await Promise.all(items.slice(i, i + concurrency).map(write));
12
+ }
13
+ };
9
14
  const template = `<!DOCTYPE html>
10
15
  <html dir="ltr" lang="{{reportLanguage}}">
11
16
  <head>
@@ -45,6 +50,7 @@ const template = `<!DOCTYPE html>
45
50
  </body>
46
51
  </html>
47
52
  `;
53
+ const compiledTemplate = Handlebars.compile(template);
48
54
  export const getPackageRoot = async () => {
49
55
  const packageJsonPath = await findUp("package.json", {
50
56
  cwd: dirname(fileURLToPath(import.meta.url)),
@@ -69,7 +75,6 @@ export const readManifestEntry = async (options) => {
69
75
  export const generateStaticFiles = async (payload) => {
70
76
  const packageRoot = await getPackageRoot();
71
77
  const { reportName, reportLanguage, singleFile, reportFiles, reportDataFiles, reportUuid, allureVersion } = payload;
72
- const compile = Handlebars.compile(template);
73
78
  const manifest = await readTemplateManifest(packageRoot, singleFile);
74
79
  const headTags = [];
75
80
  const bodyTags = [];
@@ -124,7 +129,7 @@ export const generateStaticFiles = async (payload) => {
124
129
  createdAt: Date.now(),
125
130
  };
126
131
  try {
127
- const html = compile({
132
+ const html = compiledTemplate({
128
133
  headTags: headTags.join("\n"),
129
134
  bodyTags: bodyTags.join("\n"),
130
135
  reportFilesScript: createReportDataScript(reportDataFiles),
@@ -190,15 +195,13 @@ export const generateTimelineData = async (writer, tests) => {
190
195
  await writer.writeData("timeline.json", data);
191
196
  };
192
197
  export const generateTestResults = async (writer, tests) => {
193
- for (const test of tests) {
194
- await writer.writeTestCase(test);
195
- }
198
+ await writeConcurrently(tests, (test) => writer.writeTestCase(test));
196
199
  };
197
200
  export const generateSummaryJson = async (writer, reportName, tests) => {
198
201
  const statistic = { total: 0 };
199
202
  const time = {};
200
203
  tests
201
- .filter((test) => !test.hidden)
204
+ .filter((test) => !test.isRetry)
202
205
  .forEach((test) => {
203
206
  updateStatistic(statistic, test);
204
207
  updateTime(time, test);
@@ -218,7 +221,7 @@ export const generateExecutorJson = async (writer, executor) => {
218
221
  };
219
222
  export const generateDefaultWidgetData = async (writer, tests, ...fileNames) => {
220
223
  const statusChartData = tests
221
- .filter((test) => !test.hidden)
224
+ .filter((test) => !test.isRetry)
222
225
  .map(({ uid, name, status, time, extra: { severity = "normal" } }) => {
223
226
  return {
224
227
  uid,
@@ -246,7 +249,7 @@ export const generateEmptyTrendData = async (writer, ...fileNames) => {
246
249
  export const generateTrendData = async (writer, reportName, tests, historyDataPoints) => {
247
250
  const statistic = { total: 0 };
248
251
  tests
249
- .filter((test) => !test.hidden)
252
+ .filter((test) => !test.isRetry)
250
253
  .forEach((test) => {
251
254
  updateStatistic(statistic, test);
252
255
  });
package/dist/model.d.ts CHANGED
@@ -67,7 +67,7 @@ export interface Allure2TestResult {
67
67
  links: Allure2Link[];
68
68
  hostId?: string;
69
69
  threadId?: string;
70
- hidden: boolean;
70
+ isRetry: boolean;
71
71
  retry: boolean;
72
72
  extra: {
73
73
  [key: string]: any;
package/dist/plugin.js CHANGED
@@ -18,12 +18,13 @@ export class Allure2Plugin {
18
18
  const attachmentMap = await generateAttachmentsData(writer, attachmentLinks, (id) => store.attachmentContentById(id));
19
19
  const categories = (await store.metadataByKey("allure2_categories")) ?? [];
20
20
  const environmentItems = (await store.metadataByKey("allure_environment")) ?? [];
21
- const tests = await store.allTestResults({ includeHidden: true });
21
+ const tests = await store.allTestResults({ includeRetries: true });
22
+ const related = await store.relatedByTestResultIds(tests.map(({ id }) => id));
22
23
  const allTr = [];
23
24
  for (const value of tests) {
24
- const fixtures = await store.fixturesByTrId(value.id);
25
- const retries = await store.retriesByTrId(value.id);
26
- const history = (await store.historyByTrId(value.id)) ?? [];
25
+ const fixtures = related.fixturesByTrId.get(value.id) ?? [];
26
+ const retries = related.retriesByTrId.get(value.id) ?? [];
27
+ const history = related.historyByTrId.get(value.id) ?? [];
27
28
  const allure2TestResult = convertTestResult({
28
29
  attachmentMap,
29
30
  fixtures,
@@ -34,7 +35,7 @@ export class Allure2Plugin {
34
35
  allTr.push(allure2TestResult);
35
36
  }
36
37
  await generateTestResults(writer, allTr);
37
- const displayedTr = allTr.filter((atr) => !atr.hidden);
38
+ const displayedTr = allTr.filter((atr) => !atr.isRetry);
38
39
  const treeLabelNamesFactory = (labelNames) => preciseTreeLabels(labelNames, displayedTr, (tr) => {
39
40
  if (tr.labels) {
40
41
  return tr.labels.map(({ name }) => name);
package/dist/writer.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface Allure2DataWriter {
11
11
  writeAttachment(source: string, file: ResultFile): Promise<void>;
12
12
  }
13
13
  export declare class FileSystemReportDataWriter implements Allure2DataWriter {
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_testCasesDir, _FileSystemReportDataWriter_attachmentsDir, _FileSystemReportDataWriter_dataDirReady, _FileSystemReportDataWriter_widgetsDirReady, _FileSystemReportDataWriter_testCasesDirReady, _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_testCasesDir.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_testCasesDirReady.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_testCasesDir, resolve(this.output, "data", "test-cases"), "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_testCasesDirReady, mkdir(__classPrivateFieldGet(this, _FileSystemReportDataWriter_testCasesDir, "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
- const distFolder = resolve(this.output, "data");
16
- await mkdir(distFolder, { recursive: true });
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
- const distFolder = resolve(this.output, "widgets");
21
- await mkdir(distFolder, { recursive: true });
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
- const distFolder = resolve(this.output, "data", "test-cases");
26
- await mkdir(distFolder, { recursive: true });
27
- await writeFile(resolve(distFolder, `${test.uid}.json`), JSON.stringify(test), { encoding: "utf-8" });
45
+ await __classPrivateFieldGet(this, _FileSystemReportDataWriter_testCasesDirReady, "f");
46
+ await writeFile(resolve(__classPrivateFieldGet(this, _FileSystemReportDataWriter_testCasesDir, "f"), `${test.uid}.json`), JSON.stringify(test), { encoding: "utf-8" });
28
47
  }
29
48
  async writeAttachment(source, file) {
30
- const distFolder = resolve(this.output, "data", "attachments");
31
- await mkdir(distFolder, { recursive: true });
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_testCasesDir = new WeakMap(), _FileSystemReportDataWriter_attachmentsDir = new WeakMap(), _FileSystemReportDataWriter_dataDirReady = new WeakMap(), _FileSystemReportDataWriter_widgetsDirReady = new WeakMap(), _FileSystemReportDataWriter_testCasesDirReady = 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-allure2",
3
- "version": "3.8.1",
3
+ "version": "3.9.0",
4
4
  "description": "The classic version of Allure HTML report",
5
5
  "keywords": [
6
6
  "allure",
@@ -30,14 +30,15 @@
30
30
  "lint:fix": "oxlint --import-plugin --fix src test features stories"
31
31
  },
32
32
  "dependencies": {
33
- "@allurereport/core-api": "3.8.1",
34
- "@allurereport/plugin-api": "3.8.1",
33
+ "@allurereport/core-api": "3.9.0",
34
+ "@allurereport/plugin-api": "3.9.0",
35
35
  "find-up": "^8.0.0",
36
36
  "handlebars": "^4.7.9"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^20.17.9",
40
40
  "@vitest/runner": "^2.1.9",
41
+ "allure-js-commons": "^3.3.3",
41
42
  "allure-vitest": "^3.3.3",
42
43
  "rimraf": "^6.0.1",
43
44
  "typescript": "^5.6.3",