major-tom-playwright-reporter 0.0.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.
@@ -0,0 +1,8 @@
1
+ import { MissionDetails } from "./mission-details";
2
+ export interface MetadataOptions {
3
+ noCapsule?: true;
4
+ }
5
+ type RunMetadata = Omit<MissionDetails, "groundControl">;
6
+ export declare function getRunMetadata(options: MetadataOptions): RunMetadata;
7
+ export {};
8
+ //# sourceMappingURL=env-metadata-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-metadata-helpers.d.ts","sourceRoot":"","sources":["../src/env-metadata-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,KAAK,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAA;AAExD,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,WAAW,CAcpE"}
@@ -0,0 +1,40 @@
1
+ import * as os from "node:os";
2
+ export function getRunMetadata(options) {
3
+ const result = {};
4
+ if (!options.noCapsule) {
5
+ result.capsule = os.hostname();
6
+ }
7
+ // Новый способ получения CI информации
8
+ const ci = getCiMeta();
9
+ if (Object.keys(ci).length > 0) {
10
+ result.ci = ci;
11
+ }
12
+ return result;
13
+ }
14
+ function getCiMeta() {
15
+ const ciInfo = {};
16
+ // Git информация
17
+ if (process.env.GIT_BRANCH) {
18
+ ciInfo.branch = process.env.GIT_BRANCH;
19
+ }
20
+ if (process.env.GIT_COMMIT) {
21
+ ciInfo.commit = process.env.GIT_COMMIT;
22
+ }
23
+ // Pull Request информация
24
+ if (process.env.CHANGE_URL) {
25
+ ciInfo.pullRequestUrl = process.env.CHANGE_URL;
26
+ }
27
+ // Автор
28
+ if (process.env.CHANGE_AUTHOR) {
29
+ ciInfo.authorName = process.env.CHANGE_AUTHOR;
30
+ }
31
+ if (process.env.CHANGE_AUTHOR_DISPLAY_NAME) {
32
+ ciInfo.authorDisplayName = process.env.CHANGE_AUTHOR_DISPLAY_NAME;
33
+ }
34
+ // Job URL
35
+ if (process.env.JOB_URL) {
36
+ ciInfo.jobUrl = process.env.JOB_URL;
37
+ }
38
+ return ciInfo;
39
+ }
40
+ //# sourceMappingURL=env-metadata-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-metadata-helpers.js","sourceRoot":"","sources":["../src/env-metadata-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAS7B,MAAM,UAAU,cAAc,CAAC,OAAwB;IAErD,MAAM,MAAM,GAAgB,EAAE,CAAA;IAC9B,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;IAChC,CAAC;IAED,uCAAuC;IACvC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAA;IACtB,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;IAChB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,SAAS;IAChB,MAAM,MAAM,GAAsC,EAAE,CAAA;IAEpD,iBAAiB;IACjB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACxC,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACxC,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IAChD,CAAC;IAED,QAAQ;IACR,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC9B,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;IAC/C,CAAC;IAED,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC;QAC3C,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAA;IACnE,CAAC;IAED,UAAU;IACV,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAA;IACrC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { MajorTom } from './major-tom';
2
+ export default MajorTom;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAA;AAEpC,eAAe,QAAQ,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ import { MajorTom } from './major-tom';
2
+ export default MajorTom;
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAA;AAEpC,eAAe,QAAQ,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { FullConfig, FullResult, Reporter, Suite, TestCase, TestError, TestResult, TestStep } from '@playwright/test/reporter';
2
+ import { Socket, type Channel } from 'phoenix';
3
+ import { MissionDetails } from './mission-details';
4
+ export declare class MajorTom implements Reporter {
5
+ socket: Socket;
6
+ mission_id: string;
7
+ uplink: Channel;
8
+ constructor({ groundControl, ...missionDetails }: MissionDetails);
9
+ onBegin(config: FullConfig, suite: Suite): void;
10
+ onEnd(result: FullResult): void;
11
+ onError(error: TestError): void;
12
+ onTestBegin(test: TestCase, result: TestResult): void;
13
+ onTestEnd(test: TestCase, result: TestResult): void;
14
+ onStdOut(chunk: string): void;
15
+ onStdErr(chunk: string): void;
16
+ onExit(): Promise<void>;
17
+ onStepBegin(test: TestCase, result: TestResult, step: TestStep): void;
18
+ onStepEnd(test: TestCase, result: TestResult, step: TestStep): void;
19
+ printsToStdio(): boolean;
20
+ }
21
+ //# sourceMappingURL=major-tom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"major-tom.d.ts","sourceRoot":"","sources":["../src/major-tom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAE9H,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBAAa,QAAS,YAAW,QAAQ;IAEvC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAK;IACvB,MAAM,EAAE,OAAO,CAAC;gBAEJ,EAAE,aAAa,EAAE,GAAG,cAAc,EAAE,EAAE,cAAc;IA4BhE,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAY/C,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAU/B,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAE/B,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IASrD,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAanD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAE7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAE7B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAavB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAErE,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAEnE,aAAa,IAAI,OAAO;CAGzB"}
@@ -0,0 +1,90 @@
1
+ import { WebSocket } from 'ws';
2
+ import { Socket } from 'phoenix';
3
+ export class MajorTom {
4
+ constructor({ groundControl, ...missionDetails }) {
5
+ this.mission_id = '';
6
+ if (groundControl) {
7
+ this.socket = new Socket(groundControl, { timeout: 500, transport: WebSocket });
8
+ this.socket.connect();
9
+ // Передаем missionDetails сразу при подключении к lobby
10
+ const lobby = this.socket.channel("uplink:lobby", { missionDetails });
11
+ this.uplink = lobby;
12
+ this.uplink.join().receive("ok", (res) => {
13
+ console.log("mission_id:", res.mission_id);
14
+ this.mission_id = res.mission_id; // Используем mission_id вместо report_id
15
+ // Переходим к специфичному каналу
16
+ const missionSpecific = this.socket.channel(`uplink:${this.mission_id}`);
17
+ missionSpecific.join().receive("ok", () => {
18
+ this.uplink = missionSpecific;
19
+ lobby.leave().receive("ok", () => {
20
+ // Больше ничего не отправляем - всё уже было отправлено в lobby
21
+ });
22
+ });
23
+ });
24
+ }
25
+ else {
26
+ throw new Error("No ground control uplink specified");
27
+ }
28
+ }
29
+ // Используем mission_id вместо report_id
30
+ onBegin(config, suite) {
31
+ this.uplink.push('test-run-start', {
32
+ mission_id: this.mission_id,
33
+ payload: {
34
+ tests: suite.allTests().map(test => ({
35
+ title: test.title,
36
+ id: test.id
37
+ }))
38
+ }
39
+ });
40
+ }
41
+ onEnd(result) {
42
+ this.uplink.push('test-run-end', {
43
+ mission_id: this.mission_id,
44
+ payload: {
45
+ status: result.status,
46
+ duration: result.duration
47
+ }
48
+ });
49
+ }
50
+ onError(error) { }
51
+ onTestBegin(test, result) {
52
+ this.uplink.push('test-begin', {
53
+ mission_id: this.mission_id,
54
+ payload: {
55
+ id: test.id
56
+ }
57
+ });
58
+ }
59
+ onTestEnd(test, result) {
60
+ this.uplink.push('test-end', {
61
+ mission_id: this.mission_id,
62
+ payload: {
63
+ id: test.id,
64
+ status: result.status,
65
+ duration: result.duration,
66
+ retry: result.retry,
67
+ outcome: test.outcome()
68
+ }
69
+ });
70
+ }
71
+ onStdOut(chunk) { }
72
+ onStdErr(chunk) { }
73
+ onExit() {
74
+ return new Promise((resolve) => {
75
+ if (this.socket) {
76
+ this.uplink.push("exit", {});
77
+ this.uplink.leave();
78
+ this.socket.disconnect();
79
+ }
80
+ // На случай, если нужно чуть больше времени для отправки
81
+ setTimeout(() => resolve(), 100);
82
+ });
83
+ }
84
+ onStepBegin(test, result, step) { }
85
+ onStepEnd(test, result, step) { }
86
+ printsToStdio() {
87
+ return true;
88
+ }
89
+ }
90
+ //# sourceMappingURL=major-tom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"major-tom.js","sourceRoot":"","sources":["../src/major-tom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type MissionDetails = {
2
+ groundControl: string;
3
+ project?: string;
4
+ capsule?: string;
5
+ ci?: {
6
+ branch?: string;
7
+ commit?: string;
8
+ pullRequestUrl?: string;
9
+ authorName?: string;
10
+ authorDisplayName?: string;
11
+ jobUrl?: string;
12
+ };
13
+ };
14
+ //# sourceMappingURL=mission-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-details.d.ts","sourceRoot":"","sources":["../src/mission-details.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,EAAE,CAAC,EAAE;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAA;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mission-details.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-details.js","sourceRoot":"","sources":["../src/mission-details.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "major-tom-playwright-reporter",
3
+ "version": "0.0.1",
4
+ "description": "Playwright reporter for realtime monitoring for CI/Dev",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "require": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./env-metadata-helpers": {
14
+ "import": "./dist/env-metadata-helpers.js",
15
+ "require": "./dist/env-metadata-helpers.js",
16
+ "types": "./dist/env-metadata-helpers.d.ts"
17
+ }
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "https://gitverse.ru/webperf/mt2gc"
22
+ },
23
+ "bugs": {
24
+ "url": "https://gitverse.ru/webperf/mt2gc/tasktracker"
25
+ },
26
+ "homepage": "https://gitverse.ru/webperf/mt2gc",
27
+ "scripts": {
28
+ "build": "tsc",
29
+ "prepublishOnly": "npm run build",
30
+ "test": "vitest run",
31
+ "tdd": "vitest"
32
+ },
33
+ "keywords": [
34
+ "playwright",
35
+ "reporter",
36
+ "test",
37
+ "testing",
38
+ "phoenix",
39
+ "websocket",
40
+ "realtime"
41
+ ],
42
+ "author": "Alexander Taran",
43
+ "license": "MIT",
44
+ "devDependencies": {
45
+ "@playwright/test": "^1.57.0",
46
+ "@types/node": "^25.0.3",
47
+ "@types/ws": "^8.5.3",
48
+ "typescript": "^5.9.3",
49
+ "vitest": "^2.0.0"
50
+ },
51
+ "files": [
52
+ "dist/",
53
+ "README.md",
54
+ "LICENSE"
55
+ ],
56
+ "dependencies": {
57
+ "phoenix": "^1.8.3",
58
+ "ws": "^8.18.0"
59
+ },
60
+ "peerDependencies": {
61
+ "@playwright/test": "^1.30.0"
62
+ }
63
+ }