@vizzly-testing/cli 0.14.0 → 0.15.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.
- package/dist/cli.js +68 -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 +22 -22
- 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
package/dist/container/index.js
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
import { VizzlyError } from '../errors/vizzly-error.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @typedef {Object} ServiceDefinition
|
|
6
|
-
* @property {Function} factory - Factory function to create service instance
|
|
7
|
-
* @property {boolean} [singleton=true] - Whether to cache the instance
|
|
8
|
-
* @property {string[]} [dependencies=[]] - Array of dependency names
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Service container for dependency injection and lifecycle management
|
|
13
|
-
*/
|
|
14
|
-
export class ServiceContainer extends EventEmitter {
|
|
15
|
-
constructor() {
|
|
16
|
-
super();
|
|
17
|
-
this.services = new Map();
|
|
18
|
-
this.instances = new Map();
|
|
19
|
-
this.starting = new Map();
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Register a service
|
|
24
|
-
* @param {string} name - Service name
|
|
25
|
-
* @param {Function|ServiceDefinition} factoryOrDefinition - Factory function or service definition
|
|
26
|
-
*/
|
|
27
|
-
register(name, factoryOrDefinition) {
|
|
28
|
-
const definition = typeof factoryOrDefinition === 'function' ? {
|
|
29
|
-
factory: factoryOrDefinition,
|
|
30
|
-
singleton: true,
|
|
31
|
-
dependencies: []
|
|
32
|
-
} : factoryOrDefinition;
|
|
33
|
-
this.services.set(name, definition);
|
|
34
|
-
this.emit('service:registered', {
|
|
35
|
-
name,
|
|
36
|
-
definition
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Get a service instance
|
|
42
|
-
* @param {string} name - Service name
|
|
43
|
-
* @returns {Promise<any>} Service instance
|
|
44
|
-
*/
|
|
45
|
-
async get(name) {
|
|
46
|
-
if (!this.services.has(name)) {
|
|
47
|
-
throw new VizzlyError(`Service '${name}' not registered`, 'SERVICE_NOT_FOUND', {
|
|
48
|
-
name
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
const definition = this.services.get(name);
|
|
52
|
-
|
|
53
|
-
// Return cached instance for singletons
|
|
54
|
-
if (definition.singleton && this.instances.has(name)) {
|
|
55
|
-
return this.instances.get(name);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Prevent circular dependencies during startup
|
|
59
|
-
if (this.starting.has(name)) {
|
|
60
|
-
throw new VizzlyError(`Circular dependency detected for service '${name}'`, 'CIRCULAR_DEPENDENCY', {
|
|
61
|
-
name
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
this.starting.set(name, true);
|
|
66
|
-
|
|
67
|
-
// Resolve dependencies
|
|
68
|
-
const deps = await Promise.all((definition.dependencies || []).map(dep => this.get(dep)));
|
|
69
|
-
|
|
70
|
-
// Create instance
|
|
71
|
-
const instance = await definition.factory(...deps);
|
|
72
|
-
|
|
73
|
-
// Cache singleton instances
|
|
74
|
-
if (definition.singleton) {
|
|
75
|
-
this.instances.set(name, instance);
|
|
76
|
-
}
|
|
77
|
-
this.emit('service:created', {
|
|
78
|
-
name,
|
|
79
|
-
instance
|
|
80
|
-
});
|
|
81
|
-
return instance;
|
|
82
|
-
} finally {
|
|
83
|
-
this.starting.delete(name);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Start all registered services
|
|
89
|
-
*/
|
|
90
|
-
async startAll() {
|
|
91
|
-
const services = Array.from(this.services.keys());
|
|
92
|
-
for (const name of services) {
|
|
93
|
-
const instance = await this.get(name);
|
|
94
|
-
if (instance && typeof instance.start === 'function') {
|
|
95
|
-
await instance.start();
|
|
96
|
-
this.emit('service:started', {
|
|
97
|
-
name,
|
|
98
|
-
instance
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Stop all services in reverse order
|
|
106
|
-
*/
|
|
107
|
-
async stopAll() {
|
|
108
|
-
const instances = Array.from(this.instances.entries()).reverse();
|
|
109
|
-
for (const [name, instance] of instances) {
|
|
110
|
-
if (instance && typeof instance.stop === 'function') {
|
|
111
|
-
await instance.stop();
|
|
112
|
-
this.emit('service:stopped', {
|
|
113
|
-
name,
|
|
114
|
-
instance
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Clear all services and instances
|
|
122
|
-
*/
|
|
123
|
-
clear() {
|
|
124
|
-
this.services.clear();
|
|
125
|
-
this.instances.clear();
|
|
126
|
-
this.starting.clear();
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Export singleton instance
|
|
131
|
-
export const container = new ServiceContainer();
|
|
132
|
-
/**
|
|
133
|
-
* Create a configured service container
|
|
134
|
-
* @param {Object} config - Configuration object
|
|
135
|
-
* @returns {ServiceContainer}
|
|
136
|
-
*/
|
|
137
|
-
export async function createServiceContainer(config, command = 'run') {
|
|
138
|
-
const container = new ServiceContainer();
|
|
139
|
-
|
|
140
|
-
// Dynamic ESM imports to avoid circular deps
|
|
141
|
-
const [{
|
|
142
|
-
createComponentLogger
|
|
143
|
-
}, {
|
|
144
|
-
ApiService
|
|
145
|
-
}, {
|
|
146
|
-
createUploader
|
|
147
|
-
}, {
|
|
148
|
-
createTDDService
|
|
149
|
-
}, {
|
|
150
|
-
TestRunner
|
|
151
|
-
}, {
|
|
152
|
-
BuildManager
|
|
153
|
-
}, {
|
|
154
|
-
ServerManager
|
|
155
|
-
}, {
|
|
156
|
-
AuthService
|
|
157
|
-
}, {
|
|
158
|
-
ConfigService
|
|
159
|
-
}, {
|
|
160
|
-
ProjectService
|
|
161
|
-
}] = await Promise.all([import('../utils/logger-factory.js'), import('../services/api-service.js'), import('../services/uploader.js'), import('../services/tdd-service.js'), import('../services/test-runner.js'), import('../services/build-manager.js'), import('../services/server-manager.js'), import('../services/auth-service.js'), import('../services/config-service.js'), import('../services/project-service.js')]);
|
|
162
|
-
|
|
163
|
-
// Create logger instance once
|
|
164
|
-
const logger = createComponentLogger('CONTAINER', {
|
|
165
|
-
level: config.logLevel || (config.verbose ? 'debug' : 'warn'),
|
|
166
|
-
verbose: config.verbose || false
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
// Register services without circular dependencies
|
|
170
|
-
container.register('logger', () => logger);
|
|
171
|
-
container.register('apiService', () => new ApiService(config, {
|
|
172
|
-
logger,
|
|
173
|
-
allowNoToken: true
|
|
174
|
-
}));
|
|
175
|
-
container.register('authService', () => new AuthService({
|
|
176
|
-
baseUrl: config.apiUrl
|
|
177
|
-
}));
|
|
178
|
-
container.register('configService', () => new ConfigService(config, {
|
|
179
|
-
logger,
|
|
180
|
-
projectRoot: process.cwd()
|
|
181
|
-
}));
|
|
182
|
-
container.register('projectService', {
|
|
183
|
-
factory: async apiService => new ProjectService(config, {
|
|
184
|
-
logger,
|
|
185
|
-
apiService
|
|
186
|
-
}),
|
|
187
|
-
dependencies: ['apiService']
|
|
188
|
-
});
|
|
189
|
-
container.register('uploader', () => createUploader({
|
|
190
|
-
...config,
|
|
191
|
-
command
|
|
192
|
-
}, {
|
|
193
|
-
logger
|
|
194
|
-
}));
|
|
195
|
-
container.register('buildManager', () => new BuildManager(config, logger));
|
|
196
|
-
container.register('serverManager', {
|
|
197
|
-
factory: async (configService, authService, projectService) => new ServerManager(config, {
|
|
198
|
-
logger,
|
|
199
|
-
services: {
|
|
200
|
-
configService,
|
|
201
|
-
authService,
|
|
202
|
-
projectService
|
|
203
|
-
}
|
|
204
|
-
}),
|
|
205
|
-
dependencies: ['configService', 'authService', 'projectService']
|
|
206
|
-
});
|
|
207
|
-
container.register('tddService', () => createTDDService(config, {
|
|
208
|
-
logger
|
|
209
|
-
}));
|
|
210
|
-
container.register('testRunner', {
|
|
211
|
-
factory: async (buildManager, serverManager, tddService) => new TestRunner(config, logger, buildManager, serverManager, tddService),
|
|
212
|
-
dependencies: ['buildManager', 'serverManager', 'tddService']
|
|
213
|
-
});
|
|
214
|
-
return container;
|
|
215
|
-
}
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base Service Class
|
|
3
|
-
* Provides common functionality for all services
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { EventEmitter } from 'events';
|
|
7
|
-
import { VizzlyError } from '../errors/vizzly-error.js';
|
|
8
|
-
import { createStandardLogger } from '../utils/logger-factory.js';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @typedef {Object} ServiceOptions
|
|
12
|
-
* @property {Object} logger - Logger instance
|
|
13
|
-
* @property {AbortSignal} [signal] - Abort signal for cancellation
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Base class for all services
|
|
18
|
-
* @extends EventEmitter
|
|
19
|
-
*/
|
|
20
|
-
export class BaseService extends EventEmitter {
|
|
21
|
-
/**
|
|
22
|
-
* @param {Object} config - Service configuration
|
|
23
|
-
* @param {ServiceOptions} options - Service options
|
|
24
|
-
*/
|
|
25
|
-
constructor(config, options = {}) {
|
|
26
|
-
super();
|
|
27
|
-
this.config = config;
|
|
28
|
-
this.logger = options.logger || createStandardLogger({
|
|
29
|
-
level: 'info'
|
|
30
|
-
});
|
|
31
|
-
this.signal = options.signal;
|
|
32
|
-
this.started = false;
|
|
33
|
-
this.stopping = false;
|
|
34
|
-
|
|
35
|
-
// Setup signal handling
|
|
36
|
-
if (this.signal) {
|
|
37
|
-
this.signal.addEventListener('abort', () => this.stop());
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Start the service
|
|
43
|
-
* @returns {Promise<void>}
|
|
44
|
-
*/
|
|
45
|
-
async start() {
|
|
46
|
-
if (this.started) {
|
|
47
|
-
this.logger.warn(`${this.constructor.name} already started`);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
try {
|
|
51
|
-
this.emit('starting');
|
|
52
|
-
await this.onStart();
|
|
53
|
-
this.started = true;
|
|
54
|
-
this.emit('started');
|
|
55
|
-
} catch (error) {
|
|
56
|
-
this.emit('error', error);
|
|
57
|
-
throw new VizzlyError(`Failed to start ${this.constructor.name}`, 'SERVICE_START_FAILED', {
|
|
58
|
-
service: this.constructor.name,
|
|
59
|
-
error: error.message
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Stop the service
|
|
66
|
-
* @returns {Promise<void>}
|
|
67
|
-
*/
|
|
68
|
-
async stop() {
|
|
69
|
-
if (!this.started || this.stopping) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
this.stopping = true;
|
|
73
|
-
try {
|
|
74
|
-
this.emit('stopping');
|
|
75
|
-
await this.onStop();
|
|
76
|
-
this.started = false;
|
|
77
|
-
this.emit('stopped');
|
|
78
|
-
} catch (error) {
|
|
79
|
-
this.emit('error', error);
|
|
80
|
-
throw new VizzlyError(`Failed to stop ${this.constructor.name}`, 'SERVICE_STOP_FAILED', {
|
|
81
|
-
service: this.constructor.name,
|
|
82
|
-
error: error.message
|
|
83
|
-
});
|
|
84
|
-
} finally {
|
|
85
|
-
this.stopping = false;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Hook for service-specific start logic
|
|
91
|
-
* @protected
|
|
92
|
-
* @returns {Promise<void>}
|
|
93
|
-
*/
|
|
94
|
-
async onStart() {
|
|
95
|
-
// Override in subclasses
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* Hook for service-specific stop logic
|
|
100
|
-
* @protected
|
|
101
|
-
* @returns {Promise<void>}
|
|
102
|
-
*/
|
|
103
|
-
async onStop() {
|
|
104
|
-
// Override in subclasses
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Emit a progress event
|
|
109
|
-
* @param {string} phase - Progress phase
|
|
110
|
-
* @param {string} message - Progress message
|
|
111
|
-
* @param {Object} [data] - Additional data
|
|
112
|
-
*/
|
|
113
|
-
emitProgress(phase, message, data = {}) {
|
|
114
|
-
this.emit('progress', {
|
|
115
|
-
phase,
|
|
116
|
-
message,
|
|
117
|
-
timestamp: new Date().toISOString(),
|
|
118
|
-
...data
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Check if service is running
|
|
124
|
-
* @returns {boolean}
|
|
125
|
-
*/
|
|
126
|
-
isRunning() {
|
|
127
|
-
return this.started && !this.stopping;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Wait for service to be ready
|
|
132
|
-
* @param {number} [timeout=30000] - Timeout in milliseconds
|
|
133
|
-
* @returns {Promise<void>}
|
|
134
|
-
*/
|
|
135
|
-
async waitForReady(timeout = 30000) {
|
|
136
|
-
if (this.started) return;
|
|
137
|
-
return new Promise((resolve, reject) => {
|
|
138
|
-
const timer = setTimeout(() => {
|
|
139
|
-
reject(new VizzlyError('Service start timeout', 'SERVICE_TIMEOUT', {
|
|
140
|
-
service: this.constructor.name,
|
|
141
|
-
timeout
|
|
142
|
-
}));
|
|
143
|
-
}, timeout);
|
|
144
|
-
this.once('started', () => {
|
|
145
|
-
clearTimeout(timer);
|
|
146
|
-
resolve();
|
|
147
|
-
});
|
|
148
|
-
this.once('error', error => {
|
|
149
|
-
clearTimeout(timer);
|
|
150
|
-
reject(error);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create a configured service container
|
|
3
|
-
* @param {Object} config - Configuration object
|
|
4
|
-
* @returns {ServiceContainer}
|
|
5
|
-
*/
|
|
6
|
-
export function createServiceContainer(config: any, command?: string): ServiceContainer;
|
|
7
|
-
/**
|
|
8
|
-
* @typedef {Object} ServiceDefinition
|
|
9
|
-
* @property {Function} factory - Factory function to create service instance
|
|
10
|
-
* @property {boolean} [singleton=true] - Whether to cache the instance
|
|
11
|
-
* @property {string[]} [dependencies=[]] - Array of dependency names
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* Service container for dependency injection and lifecycle management
|
|
15
|
-
*/
|
|
16
|
-
export class ServiceContainer {
|
|
17
|
-
services: Map<any, any>;
|
|
18
|
-
instances: Map<any, any>;
|
|
19
|
-
starting: Map<any, any>;
|
|
20
|
-
/**
|
|
21
|
-
* Register a service
|
|
22
|
-
* @param {string} name - Service name
|
|
23
|
-
* @param {Function|ServiceDefinition} factoryOrDefinition - Factory function or service definition
|
|
24
|
-
*/
|
|
25
|
-
register(name: string, factoryOrDefinition: Function | ServiceDefinition): void;
|
|
26
|
-
/**
|
|
27
|
-
* Get a service instance
|
|
28
|
-
* @param {string} name - Service name
|
|
29
|
-
* @returns {Promise<any>} Service instance
|
|
30
|
-
*/
|
|
31
|
-
get(name: string): Promise<any>;
|
|
32
|
-
/**
|
|
33
|
-
* Start all registered services
|
|
34
|
-
*/
|
|
35
|
-
startAll(): Promise<void>;
|
|
36
|
-
/**
|
|
37
|
-
* Stop all services in reverse order
|
|
38
|
-
*/
|
|
39
|
-
stopAll(): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Clear all services and instances
|
|
42
|
-
*/
|
|
43
|
-
clear(): void;
|
|
44
|
-
}
|
|
45
|
-
export const container: ServiceContainer;
|
|
46
|
-
export type ServiceDefinition = {
|
|
47
|
-
/**
|
|
48
|
-
* - Factory function to create service instance
|
|
49
|
-
*/
|
|
50
|
-
factory: Function;
|
|
51
|
-
/**
|
|
52
|
-
* - Whether to cache the instance
|
|
53
|
-
*/
|
|
54
|
-
singleton?: boolean;
|
|
55
|
-
/**
|
|
56
|
-
* - Array of dependency names
|
|
57
|
-
*/
|
|
58
|
-
dependencies?: string[];
|
|
59
|
-
};
|
|
@@ -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
|
-
}
|