@vscode/component-explorer-cli 0.2.1-1 → 0.2.1-100
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 +14 -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 +54 -4
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +113 -2
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts +2 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +30 -14
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/checkStabilityCommand.d.ts +3 -0
- package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
- package/dist/commands/checkStabilityCommand.js +39 -18
- package/dist/commands/checkStabilityCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts +2 -1
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +53 -25
- 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 +3 -0
- package/dist/commands/mcpCommand.d.ts.map +1 -1
- package/dist/commands/mcpCommand.js +189 -51
- package/dist/commands/mcpCommand.js.map +1 -1
- package/dist/commands/renderCommand.d.ts +28 -0
- package/dist/commands/renderCommand.d.ts.map +1 -0
- package/dist/commands/renderCommand.js +495 -0
- package/dist/commands/renderCommand.js.map +1 -0
- package/dist/commands/serveCommand.d.ts +2 -0
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +85 -44
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.d.ts +16 -0
- package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -0
- package/dist/commands/serviceDiffCommitsCommand.js +230 -0
- package/dist/commands/serviceDiffCommitsCommand.js.map +1 -0
- package/dist/commands/watchCommand.d.ts +2 -0
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +47 -41
- 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 +122 -20
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +250 -78
- package/dist/componentExplorer.js.map +1 -1
- package/dist/{watchConfig.d.ts → config.d.ts} +59 -26
- package/dist/config.d.ts.map +1 -0
- package/dist/{watchConfig.js → config.js} +108 -31
- package/dist/config.js.map +1 -0
- 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 +17 -8
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +64 -57
- 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/client.d.ts +5 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +7 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/inProcessClient.d.ts +11 -0
- package/dist/daemon/inProcessClient.d.ts.map +1 -0
- package/dist/daemon/inProcessClient.js +35 -0
- package/dist/daemon/inProcessClient.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +8 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +13 -3
- 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 +29 -9
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/pipeName.d.ts +7 -1
- package/dist/daemon/pipeName.d.ts.map +1 -1
- package/dist/daemon/pipeName.js +8 -4
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.d.ts.map +1 -1
- package/dist/daemon/pipeServer.js +10 -4
- package/dist/daemon/pipeServer.js.map +1 -1
- package/dist/daemon/version.d.ts +2 -2
- package/dist/daemon/version.d.ts.map +1 -1
- package/dist/daemon/version.js +2 -2
- package/dist/dependencyInstaller.d.ts +3 -2
- package/dist/dependencyInstaller.d.ts.map +1 -1
- package/dist/dependencyInstaller.js +4 -4
- package/dist/dependencyInstaller.js.map +1 -1
- package/dist/evaluateFn.d.ts +21 -0
- package/dist/evaluateFn.d.ts.map +1 -0
- package/dist/evaluateFn.js +17 -0
- package/dist/evaluateFn.js.map +1 -0
- 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/git/gitCommitResolver.d.ts +2 -1
- package/dist/git/gitCommitResolver.d.ts.map +1 -1
- package/dist/git/gitCommitResolver.js +8 -8
- 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 +7 -7
- 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 -4
- package/dist/git/gitUtils.d.ts.map +1 -1
- package/dist/git/gitUtils.js +10 -5
- 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 +21 -3
- package/dist/index.js.map +1 -1
- package/dist/js-component-explorer/packages/common/dist/explorerUrl.js +21 -0
- package/dist/js-component-explorer/packages/common/dist/explorerUrl.js.map +1 -0
- package/dist/js-component-explorer/packages/common/dist/renderManifest.js +68 -0
- package/dist/js-component-explorer/packages/common/dist/renderManifest.js.map +1 -0
- package/dist/js-component-explorer/packages/semver/dist/index.js +186 -0
- package/dist/js-component-explorer/packages/semver/dist/index.js.map +1 -0
- package/dist/{packages/simple-api/dist/chunk-3R7GHWBM.js → js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js} +2 -1
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +1 -0
- package/dist/{packages/simple-api/dist/chunk-SGBCNXYH.js → js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js} +4 -1
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js.map +1 -0
- package/dist/{packages/simple-api/dist/chunk-TAEFVNPN.js → js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js} +2 -1
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js.map +1 -0
- package/dist/{packages → js-component-explorer/packages}/simple-api/dist/express.js +1 -1
- package/dist/js-component-explorer/packages/simple-api/dist/express.js.map +1 -0
- package/dist/logger.d.ts +12 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +35 -2
- package/dist/logger.js.map +1 -1
- package/dist/manifest.schema.json +215 -0
- 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 +391 -304
- package/dist/mcp/McpServer.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/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/screenshotServiceClient.d.ts +31 -0
- package/dist/screenshotServiceClient.d.ts.map +1 -0
- package/dist/screenshotServiceClient.js +38 -0
- package/dist/screenshotServiceClient.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 +110 -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 +59 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +53 -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 +31 -0
- package/dist/server/viteServer.d.ts.map +1 -0
- package/dist/{httpServer.js → server/viteServer.js} +96 -115
- package/dist/server/viteServer.js.map +1 -0
- 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 -25
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -23
- 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/dist/vscode-observables/observables/dist/disposables.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/base.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/debugName.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/index.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -0
- package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +1 -1
- package/dist/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -0
- package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js → vscode-observables/observables/dist/observableInternal/reactions/createEffect.js} +9 -5
- package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffect.js.map +1 -0
- package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js → vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js} +1 -1
- package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/transaction.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +1 -0
- package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utilsCancellation.js +2 -2
- package/dist/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +1 -0
- package/package.json +34 -22
- package/dist/commands/screenshotCommand.d.ts +0 -18
- package/dist/commands/screenshotCommand.d.ts.map +0 -1
- package/dist/commands/screenshotCommand.js +0 -127
- package/dist/commands/screenshotCommand.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/disposables.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/base.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.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/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
- package/dist/packages/simple-api/dist/express.js.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
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/disposables.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/base.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/commonFacade/deps.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugLocation.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugName.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/index.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/consoleObservableLogger.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/logging.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/baseObservable.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derived.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derivedImpl.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableFromEvent.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableValue.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/transaction.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utils.js +0 -0
package/dist/coverage.js
ADDED
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import libCoverage from 'istanbul-lib-coverage';
|
|
5
|
+
import v8ToIstanbul from 'v8-to-istanbul';
|
|
6
|
+
|
|
7
|
+
const { createCoverageMap } = libCoverage;
|
|
8
|
+
/**
|
|
9
|
+
* Reads `window.__coverage__` produced by vite-plugin-istanbul and validates
|
|
10
|
+
* it has the Istanbul shape. Returns an empty map if the global is not present.
|
|
11
|
+
*/
|
|
12
|
+
function validateIstanbulMap(raw, logger) {
|
|
13
|
+
if (!raw || typeof raw !== 'object') {
|
|
14
|
+
logger.debug('No __coverage__ global found on the page (or not an object)');
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const map = raw;
|
|
18
|
+
const out = {};
|
|
19
|
+
for (const [, value] of Object.entries(map)) {
|
|
20
|
+
if (!value || typeof value !== 'object') {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const v = value;
|
|
24
|
+
if (typeof v.path !== 'string' || !v.statementMap || !v.s) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
// Normalize the path to OS-native absolute (e.g. `D:/foo` → `D:\foo` on Windows).
|
|
28
|
+
const absPath = path.resolve(v.path);
|
|
29
|
+
out[absPath] = { ...v, path: absPath };
|
|
30
|
+
}
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Convert raw V8 JS coverage entries (from Playwright) into an Istanbul-shaped
|
|
35
|
+
* coverage map. Entries without source content or with non-resolvable URLs
|
|
36
|
+
* are skipped.
|
|
37
|
+
*/
|
|
38
|
+
async function v8EntriesToIstanbul(entries, options) {
|
|
39
|
+
const { viteServerUrl, projectRoot, logger } = options;
|
|
40
|
+
const map = createCoverageMap({});
|
|
41
|
+
const baseUrl = viteServerUrl.endsWith('/') ? viteServerUrl.slice(0, -1) : viteServerUrl;
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
if (!entry.source) {
|
|
44
|
+
logger.trace(`v8: skipping ${entry.url} (no source)`);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const filePath = _v8UrlToFsPath(entry.url, baseUrl, projectRoot.value);
|
|
48
|
+
if (!filePath) {
|
|
49
|
+
logger.trace(`v8: skipping ${entry.url} (cannot resolve to fs path)`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (options.exclude?.some(re => re.test(filePath))) {
|
|
53
|
+
logger.trace(`v8: excluded ${filePath}`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (options.include && !options.include.some(re => re.test(filePath))) {
|
|
57
|
+
logger.trace(`v8: not included ${filePath}`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const converter = v8ToIstanbul(filePath, 0, { source: entry.source });
|
|
62
|
+
await converter.load();
|
|
63
|
+
converter.applyCoverage(entry.functions);
|
|
64
|
+
const istanbul = converter.toIstanbul();
|
|
65
|
+
for (const fileCoverage of Object.values(istanbul)) {
|
|
66
|
+
map.merge({ [fileCoverage.path]: fileCoverage });
|
|
67
|
+
}
|
|
68
|
+
converter.destroy();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
logger.debug(`v8: failed to convert ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return JSON.parse(JSON.stringify(map.toJSON()));
|
|
75
|
+
}
|
|
76
|
+
/** Merge multiple Istanbul coverage maps into one (file/statement/branch hit counts summed). */
|
|
77
|
+
function mergeIstanbul(maps) {
|
|
78
|
+
const merged = createCoverageMap({});
|
|
79
|
+
for (const m of maps) {
|
|
80
|
+
merged.merge(m);
|
|
81
|
+
}
|
|
82
|
+
return JSON.parse(JSON.stringify(merged.toJSON()));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert raw Playwright CSS coverage entries into an Istanbul-shaped coverage
|
|
86
|
+
* map by treating each non-blank line as a statement. A line is considered
|
|
87
|
+
* "hit" if any covered byte-range overlaps with the line's character range.
|
|
88
|
+
*
|
|
89
|
+
* This lets CSS files appear in the same `coverage-final.json` as JS sources,
|
|
90
|
+
* so any tool that consumes Istanbul coverage (nyc, the coverage viewer, etc.)
|
|
91
|
+
* renders CSS as if it were source code.
|
|
92
|
+
*/
|
|
93
|
+
function cssEntriesToIstanbul(entries, options) {
|
|
94
|
+
const { viteServerUrl, projectRoot, logger } = options;
|
|
95
|
+
const baseUrl = viteServerUrl.endsWith('/') ? viteServerUrl.slice(0, -1) : viteServerUrl;
|
|
96
|
+
const out = {};
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
if (!entry.text) {
|
|
99
|
+
logger.trace(`css: skipping ${entry.url} (no text)`);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const filePath = _v8UrlToFsPath(entry.url, baseUrl, projectRoot.value);
|
|
103
|
+
if (!filePath) {
|
|
104
|
+
logger.trace(`css: skipping ${entry.url} (cannot resolve to fs path)`);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (options.exclude?.some(re => re.test(filePath))) {
|
|
108
|
+
logger.trace(`css: excluded ${filePath}`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (options.include && !options.include.some(re => re.test(filePath))) {
|
|
112
|
+
logger.trace(`css: not included ${filePath}`);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const lines = entry.text.split('\n');
|
|
116
|
+
const statementMap = {};
|
|
117
|
+
const s = {};
|
|
118
|
+
let offset = 0;
|
|
119
|
+
let nextId = 0;
|
|
120
|
+
for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {
|
|
121
|
+
const line = lines[lineIdx];
|
|
122
|
+
const lineStart = offset;
|
|
123
|
+
const lineEnd = offset + line.length;
|
|
124
|
+
offset = lineEnd + 1; // account for the '\n' that split() consumed
|
|
125
|
+
if (line.trim() === '') {
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
const id = String(nextId++);
|
|
129
|
+
statementMap[id] = {
|
|
130
|
+
start: { line: lineIdx + 1, column: 0 },
|
|
131
|
+
end: { line: lineIdx + 1, column: line.length },
|
|
132
|
+
};
|
|
133
|
+
const hit = entry.ranges.some(r => r.start < lineEnd && r.end > lineStart);
|
|
134
|
+
s[id] = hit ? 1 : 0;
|
|
135
|
+
}
|
|
136
|
+
// If we've already seen this file (e.g. multiple stylesheet records for
|
|
137
|
+
// the same URL — happens when a reload re-loads the same .css), merge
|
|
138
|
+
// hit counts: a line is covered if it was hit in any record. We assume
|
|
139
|
+
// the text is identical across records of the same URL; if it differs
|
|
140
|
+
// (post-reload edit), the first record's text wins.
|
|
141
|
+
const existing = out[filePath];
|
|
142
|
+
if (existing) {
|
|
143
|
+
for (const id of Object.keys(existing.s)) {
|
|
144
|
+
if (s[id] && s[id] > 0) {
|
|
145
|
+
existing.s[id] = (existing.s[id] ?? 0) + s[id];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
out[filePath] = {
|
|
151
|
+
path: filePath,
|
|
152
|
+
statementMap,
|
|
153
|
+
fnMap: {},
|
|
154
|
+
branchMap: {},
|
|
155
|
+
s,
|
|
156
|
+
f: {},
|
|
157
|
+
b: {},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return out;
|
|
161
|
+
}
|
|
162
|
+
/** Write a bare Istanbul coverage map (`coverage-final.json` format) to disk. */
|
|
163
|
+
async function writeIstanbulFile(filePath, map) {
|
|
164
|
+
await fs.mkdir(path.dirname(filePath.value), { recursive: true });
|
|
165
|
+
await fs.writeFile(filePath.value, JSON.stringify(map, null, 2) + '\n', 'utf-8');
|
|
166
|
+
}
|
|
167
|
+
function _v8UrlToFsPath(url, viteServerBase, projectRoot) {
|
|
168
|
+
// file:// urls are direct
|
|
169
|
+
if (url.startsWith('file://')) {
|
|
170
|
+
try {
|
|
171
|
+
return path.resolve(fileURLToPath(url));
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return undefined;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
let urlPath;
|
|
178
|
+
if (url.startsWith(viteServerBase)) {
|
|
179
|
+
const tail = url.slice(viteServerBase.length).split('?')[0].split('#')[0];
|
|
180
|
+
urlPath = tail.startsWith('/') ? tail : `/${tail}`;
|
|
181
|
+
}
|
|
182
|
+
else if (url.startsWith('/') && !url.startsWith('//')) {
|
|
183
|
+
// Root-relative URLs (e.g. `/src/foo.css`) — produced by sourceURL
|
|
184
|
+
// annotations on inline stylesheets, or stripped from a server URL.
|
|
185
|
+
urlPath = url.split('?')[0].split('#')[0];
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// External URLs (CDN, etc.) — skip
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
// `/@fs/<abs>` is Vite's escape hatch for files outside the project root,
|
|
192
|
+
// where `<abs>` is already an absolute disk path (POSIX-encoded on Windows).
|
|
193
|
+
const fsMatch = /^\/@fs\/(.+)$/.exec(urlPath);
|
|
194
|
+
if (fsMatch) {
|
|
195
|
+
return path.resolve(decodeURIComponent(fsMatch[1]));
|
|
196
|
+
}
|
|
197
|
+
// Strip Vite-internal prefixes that aren't real files.
|
|
198
|
+
if (urlPath.startsWith('/@id/') || urlPath.startsWith('/@vite/') || urlPath.startsWith('/@react-refresh')) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
// Skip the explorer's own virtual HTML route (carries an inline <style>
|
|
202
|
+
// with the page reset rules — not a source file we want to cover).
|
|
203
|
+
if (urlPath === '/___explorer' || urlPath.startsWith('/___explorer.')) {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
// Resolve against the project root. We use posix join then resolve to get a
|
|
207
|
+
// canonical OS-native absolute path (e.g. on Windows: D:\proj\src\foo.css).
|
|
208
|
+
return path.resolve(projectRoot, urlPath.replace(/^\/+/, ''));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export { cssEntriesToIstanbul, mergeIstanbul, v8EntriesToIstanbul, validateIstanbulMap, writeIstanbulFile };
|
|
212
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sources":["../src/coverage.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type IDisposable, type IReader } from '@vscode/observables';
|
|
2
2
|
import { AsyncStream } from '@hediet/simple-api';
|
|
3
3
|
import { ExplorerSession } from '../explorerSession.js';
|
|
4
|
-
import type
|
|
4
|
+
import { type ResolvedConfig } from '../config.js';
|
|
5
5
|
import { type ILogger } from '../logger.js';
|
|
6
6
|
import { type ApprovalStore } from './approvalStore.js';
|
|
7
7
|
import { VisualCache } from '../visualCache.js';
|
|
@@ -64,7 +64,6 @@ export declare class DaemonService {
|
|
|
64
64
|
private readonly _pipeName;
|
|
65
65
|
private readonly _logger;
|
|
66
66
|
private readonly _browserFactory;
|
|
67
|
-
private readonly _serverFactory;
|
|
68
67
|
private readonly _sessions;
|
|
69
68
|
private readonly _sessionConfigs;
|
|
70
69
|
private readonly _dynamicSessionMeta;
|
|
@@ -91,6 +90,9 @@ export declare class DaemonService {
|
|
|
91
90
|
sessionName: string;
|
|
92
91
|
includeImage?: boolean | undefined;
|
|
93
92
|
stabilityCheck?: boolean | undefined;
|
|
93
|
+
reloadBeforeRender?: boolean | undefined;
|
|
94
|
+
input?: unknown;
|
|
95
|
+
disposeAfter?: boolean | undefined;
|
|
94
96
|
}, {
|
|
95
97
|
hash: string;
|
|
96
98
|
sourceTreeId: string;
|
|
@@ -98,13 +100,15 @@ export declare class DaemonService {
|
|
|
98
100
|
hasError: boolean;
|
|
99
101
|
error: import("../componentExplorer.js").ExceptionError | undefined;
|
|
100
102
|
events: import("../componentExplorer.js").RenderEvent[] | undefined;
|
|
101
|
-
|
|
103
|
+
output: unknown;
|
|
102
104
|
isStable: boolean;
|
|
103
105
|
stabilityScreenshots: {
|
|
104
106
|
hash: string;
|
|
105
107
|
delayMs: number;
|
|
106
108
|
image: string | undefined;
|
|
107
109
|
}[];
|
|
110
|
+
previousDispose: import("../componentExplorer.js").DisposeReport | undefined;
|
|
111
|
+
currentDispose: import("../componentExplorer.js").DisposeReport | undefined;
|
|
108
112
|
} | {
|
|
109
113
|
hash: string | undefined;
|
|
110
114
|
sourceTreeId: string;
|
|
@@ -112,7 +116,9 @@ export declare class DaemonService {
|
|
|
112
116
|
hasError: boolean;
|
|
113
117
|
error: import("../componentExplorer.js").ExceptionError | undefined;
|
|
114
118
|
events: import("../componentExplorer.js").RenderEvent[] | undefined;
|
|
115
|
-
|
|
119
|
+
output: unknown;
|
|
120
|
+
previousDispose: import("../componentExplorer.js").DisposeReport | undefined;
|
|
121
|
+
currentDispose: import("../componentExplorer.js").DisposeReport | undefined;
|
|
116
122
|
isStable?: undefined;
|
|
117
123
|
stabilityScreenshots?: undefined;
|
|
118
124
|
}, DaemonContext>;
|
|
@@ -121,6 +127,8 @@ export declare class DaemonService {
|
|
|
121
127
|
sourceTreeId: string;
|
|
122
128
|
sessionName: string;
|
|
123
129
|
includeImages?: boolean | undefined;
|
|
130
|
+
reloadBetweenFixtures?: boolean | undefined;
|
|
131
|
+
input?: unknown;
|
|
124
132
|
}, {
|
|
125
133
|
sourceTreeId: string;
|
|
126
134
|
screenshots: {
|
|
@@ -130,7 +138,7 @@ export declare class DaemonService {
|
|
|
130
138
|
hasError: boolean;
|
|
131
139
|
error: import("../componentExplorer.js").ExceptionError | undefined;
|
|
132
140
|
events: import("../componentExplorer.js").RenderEvent[] | undefined;
|
|
133
|
-
|
|
141
|
+
output: unknown;
|
|
134
142
|
}[];
|
|
135
143
|
}, DaemonContext>;
|
|
136
144
|
compare: import("@hediet/simple-api").IMethod<{
|
|
@@ -149,11 +157,11 @@ export declare class DaemonService {
|
|
|
149
157
|
baselineHasError: boolean;
|
|
150
158
|
baselineError: import("../componentExplorer.js").ExceptionError | undefined;
|
|
151
159
|
baselineEvents: import("../componentExplorer.js").RenderEvent[] | undefined;
|
|
152
|
-
|
|
160
|
+
baselineOutput: unknown;
|
|
153
161
|
currentHasError: boolean;
|
|
154
162
|
currentError: import("../componentExplorer.js").ExceptionError | undefined;
|
|
155
163
|
currentEvents: import("../componentExplorer.js").RenderEvent[] | undefined;
|
|
156
|
-
|
|
164
|
+
currentOutput: unknown;
|
|
157
165
|
labels: readonly string[] | undefined;
|
|
158
166
|
labelsBefore: readonly string[] | undefined;
|
|
159
167
|
approval: import("./approvalStore.js").ApprovalInfo | undefined;
|
|
@@ -241,7 +249,7 @@ export declare class DaemonService {
|
|
|
241
249
|
shutdown: import("@hediet/simple-api").IMethod<Record<string, never>, void, DaemonContext>;
|
|
242
250
|
}>, DaemonContext>;
|
|
243
251
|
private constructor();
|
|
244
|
-
static create(config:
|
|
252
|
+
static create(config: ResolvedConfig, logger: ILogger, pipeName?: string, options?: {
|
|
245
253
|
idleTimeoutMs?: number;
|
|
246
254
|
headed?: boolean;
|
|
247
255
|
}): Promise<DaemonService>;
|
|
@@ -264,6 +272,7 @@ export declare class DaemonService {
|
|
|
264
272
|
dispose(): Promise<void>;
|
|
265
273
|
private _emit;
|
|
266
274
|
private _restartSession;
|
|
275
|
+
private _serverContext;
|
|
267
276
|
private _createExplorerSession;
|
|
268
277
|
private _createWorktreeExplorerSession;
|
|
269
278
|
private _setupSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DaemonService.d.ts","sourceRoot":"","sources":["../../src/daemon/DaemonService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DaemonService.d.ts","sourceRoot":"","sources":["../../src/daemon/DaemonService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import
|
|
3
|
-
import '../
|
|
4
|
-
import
|
|
5
|
-
import '../
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import '../
|
|
10
|
-
import '../
|
|
11
|
-
import {
|
|
12
|
-
import { AsyncStream } from '../packages/simple-api/dist/chunk-SGBCNXYH.js';
|
|
2
|
+
import '../vscode-observables/observables/dist/observableInternal/index.js';
|
|
3
|
+
import { observableValue } from '../vscode-observables/observables/dist/observableInternal/observables/observableValue.js';
|
|
4
|
+
import '../vscode-observables/observables/dist/observableInternal/debugLocation.js';
|
|
5
|
+
import { autorun } from '../vscode-observables/observables/dist/observableInternal/reactions/createEffect.js';
|
|
6
|
+
import { derived } from '../vscode-observables/observables/dist/observableInternal/observables/derived.js';
|
|
7
|
+
import { waitForState } from '../vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js';
|
|
8
|
+
import '../vscode-observables/observables/dist/observableInternal/utils/utils.js';
|
|
9
|
+
import '../vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
10
|
+
import { createApiFactory } from '../js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js';
|
|
11
|
+
import { AsyncStream } from '../js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js';
|
|
13
12
|
import { ExplorerSession } from '../explorerSession.js';
|
|
13
|
+
import '../config.js';
|
|
14
|
+
import { RelativePath } from '../path.js';
|
|
14
15
|
import { GitIndexResolver } from '../git/gitIndexResolver.js';
|
|
15
16
|
import { DirtyWorktreeError } from '../git/gitWorktreeManager.js';
|
|
16
17
|
import { execGit } from '../git/gitUtils.js';
|
|
17
18
|
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
18
|
-
import { DefaultComponentExplorerHttpServerFactory } from '../httpServer.js';
|
|
19
19
|
import { installDependencies } from '../dependencyInstaller.js';
|
|
20
20
|
import { FileApprovalStore } from './approvalStore.js';
|
|
21
21
|
import { VisualCache } from '../visualCache.js';
|
|
22
22
|
import { contentHash } from '../screenshotCache.js';
|
|
23
23
|
import { WorktreePool } from '../WorktreePool.js';
|
|
24
|
-
import { ViteProjectRef } from '../viteProjectRef.js';
|
|
25
24
|
import { pluginProtocolVersionText, daemonApiVersionText } from './version.js';
|
|
26
25
|
export { isCompatibleVersion, parseVersion } from './version.js';
|
|
26
|
+
import { ViteServerConfig } from '../server/serverConfig.js';
|
|
27
27
|
|
|
28
28
|
// ---------------------------------------------------------------------------
|
|
29
29
|
// ActivityTracker — monitors idle time and triggers shutdown
|
|
@@ -96,7 +96,6 @@ class DaemonService {
|
|
|
96
96
|
_pipeName;
|
|
97
97
|
_logger;
|
|
98
98
|
_browserFactory;
|
|
99
|
-
_serverFactory;
|
|
100
99
|
_sessions = new Map();
|
|
101
100
|
_sessionConfigs = new Map();
|
|
102
101
|
_dynamicSessionMeta = new Map();
|
|
@@ -110,14 +109,13 @@ class DaemonService {
|
|
|
110
109
|
approvals;
|
|
111
110
|
visualCache;
|
|
112
111
|
api;
|
|
113
|
-
constructor(_config, _pipeName, _logger, _browserFactory,
|
|
112
|
+
constructor(_config, _pipeName, _logger, _browserFactory, approvalStorePath, idleTimeoutMs) {
|
|
114
113
|
this._config = _config;
|
|
115
114
|
this._pipeName = _pipeName;
|
|
116
115
|
this._logger = _logger;
|
|
117
116
|
this._browserFactory = _browserFactory;
|
|
118
|
-
this._serverFactory = _serverFactory;
|
|
119
117
|
this.approvals = new FileApprovalStore(approvalStorePath);
|
|
120
|
-
this.visualCache = new VisualCache(
|
|
118
|
+
this.visualCache = new VisualCache(_config.screenshotDir.join(new RelativePath('visual-cache.json')));
|
|
121
119
|
this._activityTracker = new ActivityTracker(idleTimeoutMs, () => this.requestShutdown(), this._logger);
|
|
122
120
|
if (_config.worktreePool) {
|
|
123
121
|
this._worktreePool = new WorktreePool(_config.worktreePool.maxSlots, _config.repo.worktreeRootPath());
|
|
@@ -126,10 +124,9 @@ class DaemonService {
|
|
|
126
124
|
}
|
|
127
125
|
static async create(config, logger, pipeName, options) {
|
|
128
126
|
const browserFactory = new PlaywrightBrowserPageFactory(options?.headed ?? false, 30_000, logger);
|
|
129
|
-
const
|
|
130
|
-
const approvalStorePath = `${config.screenshotDir}/approvals.json`;
|
|
127
|
+
const approvalStorePath = config.screenshotDir.join(new RelativePath('approvals.json'));
|
|
131
128
|
const idleTimeoutMs = options?.idleTimeoutMs ?? 5 * 60 * 1000; // 5 minutes default
|
|
132
|
-
const svc = new DaemonService(config, pipeName
|
|
129
|
+
const svc = new DaemonService(config, pipeName, logger, browserFactory, approvalStorePath, idleTimeoutMs);
|
|
133
130
|
for (const sessionConfig of config.sessions) {
|
|
134
131
|
svc._sessionConfigs.set(sessionConfig.name, sessionConfig);
|
|
135
132
|
await svc._setupSession(sessionConfig);
|
|
@@ -163,13 +160,20 @@ class DaemonService {
|
|
|
163
160
|
sessionName: z.string(),
|
|
164
161
|
includeImage: z.boolean().optional(),
|
|
165
162
|
stabilityCheck: z.boolean().optional(),
|
|
163
|
+
reloadBeforeRender: z.boolean().optional(),
|
|
164
|
+
input: z.unknown().optional(),
|
|
165
|
+
disposeAfter: z.boolean().optional(),
|
|
166
166
|
},
|
|
167
167
|
}, async (args) => {
|
|
168
168
|
this._activityTracker.reportActivity();
|
|
169
169
|
const session = this.getSession(args.sessionName);
|
|
170
170
|
this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
|
|
171
171
|
if (args.stabilityCheck) {
|
|
172
|
-
const result = await session.explorer.screenshotFixtureStabilityCheck(args.fixtureId
|
|
172
|
+
const result = await session.explorer.screenshotFixtureStabilityCheck(args.fixtureId, {
|
|
173
|
+
reloadBeforeRender: args.reloadBeforeRender,
|
|
174
|
+
input: args.input,
|
|
175
|
+
disposeAfter: args.disposeAfter,
|
|
176
|
+
});
|
|
173
177
|
this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
|
|
174
178
|
const hashes = result.screenshots.map(s => contentHash(s.image));
|
|
175
179
|
const isStable = hashes[0] === hashes[1] && hashes[1] === hashes[2];
|
|
@@ -189,12 +193,18 @@ class DaemonService {
|
|
|
189
193
|
hasError: result.hasError,
|
|
190
194
|
error: result.error,
|
|
191
195
|
events: result.events.length > 0 ? result.events : undefined,
|
|
192
|
-
|
|
196
|
+
output: result.output,
|
|
193
197
|
isStable,
|
|
194
198
|
stabilityScreenshots,
|
|
199
|
+
previousDispose: result.previousDispose,
|
|
200
|
+
currentDispose: result.currentDispose,
|
|
195
201
|
};
|
|
196
202
|
}
|
|
197
|
-
const result = await session.explorer.screenshotFixture(args.fixtureId
|
|
203
|
+
const result = await session.explorer.screenshotFixture(args.fixtureId, {
|
|
204
|
+
reloadBeforeRender: args.reloadBeforeRender,
|
|
205
|
+
input: args.input,
|
|
206
|
+
disposeAfter: args.disposeAfter,
|
|
207
|
+
});
|
|
198
208
|
this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
|
|
199
209
|
return {
|
|
200
210
|
hash: result.image ? contentHash(result.image) : undefined,
|
|
@@ -205,7 +215,9 @@ class DaemonService {
|
|
|
205
215
|
hasError: result.hasError,
|
|
206
216
|
error: result.error,
|
|
207
217
|
events: result.events?.length > 0 ? result.events : undefined,
|
|
208
|
-
|
|
218
|
+
output: result.output,
|
|
219
|
+
previousDispose: result.previousDispose,
|
|
220
|
+
currentDispose: result.currentDispose,
|
|
209
221
|
};
|
|
210
222
|
}),
|
|
211
223
|
takeBatch: createMethod({
|
|
@@ -214,6 +226,8 @@ class DaemonService {
|
|
|
214
226
|
sourceTreeId: z.string(),
|
|
215
227
|
sessionName: z.string(),
|
|
216
228
|
includeImages: z.boolean().optional(),
|
|
229
|
+
reloadBetweenFixtures: z.boolean().optional(),
|
|
230
|
+
input: z.unknown().optional(),
|
|
217
231
|
},
|
|
218
232
|
}, async (args) => {
|
|
219
233
|
this._activityTracker.reportActivity();
|
|
@@ -223,8 +237,14 @@ class DaemonService {
|
|
|
223
237
|
this._logger.trace(`takeBatch: ${args.fixtureIds.length} fixtures, session=${args.sessionName}`);
|
|
224
238
|
const startTime = Date.now();
|
|
225
239
|
const screenshots = [];
|
|
226
|
-
for (
|
|
227
|
-
const
|
|
240
|
+
for (let i = 0; i < args.fixtureIds.length; i++) {
|
|
241
|
+
const fixtureId = args.fixtureIds[i];
|
|
242
|
+
const result = await session.explorer.screenshotFixture(fixtureId, {
|
|
243
|
+
reloadOnError: true,
|
|
244
|
+
// Reload between fixtures (skip before the first one — the page is already fresh)
|
|
245
|
+
reloadBeforeRender: args.reloadBetweenFixtures && i > 0,
|
|
246
|
+
input: args.input,
|
|
247
|
+
});
|
|
228
248
|
this.assertSourceTreeId(args.sessionName, args.sourceTreeId);
|
|
229
249
|
screenshots.push({
|
|
230
250
|
fixtureId,
|
|
@@ -235,7 +255,7 @@ class DaemonService {
|
|
|
235
255
|
hasError: result.hasError,
|
|
236
256
|
error: result.error,
|
|
237
257
|
events: result.events.length > 0 ? result.events : undefined,
|
|
238
|
-
|
|
258
|
+
output: result.output,
|
|
239
259
|
});
|
|
240
260
|
}
|
|
241
261
|
this._logger.trace(`takeBatch: done in ${Date.now() - startTime}ms`);
|
|
@@ -284,11 +304,11 @@ class DaemonService {
|
|
|
284
304
|
baselineHasError: baselineResult.hasError,
|
|
285
305
|
baselineError: baselineResult.error,
|
|
286
306
|
baselineEvents: baselineResult.events.length > 0 ? baselineResult.events : undefined,
|
|
287
|
-
|
|
307
|
+
baselineOutput: baselineResult.output,
|
|
288
308
|
currentHasError: currentResult.hasError,
|
|
289
309
|
currentError: currentResult.error,
|
|
290
310
|
currentEvents: currentResult.events.length > 0 ? currentResult.events : undefined,
|
|
291
|
-
|
|
311
|
+
currentOutput: currentResult.output,
|
|
292
312
|
labels,
|
|
293
313
|
labelsBefore: labelsChanged ? baselineFixture.labels : undefined,
|
|
294
314
|
approval: (baselineHash !== undefined && currentHash !== undefined && baselineHash !== currentHash)
|
|
@@ -470,7 +490,7 @@ class DaemonService {
|
|
|
470
490
|
sourceKind: 'worktree',
|
|
471
491
|
serverUrl: session.serverUrl,
|
|
472
492
|
sourceTreeId: reader ? session.sourceTreeId.read(reader).value : session.sourceTreeId.get().value,
|
|
473
|
-
worktreePath: meta.worktreePath,
|
|
493
|
+
worktreePath: meta.worktreePath.value,
|
|
474
494
|
ref: meta.ref,
|
|
475
495
|
});
|
|
476
496
|
}
|
|
@@ -498,7 +518,7 @@ class DaemonService {
|
|
|
498
518
|
sourceKind: 'worktree',
|
|
499
519
|
serverUrl: session.serverUrl,
|
|
500
520
|
sourceTreeId: reader ? session.sourceTreeId.read(reader).value : session.sourceTreeId.get().value,
|
|
501
|
-
worktreePath: meta.worktreePath,
|
|
521
|
+
worktreePath: meta.worktreePath.value,
|
|
502
522
|
ref: meta.ref,
|
|
503
523
|
});
|
|
504
524
|
}
|
|
@@ -707,43 +727,30 @@ class DaemonService {
|
|
|
707
727
|
await this._createExplorerSession(config);
|
|
708
728
|
}
|
|
709
729
|
}
|
|
710
|
-
|
|
711
|
-
|
|
730
|
+
_serverContext(sessionName) {
|
|
731
|
+
return {
|
|
712
732
|
logger: this._logger,
|
|
713
|
-
daemonConfig: {
|
|
733
|
+
daemonConfig: this._pipeName ? {
|
|
714
734
|
pipeName: this._pipeName,
|
|
715
|
-
sessionName
|
|
735
|
+
sessionName,
|
|
716
736
|
daemonApiVersion: daemonApiVersionText,
|
|
717
737
|
pluginProtocolVersion: pluginProtocolVersionText,
|
|
718
|
-
},
|
|
719
|
-
}
|
|
738
|
+
} : undefined,
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
async _createExplorerSession(sessionConfig) {
|
|
742
|
+
const session = await ExplorerSession.create(sessionConfig.name, sessionConfig.server, this._browserFactory, this._serverContext(sessionConfig.name));
|
|
720
743
|
this._sessions.set(sessionConfig.name, session);
|
|
721
744
|
this._logger.debug(`Session ready: ${sessionConfig.name} (${session.serverUrl})`);
|
|
722
745
|
}
|
|
723
746
|
async _createWorktreeExplorerSession(sessionName, worktreePath) {
|
|
724
747
|
const defaultServer = this._config.defaultServerConfig;
|
|
725
|
-
if (defaultServer
|
|
748
|
+
if (!(defaultServer instanceof ViteServerConfig)) {
|
|
726
749
|
throw new Error(`Worktree sessions require a Vite server configuration`);
|
|
727
750
|
}
|
|
728
|
-
const
|
|
729
|
-
|
|
730
|
-
const
|
|
731
|
-
const viteConfigPath = path.resolve(worktreeConfigDir, defaultViteConfig);
|
|
732
|
-
const viteProject = ViteProjectRef.fromViteConfigPath(viteConfigPath);
|
|
733
|
-
const currentSession = this._config.sessions.find(s => s.source.kind === 'current');
|
|
734
|
-
const resolveViteFrom = currentSession?.server.kind === 'vite' ? currentSession.server.viteProject.configFile : undefined;
|
|
735
|
-
this._logger.debug(`Worktree session "${sessionName}": resolveViteFrom=${resolveViteFrom}`);
|
|
736
|
-
const worktreeServerConfig = { kind: 'vite', viteProject, hmr: defaultServer.hmr };
|
|
737
|
-
const session = await ExplorerSession.create(sessionName, worktreeServerConfig, this._serverFactory, this._browserFactory, {
|
|
738
|
-
logger: this._logger,
|
|
739
|
-
resolveViteFrom,
|
|
740
|
-
daemonConfig: {
|
|
741
|
-
pipeName: this._pipeName,
|
|
742
|
-
sessionName,
|
|
743
|
-
daemonApiVersion: daemonApiVersionText,
|
|
744
|
-
pluginProtocolVersion: pluginProtocolVersionText,
|
|
745
|
-
},
|
|
746
|
-
});
|
|
751
|
+
const worktreeServerConfig = defaultServer.forWorktree(this._config.repo.gitRoot, worktreePath, this._config.configDir);
|
|
752
|
+
this._logger.debug(`Worktree session "${sessionName}": resolveViteFrom=${worktreeServerConfig.viteProject.configFile}`);
|
|
753
|
+
const session = await ExplorerSession.create(sessionName, worktreeServerConfig, this._browserFactory, this._serverContext(sessionName));
|
|
747
754
|
this._sessions.set(sessionName, session);
|
|
748
755
|
this._logger.debug(`Session ready: ${sessionName} (${session.serverUrl})`);
|
|
749
756
|
}
|