@allurereport/plugin-awesome 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.
@@ -110,7 +110,7 @@ const buildGroupLevels = (category, testResult, matchingData, environmentCount,
110
110
  return levels;
111
111
  };
112
112
  export const generateCategories = async (writer, { tests, categories, filename = "categories.json", environmentCount = 0, selectedEnvironmentCount, environments = [], defaultEnvironment = "default", }) => {
113
- const visible = tests.filter((t) => !t.hidden);
113
+ const visible = tests.filter((t) => !t.isRetry);
114
114
  const environmentOrderMap = buildEnvironmentSortOrder(environments, defaultEnvironment);
115
115
  const nodes = {};
116
116
  const roots = [];
@@ -25,7 +25,7 @@ export const convertTestResult = (tr, options = {}) => {
25
25
  flaky: tr.flaky,
26
26
  muted: tr.muted,
27
27
  known: tr.known,
28
- hidden: tr.hidden,
28
+ isRetry: tr.isRetry,
29
29
  labels,
30
30
  groupedLabels: mapLabelsByName(labels),
31
31
  parameters: tr.parameters,
@@ -26,7 +26,7 @@ export const generateTimeline = async (writer, trs, options, environmentIdByTrId
26
26
  historyId: test.historyId,
27
27
  name: test.name,
28
28
  status: test.status,
29
- hidden: test.hidden,
29
+ isRetry: test.isRetry,
30
30
  host,
31
31
  thread,
32
32
  environment: environmentIdByTrId.get(test.id) ?? test.environment,
@@ -4,12 +4,13 @@ import type { AwesomeTestResult } from "@allurereport/web-awesome";
4
4
  import type { AwesomeOptions, TemplateManifest } from "./model.js";
5
5
  import type { AwesomeDataWriter, ReportFile } from "./writer.js";
6
6
  export declare const readTemplateManifest: (singleFileMode?: boolean) => Promise<TemplateManifest>;
7
- export declare const generateTestResults: (writer: AwesomeDataWriter, store: AllureStore, trs: TestResult[], options?: {
7
+ export declare const generateTestResults: (_writer: AwesomeDataWriter, store: AllureStore, trs: TestResult[], options?: {
8
8
  hideLabels?: readonly (string | RegExp)[];
9
9
  }) => Promise<AwesomeTestResult[]>;
10
10
  export declare const generateTestCases: (writer: AwesomeDataWriter, trs: AwesomeTestResult[]) => Promise<void>;
11
11
  export declare const generateTestEnvGroups: (writer: AwesomeDataWriter, groups: TestEnvGroup[]) => Promise<void>;
12
12
  export declare const generateNav: (writer: AwesomeDataWriter, trs: AwesomeTestResult[], filename?: string) => Promise<void>;
13
+ export declare const generateSearchIndex: (writer: AwesomeDataWriter, trs: AwesomeTestResult[], filename?: string) => Promise<void>;
13
14
  export declare const generateTree: (writer: AwesomeDataWriter, treeFilename: string, labels: string[], tests: AwesomeTestResult[], options?: {
14
15
  appendTitlePath?: boolean;
15
16
  }) => Promise<void>;
@@ -1,10 +1,10 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { readFile } from "node:fs/promises";
2
+ import { readFile, readdir } from "node:fs/promises";
3
3
  import { createRequire } from "node:module";
4
- import { basename, join } from "node:path";
4
+ import { basename, dirname, join } from "node:path";
5
5
  import { defaultChartsConfig } from "@allurereport/charts-api";
6
6
  import { compareBy, createBaseUrlScript, createFontLinkTag, createReportDataScript, stringifyForInlineScript, createScriptTag, createStylesLinkTag, incrementStatistic, joinPosixPath, nullsLast, ordinal, } from "@allurereport/core-api";
7
- import { createTreeByLabels, createTreeByLabelsAndTitlePath, createTreeByTitlePath, filterTree, preciseTreeLabels, sortTree, transformTree, } from "@allurereport/plugin-api";
7
+ import { createTreeByLabels, createTreeByLabelsAndTitlePath, createTreeByTitlePath, preciseTreeLabels, processTree, } from "@allurereport/plugin-api";
8
8
  import { generateCharts, getPieChartValues } from "@allurereport/web-commons";
9
9
  import Handlebars from "handlebars";
10
10
  import { convertFixtureResult, convertTestResult } from "./converters.js";
@@ -45,6 +45,7 @@ const template = `<!DOCTYPE html>
45
45
  </body>
46
46
  </html>
47
47
  `;
48
+ const compiledTemplate = Handlebars.compile(template);
48
49
  export const readTemplateManifest = async (singleFileMode) => {
49
50
  const templateManifestSource = require.resolve(`@allurereport/web-awesome/dist/${singleFileMode ? "single" : "multi"}/manifest.json`);
50
51
  const templateManifest = await readFile(templateManifestSource, { encoding: "utf-8" });
@@ -73,21 +74,28 @@ const createBreadcrumbs = (convertedTr) => {
73
74
  return acc;
74
75
  }, []);
75
76
  };
76
- export const generateTestResults = async (writer, store, trs, options = {}) => {
77
+ const writeConcurrently = async (items, write, concurrency = 64) => {
78
+ for (let i = 0; i < items.length; i += concurrency) {
79
+ await Promise.all(items.slice(i, i + concurrency).map(write));
80
+ }
81
+ };
82
+ export const generateTestResults = async (_writer, store, trs, options = {}) => {
77
83
  let convertedTrs = [];
84
+ const related = await store.relatedByTestResultIds(trs.map(({ id }) => id));
78
85
  for (const tr of trs) {
79
- const trFixtures = await store.fixturesByTrId(tr.id);
86
+ const trFixtures = related.fixturesByTrId.get(tr.id) ?? [];
80
87
  const convertedTrFixtures = trFixtures.map(convertFixtureResult);
81
88
  const convertedTr = convertTestResult(tr, {
82
89
  hideLabels: options.hideLabels,
83
90
  });
84
- convertedTr.history = (await store.historyByTrId(tr.id)) ?? [];
85
- convertedTr.retries = await store.retriesByTrId(tr.id);
91
+ convertedTr.history = related.historyByTrId.get(tr.id) ?? [];
92
+ convertedTr.retries = related.retriesByTrId.get(tr.id) ?? [];
86
93
  convertedTr.retriesCount = convertedTr.retries.length;
87
94
  convertedTr.retry = convertedTr.retriesCount > 0;
95
+ convertedTr.isRetry = tr.isRetry;
88
96
  convertedTr.setup = convertedTrFixtures.filter((f) => f.type === "before");
89
97
  convertedTr.teardown = convertedTrFixtures.filter((f) => f.type === "after");
90
- convertedTr.attachments = (await store.attachmentsByTrId(tr.id)).map((attachment) => ({
98
+ convertedTr.attachments = (related.attachmentsByTrId.get(tr.id) ?? []).map((attachment) => ({
91
99
  link: attachment,
92
100
  type: "attachment",
93
101
  }));
@@ -98,15 +106,10 @@ export const generateTestResults = async (writer, store, trs, options = {}) => {
98
106
  ...tr,
99
107
  order: idx + 1,
100
108
  }));
101
- for (const convertedTr of convertedTrs) {
102
- await writer.writeTestCase(convertedTr);
103
- }
104
109
  return convertedTrs;
105
110
  };
106
111
  export const generateTestCases = async (writer, trs) => {
107
- for (const tr of trs) {
108
- await writer.writeTestCase(tr);
109
- }
112
+ await writeConcurrently(trs, (tr) => writer.writeTestCase(tr));
110
113
  };
111
114
  export const generateTestEnvGroups = async (writer, groups) => {
112
115
  for (const group of groups) {
@@ -115,10 +118,62 @@ export const generateTestEnvGroups = async (writer, groups) => {
115
118
  }
116
119
  };
117
120
  export const generateNav = async (writer, trs, filename = "nav.json") => {
118
- await writer.writeWidget(filename, trs.filter(({ hidden }) => !hidden).map(({ id }) => id));
121
+ await writer.writeWidget(filename, trs.filter(({ isRetry }) => !isRetry).map(({ id }) => id));
122
+ };
123
+ const SEARCHABLE_LABELS = new Set([
124
+ "owner",
125
+ "suite",
126
+ "package",
127
+ "testClass",
128
+ "testMethod",
129
+ "epic",
130
+ "feature",
131
+ "story",
132
+ "tag",
133
+ "host",
134
+ "thread",
135
+ ]);
136
+ const joinSearchValues = (values) => {
137
+ const uniqueValues = new Set(values.map((value) => value?.trim()).filter((value) => Boolean(value)));
138
+ return uniqueValues.size > 0 ? [...uniqueValues].join(" ") : undefined;
139
+ };
140
+ const searchDocumentFactory = (test) => {
141
+ const labels = (test.labels ?? []).flatMap(({ name, value }) => {
142
+ if (!value || !SEARCHABLE_LABELS.has(name)) {
143
+ return [];
144
+ }
145
+ return [`${name}:${value}`, value];
146
+ });
147
+ const tags = (test.labels ?? []).flatMap(({ name, value }) => (name === "tag" && value ? [value] : []));
148
+ const parameters = (test.parameters ?? []).flatMap(({ name, value, hidden, masked }) => {
149
+ if (hidden) {
150
+ return [];
151
+ }
152
+ return masked ? [name] : [`${name}:${value}`, name, value];
153
+ });
154
+ const links = (test.links ?? []).flatMap(({ name, url, type }) => [name, url, type]);
155
+ const categories = test.categories?.map((category) => category.name);
156
+ return {
157
+ id: test.id,
158
+ nodeId: test.id,
159
+ name: test.name,
160
+ fullName: test.fullName,
161
+ historyId: test.historyId,
162
+ labels: joinSearchValues(labels),
163
+ owner: joinSearchValues(test.groupedLabels.owner ?? []),
164
+ tags: joinSearchValues(tags),
165
+ parameters: joinSearchValues(parameters),
166
+ categories: joinSearchValues(categories ?? []),
167
+ statusMessage: test.error?.message,
168
+ links: joinSearchValues(links),
169
+ };
170
+ };
171
+ export const generateSearchIndex = async (writer, trs, filename = "search-index.json") => {
172
+ const searchDocuments = trs.filter(({ isRetry }) => !isRetry).map(searchDocumentFactory);
173
+ await writer.writeWidget(filename, searchDocuments);
119
174
  };
120
175
  export const generateTree = async (writer, treeFilename, labels, tests, options) => {
121
- const visibleTests = tests.filter((test) => !test.hidden);
176
+ const visibleTests = tests.filter((test) => !test.isRetry);
122
177
  const { appendTitlePath } = options || {};
123
178
  let tree;
124
179
  if (labels.length === 0) {
@@ -130,9 +185,10 @@ export const generateTree = async (writer, treeFilename, labels, tests, options)
130
185
  else {
131
186
  tree = buildTreeByLabels(visibleTests, labels);
132
187
  }
133
- filterTree(tree, (leaf) => !leaf.hidden);
134
- sortTree(tree, nullsLast(compareBy("start", ordinal())));
135
- transformTree(tree, (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }));
188
+ processTree(tree, {
189
+ sort: nullsLast(compareBy("start", ordinal())),
190
+ transform: (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }),
191
+ });
136
192
  await writer.writeWidget(treeFilename, tree);
137
193
  };
138
194
  const buildTreeByLabels = (tests, labels) => {
@@ -307,15 +363,15 @@ export const generateQualityGateResults = async (writer, qualityGateResults = {}
307
363
  };
308
364
  export const generateStaticFiles = async (payload) => {
309
365
  const { id, reportName = "Allure Report", reportLanguage = "en", singleFile, logo = "", theme = "auto", groupBy, reportFiles, reportDataFiles, reportUuid, allureVersion, layout = "base", defaultSection = "", ci, stepTreeExpansion, } = payload;
310
- const compile = Handlebars.compile(template);
311
366
  const manifest = await readTemplateManifest(payload.singleFile);
312
367
  const headTags = [];
313
368
  const bodyTags = [];
314
369
  const sections = ["charts", "timeline"];
315
370
  if (!payload.singleFile) {
371
+ const manifestPath = require.resolve(join("@allurereport/web-awesome/dist", singleFile ? "single" : "multi", "manifest.json"));
372
+ const templateDir = dirname(manifestPath);
316
373
  for (const key in manifest) {
317
374
  const fileName = manifest[key];
318
- const filePath = require.resolve(join("@allurereport/web-awesome/dist", singleFile ? "single" : "multi", fileName));
319
375
  if (key.includes(".woff")) {
320
376
  headTags.push(createFontLinkTag(fileName));
321
377
  }
@@ -325,9 +381,12 @@ export const generateStaticFiles = async (payload) => {
325
381
  if (key === "main.js") {
326
382
  bodyTags.push(createScriptTag(fileName));
327
383
  }
328
- if (singleFile) {
384
+ }
385
+ for (const fileName of await readdir(templateDir)) {
386
+ if (fileName === "manifest.json") {
329
387
  continue;
330
388
  }
389
+ const filePath = join(templateDir, fileName);
331
390
  const fileContent = await readFile(filePath);
332
391
  await reportFiles.addFile(basename(filePath), fileContent);
333
392
  }
@@ -357,7 +416,7 @@ export const generateStaticFiles = async (payload) => {
357
416
  stepTreeExpansion,
358
417
  };
359
418
  try {
360
- const html = compile({
419
+ const html = compiledTemplate({
361
420
  headTags: headTags.join("\n"),
362
421
  bodyTags: bodyTags.join("\n"),
363
422
  reportFilesScript: createReportDataScript(reportDataFiles),
package/dist/plugin.js CHANGED
@@ -15,16 +15,17 @@ import { createPluginSummary, } from "@allurereport/plugin-api";
15
15
  import { preciseTreeLabels } from "@allurereport/plugin-api";
16
16
  import { applyCategoriesToTestResults, generateCategories } from "./categories.js";
17
17
  import { generateTimeline } from "./generateTimeline.js";
18
- import { generateAllCharts, generateAttachmentsFiles, generateEnvironmentJson, generateEnvirontmentsList, generateGlobals, generateHistoryDataPoints, generateNav, generateQualityGateResults, generateStaticFiles, generateStatistic, generateTestCases, generateTestEnvGroups, generateTestResults, generateTree, generateTreeFilters, generateVariables, } from "./generators.js";
18
+ import { generateAllCharts, generateAttachmentsFiles, generateEnvironmentJson, generateEnvirontmentsList, generateGlobals, generateHistoryDataPoints, generateNav, generateQualityGateResults, generateSearchIndex, generateStaticFiles, generateStatistic, generateTestCases, generateTestEnvGroups, generateTestResults, generateTree, generateTreeFilters, generateVariables, } from "./generators.js";
19
19
  import { InMemoryReportDataWriter, ReportFileDataWriter } from "./writer.js";
20
20
  const statisticByTestResults = async (store, testResults) => {
21
21
  const statistic = { total: 0 };
22
+ const related = await store.relatedByTestResultIds(testResults.map(({ id }) => id));
22
23
  for (const testResult of testResults) {
23
- if (testResult.hidden) {
24
+ if (testResult.isRetry) {
24
25
  continue;
25
26
  }
26
27
  incrementStatistic(statistic, testResult.status);
27
- if ((await store.retriesByTrId(testResult.id)).length > 0) {
28
+ if ((related.retriesByTrId.get(testResult.id)?.length ?? 0) > 0) {
28
29
  statistic.retries = (statistic.retries ?? 0) + 1;
29
30
  }
30
31
  if (testResult.flaky) {
@@ -46,7 +47,7 @@ export class AwesomePlugin {
46
47
  const categories = context.categories ?? [];
47
48
  const environmentItems = await store.metadataByKey("allure_environment");
48
49
  const attachments = await store.allAttachments();
49
- const allTrs = await store.allTestResults({ includeHidden: true, filter });
50
+ const allTrs = await store.allTestResults({ includeRetries: true, filter });
50
51
  const statistics = await store.testsStatistic(filter);
51
52
  const environments = await store.allEnvironmentIdentities();
52
53
  const envStatistics = new Map();
@@ -66,7 +67,7 @@ export class AwesomePlugin {
66
67
  envIdByTrId.set(tr.id, environmentId);
67
68
  }));
68
69
  await Promise.all(environments.map(async ({ id }) => {
69
- const envTrs = await store.testResultsByEnvironmentId(id, { includeHidden: true });
70
+ const envTrs = await store.testResultsByEnvironmentId(id, { includeRetries: true });
70
71
  envStatistics.set(id, await statisticByTestResults(store, envTrs));
71
72
  }));
72
73
  await generateStatistic(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), {
@@ -94,10 +95,11 @@ export class AwesomePlugin {
94
95
  await generateTestCases(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs);
95
96
  await generateTree(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), "tree.json", treeLabels, convertedTrs, { appendTitlePath });
96
97
  await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "nav.json");
98
+ await generateSearchIndex(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "search-index.json");
97
99
  await generateTestEnvGroups(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), allTestEnvGroups);
98
100
  const convertedTrsById = new Map(convertedTrs.map((tr) => [tr.id, tr]));
99
101
  for (const reportEnvironment of environments) {
100
- const envTrs = await store.testResultsByEnvironmentId(reportEnvironment.id, { includeHidden: true });
102
+ const envTrs = await store.testResultsByEnvironmentId(reportEnvironment.id, { includeRetries: true });
101
103
  const envConvertedTrs = envTrs
102
104
  .map((tr) => convertedTrsById.get(tr.id))
103
105
  .filter((tr) => Boolean(tr));
@@ -105,6 +107,7 @@ export class AwesomePlugin {
105
107
  appendTitlePath,
106
108
  });
107
109
  await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, joinPosixPath(reportEnvironment.id, "nav.json"));
110
+ await generateSearchIndex(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, joinPosixPath(reportEnvironment.id, "search-index.json"));
108
111
  await generateCategories(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), {
109
112
  tests: envConvertedTrs,
110
113
  categories,
package/dist/writer.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface AwesomeDataWriter {
11
11
  writeAttachment(source: string, file: ResultFile): Promise<void>;
12
12
  }
13
13
  export declare class FileSystemReportDataWriter implements AwesomeDataWriter {
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-awesome",
3
- "version": "3.8.2",
3
+ "version": "3.9.0",
4
4
  "description": "Allure Awesome Plugin – brand new HTML report with modern design and new features",
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/charts-api": "3.8.2",
34
- "@allurereport/core-api": "3.8.2",
35
- "@allurereport/plugin-api": "3.8.2",
36
- "@allurereport/web-awesome": "3.8.2",
37
- "@allurereport/web-commons": "3.8.2",
33
+ "@allurereport/charts-api": "3.9.0",
34
+ "@allurereport/core-api": "3.9.0",
35
+ "@allurereport/plugin-api": "3.9.0",
36
+ "@allurereport/web-awesome": "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",