@allurereport/plugin-awesome 3.1.0 → 3.2.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.
@@ -1,3 +1,6 @@
1
+ import MarkdownIt from "markdown-it";
2
+ const md = new MarkdownIt();
3
+ const markdownToHtml = (value) => (value ? md.render(value) : undefined);
1
4
  const mapLabelsByName = (labels) => {
2
5
  return labels.reduce((acc, { name, value }) => {
3
6
  acc[name] = acc[name] || [];
@@ -28,6 +31,7 @@ export const convertTestResult = (tr) => {
28
31
  steps: tr.steps,
29
32
  error: tr.error,
30
33
  testCase: tr.testCase,
34
+ descriptionHtml: tr.descriptionHtml ?? markdownToHtml(tr.description),
31
35
  environment: tr.environment,
32
36
  setup: [],
33
37
  teardown: [],
@@ -1,7 +1,7 @@
1
- import type { AllureStore } from "@allurereport/plugin-api";
1
+ import type { AwesomeTestResult } from "@allurereport/web-awesome";
2
2
  import type { AwesomeOptions } from "./model.js";
3
3
  type Writer = {
4
4
  writeWidget(fileName: string, data: any): Promise<void>;
5
5
  };
6
- export declare const generateTimeline: (writer: Writer, store: AllureStore, options: AwesomeOptions) => Promise<void>;
6
+ export declare const generateTimeline: (writer: Writer, trs: AwesomeTestResult[], options: AwesomeOptions) => Promise<void>;
7
7
  export {};
@@ -1,16 +1,12 @@
1
- import { hasLabels } from "@allurereport/web-commons";
2
1
  const DEFAULT_MIN_DURATION = 1;
3
- const HOST_LABEL = "host";
4
- const THREAD_LABEL = "thread";
5
2
  const DEFAULT_TIMELINE_OPTIONS = {
6
3
  minDuration: DEFAULT_MIN_DURATION,
7
4
  };
8
- export const generateTimeline = async (writer, store, options) => {
5
+ export const generateTimeline = async (writer, trs, options) => {
9
6
  const { timeline = DEFAULT_TIMELINE_OPTIONS } = options;
10
7
  const { minDuration = DEFAULT_MIN_DURATION } = timeline;
11
- const testResults = await store.allTestResults({ includeHidden: true });
12
8
  const result = [];
13
- for (const test of testResults) {
9
+ for (const test of trs) {
14
10
  const hasStart = Number.isInteger(test.start);
15
11
  const hasStop = Number.isInteger(test.stop);
16
12
  if (!hasStart || !hasStop) {
@@ -20,7 +16,8 @@ export const generateTimeline = async (writer, store, options) => {
20
16
  if (duration < minDuration) {
21
17
  continue;
22
18
  }
23
- if (!hasLabels(test, [HOST_LABEL, THREAD_LABEL])) {
19
+ const { host, thread } = test.groupedLabels;
20
+ if (!host?.length || !thread?.length) {
24
21
  continue;
25
22
  }
26
23
  result.push({
@@ -29,10 +26,10 @@ export const generateTimeline = async (writer, store, options) => {
29
26
  name: test.name,
30
27
  status: test.status,
31
28
  hidden: test.hidden,
32
- labels: test.labels,
29
+ host: host[0],
30
+ thread: thread[0],
33
31
  environment: test.environment,
34
32
  start: test.start,
35
- stop: test.stop,
36
33
  duration,
37
34
  });
38
35
  }
@@ -1,10 +1,10 @@
1
1
  import { type AttachmentLink, type EnvironmentItem, type Statistic, type TestEnvGroup, type TestError, type TestResult } from "@allurereport/core-api";
2
- import type { AllureStore, ExitCode, PluginContext, QualityGateValidationResult, ReportFiles, ResultFile, TestResultFilter } from "@allurereport/plugin-api";
2
+ import type { AllureStore, ExitCode, PluginContext, QualityGateValidationResult, ReportFiles, ResultFile } from "@allurereport/plugin-api";
3
3
  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[], filter?: TestResultFilter) => Promise<AwesomeTestResult[]>;
7
+ export declare const generateTestResults: (writer: AwesomeDataWriter, store: AllureStore, trs: TestResult[]) => Promise<AwesomeTestResult[]>;
8
8
  export declare const generateTestCases: (writer: AwesomeDataWriter, trs: AwesomeTestResult[]) => Promise<void>;
9
9
  export declare const generateTestEnvGroups: (writer: AwesomeDataWriter, groups: TestEnvGroup[]) => Promise<void>;
10
10
  export declare const generateNav: (writer: AwesomeDataWriter, trs: AwesomeTestResult[], filename?: string) => Promise<void>;
@@ -27,7 +27,7 @@ export declare const generateGlobals: (writer: AwesomeDataWriter, payload: {
27
27
  globalErrors?: TestError[];
28
28
  contentFunction: (id: string) => Promise<ResultFile | undefined>;
29
29
  }) => Promise<void>;
30
- export declare const generateQualityGateResults: (writer: AwesomeDataWriter, qualityGateResults?: QualityGateValidationResult[]) => Promise<void>;
30
+ export declare const generateQualityGateResults: (writer: AwesomeDataWriter, qualityGateResults?: Record<string, QualityGateValidationResult[]>) => Promise<void>;
31
31
  export declare const generateStaticFiles: (payload: AwesomeOptions & {
32
32
  id: string;
33
33
  allureVersion: string;
@@ -37,4 +37,4 @@ export declare const generateStaticFiles: (payload: AwesomeOptions & {
37
37
  reportName: string;
38
38
  }) => Promise<void>;
39
39
  export declare const generateAllCharts: (writer: AwesomeDataWriter, store: AllureStore, options: AwesomeOptions, context: PluginContext) => Promise<void>;
40
- export declare const generateTreeFilters: (writer: AwesomeDataWriter, store: AllureStore) => Promise<void>;
40
+ export declare const generateTreeFilters: (writer: AwesomeDataWriter, testResults: AwesomeTestResult[]) => Promise<void>;
@@ -73,10 +73,9 @@ const createBreadcrumbs = (convertedTr) => {
73
73
  return acc;
74
74
  }, []);
75
75
  };
76
- export const generateTestResults = async (writer, store, trs, filter) => {
77
- const allTr = trs.filter((tr) => (filter ? filter(tr) : true));
76
+ export const generateTestResults = async (writer, store, trs) => {
78
77
  let convertedTrs = [];
79
- for (const tr of allTr) {
78
+ for (const tr of trs) {
80
79
  const trFixtures = await store.fixturesByTrId(tr.id);
81
80
  const convertedTrFixtures = trFixtures.map(convertFixtureResult);
82
81
  const convertedTr = convertTestResult(tr);
@@ -283,7 +282,7 @@ export const generateGlobals = async (writer, payload) => {
283
282
  }
284
283
  await writer.writeWidget("globals.json", globals);
285
284
  };
286
- export const generateQualityGateResults = async (writer, qualityGateResults = []) => {
285
+ export const generateQualityGateResults = async (writer, qualityGateResults = {}) => {
287
286
  await writer.writeWidget("quality-gate.json", qualityGateResults);
288
287
  };
289
288
  export const generateStaticFiles = async (payload) => {
@@ -359,23 +358,20 @@ export const generateStaticFiles = async (payload) => {
359
358
  }
360
359
  };
361
360
  export const generateAllCharts = async (writer, store, options, context) => {
362
- const { charts = defaultChartsConfig } = options;
363
- const generatedChartsData = await generateCharts(charts, store, context.reportName, randomUUID);
361
+ const { charts = defaultChartsConfig, filter } = options;
362
+ const generatedChartsData = await generateCharts(charts, store, context.reportName, randomUUID, filter);
364
363
  if (Object.keys(generatedChartsData.general).length > 0) {
365
364
  await writer.writeWidget("charts.json", generatedChartsData);
366
365
  }
367
366
  };
368
- export const generateTreeFilters = async (writer, store) => {
367
+ export const generateTreeFilters = async (writer, testResults) => {
369
368
  const trTags = new Set();
370
- const trs = await store.allTestResults({ includeHidden: false });
371
- for (const tr of trs) {
369
+ for (const tr of testResults) {
372
370
  if (tr.labels.length === 0) {
373
371
  continue;
374
372
  }
375
- tr.labels.forEach((label) => {
376
- if (label.name === "tag" && !!label.value) {
377
- trTags.add(label.value);
378
- }
373
+ Object.values(tr.groupedLabels.tag ?? []).forEach((tag) => {
374
+ trTags.add(tag);
379
375
  });
380
376
  }
381
377
  if (trTags.size === 0) {
package/dist/model.d.ts CHANGED
@@ -5,7 +5,7 @@ export type AwesomeOptions = {
5
5
  singleFile?: boolean;
6
6
  logo?: string;
7
7
  theme?: "light" | "dark" | "auto";
8
- reportLanguage?: "en";
8
+ reportLanguage?: string;
9
9
  groupBy?: string[];
10
10
  layout?: "base" | "split";
11
11
  environments?: Record<string, EnvironmentsConfig>;
package/dist/plugin.js CHANGED
@@ -27,7 +27,7 @@ export class AwesomePlugin {
27
27
  const environmentItems = await store.metadataByKey("allure_environment");
28
28
  const reportEnvironments = await store.allEnvironments();
29
29
  const attachments = await store.allAttachments();
30
- const allTrs = await store.allTestResults({ includeHidden: true });
30
+ const allTrs = await store.allTestResults({ includeHidden: true, filter });
31
31
  const statistics = await store.testsStatistic(filter);
32
32
  const environments = await store.allEnvironments();
33
33
  const envStatistics = new Map();
@@ -35,7 +35,7 @@ export class AwesomePlugin {
35
35
  const globalAttachments = await store.allGlobalAttachments();
36
36
  const globalExitCode = await store.globalExitCode();
37
37
  const globalErrors = await store.allGlobalErrors();
38
- const qualityGateResults = await store.qualityGateResults();
38
+ const qualityGateResults = await store.qualityGateResultsByEnv();
39
39
  for (const env of environments) {
40
40
  envStatistics.set(env, await store.testsStatistic(filterEnv(env, filter)));
41
41
  }
@@ -45,9 +45,9 @@ export class AwesomePlugin {
45
45
  envs: environments,
46
46
  });
47
47
  await generateAllCharts(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, this.options, context);
48
- await generateTimeline(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, this.options);
49
- const convertedTrs = await generateTestResults(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, allTrs, this.options.filter);
48
+ const convertedTrs = await generateTestResults(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store, allTrs);
50
49
  const hasGroupBy = groupBy.length > 0;
50
+ await generateTimeline(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs, this.options);
51
51
  const treeLabels = hasGroupBy
52
52
  ? preciseTreeLabels(groupBy, convertedTrs, ({ labels }) => labels.map(({ name }) => name))
53
53
  : [];
@@ -63,7 +63,7 @@ export class AwesomePlugin {
63
63
  });
64
64
  await generateNav(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), envConvertedTrs, join(reportEnvironment, "nav.json"));
65
65
  }
66
- await generateTreeFilters(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
66
+ await generateTreeFilters(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), convertedTrs);
67
67
  await generateEnvirontmentsList(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
68
68
  await generateVariables(__classPrivateFieldGet(this, _AwesomePlugin_writer, "f"), store);
69
69
  if (environmentItems?.length) {
@@ -114,8 +114,8 @@ export class AwesomePlugin {
114
114
  };
115
115
  }
116
116
  async info(context, store) {
117
- const allTrs = (await store.allTestResults()).filter((tr) => this.options.filter ? this.options.filter(tr) : true);
118
- const newTrs = await store.allNewTestResults();
117
+ const allTrs = await store.allTestResults({ filter: this.options.filter });
118
+ const newTrs = await store.allNewTestResults(this.options.filter);
119
119
  const retryTrs = allTrs.filter((tr) => !!tr?.retries?.length);
120
120
  const flakyTrs = allTrs.filter((tr) => !!tr?.flaky);
121
121
  const duration = allTrs.reduce((acc, { duration: trDuration = 0 }) => acc + trDuration, 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allurereport/plugin-awesome",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "description": "Allure Awesome Plugin – brand new HTML report with modern design and new features",
5
5
  "keywords": [
6
6
  "allure",
@@ -30,18 +30,20 @@
30
30
  "test": "rimraf ./out && vitest run"
31
31
  },
32
32
  "dependencies": {
33
- "@allurereport/charts-api": "3.1.0",
34
- "@allurereport/core-api": "3.1.0",
35
- "@allurereport/plugin-api": "3.1.0",
36
- "@allurereport/web-awesome": "3.1.0",
37
- "@allurereport/web-commons": "3.1.0",
33
+ "@allurereport/charts-api": "3.2.0",
34
+ "@allurereport/core-api": "3.2.0",
35
+ "@allurereport/plugin-api": "3.2.0",
36
+ "@allurereport/web-awesome": "3.2.0",
37
+ "@allurereport/web-commons": "3.2.0",
38
38
  "d3-shape": "^3.2.0",
39
- "handlebars": "^4.7.8"
39
+ "handlebars": "^4.7.8",
40
+ "markdown-it": "^14.1.0"
40
41
  },
41
42
  "devDependencies": {
42
43
  "@stylistic/eslint-plugin": "^2.6.1",
43
44
  "@types/d3-shape": "^3.1.6",
44
45
  "@types/eslint": "^8.56.11",
46
+ "@types/markdown-it": "^14.1.2",
45
47
  "@types/node": "^20.17.9",
46
48
  "@typescript-eslint/eslint-plugin": "^8.0.0",
47
49
  "@typescript-eslint/parser": "^8.0.0",