@allurereport/plugin-awesome 3.8.2 → 3.10.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/README.md CHANGED
@@ -58,6 +58,27 @@ The plugin accepts the following options:
58
58
  | `groupBy` | Grouping tests by labels or combining labels. By default, tests are grouped using the `titlePath` provided by the test framework. | `string` | `[]`(Grouping by `titlepath`) |
59
59
  | `appendTitlePath`| Special marker for `groupBy`. Forces a final grouping by `titlePath` after all label-based groups. | `boolean` | `false` |
60
60
  | `stepTreeExpansion` | Default expansion policy for step trees in test details. | `"collapsed" \| "expand_failed_only" \| "expanded"` | `"expand_failed_only"` |
61
+ | `defaultSortBy` | Default sort order for the test tree. Accepted values: `order,asc`, `order,desc`, `duration,asc`, `duration,desc`, `name,asc`, `name,desc`, `status,asc`, `status,desc`. User's manual selection is preserved in `localStorage` and takes priority over this value. | `string` | `order,asc` |
62
+
63
+ ### Default sort order
64
+
65
+ Use `defaultSortBy` to change the initial sort order of the test tree:
66
+
67
+ ```ts
68
+ import { defineConfig } from "allure";
69
+
70
+ export default defineConfig({
71
+ plugins: {
72
+ awesome: {
73
+ options: {
74
+ defaultSortBy: "name,asc",
75
+ },
76
+ },
77
+ },
78
+ });
79
+ ```
80
+
81
+ The user's last selected sort order is always preserved in `localStorage`, so once a user changes the sort manually, their preference takes priority over the configured default.
61
82
 
62
83
  ### Step tree expansion
63
84
 
@@ -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,
@@ -1,15 +1,17 @@
1
1
  import { type AttachmentLink, type EnvironmentIdentity, type EnvironmentItem, type Statistic, type TestEnvGroup, type TestResult } from "@allurereport/core-api";
2
2
  import type { AllureStore, ExitCode, PluginContext, PluginGlobalAttachment, PluginGlobalError, QualityGateValidationResult, ReportFiles, ResultFile } from "@allurereport/plugin-api";
3
- import type { AwesomeTestResult } from "@allurereport/web-awesome";
3
+ import type { AwesomeExecutorInfo, AwesomeRunSummary, 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>;
14
+ export declare const getRunSummary: (testResults: Pick<TestResult, "start" | "stop">[]) => AwesomeRunSummary | undefined;
13
15
  export declare const generateTree: (writer: AwesomeDataWriter, treeFilename: string, labels: string[], tests: AwesomeTestResult[], options?: {
14
16
  appendTitlePath?: boolean;
15
17
  }) => Promise<void>;
@@ -39,6 +41,8 @@ export declare const generateStaticFiles: (payload: AwesomeOptions & {
39
41
  reportDataFiles: ReportFile[];
40
42
  reportUuid: string;
41
43
  reportName: string;
44
+ executor?: AwesomeExecutorInfo;
45
+ runSummary?: AwesomeRunSummary;
42
46
  }) => Promise<void>;
43
47
  export declare const generateAllCharts: (writer: AwesomeDataWriter, store: AllureStore, options: AwesomeOptions, context: PluginContext) => Promise<void>;
44
48
  export declare const generateTreeFilters: (writer: AwesomeDataWriter, testResults: AwesomeTestResult[]) => 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,75 @@ 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);
174
+ };
175
+ export const getRunSummary = (testResults) => {
176
+ let start = Infinity;
177
+ let stop = -Infinity;
178
+ for (const { start: s, stop: e } of testResults) {
179
+ if (typeof s === "number" && Number.isFinite(s) && typeof e === "number" && Number.isFinite(e)) {
180
+ start = Math.min(start, s);
181
+ stop = Math.max(stop, e);
182
+ }
183
+ }
184
+ return Number.isFinite(start) && Number.isFinite(stop)
185
+ ? { start, stop, duration: Math.max(0, stop - start) }
186
+ : undefined;
119
187
  };
