@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.
Files changed (75) 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/bin/testivai.d.ts +3 -0
  8. package/dist/bin/testivai.d.ts.map +1 -0
  9. package/dist/bin/testivai.js +48 -0
  10. package/dist/bin/testivai.js.map +1 -0
  11. package/dist/cdp/binding.d.ts +56 -0
  12. package/dist/cdp/binding.d.ts.map +1 -0
  13. package/dist/cdp/binding.js +364 -0
  14. package/dist/cdp/binding.js.map +1 -0
  15. package/dist/cdp/capture.d.ts +61 -0
  16. package/dist/cdp/capture.d.ts.map +1 -0
  17. package/dist/cdp/capture.js +422 -0
  18. package/dist/cdp/capture.js.map +1 -0
  19. package/dist/cdp/client.d.ts +63 -0
  20. package/dist/cdp/client.d.ts.map +1 -0
  21. package/dist/cdp/client.js +279 -0
  22. package/dist/cdp/client.js.map +1 -0
  23. package/dist/cdp/discovery.d.ts +33 -0
  24. package/dist/cdp/discovery.d.ts.map +1 -0
  25. package/dist/cdp/discovery.js +157 -0
  26. package/dist/cdp/discovery.js.map +1 -0
  27. package/dist/ci.d.ts +31 -0
  28. package/dist/ci.d.ts.map +1 -0
  29. package/dist/ci.js +118 -0
  30. package/dist/ci.js.map +1 -0
  31. package/dist/commands/auth.d.ts +3 -0
  32. package/dist/commands/auth.d.ts.map +1 -0
  33. package/dist/commands/auth.js +122 -0
  34. package/dist/commands/auth.js.map +1 -0
  35. package/dist/commands/capture.d.ts +3 -0
  36. package/dist/commands/capture.d.ts.map +1 -0
  37. package/dist/commands/capture.js +143 -0
  38. package/dist/commands/capture.js.map +1 -0
  39. package/dist/commands/init.d.ts +3 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +255 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/run.d.ts +3 -0
  44. package/dist/commands/run.d.ts.map +1 -0
  45. package/dist/commands/run.js +438 -0
  46. package/dist/commands/run.js.map +1 -0
  47. package/dist/index.d.ts +20 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +77 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/types.d.ts +329 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +7 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/utils/file-naming.d.ts +31 -0
  56. package/dist/utils/file-naming.d.ts.map +1 -0
  57. package/dist/utils/file-naming.js +137 -0
  58. package/dist/utils/file-naming.js.map +1 -0
  59. package/dist/utils/framework-detect.d.ts +31 -0
  60. package/dist/utils/framework-detect.d.ts.map +1 -0
  61. package/dist/utils/framework-detect.js +379 -0
  62. package/dist/utils/framework-detect.js.map +1 -0
  63. package/dist/utils/logger.d.ts +29 -0
  64. package/dist/utils/logger.d.ts.map +1 -0
  65. package/dist/utils/logger.js +114 -0
  66. package/dist/utils/logger.js.map +1 -0
  67. package/dist/utils/process.d.ts +61 -0
  68. package/dist/utils/process.d.ts.map +1 -0
  69. package/dist/utils/process.js +208 -0
  70. package/dist/utils/process.js.map +1 -0
  71. package/dist/utils/template-generator.d.ts +36 -0
  72. package/dist/utils/template-generator.d.ts.map +1 -0
  73. package/dist/utils/template-generator.js +255 -0
  74. package/dist/utils/template-generator.js.map +1 -0
  75. 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":"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"}
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
+ }