@observeone/cli 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 (84) hide show
  1. package/README.md +214 -0
  2. package/dist/README.md +214 -0
  3. package/dist/commands/ai-check.d.ts +9 -0
  4. package/dist/commands/ai-check.d.ts.map +1 -0
  5. package/dist/commands/ai-check.js +492 -0
  6. package/dist/commands/ai-check.js.map +1 -0
  7. package/dist/commands/apply.d.ts +6 -0
  8. package/dist/commands/apply.d.ts.map +1 -0
  9. package/dist/commands/apply.js +290 -0
  10. package/dist/commands/apply.js.map +1 -0
  11. package/dist/commands/check.d.ts +9 -0
  12. package/dist/commands/check.d.ts.map +1 -0
  13. package/dist/commands/check.js +267 -0
  14. package/dist/commands/check.js.map +1 -0
  15. package/dist/commands/export.d.ts +6 -0
  16. package/dist/commands/export.d.ts.map +1 -0
  17. package/dist/commands/export.js +95 -0
  18. package/dist/commands/export.js.map +1 -0
  19. package/dist/commands/heartbeat.d.ts +9 -0
  20. package/dist/commands/heartbeat.d.ts.map +1 -0
  21. package/dist/commands/heartbeat.js +264 -0
  22. package/dist/commands/heartbeat.js.map +1 -0
  23. package/dist/commands/list.d.ts +9 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +42 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/login.d.ts +9 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +192 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/monitor.d.ts +9 -0
  32. package/dist/commands/monitor.d.ts.map +1 -0
  33. package/dist/commands/monitor.js +292 -0
  34. package/dist/commands/monitor.js.map +1 -0
  35. package/dist/index.d.ts +5 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +125 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/interfaces/api-client.interface.d.ts +76 -0
  40. package/dist/interfaces/api-client.interface.d.ts.map +1 -0
  41. package/dist/interfaces/api-client.interface.js +2 -0
  42. package/dist/interfaces/api-client.interface.js.map +1 -0
  43. package/dist/interfaces/config.interface.d.ts +26 -0
  44. package/dist/interfaces/config.interface.d.ts.map +1 -0
  45. package/dist/interfaces/config.interface.js +2 -0
  46. package/dist/interfaces/config.interface.js.map +1 -0
  47. package/dist/interfaces/output.interface.d.ts +22 -0
  48. package/dist/interfaces/output.interface.d.ts.map +1 -0
  49. package/dist/interfaces/output.interface.js +2 -0
  50. package/dist/interfaces/output.interface.js.map +1 -0
  51. package/dist/interfaces/sse-client.interface.d.ts +18 -0
  52. package/dist/interfaces/sse-client.interface.d.ts.map +1 -0
  53. package/dist/interfaces/sse-client.interface.js +6 -0
  54. package/dist/interfaces/sse-client.interface.js.map +1 -0
  55. package/dist/package.json +42 -0
  56. package/dist/services/api-client.service.d.ts +82 -0
  57. package/dist/services/api-client.service.d.ts.map +1 -0
  58. package/dist/services/api-client.service.js +262 -0
  59. package/dist/services/api-client.service.js.map +1 -0
  60. package/dist/services/config.service.d.ts +32 -0
  61. package/dist/services/config.service.d.ts.map +1 -0
  62. package/dist/services/config.service.js +104 -0
  63. package/dist/services/config.service.js.map +1 -0
  64. package/dist/services/output.service.d.ts +28 -0
  65. package/dist/services/output.service.d.ts.map +1 -0
  66. package/dist/services/output.service.js +258 -0
  67. package/dist/services/output.service.js.map +1 -0
  68. package/dist/services/sse-client.service.d.ts +16 -0
  69. package/dist/services/sse-client.service.d.ts.map +1 -0
  70. package/dist/services/sse-client.service.js +80 -0
  71. package/dist/services/sse-client.service.js.map +1 -0
  72. package/dist/types/index.d.ts +106 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +2 -0
  75. package/dist/types/index.js.map +1 -0
  76. package/dist/utils/live-progress.d.ts +23 -0
  77. package/dist/utils/live-progress.d.ts.map +1 -0
  78. package/dist/utils/live-progress.js +116 -0
  79. package/dist/utils/live-progress.js.map +1 -0
  80. package/dist/utils/log-writer.d.ts +13 -0
  81. package/dist/utils/log-writer.d.ts.map +1 -0
  82. package/dist/utils/log-writer.js +97 -0
  83. package/dist/utils/log-writer.js.map +1 -0
  84. package/package.json +66 -0
