@testivai/witness-cdp 0.1.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.

Potentially problematic release.


This version of @testivai/witness-cdp might be problematic. Click here for more details.

Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +405 -0
  3. package/dist/__tests__/setup.d.ts +4 -0
  4. package/dist/__tests__/setup.d.ts.map +1 -0
  5. package/dist/__tests__/setup.js +24 -0
  6. package/dist/__tests__/setup.js.map +1 -0
  7. package/dist/cdp/binding.d.ts +44 -0
  8. package/dist/cdp/binding.d.ts.map +1 -0
  9. package/dist/cdp/binding.js +183 -0
  10. package/dist/cdp/binding.js.map +1 -0
  11. package/dist/cdp/capture.d.ts +42 -0
  12. package/dist/cdp/capture.d.ts.map +1 -0
  13. package/dist/cdp/capture.js +235 -0
  14. package/dist/cdp/capture.js.map +1 -0
  15. package/dist/cdp/client.d.ts +63 -0
  16. package/dist/cdp/client.d.ts.map +1 -0
  17. package/dist/cdp/client.js +279 -0
  18. package/dist/cdp/client.js.map +1 -0
  19. package/dist/cdp/discovery.d.ts +33 -0
  20. package/dist/cdp/discovery.d.ts.map +1 -0
  21. package/dist/cdp/discovery.js +157 -0
  22. package/dist/cdp/discovery.js.map +1 -0
  23. package/dist/commands/auth.d.ts +3 -0
  24. package/dist/commands/auth.d.ts.map +1 -0
  25. package/dist/commands/auth.js +122 -0
  26. package/dist/commands/auth.js.map +1 -0
  27. package/dist/commands/capture.d.ts +3 -0
  28. package/dist/commands/capture.d.ts.map +1 -0
  29. package/dist/commands/capture.js +143 -0
  30. package/dist/commands/capture.js.map +1 -0
  31. package/dist/commands/init.d.ts +3 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +140 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/run.d.ts +3 -0
  36. package/dist/commands/run.d.ts.map +1 -0
  37. package/dist/commands/run.js +307 -0
  38. package/dist/commands/run.js.map +1 -0
  39. package/dist/index.d.ts +20 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +77 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types.d.ts +244 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +7 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/utils/file-naming.d.ts +31 -0
  48. package/dist/utils/file-naming.d.ts.map +1 -0
  49. package/dist/utils/file-naming.js +137 -0
  50. package/dist/utils/file-naming.js.map +1 -0
  51. package/dist/utils/framework-detect.d.ts +31 -0
  52. package/dist/utils/framework-detect.d.ts.map +1 -0
  53. package/dist/utils/framework-detect.js +379 -0
  54. package/dist/utils/framework-detect.js.map +1 -0
  55. package/dist/utils/logger.d.ts +29 -0
  56. package/dist/utils/logger.d.ts.map +1 -0
  57. package/dist/utils/logger.js +114 -0
  58. package/dist/utils/logger.js.map +1 -0
  59. package/dist/utils/process.d.ts +61 -0
  60. package/dist/utils/process.d.ts.map +1 -0
  61. package/dist/utils/process.js +208 -0
  62. package/dist/utils/process.js.map +1 -0
  63. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAgB;gBAEnB,OAAO,GAAE,aAAkB;IAIvC,OAAO,CAAC,SAAS;IAMjB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK5C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK9C,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAK9C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAKnC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7B,YAAY,IAAI,IAAI;IAKpB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAK5C,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAM1D,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKpC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAOrC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAMnC;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC;AAGnC,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = exports.Logger = void 0;
