@vscode/component-explorer-cli 0.2.1-0 → 0.2.1-2
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/_virtual/_build-info.js +1 -1
- package/dist/browserPage.d.ts +5 -5
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +6 -1
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +14 -6
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/artifactCommand.d.ts +13 -0
- package/dist/commands/artifactCommand.d.ts.map +1 -0
- package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
- package/dist/commands/checkStabilityCommand.js +25 -19
- package/dist/commands/checkStabilityCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +27 -9
- package/dist/commands/compareCommand.js.map +1 -1
- package/dist/commands/mcpCommand.d.ts.map +1 -1
- package/dist/commands/mcpCommand.js +30 -18
- package/dist/commands/mcpCommand.js.map +1 -1
- package/dist/commands/renderCommand.d.ts +19 -0
- package/dist/commands/renderCommand.d.ts.map +1 -0
- package/dist/commands/renderCommand.js +207 -0
- package/dist/commands/renderCommand.js.map +1 -0
- package/dist/commands/screenshotCommand.d.ts +1 -1
- package/dist/commands/screenshotCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +15 -6
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +20 -26
- package/dist/commands/watchCommand.js.map +1 -1
- package/dist/componentExplorer.d.ts +20 -12
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +20 -18
- package/dist/componentExplorer.js.map +1 -1
- package/dist/{watchConfig.d.ts → config.d.ts} +28 -24
- package/dist/config.d.ts.map +1 -0
- package/dist/{watchConfig.js → config.js} +63 -23
- package/dist/config.js.map +1 -0
- package/dist/daemon/DaemonService.d.ts +4 -4
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +19 -36
- package/dist/daemon/DaemonService.js.map +1 -1
- package/dist/daemon/pipeClient.d.ts.map +1 -1
- package/dist/daemon/pipeClient.js +4 -1
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/version.d.ts +1 -1
- package/dist/daemon/version.d.ts.map +1 -1
- package/dist/daemon/version.js +1 -1
- package/dist/dependencyInstaller.d.ts +1 -1
- package/dist/dependencyInstaller.d.ts.map +1 -1
- package/dist/explorerSession.d.ts +2 -3
- package/dist/explorerSession.d.ts.map +1 -1
- package/dist/explorerSession.js +3 -20
- package/dist/explorerSession.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/manifest.schema.json +187 -0
- package/dist/mcp/McpServer.d.ts.map +1 -1
- package/dist/mcp/McpServer.js +23 -14
- package/dist/mcp/McpServer.js.map +1 -1
- package/dist/packages/common/dist/renderManifest.js +46 -0
- package/dist/packages/common/dist/renderManifest.js.map +1 -0
- package/dist/packages/semver/dist/index.js +186 -0
- package/dist/packages/semver/dist/index.js.map +1 -0
- package/dist/renderManifest.d.ts +5 -0
- package/dist/renderManifest.d.ts.map +1 -0
- package/dist/renderManifest.js +11 -0
- package/dist/renderManifest.js.map +1 -0
- package/dist/server/httpServer.d.ts +14 -0
- package/dist/server/httpServer.d.ts.map +1 -0
- package/dist/server/httpServer.js +112 -0
- package/dist/server/httpServer.js.map +1 -0
- package/dist/server/httpServer.test.d.ts.map +1 -0
- package/dist/server/serverConfig.d.ts +42 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +60 -0
- package/dist/server/serverConfig.js.map +1 -0
- package/dist/server/types.d.ts +6 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/viteServer.d.ts +16 -0
- package/dist/server/viteServer.d.ts.map +1 -0
- package/dist/{httpServer.js → server/viteServer.js} +5 -105
- package/dist/server/viteServer.js.map +1 -0
- package/package.json +13 -5
- package/dist/commands/screenshotCommand.js +0 -124
- package/dist/commands/screenshotCommand.js.map +0 -1
- package/dist/httpServer.d.ts +0 -36
- package/dist/httpServer.d.ts.map +0 -1
- package/dist/httpServer.js.map +0 -1
- package/dist/httpServer.test.d.ts.map +0 -1
- package/dist/resolveProject.d.ts +0 -21
- package/dist/resolveProject.d.ts.map +0 -1
- package/dist/resolveProject.js +0 -39
- package/dist/resolveProject.js.map +0 -1
- package/dist/watchConfig.d.ts.map +0 -1
- package/dist/watchConfig.js.map +0 -1
- /package/dist/{httpServer.test.d.ts → server/httpServer.test.d.ts} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ILogger } from '../logger.js';
|
|
2
|
+
import type { ComponentExplorerHttpServer } from './types.js';
|
|
3
|
+
export type { ComponentExplorerHttpServer } from './types.js';
|
|
4
|
+
export interface HttpServerOptions {
|
|
5
|
+
readonly cmd?: string;
|
|
6
|
+
readonly cwd?: string;
|
|
7
|
+
readonly logger?: ILogger;
|
|
8
|
+
readonly wait?: {
|
|
9
|
+
readonly stdout?: RegExp;
|
|
10
|
+
readonly stderr?: RegExp;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export declare function createHttpServer(url: string, options?: HttpServerOptions): Promise<ComponentExplorerHttpServer>;
|
|
14
|
+
//# sourceMappingURL=httpServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpServer.d.ts","sourceRoot":"","sources":["../../src/server/httpServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAE9D,YAAY,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE;QACf,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAE/G"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { nullLogger } from '../logger.js';
|
|
2
|
+
|
|
3
|
+
function createHttpServer(url, options) {
|
|
4
|
+
return HttpComponentExplorerServer.create(url, options);
|
|
5
|
+
}
|
|
6
|
+
class HttpComponentExplorerServer {
|
|
7
|
+
url;
|
|
8
|
+
_process;
|
|
9
|
+
static async create(urlTemplate, options) {
|
|
10
|
+
let proc;
|
|
11
|
+
let vars = {};
|
|
12
|
+
if (options?.cmd) {
|
|
13
|
+
const log = options.logger ?? nullLogger;
|
|
14
|
+
log.debug(`Starting HTTP server: ${options.cmd}`);
|
|
15
|
+
log.debug(`HTTP server cwd: ${options.cwd ?? process.cwd()}`);
|
|
16
|
+
const { spawn } = await import('node:child_process');
|
|
17
|
+
proc = spawn(options.cmd, { shell: true, stdio: 'pipe', cwd: options.cwd });
|
|
18
|
+
proc.on('error', (e) => log.log(`HTTP server process error: ${e.message}`));
|
|
19
|
+
proc.on('exit', (code) => log.debug(`HTTP server process exited (code=${code})`));
|
|
20
|
+
if (options.wait?.stdout || options.wait?.stderr) {
|
|
21
|
+
vars = await waitForOutputPattern(proc, options.wait, log);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
proc.stdout?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
25
|
+
proc.stderr?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const url = resolveUrlTemplate(urlTemplate, vars);
|
|
29
|
+
return new HttpComponentExplorerServer(url, proc);
|
|
30
|
+
}
|
|
31
|
+
constructor(url, _process) {
|
|
32
|
+
this.url = url;
|
|
33
|
+
this._process = _process;
|
|
34
|
+
}
|
|
35
|
+
async dispose() {
|
|
36
|
+
const proc = this._process;
|
|
37
|
+
if (!proc || proc.killed) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
await new Promise((resolve) => {
|
|
41
|
+
proc.on('exit', () => resolve());
|
|
42
|
+
proc.stdout?.removeAllListeners('data');
|
|
43
|
+
proc.stderr?.removeAllListeners('data');
|
|
44
|
+
proc.stdout?.destroy();
|
|
45
|
+
proc.stderr?.destroy();
|
|
46
|
+
proc.kill();
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function resolveUrlTemplate(template, vars) {
|
|
51
|
+
return template.replace(/\$\{var:([^}]+)\}/g, (match, name) => {
|
|
52
|
+
if (!(name in vars)) {
|
|
53
|
+
throw new Error(`Unresolved variable \${var:${name}} in URL. Available: ${Object.keys(vars).join(', ') || '(none)'}`);
|
|
54
|
+
}
|
|
55
|
+
return vars[name];
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const _stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '').replace(/\x1b\].*?\x07/g, '');
|
|
59
|
+
function waitForOutputPattern(proc, wait, log) {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
let resolved = false;
|
|
62
|
+
const vars = {};
|
|
63
|
+
let pendingCount = (wait.stdout ? 1 : 0) + (wait.stderr ? 1 : 0);
|
|
64
|
+
const buffers = { stdout: '', stderr: '' };
|
|
65
|
+
const tryResolve = () => {
|
|
66
|
+
if (resolved || pendingCount > 0) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
resolved = true;
|
|
70
|
+
proc.stdout?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
71
|
+
proc.stderr?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
72
|
+
resolve(vars);
|
|
73
|
+
};
|
|
74
|
+
const makeHandler = (stream, pattern) => {
|
|
75
|
+
const handler = (d) => {
|
|
76
|
+
const text = d.toString();
|
|
77
|
+
log.trace(text.trimEnd());
|
|
78
|
+
buffers[stream] += _stripAnsi(text);
|
|
79
|
+
const m = pattern.exec(buffers[stream]);
|
|
80
|
+
if (m) {
|
|
81
|
+
log.debug(`${stream} pattern matched: ${JSON.stringify(m.groups ?? {})}`);
|
|
82
|
+
proc[stream]?.off('data', handler);
|
|
83
|
+
Object.assign(vars, m.groups ?? {});
|
|
84
|
+
pendingCount--;
|
|
85
|
+
tryResolve();
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
return handler;
|
|
89
|
+
};
|
|
90
|
+
if (wait.stdout) {
|
|
91
|
+
proc.stdout?.on('data', makeHandler('stdout', wait.stdout));
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
proc.stdout?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
95
|
+
}
|
|
96
|
+
if (wait.stderr) {
|
|
97
|
+
proc.stderr?.on('data', makeHandler('stderr', wait.stderr));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
proc.stderr?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
101
|
+
}
|
|
102
|
+
proc.on('exit', (code) => {
|
|
103
|
+
if (!resolved) {
|
|
104
|
+
const details = [wait.stdout ? `stdout buffer:\n${buffers.stdout}` : '', wait.stderr ? `stderr buffer:\n${buffers.stderr}` : ''].filter(Boolean).join('\n');
|
|
105
|
+
reject(new Error(`HTTP server process exited (code=${code}) before output matched wait patterns.\n${details}`));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export { createHttpServer };
|
|
112
|
+
//# sourceMappingURL=httpServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpServer.js","sources":["../../src/server/httpServer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpServer.test.d.ts","sourceRoot":"","sources":["../../src/server/httpServer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ComponentExplorerHttpServer } from './types.js';
|
|
2
|
+
import type { ILogger } from '../logger.js';
|
|
3
|
+
import { ViteProjectRef } from '../viteProjectRef.js';
|
|
4
|
+
export declare abstract class ResolvedServerConfig {
|
|
5
|
+
abstract readonly kind: 'vite' | 'http';
|
|
6
|
+
abstract createServer(ctx: ServerContext): Promise<ComponentExplorerHttpServer>;
|
|
7
|
+
}
|
|
8
|
+
export interface ServerContext {
|
|
9
|
+
readonly logger: ILogger;
|
|
10
|
+
readonly daemonConfig?: {
|
|
11
|
+
readonly pipeName: string;
|
|
12
|
+
readonly sessionName: string;
|
|
13
|
+
readonly daemonApiVersion: string;
|
|
14
|
+
readonly pluginProtocolVersion: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface ResolvedViteHmrConfig {
|
|
18
|
+
readonly allowedPaths: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
export declare class ViteServerConfig extends ResolvedServerConfig {
|
|
21
|
+
readonly viteProject: ViteProjectRef;
|
|
22
|
+
readonly hmr: ResolvedViteHmrConfig | undefined;
|
|
23
|
+
private readonly _resolveViteFrom?;
|
|
24
|
+
readonly kind = "vite";
|
|
25
|
+
constructor(viteProject: ViteProjectRef, hmr: ResolvedViteHmrConfig | undefined, _resolveViteFrom?: string | undefined);
|
|
26
|
+
forWorktree(repoRoot: string, worktreePath: string, configDir: string): ViteServerConfig;
|
|
27
|
+
createServer(ctx: ServerContext): Promise<ComponentExplorerHttpServer>;
|
|
28
|
+
}
|
|
29
|
+
export interface ResolvedHttpWaitConfig {
|
|
30
|
+
readonly stdout?: RegExp;
|
|
31
|
+
readonly stderr?: RegExp;
|
|
32
|
+
}
|
|
33
|
+
export declare class HttpServerConfig extends ResolvedServerConfig {
|
|
34
|
+
readonly url: string;
|
|
35
|
+
readonly cmd: string | undefined;
|
|
36
|
+
readonly cwd: string;
|
|
37
|
+
readonly wait: ResolvedHttpWaitConfig | undefined;
|
|
38
|
+
readonly kind = "http";
|
|
39
|
+
constructor(url: string, cmd: string | undefined, cwd: string, wait: ResolvedHttpWaitConfig | undefined);
|
|
40
|
+
createServer(ctx: ServerContext): Promise<ComponentExplorerHttpServer>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=serverConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverConfig.d.ts","sourceRoot":"","sources":["../../src/server/serverConfig.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,8BAAsB,oBAAoB;IACzC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAC/E;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE;QACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;KAC1C,CAAC;CACL;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AAED,qBAAa,gBAAiB,SAAQ,oBAAoB;IAIxD,QAAQ,CAAC,WAAW,EAAE,cAAc;IACpC,QAAQ,CAAC,GAAG,EAAE,qBAAqB,GAAG,SAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IALnC,QAAQ,CAAC,IAAI,UAAU;gBAGb,WAAW,EAAE,cAAc,EAC3B,GAAG,EAAE,qBAAqB,GAAG,SAAS,EAC9B,gBAAgB,CAAC,EAAE,MAAM,YAAA;IAK3C,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,gBAAgB;IASlF,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAQ5E;AAED,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,gBAAiB,SAAQ,oBAAoB;IAIxD,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM;IACpB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS;IANlD,QAAQ,CAAC,IAAI,UAAU;gBAGb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,sBAAsB,GAAG,SAAS;IAK5C,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,2BAA2B,CAAC;CAQ5E"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { createHttpServer } from './httpServer.js';
|
|
3
|
+
import { createViteServer } from './viteServer.js';
|
|
4
|
+
import { ViteProjectRef } from '../viteProjectRef.js';
|
|
5
|
+
|
|
6
|
+
class ResolvedServerConfig {
|
|
7
|
+
}
|
|
8
|
+
class ViteServerConfig extends ResolvedServerConfig {
|
|
9
|
+
viteProject;
|
|
10
|
+
hmr;
|
|
11
|
+
_resolveViteFrom;
|
|
12
|
+
kind = 'vite';
|
|
13
|
+
constructor(viteProject, hmr, _resolveViteFrom) {
|
|
14
|
+
super();
|
|
15
|
+
this.viteProject = viteProject;
|
|
16
|
+
this.hmr = hmr;
|
|
17
|
+
this._resolveViteFrom = _resolveViteFrom;
|
|
18
|
+
}
|
|
19
|
+
forWorktree(repoRoot, worktreePath, configDir) {
|
|
20
|
+
const configDirRelToGitRoot = path.relative(repoRoot, configDir);
|
|
21
|
+
const worktreeConfigDir = path.resolve(worktreePath, configDirRelToGitRoot);
|
|
22
|
+
const defaultViteConfig = path.basename(this.viteProject.configFile ?? 'vite.config.ts');
|
|
23
|
+
const viteConfigPath = path.resolve(worktreeConfigDir, defaultViteConfig);
|
|
24
|
+
const viteProject = ViteProjectRef.fromViteConfigPath(viteConfigPath);
|
|
25
|
+
return new ViteServerConfig(viteProject, this.hmr, this.viteProject.configFile);
|
|
26
|
+
}
|
|
27
|
+
async createServer(ctx) {
|
|
28
|
+
return createViteServer(this.viteProject, {
|
|
29
|
+
logger: ctx.logger,
|
|
30
|
+
resolveViteFrom: this._resolveViteFrom,
|
|
31
|
+
hmrAllowedPaths: this.hmr?.allowedPaths,
|
|
32
|
+
daemonConfig: ctx.daemonConfig,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
class HttpServerConfig extends ResolvedServerConfig {
|
|
37
|
+
url;
|
|
38
|
+
cmd;
|
|
39
|
+
cwd;
|
|
40
|
+
wait;
|
|
41
|
+
kind = 'http';
|
|
42
|
+
constructor(url, cmd, cwd, wait) {
|
|
43
|
+
super();
|
|
44
|
+
this.url = url;
|
|
45
|
+
this.cmd = cmd;
|
|
46
|
+
this.cwd = cwd;
|
|
47
|
+
this.wait = wait;
|
|
48
|
+
}
|
|
49
|
+
async createServer(ctx) {
|
|
50
|
+
return createHttpServer(this.url, {
|
|
51
|
+
cmd: this.cmd,
|
|
52
|
+
cwd: this.cwd,
|
|
53
|
+
wait: this.wait,
|
|
54
|
+
logger: ctx.logger,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { HttpServerConfig, ResolvedServerConfig, ViteServerConfig };
|
|
60
|
+
//# sourceMappingURL=serverConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverConfig.js","sources":["../../src/server/serverConfig.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;MAOsB,oBAAoB,CAAA;AAGzC;AAgBK,MAAO,gBAAiB,SAAQ,oBAAoB,CAAA;AAI/C,IAAA,WAAA;AACA,IAAA,GAAA;AACQ,IAAA,gBAAA;IALT,IAAI,GAAG,MAAM;AAEtB,IAAA,WAAA,CACU,WAA2B,EAC3B,GAAsC,EAC9B,gBAAyB,EAAA;AAE1C,QAAA,KAAK,EAAE;QAJE,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,GAAG,GAAH,GAAG;QACK,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IAGlC;AAEA,IAAA,WAAW,CAAC,QAAgB,EAAE,YAAoB,EAAE,SAAiB,EAAA;QACpE,MAAM,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;QAChE,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,qBAAqB,CAAC;AAC3E,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,gBAAgB,CAAC;QACxF,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;QACzE,MAAM,WAAW,GAAG,cAAc,CAAC,kBAAkB,CAAC,cAAc,CAAC;AACrE,QAAA,OAAO,IAAI,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;IAChF;IAEA,MAAM,YAAY,CAAC,GAAkB,EAAA;AACpC,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE;YACzC,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,eAAe,EAAE,IAAI,CAAC,gBAAgB;AACtC,YAAA,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY;YACvC,YAAY,EAAE,GAAG,CAAC,YAAY;AAC9B,SAAA,CAAC;IACH;AACA;AAOK,MAAO,gBAAiB,SAAQ,oBAAoB,CAAA;AAI/C,IAAA,GAAA;AACA,IAAA,GAAA;AACA,IAAA,GAAA;AACA,IAAA,IAAA;IAND,IAAI,GAAG,MAAM;AAEtB,IAAA,WAAA,CACU,GAAW,EACX,GAAuB,EACvB,GAAW,EACX,IAAwC,EAAA;AAEjD,QAAA,KAAK,EAAE;QALE,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,GAAG,GAAH,GAAG;QACH,IAAA,CAAA,IAAI,GAAJ,IAAI;IAGd;IAEA,MAAM,YAAY,CAAC,GAAkB,EAAA;AACpC,QAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,GAAG,CAAC,MAAM;AAClB,SAAA,CAAC;IACH;AACA;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,2BAA2B;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACzD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ILogger } from '../logger.js';
|
|
2
|
+
import { ViteProjectRef } from '../viteProjectRef.js';
|
|
3
|
+
import type { ComponentExplorerHttpServer } from './types.js';
|
|
4
|
+
export interface ViteServerOptions {
|
|
5
|
+
readonly resolveViteFrom?: string;
|
|
6
|
+
readonly logger?: ILogger;
|
|
7
|
+
readonly hmrAllowedPaths?: readonly string[];
|
|
8
|
+
readonly daemonConfig?: {
|
|
9
|
+
readonly pipeName: string;
|
|
10
|
+
readonly sessionName: string;
|
|
11
|
+
readonly daemonApiVersion: string;
|
|
12
|
+
readonly pluginProtocolVersion: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export declare function createViteServer(project: ViteProjectRef, options?: ViteServerOptions): Promise<ComponentExplorerHttpServer>;
|
|
16
|
+
//# sourceMappingURL=viteServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viteServer.d.ts","sourceRoot":"","sources":["../../src/server/viteServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACvC,CAAC;CACF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAE3H"}
|
|
@@ -1,107 +1,7 @@
|
|
|
1
|
-
import { nullLogger } from '
|
|
1
|
+
import { nullLogger } from '../logger.js';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
return ViteComponentExplorerHttpServer.create(project, options);
|
|
6
|
-
}
|
|
7
|
-
async createHttpServer(url, options) {
|
|
8
|
-
return HttpComponentExplorerServer.create(url, options);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
class HttpComponentExplorerServer {
|
|
12
|
-
url;
|
|
13
|
-
_process;
|
|
14
|
-
static async create(urlTemplate, options) {
|
|
15
|
-
let proc;
|
|
16
|
-
let vars = {};
|
|
17
|
-
if (options?.cmd) {
|
|
18
|
-
const log = options.logger ?? nullLogger;
|
|
19
|
-
log.debug(`Starting HTTP server: ${options.cmd}`);
|
|
20
|
-
log.debug(`HTTP server cwd: ${options.cwd ?? process.cwd()}`);
|
|
21
|
-
const { spawn } = await import('node:child_process');
|
|
22
|
-
proc = spawn(options.cmd, { shell: true, stdio: 'pipe', cwd: options.cwd });
|
|
23
|
-
proc.on('error', (e) => log.log(`HTTP server process error: ${e.message}`));
|
|
24
|
-
proc.on('exit', (code) => log.debug(`HTTP server process exited (code=${code})`));
|
|
25
|
-
if (options.wait?.stdout || options.wait?.stderr) {
|
|
26
|
-
vars = await waitForOutputPattern(proc, options.wait, log);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
proc.stdout?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
30
|
-
proc.stderr?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
const url = resolveUrlTemplate(urlTemplate, vars);
|
|
34
|
-
return new HttpComponentExplorerServer(url, proc);
|
|
35
|
-
}
|
|
36
|
-
constructor(url, _process) {
|
|
37
|
-
this.url = url;
|
|
38
|
-
this._process = _process;
|
|
39
|
-
}
|
|
40
|
-
async dispose() {
|
|
41
|
-
if (this._process && !this._process.killed) {
|
|
42
|
-
this._process.kill();
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function resolveUrlTemplate(template, vars) {
|
|
47
|
-
return template.replace(/\$\{var:([^}]+)\}/g, (match, name) => {
|
|
48
|
-
if (!(name in vars)) {
|
|
49
|
-
throw new Error(`Unresolved variable \${var:${name}} in URL. Available: ${Object.keys(vars).join(', ') || '(none)'}`);
|
|
50
|
-
}
|
|
51
|
-
return vars[name];
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
const _stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*[a-zA-Z]/g, '').replace(/\x1b\].*?\x07/g, '');
|
|
55
|
-
function waitForOutputPattern(proc, wait, log) {
|
|
56
|
-
return new Promise((resolve, reject) => {
|
|
57
|
-
let resolved = false;
|
|
58
|
-
const vars = {};
|
|
59
|
-
let pendingCount = (wait.stdout ? 1 : 0) + (wait.stderr ? 1 : 0);
|
|
60
|
-
const buffers = { stdout: '', stderr: '' };
|
|
61
|
-
const tryResolve = () => {
|
|
62
|
-
if (resolved || pendingCount > 0) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
resolved = true;
|
|
66
|
-
proc.stdout?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
67
|
-
proc.stderr?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
68
|
-
resolve(vars);
|
|
69
|
-
};
|
|
70
|
-
const makeHandler = (stream, pattern) => {
|
|
71
|
-
const handler = (d) => {
|
|
72
|
-
const text = d.toString();
|
|
73
|
-
log.trace(text.trimEnd());
|
|
74
|
-
buffers[stream] += _stripAnsi(text);
|
|
75
|
-
const m = pattern.exec(buffers[stream]);
|
|
76
|
-
if (m) {
|
|
77
|
-
log.debug(`${stream} pattern matched: ${JSON.stringify(m.groups ?? {})}`);
|
|
78
|
-
proc[stream]?.off('data', handler);
|
|
79
|
-
Object.assign(vars, m.groups ?? {});
|
|
80
|
-
pendingCount--;
|
|
81
|
-
tryResolve();
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
return handler;
|
|
85
|
-
};
|
|
86
|
-
if (wait.stdout) {
|
|
87
|
-
proc.stdout?.on('data', makeHandler('stdout', wait.stdout));
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
proc.stdout?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
91
|
-
}
|
|
92
|
-
if (wait.stderr) {
|
|
93
|
-
proc.stderr?.on('data', makeHandler('stderr', wait.stderr));
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
proc.stderr?.on('data', (d) => log.trace(d.toString().trimEnd()));
|
|
97
|
-
}
|
|
98
|
-
proc.on('exit', (code) => {
|
|
99
|
-
if (!resolved) {
|
|
100
|
-
const details = [wait.stdout ? `stdout buffer:\n${buffers.stdout}` : '', wait.stderr ? `stderr buffer:\n${buffers.stderr}` : ''].filter(Boolean).join('\n');
|
|
101
|
-
reject(new Error(`HTTP server process exited (code=${code}) before output matched wait patterns.\n${details}`));
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
});
|
|
3
|
+
function createViteServer(project, options) {
|
|
4
|
+
return ViteComponentExplorerHttpServer.create(project, options);
|
|
105
5
|
}
|
|
106
6
|
class ViteComponentExplorerHttpServer {
|
|
107
7
|
_server;
|
|
@@ -222,5 +122,5 @@ function globToRegExp(glob) {
|
|
|
222
122
|
return new RegExp(`(?:^|/)${escaped}$`);
|
|
223
123
|
}
|
|
224
124
|
|
|
225
|
-
export {
|
|
226
|
-
//# sourceMappingURL=
|
|
125
|
+
export { createViteServer };
|
|
126
|
+
//# sourceMappingURL=viteServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viteServer.js","sources":["../../src/server/viteServer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vscode/component-explorer-cli",
|
|
3
|
-
"version": "0.2.1-
|
|
3
|
+
"version": "0.2.1-2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -30,7 +30,12 @@
|
|
|
30
30
|
"import": "./dist/utils.js",
|
|
31
31
|
"types": "./dist/utils.d.ts"
|
|
32
32
|
},
|
|
33
|
-
"./
|
|
33
|
+
"./render-manifest": {
|
|
34
|
+
"import": "./dist/renderManifest.js",
|
|
35
|
+
"types": "./dist/renderManifest.d.ts"
|
|
36
|
+
},
|
|
37
|
+
"./config-schema.json": "./dist/component-explorer-config.schema.json",
|
|
38
|
+
"./manifest.schema.json": "./dist/manifest.schema.json"
|
|
34
39
|
},
|
|
35
40
|
"files": [
|
|
36
41
|
"dist",
|
|
@@ -39,16 +44,17 @@
|
|
|
39
44
|
"SECURITY.md"
|
|
40
45
|
],
|
|
41
46
|
"scripts": {
|
|
42
|
-
"build": "rollup -c &&
|
|
47
|
+
"build": "rollup -c && tsx scripts/generate-json-schema.ts",
|
|
43
48
|
"dev": "rollup -c -w",
|
|
44
49
|
"test": "vitest --run",
|
|
45
|
-
"generate-schema": "
|
|
50
|
+
"generate-schema": "tsx scripts/generate-json-schema.ts"
|
|
46
51
|
},
|
|
47
52
|
"dependencies": {
|
|
48
|
-
"@hediet/semver": "^0.2.2",
|
|
49
53
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
54
|
+
"@vscode/component-explorer-common": "workspace:*",
|
|
50
55
|
"clipanion": "^4.0.0-rc.4",
|
|
51
56
|
"express": "^5.0.0",
|
|
57
|
+
"semver": "workspace:*",
|
|
52
58
|
"zod": "^4.3.6"
|
|
53
59
|
},
|
|
54
60
|
"peerDependencies": {
|
|
@@ -64,10 +70,12 @@
|
|
|
64
70
|
"@vitejs/plugin-react": "^4.3.0",
|
|
65
71
|
"@vscode/component-explorer-vite-plugin": "workspace:*",
|
|
66
72
|
"@vscode/observables": "workspace:*",
|
|
73
|
+
"@vscode/screenshot-service": "workspace:*",
|
|
67
74
|
"playwright": "^1.40.0",
|
|
68
75
|
"react": "^18.3.0",
|
|
69
76
|
"react-dom": "^18.3.0",
|
|
70
77
|
"rollup": "^4.59.0",
|
|
78
|
+
"tsx": "^4.21.0",
|
|
71
79
|
"typescript": "^5.4.0",
|
|
72
80
|
"vite": "^6.0.0",
|
|
73
81
|
"vitest": "^1.3.0"
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { Command, Option } from 'clipanion';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
4
|
-
import { compareScreenshotsInMemory, printComparisonToConsole, writeComparisonReport } from '../comparison.js';
|
|
5
|
-
import { BrowserComponentExplorer } from '../componentExplorer.js';
|
|
6
|
-
import { DefaultComponentExplorerHttpServerFactory } from '../httpServer.js';
|
|
7
|
-
import { ConsoleLogger, verbosityToLogLevel, logBuildInfo } from '../logger.js';
|
|
8
|
-
import { resolveProject, resolvedProjectToViteProjectRef } from '../resolveProject.js';
|
|
9
|
-
import { FileSystemStorage } from '../storage.js';
|
|
10
|
-
import { matchGlob, writeFile } from '../utils.js';
|
|
11
|
-
|
|
12
|
-
class ScreenshotCommand extends Command {
|
|
13
|
-
static paths = [['screenshot']];
|
|
14
|
-
static usage = Command.Usage({
|
|
15
|
-
description: 'Capture screenshots of all fixtures',
|
|
16
|
-
examples: [
|
|
17
|
-
['Capture all fixtures', '$0 screenshot'],
|
|
18
|
-
['Capture and accept as baseline', '$0 screenshot --accept'],
|
|
19
|
-
['Filter by glob', '$0 screenshot --filter "Button/*"'],
|
|
20
|
-
],
|
|
21
|
-
});
|
|
22
|
-
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
23
|
-
filter = Option.String('--filter', { required: false, description: 'Filter fixtures by glob pattern' });
|
|
24
|
-
accept = Option.Boolean('--accept', false, { description: 'Write to baseline instead of current (mutually exclusive with --target)' });
|
|
25
|
-
project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
|
|
26
|
-
target = Option.String('--target', { required: false, description: 'Screenshot output directory (default: .screenshots/current, or .screenshots/baseline with --accept)' });
|
|
27
|
-
compare = Option.Boolean('--compare', false, { description: 'Compare screenshots after capturing' });
|
|
28
|
-
compareTarget = Option.String('--compare-target', { required: false, description: 'Directory to compare against (default: .screenshots/baseline, or .screenshots/current with --accept)' });
|
|
29
|
-
report = Option.String('--report', { required: false, description: 'Output report folder (requires --compare)' });
|
|
30
|
-
headed = Option.Boolean('--headed', false, { description: 'Show the browser window (useful for debugging)' });
|
|
31
|
-
timeout = Option.String('--timeout', '30000', { description: 'Navigation timeout in milliseconds (default: 30000)' });
|
|
32
|
-
async execute() {
|
|
33
|
-
// Validate mutually exclusive options
|
|
34
|
-
if (this.accept && this.target) {
|
|
35
|
-
this.context.stderr.write('Error: --accept and --target are mutually exclusive.\n');
|
|
36
|
-
return 1;
|
|
37
|
-
}
|
|
38
|
-
const logger = new ConsoleLogger('screenshot', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
39
|
-
logBuildInfo(logger);
|
|
40
|
-
const resolved = await resolveProject(this.project);
|
|
41
|
-
const projectDir = resolved.projectDir;
|
|
42
|
-
const viteProject = resolvedProjectToViteProjectRef(resolved);
|
|
43
|
-
// Determine target directory
|
|
44
|
-
const defaultTarget = this.accept ? '.screenshots/baseline' : '.screenshots/current';
|
|
45
|
-
const targetDir = this.target ?? defaultTarget;
|
|
46
|
-
const targetPath = path.isAbsolute(targetDir) ? targetDir : path.join(projectDir, targetDir);
|
|
47
|
-
// Determine compare target directory
|
|
48
|
-
const defaultCompareTarget = this.accept ? '.screenshots/current' : '.screenshots/baseline';
|
|
49
|
-
const compareTargetDir = this.compareTarget ?? defaultCompareTarget;
|
|
50
|
-
const compareTargetPath = path.isAbsolute(compareTargetDir) ? compareTargetDir : path.join(projectDir, compareTargetDir);
|
|
51
|
-
const storage = new FileSystemStorage(targetPath);
|
|
52
|
-
const serverFactory = new DefaultComponentExplorerHttpServerFactory();
|
|
53
|
-
const browserFactory = new PlaywrightBrowserPageFactory(this.headed, Number(this.timeout), logger);
|
|
54
|
-
const screenshots = new Map();
|
|
55
|
-
let server;
|
|
56
|
-
let explorer;
|
|
57
|
-
try {
|
|
58
|
-
this.context.stdout.write('Starting Vite dev server...\n');
|
|
59
|
-
server = await serverFactory.createViteServer(viteProject, { logger });
|
|
60
|
-
this.context.stdout.write(`Server running at ${server.url}\n`);
|
|
61
|
-
explorer = new BrowserComponentExplorer(browserFactory, server, logger);
|
|
62
|
-
const fixtures = await explorer.listFixtures();
|
|
63
|
-
const filtered = this.filter
|
|
64
|
-
? fixtures.filter(f => matchGlob(f.fixtureId, this.filter))
|
|
65
|
-
: fixtures;
|
|
66
|
-
this.context.stdout.write(`Found ${filtered.length} fixture(s)\n`);
|
|
67
|
-
for (const fixture of filtered) {
|
|
68
|
-
const result = await explorer.screenshotFixture(fixture.fixtureId);
|
|
69
|
-
if (!result.image) {
|
|
70
|
-
this.context.stderr.write(` ✗ ${fixture.fixtureId} (no screenshot: DOM node not found or not visible)\n`);
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
await storage.write(`${fixture.fixtureId}.png`, result.image);
|
|
74
|
-
screenshots.set(fixture.fixtureId, { data: result.image, background: fixture.background, labels: fixture.labels });
|
|
75
|
-
this.context.stdout.write(` ✓ ${fixture.fixtureId}\n`);
|
|
76
|
-
}
|
|
77
|
-
await writeFixturesJson(targetPath, filtered);
|
|
78
|
-
this.context.stdout.write(`\nScreenshots saved to ${targetDir}/\n`);
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
await explorer?.dispose();
|
|
82
|
-
await browserFactory.dispose();
|
|
83
|
-
await server?.dispose();
|
|
84
|
-
}
|
|
85
|
-
// Compare if requested
|
|
86
|
-
if (this.compare) {
|
|
87
|
-
this.context.stdout.write(`\nComparing against ${compareTargetDir}...\n`);
|
|
88
|
-
return this._runComparison(screenshots, targetPath, compareTargetPath, projectDir);
|
|
89
|
-
}
|
|
90
|
-
return 0;
|
|
91
|
-
}
|
|
92
|
-
async _runComparison(screenshots, targetPath, compareTargetPath, projectDir) {
|
|
93
|
-
const compareStorage = new FileSystemStorage(compareTargetPath);
|
|
94
|
-
const result = await compareScreenshotsInMemory(screenshots, {
|
|
95
|
-
list: async () => [],
|
|
96
|
-
read: (id) => compareStorage.read(id),
|
|
97
|
-
exists: (id) => compareStorage.exists(id),
|
|
98
|
-
});
|
|
99
|
-
printComparisonToConsole(result, this.context.stdout);
|
|
100
|
-
if (this.report) {
|
|
101
|
-
const reportDir = path.isAbsolute(this.report) ? this.report : path.join(projectDir, this.report);
|
|
102
|
-
await writeComparisonReport({
|
|
103
|
-
reportDir,
|
|
104
|
-
result,
|
|
105
|
-
baselinePath: compareTargetPath,
|
|
106
|
-
currentPath: targetPath,
|
|
107
|
-
getBaselineData: (id) => compareStorage.read(`${id}.png`),
|
|
108
|
-
getCurrentData: async (id) => screenshots.get(id).data,
|
|
109
|
-
});
|
|
110
|
-
this.context.stdout.write(`\nReport written to: ${this.report}/\n`);
|
|
111
|
-
}
|
|
112
|
-
return (result.added.length > 0 || result.changed.length > 0) ? 1 : 0;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async function writeFixturesJson(targetDir, fixtures) {
|
|
116
|
-
const metadata = {};
|
|
117
|
-
for (const f of fixtures) {
|
|
118
|
-
metadata[f.fixtureId] = { background: f.background, labels: f.labels };
|
|
119
|
-
}
|
|
120
|
-
await writeFile(path.join(targetDir, 'fixtures.json'), Buffer.from(JSON.stringify(metadata, null, 2)));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
export { ScreenshotCommand };
|
|
124
|
-
//# sourceMappingURL=screenshotCommand.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotCommand.js","sources":["../../src/commands/screenshotCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|