120
188
  export const generateTree = async (writer, treeFilename, labels, tests, options) => {
121
- const visibleTests = tests.filter((test) => !test.hidden);
189
+ const visibleTests = tests.filter((test) => !test.isRetry);
122
190
  const { appendTitlePath } = options || {};
123
191
  let tree;
124
192
  if (labels.length === 0) {
@@ -130,9 +198,10 @@ export const generateTree = async (writer, treeFilename, labels, tests, options)
130
198
  else {
131
199
  tree = buildTreeByLabels(visibleTests, labels);
132
200
  }
133
- filterTree(tree, (leaf) => !leaf.hidden);
134
- sortTree(tree, nullsLast(compareBy("start", ordinal())));
135
- transformTree(tree, (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }));
201
+ processTree(tree, {
202
+ sort: nullsLast(compareBy("start", ordinal())),
203
+ transform: (leaf, idx) => ({ ...leaf, groupOrder: idx + 1 }),
204
+ });
136
205
  await writer.writeWidget(treeFilename, tree);
137
206
  };
138
207
  const buildTreeByLabels = (tests, labels) => {
@@ -306,16 +375,16 @@ export const generateQualityGateResults = async (writer, qualityGateResults = {}
306
375
  await writer.writeWidget("quality-gate.json", qualityGateResults);
307
376
  };
308
377
  export const generateStaticFiles = async (payload) => {
309
- 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);
378
+ const { id, reportName = "Allure Report", reportLanguage = "en", singleFile, logo = "", theme = "auto", groupBy, reportFiles, reportDataFiles, reportUuid, allureVersion, layout = "base", defaultSection = "", ci, executor, runSummary, stepTreeExpansion, defaultSortBy, } = payload;
311
379
  const manifest = await readTemplateManifest(payload.singleFile);
312
380
  const headTags = [];
313
381
  const bodyTags = [];
314
382
  const sections = ["charts", "timeline"];
315
383
  if (!payload.singleFile) {
384
+ const manifestPath = require.resolve(join("@allurereport/web-awesome/dist", singleFile ? "single" : "multi", "manifest.json"));
385
+ const templateDir = dirname(manifestPath);
316
386
  for (const key in manifest) {
317
387
  const fileName = manifest[key];
318
- const filePath = require.resolve(join("@allurereport/web-awesome/dist", singleFile ? "single" : "multi", fileName));
319
388
  if (key.includes(".woff")) {
320
389
  headTags.push(createFontLinkTag(fileName));
321
390
  }
@@ -325,9 +394,12 @@ export const generateStaticFiles = async (payload) => {
325
394
  if (key === "main.js") {
326
395
  bodyTags.push(createScriptTag(fileName));
327
396
  }
328
- if (singleFile) {
397
+ }
398
+ for (const fileName of await readdir(templateDir)) {
399
+ if (fileName === "manifest.json") {
329
400
  continue;
330
401
  }
402
+ const filePath = join(templateDir, fileName);
331
403
  const fileContent = await readFile(filePath);
332
404
  await reportFiles.addFile(basename(filePath), fileContent);
333
405
  }
@@ -350,14 +422,17 @@ export const generateStaticFiles = async (payload) => {
350
422
  groupBy: groupBy?.length ? groupBy : [],
351
423
  cacheKey: now.toString(),
352
424
  ci,
425
+ executor,
426
+ runSummary,
353
427
  layout,
354
428
  allureVersion,
355
429
  sections,
356
430
  defaultSection,
357
431
  stepTreeExpansion,
432
+ defaultSortBy,
358
433
  };
359
434
  try {
360
- const html = compile({
435
+ const html = compiledTemplate({
361
436
  headTags: headTags.join("\n"),
362
437
  bodyTags: bodyTags.join("\n"),
363
438
  reportFilesScript: createReportDataScript(reportDataFiles),
package/dist/model.d.ts CHANGED
@@ -21,6 +21,7 @@ export type AwesomeOptions = {
21
21
  publish?: boolean;
22
22
  appendTitlePath?: boolean;
23
23
  stepTreeExpansion?: StepTreeExpansion;
24
+ defaultSortBy?: string;
24
25
  };
25
26
  export type TemplateManifest = Record<string, string>;
26
27
  export type AwesomePluginOptions = AwesomeOptions;
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, getRunSummary, } 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) {
@@ -45,8 +46,10 @@ export class AwesomePlugin {
45
46
  const hideLabels = context.hideLabels;
46
47
  const categories = context.categories ?? [];
47
48
  const environmentItems = await store.metadataByKey("allure_environment");
49
+ const executor = await store.metadataByKey("allure2_executor");
48
50
  const attachments = await store.allAttachments();
49
- const allTrs = await store.allTestResults({ includeHidden: true, filter });
51
+ const allTrs = await store.allTestResults({ includeRetries: true, filter });
52
+ const runSummary = getRunSummary(allTrs);
50
53
  const statistics = await store.testsStatistic(filter);
51
54
  const environments = await store.allEnvironmentIdentities();
52
55
  const envStatistics = new Map();
@@ -66,7 +69,7 @@ export class AwesomePlugin {
66
69
  envIdByTrId.set(tr.id, environmentId);
67
70
  }));
68
71
  await Promise.all(environments.map(async ({ id }) => {
69
- const envTrs = await store.testResultsByEnvironmentId(id, { includeHidden: true });
72
+ const envTrs = await store.testResultsByEnvironmentId(id, { includeRetries: true });
70
73
  envStatistics.set(id, await statisticByTestResults(store, envTrs));
71
74
  }));
72
75
  await generateStatistic(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), {
@@ -94,10 +97,11 @@ export class AwesomePlugin {
94
97
  await generateTestCases(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs);
95
98
  await generateTree(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), "tree.json", treeLabels, convertedTrs, { appendTitlePath });
96
99
  await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "nav.json");
100
+ await generateSearchIndex(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, "search-index.json");
97
101
  await generateTestEnvGroups(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), allTestEnvGroups);
98
102
  const convertedTrsById = new Map(convertedTrs.map((tr) => [tr.id, tr]));
99
103
  for (const reportEnvironment of environments) {
100
- const envTrs = await store.testResultsByEnvironmentId(reportEnvironment.id, { includeHidden: true });
104
+ const envTrs = await store.testResultsByEnvironmentId(reportEnvironment.id, { includeRetries: true });
101
105
  const envConvertedTrs = envTrs
102
106
  .map((tr) => convertedTrsById.get(tr.id))
103
107
  .filter((tr) => Boolean(tr));
@@ -105,6 +109,7 @@ export class AwesomePlugin {
105
109
  appendTitlePath,
106
110
  });
107
111
  await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, joinPosixPath(reportEnvironment.id, "nav.json"));
112
+ await generateSearchIndex(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, joinPosixPath(reportEnvironment.id, "search-index.json"));
108
113
  await generateCategories(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), {
109
114
  tests: envConvertedTrs,
110
115
  categories,
@@ -139,6 +144,8 @@ export class AwesomePlugin {
139
144
  reportUuid: context.reportUuid,
140
145
  reportName: context.reportName,
141
146
  ci: context.ci,
147
+ executor,
148
+ runSummary,
142
149
  reportDataFiles,
143
150
  });
144
151
  });
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.10.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.10.0",
34
+ "@allurereport/core-api": "3.10.0",
35
+ "@allurereport/plugin-api": "3.10.0",
36
+ "@allurereport/web-awesome": "3.10.0",
37
+ "@allurereport/web-commons": "3.10.0",
38
38
  "d3-shape": "^3.2.0",
39
39
  "handlebars": "^4.7.9",
40
40
  "markdown-it": "^14.1.0"
@@ -42,11 +42,12 @@
42
42
  "devDependencies": {
43
43
  "@types/d3-shape": "^3.1.6",
44
44
  "@types/markdown-it": "^14.1.2",
45
- "@types/node": "^20.17.9",
46
- "@vitest/runner": "^2.1.9",
47
- "allure-vitest": "^3.3.3",
48
- "rimraf": "^6.0.1",
49
- "typescript": "^5.6.3",
50
- "vitest": "^2.1.9"
45
+ "@types/node": "^20",
46
+ "@vitest/runner": "^2",
47
+ "allure-js-commons": "^3",
48
+ "allure-vitest": "^3",
49
+ "rimraf": "^6",
50
+ "typescript": "^5",
51
+ "vitest": "^4.1.0"
51
52
  }
52
53
  }