@testivai/witness 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/browser/binding.d.ts +56 -0
  12. package/dist/browser/binding.d.ts.map +1 -0
  13. package/dist/browser/binding.js +364 -0
  14. package/dist/browser/binding.js.map +1 -0
  15. package/dist/browser/capture.d.ts +61 -0
  16. package/dist/browser/capture.d.ts.map +1 -0
  17. package/dist/browser/capture.js +422 -0
  18. package/dist/browser/capture.js.map +1 -0
  19. package/dist/browser/client.d.ts +63 -0
  20. package/dist/browser/client.d.ts.map +1 -0
  21. package/dist/browser/client.js +279 -0
  22. package/dist/browser/client.js.map +1 -0
  23. package/dist/browser/discovery.d.ts +33 -0
  24. package/dist/browser/discovery.d.ts.map +1 -0
  25. package/dist/browser/discovery.js +157 -0
  26. package/dist/browser/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 +439 -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,439 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.runCommand = void 0;
40
+ const commander_1 = require("commander");
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const client_1 = require("../browser/client");
43
+ const binding_1 = require("../browser/binding");
44
+ const discovery_1 = require("../browser/discovery");
45
+ const common_1 = require("@testivai/common");
46
+ const process_1 = require("../utils/process");
47
+ const logger_1 = require("../utils/logger");
48
+ const ci_1 = require("../ci");
49
+ const simple_git_1 = __importDefault(require("simple-git"));
50
+ exports.runCommand = new commander_1.Command('run')
51
+ .description('Run visual tests with automatic capture')
52
+ .argument('<command>', 'Test command to execute (e.g., "npm test", "cypress run")')
53
+ .option('-p, --port <number>', 'Chrome remote debugging port')
54
+ .option('-b, --batch-id <id>', 'Specify batch ID (auto-generated if not provided)')
55
+ .option('--debug', 'Enable debug logging for snapshots')
56
+ .action(async (command, options) => {
57
+ let client = null;
58
+ let processManager = null;
59
+ let batchId = null;
60
+ // Setup signal handlers for cleanup
61
+ (0, process_1.setupSignalHandlers)(async () => {
62
+ logger_1.logger.info('Cleaning up...');
63
+ if (batchId) {
64
+ await finishBatch(batchId);
65
+ }
66
+ if (client) {
67
+ await client.disconnect();
68
+ }
69
+ if (processManager) {
70
+ processManager.kill();
71
+ }
72
+ });
73
+ try {
74
+ // Load configuration
75
+ const config = (0, common_1.loadConfig)();
76
+ const apiKey = (0, common_1.getApiKey)();
77
+ // Check debug flag from command line or config
78
+ const isDebug = options.debug || config?.debug || false;
79
+ if (!apiKey) {
80
+ logger_1.logger.error('Not authenticated. Run "testivai auth <api-key>" first.');
81
+ process.exit(2);
82
+ }
83
+ // Validate API key
84
+ logger_1.logger.info('Validating API key...');
85
+ const apiClient = new common_1.CoreApiClient(apiKey);
86
+ const validation = await apiClient.validateApiKey();
87
+ if (!validation.valid) {
88
+ logger_1.logger.error(`Invalid API key: ${validation.error}`);
89
+ process.exit(2);
90
+ }
91
+ // Get browser port from config or options
92
+ const resolvedConfig = await config;
93
+ const port = parseInt(options.port || resolvedConfig.browserPort || resolvedConfig.cdpPort || '9222', 10);
94
+ // Get git info first (doesn't require Chrome)
95
+ const gitInfo = await getGitInfo();
96
+ // Detect CI environment
97
+ const ciRunId = (0, ci_1.getCiRunId)();
98
+ const ciInfo = (0, ci_1.getCiInfo)();
99
+ if (ciRunId && isDebug) {
100
+ logger_1.logger.info(`Detected CI environment. Run ID: ${ciRunId}`);
101
+ if (ciInfo) {
102
+ logger_1.logger.info(`CI Info: provider=${ciInfo.provider}, PR=#${ciInfo.prNumber || 'N/A'}`);
103
+ }
104
+ }
105
+ // Start the test command FIRST (non-blocking)
106
+ // This allows the test runner to launch Chrome
107
+ logger_1.logger.info(`Starting test command: ${chalk_1.default.cyan(command)}`);
108
+ processManager = new process_1.ProcessManager(command, [], {
109
+ cwd: process.cwd(),
110
+ env: {
111
+ ...process.env,
112
+ TESTIVAI_MODE: 'true',
113
+ TESTIVAI_BROWSER_PORT: port.toString(),
114
+ TESTIVAI_CDP_PORT: port.toString(),
115
+ },
116
+ });
117
+ await processManager.start();
118
+ // Give the test command a moment to start launching Chrome
119
+ logger_1.logger.info('Waiting for test runner to start...');
120
+ await new Promise(resolve => setTimeout(resolve, 2000));
121
+ // Now wait for Chrome to become available
122
+ logger_1.logger.info('Waiting for browser connection...');
123
+ client = new client_1.BrowserClient();
124
+ let connected = false;
125
+ let retryCount = 0;
126
+ const maxRetries = 60; // Wait up to 60 seconds for Chrome to start
127
+ while (!connected && retryCount < maxRetries && processManager.isRunning()) {
128
+ try {
129
+ await client.connect(port);
130
+ connected = true;
131
+ logger_1.logger.info('Successfully connected to browser');
132
+ }
133
+ catch (error) {
134
+ retryCount++;
135
+ if (retryCount >= maxRetries) {
136
+ throw new Error(`Failed to connect to Chrome after ${maxRetries} attempts. The test runner may not be launching Chrome with --remote-debugging-port=${port}`);
137
+ }
138
+ if (!processManager.isRunning()) {
139
+ throw new Error(`Test command exited before Chrome could start. Make sure your test runner launches Chrome with --remote-debugging-port=${port}`);
140
+ }
141
+ logger_1.logger.info(`Waiting for Chrome on port ${port}... (${retryCount}/${maxRetries})`);
142
+ await new Promise(resolve => setTimeout(resolve, 1000));
143
+ }
144
+ }
145
+ if (!connected) {
146
+ throw new Error('Failed to connect to browser');
147
+ }
148
+ // Get browser info
149
+ const browserInfo = await getBrowserInfo(client);
150
+ // Set up browser binding
151
+ const binding = new binding_1.BrowserBinding(client, { debug: isDebug });
152
+ await binding.setupBindings();
153
+ // Wait for the test command to complete
154
+ logger_1.logger.info('Monitoring test execution...');
155
+ const result = await processManager.wait();
156
+ // Get all captured snapshots
157
+ const snapshots = binding.getSnapshots();
158
+ logger_1.logger.info(`Captured ${snapshots.length} snapshot(s)`);
159
+ // Clean up browser connection
160
+ binding.cleanup();
161
+ // Start batch with snapshots (like Playwright SDK)
162
+ if (snapshots.length > 0) {
163
+ batchId = options.batchId || await startBatchWithSnapshots(apiClient, gitInfo, browserInfo, snapshots, isDebug, ciRunId, ciInfo);
164
+ }
165
+ else {
166
+ batchId = options.batchId || await startBatch(apiClient, gitInfo, browserInfo, ciRunId, ciInfo);
167
+ }
168
+ // Finish batch
169
+ if (batchId) {
170
+ await finishBatch(batchId);
171
+ }
172
+ // Print results
173
+ console.log(chalk_1.default.green('\n=== Test Results ==='));
174
+ console.log(`Batch ID: ${batchId}`);
175
+ console.log(`Snapshots: ${snapshots.length}`);
176
+ console.log(`Exit code: ${result.exitCode}`);
177
+ console.log(`Dashboard: https://dashboard.testiv.ai/projects/${validation.projectId}/batches/${batchId}`);
178
+ // Exit with same code as test command
179
+ process.exit(result.exitCode || 0);
180
+ }
181
+ catch (error) {
182
+ if (error instanceof discovery_1.BrowserDiscoveryError) {
183
+ console.log(chalk_1.default.red(error.message));
184
+ console.log(...error.getInstructions());
185
+ process.exit(3);
186
+ }
187
+ else {
188
+ logger_1.logger.error('Run failed:', error);
189
+ process.exit(4);
190
+ }
191
+ }
192
+ });
193
+ /**
194
+ * Get browser information
195
+ */
196
+ async function getBrowserInfo(client) {
197
+ try {
198
+ const connectionInfo = client.getConnectionInfo();
199
+ // Navigate to a blank page to ensure viewport is properly initialized
200
+ await client.send('Page.navigate', { url: 'about:blank' });
201
+ // Wait a moment for the page to load
202
+ await new Promise(resolve => setTimeout(resolve, 100));
203
+ const userAgent = await client.send('Runtime.evaluate', {
204
+ expression: 'navigator.userAgent',
205
+ returnByValue: true,
206
+ });
207
+ const viewport = await client.send('Runtime.evaluate', {
208
+ expression: `
209
+ (function() {
210
+ return {
211
+ width: window.innerWidth,
212
+ height: window.innerHeight
213
+ };
214
+ })()
215
+ `,
216
+ returnByValue: true,
217
+ });
218
+ // Ensure we have valid viewport dimensions
219
+ const width = viewport.result.value?.width || 1920; // Default fallback
220
+ const height = viewport.result.value?.height || 1080; // Default fallback
221
+ return {
222
+ name: 'chrome',
223
+ version: connectionInfo?.browserVersion || 'unknown',
224
+ viewportWidth: width,
225
+ viewportHeight: height,
226
+ userAgent: userAgent.result.value || 'unknown',
227
+ os: 'unknown',
228
+ device: 'desktop',
229
+ };
230
+ }
231
+ catch (error) {
232
+ logger_1.logger.error('Failed to get browser info:', error);
233
+ // Return sensible defaults if we can't get the actual values
234
+ return {
235
+ name: 'chrome',
236
+ version: 'unknown',
237
+ viewportWidth: 1920,
238
+ viewportHeight: 1080,
239
+ userAgent: 'unknown',
240
+ os: 'unknown',
241
+ device: 'desktop',
242
+ };
243
+ }
244
+ }
245
+ /**
246
+ * Get git information
247
+ */
248
+ async function getGitInfo() {
249
+ try {
250
+ const git = (0, simple_git_1.default)();
251
+ const [branch, commit, message, author] = await Promise.all([
252
+ git.revparse(['--abbrev-ref', 'HEAD']).catch(() => 'unknown'),
253
+ git.revparse(['HEAD']).catch(() => 'unknown'),
254
+ git.show(['-s', '--format=%s']).catch(() => ''),
255
+ git.show(['-s', '--format=%an']).catch(() => ''),
256
+ ]);
257
+ return {
258
+ branch,
259
+ commit,
260
+ message: message || undefined,
261
+ author: author || undefined,
262
+ };
263
+ }
264
+ catch (error) {
265
+ logger_1.logger.error('Failed to get git info:', error);
266
+ return {
267
+ branch: 'unknown',
268
+ commit: 'unknown',
269
+ };
270
+ }
271
+ }
272
+ /**
273
+ * Start a new batch with snapshots (like Playwright SDK)
274
+ */
275
+ async function startBatchWithSnapshots(apiClient, gitInfo, browserInfo, snapshots, debug, ciRunId, ciInfo) {
276
+ try {
277
+ // Transform snapshots to match API format
278
+ const transformedSnapshots = snapshots.map(snapshot => {
279
+ const structureHtml = snapshot.structure || '';
280
+ if (debug) {
281
+ logger_1.logger.info(`DEBUG: Snapshot ${snapshot.name} - Structure length: ${structureHtml.length} chars`);
282
+ }
283
+ if (structureHtml.length === 0) {
284
+ logger_1.logger.warn(`WARNING: Empty structure for snapshot ${snapshot.name}`);
285
+ }
286
+ else if (debug) {
287
+ logger_1.logger.info(`DEBUG: Structure preview: ${structureHtml.substring(0, 100)}...`);
288
+ }
289
+ return {
290
+ snapshotName: snapshot.name,
291
+ testName: snapshot.name,
292
+ timestamp: new Date(snapshot.timestamp).getTime(),
293
+ url: snapshot.url || 'about:blank',
294
+ viewport: snapshot.viewport || { width: 1920, height: 1080 },
295
+ screenshotData: snapshot.screenshot, // Already base64 encoded
296
+ structure: { html: structureHtml },
297
+ styles: snapshot.styles || { computed_styles: {} },
298
+ performanceMetrics: snapshot.performanceMetrics,
299
+ layout: {
300
+ x: 0,
301
+ y: 0,
302
+ width: snapshot.viewport?.width || 1920,
303
+ height: snapshot.viewport?.height || 1080
304
+ }
305
+ };
306
+ });
307
+ const batchPayload = {
308
+ git: gitInfo,
309
+ browser: browserInfo,
310
+ snapshots: transformedSnapshots,
311
+ timestamp: Date.now(),
312
+ runId: ciRunId || process.env.CI_RUN_ID || null,
313
+ ci: ciInfo || null,
314
+ };
315
+ // Compress if large
316
+ const compressionHelper = (await Promise.resolve().then(() => __importStar(require('@testivai/common')))).compressionHelper;
317
+ const payloadJson = JSON.stringify(batchPayload);
318
+ const compressionResult = await compressionHelper.compress(payloadJson);
319
+ const apiKey = (0, common_1.getApiKey)();
320
+ if (!apiKey) {
321
+ throw new Error('API key is required');
322
+ }
323
+ const apiUrl = process.env.TESTIVAI_API_URL || common_1.DEFAULT_CORE_API_URL;
324
+ // Create AbortController for timeout
325
+ const controller = new AbortController();
326
+ const timeout = setTimeout(() => controller.abort(), 30000); // 30 second timeout
327
+ const response = await fetch(`${apiUrl}/api/v1/ingest/start-batch`, {
328
+ method: 'POST',
329
+ headers: {
330
+ 'X-API-Key': apiKey,
331
+ 'Content-Type': 'application/json',
332
+ ...(compressionResult.compressionRatio > 0 && {
333
+ 'Content-Encoding': 'gzip',
334
+ }),
335
+ },
336
+ body: compressionResult.data,
337
+ signal: controller.signal,
338
+ });
339
+ clearTimeout(timeout);
340
+ if (!response.ok) {
341
+ throw new Error(`Failed to start batch: ${response.statusText}`);
342
+ }
343
+ const result = await response.json();
344
+ const returnedBatchId = result.batch_id || result.batchId;
345
+ if (!returnedBatchId) {
346
+ throw new Error('No batch ID returned from API');
347
+ }
348
+ return returnedBatchId;
349
+ }
350
+ catch (error) {
351
+ if (error instanceof Error && error.name === 'AbortError') {
352
+ logger_1.logger.error('Failed to start batch: Request timed out after 30 seconds');
353
+ }
354
+ else {
355
+ logger_1.logger.error('Failed to start batch:', error);
356
+ }
357
+ throw error;
358
+ }
359
+ }
360
+ /**
361
+ * Start a new batch (without snapshots)
362
+ */
363
+ async function startBatch(apiClient, gitInfo, browserInfo, ciRunId, ciInfo) {
364
+ try {
365
+ const apiKey = (0, common_1.getApiKey)();
366
+ if (!apiKey) {
367
+ throw new Error('API key is required');
368
+ }
369
+ const apiUrl = process.env.TESTIVAI_API_URL || common_1.DEFAULT_CORE_API_URL;
370
+ // Create AbortController for timeout
371
+ const controller = new AbortController();
372
+ const timeout = setTimeout(() => controller.abort(), 30000); // 30 second timeout
373
+ const response = await fetch(`${apiUrl}/api/v1/ingest/start-batch`, {
374
+ method: 'POST',
375
+ headers: {
376
+ 'X-API-Key': apiKey,
377
+ 'Content-Type': 'application/json',
378
+ },
379
+ body: JSON.stringify({
380
+ git: gitInfo,
381
+ browser: browserInfo,
382
+ snapshots: [],
383
+ timestamp: Date.now(),
384
+ runId: ciRunId || process.env.CI_RUN_ID || null,
385
+ ci: ciInfo || null,
386
+ }),
387
+ signal: controller.signal,
388
+ });
389
+ clearTimeout(timeout);
390
+ if (!response.ok) {
391
+ throw new Error(`Failed to start batch: ${response.statusText}`);
392
+ }
393
+ const result = await response.json();
394
+ logger_1.logger.upload(result.batch_id);
395
+ return result.batch_id;
396
+ }
397
+ catch (error) {
398
+ if (error instanceof Error && error.name === 'AbortError') {
399
+ logger_1.logger.error('Failed to start batch: Request timed out after 30 seconds');
400
+ }
401
+ else {
402
+ logger_1.logger.error('Failed to start batch:', error);
403
+ }
404
+ throw error;
405
+ }
406
+ }
407
+ /**
408
+ * Finish a batch
409
+ */
410
+ async function finishBatch(batchId) {
411
+ try {
412
+ const apiKey = (0, common_1.getApiKey)();
413
+ if (!apiKey) {
414
+ throw new Error('API key is required');
415
+ }
416
+ const apiUrl = process.env.TESTIVAI_API_URL || common_1.DEFAULT_CORE_API_URL;
417
+ // Create AbortController for timeout
418
+ const controller = new AbortController();
419
+ const timeout = setTimeout(() => controller.abort(), 30000); // 30 second timeout
420
+ const response = await fetch(`${apiUrl}/api/v1/ingest/finish-batch/${batchId}`, {
421
+ method: 'POST',
422
+ headers: {
423
+ 'X-API-Key': apiKey,
424
+ 'Content-Type': 'application/json',
425
+ },
426
+ signal: controller.signal,
427
+ });
428
+ clearTimeout(timeout);
429
+ if (!response.ok) {
430
+ throw new Error(`Failed to finish batch: ${response.statusText}`);
431
+ }
432
+ logger_1.logger.success(`Batch ${batchId} finished successfully`);
433
+ }
434
+ catch (error) {
435
+ logger_1.logger.error('Failed to finish batch:', error);
436
+ // Don't throw here - we want to exit even if finishing fails
437
+ }
438
+ }
439
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * TestivAI Witness SDK
3
+ * Framework-agnostic visual regression testing CLI
4
+ */
5
+ export * from './types';
6
+ export { BrowserClient } from './browser/client';
7
+ export { BrowserCapture } from './browser/capture';
8
+ export { BrowserBinding } from './browser/binding';
9
+ export { BrowserDiscovery, BrowserDiscoveryError } from './browser/discovery';
10
+ export { logger, createLogger } from './utils/logger';
11
+ export { toSafeFilename, generateUniqueFilename, extractNameFromUrl, sanitizeTestName, isSafeFilename } from './utils/file-naming';
12
+ export { ProcessManager, spawnProcess, setupSignalHandlers, commandExists } from './utils/process';
13
+ export { FrameworkDetector } from './utils/framework-detect';
14
+ export { authCommand } from './commands/auth';
15
+ export { initCommand } from './commands/init';
16
+ export { runCommand } from './commands/run';
17
+ export { witnessCommand } from './commands/capture';
18
+ export { CoreApiClient, DEFAULT_CORE_API_URL, saveCredentials, loadCredentials, deleteCredentials, getApiKey, isAuthenticated, findConfigFile, loadConfig, configExists, getOutputDir, CompressionHelper, compressionHelper, } from '@testivai/common';
19
+ export declare const VERSION: any;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnI,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,eAAO,MAAM,OAAO,KAAwC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * TestivAI Witness SDK
4
+ * Framework-agnostic visual regression testing CLI
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
18
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.VERSION = exports.compressionHelper = exports.CompressionHelper = exports.getOutputDir = exports.configExists = exports.loadConfig = exports.findConfigFile = exports.isAuthenticated = exports.getApiKey = exports.deleteCredentials = exports.loadCredentials = exports.saveCredentials = exports.DEFAULT_CORE_API_URL = exports.CoreApiClient = exports.witnessCommand = exports.runCommand = exports.initCommand = exports.authCommand = exports.FrameworkDetector = exports.commandExists = exports.setupSignalHandlers = exports.spawnProcess = exports.ProcessManager = exports.isSafeFilename = exports.sanitizeTestName = exports.extractNameFromUrl = exports.generateUniqueFilename = exports.toSafeFilename = exports.createLogger = exports.logger = exports.BrowserDiscoveryError = exports.BrowserDiscovery = exports.BrowserBinding = exports.BrowserCapture = exports.BrowserClient = void 0;
22
+ // Export types
23
+ __exportStar(require("./types"), exports);
24
+ // Export browser modules
25
+ var client_1 = require("./browser/client");
26
+ Object.defineProperty(exports, "BrowserClient", { enumerable: true, get: function () { return client_1.BrowserClient; } });
27
+ var capture_1 = require("./browser/capture");
28
+ Object.defineProperty(exports, "BrowserCapture", { enumerable: true, get: function () { return capture_1.BrowserCapture; } });
29
+ var binding_1 = require("./browser/binding");
30
+ Object.defineProperty(exports, "BrowserBinding", { enumerable: true, get: function () { return binding_1.BrowserBinding; } });
31
+ var discovery_1 = require("./browser/discovery");
32
+ Object.defineProperty(exports, "BrowserDiscovery", { enumerable: true, get: function () { return discovery_1.BrowserDiscovery; } });
33
+ Object.defineProperty(exports, "BrowserDiscoveryError", { enumerable: true, get: function () { return discovery_1.BrowserDiscoveryError; } });
34
+ // Export utilities
35
+ var logger_1 = require("./utils/logger");
36
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
37
+ Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
38
+ var file_naming_1 = require("./utils/file-naming");
39
+ Object.defineProperty(exports, "toSafeFilename", { enumerable: true, get: function () { return file_naming_1.toSafeFilename; } });
40
+ Object.defineProperty(exports, "generateUniqueFilename", { enumerable: true, get: function () { return file_naming_1.generateUniqueFilename; } });
41
+ Object.defineProperty(exports, "extractNameFromUrl", { enumerable: true, get: function () { return file_naming_1.extractNameFromUrl; } });
42
+ Object.defineProperty(exports, "sanitizeTestName", { enumerable: true, get: function () { return file_naming_1.sanitizeTestName; } });
43
+ Object.defineProperty(exports, "isSafeFilename", { enumerable: true, get: function () { return file_naming_1.isSafeFilename; } });
44
+ var process_1 = require("./utils/process");
45
+ Object.defineProperty(exports, "ProcessManager", { enumerable: true, get: function () { return process_1.ProcessManager; } });
46
+ Object.defineProperty(exports, "spawnProcess", { enumerable: true, get: function () { return process_1.spawnProcess; } });
47
+ Object.defineProperty(exports, "setupSignalHandlers", { enumerable: true, get: function () { return process_1.setupSignalHandlers; } });
48
+ Object.defineProperty(exports, "commandExists", { enumerable: true, get: function () { return process_1.commandExists; } });
49
+ var framework_detect_1 = require("./utils/framework-detect");
50
+ Object.defineProperty(exports, "FrameworkDetector", { enumerable: true, get: function () { return framework_detect_1.FrameworkDetector; } });
51
+ // Export commands (for programmatic use)
52
+ var auth_1 = require("./commands/auth");
53
+ Object.defineProperty(exports, "authCommand", { enumerable: true, get: function () { return auth_1.authCommand; } });
54
+ var init_1 = require("./commands/init");
55
+ Object.defineProperty(exports, "initCommand", { enumerable: true, get: function () { return init_1.initCommand; } });
56
+ var run_1 = require("./commands/run");
57
+ Object.defineProperty(exports, "runCommand", { enumerable: true, get: function () { return run_1.runCommand; } });
58
+ var capture_2 = require("./commands/capture");
59
+ Object.defineProperty(exports, "witnessCommand", { enumerable: true, get: function () { return capture_2.witnessCommand; } });
60
+ // Re-export common utilities
61
+ var common_1 = require("@testivai/common");
62
+ Object.defineProperty(exports, "CoreApiClient", { enumerable: true, get: function () { return common_1.CoreApiClient; } });
63
+ Object.defineProperty(exports, "DEFAULT_CORE_API_URL", { enumerable: true, get: function () { return common_1.DEFAULT_CORE_API_URL; } });
64
+ Object.defineProperty(exports, "saveCredentials", { enumerable: true, get: function () { return common_1.saveCredentials; } });
65
+ Object.defineProperty(exports, "loadCredentials", { enumerable: true, get: function () { return common_1.loadCredentials; } });
66
+ Object.defineProperty(exports, "deleteCredentials", { enumerable: true, get: function () { return common_1.deleteCredentials; } });
67
+ Object.defineProperty(exports, "getApiKey", { enumerable: true, get: function () { return common_1.getApiKey; } });
68
+ Object.defineProperty(exports, "isAuthenticated", { enumerable: true, get: function () { return common_1.isAuthenticated; } });
69
+ Object.defineProperty(exports, "findConfigFile", { enumerable: true, get: function () { return common_1.findConfigFile; } });
70
+ Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return common_1.loadConfig; } });
71
+ Object.defineProperty(exports, "configExists", { enumerable: true, get: function () { return common_1.configExists; } });
72
+ Object.defineProperty(exports, "getOutputDir", { enumerable: true, get: function () { return common_1.getOutputDir; } });
73
+ Object.defineProperty(exports, "CompressionHelper", { enumerable: true, get: function () { return common_1.CompressionHelper; } });
74
+ Object.defineProperty(exports, "compressionHelper", { enumerable: true, get: function () { return common_1.compressionHelper; } });
75
+ // Version
76
+ exports.VERSION = require('../../package.json').version;
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,eAAe;AACf,0CAAwB;AAExB,yBAAyB;AACzB,2CAAiD;AAAxC,uGAAA,aAAa,OAAA;AACtB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,6CAAmD;AAA1C,yGAAA,cAAc,OAAA;AACvB,iDAA8E;AAArE,6GAAA,gBAAgB,OAAA;AAAE,kHAAA,qBAAqB,OAAA;AAEhD,mBAAmB;AACnB,yCAAsD;AAA7C,gGAAA,MAAM,OAAA;AAAE,sGAAA,YAAY,OAAA;AAC7B,mDAAmI;AAA1H,6GAAA,cAAc,OAAA;AAAE,qHAAA,sBAAsB,OAAA;AAAE,iHAAA,kBAAkB,OAAA;AAAE,+GAAA,gBAAgB,OAAA;AAAE,6GAAA,cAAc,OAAA;AACrG,2CAAmG;AAA1F,yGAAA,cAAc,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AAAE,wGAAA,aAAa,OAAA;AACzE,6DAA6D;AAApD,qHAAA,iBAAiB,OAAA;AAE1B,yCAAyC;AACzC,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,wCAA8C;AAArC,mGAAA,WAAW,OAAA;AACpB,sCAA4C;AAAnC,iGAAA,UAAU,OAAA;AACnB,8CAAoD;AAA3C,yGAAA,cAAc,OAAA;AAEvB,6BAA6B;AAC7B,2CAc0B;AAbxB,uGAAA,aAAa,OAAA;AACb,8GAAA,oBAAoB,OAAA;AACpB,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,2GAAA,iBAAiB,OAAA;AACjB,mGAAA,SAAS,OAAA;AACT,yGAAA,eAAe,OAAA;AACf,wGAAA,cAAc,OAAA;AACd,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AACZ,sGAAA,YAAY,OAAA;AACZ,2GAAA,iBAAiB,OAAA;AACjB,2GAAA,iBAAiB,OAAA;AAGnB,UAAU;AACG,QAAA,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC"}