@@ -0,0 +1,32 @@
1
+ import Conf from 'conf';
2
+ import { IConfigService } from '../interfaces/config.interface.js';
3
+ import { ObserveOneConfig } from '../types/index.js';
4
+ /**
5
+ * Configuration service implementation
6
+ * Manages CLI configuration using Conf library
7
+ */
8
+ export declare class ConfigService implements IConfigService {
9
+ private config;
10
+ private commandLineApiUrl?;
11
+ constructor(config?: Conf<ObserveOneConfig>);
12
+ getApiUrl(): string;
13
+ setCommandLineApiUrl(url: string): void;
14
+ isDevelopment(): boolean;
15
+ getApiKey(): string | undefined;
16
+ setApiUrl(url: string): void;
17
+ setApiKey(key: string): void;
18
+ clearApiKey(): void;
19
+ getProjectConfig(): any;
20
+ setProjectConfig(projectConfig: any): void;
21
+ getDefaultOptions(): {
22
+ timeout: number;
23
+ retries: number;
24
+ verbose: boolean;
25
+ pollIntervalMs: number;
26
+ maxAttempts: number;
27
+ };
28
+ setDefaultOptions(options: any): void;
29
+ reset(): void;
30
+ getConfigPath(): string;
31
+ }
32
+ //# sourceMappingURL=config.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.d.ts","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAoBrD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,iBAAiB,CAAC,CAAS;gBAEvB,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC;IAmB3C,SAAS,IAAI,MAAM;IAgBnB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOvC,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAO5B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI5B,WAAW,IAAI,IAAI;IAInB,gBAAgB,IAAI,GAAG;IAIvB,gBAAgB,CAAC,aAAa,EAAE,GAAG,GAAG,IAAI;IAI1C,iBAAiB,IAAI;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB;IAYD,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAIrC,KAAK,IAAI,IAAI;IAIb,aAAa,IAAI,MAAM;CAGxB"}
@@ -0,0 +1,104 @@
1
+ import Conf from 'conf';
2
+ // Detect environment dynamically
3
+ const isDevelopment = () => {
4
+ const isDev = process.env.NODE_ENV === 'development' ||
5
+ process.env.OBS_ENV === 'development' ||
6
+ process.env.OBS_DEV === 'true' ||
7
+ process.env.OBS_DEV === '1' ||
8
+ process.env.NODE_ENV === 'dev';
9
+ return isDev;
10
+ };
11
+ const getDefaultApiUrl = () => {
12
+ if (isDevelopment()) {
13
+ return 'http://localhost:8080/api';
14
+ }
15
+ return 'https://api.observeone.com/api';
16
+ };
17
+ /**
18
+ * Configuration service implementation
19
+ * Manages CLI configuration using Conf library
20
+ */
21
+ export class ConfigService {
22
+ config;
23
+ commandLineApiUrl;
24
+ constructor(config) {
25
+ // Allow injecting config for testing
26
+ this.config =
27
+ config ||
28
+ new Conf({
29
+ projectName: 'obs',
30
+ defaults: {
31
+ apiUrl: process.env.OBS_API_URL || getDefaultApiUrl(),
32
+ defaultOptions: {
33
+ timeout: 600000, // 10 minutes
34
+ retries: 3,
35
+ verbose: false,
36
+ pollIntervalMs: 2000,
37
+ maxAttempts: 300,
38
+ },
39
+ },
40
+ });
41
+ }
42
+ getApiUrl() {
43
+ // Priority order: 1) command line option, 2) environment variable, 3) saved config, 4) default
44
+ // If explicitly running in dev mode, force the dev URL unless explicitly locally overridden
45
+ if (this.isDevelopment() && !this.commandLineApiUrl && !process.env.OBS_API_URL) {
46
+ return 'http://localhost:8080/api';
47
+ }
48
+ return (this.commandLineApiUrl ||
49
+ process.env.OBS_API_URL ||
50
+ this.config.get('apiUrl') ||
51
+ getDefaultApiUrl());
52
+ }
53
+ setCommandLineApiUrl(url) {
54
+ // Ensure URL ends with /api
55
+ const cleanUrl = url.endsWith('/') ? url.slice(0, -1) : url;
56
+ const finalUrl = cleanUrl.endsWith('/api') ? cleanUrl : `${cleanUrl}/api`;
57
+ this.commandLineApiUrl = finalUrl;
58
+ }
59
+ isDevelopment() {
60
+ return isDevelopment();
61
+ }
62
+ getApiKey() {
63
+ return process.env.OBS_API_KEY || this.config.get('apiKey');
64
+ }
65
+ setApiUrl(url) {
66
+ // Ensure URL ends with /api
67
+ const cleanUrl = url.endsWith('/') ? url.slice(0, -1) : url;
68
+ const finalUrl = cleanUrl.endsWith('/api') ? cleanUrl : `${cleanUrl}/api`;
69
+ this.config.set('apiUrl', finalUrl);
70
+ }
71
+ setApiKey(key) {
72
+ this.config.set('apiKey', key);
73
+ }
74
+ clearApiKey() {
75
+ this.config.delete('apiKey');
76
+ }
77
+ getProjectConfig() {
78
+ return this.config.get('project', {});
79
+ }
80
+ setProjectConfig(projectConfig) {
81
+ this.config.set('project', projectConfig);
82
+ }
83
+ getDefaultOptions() {
84
+ const options = this.config.get('defaultOptions');
85
+ // Ensure all properties have values
86
+ return {
87
+ timeout: options?.timeout ?? 600000,
88
+ retries: options?.retries ?? 3,
89
+ verbose: options?.verbose ?? false,
90
+ pollIntervalMs: options?.pollIntervalMs ?? 2000,
91
+ maxAttempts: options?.maxAttempts ?? 300,
92
+ };
93
+ }
94
+ setDefaultOptions(options) {
95
+ this.config.set('defaultOptions', options);
96
+ }
97
+ reset() {
98
+ this.config.clear();
99
+ }
100
+ getConfigPath() {
101
+ return this.config.path;
102
+ }
103
+ }
104
+ //# sourceMappingURL=config.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.js","sourceRoot":"","sources":["../../src/services/config.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { IOutputService } from '../interfaces/output.interface.js';
2
+ import { Test, TestExecution, TestResult, UrlMonitor, ApiCheck, Heartbeat } from '../types/index.js';
3
+ /**
4
+ * Output formatting service implementation
5
+ * Handles console output and formatting
6
+ */
7
+ export declare class OutputService implements IOutputService {
8
+ private isJsonMode;
9
+ enableJsonMode(): void;
10
+ success(message: string): void;
11
+ error(message: string): void;
12
+ warning(message: string): void;
13
+ info(message: string): void;
14
+ progress(message: string): void;
15
+ formatTestList(tests: Test[], verbose?: boolean): void;
16
+ formatMonitorList(monitors: UrlMonitor[], verbose?: boolean): void;
17
+ formatApiCheckList(checks: ApiCheck[], verbose?: boolean): void;
18
+ formatHeartbeatList(heartbeats: Heartbeat[], verbose?: boolean): void;
19
+ formatTestExecution(execution: TestExecution): void;
20
+ formatTestResult(result: TestResult): void;
21
+ formatJsonOutput(data: any): void;
22
+ private escapeXml;
23
+ formatJUnitReport(testSuite: any): string;
24
+ private getStatusColor;
25
+ private getStatusIcon;
26
+ formatError(error: any): string;
27
+ }
28
+ //# sourceMappingURL=output.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.service.d.ts","sourceRoot":"","sources":["../../src/services/output.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAEL,IAAI,EACJ,aAAa,EACb,UAAU,EACV,UAAU,EACV,QAAQ,EACR,SAAS,EACV,MAAM,mBAAmB,CAAC;AAE3B;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,UAAU,CAAkB;IAEpC,cAAc,IAAI,IAAI;IAGtB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAa5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK3B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK/B,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAyB7D,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAyBzE,kBAAkB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IAwBtE,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI;IA+B5E,mBAAmB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI;IAwBnD,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAsB1C,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAWjC,OAAO,CAAC,SAAS;IAmBjB,iBAAiB,CAAC,SAAS,EAAE,GAAG,GAAG,MAAM;IA0BzC,OAAO,CAAC,cAAc;IAiBtB,OAAO,CAAC,aAAa;IAiBrB,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM;CAchC"}
@@ -0,0 +1,258 @@
1
+ import chalk from 'chalk';
2
+ /**
3
+ * Output formatting service implementation
4
+ * Handles console output and formatting
5
+ */
6
+ export class OutputService {
7
+ isJsonMode = false;
8
+ enableJsonMode() {
9
+ this.isJsonMode = true;
10
+ }
11
+ success(message) {
12
+ if (this.isJsonMode)
13
+ return;
14
+ console.log(chalk.green(`✅ ${message}`));
15
+ }
16
+ error(message) {
17
+ if (this.isJsonMode) {
18
+ const envelope = {
19
+ status: 'ERROR',
20
+ error: { message },
21
+ metadata: { timestamp: new Date().toISOString() },
22
+ };
23
+ console.log(JSON.stringify(envelope, null, 2));
24
+ return;
25
+ }
26
+ console.error(chalk.red(`❌ ${message}`));
27
+ }
28
+ warning(message) {
29
+ if (this.isJsonMode)
30
+ return;
31
+ console.log(chalk.yellow(`⚠️ ${message}`));
32
+ }
33
+ info(message) {
34
+ if (this.isJsonMode)
35
+ return;
36
+ console.log(chalk.blue(`ℹ️ ${message}`));
37
+ }
38
+ progress(message) {
39
+ if (this.isJsonMode)
40
+ return;
41
+ console.log(chalk.cyan(`🔄 ${message}`));
42
+ }
43
+ formatTestList(tests, verbose = false) {
44
+ if (tests.length === 0) {
45
+ this.info('No AI browser checks found.');
46
+ return;
47
+ }
48
+ console.log(chalk.bold('\n🤖 AI Browser Checks:'));
49
+ console.log(chalk.gray('─'.repeat(80)));
50
+ tests.forEach((test, index) => {
51
+ console.log(chalk.bold(`${index + 1}. ${test.name}`));
52
+ if (test.description) {
53
+ console.log(chalk.gray(` ${test.description}`));
54
+ }
55
+ console.log(chalk.gray(` URL: ${test.url}`));
56
+ console.log(chalk.gray(` ID: ${test.id}`));
57
+ if (verbose) {
58
+ console.log(chalk.gray(` Prompt: ${test.prompt}`));
59
+ console.log(chalk.gray(` Created: ${new Date(test.created_at).toLocaleString()}`));
60
+ }
61
+ console.log('');
62
+ });
63
+ }
64
+ formatMonitorList(monitors, verbose = false) {
65
+ if (monitors.length === 0) {
66
+ this.info('No URL monitors found.');
67
+ return;
68
+ }
69
+ console.log(chalk.bold('\n🌐 URL Monitors:'));
70
+ console.log(chalk.gray('─'.repeat(80)));
71
+ monitors.forEach((monitor, index) => {
72
+ const status = monitor.is_active ? chalk.green('ACTIVE') : chalk.yellow('PAUSED');
73
+ console.log(chalk.bold(`${index + 1}. ${monitor.name} [${status}]`));
74
+ console.log(chalk.gray(` URL: ${monitor.url}`));
75
+ console.log(chalk.gray(` ID: ${monitor.id}`));
76
+ if (verbose) {
77
+ if (monitor.description)
78
+ console.log(chalk.gray(` Desc: ${monitor.description}`));
79
+ console.log(chalk.gray(` Interval: ${monitor.cron_expression || 'Default'}`));
80
+ console.log(chalk.gray(` Alerts: ${monitor.alert_on_failure ? 'ON' : 'OFF'}`));
81
+ }
82
+ console.log('');
83
+ });
84
+ }
85
+ formatApiCheckList(checks, verbose = false) {
86
+ if (checks.length === 0) {
87
+ this.info('No API checks found.');
88
+ return;
89
+ }
90
+ console.log(chalk.bold('\n🔌 API Checks:'));
91
+ console.log(chalk.gray('─'.repeat(80)));
92
+ checks.forEach((check, index) => {
93
+ const status = check.is_active ? chalk.green('ACTIVE') : chalk.yellow('PAUSED');
94
+ console.log(chalk.bold(`${index + 1}. ${check.name} [${status}]`));
95
+ console.log(chalk.gray(` Endpoint: ${check.method} ${check.url}`));
96
+ console.log(chalk.gray(` ID: ${check.id}`));
97
+ if (verbose) {
98
+ if (check.description)
99
+ console.log(chalk.gray(` Desc: ${check.description}`));
100
+ console.log(chalk.gray(` Assertions: ${check.assertions?.length || 0}`));
101
+ }
102
+ console.log('');
103
+ });
104
+ }
105
+ formatHeartbeatList(heartbeats, verbose = false) {
106
+ if (heartbeats.length === 0) {
107
+ this.info('No heartbeats found.');
108
+ return;
109
+ }
110
+ console.log(chalk.bold('\n💓 Heartbeats:'));
111
+ console.log(chalk.gray('─'.repeat(80)));
112
+ heartbeats.forEach((hb, index) => {
113
+ const statusColor = hb.status === 'UP' ? chalk.green : hb.status === 'DOWN' ? chalk.red : chalk.yellow;
114
+ const status = statusColor(hb.status);
115
+ const activeStatus = hb.is_active ? '' : chalk.yellow(' (PAUSED)');
116
+ console.log(chalk.bold(`${index + 1}. ${hb.name} - ${status}${activeStatus}`));
117
+ console.log(chalk.gray(` Key: ${hb.ping_key}`));
118
+ console.log(chalk.gray(` ID: ${hb.id}`));
119
+ if (verbose) {
120
+ console.log(chalk.gray(` Period: ${hb.period}s (Grace: ${hb.grace_period}s)`));
121
+ console.log(chalk.gray(` Last Ping: ${hb.last_ping_at ? new Date(hb.last_ping_at).toLocaleString() : 'Never'}`));
122
+ }
123
+ console.log('');
124
+ });
125
+ }
126
+ formatTestExecution(execution) {
127
+ const statusColor = this.getStatusColor(execution.status);
128
+ const statusIcon = this.getStatusIcon(execution.status);
129
+ console.log(chalk.bold('\n📊 Test Execution Status:'));
130
+ console.log(chalk.gray('─'.repeat(50)));
131
+ console.log(`Status: ${statusColor(`${statusIcon} ${execution.status}`)}`);
132
+ console.log(`Execution ID: ${execution.id}`);
133
+ console.log(`Test ID: ${execution.test_id}`);
134
+ console.log(`Started: ${new Date(execution.started_at).toLocaleString()}`);
135
+ if (execution.completed_at) {
136
+ console.log(`Completed: ${new Date(execution.completed_at).toLocaleString()}`);
137
+ }
138
+ if (execution.error_message) {
139
+ console.log(chalk.red(`Error: ${execution.error_message}`));
140
+ }
141
+ if (execution.task_id) {
142
+ console.log(`Task ID: ${execution.task_id}`);
143
+ }
144
+ }
145
+ formatTestResult(result) {
146
+ const statusColor = this.getStatusColor(result.status);
147
+ const statusIcon = this.getStatusIcon(result.status);
148
+ console.log(chalk.bold('\n🎯 Test Result:'));
149
+ console.log(chalk.gray('─'.repeat(50)));
150
+ console.log(`Status: ${statusColor(`${statusIcon} ${result.status}`)}`);
151
+ console.log(`Message: ${result.message}`);
152
+ if (result.task_id) {
153
+ console.log(`Task ID: ${result.task_id}`);
154
+ }
155
+ if (result.duration) {
156
+ console.log(`Duration: ${(result.duration / 1000).toFixed(2)}s`);
157
+ }
158
+ if (result.screenshots && result.screenshots.length > 0) {
159
+ console.log(chalk.blue(`\n📸 Screenshots: ${result.screenshots.length} captured`));
160
+ }
161
+ }
162
+ formatJsonOutput(data) {
163
+ const envelope = {
164
+ status: 'SUCCESS',
165
+ data,
166
+ metadata: {
167
+ timestamp: new Date().toISOString(),
168
+ },
169
+ };
170
+ console.log(JSON.stringify(envelope, null, 2));
171
+ }
172
+ escapeXml(unsafe) {
173
+ return unsafe.replace(/[<>&'"]/g, function (c) {
174
+ switch (c) {
175
+ case '<':
176
+ return '&lt;';
177
+ case '>':
178
+ return '&gt;';
179
+ case '&':
180
+ return '&amp;';
181
+ case "'":
182
+ return '&apos;';
183
+ case '"':
184
+ return '&quot;';
185
+ default:
186
+ return c;
187
+ }
188
+ });
189
+ }
190
+ formatJUnitReport(testSuite) {
191
+ const xml = `<?xml version="1.0" encoding="UTF-8"?>
192
+ <testsuite name="${this.escapeXml(testSuite.name)}" tests="${testSuite.tests}" failures="${testSuite.failures}" errors="${testSuite.errors}" time="${testSuite.time}">
193
+ ${testSuite.testCases
194
+ .map((testCase) => {
195
+ let xml = ` <testcase name="${this.escapeXml(testCase.name)}" classname="${this.escapeXml(testCase.classname)}" time="${testCase.time}">`;
196
+ if (testCase.status === 'failed' && testCase.failure) {
197
+ xml += `\r\n <failure message="${this.escapeXml(testCase.failure.message)}" type="${this.escapeXml(testCase.failure.type)}">\r\n${this.escapeXml(testCase.failure.stackTrace || '')}\r\n </failure>`;
198
+ }
199
+ else if (testCase.status === 'skipped') {
200
+ xml += `\r\n <skipped/>`;
201
+ }
202
+ xml += `\r\n </testcase>`;
203
+ return xml;
204
+ })
205
+ .join('\n')}
206
+ </testsuite>`;
207
+ return xml;
208
+ }
209
+ getStatusColor(status) {
210
+ switch (status.toUpperCase()) {
211
+ case 'SUCCESS':
212
+ return chalk.green;
213
+ case 'FAILED':
214
+ return chalk.red;
215
+ case 'RUNNING':
216
+ return chalk.blue;
217
+ case 'PENDING':
218
+ return chalk.yellow;
219
+ case 'CANCELLED':
220
+ return chalk.gray;
221
+ default:
222
+ return chalk.white;
223
+ }
224
+ }
225
+ getStatusIcon(status) {
226
+ switch (status.toUpperCase()) {
227
+ case 'SUCCESS':
228
+ return '✅';
229
+ case 'FAILED':
230
+ return '❌';
231
+ case 'RUNNING':
232
+ return '🔄';
233
+ case 'PENDING':
234
+ return '⏳';
235
+ case 'CANCELLED':
236
+ return '⏹️';
237
+ default:
238
+ return '❓';
239
+ }
240
+ }
241
+ formatError(error) {
242
+ if (error.response) {
243
+ // API error
244
+ const status = error.response.status;
245
+ const message = error.response.data?.error || error.response.data?.message || error.message;
246
+ return `API Error (${status}): ${message}`;
247
+ }
248
+ else if (error.request) {
249
+ // Network error
250
+ return `Network Error: Unable to connect to API. Please check your internet connection and API URL.`;
251
+ }
252
+ else {
253
+ // Other error
254
+ return error.message || 'An unknown error occurred';
255
+ }
256
+ }
257
+ }
258
+ //# sourceMappingURL=output.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.service.js","sourceRoot":"","sources":["../../src/services/output.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { IConfigService } from '../interfaces/config.interface.js';
2
+ import { ISSEClient, SSEMessage } from '../interfaces/sse-client.interface.js';
3
+ /**
4
+ * SSE Client implementation
5
+ * Handles Server-Sent Events streaming
6
+ */
7
+ export declare class SSEClient implements ISSEClient {
8
+ private abortController;
9
+ private isConnected;
10
+ private configService;
11
+ constructor(configService: IConfigService);
12
+ connect(taskId: string, onMessage: (message: SSEMessage) => void, onError: (error: any) => void): void;
13
+ private processStream;
14
+ close(): void;
15
+ }
16
+ //# sourceMappingURL=sse-client.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.service.d.ts","sourceRoot":"","sources":["../../src/services/sse-client.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAE/E;;;GAGG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAiB;gBAE1B,aAAa,EAAE,cAAc;IAIzC,OAAO,CACL,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,EACxC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,GAC5B,IAAI;YAmBO,aAAa;IA2D3B,KAAK,IAAI,IAAI;CAOd"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * SSE Client implementation
3
+ * Handles Server-Sent Events streaming
4
+ */
5
+ export class SSEClient {
6
+ abortController = null;
7
+ isConnected = false;
8
+ configService;
9
+ constructor(configService) {
10
+ this.configService = configService;
11
+ }
12
+ connect(taskId, onMessage, onError) {
13
+ const apiUrl = this.configService.getApiUrl();
14
+ const apiKey = this.configService.getApiKey();
15
+ if (!apiKey) {
16
+ throw new Error("Cannot connect to SSE stream: No API key found. Please run 'obs login' first.");
17
+ }
18
+ const url = `${apiUrl}/browser-checks/events/${taskId}`;
19
+ this.abortController = new AbortController();
20
+ this.isConnected = true;
21
+ // Start the stream processing in the background (don't await)
22
+ this.processStream(url, apiKey, onMessage, onError);
23
+ }
24
+ async processStream(url, apiKey, onMessage, onError) {
25
+ try {
26
+ const response = await fetch(url, {
27
+ headers: {
28
+ 'x-obs1-cli': apiKey,
29
+ Accept: 'text/event-stream',
30
+ },
31
+ signal: this.abortController.signal,
32
+ });
33
+ if (!response.ok) {
34
+ throw new Error(`HTTP error! status: ${response.status}`);
35
+ }
36
+ const reader = response.body?.getReader();
37
+ if (!reader) {
38
+ throw new Error('Response body is not readable');
39
+ }
40
+ const decoder = new TextDecoder();
41
+ let buffer = '';
42
+ while (this.isConnected) {
43
+ const { done, value } = await reader.read();
44
+ if (done) {
45
+ break;
46
+ }
47
+ buffer += decoder.decode(value, { stream: true });
48
+ const lines = buffer.split('\n');
49
+ buffer = lines.pop() || '';
50
+ for (const line of lines) {
51
+ if (line.startsWith('data:')) {
52
+ const data = line.slice(5).trim();
53
+ if (data) {
54
+ try {
55
+ const parsed = JSON.parse(data);
56
+ onMessage(parsed);
57
+ }
58
+ catch (error) {
59
+ console.error('Failed to parse SSE message:', error);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ catch (error) {
67
+ if (error.name !== 'AbortError') {
68
+ onError(error);
69
+ }
70
+ }
71
+ }
72
+ close() {
73
+ this.isConnected = false;
74
+ if (this.abortController) {
75
+ this.abortController.abort();
76
+ this.abortController = null;
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=sse-client.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.service.js","sourceRoot":"","sources":["../../src/services/sse-client.service.ts"],"names":[],"mappings":"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"}