@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.
Files changed (98) hide show
  1. package/dist/_virtual/_build-info.js +1 -1
  2. package/dist/browserPage.d.ts +5 -5
  3. package/dist/browserPage.d.ts.map +1 -1
  4. package/dist/browserPage.js +6 -1
  5. package/dist/browserPage.js.map +1 -1
  6. package/dist/commands/acceptCommand.d.ts.map +1 -1
  7. package/dist/commands/acceptCommand.js +14 -6
  8. package/dist/commands/acceptCommand.js.map +1 -1
  9. package/dist/commands/artifactCommand.d.ts +13 -0
  10. package/dist/commands/artifactCommand.d.ts.map +1 -0
  11. package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
  12. package/dist/commands/checkStabilityCommand.js +25 -19
  13. package/dist/commands/checkStabilityCommand.js.map +1 -1
  14. package/dist/commands/compareCommand.d.ts.map +1 -1
  15. package/dist/commands/compareCommand.js +27 -9
  16. package/dist/commands/compareCommand.js.map +1 -1
  17. package/dist/commands/mcpCommand.d.ts.map +1 -1
  18. package/dist/commands/mcpCommand.js +30 -18
  19. package/dist/commands/mcpCommand.js.map +1 -1
  20. package/dist/commands/renderCommand.d.ts +19 -0
  21. package/dist/commands/renderCommand.d.ts.map +1 -0
  22. package/dist/commands/renderCommand.js +207 -0
  23. package/dist/commands/renderCommand.js.map +1 -0
  24. package/dist/commands/screenshotCommand.d.ts +1 -1
  25. package/dist/commands/screenshotCommand.d.ts.map +1 -1
  26. package/dist/commands/serveCommand.d.ts.map +1 -1
  27. package/dist/commands/serveCommand.js +15 -6
  28. package/dist/commands/serveCommand.js.map +1 -1
  29. package/dist/commands/watchCommand.d.ts.map +1 -1
  30. package/dist/commands/watchCommand.js +20 -26
  31. package/dist/commands/watchCommand.js.map +1 -1
  32. package/dist/componentExplorer.d.ts +20 -12
  33. package/dist/componentExplorer.d.ts.map +1 -1
  34. package/dist/componentExplorer.js +20 -18
  35. package/dist/componentExplorer.js.map +1 -1
  36. package/dist/{watchConfig.d.ts → config.d.ts} +28 -24
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/{watchConfig.js → config.js} +63 -23
  39. package/dist/config.js.map +1 -0
  40. package/dist/daemon/DaemonService.d.ts +4 -4
  41. package/dist/daemon/DaemonService.d.ts.map +1 -1
  42. package/dist/daemon/DaemonService.js +19 -36
  43. package/dist/daemon/DaemonService.js.map +1 -1
  44. package/dist/daemon/pipeClient.d.ts.map +1 -1
  45. package/dist/daemon/pipeClient.js +4 -1
  46. package/dist/daemon/pipeClient.js.map +1 -1
  47. package/dist/daemon/version.d.ts +1 -1
  48. package/dist/daemon/version.d.ts.map +1 -1
  49. package/dist/daemon/version.js +1 -1
  50. package/dist/dependencyInstaller.d.ts +1 -1
  51. package/dist/dependencyInstaller.d.ts.map +1 -1
  52. package/dist/explorerSession.d.ts +2 -3
  53. package/dist/explorerSession.d.ts.map +1 -1
  54. package/dist/explorerSession.js +3 -20
  55. package/dist/explorerSession.js.map +1 -1
  56. package/dist/index.js +2 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/manifest.schema.json +187 -0
  59. package/dist/mcp/McpServer.d.ts.map +1 -1
  60. package/dist/mcp/McpServer.js +23 -14
  61. package/dist/mcp/McpServer.js.map +1 -1
  62. package/dist/packages/common/dist/renderManifest.js +46 -0
  63. package/dist/packages/common/dist/renderManifest.js.map +1 -0
  64. package/dist/packages/semver/dist/index.js +186 -0
  65. package/dist/packages/semver/dist/index.js.map +1 -0
  66. package/dist/renderManifest.d.ts +5 -0
  67. package/dist/renderManifest.d.ts.map +1 -0
  68. package/dist/renderManifest.js +11 -0
  69. package/dist/renderManifest.js.map +1 -0
  70. package/dist/server/httpServer.d.ts +14 -0
  71. package/dist/server/httpServer.d.ts.map +1 -0
  72. package/dist/server/httpServer.js +112 -0
  73. package/dist/server/httpServer.js.map +1 -0
  74. package/dist/server/httpServer.test.d.ts.map +1 -0
  75. package/dist/server/serverConfig.d.ts +42 -0
  76. package/dist/server/serverConfig.d.ts.map +1 -0
  77. package/dist/server/serverConfig.js +60 -0
  78. package/dist/server/serverConfig.js.map +1 -0
  79. package/dist/server/types.d.ts +6 -0
  80. package/dist/server/types.d.ts.map +1 -0
  81. package/dist/server/viteServer.d.ts +16 -0
  82. package/dist/server/viteServer.d.ts.map +1 -0
  83. package/dist/{httpServer.js → server/viteServer.js} +5 -105
  84. package/dist/server/viteServer.js.map +1 -0
  85. package/package.json +13 -5
  86. package/dist/commands/screenshotCommand.js +0 -124
  87. package/dist/commands/screenshotCommand.js.map +0 -1
  88. package/dist/httpServer.d.ts +0 -36
  89. package/dist/httpServer.d.ts.map +0 -1
  90. package/dist/httpServer.js.map +0 -1
  91. package/dist/httpServer.test.d.ts.map +0 -1
  92. package/dist/resolveProject.d.ts +0 -21
  93. package/dist/resolveProject.d.ts.map +0 -1
  94. package/dist/resolveProject.js +0 -39
  95. package/dist/resolveProject.js.map +0 -1
  96. package/dist/watchConfig.d.ts.map +0 -1
  97. package/dist/watchConfig.js.map +0 -1
  98. /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,6 @@
1
+ export interface ComponentExplorerHttpServer {
2
+ readonly url: string;
3
+ readonly onSourceChange?: (callback: () => void) => void;
4
+ dispose(): Promise<void>;
5
+ }
6
+ //# sourceMappingURL=types.d.ts.map
@@ -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 './logger.js';
1
+ import { nullLogger } from '../logger.js';
2
2
 
3
- class DefaultComponentExplorerHttpServerFactory {
4
- async createViteServer(project, options) {
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 { DefaultComponentExplorerHttpServerFactory };
226
- //# sourceMappingURL=httpServer.js.map
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-0",
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
- "./config-schema.json": "./dist/component-explorer-config.schema.json"
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 && node --experimental-strip-types scripts/generate-json-schema.ts",
47
+ "build": "rollup -c && tsx scripts/generate-json-schema.ts",
43
48
  "dev": "rollup -c -w",
44
49
  "test": "vitest --run",
45
- "generate-schema": "node --experimental-strip-types scripts/generate-json-schema.ts"
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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"}