@testivai/witness-cdp 1.0.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.
- package/LICENSE +21 -0
- package/README.md +405 -0
- package/dist/__tests__/setup.d.ts +4 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +24 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/bin/testivai.d.ts +3 -0
- package/dist/bin/testivai.d.ts.map +1 -0
- package/dist/bin/testivai.js +48 -0
- package/dist/bin/testivai.js.map +1 -0
- package/dist/cdp/binding.d.ts +56 -0
- package/dist/cdp/binding.d.ts.map +1 -0
- package/dist/cdp/binding.js +364 -0
- package/dist/cdp/binding.js.map +1 -0
- package/dist/cdp/capture.d.ts +61 -0
- package/dist/cdp/capture.d.ts.map +1 -0
- package/dist/cdp/capture.js +422 -0
- package/dist/cdp/capture.js.map +1 -0
- package/dist/cdp/client.d.ts +63 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +279 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/discovery.d.ts +33 -0
- package/dist/cdp/discovery.d.ts.map +1 -0
- package/dist/cdp/discovery.js +157 -0
- package/dist/cdp/discovery.js.map +1 -0
- package/dist/ci.d.ts +31 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +118 -0
- package/dist/ci.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +122 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/capture.d.ts +3 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +143 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +255 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +438 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +329 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-naming.d.ts +31 -0
- package/dist/utils/file-naming.d.ts.map +1 -0
- package/dist/utils/file-naming.js +137 -0
- package/dist/utils/file-naming.js.map +1 -0
- package/dist/utils/framework-detect.d.ts +31 -0
- package/dist/utils/framework-detect.d.ts.map +1 -0
- package/dist/utils/framework-detect.js +379 -0
- package/dist/utils/framework-detect.js.map +1 -0
- package/dist/utils/logger.d.ts +29 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +114 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process.d.ts +61 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +208 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/template-generator.d.ts +36 -0
- package/dist/utils/template-generator.d.ts.map +1 -0
- package/dist/utils/template-generator.js +255 -0
- package/dist/utils/template-generator.js.map +1 -0
- package/package.json +66 -0
|
@@ -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":";;;AAoBA,oCAoDC;AA8ID,kDAgBC;AAKD,sCAUC;AArPD,iDAAoD;AACpD,qCAAkC;AAgBlC;;GAEG;AACH,SAAgB,YAAY,CAC1B,OAAe,EACf,OAAiB,EAAE,EACnB,UAA0B,EAAE;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YAChD,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC7C,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC;gBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAChC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,OAAO,CAAC;gBACN,QAAQ,EAAE,IAAI;gBACd,MAAM;gBACN,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,eAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAa,cAAc;IAIzB,YACU,OAAe,EACf,OAAiB,EAAE,EACnB,UAA0B,EAAE;QAF5B,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAe;QACnB,YAAO,GAAP,OAAO,CAAqB;QAN9B,UAAK,GAAwB,IAAI,CAAC;QAClC,aAAQ,GAAG,KAAK,CAAC;IAMtB,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,eAAM,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnE,IAAI,CAAC,KAAK,GAAG,IAAA,qBAAK,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAC1C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YACtC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACrD,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACtC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,IAAI,MAAM,EAAE,CAAC;oBACX,eAAM,CAAC,IAAI,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC;gBACzD,CAAC;qBAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,eAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACN,eAAM,CAAC,OAAO,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;oBACtD,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,eAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/D,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACpC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC5B,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACpC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC5B,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;oBACxC,OAAO,CAAC;wBACN,QAAQ,EAAE,IAAI;wBACd,MAAM;wBACN,MAAM;wBACN,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,SAAyB,SAAS;QACrC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,eAAM,CAAC,OAAO,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,CACd,OAAe,EACf,OAAiB,EAAE,EACnB,UAA0B,EAAE;QAE5B,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;CACF;AApID,wCAoIC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,OAAmC;IAEnC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAsB,EAAE,EAAE;QACpD,eAAM,CAAC,IAAI,CAAC,YAAY,MAAM,kBAAkB,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,OAAO,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAgC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface FileMapping {
|
|
2
|
+
src: string;
|
|
3
|
+
dest: string;
|
|
4
|
+
}
|
|
5
|
+
export interface FrameworkConfig {
|
|
6
|
+
key: string;
|
|
7
|
+
label: string;
|
|
8
|
+
language: string;
|
|
9
|
+
testDirDefault: string;
|
|
10
|
+
runCommand: string;
|
|
11
|
+
files: FileMapping[];
|
|
12
|
+
note?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const FRAMEWORKS: FrameworkConfig[];
|
|
15
|
+
export declare function getFrameworkConfig(key: string): FrameworkConfig | undefined;
|
|
16
|
+
export declare function getFrameworksByLanguage(language: string): FrameworkConfig[];
|
|
17
|
+
export interface GenerateOptions {
|
|
18
|
+
frameworkKey: string;
|
|
19
|
+
testDir: string;
|
|
20
|
+
force: boolean;
|
|
21
|
+
cwd?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface GenerateResult {
|
|
24
|
+
created: string[];
|
|
25
|
+
skipped: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare function generateTemplates(options: GenerateOptions): GenerateResult;
|
|
28
|
+
export declare function generateConfig(force: boolean, cwd?: string): {
|
|
29
|
+
created: boolean;
|
|
30
|
+
};
|
|
31
|
+
export declare function generateCypressConfig(force: boolean, cwd?: string): {
|
|
32
|
+
exists: boolean;
|
|
33
|
+
generated: boolean;
|
|
34
|
+
existingFile?: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=template-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-generator.d.ts","sourceRoot":"","sources":["../../src/utils/template-generator.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,UAAU,EAAE,eAAe,EAgIvC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE3E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAE3E;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAwB1E;AAyBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,MAAsB,GAAG;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAOhG;AAcD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,MAAsB,GAAG;IAClF,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAcA"}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.FRAMEWORKS = void 0;
|
|
37
|
+
exports.getFrameworkConfig = getFrameworkConfig;
|
|
38
|
+
exports.getFrameworksByLanguage = getFrameworksByLanguage;
|
|
39
|
+
exports.generateTemplates = generateTemplates;
|
|
40
|
+
exports.generateConfig = generateConfig;
|
|
41
|
+
exports.generateCypressConfig = generateCypressConfig;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
exports.FRAMEWORKS = [
|
|
45
|
+
{
|
|
46
|
+
key: 'cypress',
|
|
47
|
+
label: 'Cypress',
|
|
48
|
+
language: 'javascript',
|
|
49
|
+
testDirDefault: 'cypress/e2e',
|
|
50
|
+
runCommand: 'testivai run "cypress run --browser chrome"',
|
|
51
|
+
files: [
|
|
52
|
+
{ src: 'cypress/testivai-witness.js', dest: 'cypress/support/testivai-witness.js' },
|
|
53
|
+
{ src: 'cypress/testivai-plugin.js', dest: 'cypress/support/testivai-plugin.js' },
|
|
54
|
+
{ src: 'cypress/visual-example.cy.js', dest: 'cypress/e2e/visual-example.cy.js' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
key: 'selenium-js',
|
|
59
|
+
label: 'Selenium',
|
|
60
|
+
language: 'javascript',
|
|
61
|
+
testDirDefault: 'tests',
|
|
62
|
+
runCommand: 'testivai run "npx jest tests/"',
|
|
63
|
+
files: [
|
|
64
|
+
{ src: 'selenium-js/testivai-witness.js', dest: 'testivai-witness.js' },
|
|
65
|
+
{ src: 'selenium-js/visual-example.test.js', dest: '{{testDir}}/visual-example.test.js' },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
key: 'webdriverio',
|
|
70
|
+
label: 'WebdriverIO',
|
|
71
|
+
language: 'javascript',
|
|
72
|
+
testDirDefault: 'test/specs',
|
|
73
|
+
runCommand: 'testivai run "npx wdio run wdio.conf.js"',
|
|
74
|
+
files: [
|
|
75
|
+
{ src: 'webdriverio/testivai-witness.js', dest: 'testivai-witness.js' },
|
|
76
|
+
{ src: 'webdriverio/visual-example.js', dest: 'test/specs/visual-example.js' },
|
|
77
|
+
],
|
|
78
|
+
note: 'Add --remote-debugging-port=9222 to goog:chromeOptions.args in wdio.conf.js.',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
key: 'puppeteer',
|
|
82
|
+
label: 'Puppeteer',
|
|
83
|
+
language: 'javascript',
|
|
84
|
+
testDirDefault: 'tests',
|
|
85
|
+
runCommand: 'testivai run "npx jest tests/"',
|
|
86
|
+
files: [
|
|
87
|
+
{ src: 'puppeteer/testivai-witness.js', dest: 'testivai-witness.js' },
|
|
88
|
+
{ src: 'puppeteer/visual-example.test.js', dest: '{{testDir}}/visual-example.test.js' },
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
key: 'selenium-pytest',
|
|
93
|
+
label: 'Selenium (pytest)',
|
|
94
|
+
language: 'python',
|
|
95
|
+
testDirDefault: 'tests',
|
|
96
|
+
runCommand: 'testivai run "pytest tests/ -v"',
|
|
97
|
+
files: [
|
|
98
|
+
{ src: 'selenium-pytest/testivai_witness.py', dest: 'testivai_witness.py' },
|
|
99
|
+
{ src: 'selenium-pytest/test_visual_example.py', dest: '{{testDir}}/test_visual_example.py' },
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
key: 'selenium-unittest',
|
|
104
|
+
label: 'Selenium (unittest)',
|
|
105
|
+
language: 'python',
|
|
106
|
+
testDirDefault: 'tests',
|
|
107
|
+
runCommand: 'testivai run "python -m unittest discover tests/"',
|
|
108
|
+
files: [
|
|
109
|
+
{ src: 'selenium-unittest/testivai_witness.py', dest: 'testivai_witness.py' },
|
|
110
|
+
{ src: 'selenium-unittest/test_visual_example.py', dest: '{{testDir}}/test_visual_example.py' },
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
key: 'robot-framework',
|
|
115
|
+
label: 'Robot Framework',
|
|
116
|
+
language: 'python',
|
|
117
|
+
testDirDefault: 'tests',
|
|
118
|
+
runCommand: 'testivai run "robot tests/"',
|
|
119
|
+
files: [
|
|
120
|
+
{ src: 'robot-framework/testivai_witness.py', dest: 'testivai_witness.py' },
|
|
121
|
+
{ src: 'robot-framework/testivai_keywords.robot', dest: 'testivai_keywords.robot' },
|
|
122
|
+
{ src: 'robot-framework/visual_example.robot', dest: '{{testDir}}/visual_example.robot' },
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
key: 'selenium-junit',
|
|
127
|
+
label: 'Selenium (JUnit 5)',
|
|
128
|
+
language: 'java',
|
|
129
|
+
testDirDefault: 'src/test/java',
|
|
130
|
+
runCommand: 'testivai run "mvn test"',
|
|
131
|
+
files: [
|
|
132
|
+
{ src: 'selenium-junit/TestivAIWitness.java', dest: 'src/test/java/testivai/TestivAIWitness.java' },
|
|
133
|
+
{ src: 'selenium-junit/VisualExampleTest.java', dest: 'src/test/java/testivai/VisualExampleTest.java' },
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
key: 'selenium-testng',
|
|
138
|
+
label: 'Selenium (TestNG)',
|
|
139
|
+
language: 'java',
|
|
140
|
+
testDirDefault: 'src/test/java',
|
|
141
|
+
runCommand: 'testivai run "mvn test"',
|
|
142
|
+
files: [
|
|
143
|
+
{ src: 'selenium-testng/TestivAIWitness.java', dest: 'src/test/java/testivai/TestivAIWitness.java' },
|
|
144
|
+
{ src: 'selenium-testng/VisualExampleTest.java', dest: 'src/test/java/testivai/VisualExampleTest.java' },
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
key: 'rspec-capybara',
|
|
149
|
+
label: 'RSpec + Capybara',
|
|
150
|
+
language: 'ruby',
|
|
151
|
+
testDirDefault: 'spec/features',
|
|
152
|
+
runCommand: 'testivai run "bundle exec rspec"',
|
|
153
|
+
files: [
|
|
154
|
+
{ src: 'rspec-capybara/testivai_witness.rb', dest: 'testivai_witness.rb' },
|
|
155
|
+
{ src: 'rspec-capybara/visual_example_spec.rb', dest: 'spec/features/visual_example_spec.rb' },
|
|
156
|
+
],
|
|
157
|
+
note: 'Configure Capybara to use Chrome with --remote-debugging-port=9222 in spec/spec_helper.rb.',
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
key: 'cucumber-capybara',
|
|
161
|
+
label: 'Cucumber + Capybara',
|
|
162
|
+
language: 'ruby',
|
|
163
|
+
testDirDefault: 'features',
|
|
164
|
+
runCommand: 'testivai run "bundle exec cucumber"',
|
|
165
|
+
files: [
|
|
166
|
+
{ src: 'cucumber-capybara/testivai_witness.rb', dest: 'testivai_witness.rb' },
|
|
167
|
+
{ src: 'cucumber-capybara/testivai_steps.rb', dest: 'features/step_definitions/testivai_steps.rb' },
|
|
168
|
+
{ src: 'cucumber-capybara/visual_example.feature', dest: 'features/visual_example.feature' },
|
|
169
|
+
],
|
|
170
|
+
note: 'Configure Capybara to use Chrome with --remote-debugging-port=9222 in features/support/env.rb.',
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
function getFrameworkConfig(key) {
|
|
174
|
+
return exports.FRAMEWORKS.find((f) => f.key === key);
|
|
175
|
+
}
|
|
176
|
+
function getFrameworksByLanguage(language) {
|
|
177
|
+
return exports.FRAMEWORKS.filter((f) => f.language === language);
|
|
178
|
+
}
|
|
179
|
+
const TEMPLATES_DIR = path.join(__dirname, '..', 'templates');
|
|
180
|
+
function generateTemplates(options) {
|
|
181
|
+
const { frameworkKey, testDir, force, cwd = process.cwd() } = options;
|
|
182
|
+
const config = getFrameworkConfig(frameworkKey);
|
|
183
|
+
if (!config)
|
|
184
|
+
throw new Error(`Unknown framework: ${frameworkKey}`);
|
|
185
|
+
const created = [];
|
|
186
|
+
const skipped = [];
|
|
187
|
+
for (const mapping of config.files) {
|
|
188
|
+
const destRelative = mapping.dest.replace('{{testDir}}', testDir);
|
|
189
|
+
const srcPath = path.join(TEMPLATES_DIR, mapping.src);
|
|
190
|
+
const destPath = path.join(cwd, destRelative);
|
|
191
|
+
if (fs.existsSync(destPath) && !force) {
|
|
192
|
+
skipped.push(destRelative);
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
fs.mkdirSync(path.dirname(destPath), { recursive: true });
|
|
196
|
+
fs.copyFileSync(srcPath, destPath);
|
|
197
|
+
created.push(destRelative);
|
|
198
|
+
}
|
|
199
|
+
return { created, skipped };
|
|
200
|
+
}
|
|
201
|
+
const CONFIG_CONTENT = `/**
|
|
202
|
+
* TestivAI Configuration
|
|
203
|
+
* Generated by @testivai/witness-cdp
|
|
204
|
+
*/
|
|
205
|
+
import type { CdpConfig } from '@testivai/witness-cdp';
|
|
206
|
+
|
|
207
|
+
const config: CdpConfig = {
|
|
208
|
+
// API key (set via TESTIVAI_API_KEY environment variable)
|
|
209
|
+
// apiKey: 'your-api-key-here',
|
|
210
|
+
|
|
211
|
+
// Project ID from TestivAI dashboard
|
|
212
|
+
// projectId: 'your-project-id-here',
|
|
213
|
+
|
|
214
|
+
// Chrome DevTools Protocol port
|
|
215
|
+
cdpPort: 9222,
|
|
216
|
+
|
|
217
|
+
// Auto-launch Chrome if not running (experimental)
|
|
218
|
+
autoLaunch: false,
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
export default config;
|
|
222
|
+
`;
|
|
223
|
+
function generateConfig(force, cwd = process.cwd()) {
|
|
224
|
+
const configPath = path.join(cwd, 'testivai.config.ts');
|
|
225
|
+
if (fs.existsSync(configPath) && !force) {
|
|
226
|
+
return { created: false };
|
|
227
|
+
}
|
|
228
|
+
fs.writeFileSync(configPath, CONFIG_CONTENT, 'utf-8');
|
|
229
|
+
return { created: true };
|
|
230
|
+
}
|
|
231
|
+
const CYPRESS_CONFIG_CONTENT = `const { defineConfig } = require('cypress');
|
|
232
|
+
const testivaiPlugin = require('./cypress/support/testivai-plugin');
|
|
233
|
+
|
|
234
|
+
module.exports = defineConfig({
|
|
235
|
+
e2e: {
|
|
236
|
+
setupNodeEvents(on, config) {
|
|
237
|
+
return testivaiPlugin(on, config);
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
});
|
|
241
|
+
`;
|
|
242
|
+
function generateCypressConfig(force, cwd = process.cwd()) {
|
|
243
|
+
for (const file of ['cypress.config.js', 'cypress.config.ts']) {
|
|
244
|
+
if (fs.existsSync(path.join(cwd, file))) {
|
|
245
|
+
return { exists: true, generated: false, existingFile: file };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const configPath = path.join(cwd, 'cypress.config.js');
|
|
249
|
+
if (fs.existsSync(configPath) && !force) {
|
|
250
|
+
return { exists: true, generated: false, existingFile: 'cypress.config.js' };
|
|
251
|
+
}
|
|
252
|
+
fs.writeFileSync(configPath, CYPRESS_CONFIG_CONTENT, 'utf-8');
|
|
253
|
+
return { exists: false, generated: true };
|
|
254
|
+
}
|
|
255
|
+
//# sourceMappingURL=template-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-generator.js","sourceRoot":"","sources":["../../src/utils/template-generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoJA,gDAEC;AAED,0DAEC;AAgBD,8CAwBC;AAyBD,wCAOC;AAcD,sDAkBC;AAlQD,uCAAyB;AACzB,2CAA6B;AAiBhB,QAAA,UAAU,GAAsB;IAC3C;QACE,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,YAAY;QACtB,cAAc,EAAE,aAAa;QAC7B,UAAU,EAAE,6CAA6C;QACzD,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,6BAA6B,EAAE,IAAI,EAAE,qCAAqC,EAAE;YACnF,EAAE,GAAG,EAAE,4BAA4B,EAAG,IAAI,EAAE,oCAAoC,EAAE;YAClF,EAAE,GAAG,EAAE,8BAA8B,EAAE,IAAI,EAAE,kCAAkC,EAAE;SAClF;KACF;IACD;QACE,GAAG,EAAE,aAAa;QAClB,KAAK,EAAE,UAAU;QACjB,QAAQ,EAAE,YAAY;QACtB,cAAc,EAAE,OAAO;QACvB,UAAU,EAAE,gCAAgC;QAC5C,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YACvE,EAAE,GAAG,EAAE,oCAAoC,EAAE,IAAI,EAAE,oCAAoC,EAAE;SAC1F;KACF;IACD;QACE,GAAG,EAAE,aAAa;QAClB,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE,YAAY;QACtB,cAAc,EAAE,YAAY;QAC5B,UAAU,EAAE,0CAA0C;QACtD,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,iCAAiC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YACvE,EAAE,GAAG,EAAE,+BAA+B,EAAE,IAAI,EAAE,8BAA8B,EAAE;SAC/E;QACD,IAAI,EAAE,8EAA8E;KACrF;IACD;QACE,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAE,YAAY;QACtB,cAAc,EAAE,OAAO;QACvB,UAAU,EAAE,gCAAgC;QAC5C,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,+BAA+B,EAAE,IAAI,EAAE,qBAAqB,EAAE;YACrE,EAAE,GAAG,EAAE,kCAAkC,EAAE,IAAI,EAAE,oCAAoC,EAAE;SACxF;KACF;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,OAAO;QACvB,UAAU,EAAE,iCAAiC;QAC7C,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,qCAAqC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YAC3E,EAAE,GAAG,EAAE,wCAAwC,EAAE,IAAI,EAAE,oCAAoC,EAAE;SAC9F;KACF;IACD;QACE,GAAG,EAAE,mBAAmB;QACxB,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,OAAO;QACvB,UAAU,EAAE,mDAAmD;QAC/D,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,uCAAuC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YAC7E,EAAE,GAAG,EAAE,0CAA0C,EAAE,IAAI,EAAE,oCAAoC,EAAE;SAChG;KACF;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,OAAO;QACvB,UAAU,EAAE,6BAA6B;QACzC,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,qCAAqC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YAC3E,EAAE,GAAG,EAAE,yCAAyC,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACnF,EAAE,GAAG,EAAE,sCAAsC,EAAE,IAAI,EAAE,kCAAkC,EAAE;SAC1F;KACF;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,yBAAyB;QACrC,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,qCAAqC,EAAE,IAAI,EAAE,6CAA6C,EAAE;YACnG,EAAE,GAAG,EAAE,uCAAuC,EAAE,IAAI,EAAE,+CAA+C,EAAE;SACxG;KACF;IACD;QACE,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,yBAAyB;QACrC,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,sCAAsC,EAAE,IAAI,EAAE,6CAA6C,EAAE;YACpG,EAAE,GAAG,EAAE,wCAAwC,EAAE,IAAI,EAAE,+CAA+C,EAAE;SACzG;KACF;IACD;QACE,GAAG,EAAE,gBAAgB;QACrB,KAAK,EAAE,kBAAkB;QACzB,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,eAAe;QAC/B,UAAU,EAAE,kCAAkC;QAC9C,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,oCAAoC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YAC1E,EAAE,GAAG,EAAE,uCAAuC,EAAE,IAAI,EAAE,sCAAsC,EAAE;SAC/F;QACD,IAAI,EAAE,4FAA4F;KACnG;IACD;QACE,GAAG,EAAE,mBAAmB;QACxB,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,UAAU;QAC1B,UAAU,EAAE,qCAAqC;QACjD,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,uCAAuC,EAAE,IAAI,EAAE,qBAAqB,EAAE;YAC7E,EAAE,GAAG,EAAE,qCAAqC,EAAE,IAAI,EAAE,6CAA6C,EAAE;YACnG,EAAE,GAAG,EAAE,0CAA0C,EAAE,IAAI,EAAE,iCAAiC,EAAE;SAC7F;QACD,IAAI,EAAE,gGAAgG;KACvG;CACF,CAAC;AAEF,SAAgB,kBAAkB,CAAC,GAAW;IAC5C,OAAO,kBAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,uBAAuB,CAAC,QAAgB;IACtD,OAAO,kBAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC3D,CAAC;AAcD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;AAE9D,SAAgB,iBAAiB,CAAC,OAAwB;IACxD,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,YAAY,EAAE,CAAC,CAAC;IAEnE,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAE9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBtB,CAAC;AAEF,SAAgB,cAAc,CAAC,KAAc,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACxC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,sBAAsB,GAAG;;;;;;;;;;CAU9B,CAAC;AAEF,SAAgB,qBAAqB,CAAC,KAAc,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAK/E,KAAK,MAAM,IAAI,IAAI,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACvD,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACxC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,CAAC;IAC/E,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,sBAAsB,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC5C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@testivai/witness-cdp",
|
|
3
|
+
"version": "1.0.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.2.0",
|
|
46
|
+
"chalk": "^4.1.2",
|
|
47
|
+
"chrome-remote-interface": "^0.33.0",
|
|
48
|
+
"commander": "^11.0.0",
|
|
49
|
+
"inquirer": "^8.2.6",
|
|
50
|
+
"ora": "^7.0.0",
|
|
51
|
+
"simple-git": "^3.20.0",
|
|
52
|
+
"ws": "^8.0.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/inquirer": "^8.2.10",
|
|
56
|
+
"@types/jest": "^29.0.0",
|
|
57
|
+
"@types/node": "^20.0.0",
|
|
58
|
+
"@types/ws": "^8.0.0",
|
|
59
|
+
"jest": "^29.0.0",
|
|
60
|
+
"ts-jest": "^29.2.5",
|
|
61
|
+
"typescript": "^5.0.0"
|
|
62
|
+
},
|
|
63
|
+
"engines": {
|
|
64
|
+
"node": ">=18.0.0"
|
|
65
|
+
}
|
|
66
|
+
}
|