@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.
@@ -23,7 +23,7 @@ export const convertTestResult = (tr) => {
23
23
  flaky: tr.flaky,
24
24
  muted: tr.muted,
25
25
  known: tr.known,
26
- hidden: tr.hidden,
26
+ isRetry: tr.isRetry,
27
27
  labels: tr.labels,
28
28
  groupedLabels: mapLabelsByName(tr.labels),
29
29
  parameters: tr.parameters,
@@ -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, filterTree, sortTree, transformTree, } from "@allurereport/plugin-api";
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({ includeHidden: true });
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 = await store.fixturesByTrId(tr.id);
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 = (await store.historyByTrId(tr.id)) ?? [];
92
- convertedTr.retries = await store.retriesByTrId(tr.id);
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 = (await store.attachmentsByTrId(tr.id)).map((attachment) => ({
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
- for (const convertedTr of convertedTrs) {
108
- await writer.writeTestCase(convertedTr);
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.hidden);
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
- filterTree(tree, (leaf) => !leaf.hidden);
132
- sortTree(tree, nullsLast(compareBy("start", ordinal())));
133
- transformTree(tree, (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }));
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 = compile({
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.hidden);
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
- filterTree(tree, (leaf) => !leaf.hidden);
256
- sortTree(tree, nullsLast(compareBy("start", ordinal())));
257
- transformTree(tree, (leaf, idx) => ({
258
- ...leaf,
259
- groupOrder: idx + 1,
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
- 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-results");
26
- await mkdir(distFolder, { recursive: true });
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
- 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_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.8.2",
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.8.2",
34
- "@allurereport/plugin-api": "3.8.2",
35
- "@allurereport/web-awesome": "3.8.2",
36
- "@allurereport/web-classic": "3.8.2",
37
- "@allurereport/web-commons": "3.8.2",
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",