@vscode/component-explorer-cli 0.2.1-6 → 0.2.1-60
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/README.md +6 -6
- package/dist/WorktreePool.d.ts +5 -4
- package/dist/WorktreePool.d.ts.map +1 -1
- package/dist/WorktreePool.js +3 -3
- package/dist/WorktreePool.js.map +1 -1
- package/dist/_virtual/_build-info.js +1 -1
- package/dist/browserPage.d.ts +50 -0
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +78 -0
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts +1 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +15 -8
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/checkStabilityCommand.d.ts +2 -0
- package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
- package/dist/commands/checkStabilityCommand.js +19 -2
- package/dist/commands/checkStabilityCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts +1 -1
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +24 -15
- package/dist/commands/compareCommand.js.map +1 -1
- package/dist/commands/inputArg.d.ts +33 -0
- package/dist/commands/inputArg.d.ts.map +1 -0
- package/dist/commands/inputArg.js +103 -0
- package/dist/commands/inputArg.js.map +1 -0
- package/dist/commands/mcpCommand.d.ts +0 -2
- package/dist/commands/mcpCommand.d.ts.map +1 -1
- package/dist/commands/mcpCommand.js +136 -68
- package/dist/commands/mcpCommand.js.map +1 -1
- package/dist/commands/renderCommand.d.ts +9 -1
- package/dist/commands/renderCommand.d.ts.map +1 -1
- package/dist/commands/renderCommand.js +308 -21
- package/dist/commands/renderCommand.js.map +1 -1
- package/dist/commands/serveCommand.d.ts +1 -0
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +11 -6
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.d.ts +1 -0
- package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.js +34 -28
- package/dist/commands/serviceDiffCommitsCommand.js.map +1 -1
- package/dist/commands/watchCommand.d.ts +1 -0
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +24 -13
- package/dist/commands/watchCommand.js.map +1 -1
- package/dist/comparison.d.ts +4 -3
- package/dist/comparison.d.ts.map +1 -1
- package/dist/comparison.js +17 -14
- package/dist/comparison.js.map +1 -1
- package/dist/component-explorer-config.schema.json +55 -2
- package/dist/componentExplorer.d.ts +106 -11
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +159 -16
- package/dist/componentExplorer.js.map +1 -1
- package/dist/config.d.ts +33 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +64 -27
- package/dist/config.js.map +1 -1
- package/dist/coverage.d.ts +64 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +212 -0
- package/dist/coverage.js.map +1 -0
- package/dist/daemon/DaemonService.d.ts +14 -5
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +39 -15
- package/dist/daemon/DaemonService.js.map +1 -1
- package/dist/daemon/approvalStore.d.ts +2 -1
- package/dist/daemon/approvalStore.d.ts.map +1 -1
- package/dist/daemon/approvalStore.js +4 -3
- package/dist/daemon/approvalStore.js.map +1 -1
- package/dist/daemon/inProcessClient.js +2 -2
- package/dist/daemon/lifecycle.d.ts +4 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +1 -1
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/pipeClient.d.ts +2 -0
- package/dist/daemon/pipeClient.d.ts.map +1 -1
- package/dist/daemon/pipeClient.js +21 -3
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/pipeName.d.ts +3 -3
- package/dist/daemon/pipeName.d.ts.map +1 -1
- package/dist/daemon/pipeName.js +1 -2
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.js +2 -2
- package/dist/daemon/version.d.ts +1 -1
- package/dist/daemon/version.js +1 -1
- package/dist/dependencyInstaller.d.ts +2 -1
- package/dist/dependencyInstaller.d.ts.map +1 -1
- package/dist/dependencyInstaller.js +4 -4
- package/dist/dependencyInstaller.js.map +1 -1
- package/dist/git/gitCommitResolver.d.ts +2 -1
- package/dist/git/gitCommitResolver.d.ts.map +1 -1
- package/dist/git/gitCommitResolver.js +2 -2
- package/dist/git/gitCommitResolver.js.map +1 -1
- package/dist/git/gitIndexResolver.d.ts +2 -1
- package/dist/git/gitIndexResolver.d.ts.map +1 -1
- package/dist/git/gitIndexResolver.js +1 -1
- package/dist/git/gitIndexResolver.js.map +1 -1
- package/dist/git/gitService.d.ts +5 -4
- package/dist/git/gitService.d.ts.map +1 -1
- package/dist/git/gitService.js.map +1 -1
- package/dist/git/gitUtils.d.ts +6 -5
- package/dist/git/gitUtils.d.ts.map +1 -1
- package/dist/git/gitUtils.js +5 -4
- package/dist/git/gitUtils.js.map +1 -1
- package/dist/git/gitWorktreeManager.d.ts +15 -14
- package/dist/git/gitWorktreeManager.d.ts.map +1 -1
- package/dist/git/gitWorktreeManager.js +10 -11
- package/dist/git/gitWorktreeManager.js.map +1 -1
- package/dist/git/testUtils.d.ts +2 -1
- package/dist/git/testUtils.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.schema.json +38 -16
- package/dist/mcp/DaemonAccessor.d.ts +22 -0
- package/dist/mcp/DaemonAccessor.d.ts.map +1 -0
- package/dist/mcp/McpServer.d.ts +5 -19
- package/dist/mcp/McpServer.d.ts.map +1 -1
- package/dist/mcp/McpServer.js +367 -281
- package/dist/mcp/McpServer.js.map +1 -1
- package/dist/packages/common/dist/explorerUrl.js +21 -0
- package/dist/packages/common/dist/explorerUrl.js.map +1 -0
- package/dist/packages/common/dist/renderManifest.js +26 -5
- package/dist/packages/common/dist/renderManifest.js.map +1 -1
- package/dist/packages/simple-api/dist/{chunk-3R7GHWBM.js → chunk-FJ7AVNQE.js} +2 -1
- package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +1 -0
- package/dist/packages/simple-api/dist/{chunk-SGBCNXYH.js → chunk-TTRCY65Z.js} +4 -1
- package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js.map +1 -0
- package/dist/packages/simple-api/dist/{chunk-TAEFVNPN.js → chunk-WNXMRXWV.js} +2 -1
- package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js.map +1 -0
- package/dist/packages/simple-api/dist/express.js +1 -1
- package/dist/packages/simple-api/dist/express.js.map +1 -1
- package/dist/path.d.ts +30 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +78 -0
- package/dist/path.js.map +1 -0
- package/dist/processTree.d.ts +14 -0
- package/dist/processTree.d.ts.map +1 -0
- package/dist/processTree.js +84 -0
- package/dist/processTree.js.map +1 -0
- package/dist/screenshotServiceClient.d.ts +5 -1
- package/dist/screenshotServiceClient.d.ts.map +1 -1
- package/dist/screenshotServiceClient.js +8 -2
- package/dist/screenshotServiceClient.js.map +1 -1
- package/dist/server/httpServer.d.ts +1 -1
- package/dist/server/httpServer.d.ts.map +1 -1
- package/dist/server/httpServer.js +20 -22
- package/dist/server/httpServer.js.map +1 -1
- package/dist/server/serverConfig.d.ts +23 -6
- package/dist/server/serverConfig.d.ts.map +1 -1
- package/dist/server/serverConfig.js +11 -18
- package/dist/server/serverConfig.js.map +1 -1
- package/dist/server/viteServer.d.ts +16 -1
- package/dist/server/viteServer.d.ts.map +1 -1
- package/dist/server/viteServer.js +86 -5
- package/dist/server/viteServer.js.map +1 -1
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/utils.d.ts +3 -30
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -24
- package/dist/utils.js.map +1 -1
- package/dist/visualCache.d.ts +2 -1
- package/dist/visualCache.d.ts.map +1 -1
- package/dist/visualCache.js +4 -3
- package/dist/visualCache.js.map +1 -1
- package/dist/viteProjectRef.d.ts +4 -12
- package/dist/viteProjectRef.d.ts.map +1 -1
- package/dist/viteProjectRef.js +9 -17
- package/dist/viteProjectRef.js.map +1 -1
- package/package.json +20 -19
- package/dist/commands/artifactCommand.d.ts +0 -14
- package/dist/commands/artifactCommand.d.ts.map +0 -1
- package/dist/commands/screenshotCommand.d.ts +0 -19
- package/dist/commands/screenshotCommand.d.ts.map +0 -1
- package/dist/packages/simple-api/dist/chunk-3R7GHWBM.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-SGBCNXYH.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-TAEFVNPN.js.map +0 -1
|
@@ -10,12 +10,15 @@ import '../external/vscode-observables/observables/dist/observableInternal/obser
|
|
|
10
10
|
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
11
11
|
import { compareScreenshotsInMemory, printComparisonToConsole, writeComparisonReport } from '../comparison.js';
|
|
12
12
|
import { ConsoleLogger, verbosityToLogLevel, createLogFileOptions, logBuildInfo } from '../logger.js';
|
|
13
|
-
import { ResolvedConfig } from '../config.js';
|
|
13
|
+
import { ResolvedConfig, ResolvedCoverageConfig } from '../config.js';
|
|
14
|
+
import { AbsolutePath, RelativePath } from '../path.js';
|
|
14
15
|
import { ExplorerSession } from '../explorerSession.js';
|
|
15
16
|
import { FileSystemStorage } from '../storage.js';
|
|
16
|
-
import {
|
|
17
|
+
import { writeFile } from '../utils.js';
|
|
17
18
|
import { getGitRoot, execGit } from '../git/gitUtils.js';
|
|
18
19
|
import { serializeManifest } from '../renderManifest.js';
|
|
20
|
+
import { parseInputJson } from './inputArg.js';
|
|
21
|
+
import { validateIstanbulMap, v8EntriesToIstanbul, mergeIstanbul, cssEntriesToIstanbul, writeIstanbulFile } from '../coverage.js';
|
|
19
22
|
import { MANIFEST_FILENAME } from '../packages/common/dist/renderManifest.js';
|
|
20
23
|
|
|
21
24
|
class RenderCommand extends Command {
|
|
@@ -25,12 +28,12 @@ class RenderCommand extends Command {
|
|
|
25
28
|
examples: [
|
|
26
29
|
['Render all fixtures', '$0 render'],
|
|
27
30
|
['Render and accept as baseline', '$0 render --accept'],
|
|
28
|
-
['Filter by
|
|
31
|
+
['Filter by fixture-id regex', '$0 render --fixture-id-regex "^Button/"'],
|
|
29
32
|
],
|
|
30
33
|
});
|
|
31
34
|
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
32
35
|
logFile = Option.String('--log-file', { description: 'Append logs to this file (works with -v/-vv)' });
|
|
33
|
-
|
|
36
|
+
fixtureIdRegex = Option.String('--fixture-id-regex', { required: false, description: 'Filter fixtures whose fixtureId matches this regular expression (unanchored)' });
|
|
34
37
|
accept = Option.Boolean('--accept', false, { description: 'Write to baseline instead of current (mutually exclusive with --target)' });
|
|
35
38
|
project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
|
|
36
39
|
target = Option.String('--target', { required: false, description: 'Screenshot output directory (default: .screenshots/current, or .screenshots/baseline with --accept)' });
|
|
@@ -40,46 +43,150 @@ class RenderCommand extends Command {
|
|
|
40
43
|
headed = Option.Boolean('--headed', false, { description: 'Show the browser window (useful for debugging)' });
|
|
41
44
|
timeout = Option.String('--timeout', '30000', { description: 'Navigation timeout in milliseconds (default: 30000)' });
|
|
42
45
|
useHashPaths = Option.Boolean('--useHashPaths', false, { description: 'Use content-hash image paths (images/<hash>.png) for deduplication instead of fixture-id paths' });
|
|
46
|
+
reloadBetweenFixtures = Option.Boolean('--reload-between-fixtures', false, { description: 'Reload the browser page between fixtures for cleaner isolation (slower)' });
|
|
47
|
+
input = Option.String('--input', { required: false, description: 'JSON object passed to every fixture as `RenderContext.input` (e.g. \'{"theme":"dark"}\'). Combine with `--input-<key> <value>` to override individual properties.' });
|
|
48
|
+
coverage = Option.Boolean('--coverage', false, { description: 'Collect code coverage during rendering. Output is written to <target>/<coverage-output>/' });
|
|
49
|
+
coverageMode = Option.String('--coverage-mode', { required: false, description: 'Coverage aggregation: "total" (one report for all fixtures, default) or "per-fixture" (one report per fixture; forces --reload-between-fixtures)' });
|
|
50
|
+
coverageJs = Option.String('--coverage-js', { required: false, description: 'JavaScript coverage strategy: "istanbul" (default; vite-plugin-istanbul), "v8" (Playwright V8 + v8-to-istanbul), or "off"' });
|
|
51
|
+
coverageCss = Option.Boolean('--coverage-css', false, { description: 'Also collect CSS coverage via Playwright (raw range data)' });
|
|
52
|
+
coverageOutput = Option.String('--coverage-output', { required: false, description: 'Coverage output directory, relative to --target (default: "coverage")' });
|
|
43
53
|
async execute() {
|
|
44
54
|
// Validate mutually exclusive options
|
|
45
55
|
if (this.accept && this.target) {
|
|
46
56
|
this.context.stderr.write('Error: --accept and --target are mutually exclusive.\n');
|
|
47
57
|
return 1;
|
|
48
58
|
}
|
|
59
|
+
let input;
|
|
60
|
+
try {
|
|
61
|
+
input = parseInputJson(this.input);
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
this.context.stderr.write(`Error: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
65
|
+
return 1;
|
|
66
|
+
}
|
|
49
67
|
const logger = new ConsoleLogger('render', this.context.stdout, verbosityToLogLevel(this.verbose), createLogFileOptions(this.logFile, this.verbose));
|
|
50
68
|
logBuildInfo(logger);
|
|
69
|
+
const projectPath = AbsolutePath.resolve(this.project);
|
|
51
70
|
const disposables = new DisposableStore();
|
|
52
|
-
const config = await ResolvedConfig.fromProjectPath(
|
|
71
|
+
const config = await ResolvedConfig.fromProjectPath(projectPath, disposables);
|
|
53
72
|
const projectDir = config.configDir;
|
|
54
73
|
const serverConfig = config.sessions[0].server;
|
|
74
|
+
// Resolve coverage settings — CLI flags override JSON config.
|
|
75
|
+
let coverage;
|
|
76
|
+
try {
|
|
77
|
+
coverage = this._resolveCoverage(config.coverage);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
this.context.stderr.write(`Error: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
if (coverage && coverage.js !== 'istanbul' && coverage.js !== 'v8' && !coverage.css) {
|
|
84
|
+
coverage = undefined;
|
|
85
|
+
}
|
|
86
|
+
// Per-fixture coverage requires page reload between fixtures so the
|
|
87
|
+
// `__coverage__` global / V8 sampler restarts cleanly each iteration.
|
|
88
|
+
const effectiveReloadBetween = this.reloadBetweenFixtures || (coverage?.mode === 'per-fixture' && coverage.enabled);
|
|
89
|
+
if (coverage?.mode === 'per-fixture' && !this.reloadBetweenFixtures) {
|
|
90
|
+
logger.debug('Coverage mode "per-fixture" implies reload-between-fixtures=true');
|
|
91
|
+
}
|
|
55
92
|
// Determine target directory
|
|
56
93
|
const defaultTarget = this.accept ? '.screenshots/baseline' : '.screenshots/current';
|
|
57
94
|
const targetDir = this.target ?? defaultTarget;
|
|
58
|
-
const targetPath =
|
|
95
|
+
const targetPath = AbsolutePath.fromAbsoluteOrRelative(targetDir, { base: projectDir });
|
|
59
96
|
// Determine compare target directory
|
|
60
97
|
const defaultCompareTarget = this.accept ? '.screenshots/current' : '.screenshots/baseline';
|
|
61
98
|
const compareTargetDir = this.compareTarget ?? defaultCompareTarget;
|
|
62
|
-
const compareTargetPath =
|
|
99
|
+
const compareTargetPath = AbsolutePath.fromAbsoluteOrRelative(compareTargetDir, { base: projectDir });
|
|
63
100
|
const storage = new FileSystemStorage(targetPath);
|
|
64
101
|
const browserFactory = new PlaywrightBrowserPageFactory(this.headed, Number(this.timeout), logger);
|
|
65
102
|
const screenshots = new Map();
|
|
66
103
|
let session;
|
|
67
104
|
try {
|
|
68
105
|
this.context.stdout.write('Starting server...\n');
|
|
69
|
-
|
|
106
|
+
const istanbulCoverage = coverage && coverage.js === 'istanbul'
|
|
107
|
+
? { include: coverage.include, exclude: coverage.exclude }
|
|
108
|
+
: undefined;
|
|
109
|
+
if (istanbulCoverage && serverConfig.kind !== 'vite') {
|
|
110
|
+
this.context.stderr.write('Warning: --coverage-js=istanbul requires a Vite server; falling back to no JS coverage. Use --coverage-js=v8 for non-Vite servers.\n');
|
|
111
|
+
}
|
|
112
|
+
// Enable CSS sourceURL annotation when CSS coverage is requested.
|
|
113
|
+
// Without it, Vite's HMR-injected `<style>` tags are anonymous and
|
|
114
|
+
// Playwright's CSS coverage drops them.
|
|
115
|
+
const cssSourceUrl = coverage?.css === true && serverConfig.kind === 'vite';
|
|
116
|
+
session = await ExplorerSession.create('render', serverConfig, browserFactory, { logger, istanbulCoverage, cssSourceUrl });
|
|
70
117
|
this.context.stdout.write(`Server running at ${session.serverUrl}\n`);
|
|
71
118
|
const listResult = await session.explorer.listFixtures();
|
|
72
119
|
if (listResult.loadError) {
|
|
73
120
|
this.context.stderr.write(`Warning: Fixture loading error: ${listResult.loadError}\n`);
|
|
74
121
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
122
|
+
let filtered;
|
|
123
|
+
if (this.fixtureIdRegex) {
|
|
124
|
+
let regex;
|
|
125
|
+
try {
|
|
126
|
+
regex = new RegExp(this.fixtureIdRegex);
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
this.context.stderr.write(`Error: Invalid --fixture-id-regex: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
filtered = listResult.fixtures.filter(f => regex.test(f.fixtureId));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
filtered = listResult.fixtures;
|
|
136
|
+
}
|
|
78
137
|
this.context.stdout.write(`Found ${filtered.length} fixture(s)\n`);
|
|
79
138
|
const fixtureEntries = [];
|
|
80
139
|
const writtenHashes = new Set();
|
|
81
|
-
|
|
82
|
-
|
|
140
|
+
// Coverage state
|
|
141
|
+
const useV8Js = coverage?.js === 'v8';
|
|
142
|
+
const useIstanbulJs = coverage?.js === 'istanbul' && serverConfig.kind === 'vite';
|
|
143
|
+
const useCss = coverage?.css === true;
|
|
144
|
+
const v8FilterInclude = useV8Js ? coverage.include.map(_globToRegExp) : undefined;
|
|
145
|
+
const v8FilterExclude = useV8Js ? coverage.exclude.map(_globToRegExp) : undefined;
|
|
146
|
+
const perFixtureMaps = [];
|
|
147
|
+
const totalMaps = [];
|
|
148
|
+
// Total mode: start coverage once before the loop. The BrowserPage
|
|
149
|
+
// snapshots active trackers automatically on every triggered reload
|
|
150
|
+
// (e.g. `reloadOnError`, `reloadBeforeRender`) and reapplies them on
|
|
151
|
+
// the new document, so callers get the union when they finally stop.
|
|
152
|
+
if (coverage && coverage.mode === 'total' && (useV8Js || useCss || useIstanbulJs)) {
|
|
153
|
+
const page = await session.explorer.getOrOpenPage();
|
|
154
|
+
if (useV8Js) {
|
|
155
|
+
await page.startJSCoverage({ resetOnNavigation: false });
|
|
156
|
+
}
|
|
157
|
+
if (useCss) {
|
|
158
|
+
await page.startCSSCoverage({ resetOnNavigation: false });
|
|
159
|
+
}
|
|
160
|
+
if (useIstanbulJs) {
|
|
161
|
+
page.startIstanbulSnapshot();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
for (let i = 0; i < filtered.length; i++) {
|
|
165
|
+
const fixture = filtered[i];
|
|
166
|
+
// For per-fixture coverage we reload BEFORE rendering, then start
|
|
167
|
+
// V8/CSS coverage on the fresh page so each fixture is isolated.
|
|
168
|
+
const reloadBeforeRender = effectiveReloadBetween && i > 0;
|
|
169
|
+
if (coverage && coverage.mode === 'per-fixture' && (useV8Js || useCss)) {
|
|
170
|
+
const page = await session.explorer.getOrOpenPage();
|
|
171
|
+
// Reload first (mirrors what screenshotFixture would have done) so
|
|
172
|
+
// that __coverage__ resets and the V8 sampler starts on a clean page.
|
|
173
|
+
if (reloadBeforeRender) {
|
|
174
|
+
await page.reload();
|
|
175
|
+
}
|
|
176
|
+
if (useV8Js) {
|
|
177
|
+
await page.startJSCoverage({ resetOnNavigation: false });
|
|
178
|
+
}
|
|
179
|
+
if (useCss) {
|
|
180
|
+
await page.startCSSCoverage({ resetOnNavigation: false });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const result = await session.explorer.screenshotFixture(fixture.fixtureId, {
|
|
184
|
+
reloadOnError: true,
|
|
185
|
+
// We already handled the reload manually above for per-fixture coverage.
|
|
186
|
+
reloadBeforeRender: coverage?.mode === 'per-fixture' && (useV8Js || useCss) ? false : reloadBeforeRender,
|
|
187
|
+
input,
|
|
188
|
+
disposeAfter: true,
|
|
189
|
+
});
|
|
83
190
|
let imageHash;
|
|
84
191
|
let imagePath;
|
|
85
192
|
if (result.image) {
|
|
@@ -97,6 +204,22 @@ class RenderCommand extends Command {
|
|
|
97
204
|
}
|
|
98
205
|
screenshots.set(fixture.fixtureId, { data: result.image, background: fixture.background, labels: fixture.labels });
|
|
99
206
|
}
|
|
207
|
+
const events = [];
|
|
208
|
+
for (const e of result.events) {
|
|
209
|
+
events.push({ ...e, phase: 'render', isError: e.type !== 'console.log' });
|
|
210
|
+
}
|
|
211
|
+
if (result.error) {
|
|
212
|
+
events.push({ type: 'thrownError', phase: 'render', isError: true, message: result.error.message, stack: result.error.stack });
|
|
213
|
+
}
|
|
214
|
+
if (result.currentDispose) {
|
|
215
|
+
for (const e of result.currentDispose.events) {
|
|
216
|
+
events.push({ ...e, phase: 'dispose', isError: e.type !== 'console.log' });
|
|
217
|
+
}
|
|
218
|
+
for (const err of result.currentDispose.errors) {
|
|
219
|
+
events.push({ type: 'thrownError', phase: 'dispose', isError: true, message: err.message, stack: err.stack });
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
const hasError = events.some(e => e.isError);
|
|
100
223
|
fixtureEntries.push({
|
|
101
224
|
fixtureId: fixture.fixtureId,
|
|
102
225
|
imageHash,
|
|
@@ -104,32 +227,152 @@ class RenderCommand extends Command {
|
|
|
104
227
|
background: fixture.background,
|
|
105
228
|
labels: [...fixture.labels],
|
|
106
229
|
expectedVisualDescriptions: [...fixture.expectedVisualDescriptions],
|
|
107
|
-
hasError
|
|
108
|
-
|
|
109
|
-
events: result.events,
|
|
230
|
+
hasError,
|
|
231
|
+
events,
|
|
110
232
|
renderTimeMs: result.renderTimeMs,
|
|
233
|
+
...(result.output !== undefined ? { output: result.output } : {}),
|
|
111
234
|
});
|
|
112
235
|
if (!result.image) {
|
|
113
236
|
this.context.stderr.write(` ✗ ${fixture.fixtureId} (no screenshot)\n`);
|
|
114
237
|
}
|
|
115
|
-
else if (
|
|
116
|
-
|
|
238
|
+
else if (hasError) {
|
|
239
|
+
const firstError = events.find(e => e.isError);
|
|
240
|
+
const errorLine = firstError ? firstError.message.split('\n')[0].slice(0, 200) : 'unknown error';
|
|
241
|
+
this.context.stdout.write(` ⚠ ${fixture.fixtureId} (error: ${errorLine})\n`);
|
|
117
242
|
}
|
|
118
243
|
else {
|
|
119
244
|
this.context.stdout.write(` ✓ ${fixture.fixtureId}\n`);
|
|
120
245
|
}
|
|
246
|
+
// Per-fixture coverage: collect after each fixture renders.
|
|
247
|
+
if (coverage && coverage.mode === 'per-fixture' && (useV8Js || useIstanbulJs || useCss)) {
|
|
248
|
+
const page = await session.explorer.getOrOpenPage();
|
|
249
|
+
let map = {};
|
|
250
|
+
if (useIstanbulJs) {
|
|
251
|
+
const raw = await page.evaluateJs('window.__coverage__ ?? null');
|
|
252
|
+
map = validateIstanbulMap(raw, logger);
|
|
253
|
+
}
|
|
254
|
+
if (useV8Js) {
|
|
255
|
+
const v8 = await page.stopJSCoverage();
|
|
256
|
+
const v8Map = await v8EntriesToIstanbul(v8, {
|
|
257
|
+
viteServerUrl: session.serverUrl,
|
|
258
|
+
projectRoot: projectDir,
|
|
259
|
+
logger,
|
|
260
|
+
include: v8FilterInclude,
|
|
261
|
+
exclude: v8FilterExclude,
|
|
262
|
+
});
|
|
263
|
+
map = mergeIstanbul([map, v8Map]);
|
|
264
|
+
}
|
|
265
|
+
if (useCss) {
|
|
266
|
+
const css = await page.stopCSSCoverage();
|
|
267
|
+
const cssMap = cssEntriesToIstanbul(css, {
|
|
268
|
+
viteServerUrl: session.serverUrl,
|
|
269
|
+
projectRoot: projectDir,
|
|
270
|
+
logger,
|
|
271
|
+
});
|
|
272
|
+
map = mergeIstanbul([map, cssMap]);
|
|
273
|
+
}
|
|
274
|
+
perFixtureMaps.push({ fixtureId: fixture.fixtureId, map });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
// Total mode: collect once at the end. Reload-triggered snapshotting
|
|
278
|
+
// is handled inside `BrowserPage.reload()`, which preserves coverage
|
|
279
|
+
// data across our explicit reloads (e.g. `reloadOnError`,
|
|
280
|
+
// `reloadBeforeRender`). Reloads we don't trigger (e.g. Vite's
|
|
281
|
+
// "optimized dependencies changed") are not handled — for now we
|
|
282
|
+
// accept losing data from before such navigations.
|
|
283
|
+
if (coverage && coverage.mode === 'total' && (useV8Js || useIstanbulJs || useCss)) {
|
|
284
|
+
const page = await session.explorer.getOrOpenPage();
|
|
285
|
+
if (useIstanbulJs) {
|
|
286
|
+
const raw = await page.evaluateJs('window.__coverage__ ?? null');
|
|
287
|
+
totalMaps.push(validateIstanbulMap(raw, logger));
|
|
288
|
+
// Plus any pre-reload snapshots collected during the run.
|
|
289
|
+
for (const snap of page.stopIstanbulSnapshot()) {
|
|
290
|
+
totalMaps.push(validateIstanbulMap(snap, logger));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (useV8Js) {
|
|
294
|
+
const v8 = await page.stopJSCoverage();
|
|
295
|
+
totalMaps.push(await v8EntriesToIstanbul(v8, {
|
|
296
|
+
viteServerUrl: session.serverUrl,
|
|
297
|
+
projectRoot: projectDir,
|
|
298
|
+
logger,
|
|
299
|
+
include: v8FilterInclude,
|
|
300
|
+
exclude: v8FilterExclude,
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
if (useCss) {
|
|
304
|
+
const css = await page.stopCSSCoverage();
|
|
305
|
+
totalMaps.push(cssEntriesToIstanbul(css, {
|
|
306
|
+
viteServerUrl: session.serverUrl,
|
|
307
|
+
projectRoot: projectDir,
|
|
308
|
+
logger,
|
|
309
|
+
}));
|
|
310
|
+
}
|
|
121
311
|
}
|
|
122
312
|
const gitRoot = await getGitRoot(projectDir);
|
|
123
313
|
const commitMetadata = await collectGitMetadata(gitRoot);
|
|
124
314
|
const repoOrigin = await getRepoOwnerAndName(gitRoot);
|
|
315
|
+
// Write coverage output(s) BEFORE the manifest so we can reference
|
|
316
|
+
// each emitted file from the manifest by relative path.
|
|
317
|
+
let topLevelCoverage;
|
|
318
|
+
const perFixtureCoverageRef = new Map();
|
|
319
|
+
if (coverage && coverage.enabled) {
|
|
320
|
+
const coverageDir = AbsolutePath.fromAbsoluteOrRelative(coverage.outputDir, { base: targetPath });
|
|
321
|
+
const toManifestRelative = (absPath) => {
|
|
322
|
+
const rel = path.relative(targetPath.value, absPath.value).split(path.sep).join('/');
|
|
323
|
+
return rel.startsWith('.') ? rel : './' + rel;
|
|
324
|
+
};
|
|
325
|
+
if (coverage.mode === 'per-fixture') {
|
|
326
|
+
for (const { fixtureId, map } of perFixtureMaps) {
|
|
327
|
+
if (Object.keys(map).length === 0) {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
const safeId = fixtureId.replace(/[/\\:*?"<>|]/g, '_');
|
|
331
|
+
const outPath = coverageDir.join(new RelativePath(`${safeId}.coverage.json`));
|
|
332
|
+
await writeIstanbulFile(outPath, map);
|
|
333
|
+
perFixtureCoverageRef.set(fixtureId, {
|
|
334
|
+
coverageDataIstanbul: toManifestRelative(outPath),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
// Aggregated total alongside per-fixture files.
|
|
338
|
+
const merged = mergeIstanbul(perFixtureMaps.map(p => p.map));
|
|
339
|
+
if (Object.keys(merged).length > 0) {
|
|
340
|
+
const totalPath = coverageDir.join(new RelativePath('coverage-final.json'));
|
|
341
|
+
await writeIstanbulFile(totalPath, merged);
|
|
342
|
+
topLevelCoverage = { coverageDataIstanbul: toManifestRelative(totalPath) };
|
|
343
|
+
}
|
|
344
|
+
this.context.stdout.write(` Coverage: ${perFixtureCoverageRef.size} per-fixture report(s) + total in ${path.relative(projectDir.value, coverageDir.value)}/\n`);
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
const merged = mergeIstanbul(totalMaps);
|
|
348
|
+
if (Object.keys(merged).length > 0) {
|
|
349
|
+
const totalPath = coverageDir.join(new RelativePath('coverage-final.json'));
|
|
350
|
+
await writeIstanbulFile(totalPath, merged);
|
|
351
|
+
topLevelCoverage = { coverageDataIstanbul: toManifestRelative(totalPath) };
|
|
352
|
+
}
|
|
353
|
+
this.context.stdout.write(` Coverage: ${path.relative(projectDir.value, coverageDir.value)}/\n`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Attach per-fixture coverage refs to manifest entries (per-fixture mode only).
|
|
357
|
+
if (perFixtureCoverageRef.size > 0) {
|
|
358
|
+
for (const entry of fixtureEntries) {
|
|
359
|
+
const ref = perFixtureCoverageRef.get(entry.fixtureId);
|
|
360
|
+
if (ref) {
|
|
361
|
+
entry.coverage = ref;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
125
365
|
const manifest = {
|
|
126
366
|
version: 1,
|
|
127
367
|
repository: repoOrigin,
|
|
128
368
|
commit: commitMetadata,
|
|
369
|
+
coverage: topLevelCoverage,
|
|
129
370
|
fixtures: fixtureEntries,
|
|
130
371
|
};
|
|
131
|
-
|
|
372
|
+
const manifestPath = targetPath.join(new RelativePath(MANIFEST_FILENAME));
|
|
373
|
+
await writeFile(manifestPath, Buffer.from(serializeManifest(manifest)));
|
|
132
374
|
this.context.stdout.write(`\nRendered to ${targetDir}/\n`);
|
|
375
|
+
this.context.stdout.write(` Manifest: ${manifestPath}\n`);
|
|
133
376
|
this.context.stdout.write(` ${fixtureEntries.length} fixtures, ${writtenHashes.size} unique images\n`);
|
|
134
377
|
}
|
|
135
378
|
finally {
|
|
@@ -143,6 +386,40 @@ class RenderCommand extends Command {
|
|
|
143
386
|
}
|
|
144
387
|
return 0;
|
|
145
388
|
}
|
|
389
|
+
_resolveCoverage(fromConfig) {
|
|
390
|
+
// If neither CLI nor config requests coverage, do nothing.
|
|
391
|
+
const configWantsCoverage = fromConfig?.enabled ?? false;
|
|
392
|
+
const cliWantsCoverage = this.coverage || this.coverageCss || this.coverageJs !== undefined || this.coverageMode !== undefined;
|
|
393
|
+
if (!configWantsCoverage && !cliWantsCoverage) {
|
|
394
|
+
return undefined;
|
|
395
|
+
}
|
|
396
|
+
const base = fromConfig ?? new ResolvedCoverageConfig('total', 'istanbul', false, 'coverage', ['**/src/**/*.{js,ts,jsx,tsx,mjs,cjs}'], ['**/*.fixture.{js,ts,jsx,tsx}', '**/node_modules/**', '**/*.{test,spec}.{js,ts,jsx,tsx}']);
|
|
397
|
+
// Mode override
|
|
398
|
+
let mode = base.mode;
|
|
399
|
+
if (this.coverageMode !== undefined) {
|
|
400
|
+
if (this.coverageMode !== 'total' && this.coverageMode !== 'per-fixture') {
|
|
401
|
+
throw new Error(`--coverage-mode must be "total" or "per-fixture", got "${this.coverageMode}"`);
|
|
402
|
+
}
|
|
403
|
+
mode = this.coverageMode;
|
|
404
|
+
}
|
|
405
|
+
// JS strategy override
|
|
406
|
+
let js = base.js;
|
|
407
|
+
if (this.coverageJs !== undefined) {
|
|
408
|
+
if (this.coverageJs === 'off' || this.coverageJs === 'false') {
|
|
409
|
+
js = false;
|
|
410
|
+
}
|
|
411
|
+
else if (this.coverageJs === 'istanbul' || this.coverageJs === 'v8') {
|
|
412
|
+
js = this.coverageJs;
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
throw new Error(`--coverage-js must be "istanbul", "v8", or "off", got "${this.coverageJs}"`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// CSS toggle: CLI flag forces on; config decides otherwise.
|
|
419
|
+
const css = this.coverageCss || base.css;
|
|
420
|
+
const outputDir = this.coverageOutput ?? base.outputDir;
|
|
421
|
+
return new ResolvedCoverageConfig(mode, js, css, outputDir, base.include, base.exclude);
|
|
422
|
+
}
|
|
146
423
|
async _runComparison(screenshots, targetPath, compareTargetPath, projectDir) {
|
|
147
424
|
const compareStorage = new FileSystemStorage(compareTargetPath);
|
|
148
425
|
const result = await compareScreenshotsInMemory(screenshots, {
|
|
@@ -152,7 +429,7 @@ class RenderCommand extends Command {
|
|
|
152
429
|
});
|
|
153
430
|
printComparisonToConsole(result, this.context.stdout);
|
|
154
431
|
if (this.report) {
|
|
155
|
-
const reportDir =
|
|
432
|
+
const reportDir = AbsolutePath.fromAbsoluteOrRelative(this.report, { base: projectDir });
|
|
156
433
|
await writeComparisonReport({
|
|
157
434
|
reportDir,
|
|
158
435
|
result,
|
|
@@ -166,6 +443,16 @@ class RenderCommand extends Command {
|
|
|
166
443
|
return (result.added.length > 0 || result.changed.length > 0) ? 1 : 0;
|
|
167
444
|
}
|
|
168
445
|
}
|
|
446
|
+
function _globToRegExp(glob) {
|
|
447
|
+
// Escape regex metacharacters EXCEPT glob ones we'll process below: * ? { } , and /.
|
|
448
|
+
let pattern = glob.replace(/([.+^$()|[\]\\])/g, '\\$1');
|
|
449
|
+
// Brace expansion: {a,b,c} → (a|b|c)
|
|
450
|
+
pattern = pattern.replace(/\{([^{}]+)\}/g, (_, body) => '(' + body.split(',').join('|') + ')');
|
|
451
|
+
// ** → placeholder, * → [^/]*, then placeholder → .*
|
|
452
|
+
pattern = pattern.replace(/\*\*/g, '\u29eb').replace(/\*/g, '[^/]*').replace(/\u29eb/g, '.*');
|
|
453
|
+
pattern = pattern.replace(/\?/g, '.');
|
|
454
|
+
return new RegExp(pattern);
|
|
455
|
+
}
|
|
169
456
|
async function collectGitMetadata(gitRoot) {
|
|
170
457
|
const hash = (await execGit(gitRoot, ['rev-parse', 'HEAD'])).trim();
|
|
171
458
|
const logOutput = (await execGit(gitRoot, [
|
|
@@ -201,7 +488,7 @@ async function getRepoOwnerAndName(gitRoot) {
|
|
|
201
488
|
catch {
|
|
202
489
|
// no remote configured
|
|
203
490
|
}
|
|
204
|
-
return { owner: 'unknown', name: path.basename(gitRoot) };
|
|
491
|
+
return { owner: 'unknown', name: path.basename(gitRoot.value) };
|
|
205
492
|
}
|
|
206
493
|
|
|
207
494
|
export { RenderCommand };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderCommand.js","sources":["../../src/commands/renderCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAcM,MAAO,aAAc,SAAQ,OAAO,CAAA;IACzC,OAAgB,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AAEpC,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,yDAAyD;AACtE,QAAA,QAAQ,EAAE;YACT,CAAC,qBAAqB,EAAE,WAAW,CAAC;YACpC,CAAC,+BAA+B,EAAE,oBAAoB,CAAC;YACvD,CAAC,gBAAgB,EAAE,+BAA+B,CAAC;AACnD,SAAA;AACD,KAAA,CAAC;AAEO,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AAC5G,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE,CAAC;AACtG,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;AACvG,IAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,yEAAyE,EAAE,CAAC;AACtI,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,WAAW,EAAE,oEAAoE,EAAE,CAAC;AAC7I,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,qGAAqG,EAAE,CAAC;AAC3K,IAAA,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC;AACpG,IAAA,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,sGAAsG,EAAE,CAAC;AAC3L,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;AACjH,IAAA,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;AAC7G,IAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;AACrH,IAAA,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,gGAAgG,EAAE,CAAC;AAElL,IAAA,MAAM,OAAO,GAAA;;QAEZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC;AACnF,YAAA,OAAO,CAAC;QACT;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpJ,YAAY,CAAC,MAAM,CAAC;AAEpB,QAAA,MAAM,WAAW,GAAG,IAAI,eAAe,EAAE;AACzC,QAAA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;AAC9E,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS;QACnC,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM;;AAG9C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,GAAG,uBAAuB,GAAG,sBAAsB;AACpF,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,aAAa;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;;AAG5F,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,GAAG,sBAAsB,GAAG,uBAAuB;AAC3F,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,IAAI,oBAAoB;QACnE,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC;AAExH,QAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,UAAU,CAAC;AACjD,QAAA,MAAM,cAAc,GAAG,IAAI,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;AAElG,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B;AAErD,QAAA,IAAI,OAAoC;AACxC,QAAA,IAAI;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC;AACjD,YAAA,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,CAAC;AAE1F,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,kBAAA,EAAqB,OAAO,CAAC,SAAS,CAAA,EAAA,CAAI,CAAC;YAErE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE;AACxD,YAAA,IAAI,UAAU,CAAC,SAAS,EAAE;AACzB,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,gCAAA,EAAmC,UAAU,CAAC,SAAS,CAAA,EAAA,CAAI,CAAC;YACvF;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC;kBACnB,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,MAAO,CAAC;AACtE,kBAAE,UAAU,CAAC,QAAQ;AAEtB,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,MAAA,EAAS,QAAQ,CAAC,MAAM,CAAA,aAAA,CAAe,CAAC;YAElE,MAAM,cAAc,GAA+B,EAAE;AACrD,YAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU;AAEvC,YAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC/B,gBAAA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC;AAE1E,gBAAA,IAAI,SAA6B;AACjC,gBAAA,IAAI,SAA6B;AAEjC,gBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AACjB,oBAAA,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AACnE,oBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACtB,wBAAA,SAAS,GAAG,CAAA,OAAA,EAAU,SAAS,CAAA,IAAA,CAAM;wBACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;4BAClC,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;AAC5C,4BAAA,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;wBAC7B;oBACD;yBAAO;AACN,wBAAA,SAAS,GAAG,CAAA,EAAG,OAAO,CAAC,SAAS,MAAM;wBACtC,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC;oBAC7C;oBACA,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnH;gBAEA,cAAc,CAAC,IAAI,CAAC;oBACnB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,SAAS;oBACT,SAAS;oBACT,UAAU,EAAE,OAAO,CAAC,UAAU;AAC9B,oBAAA,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;AAC3B,oBAAA,0BAA0B,EAAE,CAAC,GAAG,OAAO,CAAC,0BAA0B,CAAC;oBACnE,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,YAAY,EAAE,MAAM,CAAC,YAAY;AACjC,iBAAA,CAAC;AAEF,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAClB,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,OAAO,CAAC,SAAS,CAAA,kBAAA,CAAoB,CAAC;gBACxE;AAAO,qBAAA,IAAI,MAAM,CAAC,QAAQ,EAAE;AAC3B,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,OAAO,CAAC,SAAS,CAAA,yBAAA,CAA2B,CAAC;gBAC/E;qBAAO;AACN,oBAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,IAAA,EAAO,OAAO,CAAC,SAAS,CAAA,EAAA,CAAI,CAAC;gBACxD;YACD;AAEA,YAAA,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC;AAC5C,YAAA,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC;AACxD,YAAA,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC;AAErD,YAAA,MAAM,QAAQ,GAAmB;AAChC,gBAAA,OAAO,EAAE,CAAC;AACV,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,MAAM,EAAE,cAAc;AACtB,gBAAA,QAAQ,EAAE,cAAc;aACxB;YAED,MAAM,SAAS,CACd,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EACxC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CACxC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,cAAA,EAAiB,SAAS,CAAA,GAAA,CAAK,CAAC;AAC1D,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAA,EAAK,cAAc,CAAC,MAAM,CAAA,WAAA,EAAc,aAAa,CAAC,IAAI,CAAA,gBAAA,CAAkB,CAAC;QACxG;gBAAU;AACT,YAAA,MAAM,OAAO,EAAE,OAAO,EAAE;AACxB,YAAA,MAAM,cAAc,CAAC,OAAO,EAAE;YAC9B,WAAW,CAAC,OAAO,EAAE;QACtB;AACA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,oBAAA,EAAuB,gBAAgB,CAAA,KAAA,CAAO,CAAC;AACzE,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,UAAU,CAAC;QACnF;AAEA,QAAA,OAAO,CAAC;IACT;IAEQ,MAAM,cAAc,CAC3B,WAAwC,EACxC,UAAkB,EAClB,iBAAyB,EACzB,UAAkB,EAAA;AAElB,QAAA,MAAM,cAAc,GAAG,IAAI,iBAAiB,CAAC,iBAAiB,CAAC;AAE/D,QAAA,MAAM,MAAM,GAAG,MAAM,0BAA0B,CAAC,WAAW,EAAE;AAC5D,YAAA,IAAI,EAAE,YAAY,EAAE;YACpB,IAAI,EAAE,CAAC,EAAE,KAAK,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,EAAE,CAAC,EAAE,KAAK,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;AACzC,SAAA,CAAC;QAEF,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AAErD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;AACjG,YAAA,MAAM,qBAAqB,CAAC;gBAC3B,SAAS;gBACT,MAAM;AACN,gBAAA,YAAY,EAAE,iBAAiB;AAC/B,gBAAA,WAAW,EAAE,UAAU;AACvB,gBAAA,eAAe,EAAE,CAAC,EAAE,KAAK,cAAc,CAAC,IAAI,CAAC,CAAA,EAAG,EAAE,MAAM,CAAC;AACzD,gBAAA,cAAc,EAAE,OAAO,EAAE,KAAK,WAAW,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,IAAI;AACvD,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,qBAAA,EAAwB,IAAI,CAAC,MAAM,CAAA,GAAA,CAAK,CAAC;QACpE;QAEA,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;IACtE;;AAGD,eAAe,kBAAkB,CAAC,OAAe,EAAA;AAChD,IAAA,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE;AAEnE,IAAA,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE;AACzC,QAAA,KAAK,EAAE,IAAI,EAAE,4BAA4B,EAAE,MAAM;AACjD,KAAA,CAAC,EAAE,IAAI,EAAE;AACV,IAAA,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAEnF,IAAI,YAAY,GAAa,EAAE;AAC/B,IAAA,IAAI;AACH,QAAA,MAAM,YAAY,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE;QAC7E,IAAI,YAAY,EAAE;YACjB,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAC3E;IACD;AAAE,IAAA,MAAM;;IAER;IAEA,OAAO;QACN,IAAI;QACJ,YAAY;QACZ,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE;QAChD,SAAS;AACT,QAAA,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;KAChC;AACF;AAEA,eAAe,mBAAmB,CAAC,OAAe,EAAA;AACjD,IAAA,IAAI;QACH,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE;QAClF,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,mCAAmC,CAAC;QAClE,IAAI,KAAK,EAAE;AACV,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE;QAC3C;IACD;AAAE,IAAA,MAAM;;IAER;AACA,IAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC1D;;;;"}
|
|
1
|
+
{"version":3,"file":"renderCommand.js","sources":["../../src/commands/renderCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ export declare class ServeCommand extends Command {
|
|
|
12
12
|
readonly headed: boolean;
|
|
13
13
|
readonly redirectionPort: string | undefined;
|
|
14
14
|
readonly redirectionHost: string | undefined;
|
|
15
|
+
readonly idleTimeoutMs: string;
|
|
15
16
|
execute(): Promise<void>;
|
|
16
17
|
private _killExistingAndWait;
|
|
17
18
|
private _ensureBackground;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serveCommand.d.ts","sourceRoot":"","sources":["../../src/commands/serveCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"serveCommand.d.ts","sourceRoot":"","sources":["../../src/commands/serveCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAmB5C,qBAAa,YAAa,SAAQ,OAAO;IACxC,OAAgB,KAAK,aAAe;IAEpC,OAAgB,KAAK,4BAkBlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,OAAO,qBAAgG;IAChH,QAAQ,CAAC,OAAO,SAAwI;IACxJ,QAAQ,CAAC,UAAU,UAAoG;IACvH,QAAQ,CAAC,MAAM,UAAsG;IACrH,QAAQ,CAAC,IAAI,UAAkF;IAC/F,QAAQ,CAAC,aAAa,UAAqH;IAC3I,QAAQ,CAAC,MAAM,UAAwG;IACvH,QAAQ,CAAC,eAAe,qBAA8H;IACtJ,QAAQ,CAAC,eAAe,qBAAsH;IAC9I,QAAQ,CAAC,aAAa,SAA0J;IAE1K,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA+DhB,oBAAoB;YAkBpB,iBAAiB;YA8DjB,OAAO;IAiBrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,WAAW;YAeL,YAAY;IA6D1B,OAAO,CAAC,uBAAuB;CAyB/B"}
|
|
@@ -13,11 +13,14 @@ import '../external/vscode-observables/observables/dist/observableInternal/utils
|
|
|
13
13
|
import '../external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
14
14
|
import { ConsoleLogger, verbosityToLogLevel, createLogFileOptions, logBuildInfo } from '../logger.js';
|
|
15
15
|
import { ResolvedConfig } from '../config.js';
|
|
16
|
+
import { AbsolutePath } from '../path.js';
|
|
16
17
|
import { DaemonService } from '../daemon/DaemonService.js';
|
|
17
18
|
import { startPipeServer } from '../daemon/pipeServer.js';
|
|
18
19
|
import { daemonPipeInfo } from '../daemon/pipeName.js';
|
|
19
20
|
import { tryConnect, waitForDaemon } from '../daemon/lifecycle.js';
|
|
20
|
-
import
|
|
21
|
+
import '../packages/common/dist/renderManifest.js';
|
|
22
|
+
import { buildExplorerUrl } from '../packages/common/dist/explorerUrl.js';
|
|
23
|
+
import { EXPLORER_ROUTE } from '../utils.js';
|
|
21
24
|
|
|
22
25
|
class ServeCommand extends Command {
|
|
23
26
|
static paths = [['serve']];
|
|
@@ -50,15 +53,16 @@ Without flags: starts a foreground daemon. Errors if one is already running.
|
|
|
50
53
|
headed = Option.Boolean('--headed', false, { description: 'Show the browser window (useful for debugging)' });
|
|
51
54
|
redirectionPort = Option.String('--redirectionPort', { description: 'Start an HTTP server that redirects /___explorer to the session URL' });
|
|
52
55
|
redirectionHost = Option.String('--redirectionHost', { description: 'Host to bind the redirection server to (default: localhost)' });
|
|
56
|
+
idleTimeoutMs = Option.String('--idle-timeout-ms', '0', { hidden: true, description: 'Internal: idle timeout in milliseconds before auto-shutdown (0 = no timeout)' });
|
|
53
57
|
async execute() {
|
|
58
|
+
const configPath = AbsolutePath.resolve(this.project);
|
|
54
59
|
const disposables = new DisposableStore();
|
|
55
|
-
const config = await ResolvedConfig.fromProjectPath(
|
|
60
|
+
const config = await ResolvedConfig.fromProjectPath(configPath, disposables);
|
|
56
61
|
if (!config.isFullConfig) {
|
|
57
62
|
this.context.stderr.write('Error: serve requires a component-explorer.json config file.\n');
|
|
58
63
|
disposables.dispose();
|
|
59
64
|
return;
|
|
60
65
|
}
|
|
61
|
-
const configPath = path.resolve(this.project);
|
|
62
66
|
const { pipeName, source: pipeSource } = daemonPipeInfo(configPath);
|
|
63
67
|
if (this.kill) {
|
|
64
68
|
const client = await tryConnect(pipeName, { clientName: 'cli-kill' });
|
|
@@ -128,7 +132,7 @@ Without flags: starts a foreground daemon. Errors if one is already running.
|
|
|
128
132
|
return;
|
|
129
133
|
}
|
|
130
134
|
const cliEntryPoint = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../index.js');
|
|
131
|
-
const args = [cliEntryPoint, 'serve', '--project', configPath];
|
|
135
|
+
const args = [cliEntryPoint, 'serve', '--project', configPath.value];
|
|
132
136
|
for (let i = 0; i < this.verbose; i++) {
|
|
133
137
|
args.push('-v');
|
|
134
138
|
}
|
|
@@ -138,6 +142,7 @@ Without flags: starts a foreground daemon. Errors if one is already running.
|
|
|
138
142
|
if (this.headed) {
|
|
139
143
|
args.push('--headed');
|
|
140
144
|
}
|
|
145
|
+
args.push('--idle-timeout-ms', String(5 * 60 * 1000));
|
|
141
146
|
if (this.redirectionPort) {
|
|
142
147
|
args.push('--redirectionPort', this.redirectionPort);
|
|
143
148
|
}
|
|
@@ -202,7 +207,7 @@ Without flags: starts a foreground daemon. Errors if one is already running.
|
|
|
202
207
|
this.context.stdout.write(` ${s.name}: (loading)\n`);
|
|
203
208
|
}
|
|
204
209
|
else {
|
|
205
|
-
const explorerUrl = buildExplorerUrl({ baseUrl: s.serverUrl });
|
|
210
|
+
const explorerUrl = buildExplorerUrl({ baseUrl: s.serverUrl, pathname: EXPLORER_ROUTE });
|
|
206
211
|
this.context.stdout.write(` ${s.name}: ${explorerUrl} (${s.sourceKind})\n`);
|
|
207
212
|
}
|
|
208
213
|
}
|
|
@@ -229,7 +234,7 @@ Without flags: starts a foreground daemon. Errors if one is already running.
|
|
|
229
234
|
const disposables = new DisposableStore();
|
|
230
235
|
const resolvedConfig = await ResolvedConfig.fromFile(configPath, disposables);
|
|
231
236
|
logger.log('Setting up sessions...');
|
|
232
|
-
const service = await DaemonService.create(resolvedConfig, logger, pipeName, { headed: this.headed });
|
|
237
|
+
const service = await DaemonService.create(resolvedConfig, logger, pipeName, { headed: this.headed, idleTimeoutMs: parseInt(this.idleTimeoutMs, 10) });
|
|
233
238
|
// Ensure cleanup on crashes/uncaught errors
|
|
234
239
|
let cleanedUp = false;
|
|
235
240
|
const cleanup = async () => {
|