@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,279 @@
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.CdpClient = void 0;
40
+ const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
41
+ const events_1 = require("events");
42
+ const logger_1 = require("../utils/logger");
43
+ /**
44
+ * Chrome DevTools Protocol client wrapper
45
+ */
46
+ class CdpClient extends events_1.EventEmitter {
47
+ constructor() {
48
+ super(...arguments);
49
+ this.client = null;
50
+ this.connectionInfo = null;
51
+ this.isConnected = false;
52
+ this.reconnectAttempts = 0;
53
+ this.maxReconnectAttempts = 3;
54
+ this.reconnectDelay = 500;
55
+ }
56
+ /**
57
+ * Connect to Chrome DevTools Protocol
58
+ */
59
+ async connect(port) {
60
+ try {
61
+ // Import here to avoid issues if chrome-remote-interface is not available
62
+ const { CdpDiscovery } = await Promise.resolve().then(() => __importStar(require('./discovery')));
63
+ // Discover CDP endpoint
64
+ this.connectionInfo = await CdpDiscovery.discover(port);
65
+ // Connect to the WebSocket
66
+ this.client = await (0, chrome_remote_interface_1.default)({
67
+ target: this.connectionInfo.webSocketDebuggerUrl,
68
+ });
69
+ // Set up event handlers
70
+ if (this.client) {
71
+ this.client.on('disconnect', () => {
72
+ this.isConnected = false;
73
+ this.emit('disconnect');
74
+ logger_1.logger.debug('CDP client disconnected');
75
+ });
76
+ this.client.on('event', (method, params) => {
77
+ this.emit('event', method, params);
78
+ });
79
+ }
80
+ this.isConnected = true;
81
+ this.reconnectAttempts = 0;
82
+ logger_1.logger.connected(port || 9222);
83
+ this.emit('connect', this.client);
84
+ }
85
+ catch (error) {
86
+ logger_1.logger.error(`Failed to connect to CDP: ${error}`);
87
+ // Try to reconnect if we haven't exceeded max attempts
88
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
89
+ this.reconnectAttempts++;
90
+ logger_1.logger.debug(`Reconnecting attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}...`);
91
+ await new Promise(resolve => setTimeout(resolve, this.reconnectDelay));
92
+ return this.connect(port);
93
+ }
94
+ throw error;
95
+ }
96
+ }
97
+ /**
98
+ * Disconnect from CDP
99
+ */
100
+ async disconnect() {
101
+ if (this.client) {
102
+ try {
103
+ await this.client.close();
104
+ this.client = null;
105
+ this.isConnected = false;
106
+ this.connectionInfo = null;
107
+ logger_1.logger.disconnected();
108
+ this.emit('disconnect');
109
+ }
110
+ catch (error) {
111
+ logger_1.logger.error(`Error disconnecting from CDP: ${error}`);
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Check if connected
117
+ */
118
+ isClientConnected() {
119
+ return this.isConnected && this.client !== null;
120
+ }
121
+ /**
122
+ * Get the raw CDP client
123
+ */
124
+ getClient() {
125
+ return this.client;
126
+ }
127
+ /**
128
+ * Get connection info
129
+ */
130
+ getConnectionInfo() {
131
+ return this.connectionInfo;
132
+ }
133
+ /**
134
+ * Enable a domain
135
+ */
136
+ async enableDomain(domain) {
137
+ if (!this.client) {
138
+ throw new Error('Not connected to CDP');
139
+ }
140
+ try {
141
+ await this.client.send(`${domain}.enable`);
142
+ logger_1.logger.debug(`Enabled domain: ${domain}`);
143
+ }
144
+ catch (error) {
145
+ logger_1.logger.error(`Failed to enable domain ${domain}: ${error}`);
146
+ throw error;
147
+ }
148
+ }
149
+ /**
150
+ * Send a command to CDP
151
+ */
152
+ async send(method, params) {
153
+ if (!this.client) {
154
+ throw new Error('Not connected to CDP');
155
+ }
156
+ try {
157
+ const result = await this.client.send(method, params);
158
+ logger_1.logger.debug(`CDP command: ${method}`, params);
159
+ return result;
160
+ }
161
+ catch (error) {
162
+ logger_1.logger.error(`CDP command failed: ${method}`, error);
163
+ throw error;
164
+ }
165
+ }
166
+ /**
167
+ * Get available targets (tabs/pages)
168
+ */
169
+ async getTargets() {
170
+ if (!this.client) {
171
+ throw new Error('Not connected to CDP');
172
+ }
173
+ try {
174
+ const { Target } = this.client;
175
+ const targets = await Target.getTargets();
176
+ return targets.targetInfos;
177
+ }
178
+ catch (error) {
179
+ logger_1.logger.error('Failed to get targets:', error);
180
+ throw error;
181
+ }
182
+ }
183
+ /**
184
+ * Attach to a specific target
185
+ */
186
+ async attachToTarget(targetId) {
187
+ if (!this.client) {
188
+ throw new Error('Not connected to CDP');
189
+ }
190
+ try {
191
+ const { Target } = this.client;
192
+ await Target.attachToTarget({ targetId, flatten: true });
193
+ logger_1.logger.debug(`Attached to target: ${targetId}`);
194
+ }
195
+ catch (error) {
196
+ logger_1.logger.error(`Failed to attach to target ${targetId}:`, error);
197
+ throw error;
198
+ }
199
+ }
200
+ /**
201
+ * Create a new tab
202
+ */
203
+ async createTarget(url = 'about:blank') {
204
+ if (!this.client) {
205
+ throw new Error('Not connected to CDP');
206
+ }
207
+ try {
208
+ const { Target } = this.client;
209
+ const result = await Target.createTarget({ url });
210
+ logger_1.logger.debug(`Created new target: ${result.targetId}`);
211
+ return result.targetId;
212
+ }
213
+ catch (error) {
214
+ logger_1.logger.error('Failed to create target:', error);
215
+ throw error;
216
+ }
217
+ }
218
+ /**
219
+ * Close a target
220
+ */
221
+ async closeTarget(targetId) {
222
+ if (!this.client) {
223
+ throw new Error('Not connected to CDP');
224
+ }
225
+ try {
226
+ const { Target } = this.client;
227
+ await Target.closeTarget({ targetId });
228
+ logger_1.logger.debug(`Closed target: ${targetId}`);
229
+ }
230
+ catch (error) {
231
+ logger_1.logger.error(`Failed to close target ${targetId}:`, error);
232
+ throw error;
233
+ }
234
+ }
235
+ /**
236
+ * Set up event listeners for specific domains
237
+ */
238
+ setupEventListeners() {
239
+ if (!this.client) {
240
+ return;
241
+ }
242
+ // Page events
243
+ if (this.client.Page) {
244
+ this.client.Page.frameNavigated((params) => {
245
+ this.emit('frameNavigated', params);
246
+ logger_1.logger.debug('Frame navigated:', params.frame.id);
247
+ });
248
+ this.client.Page.loadEventFired(() => {
249
+ this.emit('loadEventFired');
250
+ logger_1.logger.debug('Load event fired');
251
+ });
252
+ }
253
+ // Runtime events
254
+ if (this.client.Runtime) {
255
+ this.client.Runtime.bindingCalled((params) => {
256
+ this.emit('bindingCalled', params);
257
+ logger_1.logger.bindingCalled(params.name, params.payload);
258
+ });
259
+ this.client.Runtime.consoleAPICalled((params) => {
260
+ this.emit('consoleAPICalled', params);
261
+ });
262
+ this.client.Runtime.exceptionThrown((params) => {
263
+ this.emit('exceptionThrown', params);
264
+ logger_1.logger.error('Runtime exception:', params.exceptionDetails);
265
+ });
266
+ }
267
+ // Network events
268
+ if (this.client.Network) {
269
+ this.client.Network.requestWillBeSent((params) => {
270
+ this.emit('requestWillBeSent', params);
271
+ });
272
+ this.client.Network.responseReceived((params) => {
273
+ this.emit('responseReceived', params);
274
+ });
275
+ }
276
+ }
277
+ }
278
+ exports.CdpClient = CdpClient;
279
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { CdpConnectionInfo } from '../types';
2
+ /**
3
+ * Auto-discover Chrome DevTools Protocol endpoint
4
+ */
5
+ export declare class CdpDiscovery {
6
+ /**
7
+ * Discover CDP endpoint on available ports
8
+ */
9
+ static discover(port?: number): Promise<CdpConnectionInfo>;
10
+ /**
11
+ * Try to connect to a specific port
12
+ */
13
+ private static tryPort;
14
+ /**
15
+ * Check if a port is available
16
+ */
17
+ static isPortAvailable(port: number): Promise<boolean>;
18
+ /**
19
+ * Get launch instructions for Chrome
20
+ */
21
+ static getLaunchInstructions(port?: number): string[];
22
+ }
23
+ /**
24
+ * Custom error for CDP discovery failures
25
+ */
26
+ export declare class CdpDiscoveryError extends Error {
27
+ constructor();
28
+ /**
29
+ * Get user-friendly error message with instructions
30
+ */
31
+ getInstructions(): string[];
32
+ }
33
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/cdp/discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAQ7C;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;WACU,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqChE;;OAEG;mBACkB,OAAO;IA6C5B;;OAEG;WACU,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5D;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,GAAE,MAAa,GAAG,MAAM,EAAE;CAgC5D;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;;IAM1C;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;CAG5B"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CdpDiscoveryError = exports.CdpDiscovery = void 0;
7
+ const logger_1 = require("../utils/logger");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ /**
10
+ * Default CDP ports to try
11
+ */
12
+ const DEFAULT_PORTS = [9222, 9223, 9224, 9229];
13
+ /**
14
+ * Auto-discover Chrome DevTools Protocol endpoint
15
+ */
16
+ class CdpDiscovery {
17
+ /**
18
+ * Discover CDP endpoint on available ports
19
+ */
20
+ static async discover(port) {
21
+ // If port is specified, try only that port
22
+ if (port) {
23
+ logger_1.logger.debug(`Trying specified port: ${port}`);
24
+ const info = await this.tryPort(port);
25
+ if (info) {
26
+ return info;
27
+ }
28
+ throw new Error(`Chrome DevTools Protocol not found on port ${port}`);
29
+ }
30
+ // Check environment variable first
31
+ const envPort = process.env.TESTIVAI_CDP_PORT;
32
+ if (envPort) {
33
+ const portNum = parseInt(envPort, 10);
34
+ if (!isNaN(portNum)) {
35
+ logger_1.logger.debug(`Trying port from TESTIVAI_CDP_PORT: ${portNum}`);
36
+ const info = await this.tryPort(portNum);
37
+ if (info) {
38
+ return info;
39
+ }
40
+ }
41
+ }
42
+ // Try default ports
43
+ for (const defaultPort of DEFAULT_PORTS) {
44
+ logger_1.logger.debug(`Trying default port: ${defaultPort}`);
45
+ const info = await this.tryPort(defaultPort);
46
+ if (info) {
47
+ return info;
48
+ }
49
+ }
50
+ // No port found
51
+ throw new CdpDiscoveryError();
52
+ }
53
+ /**
54
+ * Try to connect to a specific port
55
+ */
56
+ static async tryPort(port) {
57
+ try {
58
+ // First, try the HTTP endpoint to get connection info
59
+ const response = await fetch(`http://localhost:${port}/json/version`);
60
+ if (!response.ok) {
61
+ return null;
62
+ }
63
+ const versionInfo = await response.json();
64
+ // Then get the list of tabs/pages
65
+ const tabsResponse = await fetch(`http://localhost:${port}/json`);
66
+ if (!tabsResponse.ok) {
67
+ return null;
68
+ }
69
+ const tabs = await tabsResponse.json();
70
+ // Find a suitable page (not an extension or background page)
71
+ const suitableTab = tabs.find((tab) => tab.type === 'page' &&
72
+ !tab.url.startsWith('chrome-extension://') &&
73
+ !tab.url.startsWith('chrome://'));
74
+ const versionInfoAny = versionInfo;
75
+ return {
76
+ webSocketDebuggerUrl: suitableTab?.webSocketDebuggerUrl || versionInfoAny.webSocketDebuggerUrl,
77
+ devtoolsFrontendUrl: suitableTab?.devtoolsFrontendUrl || versionInfoAny.devtoolsFrontendUrl,
78
+ id: suitableTab?.id || versionInfoAny.id,
79
+ title: suitableTab?.title,
80
+ url: suitableTab?.url,
81
+ browserVersion: versionInfoAny['Browser'],
82
+ protocolVersion: versionInfoAny['Protocol-Version'],
83
+ userAgent: versionInfoAny['User-Agent'],
84
+ v8Version: versionInfoAny['V8-Version'],
85
+ webKitVersion: versionInfoAny['WebKit-Version'],
86
+ };
87
+ }
88
+ catch (error) {
89
+ logger_1.logger.debug(`Port ${port} not available: ${error}`);
90
+ return null;
91
+ }
92
+ }
93
+ /**
94
+ * Check if a port is available
95
+ */
96
+ static async isPortAvailable(port) {
97
+ try {
98
+ const response = await fetch(`http://localhost:${port}/json/version`);
99
+ return response.ok;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ /**
106
+ * Get launch instructions for Chrome
107
+ */
108
+ static getLaunchInstructions(port = 9222) {
109
+ const instructions = [
110
+ '',
111
+ chalk_1.default.yellow('Chrome not found with remote debugging enabled.'),
112
+ chalk_1.default.yellow('Launch Chrome with the following flag:'),
113
+ '',
114
+ chalk_1.default.cyan(` --remote-debugging-port=${port}`),
115
+ '',
116
+ chalk_1.default.yellow('Examples:'),
117
+ '',
118
+ // macOS
119
+ chalk_1.default.gray('# macOS (Chrome):'),
120
+ chalk_1.default.cyan(` /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --remote-debugging-port=${port}`),
121
+ '',
122
+ // Windows
123
+ chalk_1.default.gray('# Windows (Chrome):'),
124
+ chalk_1.default.cyan(` "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" --remote-debugging-port=${port}`),
125
+ '',
126
+ // Linux
127
+ chalk_1.default.gray('# Linux (Chrome):'),
128
+ chalk_1.default.cyan(` google-chrome --remote-debugging-port=${port}`),
129
+ '',
130
+ // Chrome Canary/Dev
131
+ chalk_1.default.gray('# Or with Chrome Canary/Dev:'),
132
+ chalk_1.default.cyan(` google-chrome-unstable --remote-debugging-port=${port}`),
133
+ '',
134
+ chalk_1.default.yellow('Then run your test command again.'),
135
+ '',
136
+ ];
137
+ return instructions;
138
+ }
139
+ }
140
+ exports.CdpDiscovery = CdpDiscovery;
141
+ /**
142
+ * Custom error for CDP discovery failures
143
+ */
144
+ class CdpDiscoveryError extends Error {
145
+ constructor() {
146
+ super('Chrome DevTools Protocol not found');
147
+ this.name = 'CdpDiscoveryError';
148
+ }
149
+ /**
150
+ * Get user-friendly error message with instructions
151
+ */
152
+ getInstructions() {
153
+ return CdpDiscovery.getLaunchInstructions();
154
+ }
155
+ }
156
+ exports.CdpDiscoveryError = CdpDiscoveryError;
157
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/cdp/discovery.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAyC;AAEzC,kDAA0B;AAE1B;;GAEG;AACH,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE/C;;GAEG;AACH,MAAa,YAAY;IACvB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAa;QACjC,2CAA2C;QAC3C,IAAI,IAAI,EAAE,CAAC;YACT,eAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,mCAAmC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAC9C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpB,eAAM,CAAC,KAAK,CAAC,uCAAuC,OAAO,EAAE,CAAC,CAAC;gBAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACzC,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,oBAAoB;QACpB,KAAK,MAAM,WAAW,IAAI,aAAa,EAAE,CAAC;YACxC,eAAM,CAAC,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,gBAAgB;QAChB,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAY;QACvC,IAAI,CAAC;YACH,sDAAsD;YACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,eAAe,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE1C,kCAAkC;YAClC,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,OAAO,CAAC,CAAC;YAClE,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,IAAI,EAAW,CAAC;YAEhD,6DAA6D;YAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CACzC,GAAG,CAAC,IAAI,KAAK,MAAM;gBACnB,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,qBAAqB,CAAC;gBAC1C,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CACjC,CAAC;YAEF,MAAM,cAAc,GAAG,WAAkB,CAAC;YAE1C,OAAO;gBACL,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,IAAI,cAAc,CAAC,oBAAoB;gBAC9F,mBAAmB,EAAE,WAAW,EAAE,mBAAmB,IAAI,cAAc,CAAC,mBAAmB;gBAC3F,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,cAAc,CAAC,EAAE;gBACxC,KAAK,EAAE,WAAW,EAAE,KAAK;gBACzB,GAAG,EAAE,WAAW,EAAE,GAAG;gBACrB,cAAc,EAAE,cAAc,CAAC,SAAS,CAAC;gBACzC,eAAe,EAAE,cAAc,CAAC,kBAAkB,CAAC;gBACnD,SAAS,EAAE,cAAc,CAAC,YAAY,CAAC;gBACvC,SAAS,EAAE,cAAc,CAAC,YAAY,CAAC;gBACvC,aAAa,EAAE,cAAc,CAAC,gBAAgB,CAAC;aAChD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,mBAAmB,KAAK,EAAE,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAY;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,oBAAoB,IAAI,eAAe,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,OAAe,IAAI;QAC9C,MAAM,YAAY,GAAG;YACnB,EAAE;YACF,eAAK,CAAC,MAAM,CAAC,iDAAiD,CAAC;YAC/D,eAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC;YACtD,EAAE;YACF,eAAK,CAAC,IAAI,CAAC,6BAA6B,IAAI,EAAE,CAAC;YAC/C,EAAE;YACF,eAAK,CAAC,MAAM,CAAC,WAAW,CAAC;YACzB,EAAE;YACF,QAAQ;YACR,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;YAC/B,eAAK,CAAC,IAAI,CAAC,8FAA8F,IAAI,EAAE,CAAC;YAChH,EAAE;YACF,UAAU;YACV,eAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;YACjC,eAAK,CAAC,IAAI,CAAC,0FAA0F,IAAI,EAAE,CAAC;YAC5G,EAAE;YACF,QAAQ;YACR,eAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;YAC/B,eAAK,CAAC,IAAI,CAAC,2CAA2C,IAAI,EAAE,CAAC;YAC7D,EAAE;YACF,oBAAoB;YACpB,eAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC;YAC1C,eAAK,CAAC,IAAI,CAAC,oDAAoD,IAAI,EAAE,CAAC;YACtE,EAAE;YACF,eAAK,CAAC,MAAM,CAAC,mCAAmC,CAAC;YACjD,EAAE;SACH,CAAC;QAEF,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAxID,oCAwIC;AAED;;GAEG;AACH,MAAa,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,YAAY,CAAC,qBAAqB,EAAE,CAAC;IAC9C,CAAC;CACF;AAZD,8CAYC"}
package/dist/ci.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Utilities for detecting CI/CD environments and extracting a unique run identifier.
3
+ */
4
+ /**
5
+ * CI environment information for integration feedback (e.g., GitHub commit statuses, PR comments).
6
+ */
7
+ export interface CiInfo {
8
+ /** CI provider name */
9
+ provider: string;
10
+ /** Pull/Merge request number (if available) */
11
+ prNumber?: number;
12
+ /** URL to the CI run (if available) */
13
+ runUrl?: string;
14
+ /** CI build/run identifier */
15
+ buildId?: string;
16
+ }
17
+ /**
18
+ * Gets a unique identifier for the current CI run.
19
+ * This ID is used to group snapshots from parallel shards into a single batch.
20
+ *
21
+ * @returns A unique string identifier for the CI run, or null if not in a known CI environment.
22
+ */
23
+ export declare function getCiRunId(): string | null;
24
+ /**
25
+ * Gets detailed CI environment information including PR number and run URL.
26
+ * Used for integration feedback (GitHub commit statuses, PR comments, etc.).
27
+ *
28
+ * @returns CiInfo object if in a known CI environment, or null otherwise.
29
+ */
30
+ export declare function getCiInfo(): CiInfo | null;
31
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAuB1C;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CAoFzC"}
package/dist/ci.js ADDED
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Utilities for detecting CI/CD environments and extracting a unique run identifier.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getCiRunId = getCiRunId;
7
+ exports.getCiInfo = getCiInfo;
8
+ /**
9
+ * Gets a unique identifier for the current CI run.
10
+ * This ID is used to group snapshots from parallel shards into a single batch.
11
+ *
12
+ * @returns A unique string identifier for the CI run, or null if not in a known CI environment.
13
+ */
14
+ function getCiRunId() {
15
+ // GitHub Actions
16
+ if (process.env.GITHUB_RUN_ID) {
17
+ return `github-${process.env.GITHUB_RUN_ID}`;
18
+ }
19
+ // GitLab CI
20
+ if (process.env.GITLAB_CI) {
21
+ return `gitlab-${process.env.CI_PIPELINE_ID}`;
22
+ }
23
+ // Jenkins
24
+ if (process.env.JENKINS_URL) {
25
+ return `jenkins-${process.env.BUILD_ID}`;
26
+ }
27
+ // CircleCI
28
+ if (process.env.CIRCLECI) {
29
+ return `circleci-${process.env.CIRCLE_WORKFLOW_ID}`;
30
+ }
31
+ // Travis CI
32
+ if (process.env.TRAVIS) {
33
+ return `travis-${process.env.TRAVIS_BUILD_ID}`;
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * Gets detailed CI environment information including PR number and run URL.
39
+ * Used for integration feedback (GitHub commit statuses, PR comments, etc.).
40
+ *
41
+ * @returns CiInfo object if in a known CI environment, or null otherwise.
42
+ */
43
+ function getCiInfo() {
44
+ // GitHub Actions
45
+ if (process.env.GITHUB_ACTIONS) {
46
+ const serverUrl = process.env.GITHUB_SERVER_URL || 'https://github.com';
47
+ const repo = process.env.GITHUB_REPOSITORY;
48
+ const runId = process.env.GITHUB_RUN_ID;
49
+ // PR number: available via GITHUB_EVENT_NUMBER in pull_request events,
50
+ // or from GITHUB_REF (refs/pull/<number>/merge)
51
+ let prNumber;
52
+ if (process.env.GITHUB_EVENT_NUMBER) {
53
+ prNumber = parseInt(process.env.GITHUB_EVENT_NUMBER, 10) || undefined;
54
+ }
55
+ else if (process.env.GITHUB_REF?.startsWith('refs/pull/')) {
56
+ const match = process.env.GITHUB_REF.match(/^refs\/pull\/(\d+)\//);
57
+ if (match) {
58
+ prNumber = parseInt(match[1], 10);
59
+ }
60
+ }
61
+ return {
62
+ provider: 'github_actions',
63
+ prNumber,
64
+ runUrl: repo && runId ? `${serverUrl}/${repo}/actions/runs/${runId}` : undefined,
65
+ buildId: runId,
66
+ };
67
+ }
68
+ // GitLab CI
69
+ if (process.env.GITLAB_CI) {
70
+ const prNumber = process.env.CI_MERGE_REQUEST_IID
71
+ ? parseInt(process.env.CI_MERGE_REQUEST_IID, 10) || undefined
72
+ : undefined;
73
+ return {
74
+ provider: 'gitlab_ci',
75
+ prNumber,
76
+ runUrl: process.env.CI_PIPELINE_URL || undefined,
77
+ buildId: process.env.CI_PIPELINE_ID,
78
+ };
79
+ }
80
+ // CircleCI
81
+ if (process.env.CIRCLECI) {
82
+ const prNumber = process.env.CIRCLE_PULL_REQUEST
83
+ ? parseInt(process.env.CIRCLE_PULL_REQUEST.split('/').pop() || '', 10) || undefined
84
+ : undefined;
85
+ return {
86
+ provider: 'circleci',
87
+ prNumber,
88
+ runUrl: process.env.CIRCLE_BUILD_URL || undefined,
89
+ buildId: process.env.CIRCLE_WORKFLOW_ID,
90
+ };
91
+ }
92
+ // Jenkins
93
+ if (process.env.JENKINS_URL) {
94
+ const prNumber = process.env.CHANGE_ID
95
+ ? parseInt(process.env.CHANGE_ID, 10) || undefined
96
+ : undefined;
97
+ return {
98
+ provider: 'jenkins',
99
+ prNumber,
100
+ runUrl: process.env.BUILD_URL || undefined,
101
+ buildId: process.env.BUILD_ID,
102
+ };
103
+ }
104
+ // Travis CI
105
+ if (process.env.TRAVIS) {
106
+ const prNumber = process.env.TRAVIS_PULL_REQUEST && process.env.TRAVIS_PULL_REQUEST !== 'false'
107
+ ? parseInt(process.env.TRAVIS_PULL_REQUEST, 10) || undefined
108
+ : undefined;
109
+ return {
110
+ provider: 'travis_ci',
111
+ prNumber,
112
+ runUrl: process.env.TRAVIS_BUILD_WEB_URL || undefined,
113
+ buildId: process.env.TRAVIS_BUILD_ID,
114
+ };
115
+ }
116
+ return null;
117
+ }
118
+ //# sourceMappingURL=ci.js.map
package/dist/ci.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../src/ci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const authCommand: Command;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,WAAW,SA+GpB,CAAC"}