@vizzly-testing/cli 0.14.0 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +70 -68
- package/dist/commands/doctor.js +30 -34
- package/dist/commands/finalize.js +24 -23
- package/dist/commands/init.js +30 -28
- package/dist/commands/login.js +49 -55
- package/dist/commands/logout.js +14 -19
- package/dist/commands/project.js +83 -103
- package/dist/commands/run.js +77 -89
- package/dist/commands/status.js +48 -49
- package/dist/commands/tdd-daemon.js +90 -86
- package/dist/commands/tdd.js +59 -88
- package/dist/commands/upload.js +57 -57
- package/dist/commands/whoami.js +40 -45
- package/dist/index.js +2 -5
- package/dist/plugin-loader.js +15 -17
- package/dist/reporter/reporter-bundle.css +1 -1
- package/dist/reporter/reporter-bundle.iife.js +74 -41
- package/dist/sdk/index.js +36 -45
- package/dist/server/handlers/api-handler.js +14 -15
- package/dist/server/handlers/tdd-handler.js +34 -37
- package/dist/server/http-server.js +75 -869
- package/dist/server/middleware/cors.js +22 -0
- package/dist/server/middleware/json-parser.js +35 -0
- package/dist/server/middleware/response.js +79 -0
- package/dist/server/routers/assets.js +91 -0
- package/dist/server/routers/auth.js +144 -0
- package/dist/server/routers/baseline.js +163 -0
- package/dist/server/routers/cloud-proxy.js +146 -0
- package/dist/server/routers/config.js +126 -0
- package/dist/server/routers/dashboard.js +130 -0
- package/dist/server/routers/health.js +61 -0
- package/dist/server/routers/projects.js +168 -0
- package/dist/server/routers/screenshot.js +86 -0
- package/dist/services/auth-service.js +1 -1
- package/dist/services/build-manager.js +13 -40
- package/dist/services/config-service.js +2 -4
- package/dist/services/html-report-generator.js +6 -5
- package/dist/services/index.js +64 -0
- package/dist/services/project-service.js +121 -40
- package/dist/services/screenshot-server.js +9 -9
- package/dist/services/server-manager.js +11 -18
- package/dist/services/static-report-generator.js +3 -4
- package/dist/services/tdd-service.js +246 -103
- package/dist/services/test-runner.js +24 -25
- package/dist/services/uploader.js +5 -4
- package/dist/types/commands/init.d.ts +1 -2
- package/dist/types/index.d.ts +2 -3
- package/dist/types/plugin-loader.d.ts +1 -2
- package/dist/types/reporter/src/api/client.d.ts +178 -0
- package/dist/types/reporter/src/components/app-router.d.ts +1 -3
- package/dist/types/reporter/src/components/code-block.d.ts +4 -0
- package/dist/types/reporter/src/components/comparison/comparison-modes/onion-skin-mode.d.ts +10 -0
- package/dist/types/reporter/src/components/comparison/comparison-modes/overlay-mode.d.ts +11 -0
- package/dist/types/reporter/src/components/comparison/comparison-modes/shared/base-comparison-mode.d.ts +14 -0
- package/dist/types/reporter/src/components/comparison/comparison-modes/shared/image-renderer.d.ts +30 -0
- package/dist/types/reporter/src/components/comparison/comparison-modes/toggle-view.d.ts +8 -0
- package/dist/types/reporter/src/components/comparison/comparison-viewer.d.ts +4 -0
- package/dist/types/reporter/src/components/comparison/screenshot-display.d.ts +16 -0
- package/dist/types/reporter/src/components/design-system/alert.d.ts +9 -0
- package/dist/types/reporter/src/components/design-system/badge.d.ts +17 -0
- package/dist/types/reporter/src/components/design-system/button.d.ts +19 -0
- package/dist/types/reporter/src/components/design-system/card.d.ts +31 -0
- package/dist/types/reporter/src/components/design-system/empty-state.d.ts +13 -0
- package/dist/types/reporter/src/components/design-system/form-controls.d.ts +44 -0
- package/dist/types/reporter/src/components/design-system/health-ring.d.ts +7 -0
- package/dist/types/reporter/src/components/design-system/index.d.ts +11 -0
- package/dist/types/reporter/src/components/design-system/modal.d.ts +10 -0
- package/dist/types/reporter/src/components/design-system/skeleton.d.ts +19 -0
- package/dist/types/reporter/src/components/design-system/spinner.d.ts +10 -0
- package/dist/types/reporter/src/components/design-system/tabs.d.ts +13 -0
- package/dist/types/reporter/src/components/layout/header.d.ts +5 -0
- package/dist/types/reporter/src/components/layout/index.d.ts +2 -0
- package/dist/types/reporter/src/components/layout/layout.d.ts +6 -0
- package/dist/types/reporter/src/components/views/builds-view.d.ts +1 -0
- package/dist/types/reporter/src/components/views/comparison-detail-view.d.ts +1 -4
- package/dist/types/reporter/src/components/views/comparisons-view.d.ts +1 -6
- package/dist/types/reporter/src/components/views/stats-view.d.ts +1 -6
- package/dist/types/reporter/src/components/waiting-for-screenshots.d.ts +1 -0
- package/dist/types/reporter/src/hooks/queries/use-auth-queries.d.ts +15 -0
- package/dist/types/reporter/src/hooks/queries/use-cloud-queries.d.ts +6 -0
- package/dist/types/reporter/src/hooks/queries/use-config-queries.d.ts +6 -0
- package/dist/types/reporter/src/hooks/queries/use-tdd-queries.d.ts +9 -0
- package/dist/types/reporter/src/lib/query-client.d.ts +2 -0
- package/dist/types/reporter/src/lib/query-keys.d.ts +13 -0
- package/dist/types/sdk/index.d.ts +2 -4
- package/dist/types/server/handlers/tdd-handler.d.ts +2 -0
- package/dist/types/server/http-server.d.ts +1 -1
- package/dist/types/server/middleware/cors.d.ts +11 -0
- package/dist/types/server/middleware/json-parser.d.ts +10 -0
- package/dist/types/server/middleware/response.d.ts +50 -0
- package/dist/types/server/routers/assets.d.ts +6 -0
- package/dist/types/server/routers/auth.d.ts +9 -0
- package/dist/types/server/routers/baseline.d.ts +13 -0
- package/dist/types/server/routers/cloud-proxy.d.ts +11 -0
- package/dist/types/server/routers/config.d.ts +9 -0
- package/dist/types/server/routers/dashboard.d.ts +6 -0
- package/dist/types/server/routers/health.d.ts +11 -0
- package/dist/types/server/routers/projects.d.ts +9 -0
- package/dist/types/server/routers/screenshot.d.ts +11 -0
- package/dist/types/services/build-manager.d.ts +4 -3
- package/dist/types/services/config-service.d.ts +2 -3
- package/dist/types/services/index.d.ts +7 -0
- package/dist/types/services/project-service.d.ts +6 -4
- package/dist/types/services/screenshot-server.d.ts +5 -5
- package/dist/types/services/server-manager.d.ts +5 -3
- package/dist/types/services/tdd-service.d.ts +12 -1
- package/dist/types/services/test-runner.d.ts +3 -3
- package/dist/types/utils/output.d.ts +84 -0
- package/dist/utils/config-loader.js +24 -48
- package/dist/utils/global-config.js +2 -17
- package/dist/utils/output.js +445 -0
- package/dist/utils/security.js +3 -4
- package/docs/api-reference.md +0 -1
- package/docs/plugins.md +33 -34
- package/package.json +3 -2
- package/dist/container/index.js +0 -215
- package/dist/services/base-service.js +0 -154
- package/dist/types/container/index.d.ts +0 -59
- package/dist/types/reporter/src/components/comparison/viewer-modes/onion-viewer.d.ts +0 -3
- package/dist/types/reporter/src/components/comparison/viewer-modes/overlay-viewer.d.ts +0 -3
- package/dist/types/reporter/src/components/comparison/viewer-modes/side-by-side-viewer.d.ts +0 -3
- package/dist/types/reporter/src/components/comparison/viewer-modes/toggle-viewer.d.ts +0 -3
- package/dist/types/reporter/src/components/dashboard/dashboard-header.d.ts +0 -5
- package/dist/types/reporter/src/components/dashboard/dashboard-stats.d.ts +0 -4
- package/dist/types/reporter/src/components/dashboard/empty-state.d.ts +0 -8
- package/dist/types/reporter/src/components/ui/form-field.d.ts +0 -16
- package/dist/types/reporter/src/components/ui/status-badge.d.ts +0 -5
- package/dist/types/reporter/src/hooks/use-auth.d.ts +0 -10
- package/dist/types/reporter/src/hooks/use-baseline-actions.d.ts +0 -5
- package/dist/types/reporter/src/hooks/use-config.d.ts +0 -9
- package/dist/types/reporter/src/hooks/use-projects.d.ts +0 -10
- package/dist/types/reporter/src/hooks/use-report-data.d.ts +0 -7
- package/dist/types/reporter/src/hooks/use-vizzly-api.d.ts +0 -9
- package/dist/types/services/base-service.d.ts +0 -71
- package/dist/types/utils/console-ui.d.ts +0 -61
- package/dist/types/utils/logger-factory.d.ts +0 -26
- package/dist/types/utils/logger.d.ts +0 -79
- package/dist/utils/console-ui.js +0 -241
- package/dist/utils/logger-factory.js +0 -76
- package/dist/utils/logger.js +0 -231
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export function FormField({ label, name, type, value, onChange, error, help, disabled, required, placeholder, options, }: {
|
|
2
|
-
label: any;
|
|
3
|
-
name: any;
|
|
4
|
-
type?: string;
|
|
5
|
-
value: any;
|
|
6
|
-
onChange: any;
|
|
7
|
-
error: any;
|
|
8
|
-
help: any;
|
|
9
|
-
disabled: any;
|
|
10
|
-
required: any;
|
|
11
|
-
placeholder: any;
|
|
12
|
-
options: any;
|
|
13
|
-
}): any;
|
|
14
|
-
export function ConfigSourceBadge({ source }: {
|
|
15
|
-
source: any;
|
|
16
|
-
}): any;
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @typedef {Object} ServiceOptions
|
|
3
|
-
* @property {Object} logger - Logger instance
|
|
4
|
-
* @property {AbortSignal} [signal] - Abort signal for cancellation
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Base class for all services
|
|
8
|
-
* @extends EventEmitter
|
|
9
|
-
*/
|
|
10
|
-
export class BaseService {
|
|
11
|
-
/**
|
|
12
|
-
* @param {Object} config - Service configuration
|
|
13
|
-
* @param {ServiceOptions} options - Service options
|
|
14
|
-
*/
|
|
15
|
-
constructor(config: any, options?: ServiceOptions);
|
|
16
|
-
config: any;
|
|
17
|
-
logger: any;
|
|
18
|
-
signal: AbortSignal;
|
|
19
|
-
started: boolean;
|
|
20
|
-
stopping: boolean;
|
|
21
|
-
/**
|
|
22
|
-
* Start the service
|
|
23
|
-
* @returns {Promise<void>}
|
|
24
|
-
*/
|
|
25
|
-
start(): Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Stop the service
|
|
28
|
-
* @returns {Promise<void>}
|
|
29
|
-
*/
|
|
30
|
-
stop(): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Hook for service-specific start logic
|
|
33
|
-
* @protected
|
|
34
|
-
* @returns {Promise<void>}
|
|
35
|
-
*/
|
|
36
|
-
protected onStart(): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Hook for service-specific stop logic
|
|
39
|
-
* @protected
|
|
40
|
-
* @returns {Promise<void>}
|
|
41
|
-
*/
|
|
42
|
-
protected onStop(): Promise<void>;
|
|
43
|
-
/**
|
|
44
|
-
* Emit a progress event
|
|
45
|
-
* @param {string} phase - Progress phase
|
|
46
|
-
* @param {string} message - Progress message
|
|
47
|
-
* @param {Object} [data] - Additional data
|
|
48
|
-
*/
|
|
49
|
-
emitProgress(phase: string, message: string, data?: any): void;
|
|
50
|
-
/**
|
|
51
|
-
* Check if service is running
|
|
52
|
-
* @returns {boolean}
|
|
53
|
-
*/
|
|
54
|
-
isRunning(): boolean;
|
|
55
|
-
/**
|
|
56
|
-
* Wait for service to be ready
|
|
57
|
-
* @param {number} [timeout=30000] - Timeout in milliseconds
|
|
58
|
-
* @returns {Promise<void>}
|
|
59
|
-
*/
|
|
60
|
-
waitForReady(timeout?: number): Promise<void>;
|
|
61
|
-
}
|
|
62
|
-
export type ServiceOptions = {
|
|
63
|
-
/**
|
|
64
|
-
* - Logger instance
|
|
65
|
-
*/
|
|
66
|
-
logger: any;
|
|
67
|
-
/**
|
|
68
|
-
* - Abort signal for cancellation
|
|
69
|
-
*/
|
|
70
|
-
signal?: AbortSignal;
|
|
71
|
-
};
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Simple console UI utilities for CLI output
|
|
3
|
-
*/
|
|
4
|
-
export class ConsoleUI {
|
|
5
|
-
constructor(options?: {});
|
|
6
|
-
colors: {
|
|
7
|
-
success: any;
|
|
8
|
-
error: any;
|
|
9
|
-
warning: any;
|
|
10
|
-
info: any;
|
|
11
|
-
};
|
|
12
|
-
json: any;
|
|
13
|
-
verbose: any;
|
|
14
|
-
spinner: number;
|
|
15
|
-
lastLine: string;
|
|
16
|
-
/**
|
|
17
|
-
* Show a success message
|
|
18
|
-
*/
|
|
19
|
-
success(message: any, data?: {}): void;
|
|
20
|
-
/**
|
|
21
|
-
* Show an error message and exit
|
|
22
|
-
*/
|
|
23
|
-
error(message: any, error?: {}, exitCode?: number): void;
|
|
24
|
-
/**
|
|
25
|
-
* Show an info message
|
|
26
|
-
*/
|
|
27
|
-
info(message: any, data?: {}): void;
|
|
28
|
-
/**
|
|
29
|
-
* Show a warning message
|
|
30
|
-
*/
|
|
31
|
-
warning(message: any, data?: {}): void;
|
|
32
|
-
/**
|
|
33
|
-
* Show progress with spinner
|
|
34
|
-
*/
|
|
35
|
-
progress(message: any, current?: number, total?: number): void;
|
|
36
|
-
/**
|
|
37
|
-
* Update a status line in place (for dynamic updates)
|
|
38
|
-
*/
|
|
39
|
-
updateStatus(line: any, message: any): void;
|
|
40
|
-
/**
|
|
41
|
-
* Output structured data
|
|
42
|
-
*/
|
|
43
|
-
data(data: any): void;
|
|
44
|
-
/**
|
|
45
|
-
* Start a spinner with message
|
|
46
|
-
*/
|
|
47
|
-
startSpinner(message: any): void;
|
|
48
|
-
currentMessage: any;
|
|
49
|
-
/**
|
|
50
|
-
* Update spinner message and progress
|
|
51
|
-
*/
|
|
52
|
-
updateSpinner(message: any, current?: number, total?: number): void;
|
|
53
|
-
/**
|
|
54
|
-
* Stop the spinner
|
|
55
|
-
*/
|
|
56
|
-
stopSpinner(): void;
|
|
57
|
-
/**
|
|
58
|
-
* Clean up on exit
|
|
59
|
-
*/
|
|
60
|
-
cleanup(): void;
|
|
61
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a service logger with consistent naming and options
|
|
3
|
-
* @param {string} serviceName - Name of the service (e.g., 'TDD', 'SERVER', 'API')
|
|
4
|
-
* @param {Object} options - Logger options
|
|
5
|
-
* @returns {Logger} Configured logger instance
|
|
6
|
-
*/
|
|
7
|
-
export function createServiceLogger(serviceName: string, options?: any): Logger;
|
|
8
|
-
/**
|
|
9
|
-
* Create a component logger for CLI commands and utilities
|
|
10
|
-
* @param {string} componentName - Name of the component
|
|
11
|
-
* @param {Object} options - Logger options
|
|
12
|
-
* @returns {Logger} Configured logger instance
|
|
13
|
-
*/
|
|
14
|
-
export function createComponentLogger(componentName: string, options?: any): Logger;
|
|
15
|
-
/**
|
|
16
|
-
* Create a basic logger with standard defaults
|
|
17
|
-
* @param {Object} options - Logger options
|
|
18
|
-
* @returns {Logger} Configured logger instance
|
|
19
|
-
*/
|
|
20
|
-
export function createStandardLogger(options?: any): Logger;
|
|
21
|
-
/**
|
|
22
|
-
* Create a logger for uploader service with specific defaults
|
|
23
|
-
* @param {Object} options - Logger options
|
|
24
|
-
* @returns {Logger} Configured logger instance
|
|
25
|
-
*/
|
|
26
|
-
export function createUploaderLogger(options?: any): Logger;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create default logger instance
|
|
3
|
-
*/
|
|
4
|
-
export function createLogger(options?: {}): Logger;
|
|
5
|
-
/**
|
|
6
|
-
* Structured logger with multiple output targets and log levels
|
|
7
|
-
*/
|
|
8
|
-
export class Logger {
|
|
9
|
-
constructor(options?: {});
|
|
10
|
-
level: any;
|
|
11
|
-
logFile: any;
|
|
12
|
-
verbose: any;
|
|
13
|
-
silent: any;
|
|
14
|
-
colors: boolean;
|
|
15
|
-
levels: {
|
|
16
|
-
error: number;
|
|
17
|
-
warn: number;
|
|
18
|
-
info: number;
|
|
19
|
-
debug: number;
|
|
20
|
-
};
|
|
21
|
-
/**
|
|
22
|
-
* Initialize log file with session header
|
|
23
|
-
*/
|
|
24
|
-
initLogFile(): void;
|
|
25
|
-
/**
|
|
26
|
-
* Check if message should be logged at current level
|
|
27
|
-
*/
|
|
28
|
-
shouldLog(level: any): boolean;
|
|
29
|
-
/**
|
|
30
|
-
* Log a message with specified level
|
|
31
|
-
*/
|
|
32
|
-
log(level: any, message: any, data?: {}): void;
|
|
33
|
-
/**
|
|
34
|
-
* Output formatted message to console
|
|
35
|
-
*/
|
|
36
|
-
outputToConsole(level: any, message: any, data: any): void;
|
|
37
|
-
/**
|
|
38
|
-
* Get colored prefix for log level
|
|
39
|
-
*/
|
|
40
|
-
getColoredPrefix(level: any): any;
|
|
41
|
-
/**
|
|
42
|
-
* Convenience methods
|
|
43
|
-
*/
|
|
44
|
-
error(message: any, data?: {}): void;
|
|
45
|
-
warn(message: any, data?: {}): void;
|
|
46
|
-
info(message: any, data?: {}): void;
|
|
47
|
-
debug(message: any, data?: {}): void;
|
|
48
|
-
/**
|
|
49
|
-
* Log progress updates
|
|
50
|
-
*/
|
|
51
|
-
progress(stage: any, message: any, data?: {}): void;
|
|
52
|
-
/**
|
|
53
|
-
* Log command execution
|
|
54
|
-
*/
|
|
55
|
-
command(command: any, data?: {}): void;
|
|
56
|
-
/**
|
|
57
|
-
* Log performance metrics
|
|
58
|
-
*/
|
|
59
|
-
perf(operation: any, duration: any, data?: {}): void;
|
|
60
|
-
/**
|
|
61
|
-
* Create child logger with additional context
|
|
62
|
-
*/
|
|
63
|
-
child(context?: {}): ChildLogger;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Child logger that inherits from parent with additional context
|
|
67
|
-
*/
|
|
68
|
-
declare class ChildLogger {
|
|
69
|
-
constructor(parent: any, context: any);
|
|
70
|
-
parent: any;
|
|
71
|
-
context: any;
|
|
72
|
-
log(level: any, message: any, data?: {}): void;
|
|
73
|
-
error(message: any, data?: {}): void;
|
|
74
|
-
warn(message: any, data?: {}): void;
|
|
75
|
-
info(message: any, data?: {}): void;
|
|
76
|
-
debug(message: any, data?: {}): void;
|
|
77
|
-
progress(stage: any, message: any, data?: {}): void;
|
|
78
|
-
}
|
|
79
|
-
export {};
|
package/dist/utils/console-ui.js
DELETED
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
import { createColors } from './colors.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Simple console UI utilities for CLI output
|
|
5
|
-
*/
|
|
6
|
-
export class ConsoleUI {
|
|
7
|
-
constructor(options = {}) {
|
|
8
|
-
this.colors = createColors({
|
|
9
|
-
useColor: options.color !== false
|
|
10
|
-
});
|
|
11
|
-
this.json = options.json || false;
|
|
12
|
-
this.verbose = options.verbose || false;
|
|
13
|
-
this.spinner = null;
|
|
14
|
-
this.lastLine = '';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Show a success message
|
|
19
|
-
*/
|
|
20
|
-
success(message, data = {}) {
|
|
21
|
-
this.stopSpinner();
|
|
22
|
-
if (this.json) {
|
|
23
|
-
console.log(JSON.stringify({
|
|
24
|
-
status: 'success',
|
|
25
|
-
message,
|
|
26
|
-
timestamp: new Date().toISOString(),
|
|
27
|
-
...data
|
|
28
|
-
}));
|
|
29
|
-
} else {
|
|
30
|
-
console.log(this.colors.green(`✓ ${message}`));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Show an error message and exit
|
|
36
|
-
*/
|
|
37
|
-
error(message, error = {}, exitCode = 1) {
|
|
38
|
-
this.stopSpinner();
|
|
39
|
-
if (this.json) {
|
|
40
|
-
const errorData = {
|
|
41
|
-
status: 'error',
|
|
42
|
-
message,
|
|
43
|
-
timestamp: new Date().toISOString()
|
|
44
|
-
};
|
|
45
|
-
if (error instanceof Error) {
|
|
46
|
-
const errorMessage = error.getUserMessage ? error.getUserMessage() : error.message;
|
|
47
|
-
errorData.error = {
|
|
48
|
-
name: error.name,
|
|
49
|
-
message: errorMessage,
|
|
50
|
-
code: error.code,
|
|
51
|
-
...(this.verbose && {
|
|
52
|
-
stack: error.stack
|
|
53
|
-
})
|
|
54
|
-
};
|
|
55
|
-
} else if (typeof error === 'object') {
|
|
56
|
-
errorData.error = error;
|
|
57
|
-
}
|
|
58
|
-
console.error(JSON.stringify(errorData));
|
|
59
|
-
} else {
|
|
60
|
-
console.error(this.colors.red(`✖ ${message}`));
|
|
61
|
-
|
|
62
|
-
// Always show error details (not just in verbose mode)
|
|
63
|
-
if (error instanceof Error) {
|
|
64
|
-
// Use getUserMessage() if available (VizzlyError classes), otherwise use message
|
|
65
|
-
const errorMessage = error.getUserMessage ? error.getUserMessage() : error.message;
|
|
66
|
-
if (errorMessage && errorMessage !== message) {
|
|
67
|
-
console.error(this.colors.dim(errorMessage));
|
|
68
|
-
}
|
|
69
|
-
// Stack traces only in verbose mode
|
|
70
|
-
if (this.verbose && error.stack) {
|
|
71
|
-
console.error(this.colors.dim(error.stack));
|
|
72
|
-
}
|
|
73
|
-
} else if (typeof error === 'string' && error) {
|
|
74
|
-
console.error(this.colors.dim(error));
|
|
75
|
-
} else if (error && typeof error === 'object') {
|
|
76
|
-
// Show error object details if available
|
|
77
|
-
try {
|
|
78
|
-
const errorStr = JSON.stringify(error, null, 2);
|
|
79
|
-
if (errorStr !== '{}') {
|
|
80
|
-
console.error(this.colors.dim(errorStr));
|
|
81
|
-
}
|
|
82
|
-
} catch {
|
|
83
|
-
// Fallback for circular references or other JSON.stringify errors
|
|
84
|
-
console.error(this.colors.dim(String(error)));
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (exitCode > 0) {
|
|
89
|
-
process.exit(exitCode);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Show an info message
|
|
95
|
-
*/
|
|
96
|
-
info(message, data = {}) {
|
|
97
|
-
if (this.json) {
|
|
98
|
-
console.log(JSON.stringify({
|
|
99
|
-
status: 'info',
|
|
100
|
-
message,
|
|
101
|
-
timestamp: new Date().toISOString(),
|
|
102
|
-
...data
|
|
103
|
-
}));
|
|
104
|
-
} else {
|
|
105
|
-
console.log(this.colors.cyan(`ℹ ${message}`));
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Show a warning message
|
|
111
|
-
*/
|
|
112
|
-
warning(message, data = {}) {
|
|
113
|
-
if (this.json) {
|
|
114
|
-
console.log(JSON.stringify({
|
|
115
|
-
status: 'warning',
|
|
116
|
-
message,
|
|
117
|
-
timestamp: new Date().toISOString(),
|
|
118
|
-
...data
|
|
119
|
-
}));
|
|
120
|
-
} else {
|
|
121
|
-
console.log(this.colors.yellow(`⚠ ${message}`));
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Show progress with spinner
|
|
127
|
-
*/
|
|
128
|
-
progress(message, current = 0, total = 0) {
|
|
129
|
-
if (this.json) {
|
|
130
|
-
console.log(JSON.stringify({
|
|
131
|
-
status: 'progress',
|
|
132
|
-
message,
|
|
133
|
-
progress: {
|
|
134
|
-
current,
|
|
135
|
-
total
|
|
136
|
-
},
|
|
137
|
-
timestamp: new Date().toISOString()
|
|
138
|
-
}));
|
|
139
|
-
} else {
|
|
140
|
-
this.updateSpinner(message, current, total);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Update a status line in place (for dynamic updates)
|
|
146
|
-
*/
|
|
147
|
-
updateStatus(line, message) {
|
|
148
|
-
if (this.json) {
|
|
149
|
-
console.log(JSON.stringify({
|
|
150
|
-
status: 'update',
|
|
151
|
-
line,
|
|
152
|
-
message,
|
|
153
|
-
timestamp: new Date().toISOString()
|
|
154
|
-
}));
|
|
155
|
-
} else {
|
|
156
|
-
// Move cursor up to the target line and overwrite it
|
|
157
|
-
process.stdout.write(`\u001b[${line}A`); // Move up
|
|
158
|
-
process.stdout.write('\u001b[2K'); // Clear line
|
|
159
|
-
process.stdout.write('\r'); // Move to beginning
|
|
160
|
-
console.log(this.colors.blue(`ℹ ${message}`));
|
|
161
|
-
process.stdout.write(`\u001b[${line}B`); // Move back down
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Output structured data
|
|
167
|
-
*/
|
|
168
|
-
data(data) {
|
|
169
|
-
if (this.json) {
|
|
170
|
-
console.log(JSON.stringify({
|
|
171
|
-
status: 'data',
|
|
172
|
-
data,
|
|
173
|
-
timestamp: new Date().toISOString()
|
|
174
|
-
}));
|
|
175
|
-
} else {
|
|
176
|
-
console.log(JSON.stringify(data, null, 2));
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Start a spinner with message
|
|
182
|
-
*/
|
|
183
|
-
startSpinner(message) {
|
|
184
|
-
if (this.json || !process.stdout.isTTY) return;
|
|
185
|
-
this.stopSpinner();
|
|
186
|
-
this.currentMessage = message;
|
|
187
|
-
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
188
|
-
let i = 0;
|
|
189
|
-
this.spinner = setInterval(() => {
|
|
190
|
-
const frame = frames[i++ % frames.length];
|
|
191
|
-
const line = `${this.colors.blue(frame)} ${this.currentMessage || message}`;
|
|
192
|
-
|
|
193
|
-
// Clear previous line and write new one
|
|
194
|
-
process.stdout.write('\r' + ' '.repeat(this.lastLine.length) + '\r');
|
|
195
|
-
process.stdout.write(line);
|
|
196
|
-
this.lastLine = line;
|
|
197
|
-
}, 80);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Update spinner message and progress
|
|
202
|
-
*/
|
|
203
|
-
updateSpinner(message, current = 0, total = 0) {
|
|
204
|
-
if (this.json || !process.stdout.isTTY) return;
|
|
205
|
-
if (!this.spinner) {
|
|
206
|
-
this.startSpinner(message);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
const progressText = total > 0 ? ` (${current}/${total})` : '';
|
|
210
|
-
const fullMessage = `${message}${progressText}`;
|
|
211
|
-
|
|
212
|
-
// The spinner will pick up the new message on next frame
|
|
213
|
-
this.currentMessage = fullMessage;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Stop the spinner
|
|
218
|
-
*/
|
|
219
|
-
stopSpinner() {
|
|
220
|
-
if (this.spinner) {
|
|
221
|
-
clearInterval(this.spinner);
|
|
222
|
-
this.spinner = null;
|
|
223
|
-
|
|
224
|
-
// Clear the spinner line
|
|
225
|
-
if (process.stdout.isTTY) {
|
|
226
|
-
process.stdout.write('\r' + ' '.repeat(this.lastLine.length) + '\r');
|
|
227
|
-
}
|
|
228
|
-
this.lastLine = '';
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Clean up on exit
|
|
234
|
-
*/
|
|
235
|
-
cleanup() {
|
|
236
|
-
this.stopSpinner();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Note: Global process event listeners are handled in individual commands
|
|
241
|
-
// to avoid interference between tests and proper cleanup
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logger Factory
|
|
3
|
-
* Centralized logger creation with consistent patterns
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createLogger } from './logger.js';
|
|
7
|
-
import { getLogLevel } from './environment-config.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Create a service logger with consistent naming and options
|
|
11
|
-
* @param {string} serviceName - Name of the service (e.g., 'TDD', 'SERVER', 'API')
|
|
12
|
-
* @param {Object} options - Logger options
|
|
13
|
-
* @returns {Logger} Configured logger instance
|
|
14
|
-
*/
|
|
15
|
-
export function createServiceLogger(serviceName, options = {}) {
|
|
16
|
-
return createLogger({
|
|
17
|
-
level: options.level || getLogLevel(),
|
|
18
|
-
verbose: options.verbose || false,
|
|
19
|
-
silent: options.silent || false,
|
|
20
|
-
colors: options.colors !== false,
|
|
21
|
-
logFile: options.logFile,
|
|
22
|
-
prefix: serviceName,
|
|
23
|
-
...options
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Create a component logger for CLI commands and utilities
|
|
29
|
-
* @param {string} componentName - Name of the component
|
|
30
|
-
* @param {Object} options - Logger options
|
|
31
|
-
* @returns {Logger} Configured logger instance
|
|
32
|
-
*/
|
|
33
|
-
export function createComponentLogger(componentName, options = {}) {
|
|
34
|
-
return createLogger({
|
|
35
|
-
level: options.level || 'info',
|
|
36
|
-
verbose: options.verbose || false,
|
|
37
|
-
silent: options.silent || false,
|
|
38
|
-
colors: options.colors !== false,
|
|
39
|
-
logFile: options.logFile,
|
|
40
|
-
prefix: componentName,
|
|
41
|
-
...options
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Create a basic logger with standard defaults
|
|
47
|
-
* @param {Object} options - Logger options
|
|
48
|
-
* @returns {Logger} Configured logger instance
|
|
49
|
-
*/
|
|
50
|
-
export function createStandardLogger(options = {}) {
|
|
51
|
-
return createLogger({
|
|
52
|
-
level: options.level || 'info',
|
|
53
|
-
verbose: options.verbose || false,
|
|
54
|
-
silent: options.silent || false,
|
|
55
|
-
colors: options.colors !== false,
|
|
56
|
-
logFile: options.logFile,
|
|
57
|
-
...options
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Create a logger for uploader service with specific defaults
|
|
63
|
-
* @param {Object} options - Logger options
|
|
64
|
-
* @returns {Logger} Configured logger instance
|
|
65
|
-
*/
|
|
66
|
-
export function createUploaderLogger(options = {}) {
|
|
67
|
-
return createLogger({
|
|
68
|
-
level: options.logLevel || 'info',
|
|
69
|
-
verbose: options.verbose || false,
|
|
70
|
-
silent: options.silent || false,
|
|
71
|
-
colors: options.colors !== false,
|
|
72
|
-
logFile: options.logFile,
|
|
73
|
-
prefix: 'UPLOADER',
|
|
74
|
-
...options
|
|
75
|
-
});
|
|
76
|
-
}
|