@allurereport/core 3.0.0-beta.4 → 3.0.0-beta.6

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/dist/api.d.ts CHANGED
@@ -7,9 +7,10 @@ export interface FullConfig {
7
7
  reportFiles: ReportFiles;
8
8
  readers?: ResultsReader[];
9
9
  plugins?: PluginInstance[];
10
- history?: HistoryDataPoint[];
11
- historyPath?: string;
10
+ history: HistoryDataPoint[];
11
+ historyPath: string;
12
12
  appendHistory?: boolean;
13
+ knownIssuesPath: string;
13
14
  known?: KnownTestFailure[];
14
15
  qualityGate?: QualityGateConfig;
15
16
  realTime?: any;
package/dist/config.d.ts CHANGED
@@ -1,22 +1,14 @@
1
1
  import type { Config } from "@allurereport/plugin-api";
2
- import type { QualityGateConfig } from "@allurereport/plugin-api";
3
- import type { FullConfig, PluginInstance } from "./api.js";
4
- export { defineConfig } from "@allurereport/plugin-api";
5
- export declare const createConfig: (opts: {
6
- reportName?: string;
2
+ import type { FullConfig } from "./api.js";
3
+ export declare const getPluginId: (key: string) => string;
4
+ export declare const findConfig: (cwd: string, configPath?: string) => Promise<string | undefined>;
5
+ export interface ConfigOverride {
6
+ name?: string;
7
7
  output?: string;
8
8
  historyPath?: string;
9
9
  knownIssuesPath?: string;
10
- plugins?: PluginInstance[];
11
- qualityGate?: QualityGateConfig;
12
- cwd?: string;
13
- }) => Promise<FullConfig>;
14
- export declare const getPluginId: (key: string) => string;
15
- export declare const findRuntimeConfigPath: (cwd?: string) => Promise<string | undefined>;
16
- export declare const readRuntimeConfig: (configPath?: string, cwd?: string, output?: string, name?: string) => Promise<FullConfig>;
10
+ }
11
+ export declare const readConfig: (cwd?: string, configPath?: string, override?: ConfigOverride) => Promise<FullConfig>;
17
12
  export declare const loadConfig: (configPath: string) => Promise<Config>;
18
- export declare const resolveConfig: (config: Config, override?: {
19
- name?: string;
20
- output?: string;
21
- }) => Promise<FullConfig>;
13
+ export declare const resolveConfig: (config: Config, override?: ConfigOverride) => Promise<FullConfig>;
22
14
  export declare const resolvePlugin: (path: string) => Promise<any>;
package/dist/config.js CHANGED
@@ -1,63 +1,69 @@
1
- import { readdir } from "node:fs/promises";
2
- import { join, resolve } from "node:path";
1
+ import * as console from "node:console";
2
+ import { stat } from "node:fs/promises";
3
+ import { resolve } from "node:path";
3
4
  import * as process from "node:process";
4
5
  import { readHistory } from "./history.js";
5
6
  import { readKnownIssues } from "./known.js";
6
7
  import { FileSystemReportFiles } from "./plugin.js";
7
8
  import { importWrapper } from "./utils/module.js";
8
- export { defineConfig } from "@allurereport/plugin-api";
9
- export const createConfig = async (opts) => {
10
- const { reportName = "Allure Report", output = "allure-report", historyPath, knownIssuesPath, qualityGate, cwd, } = opts;
11
- const workingDirectory = cwd ?? process.cwd();
12
- const target = resolve(workingDirectory, output);
13
- const history = historyPath ? await readHistory(resolve(workingDirectory, historyPath)) : [];
14
- const known = knownIssuesPath ? await readKnownIssues(resolve(workingDirectory, knownIssuesPath)) : [];
15
- return {
16
- name: reportName,
17
- history,
18
- historyPath,
19
- known,
20
- qualityGate,
21
- plugins: opts.plugins ?? [],
22
- reportFiles: new FileSystemReportFiles(target),
23
- output: target,
24
- };
25
- };
26
- const defaultRuntimeConfig = {};
9
+ import { normalizeImportPath } from "./utils/path.js";
27
10
  export const getPluginId = (key) => {
28
11
  return key.replace(/^@.*\//, "").replace(/[/\\]/g, "-");
29
12
  };
30
- export const findRuntimeConfigPath = async (cwd = process.cwd()) => {
31
- const files = await readdir(cwd);
32
- if (files.includes("allurerc.js")) {
33
- return join(cwd, "allurerc.js");
13
+ const configNames = ["allurerc.js", "allurerc.mjs"];
14
+ const defaultConfig = {};
15
+ export const findConfig = async (cwd, configPath) => {
16
+ if (configPath) {
17
+ const resolved = resolve(cwd, configPath);
18
+ try {
19
+ const stats = await stat(resolved);
20
+ if (stats.isFile()) {
21
+ return resolved;
22
+ }
23
+ }
24
+ catch (e) {
25
+ console.error(e);
26
+ }
27
+ throw new Error(`invalid config path ${resolved}: not a regular file`);
34
28
  }
35
- if (files.includes("allurerc.mjs")) {
36
- return join(cwd, "allurerc.mjs");
29
+ for (const configName of configNames) {
30
+ const resolved = resolve(cwd, configName);
31
+ try {
32
+ const stats = await stat(resolved);
33
+ if (stats.isFile()) {
34
+ return resolved;
35
+ }
36
+ }
37
+ catch (ignored) {
38
+ }
37
39
  }
38
- return undefined;
39
40
  };
40
- export const readRuntimeConfig = async (configPath, cwd, output, name) => {
41
- const runtimeConfigPath = !configPath ? await findRuntimeConfigPath(cwd) : resolve(cwd ?? process.cwd(), configPath);
42
- const runtimeConfig = runtimeConfigPath ? await loadConfig(runtimeConfigPath) : defaultRuntimeConfig;
43
- return await resolveConfig(runtimeConfig, { output, name });
41
+ export const readConfig = async (cwd = process.cwd(), configPath, override) => {
42
+ const cfg = await findConfig(cwd, configPath);
43
+ const config = cfg ? await loadConfig(cfg) : { ...defaultConfig };
44
+ return await resolveConfig(config, override);
44
45
  };
45
46
  export const loadConfig = async (configPath) => {
46
- return (await import(configPath)).default;
47
+ return (await import(normalizeImportPath(configPath))).default;
47
48
  };
48
49
  export const resolveConfig = async (config, override = {}) => {
49
- const { plugins = {}, name, output, historyPath, ...rest } = config;
50
- const pluginInstances = await resolvePlugins(plugins);
51
- const out = resolve(override.output ?? output ?? "./allure-report");
52
- const history = historyPath ? await readHistory(historyPath) : [];
50
+ const name = override.name ?? config.name ?? "Allure Report";
51
+ const historyPath = resolve(override.historyPath ?? config.historyPath ?? "./.allure/history.jsonl");
52
+ const knownIssuesPath = resolve(override.knownIssuesPath ?? config.knownIssuesPath ?? "./allure/known.json");
53
+ const output = resolve(override.output ?? config.output ?? "./allure-report");
54
+ const history = await readHistory(historyPath);
55
+ const known = await readKnownIssues(knownIssuesPath);
56
+ const pluginInstances = await resolvePlugins(config.plugins ?? {});
53
57
  return {
54
- ...rest,
55
- name: override.name ?? name ?? "Allure Report",
56
- reportFiles: new FileSystemReportFiles(out),
58
+ name,
59
+ reportFiles: new FileSystemReportFiles(output),
57
60
  plugins: pluginInstances,
58
- output: out,
61
+ output,
59
62
  history,
60
63
  historyPath,
64
+ knownIssuesPath,
65
+ known,
66
+ qualityGate: config.qualityGate,
61
67
  };
62
68
  };
63
69
  export const resolvePlugin = async (path) => {
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export type * from "./api.js";
2
2
  export * from "./utils/misc.js";
3
3
  export * from "./utils/crypto.js";
4
+ export * from "./utils/path.js";
4
5
  export * from "./history.js";
5
6
  export * from "./known.js";
6
- export * from "./config.js";
7
+ export { resolveConfig, readConfig } from "./config.js";
7
8
  export * from "./report.js";
8
9
  export * from "./plugin.js";
9
10
  export * from "./qualityGate.js";
package/dist/index.js CHANGED
@@ -1,8 +1,9 @@
1
1
  export * from "./utils/misc.js";
2
2
  export * from "./utils/crypto.js";
3
+ export * from "./utils/path.js";
3
4
  export * from "./history.js";
4
5
  export * from "./known.js";
5
- export * from "./config.js";
6
+ export { resolveConfig, readConfig } from "./config.js";
6
7
  export * from "./report.js";
7
8
  export * from "./plugin.js";
8
9
  export * from "./qualityGate.js";
package/dist/report.js CHANGED
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
12
  var _AllureReport_instances, _AllureReport_reportUuid, _AllureReport_reportName, _AllureReport_store, _AllureReport_readers, _AllureReport_plugins, _AllureReport_reportFiles, _AllureReport_eventEmitter, _AllureReport_events, _AllureReport_qualityGate, _AllureReport_appendHistory, _AllureReport_historyPath, _AllureReport_realTime, _AllureReport_state, _AllureReport_stage, _AllureReport_update, _AllureReport_eachPlugin, _AllureReport_getPluginState;
13
- import { allure1, allure2, attachments, junitXml } from "@allurereport/reader";
13
+ import { allure1, allure2, attachments, cucumberjson, junitXml } from "@allurereport/reader";
14
14
  import { PathResultFile } from "@allurereport/reader-api";
15
15
  import console from "node:console";
16
16
  import { randomUUID } from "node:crypto";
@@ -159,14 +159,14 @@ export class AllureReport {
159
159
  this.validate = async () => {
160
160
  await __classPrivateFieldGet(this, _AllureReport_qualityGate, "f").validate(__classPrivateFieldGet(this, _AllureReport_store, "f"));
161
161
  };
162
- const { name, readers = [allure1, allure2, junitXml, attachments], plugins = [], history, known, reportFiles, qualityGate, realTime, appendHistory, historyPath, } = opts;
162
+ const { name, readers = [allure1, allure2, cucumberjson, junitXml, attachments], plugins = [], history, known, reportFiles, qualityGate, realTime, appendHistory, historyPath, } = opts;
163
163
  __classPrivateFieldSet(this, _AllureReport_reportUuid, randomUUID(), "f");
164
164
  __classPrivateFieldSet(this, _AllureReport_reportName, name, "f");
165
165
  __classPrivateFieldSet(this, _AllureReport_eventEmitter, new EventEmitter(), "f");
166
166
  __classPrivateFieldSet(this, _AllureReport_events, new Events(__classPrivateFieldGet(this, _AllureReport_eventEmitter, "f")), "f");
167
167
  __classPrivateFieldSet(this, _AllureReport_realTime, realTime, "f");
168
168
  __classPrivateFieldSet(this, _AllureReport_appendHistory, appendHistory ?? true, "f");
169
- __classPrivateFieldSet(this, _AllureReport_historyPath, historyPath ?? "./.allure/history.jsonl", "f");
169
+ __classPrivateFieldSet(this, _AllureReport_historyPath, historyPath, "f");
170
170
  __classPrivateFieldSet(this, _AllureReport_store, new DefaultAllureStore(history, known, __classPrivateFieldGet(this, _AllureReport_eventEmitter, "f")), "f");
171
171
  __classPrivateFieldSet(this, _AllureReport_readers, [...readers], "f");
172
172
  __classPrivateFieldSet(this, _AllureReport_plugins, [...plugins], "f");
@@ -1,9 +1,9 @@
1
1
  import { notNull } from "@allurereport/core-api";
2
2
  import { findByLabelName } from "@allurereport/core-api";
3
3
  import { md5 } from "@allurereport/plugin-api";
4
+ import { extension, lookupContentType } from "@allurereport/reader-api";
4
5
  import MarkdownIt from "markdown-it";
5
6
  import { randomUUID } from "node:crypto";
6
- import { extname } from "node:path";
7
7
  const defaultStatus = "unknown";
8
8
  export const __unknown = "#___unknown_value___#";
9
9
  export const testFixtureResultRawToState = (stateData, raw, context) => {
@@ -102,12 +102,14 @@ const processAttachmentLink = ({ attachments, visitAttachmentLink }, attach) =>
102
102
  const id = md5(attach.originalFileName);
103
103
  const previous = attachments.get(id);
104
104
  if (!previous) {
105
+ const contentType = attach.contentType ?? lookupContentType(attach.originalFileName);
106
+ const ext = extension(attach.originalFileName, contentType) ?? "";
105
107
  const linkExpected = {
106
108
  id,
107
109
  originalFileName: attach.originalFileName,
108
- ext: extname(attach.originalFileName),
110
+ ext,
109
111
  name: attach.name ?? attach.originalFileName,
110
- contentType: attach.contentType,
112
+ contentType,
111
113
  used: true,
112
114
  missed: true,
113
115
  };
@@ -131,6 +133,7 @@ const processAttachmentLink = ({ attachments, visitAttachmentLink }, attach) =>
131
133
  id,
132
134
  name: attach.name ?? previous.originalFileName,
133
135
  contentType: attach.contentType ?? previous.contentType,
136
+ ext: extension(previous.originalFileName, attach.contentType) ?? previous.ext ?? "",
134
137
  contentLength: previous.contentLength,
135
138
  used: true,
136
139
  missed: false,
@@ -15,7 +15,7 @@ export declare class DefaultAllureStore implements AllureStore, ResultsVisitor {
15
15
  constructor(history?: HistoryDataPoint[], known?: KnownTestFailure[], eventEmitter?: EventEmitter<AllureStoreEvents>);
16
16
  visitTestResult(raw: RawTestResult, context: ReaderContext): Promise<void>;
17
17
  visitTestFixtureResult(result: RawFixtureResult, context: ReaderContext): Promise<void>;
18
- visitAttachmentFile(resultFile: ResultFile): Promise<void>;
18
+ visitAttachmentFile(resultFile: ResultFile, context: ReaderContext): Promise<void>;
19
19
  visitMetadata(metadata: RawMetadata): Promise<void>;
20
20
  allTestCases(): Promise<TestCase[]>;
21
21
  allTestResults(options?: {
@@ -12,7 +12,6 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
12
12
  var _DefaultAllureStore_testResults, _DefaultAllureStore_attachments, _DefaultAllureStore_attachmentContents, _DefaultAllureStore_testCases, _DefaultAllureStore_metadata, _DefaultAllureStore_history, _DefaultAllureStore_known, _DefaultAllureStore_fixtures, _DefaultAllureStore_eventEmitter;
13
13
  import { compareBy, nullsLast, ordinal, reverse } from "@allurereport/core-api";
14
14
  import { md5 } from "@allurereport/plugin-api";
15
- import { extname } from "node:path";
16
15
  import { testFixtureResultRawToState, testResultRawToState } from "./convert.js";
17
16
  const index = (indexMap, key, ...items) => {
18
17
  if (key) {
@@ -93,7 +92,7 @@ export class DefaultAllureStore {
93
92
  index(this.indexAttachmentByFixture, testFixtureResult.id, ...attachmentLinks);
94
93
  __classPrivateFieldGet(this, _DefaultAllureStore_eventEmitter, "f")?.emit("testFixtureResult", testFixtureResult.id);
95
94
  }
96
- async visitAttachmentFile(resultFile) {
95
+ async visitAttachmentFile(resultFile, context) {
97
96
  const originalFileName = resultFile.getOriginalFileName();
98
97
  const id = md5(originalFileName);
99
98
  __classPrivateFieldGet(this, _DefaultAllureStore_attachmentContents, "f").set(id, resultFile);
@@ -101,7 +100,7 @@ export class DefaultAllureStore {
101
100
  if (maybeLink) {
102
101
  const link = maybeLink;
103
102
  link.missed = false;
104
- link.ext = link?.ext ?? extname(originalFileName);
103
+ link.ext = link.ext === undefined || link.ext === "" ? resultFile.getExtension() : link.ext;
105
104
  link.contentType = link.contentType ?? resultFile.getContentType();
106
105
  link.contentLength = resultFile.getContentLength();
107
106
  }
@@ -111,7 +110,7 @@ export class DefaultAllureStore {
111
110
  missed: false,
112
111
  id,
113
112
  originalFileName,
114
- ext: extname(originalFileName),
113
+ ext: resultFile.getExtension(),
115
114
  contentType: resultFile.getContentType(),
116
115
  contentLength: resultFile.getContentLength(),
117
116
  });
@@ -1,3 +1,6 @@
1
+ import { createRequire } from "node:module";
2
+ import { normalizeImportPath } from "./path.js";
3
+ const require = createRequire(import.meta.url);
1
4
  export const importWrapper = async (path) => {
2
- return import(path);
5
+ return import(normalizeImportPath(require.resolve(path)));
3
6
  };
@@ -0,0 +1 @@
1
+ export declare const normalizeImportPath: (path: string) => string;
@@ -0,0 +1,4 @@
1
+ import { pathToFileURL } from "node:url";
2
+ export const normalizeImportPath = (path) => {
3
+ return pathToFileURL(path).href;
4
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@allurereport/core",
3
- "version": "3.0.0-beta.4",
3
+ "version": "3.0.0-beta.6",
4
4
  "description": "Collection of generic Allure utilities used across the entire project",
5
5
  "keywords": [
6
6
  "allure"
@@ -25,17 +25,17 @@
25
25
  "test": "vitest run"
26
26
  },
27
27
  "dependencies": {
28
- "@allurereport/core-api": "3.0.0-beta.4",
29
- "@allurereport/plugin-api": "3.0.0-beta.4",
30
- "@allurereport/plugin-awesome": "3.0.0-beta.4",
31
- "@allurereport/plugin-classic": "3.0.0-beta.4",
32
- "@allurereport/plugin-csv": "3.0.0-beta.4",
33
- "@allurereport/plugin-log": "3.0.0-beta.4",
34
- "@allurereport/plugin-progress": "3.0.0-beta.4",
35
- "@allurereport/plugin-slack": "3.0.0-beta.4",
36
- "@allurereport/plugin-testplan": "3.0.0-beta.4",
37
- "@allurereport/reader": "3.0.0-beta.4",
38
- "@allurereport/reader-api": "3.0.0-beta.4",
28
+ "@allurereport/core-api": "3.0.0-beta.6",
29
+ "@allurereport/plugin-api": "3.0.0-beta.6",
30
+ "@allurereport/plugin-awesome": "3.0.0-beta.6",
31
+ "@allurereport/plugin-classic": "3.0.0-beta.6",
32
+ "@allurereport/plugin-csv": "3.0.0-beta.6",
33
+ "@allurereport/plugin-log": "3.0.0-beta.6",
34
+ "@allurereport/plugin-progress": "3.0.0-beta.6",
35
+ "@allurereport/plugin-slack": "3.0.0-beta.6",
36
+ "@allurereport/plugin-testplan": "3.0.0-beta.6",
37
+ "@allurereport/reader": "3.0.0-beta.6",
38
+ "@allurereport/reader-api": "3.0.0-beta.6",
39
39
  "markdown-it": "^14.1.0"
40
40
  },
41
41
  "devDependencies": {