7
+ exports.createLogger = createLogger;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ class Logger {
10
+ constructor(options = {}) {
11
+ this.options = options;
12
+ }
13
+ shouldLog(level) {
14
+ if (this.options.quiet && level !== 'error')
15
+ return false;
16
+ if (level === 'debug' && !this.options.debug)
17
+ return false;
18
+ return true;
19
+ }
20
+ error(message, ...args) {
21
+ if (!this.shouldLog('error'))
22
+ return;
23
+ console.error(chalk_1.default.red(`❌ ${message}`), ...args);
24
+ }
25
+ warn(message, ...args) {
26
+ if (!this.shouldLog('warn'))
27
+ return;
28
+ console.warn(chalk_1.default.yellow(`⚠️ ${message}`), ...args);
29
+ }
30
+ info(message, ...args) {
31
+ if (!this.shouldLog('info'))
32
+ return;
33
+ console.log(chalk_1.default.blue(`ℹ️ ${message}`), ...args);
34
+ }
35
+ debug(message, ...args) {
36
+ if (!this.shouldLog('debug'))
37
+ return;
38
+ console.log(chalk_1.default.gray(`🐛 ${message}`), ...args);
39
+ }
40
+ success(message, ...args) {
41
+ if (!this.shouldLog('success'))
42
+ return;
43
+ console.log(chalk_1.default.green(`✅ ${message}`), ...args);
44
+ }
45
+ verbose(message, ...args) {
46
+ if (!this.options.verbose || this.options.quiet)
47
+ return;
48
+ console.log(chalk_1.default.gray(` ${message}`), ...args);
49
+ }
50
+ plain(message, ...args) {
51
+ if (this.options.quiet)
52
+ return;
53
+ console.log(message, ...args);
54
+ }
55
+ // Specialized loggers for common operations
56
+ capture(snapshotName) {
57
+ if (!this.shouldLog('info'))
58
+ return;
59
+ console.log(chalk_1.default.cyan(`📸 Capturing: ${snapshotName}`));
60
+ }
61
+ upload(batchId) {
62
+ if (!this.shouldLog('info'))
63
+ return;
64
+ console.log(chalk_1.default.cyan(`📤 Uploading batch: ${batchId}`));
65
+ }
66
+ connected(port) {
67
+ if (!this.shouldLog('success'))
68
+ return;
69
+ console.log(chalk_1.default.green(`🔗 Connected to Chrome on port ${port}`));
70
+ }
71
+ disconnected() {
72
+ if (!this.shouldLog('info'))
73
+ return;
74
+ console.log(chalk_1.default.blue(`🔌 Disconnected from Chrome`));
75
+ }
76
+ bindingRegistered(bindingName) {
77
+ if (!this.shouldLog('debug'))
78
+ return;
79
+ console.log(chalk_1.default.gray(`📝 Registered binding: ${bindingName}`));
80
+ }
81
+ bindingCalled(bindingName, payload) {
82
+ if (!this.shouldLog('debug'))
83
+ return;
84
+ console.log(chalk_1.default.gray(`📞 Binding called: ${bindingName}${payload ? ` (${payload})` : ''}`));
85
+ }
86
+ // Progress indicators
87
+ startProgress(message) {
88
+ if (!this.shouldLog('info'))
89
+ return;
90
+ process.stdout.write(`${chalk_1.default.blue('⏳')} ${message}...`);
91
+ }
92
+ updateProgress(message) {
93
+ if (!this.shouldLog('info'))
94
+ return;
95
+ process.stdout.clearLine(0);
96
+ process.stdout.cursorTo(0);
97
+ process.stdout.write(`${chalk_1.default.blue('⏳')} ${message}...`);
98
+ }
99
+ endProgress(message) {
100
+ if (!this.shouldLog('info'))
101
+ return;
102
+ process.stdout.clearLine(0);
103
+ process.stdout.cursorTo(0);
104
+ console.log(`${chalk_1.default.green('✓')} ${message}`);
105
+ }
106
+ }
107
+ exports.Logger = Logger;
108
+ // Create default logger instance
109
+ exports.logger = new Logger();
110
+ // Create logger with options
111
+ function createLogger(options) {
112
+ return new Logger(options);
113
+ }
114
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { ChildProcess } from 'child_process';
2
+ export interface ProcessOptions {
3
+ cwd?: string;
4
+ env?: Record<string, string>;
5
+ silent?: boolean;
6
+ inheritStdio?: boolean;
7
+ }
8
+ export interface ProcessResult {
9
+ exitCode: number | null;
10
+ signal: string | null;
11
+ stdout: string;
12
+ stderr: string;
13
+ }
14
+ /**
15
+ * Spawn a child process and capture its output
16
+ */
17
+ export declare function spawnProcess(command: string, args?: string[], options?: ProcessOptions): Promise<ProcessResult>;
18
+ /**
19
+ * Spawn a process with real-time output and signal handling
20
+ */
21
+ export declare class ProcessManager {
22
+ private command;
23
+ private args;
24
+ private options;
25
+ private child;
26
+ private isKilled;
27
+ constructor(command: string, args?: string[], options?: ProcessOptions);
28
+ /**
29
+ * Start the process
30
+ */
31
+ start(): Promise<void>;
32
+ /**
33
+ * Wait for the process to complete
34
+ */
35
+ wait(): Promise<ProcessResult>;
36
+ /**
37
+ * Kill the process
38
+ */
39
+ kill(signal?: NodeJS.Signals): void;
40
+ /**
41
+ * Check if process is running
42
+ */
43
+ isRunning(): boolean;
44
+ /**
45
+ * Get the child process instance
46
+ */
47
+ getProcess(): ChildProcess | null;
48
+ /**
49
+ * Run a command and return the result
50
+ */
51
+ static run(command: string, args?: string[], options?: ProcessOptions): Promise<ProcessResult>;
52
+ }
53
+ /**
54
+ * Handle SIGINT and SIGTERM gracefully
55
+ */
56
+ export declare function setupSignalHandlers(cleanup: () => void | Promise<void>): void;
57
+ /**
58
+ * Check if a command exists in PATH
59
+ */
60
+ export declare function commandExists(command: string): Promise<boolean>;
61
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC,CAgDxB;AAED;;GAEG;AACH,qBAAa,cAAc;IAKvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;IANjB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAS;gBAGf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,cAAmB;IAGtC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;IAsCpC;;OAEG;IACH,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI;IAQ9C;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,UAAU,IAAI,YAAY,GAAG,IAAI;IAIjC;;OAEG;WACU,GAAG,CACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,CAAC;CAK1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAClC,IAAI,CAcN;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrE"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProcessManager = void 0;
4
+ exports.spawnProcess = spawnProcess;
5
+ exports.setupSignalHandlers = setupSignalHandlers;
6
+ exports.commandExists = commandExists;
7
+ const child_process_1 = require("child_process");
8
+ const logger_1 = require("./logger");
9
+ /**
10
+ * Spawn a child process and capture its output
11
+ */
12
+ function spawnProcess(command, args = [], options = {}) {
13
+ return new Promise((resolve, reject) => {
14
+ const child = (0, child_process_1.spawn)(command, args, {
15
+ cwd: options.cwd || process.cwd(),
16
+ env: { ...process.env, ...options.env },
17
+ stdio: options.inheritStdio ? 'inherit' : 'pipe',
18
+ shell: true,
19
+ });
20
+ let stdout = '';
21
+ let stderr = '';
22
+ if (!options.inheritStdio && !options.silent) {
23
+ child.stdout?.on('data', (data) => {
24
+ const chunk = data.toString();
25
+ stdout += chunk;
26
+ process.stdout.write(chunk);
27
+ });
28
+ child.stderr?.on('data', (data) => {
29
+ const chunk = data.toString();
30
+ stderr += chunk;
31
+ process.stderr.write(chunk);
32
+ });
33
+ }
34
+ else if (options.silent) {
35
+ child.stdout?.on('data', (data) => {
36
+ stdout += data.toString();
37
+ });
38
+ child.stderr?.on('data', (data) => {
39
+ stderr += data.toString();
40
+ });
41
+ }
42
+ child.on('close', (code, signal) => {
43
+ resolve({
44
+ exitCode: code,
45
+ signal,
46
+ stdout,
47
+ stderr,
48
+ });
49
+ });
50
+ child.on('error', (error) => {
51
+ logger_1.logger.error(`Failed to spawn process: ${error.message}`);
52
+ reject(error);
53
+ });
54
+ });
55
+ }
56
+ /**
57
+ * Spawn a process with real-time output and signal handling
58
+ */
59
+ class ProcessManager {
60
+ constructor(command, args = [], options = {}) {
61
+ this.command = command;
62
+ this.args = args;
63
+ this.options = options;
64
+ this.child = null;
65
+ this.isKilled = false;
66
+ }
67
+ /**
68
+ * Start the process
69
+ */
70
+ async start() {
71
+ if (this.child) {
72
+ throw new Error('Process already started');
73
+ }
74
+ logger_1.logger.verbose(`Spawning: ${this.command} ${this.args.join(' ')}`);
75
+ this.child = (0, child_process_1.spawn)(this.command, this.args, {
76
+ cwd: this.options.cwd || process.cwd(),
77
+ env: { ...process.env, ...this.options.env },
78
+ stdio: this.options.inheritStdio ? 'inherit' : 'pipe',
79
+ shell: true,
80
+ });
81
+ // Handle process exit
82
+ this.child.on('close', (code, signal) => {
83
+ if (!this.isKilled) {
84
+ if (signal) {
85
+ logger_1.logger.warn(`Process terminated by signal: ${signal}`);
86
+ }
87
+ else if (code !== null) {
88
+ if (code === 0) {
89
+ logger_1.logger.verbose(`Process exited successfully`);
90
+ }
91
+ else {
92
+ logger_1.logger.verbose(`Process exited with code: ${code}`);
93
+ }
94
+ }
95
+ }
96
+ });
97
+ // Handle process errors
98
+ this.child.on('error', (error) => {
99
+ logger_1.logger.error(`Process error: ${error.message}`);
100
+ });
101
+ // Pipe output if not inheriting
102
+ if (!this.options.inheritStdio && !this.options.silent) {
103
+ if (this.child?.stdout)
104
+ this.child.stdout.pipe(process.stdout);
105
+ if (this.child?.stderr)
106
+ this.child.stderr.pipe(process.stderr);
107
+ }
108
+ }
109
+ /**
110
+ * Wait for the process to complete
111
+ */
112
+ async wait() {
113
+ if (!this.child) {
114
+ throw new Error('Process not started');
115
+ }
116
+ return new Promise((resolve, reject) => {
117
+ let stdout = '';
118
+ let stderr = '';
119
+ if (this.options.silent && this.child) {
120
+ if (this.child.stdout) {
121
+ this.child.stdout.on('data', (data) => {
122
+ stdout += data.toString();
123
+ });
124
+ }
125
+ if (this.child.stderr) {
126
+ this.child.stderr.on('data', (data) => {
127
+ stderr += data.toString();
128
+ });
129
+ }
130
+ }
131
+ if (this.child) {
132
+ this.child.once('close', (code, signal) => {
133
+ resolve({
134
+ exitCode: code,
135
+ signal,
136
+ stdout,
137
+ stderr,
138
+ });
139
+ });
140
+ this.child.once('error', reject);
141
+ }
142
+ });
143
+ }
144
+ /**
145
+ * Kill the process
146
+ */
147
+ kill(signal = 'SIGTERM') {
148
+ if (this.child && !this.child.killed) {
149
+ this.isKilled = true;
150
+ logger_1.logger.verbose(`Killing process with signal: ${signal}`);
151
+ this.child.kill(signal);
152
+ }
153
+ }
154
+ /**
155
+ * Check if process is running
156
+ */
157
+ isRunning() {
158
+ return this.child !== null && !this.child.killed;
159
+ }
160
+ /**
161
+ * Get the child process instance
162
+ */
163
+ getProcess() {
164
+ return this.child;
165
+ }
166
+ /**
167
+ * Run a command and return the result
168
+ */
169
+ static async run(command, args = [], options = {}) {
170
+ const manager = new ProcessManager(command, args, options);
171
+ await manager.start();
172
+ return manager.wait();
173
+ }
174
+ }
175
+ exports.ProcessManager = ProcessManager;
176
+ /**
177
+ * Handle SIGINT and SIGTERM gracefully
178
+ */
179
+ function setupSignalHandlers(cleanup) {
180
+ const handleSignal = async (signal) => {
181
+ logger_1.logger.warn(`Received ${signal}, cleaning up...`);
182
+ try {
183
+ await cleanup();
184
+ process.exit(130); // Standard exit code for SIGINT
185
+ }
186
+ catch (error) {
187
+ logger_1.logger.error('Error during cleanup:', error);
188
+ process.exit(1);
189
+ }
190
+ };
191
+ process.on('SIGINT', () => handleSignal('SIGINT'));
192
+ process.on('SIGTERM', () => handleSignal('SIGTERM'));
193
+ }
194
+ /**
195
+ * Check if a command exists in PATH
196
+ */
197
+ async function commandExists(command) {
198
+ const isWindows = process.platform === 'win32';
199
+ const checkCommand = isWindows ? 'where' : 'which';
200
+ try {
201
+ await ProcessManager.run(checkCommand, [command], { silent: true });
202
+ return true;
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ }
208
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,64 @@
1
+ {
2
+ "name": "@testivai/witness-cdp",
3
+ "version": "0.1.0",
4
+ "description": "Framework-agnostic visual regression testing SDK using Chrome DevTools Protocol",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js"
9
+ },
10
+ "bin": {
11
+ "testivai": "./dist/bin/testivai.js"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "README.md",
16
+ "LICENSE"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "clean": "rm -rf dist",
21
+ "dev": "tsc --watch",
22
+ "prepublishOnly": "npm run build",
23
+ "test": "jest",
24
+ "test:unit": "jest",
25
+ "test:watch": "jest --watch",
26
+ "test:coverage": "jest --coverage"
27
+ },
28
+ "keywords": [
29
+ "testivai",
30
+ "visual-regression",
31
+ "testing",
32
+ "cdp",
33
+ "chrome-devtools-protocol",
34
+ "cypress",
35
+ "selenium",
36
+ "webdriverio",
37
+ "puppeteer"
38
+ ],
39
+ "author": "TestivAI",
40
+ "license": "MIT",
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "dependencies": {
45
+ "@testivai/common": "^0.1.21",
46
+ "chrome-remote-interface": "^0.33.0",
47
+ "commander": "^11.0.0",
48
+ "chalk": "^4.1.2",
49
+ "ora": "^7.0.0",
50
+ "ws": "^8.0.0",
51
+ "simple-git": "^3.20.0"
52
+ },
53
+ "devDependencies": {
54
+ "@types/node": "^20.0.0",
55
+ "@types/ws": "^8.0.0",
56
+ "@types/jest": "^29.0.0",
57
+ "jest": "^29.0.0",
58
+ "ts-jest": "^29.0.0",
59
+ "typescript": "^5.0.0"
60
+ },
61
+ "engines": {
62
+ "node": ">=18.0.0"
63
+ }
64
+ }