@bigbinary/neeto-playwright-reporter 2.1.0-beta2 → 2.1.1

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,8 +0,0 @@
1
- interface ReporterConfig {
2
- apiKey?: string;
3
- projectKey?: string;
4
- ciBuildId?: string;
5
- [key: string]: string | boolean | number | undefined;
6
- }
7
- export declare function loadReporterOptionsFromConfig(): Promise<ReporterConfig | null>;
8
- export {};
@@ -1,58 +0,0 @@
1
- import fs from "fs";
2
- import path from "path";
3
- import consoleLogFormatted from "@utils/consoleLogFormatted";
4
- import { loadConfigFromFileRestartIfNeeded } from "playwright/lib/common/configLoader";
5
- export async function loadReporterOptionsFromConfig() {
6
- var _a;
7
- try {
8
- const possibleConfigFiles = [
9
- "playwright.config.ts",
10
- "playwright.config.js",
11
- "playwright.config.mjs",
12
- ];
13
- let configFile;
14
- let projectRoot = process.cwd();
15
- const root = path.parse(projectRoot).root;
16
- while (projectRoot !== root) {
17
- const nodeModulesPath = path.join(projectRoot, "node_modules");
18
- if (fs.existsSync(nodeModulesPath)) {
19
- break;
20
- }
21
- projectRoot = path.dirname(projectRoot);
22
- }
23
- for (const file of possibleConfigFiles) {
24
- const configPath = path.join(projectRoot, file);
25
- if (fs.existsSync(configPath)) {
26
- configFile = configPath;
27
- break;
28
- }
29
- }
30
- if (!configFile) {
31
- console.log("No playwright config file found in project root");
32
- return null;
33
- }
34
- const fullConfig = await loadConfigFromFileRestartIfNeeded(configFile, {}, true);
35
- const reporters = (_a = fullConfig === null || fullConfig === void 0 ? void 0 : fullConfig.config) === null || _a === void 0 ? void 0 : _a.reporter;
36
- if (!reporters || !Array.isArray(reporters)) {
37
- return null;
38
- }
39
- for (const reporter of reporters) {
40
- if (Array.isArray(reporter) && reporter.length >= 2) {
41
- const reporterPath = reporter[0];
42
- const reporterOptions = reporter[1];
43
- if (reporterPath &&
44
- (reporterPath.includes("@bigbinary/neeto-playwright-reporter") ||
45
- reporterPath.includes("neeto-playwright-reporter"))) {
46
- return reporterOptions || null;
47
- }
48
- }
49
- }
50
- consoleLogFormatted.error("No neeto reporter found in config");
51
- return null;
52
- }
53
- catch (error) {
54
- consoleLogFormatted.error(`Failed to load playwright config: ${error}`);
55
- return null;
56
- }
57
- }
58
- //# sourceMappingURL=configLoader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configLoader.js","sourceRoot":"","sources":["../../../../src/bin/utils/configLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iCAAiC,EAAE,MAAM,oCAAoC,CAAC;AASvF,MAAM,CAAC,KAAK,UAAU,6BAA6B;;IACjD,IAAI,CAAC;QACH,MAAM,mBAAmB,GAAG;YAC1B,sBAAsB;YACtB,sBAAsB;YACtB,uBAAuB;SACxB,CAAC;QAEF,IAAI,UAA8B,CAAC;QAEnC,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;QAE1C,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YAC/D,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnC,MAAM;YACR,CAAC;YACD,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAChD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,UAAU,GAAG,UAAU,CAAC;gBACxB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,iCAAiC,CACxD,UAAU,EACV,EAAE,EACF,IAAI,CACL,CAAC;QAEF,MAAM,SAAS,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,0CAAE,QAAQ,CAAC;QAE/C,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAEpC,IACE,YAAY;oBACZ,CAAC,YAAY,CAAC,QAAQ,CAAC,sCAAsC,CAAC;wBAC5D,YAAY,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,EACrD,CAAC;oBACD,OAAO,eAAe,IAAI,IAAI,CAAC;gBACjC,CAAC;YACH,CAAC;QACH,CAAC;QAED,mBAAmB,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mBAAmB,CAAC,KAAK,CAAC,qCAAqC,KAAK,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -1,4 +0,0 @@
1
- import { loadReporterOptionsFromConfig } from "./configLoader";
2
- import { parseShard } from "./parseShard";
3
- import sanitizeArgs from "./sanitizeArgs";
4
- export { parseShard, sanitizeArgs, loadReporterOptionsFromConfig };
@@ -1,5 +0,0 @@
1
- import { loadReporterOptionsFromConfig } from "./configLoader";
2
- import { parseShard } from "./parseShard";
3
- import sanitizeArgs from "./sanitizeArgs";
4
- export { parseShard, sanitizeArgs, loadReporterOptionsFromConfig };
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/bin/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,6BAA6B,EAAE,CAAC"}
@@ -1 +0,0 @@
1
- export declare const parseShard: (shard: string) => number[];
@@ -1,19 +0,0 @@
1
- export const parseShard = (shard) => {
2
- if (!shard ||
3
- shard === "" ||
4
- !shard.includes("/") ||
5
- shard.split("/").length !== 2) {
6
- throw new Error("Invalid shard parameter");
7
- }
8
- const [currentShard, totalShards] = shard
9
- .split("/")
10
- .map(shard => parseInt(shard));
11
- if (currentShard > totalShards) {
12
- throw new Error("Current shard cannot be greater than total shards");
13
- }
14
- if (currentShard <= 0 || totalShards <= 0) {
15
- throw new Error("Current shard and total shards cannot be zero or negative");
16
- }
17
- return [currentShard, totalShards];
18
- };
19
- //# sourceMappingURL=parseShard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseShard.js","sourceRoot":"","sources":["../../../../src/bin/utils/parseShard.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE;IAC1C,IACE,CAAC,KAAK;QACN,KAAK,KAAK,EAAE;QACZ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACpB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAC7B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,KAAK;SACtC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAEjC,IAAI,YAAY,GAAG,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,YAAY,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- declare const sanitizeArgs: (args: string[], sensitiveFlags: string[]) => string[];
2
- export default sanitizeArgs;
@@ -1,21 +0,0 @@
1
- const sanitizeArgs = (args, sensitiveFlags) => {
2
- const sanitized = [];
3
- // eslint-disable-next-line @bigbinary/neeto/use-array-methods
4
- for (let argumentIndex = 0; argumentIndex < args.length; argumentIndex++) {
5
- const arg = args[argumentIndex];
6
- const [flagPart] = arg.split("=", 1);
7
- if (sensitiveFlags.includes(flagPart)) {
8
- if (arg.includes("="))
9
- continue;
10
- if (argumentIndex + 1 < args.length &&
11
- !args[argumentIndex + 1].startsWith("--")) {
12
- argumentIndex++;
13
- }
14
- continue;
15
- }
16
- sanitized.push(arg);
17
- }
18
- return sanitized;
19
- };
20
- export default sanitizeArgs;
21
- //# sourceMappingURL=sanitizeArgs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sanitizeArgs.js","sourceRoot":"","sources":["../../../../src/bin/utils/sanitizeArgs.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,CAAC,IAAc,EAAE,cAAwB,EAAE,EAAE;IAChE,MAAM,SAAS,GAAG,EAAE,CAAC;IAErB,8DAA8D;IAC9D,KAAK,IAAI,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QAEhC,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAEhC,IACE,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;gBAC/B,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EACzC,CAAC;gBACD,aAAa,EAAE,CAAC;YAClB,CAAC;YACD,SAAS;QACX,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,40 +0,0 @@
1
- import HeartbeatManagerService from "@utils/heartbeatManager";
2
- import { Bar } from "cli-progress";
3
- import { ReporterOptionParams } from "types";
4
- import test from "./fixtures";
5
- import type { FullConfig, FullResult, Reporter, Suite, TestCase, TestResult } from "@playwright/test/reporter";
6
- declare class NeetoPlaywrightReporter implements Reporter {
7
- private reportLifecycleError;
8
- attempts: Record<string, Record<string, string>> | Record<string, never>;
9
- ciBuildId: string;
10
- config: FullConfig | undefined;
11
- currentShard: number;
12
- totalShards: number | undefined;
13
- testResultCalls: Promise<unknown>[];
14
- totalTestCount: number;
15
- tags: string[] | string;
16
- hasRunStarted: boolean;
17
- heartbeatManager: HeartbeatManagerService | null;
18
- rootDir: string;
19
- progressBars: (Bar | void)[];
20
- startedAttempts: Set<string>;
21
- shouldNotReportTest: boolean;
22
- pendingTestBegins: Set<string>;
23
- pendingTestEnds: Set<string>;
24
- apiKey: string;
25
- title: string | undefined | null;
26
- commitId: string | undefined | null;
27
- author: string | undefined | null;
28
- branch: string | undefined | null;
29
- isListOnly: boolean;
30
- projectKey: string;
31
- specList: string[];
32
- constructor(options: ReporterOptionParams);
33
- onBegin: (config: FullConfig, rootSuite: Suite) => void;
34
- onTestBegin: (test: TestCase, result: TestResult) => void;
35
- onTestEnd: (testCase: TestCase, testResult: TestResult) => void;
36
- onEnd: (fullResult: FullResult) => Promise<void>;
37
- onStdOut(chunk: string | Buffer, test: void | TestCase): void;
38
- }
39
- export default NeetoPlaywrightReporter;
40
- export { test };
@@ -1,96 +0,0 @@
1
- import { HBAK } from "@constants/common";
2
- import Honeybadger from "@honeybadger-io/js";
3
- import { decryptKey, reportToHoneybadger } from "@utils/common";
4
- import consoleLogFormatted from "@utils/consoleLogFormatted";
5
- import { getCurrentReporterVersion } from "@utils/version";
6
- import { AxiosError } from "axios";
7
- import { onBegin } from "lifecycle/onBegin";
8
- import { onEnd } from "lifecycle/onEnd";
9
- import { onTestBegin } from "lifecycle/onTestBegin";
10
- import { onTestEnd } from "lifecycle/onTestEnd";
11
- import test from "./fixtures";
12
- import { initialize } from "./lifecycle/initialize";
13
- class NeetoPlaywrightReporter {
14
- constructor(options) {
15
- var _a;
16
- this.reportLifecycleError = async (lifecycle, error, additionalContext = {}) => {
17
- var _a, _b, _c;
18
- let errorMessage = null;
19
- if (error instanceof AxiosError) {
20
- errorMessage = (_c = (_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.error) !== null && _c !== void 0 ? _c : error === null || error === void 0 ? void 0 : error.message;
21
- }
22
- consoleLogFormatted.error(`${lifecycle} failed: ${errorMessage !== null && errorMessage !== void 0 ? errorMessage : String(error)}`);
23
- await reportToHoneybadger({
24
- context: {
25
- lifecycle,
26
- ciBuildId: this.ciBuildId,
27
- ...additionalContext,
28
- },
29
- error,
30
- title: `${lifecycle} - Fire and Forget Handler`,
31
- });
32
- };
33
- this.onBegin = (config, rootSuite) => {
34
- onBegin(this, config, rootSuite).catch(error => this.reportLifecycleError("onBegin", error, {
35
- configDetails: JSON.stringify(config, null, 2),
36
- }));
37
- };
38
- this.onTestBegin = (test, result) => {
39
- onTestBegin(this, test, result).catch(error => this.reportLifecycleError("onTestBegin", error, {
40
- testTitle: test.title,
41
- testLocation: test.location,
42
- }));
43
- };
44
- this.onTestEnd = (testCase, testResult) => {
45
- onTestEnd(this, testCase, testResult).catch(error => this.reportLifecycleError("onTestEnd", error, {
46
- testTitle: testCase.title,
47
- testLocation: testCase.location,
48
- testStatus: testResult.status,
49
- testDuration: testResult.duration,
50
- }));
51
- };
52
- this.onEnd = async (fullResult) => onEnd(this, fullResult);
53
- this.attempts = {};
54
- this.tags = options.tags;
55
- this.ciBuildId = options.ciBuildId;
56
- this.title = options.title;
57
- this.commitId = options.commitId;
58
- this.author = options.author;
59
- this.branch = options.branch;
60
- this.testResultCalls = [];
61
- this.totalTestCount = 0;
62
- this.hasRunStarted = false;
63
- this.heartbeatManager = null;
64
- this.rootDir = "";
65
- this.currentShard = 0;
66
- this.totalShards = 0;
67
- this.progressBars = [];
68
- this.startedAttempts = new Set();
69
- this.shouldNotReportTest = false;
70
- this.pendingTestBegins = new Set();
71
- this.pendingTestEnds = new Set();
72
- this.apiKey = options.apiKey;
73
- this.isListOnly = false;
74
- this.projectKey = options.projectKey;
75
- this.apiKey = options.apiKey;
76
- this.specList = [];
77
- Honeybadger.configure({
78
- apiKey: decryptKey(HBAK),
79
- environment: ((_a = options === null || options === void 0 ? void 0 : options.baseURL) === null || _a === void 0 ? void 0 : _a.includes(".net"))
80
- ? "staging"
81
- : "production",
82
- });
83
- Honeybadger.setContext({
84
- ...options,
85
- reporterVersion: getCurrentReporterVersion(),
86
- });
87
- initialize(this, options);
88
- }
89
- onStdOut(chunk, test) {
90
- test && consoleLogFormatted.bold(`Log from test "${test.title}"`);
91
- consoleLogFormatted.log(chunk.toString());
92
- }
93
- }
94
- export default NeetoPlaywrightReporter;
95
- export { test };
96
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}