@vizzly-testing/cli 0.20.0 → 0.20.1-beta.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/api/client.js +134 -0
- package/dist/api/core.js +341 -0
- package/dist/api/endpoints.js +314 -0
- package/dist/api/index.js +19 -0
- package/dist/auth/client.js +91 -0
- package/dist/auth/core.js +176 -0
- package/dist/auth/index.js +30 -0
- package/dist/auth/operations.js +148 -0
- package/dist/cli.js +178 -3
- package/dist/client/index.js +144 -77
- package/dist/commands/doctor.js +121 -36
- package/dist/commands/finalize.js +49 -18
- package/dist/commands/init.js +13 -18
- package/dist/commands/login.js +49 -55
- package/dist/commands/logout.js +17 -9
- package/dist/commands/project.js +100 -71
- package/dist/commands/run.js +189 -95
- package/dist/commands/status.js +101 -66
- package/dist/commands/tdd-daemon.js +61 -32
- package/dist/commands/tdd.js +104 -98
- package/dist/commands/upload.js +78 -34
- package/dist/commands/whoami.js +44 -42
- package/dist/config/core.js +438 -0
- package/dist/config/index.js +13 -0
- package/dist/config/operations.js +327 -0
- package/dist/index.js +1 -1
- package/dist/project/core.js +295 -0
- package/dist/project/index.js +13 -0
- package/dist/project/operations.js +393 -0
- package/dist/reporter/reporter-bundle.css +1 -1
- package/dist/reporter/reporter-bundle.iife.js +16 -16
- package/dist/screenshot-server/core.js +157 -0
- package/dist/screenshot-server/index.js +11 -0
- package/dist/screenshot-server/operations.js +183 -0
- package/dist/sdk/index.js +3 -2
- package/dist/server/handlers/api-handler.js +14 -5
- package/dist/server/handlers/tdd-handler.js +191 -53
- package/dist/server/http-server.js +9 -3
- package/dist/server/routers/baseline.js +58 -0
- package/dist/server/routers/dashboard.js +10 -6
- package/dist/server/routers/screenshot.js +32 -0
- package/dist/server-manager/core.js +186 -0
- package/dist/server-manager/index.js +81 -0
- package/dist/server-manager/operations.js +209 -0
- package/dist/services/build-manager.js +2 -69
- package/dist/services/index.js +21 -48
- package/dist/services/screenshot-server.js +40 -74
- package/dist/services/server-manager.js +45 -80
- package/dist/services/test-runner.js +90 -250
- package/dist/services/uploader.js +56 -358
- package/dist/tdd/core/hotspot-coverage.js +112 -0
- package/dist/tdd/core/signature.js +101 -0
- package/dist/tdd/index.js +19 -0
- package/dist/tdd/metadata/baseline-metadata.js +103 -0
- package/dist/tdd/metadata/hotspot-metadata.js +93 -0
- package/dist/tdd/services/baseline-downloader.js +151 -0
- package/dist/tdd/services/baseline-manager.js +166 -0
- package/dist/tdd/services/comparison-service.js +230 -0
- package/dist/tdd/services/hotspot-service.js +71 -0
- package/dist/tdd/services/result-service.js +123 -0
- package/dist/tdd/tdd-service.js +1145 -0
- package/dist/test-runner/core.js +255 -0
- package/dist/test-runner/index.js +13 -0
- package/dist/test-runner/operations.js +483 -0
- package/dist/types/client.d.ts +25 -2
- package/dist/uploader/core.js +396 -0
- package/dist/uploader/index.js +11 -0
- package/dist/uploader/operations.js +412 -0
- package/dist/utils/colors.js +187 -39
- package/dist/utils/config-loader.js +3 -6
- package/dist/utils/context.js +228 -0
- package/dist/utils/output.js +449 -14
- package/docs/api-reference.md +173 -8
- package/docs/tui-elements.md +560 -0
- package/package.json +13 -13
- package/dist/services/api-service.js +0 -412
- package/dist/services/auth-service.js +0 -226
- package/dist/services/config-service.js +0 -369
- package/dist/services/html-report-generator.js +0 -455
- package/dist/services/project-service.js +0 -326
- package/dist/services/report-generator/report.css +0 -411
- package/dist/services/report-generator/viewer.js +0 -102
- package/dist/services/static-report-generator.js +0 -207
- package/dist/services/tdd-service.js +0 -1437
|
@@ -1,99 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Screenshot Server Service
|
|
3
3
|
* Listens for and processes screenshots from the test runner
|
|
4
|
+
*
|
|
5
|
+
* This class is a thin wrapper around the functional operations in
|
|
6
|
+
* src/screenshot-server/. It maintains backwards compatibility while
|
|
7
|
+
* delegating to pure functions for testability.
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
import { createServer } from 'node:http';
|
|
7
11
|
import { VizzlyError } from '../errors/vizzly-error.js';
|
|
12
|
+
import { handleRequest, parseRequestBody, startServer, stopServer } from '../screenshot-server/index.js';
|
|
8
13
|
import * as output from '../utils/output.js';
|
|
9
14
|
export class ScreenshotServer {
|
|
10
|
-
constructor(config, buildManager) {
|
|
15
|
+
constructor(config, buildManager, options = {}) {
|
|
11
16
|
this.config = config;
|
|
12
17
|
this.buildManager = buildManager;
|
|
13
18
|
this.server = null;
|
|
19
|
+
|
|
20
|
+
// Dependency injection for testing
|
|
21
|
+
this.deps = options.deps || {
|
|
22
|
+
createHttpServer: createServer,
|
|
23
|
+
output,
|
|
24
|
+
createError: (message, code) => new VizzlyError(message, code)
|
|
25
|
+
};
|
|
14
26
|
}
|
|
15
27
|
async start() {
|
|
16
|
-
this.server =
|
|
17
|
-
|
|
18
|
-
this.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
});
|
|
28
|
+
this.server = await startServer({
|
|
29
|
+
config: this.config,
|
|
30
|
+
requestHandler: this.handleRequest.bind(this),
|
|
31
|
+
deps: {
|
|
32
|
+
createHttpServer: this.deps.createHttpServer,
|
|
33
|
+
createError: this.deps.createError,
|
|
34
|
+
output: this.deps.output
|
|
35
|
+
}
|
|
26
36
|
});
|
|
27
37
|
}
|
|
28
38
|
async stop() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
});
|
|
36
|
-
}
|
|
39
|
+
await stopServer({
|
|
40
|
+
server: this.server,
|
|
41
|
+
deps: {
|
|
42
|
+
output: this.deps.output
|
|
43
|
+
}
|
|
44
|
+
});
|
|
37
45
|
}
|
|
38
46
|
async handleRequest(req, res) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
properties
|
|
47
|
-
} = body;
|
|
48
|
-
if (!name || !image) {
|
|
49
|
-
res.statusCode = 400;
|
|
50
|
-
res.end(JSON.stringify({
|
|
51
|
-
error: 'name and image are required'
|
|
52
|
-
}));
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Use default buildId if none provided
|
|
57
|
-
const effectiveBuildId = buildId || 'default';
|
|
58
|
-
await this.buildManager.addScreenshot(effectiveBuildId, {
|
|
59
|
-
name,
|
|
60
|
-
image,
|
|
61
|
-
properties
|
|
62
|
-
});
|
|
63
|
-
res.statusCode = 200;
|
|
64
|
-
res.end(JSON.stringify({
|
|
65
|
-
success: true
|
|
66
|
-
}));
|
|
67
|
-
} catch (error) {
|
|
68
|
-
output.error('Failed to process screenshot:', error);
|
|
69
|
-
res.statusCode = 500;
|
|
70
|
-
res.end(JSON.stringify({
|
|
71
|
-
error: 'Internal server error'
|
|
72
|
-
}));
|
|
47
|
+
await handleRequest({
|
|
48
|
+
req,
|
|
49
|
+
res,
|
|
50
|
+
deps: {
|
|
51
|
+
buildManager: this.buildManager,
|
|
52
|
+
createError: this.deps.createError,
|
|
53
|
+
output: this.deps.output
|
|
73
54
|
}
|
|
74
|
-
}
|
|
75
|
-
res.statusCode = 404;
|
|
76
|
-
res.end(JSON.stringify({
|
|
77
|
-
error: 'Not found'
|
|
78
|
-
}));
|
|
79
|
-
}
|
|
55
|
+
});
|
|
80
56
|
}
|
|
81
57
|
async parseRequestBody(req) {
|
|
82
|
-
return
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
req.on('end', () => {
|
|
88
|
-
try {
|
|
89
|
-
resolve(JSON.parse(body));
|
|
90
|
-
} catch {
|
|
91
|
-
reject(new VizzlyError('Invalid JSON in request body', 'INVALID_JSON'));
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
req.on('error', error => {
|
|
95
|
-
reject(new VizzlyError(`Request error: ${error.message}`, 'REQUEST_ERROR'));
|
|
96
|
-
});
|
|
58
|
+
return parseRequestBody({
|
|
59
|
+
req,
|
|
60
|
+
deps: {
|
|
61
|
+
createError: this.deps.createError
|
|
62
|
+
}
|
|
97
63
|
});
|
|
98
64
|
}
|
|
99
65
|
}
|
|
@@ -1,108 +1,71 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Server Manager Service
|
|
3
3
|
* Manages the HTTP server with functional handlers
|
|
4
|
+
*
|
|
5
|
+
* This class is a thin wrapper around the functional operations in
|
|
6
|
+
* src/server-manager/. It maintains backwards compatibility while
|
|
7
|
+
* delegating to pure functions for testability.
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
7
|
-
import {
|
|
11
|
+
import { createApiClient } from '../api/index.js';
|
|
8
12
|
import { createApiHandler } from '../server/handlers/api-handler.js';
|
|
9
13
|
import { createTddHandler } from '../server/handlers/tdd-handler.js';
|
|
10
14
|
import { createHttpServer } from '../server/http-server.js';
|
|
15
|
+
import { buildServerInterface, getTddResults, startServer, stopServer } from '../server-manager/index.js';
|
|
11
16
|
export class ServerManager {
|
|
12
17
|
constructor(config, options = {}) {
|
|
13
18
|
this.config = config;
|
|
14
19
|
this.httpServer = null;
|
|
15
20
|
this.handler = null;
|
|
16
21
|
this.services = options.services || {};
|
|
22
|
+
this.tddMode = false;
|
|
23
|
+
|
|
24
|
+
// Dependency injection for testing - defaults to real implementations
|
|
25
|
+
this.deps = options.deps || {
|
|
26
|
+
createHttpServer,
|
|
27
|
+
createTddHandler,
|
|
28
|
+
createApiHandler,
|
|
29
|
+
createApiClient,
|
|
30
|
+
fs: {
|
|
31
|
+
mkdirSync,
|
|
32
|
+
writeFileSync,
|
|
33
|
+
existsSync,
|
|
34
|
+
unlinkSync
|
|
35
|
+
}
|
|
36
|
+
};
|
|
17
37
|
}
|
|
18
38
|
async start(buildId = null, tddMode = false, setBaseline = false) {
|
|
19
39
|
this.buildId = buildId;
|
|
20
40
|
this.tddMode = tddMode;
|
|
21
41
|
this.setBaseline = setBaseline;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// Pass buildId and tddService in services so http-server can use them
|
|
32
|
-
const servicesWithExtras = {
|
|
33
|
-
...this.services,
|
|
34
|
-
buildId: this.buildId,
|
|
35
|
-
// Expose tddService for baseline download operations (TDD mode only)
|
|
36
|
-
tddService: this.tddMode ? this.handler.tddService : null
|
|
37
|
-
};
|
|
38
|
-
this.httpServer = createHttpServer(port, this.handler, servicesWithExtras);
|
|
39
|
-
if (this.httpServer) {
|
|
40
|
-
await this.httpServer.start();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// Write server info to .vizzly/server.json for SDK discovery
|
|
44
|
-
// This allows SDKs that can't access environment variables (like Swift/iOS)
|
|
45
|
-
// to discover both the server port and current build ID
|
|
46
|
-
try {
|
|
47
|
-
const vizzlyDir = join(process.cwd(), '.vizzly');
|
|
48
|
-
mkdirSync(vizzlyDir, {
|
|
49
|
-
recursive: true
|
|
50
|
-
});
|
|
51
|
-
const serverFile = join(vizzlyDir, 'server.json');
|
|
52
|
-
const serverInfo = {
|
|
53
|
-
port: port.toString(),
|
|
54
|
-
pid: process.pid,
|
|
55
|
-
startTime: Date.now()
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
// Include buildId if we have one (for `vizzly run` mode)
|
|
59
|
-
if (this.buildId) {
|
|
60
|
-
serverInfo.buildId = this.buildId;
|
|
61
|
-
}
|
|
62
|
-
writeFileSync(serverFile, JSON.stringify(serverInfo, null, 2));
|
|
63
|
-
} catch {
|
|
64
|
-
// Non-fatal - SDK can still use health check or environment variables
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
async createApiService() {
|
|
68
|
-
if (!this.config.apiKey) return null;
|
|
69
|
-
const {
|
|
70
|
-
ApiService
|
|
71
|
-
} = await import('./api-service.js');
|
|
72
|
-
return new ApiService({
|
|
73
|
-
...this.config,
|
|
74
|
-
command: 'run'
|
|
42
|
+
let result = await startServer({
|
|
43
|
+
config: this.config,
|
|
44
|
+
buildId,
|
|
45
|
+
tddMode,
|
|
46
|
+
setBaseline,
|
|
47
|
+
projectRoot: process.cwd(),
|
|
48
|
+
services: this.services,
|
|
49
|
+
deps: this.deps
|
|
75
50
|
});
|
|
51
|
+
this.httpServer = result.httpServer;
|
|
52
|
+
this.handler = result.handler;
|
|
76
53
|
}
|
|
77
54
|
async stop() {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
} catch {
|
|
85
|
-
// Don't throw - cleanup errors shouldn't fail the stop process
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Clean up server.json so the client SDK doesn't try to connect to a dead server
|
|
90
|
-
try {
|
|
91
|
-
const serverFile = join(process.cwd(), '.vizzly', 'server.json');
|
|
92
|
-
if (existsSync(serverFile)) {
|
|
93
|
-
unlinkSync(serverFile);
|
|
94
|
-
}
|
|
95
|
-
} catch {
|
|
96
|
-
// Non-fatal - cleanup errors shouldn't fail the stop process
|
|
97
|
-
}
|
|
55
|
+
await stopServer({
|
|
56
|
+
httpServer: this.httpServer,
|
|
57
|
+
handler: this.handler,
|
|
58
|
+
projectRoot: process.cwd(),
|
|
59
|
+
deps: this.deps
|
|
60
|
+
});
|
|
98
61
|
}
|
|
99
62
|
|
|
100
63
|
// Expose server interface for compatibility
|
|
101
64
|
get server() {
|
|
102
|
-
return {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
};
|
|
65
|
+
return buildServerInterface({
|
|
66
|
+
handler: this.handler,
|
|
67
|
+
httpServer: this.httpServer
|
|
68
|
+
});
|
|
106
69
|
}
|
|
107
70
|
|
|
108
71
|
/**
|
|
@@ -110,7 +73,9 @@ export class ServerManager {
|
|
|
110
73
|
* Only available in TDD mode after tests have run
|
|
111
74
|
*/
|
|
112
75
|
async getTddResults() {
|
|
113
|
-
|
|
114
|
-
|
|
76
|
+
return getTddResults({
|
|
77
|
+
tddMode: this.tddMode,
|
|
78
|
+
handler: this.handler
|
|
79
|
+
});
|
|
115
80
|
}
|
|
116
81
|
}
|