@vscode/component-explorer-cli 0.2.1-18 → 0.2.1-181
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 +130 -12
- 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 +55 -1
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +103 -7
- package/dist/browserPage.js.map +1 -1
- package/dist/browserPage.test.d.ts +2 -0
- package/dist/browserPage.test.d.ts.map +1 -0
- package/dist/commands/acceptCommand.d.ts +1 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +21 -14
- 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 +25 -8
- 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 +31 -22
- 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.map +1 -1
- package/dist/commands/mcpCommand.js +18 -12
- package/dist/commands/mcpCommand.js.map +1 -1
- package/dist/commands/renderCommand.d.ts +10 -1
- package/dist/commands/renderCommand.d.ts.map +1 -1
- package/dist/commands/renderCommand.js +390 -61
- package/dist/commands/renderCommand.js.map +1 -1
- package/dist/commands/renderCommand.test.d.ts +2 -0
- package/dist/commands/renderCommand.test.d.ts.map +1 -0
- package/dist/commands/serveCommand.d.ts +4 -1
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +105 -36
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.js +10 -9
- 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 +31 -20
- 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 +110 -12
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +177 -24
- 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 +5 -199
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +248 -300
- 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 +76 -5
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/daemonRpc.test.d.ts +2 -0
- package/dist/daemon/daemonRpc.test.d.ts.map +1 -0
- package/dist/daemon/endpointServer.d.ts +4 -0
- package/dist/daemon/endpointServer.d.ts.map +1 -0
- package/dist/daemon/endpointServer.js +24 -0
- package/dist/daemon/endpointServer.js.map +1 -0
- package/dist/daemon/inProcessClient.d.ts +3 -9
- package/dist/daemon/inProcessClient.d.ts.map +1 -1
- package/dist/daemon/inProcessClient.js +29 -30
- package/dist/daemon/inProcessClient.js.map +1 -1
- package/dist/daemon/lifecycle.d.ts +5 -5
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +4 -3
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/pipeClient.d.ts +2 -3
- package/dist/daemon/pipeClient.d.ts.map +1 -1
- package/dist/daemon/pipeClient.js +93 -194
- 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 +6 -5
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.d.ts +2 -2
- package/dist/daemon/pipeServer.d.ts.map +1 -1
- package/dist/daemon/pipeServer.js +79 -70
- package/dist/daemon/pipeServer.js.map +1 -1
- package/dist/daemon/registerDaemonConnection.d.ts +7 -0
- package/dist/daemon/registerDaemonConnection.d.ts.map +1 -0
- package/dist/daemon/registerDaemonConnection.js +37 -0
- package/dist/daemon/registerDaemonConnection.js.map +1 -0
- package/dist/daemon/transports.test.d.ts +2 -0
- package/dist/daemon/transports.test.d.ts.map +1 -0
- package/dist/daemon/types.d.ts +1655 -8
- package/dist/daemon/types.d.ts.map +1 -1
- package/dist/daemon/types.js +4 -0
- package/dist/daemon/types.js.map +1 -0
- package/dist/daemon/version.d.ts +1 -5
- package/dist/daemon/version.d.ts.map +1 -1
- package/dist/daemon/version.js +3 -7
- package/dist/daemon/version.js.map +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/explorerSession.d.ts +5 -1
- package/dist/explorerSession.d.ts.map +1 -1
- package/dist/explorerSession.js +24 -7
- package/dist/explorerSession.js.map +1 -1
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/inspectionHost-BA6ZmC_P.js +2523 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/inspectionHost-BA6ZmC_P.js.map +1 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js +1871 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/src-DYVSK_tz.js.map +1 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/webSocketTransport-Ct4OIdG9.js +220 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/chunks/webSocketTransport-Ct4OIdG9.js.map +1 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/node.js +721 -0
- package/dist/external/linkrpc/typescript/packages/linkrpc/dist/node.js.map +1 -0
- 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 -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.d.ts +0 -2
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/js-component-explorer/packages/common/dist/daemonRpc.js +165 -0
- package/dist/js-component-explorer/packages/common/dist/daemonRpc.js.map +1 -0
- 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.map +1 -0
- package/dist/manifest.schema.json +44 -16
- package/dist/mcp/DaemonAccessor.d.ts +2 -3
- package/dist/mcp/DaemonAccessor.d.ts.map +1 -1
- package/dist/mcp/McpServer.d.ts +1 -1
- package/dist/mcp/McpServer.d.ts.map +1 -1
- package/dist/mcp/McpServer.js +252 -159
- 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 +6 -1
- package/dist/processTree.d.ts.map +1 -1
- package/dist/processTree.js +48 -5
- package/dist/processTree.js.map +1 -1
- package/dist/renderManifest.d.ts +70 -5
- package/dist/renderManifest.js +1 -1
- package/dist/server/httpServer.d.ts +1 -1
- package/dist/server/httpServer.d.ts.map +1 -1
- package/dist/server/httpServer.js +4 -8
- package/dist/server/httpServer.js.map +1 -1
- package/dist/server/serverConfig.d.ts +23 -8
- 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 -3
- 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/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 +18 -15
- package/dist/commands/artifactCommand.d.ts +0 -14
- package/dist/commands/artifactCommand.d.ts.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/formatValue.js +0 -96
- package/dist/formatValue.js.map +0 -1
- package/dist/packages/common/dist/renderManifest.js +0 -46
- package/dist/packages/common/dist/renderManifest.js.map +0 -1
- package/dist/packages/semver/dist/index.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js +0 -138
- package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js +0 -27
- package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js +0 -28
- package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js.map +0 -1
- package/dist/packages/simple-api/dist/express.js +0 -104
- package/dist/packages/simple-api/dist/express.js.map +0 -1
- /package/dist/{packages → js-component-explorer/packages}/semver/dist/index.js +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/README.md
CHANGED
|
@@ -10,39 +10,76 @@ npm install @vscode/component-explorer-cli
|
|
|
10
10
|
|
|
11
11
|
The binary is available as `component-explorer`.
|
|
12
12
|
|
|
13
|
+
CLI-managed Chromium browsers disable partial rasterization so repeated captures
|
|
14
|
+
of rounded, antialiased edges do not depend on previously painted tile contents.
|
|
15
|
+
Screenshots are still compared without introducing pixel tolerances.
|
|
16
|
+
|
|
17
|
+
### Daemon compatibility
|
|
18
|
+
|
|
19
|
+
Daemon communication uses LinkRPC over a local named pipe or Unix socket.
|
|
20
|
+
Compatibility is checked using LinkRPC interface hashes rather than manually
|
|
21
|
+
maintained daemon or plugin protocol versions. Restart existing daemon sessions
|
|
22
|
+
after upgrading. Pre-LinkRPC daemons use a different pipe namespace. The Explorer's
|
|
23
|
+
Vite server bridges a same-origin WebSocket connection to the daemon; no additional
|
|
24
|
+
daemon TCP port or RPC hub is required.
|
|
25
|
+
|
|
13
26
|
## Commands
|
|
14
27
|
|
|
15
|
-
### `
|
|
28
|
+
### `render`
|
|
16
29
|
|
|
17
|
-
Capture screenshots of all fixtures using a headless browser.
|
|
30
|
+
Capture screenshots of all fixtures using a headless browser and write a manifest.
|
|
31
|
+
The manifest is validated against the shared schema and includes its default
|
|
32
|
+
`projectId` of `"main"`.
|
|
18
33
|
|
|
19
34
|
```bash
|
|
20
|
-
component-explorer
|
|
35
|
+
component-explorer render [options]
|
|
21
36
|
```
|
|
22
37
|
|
|
23
38
|
| Option | Description |
|
|
24
39
|
|---|---|
|
|
25
40
|
| `-p, --project <path>` | Project: a directory, vite config file, or component-explorer.json (default: cwd) |
|
|
26
|
-
| `--
|
|
41
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
27
42
|
| `--accept` | Write to baseline instead of current (mutually exclusive with `--target`) |
|
|
28
43
|
| `--target <dir>` | Screenshot output directory (default: `.screenshots/current`, or `.screenshots/baseline` with `--accept`) |
|
|
29
44
|
| `--compare` | Compare screenshots after capturing |
|
|
30
45
|
| `--compare-target <dir>` | Directory to compare against (default: `.screenshots/baseline`, or `.screenshots/current` with `--accept`) |
|
|
31
46
|
| `--report <dir>` | Output report folder with report.json, report.md, and changed screenshots (requires `--compare`) |
|
|
47
|
+
| `--workers <count>` | Parallel render workers: defaults to the available CPU count, at least 1 and at most 8. Use `1` for serial rendering. |
|
|
32
48
|
| `-v, --verbose` | Increase log verbosity (`-v` debug, `-vv` trace) |
|
|
33
49
|
|
|
50
|
+
Workers share one server and browser, but each has an isolated browser context and
|
|
51
|
+
page. The selected fixture list is split into fixed, contiguous chunks whose sizes
|
|
52
|
+
differ by at most one. Each worker renders its chunk sequentially without taking
|
|
53
|
+
work from other workers, so assignment and per-worker order are deterministic for
|
|
54
|
+
the same fixture list and worker count. Pin `--workers` to keep the same assignment
|
|
55
|
+
across machines with different CPU counts. The worker count never exceeds the
|
|
56
|
+
number of selected fixtures.
|
|
57
|
+
Manifest entries stay in discovery order, while progress is logged as fixtures
|
|
58
|
+
finish. Total coverage is merged across workers; per-fixture coverage and
|
|
59
|
+
`--reload-between-fixtures` apply independently to each worker's page.
|
|
60
|
+
|
|
61
|
+
Parallel rendering is enabled by default, including in CI. For fixtures that rely
|
|
62
|
+
on cross-fixture state or external shared resources, use `--workers 1`. Additional
|
|
63
|
+
workers require more memory; use an explicit count to tune for your CI runner.
|
|
64
|
+
|
|
34
65
|
```bash
|
|
35
66
|
# Capture all fixtures
|
|
36
|
-
component-explorer
|
|
67
|
+
component-explorer render
|
|
37
68
|
|
|
38
69
|
# Capture and accept as baseline
|
|
39
|
-
component-explorer
|
|
70
|
+
component-explorer render --accept
|
|
40
71
|
|
|
41
72
|
# Capture, then compare against baseline
|
|
42
|
-
component-explorer
|
|
73
|
+
component-explorer render --compare
|
|
43
74
|
|
|
44
|
-
# Filter by
|
|
45
|
-
component-explorer
|
|
75
|
+
# Filter by fixture-id regex
|
|
76
|
+
component-explorer render --fixture-id-regex "^Button/"
|
|
77
|
+
|
|
78
|
+
# Use four parallel workers
|
|
79
|
+
component-explorer render --workers 4
|
|
80
|
+
|
|
81
|
+
# Retain serial rendering
|
|
82
|
+
component-explorer render --workers 1
|
|
46
83
|
```
|
|
47
84
|
|
|
48
85
|
### `screenshot:compare`
|
|
@@ -58,7 +95,7 @@ component-explorer screenshot:compare [options]
|
|
|
58
95
|
| `-p, --project <path>` | Project directory (default: cwd) |
|
|
59
96
|
| `--baseline <dir>` | Baseline screenshots directory (default: `.screenshots/baseline`) |
|
|
60
97
|
| `--current <dir>` | Current screenshots directory (default: `.screenshots/current`) |
|
|
61
|
-
| `--
|
|
98
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
62
99
|
| `--report <dir>` | Output report folder (contains report.json, report.md, and changed screenshots) |
|
|
63
100
|
| `-v, --verbose` | Increase log verbosity |
|
|
64
101
|
|
|
@@ -86,7 +123,7 @@ component-explorer screenshot:accept [options]
|
|
|
86
123
|
| Option | Description |
|
|
87
124
|
|---|---|
|
|
88
125
|
| `-p, --project <path>` | Project directory (default: cwd) |
|
|
89
|
-
| `--
|
|
126
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
90
127
|
| `--screenshot-dir <dir>` | Screenshots directory (default: `.screenshots`) |
|
|
91
128
|
| `-v, --verbose` | Increase log verbosity |
|
|
92
129
|
|
|
@@ -95,7 +132,7 @@ component-explorer screenshot:accept [options]
|
|
|
95
132
|
component-explorer screenshot:accept
|
|
96
133
|
|
|
97
134
|
# Accept specific fixtures
|
|
98
|
-
component-explorer screenshot:accept --
|
|
135
|
+
component-explorer screenshot:accept --fixture-id-regex "^Button/"
|
|
99
136
|
```
|
|
100
137
|
|
|
101
138
|
### `watch`
|
|
@@ -135,6 +172,7 @@ component-explorer serve -p <config> [options]
|
|
|
135
172
|
| `--background` | Spawn as a detached background process |
|
|
136
173
|
| `--attach` | Attach to a running daemon and stream events |
|
|
137
174
|
| `--kill` | Shut down a running daemon |
|
|
175
|
+
| `--endpoint <uri>` | LinkRPC endpoint, defaulting to `LINKRPC_ENDPOINT`. Supports stdio, listening, and outbound connections. Requires a foreground daemon; diagnostics go to stderr. |
|
|
138
176
|
| `-v, --verbose` | Increase log verbosity |
|
|
139
177
|
|
|
140
178
|
Without flags, starts a foreground daemon. Combine `--background` and `--attach` to ensure a daemon is running and then stream its events.
|
|
@@ -156,6 +194,86 @@ component-explorer serve -p config.json --background --attach
|
|
|
156
194
|
component-explorer serve -p config.json --kill
|
|
157
195
|
```
|
|
158
196
|
|
|
197
|
+
To drive a foreground daemon from the [LinkRPC CLI](https://github.com/hediet/linkrpc/tree/main/typescript/packages/linkrpc-cli), use a `cmd-stdio:` endpoint. It launches the server as a child, keeps one connection for the entire batch, and closes the server when the connection ends. The daemon still starts its local pipe for Explorer browser connections.
|
|
198
|
+
|
|
199
|
+
After initialization, `component-explorer.daemon` is the default interface: both `sessions` and `component-explorer.daemon::sessions` call the same handler. This uses LinkRPC's `defaultInterfaceTarget`, retaining native metadata and streaming rather than the foreign-protocol bare client mode. No-argument requests accept omitted parameters, and `--p:<name>` supplies individual parameters without a JSON object.
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
rpc --endpoint-cmd-stdio "component-explorer serve -p config.json --endpoint stdio" batch \
|
|
203
|
+
--call component-explorer.daemon-initialization::initialize \
|
|
204
|
+
--p:clientName rpc \
|
|
205
|
+
--call sessions \
|
|
206
|
+
--call shutdown
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
For separate CLI invocations, create a persistent connection owned by the current
|
|
210
|
+
folder's context. The broker keeps the same
|
|
211
|
+
initialized connection to the foreground daemon; reusing the original
|
|
212
|
+
`cmd:` or `cmd-stdio:` URL instead would launch a new child for each invocation.
|
|
213
|
+
|
|
214
|
+
```powershell
|
|
215
|
+
rpc --endpoint-cmd "component-explorer serve -p config.json" `
|
|
216
|
+
connection create --new-context . --timeout inf
|
|
217
|
+
try {
|
|
218
|
+
rpc call component-explorer.daemon-initialization::initialize --p:clientName rpc
|
|
219
|
+
rpc call sessions
|
|
220
|
+
rpc call approvalsApprove `
|
|
221
|
+
--p:fixtureId TestButton --p:originalHash before --p:modifiedHash after --p:comment "Reviewed"
|
|
222
|
+
rpc call approvalsLookup `
|
|
223
|
+
--p:fixtureId TestButton --p:originalHash before --p:modifiedHash after
|
|
224
|
+
rpc call approvalsRevoke `
|
|
225
|
+
--p:fixtureId TestButton --p:originalHash before --p:modifiedHash after
|
|
226
|
+
rpc call approvalsLookup `
|
|
227
|
+
--p:fixtureId TestButton --p:originalHash before --p:modifiedHash after
|
|
228
|
+
} finally {
|
|
229
|
+
rpc context remove
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
The final lookup returns `null`. Subsequent calls discover the folder context
|
|
234
|
+
automatically. `--new-context .` refuses to overwrite an existing context.
|
|
235
|
+
Removing the context destroys its owned connection and stops the child daemon.
|
|
236
|
+
Contexts store defaults in the global user store, not in a project file.
|
|
237
|
+
|
|
238
|
+
Every `connection create` requires an explicit `--timeout` (transport inactivity)
|
|
239
|
+
or `--ttl` (maximum lifetime). Both accept `inf`; an omitted limit is also
|
|
240
|
+
unlimited. The example explicitly opts out of inactivity expiration and has no
|
|
241
|
+
TTL. Use finite limits for unattended workflows that need expiration even if
|
|
242
|
+
cleanup is interrupted.
|
|
243
|
+
|
|
244
|
+
Alternatively, store the returned broker endpoint in `LINKRPC_ENDPOINT` and use
|
|
245
|
+
`rpc --use-env` for each call, followed by `rpc --use-env connection destroy`.
|
|
246
|
+
Treat endpoints and context storage as private: broker endpoints contain access
|
|
247
|
+
tokens, and context tokens are stored unencrypted.
|
|
248
|
+
|
|
249
|
+
`--endpoint-cmd` and `cmd:` instead inject `LINKRPC_ENDPOINT` and `LINKRPC_TOKEN`.
|
|
250
|
+
The daemon reads these directly, so
|
|
251
|
+
`rpc --endpoint-cmd "component-explorer serve -p config.json"` needs no
|
|
252
|
+
transport-specific daemon flag.
|
|
253
|
+
|
|
254
|
+
The endpoint transport and initialization-interface reflection are available while
|
|
255
|
+
sessions start. The daemon `initialize` call waits for session setup before
|
|
256
|
+
registering service methods, so slow Vite startup does not consume the command
|
|
257
|
+
endpoint's child-connection deadline. Startup errors close the endpoint and clean
|
|
258
|
+
up initialized sessions. Closing a stdio or outbound endpoint shuts down the
|
|
259
|
+
daemon; rejecting an individual client on a listening endpoint only logs that
|
|
260
|
+
peer's error and leaves other clients and sessions running.
|
|
261
|
+
|
|
262
|
+
The same `--endpoint` option (or `LINKRPC_ENDPOINT`) supports:
|
|
263
|
+
|
|
264
|
+
| Endpoint | Behavior |
|
|
265
|
+
|---|---|
|
|
266
|
+
| `stdio` or `stdio:` | Serve on stdin/stdout |
|
|
267
|
+
| `ws://host:port` / `wss://host:port` | Connect to an existing WebSocket peer |
|
|
268
|
+
| `unix:/path/to/socket` / `npipe://./pipe/name` | Connect to an existing local socket |
|
|
269
|
+
| `listen:ws://127.0.0.1:3001` | Accept WebSocket clients (`:0` chooses an available port) |
|
|
270
|
+
| `listen:unix:/path/to/socket` / `listen:npipe://./pipe/name` | Accept local socket clients |
|
|
271
|
+
|
|
272
|
+
Listeners require a nonempty `LINKRPC_TOKEN` (or a URI token). Connecting peers
|
|
273
|
+
must supply the same token. Startup prints the resolved endpoint without its
|
|
274
|
+
token to stderr. The ordinary local daemon pipe remains available for the
|
|
275
|
+
Explorer UI regardless of the additional endpoint mode.
|
|
276
|
+
|
|
159
277
|
### `mcp`
|
|
160
278
|
|
|
161
279
|
Start a [Model Context Protocol](https://modelcontextprotocol.io/) server over stdio. Auto-starts a daemon if one is not already running.
|
package/dist/WorktreePool.d.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
+
import { AbsolutePath } from './path.js';
|
|
1
2
|
export declare class WorktreeSlot {
|
|
2
3
|
readonly index: number;
|
|
3
|
-
readonly worktreePath:
|
|
4
|
+
readonly worktreePath: AbsolutePath;
|
|
4
5
|
private _assignedSession;
|
|
5
|
-
constructor(index: number, worktreePath:
|
|
6
|
+
constructor(index: number, worktreePath: AbsolutePath);
|
|
6
7
|
get assignedSession(): string | undefined;
|
|
7
8
|
get isFree(): boolean;
|
|
8
9
|
assign(sessionName: string): void;
|
|
9
10
|
release(): void;
|
|
10
|
-
configDir(configDirRelToGitRoot: string):
|
|
11
|
+
configDir(configDirRelToGitRoot: string): AbsolutePath;
|
|
11
12
|
}
|
|
12
13
|
export declare class WorktreePool {
|
|
13
14
|
readonly maxSlots: number;
|
|
14
15
|
private readonly _slots;
|
|
15
|
-
constructor(maxSlots: number, worktreeRoot:
|
|
16
|
+
constructor(maxSlots: number, worktreeRoot: AbsolutePath);
|
|
16
17
|
allocate(sessionName: string): WorktreeSlot;
|
|
17
18
|
release(sessionName: string): void;
|
|
18
19
|
getSlot(sessionName: string): WorktreeSlot | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreePool.d.ts","sourceRoot":"","sources":["../src/WorktreePool.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WorktreePool.d.ts","sourceRoot":"","sources":["../src/WorktreePool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAC;AAEvD,qBAAa,YAAY;IAIvB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,YAAY,EAAE,YAAY;IAJpC,OAAO,CAAC,gBAAgB,CAAqB;gBAGnC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,YAAY;IAGpC,IAAI,eAAe,IAAI,MAAM,GAAG,SAAS,CAAkC;IAC3E,IAAI,MAAM,IAAI,OAAO,CAAgD;IAErE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IACjC,OAAO,IAAI,IAAI;IAEf,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,YAAY;CAGtD;AAED,qBAAa,YAAY;IAIvB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAH1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;gBAGvC,QAAQ,EAAE,MAAM,EACzB,YAAY,EAAE,YAAY;IAO3B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAiB3C,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAOlC,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAItD,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,KAAK,IAAI,SAAS,YAAY,EAAE,CAEnC;CACD"}
|
package/dist/WorktreePool.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { RelativePath } from './path.js';
|
|
2
2
|
|
|
3
3
|
class WorktreeSlot {
|
|
4
4
|
index;
|
|
@@ -13,7 +13,7 @@ class WorktreeSlot {
|
|
|
13
13
|
assign(sessionName) { this._assignedSession = sessionName; }
|
|
14
14
|
release() { this._assignedSession = undefined; }
|
|
15
15
|
configDir(configDirRelToGitRoot) {
|
|
16
|
-
return
|
|
16
|
+
return this.worktreePath.join(new RelativePath(configDirRelToGitRoot));
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
class WorktreePool {
|
|
@@ -21,7 +21,7 @@ class WorktreePool {
|
|
|
21
21
|
_slots;
|
|
22
22
|
constructor(maxSlots, worktreeRoot) {
|
|
23
23
|
this.maxSlots = maxSlots;
|
|
24
|
-
this._slots = Array.from({ length: maxSlots }, (_, i) => new WorktreeSlot(i + 1,
|
|
24
|
+
this._slots = Array.from({ length: maxSlots }, (_, i) => new WorktreeSlot(i + 1, worktreeRoot.join(new RelativePath(`component-explorer-${i + 1}`))));
|
|
25
25
|
}
|
|
26
26
|
allocate(sessionName) {
|
|
27
27
|
const existing = this._slots.find(s => s.assignedSession === sessionName);
|
package/dist/WorktreePool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorktreePool.js","sources":["../src/WorktreePool.ts"],"sourcesContent":[null],"names":[],"mappings":";;MAEa,YAAY,CAAA;AAId,IAAA,KAAA;AACA,IAAA,YAAA;AAJF,IAAA,gBAAgB;IAExB,WAAA,CACU,KAAa,EACb,
|
|
1
|
+
{"version":3,"file":"WorktreePool.js","sources":["../src/WorktreePool.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/browserPage.d.ts
CHANGED
|
@@ -6,15 +6,69 @@ export interface BrowserPageFactory {
|
|
|
6
6
|
export interface BrowserPage {
|
|
7
7
|
evaluateJs(expression: string): Promise<unknown>;
|
|
8
8
|
screenshot(domNodeExpression: string): Promise<ScreenshotResult>;
|
|
9
|
+
reload(): Promise<void>;
|
|
10
|
+
startJSCoverage(options?: {
|
|
11
|
+
resetOnNavigation?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
stopJSCoverage(): Promise<readonly JSCoverageEntry[]>;
|
|
14
|
+
startCSSCoverage(options?: {
|
|
15
|
+
resetOnNavigation?: boolean;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
stopCSSCoverage(): Promise<readonly CSSCoverageEntry[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Enable automatic snapshotting of `window.__coverage__` (the global written
|
|
20
|
+
* by `vite-plugin-istanbul`) on every triggered reload. Call before any
|
|
21
|
+
* reloads happen during your tracking window.
|
|
22
|
+
*/
|
|
23
|
+
startIstanbulSnapshot(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Stop snapshotting and return all accumulated `__coverage__` snapshots
|
|
26
|
+
* captured before reloads. The caller is expected to additionally read
|
|
27
|
+
* `window.__coverage__` for the final post-last-reload state and merge.
|
|
28
|
+
*/
|
|
29
|
+
stopIstanbulSnapshot(): readonly unknown[];
|
|
9
30
|
dispose(): Promise<void>;
|
|
10
31
|
}
|
|
32
|
+
export interface ScreenshotError {
|
|
33
|
+
readonly message: string;
|
|
34
|
+
readonly stack?: string;
|
|
35
|
+
}
|
|
11
36
|
export type ScreenshotResult = {
|
|
12
37
|
ok: true;
|
|
13
38
|
screenshot: Uint8Array;
|
|
14
39
|
} | {
|
|
15
40
|
ok: false;
|
|
16
|
-
error:
|
|
41
|
+
error: ScreenshotError;
|
|
17
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* Raw V8 JavaScript coverage entry as returned by Playwright's `page.coverage.stopJSCoverage()`.
|
|
45
|
+
* Compatible with the input shape of `v8-to-istanbul`.
|
|
46
|
+
*/
|
|
47
|
+
export interface JSCoverageEntry {
|
|
48
|
+
readonly url: string;
|
|
49
|
+
readonly scriptId: string;
|
|
50
|
+
readonly source?: string;
|
|
51
|
+
readonly functions: readonly {
|
|
52
|
+
readonly functionName: string;
|
|
53
|
+
readonly isBlockCoverage: boolean;
|
|
54
|
+
readonly ranges: readonly {
|
|
55
|
+
readonly startOffset: number;
|
|
56
|
+
readonly endOffset: number;
|
|
57
|
+
readonly count: number;
|
|
58
|
+
}[];
|
|
59
|
+
}[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* CSS coverage entry as returned by Playwright's `page.coverage.stopCSSCoverage()`.
|
|
63
|
+
*/
|
|
64
|
+
export interface CSSCoverageEntry {
|
|
65
|
+
readonly url: string;
|
|
66
|
+
readonly text?: string;
|
|
67
|
+
readonly ranges: readonly {
|
|
68
|
+
readonly start: number;
|
|
69
|
+
readonly end: number;
|
|
70
|
+
}[];
|
|
71
|
+
}
|
|
18
72
|
export declare class PlaywrightBrowserPageFactory implements BrowserPageFactory {
|
|
19
73
|
readonly timeoutMs: number;
|
|
20
74
|
private _browser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserPage.d.ts","sourceRoot":"","sources":["../src/browserPage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC3B,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,UAAU,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"browserPage.d.ts","sourceRoot":"","sources":["../src/browserPage.ts"],"names":[],"mappings":"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"}
|
package/dist/browserPage.js
CHANGED
|
@@ -25,7 +25,11 @@ class PlaywrightBrowserPageFactory {
|
|
|
25
25
|
async openPage(url) {
|
|
26
26
|
if (!this._browser) {
|
|
27
27
|
const { chromium } = await import('playwright');
|
|
28
|
-
this._browser = await withWindowsHide(() => chromium.launch({
|
|
28
|
+
this._browser = await withWindowsHide(() => chromium.launch({
|
|
29
|
+
headless: !this._headed,
|
|
30
|
+
// Repainting dirty regions can change antialiased edge pixels between identical captures.
|
|
31
|
+
args: ['--disable-partial-raster'],
|
|
32
|
+
}));
|
|
29
33
|
}
|
|
30
34
|
const page = await this._browser.newPage();
|
|
31
35
|
page.on('console', (msg) => {
|
|
@@ -59,6 +63,12 @@ class PlaywrightBrowserPageFactory {
|
|
|
59
63
|
}
|
|
60
64
|
class PlaywrightBrowserPage {
|
|
61
65
|
_page;
|
|
66
|
+
_jsCoverageActive = false;
|
|
67
|
+
_jsCoverageAccumulated = [];
|
|
68
|
+
_cssCoverageActive = false;
|
|
69
|
+
_cssCoverageAccumulated = [];
|
|
70
|
+
_istanbulSnapshotActive = false;
|
|
71
|
+
_istanbulSnapshots = [];
|
|
62
72
|
constructor(_page) {
|
|
63
73
|
this._page = _page;
|
|
64
74
|
}
|
|
@@ -69,18 +79,104 @@ class PlaywrightBrowserPage {
|
|
|
69
79
|
const handle = await this._page.evaluateHandle(`(${domNodeExpression})`);
|
|
70
80
|
const element = handle.asElement();
|
|
71
81
|
if (!element) {
|
|
72
|
-
return { ok: false, error: '
|
|
73
|
-
}
|
|
74
|
-
if (!await element.isVisible()) {
|
|
75
|
-
return { ok: false, error: 'noDomNode' };
|
|
82
|
+
return { ok: false, error: { message: 'Screenshot target did not resolve to an element.' } };
|
|
76
83
|
}
|
|
77
84
|
try {
|
|
85
|
+
const dimensions = await element.evaluate(element => {
|
|
86
|
+
const bounds = element.getBoundingClientRect();
|
|
87
|
+
return { width: bounds.width, height: bounds.height };
|
|
88
|
+
});
|
|
89
|
+
if (dimensions.width <= 0 || dimensions.height <= 0) {
|
|
90
|
+
return { ok: false, error: { message: `Screenshot target has invalid dimensions (${dimensions.width}x${dimensions.height}).` } };
|
|
91
|
+
}
|
|
92
|
+
if (!await element.isVisible()) {
|
|
93
|
+
return { ok: false, error: { message: `Screenshot target is not visible (${dimensions.width}x${dimensions.height}).` } };
|
|
94
|
+
}
|
|
78
95
|
const buffer = await element.screenshot({ type: 'png', timeout: 5000 });
|
|
79
96
|
return { ok: true, screenshot: new Uint8Array(buffer) };
|
|
80
97
|
}
|
|
81
|
-
catch {
|
|
82
|
-
|
|
98
|
+
catch (error) {
|
|
99
|
+
const screenshotError = error instanceof Error ? error : new Error(String(error));
|
|
100
|
+
return {
|
|
101
|
+
ok: false,
|
|
102
|
+
error: {
|
|
103
|
+
message: `Failed to capture screenshot: ${screenshotError.message}`,
|
|
104
|
+
stack: screenshotError.stack,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async reload() {
|
|
110
|
+
// Chrome's `CSS.startRuleUsageTracking` and V8's precise coverage are
|
|
111
|
+
// both bound to the document; on reload the data is gone even with
|
|
112
|
+
// Playwright's `resetOnNavigation: false`. Snapshot before reload and
|
|
113
|
+
// restart afterwards so callers see the union across the entire
|
|
114
|
+
// tracking window. Same for vite-plugin-istanbul's `window.__coverage__`,
|
|
115
|
+
// which lives in JS memory and is wiped on reload.
|
|
116
|
+
if (this._cssCoverageActive) {
|
|
117
|
+
const entries = await this._page.coverage.stopCSSCoverage();
|
|
118
|
+
this._cssCoverageAccumulated.push(...entries);
|
|
119
|
+
}
|
|
120
|
+
if (this._jsCoverageActive) {
|
|
121
|
+
const entries = await this._page.coverage.stopJSCoverage();
|
|
122
|
+
this._jsCoverageAccumulated.push(...entries);
|
|
123
|
+
}
|
|
124
|
+
if (this._istanbulSnapshotActive) {
|
|
125
|
+
try {
|
|
126
|
+
const snap = await this._page.evaluate('window.__coverage__ ?? null');
|
|
127
|
+
if (snap) {
|
|
128
|
+
this._istanbulSnapshots.push(snap);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Page may be in a transitional state; skip this snapshot.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
await this._page.reload({ waitUntil: 'networkidle' });
|
|
136
|
+
if (this._cssCoverageActive) {
|
|
137
|
+
await this._page.coverage.startCSSCoverage({ resetOnNavigation: false });
|
|
83
138
|
}
|
|
139
|
+
if (this._jsCoverageActive) {
|
|
140
|
+
await this._page.coverage.startJSCoverage({ resetOnNavigation: false });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async startJSCoverage(options) {
|
|
144
|
+
this._jsCoverageActive = true;
|
|
145
|
+
this._jsCoverageAccumulated = [];
|
|
146
|
+
await this._page.coverage.startJSCoverage({
|
|
147
|
+
resetOnNavigation: options?.resetOnNavigation ?? false,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async stopJSCoverage() {
|
|
151
|
+
this._jsCoverageActive = false;
|
|
152
|
+
const final = await this._page.coverage.stopJSCoverage();
|
|
153
|
+
const all = [...this._jsCoverageAccumulated, ...final];
|
|
154
|
+
this._jsCoverageAccumulated = [];
|
|
155
|
+
return all;
|
|
156
|
+
}
|
|
157
|
+
async startCSSCoverage(options) {
|
|
158
|
+
this._cssCoverageActive = true;
|
|
159
|
+
this._cssCoverageAccumulated = [];
|
|
160
|
+
await this._page.coverage.startCSSCoverage({
|
|
161
|
+
resetOnNavigation: options?.resetOnNavigation ?? false,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
async stopCSSCoverage() {
|
|
165
|
+
this._cssCoverageActive = false;
|
|
166
|
+
const final = await this._page.coverage.stopCSSCoverage();
|
|
167
|
+
const all = [...this._cssCoverageAccumulated, ...final];
|
|
168
|
+
this._cssCoverageAccumulated = [];
|
|
169
|
+
return all;
|
|
170
|
+
}
|
|
171
|
+
startIstanbulSnapshot() {
|
|
172
|
+
this._istanbulSnapshotActive = true;
|
|
173
|
+
this._istanbulSnapshots = [];
|
|
174
|
+
}
|
|
175
|
+
stopIstanbulSnapshot() {
|
|
176
|
+
this._istanbulSnapshotActive = false;
|
|
177
|
+
const snaps = this._istanbulSnapshots;
|
|
178
|
+
this._istanbulSnapshots = [];
|
|
179
|
+
return snaps;
|
|
84
180
|
}
|
|
85
181
|
async dispose() {
|
|
86
182
|
await this._page.close();
|
package/dist/browserPage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserPage.js","sources":["../src/browserPage.ts"],"sourcesContent":[null],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"browserPage.js","sources":["../src/browserPage.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserPage.test.d.ts","sourceRoot":"","sources":["../src/browserPage.test.ts"],"names":[],"mappings":""}
|
|
@@ -4,7 +4,7 @@ export declare class AcceptCommand extends Command {
|
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
5
|
readonly verbose: number;
|
|
6
6
|
readonly logFile: string | undefined;
|
|
7
|
-
readonly
|
|
7
|
+
readonly fixtureIdRegex: string | undefined;
|
|
8
8
|
readonly project: string;
|
|
9
9
|
readonly screenshotDir: string;
|
|
10
10
|
execute(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptCommand.d.ts","sourceRoot":"","sources":["../../src/commands/acceptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAO5C,qBAAa,aAAc,SAAQ,OAAO;IACzC,OAAgB,KAAK,aAAuB;IAE5C,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,OAAO,qBAAgG;IAChH,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"acceptCommand.d.ts","sourceRoot":"","sources":["../../src/commands/acceptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAO5C,qBAAa,aAAc,SAAQ,OAAO;IACzC,OAAgB,KAAK,aAAuB;IAE5C,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,OAAO,qBAAgG;IAChH,QAAQ,CAAC,cAAc,qBAAyJ;IAChL,QAAQ,CAAC,OAAO,SAAuI;IACvJ,QAAQ,CAAC,aAAa,SAA+F;IAE/G,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAqC9B"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { Command, Option } from 'clipanion';
|
|
2
|
-
import
|
|
3
|
-
import '../
|
|
4
|
-
import
|
|
5
|
-
import '../
|
|
6
|
-
import '../
|
|
7
|
-
import '../
|
|
8
|
-
import '../external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
2
|
+
import '../vscode-observables/observables/dist/observableInternal/index.js';
|
|
3
|
+
import { DisposableStore } from '../vscode-observables/observables/dist/disposables.js';
|
|
4
|
+
import '../vscode-observables/observables/dist/observableInternal/debugLocation.js';
|
|
5
|
+
import '../vscode-observables/observables/dist/observableInternal/observables/derived.js';
|
|
6
|
+
import '../vscode-observables/observables/dist/observableInternal/utils/utils.js';
|
|
7
|
+
import '../vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
9
8
|
import { ConsoleLogger, verbosityToLogLevel, createLogFileOptions, logBuildInfo } from '../logger.js';
|
|
10
9
|
import { FileSystemStorage } from '../storage.js';
|
|
11
10
|
import { ResolvedConfig } from '../config.js';
|
|
11
|
+
import { AbsolutePath } from '../path.js';
|
|
12
12
|
|
|
13
13
|
class AcceptCommand extends Command {
|
|
14
14
|
static paths = [['render:accept']];
|
|
@@ -16,27 +16,34 @@ class AcceptCommand extends Command {
|
|
|
16
16
|
description: 'Promote current screenshots to baseline (file-level only)',
|
|
17
17
|
examples: [
|
|
18
18
|
['Accept all', '$0 render:accept'],
|
|
19
|
-
['Accept specific fixtures', '$0 render:accept --
|
|
19
|
+
['Accept specific fixtures', '$0 render:accept --fixture-id-regex "^Button/"'],
|
|
20
20
|
],
|
|
21
21
|
});
|
|
22
22
|
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
23
23
|
logFile = Option.String('--log-file', { description: 'Append logs to this file (works with -v/-vv)' });
|
|
24
|
-
|
|
24
|
+
fixtureIdRegex = Option.String('--fixture-id-regex', { required: false, description: 'Filter fixtures whose fixtureId matches this regular expression (unanchored)' });
|
|
25
25
|
project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
|
|
26
26
|
screenshotDir = Option.String('--screenshot-dir', '.screenshots', { description: 'Screenshots directory' });
|
|
27
27
|
async execute() {
|
|
28
28
|
const disposables = new DisposableStore();
|
|
29
|
-
const config = await ResolvedConfig.fromProjectPath(this.project, disposables);
|
|
29
|
+
const config = await ResolvedConfig.fromProjectPath(AbsolutePath.resolve(this.project), disposables);
|
|
30
30
|
const projectDir = config.configDir;
|
|
31
31
|
disposables.dispose();
|
|
32
32
|
const _logger = new ConsoleLogger('accept', this.context.stdout, verbosityToLogLevel(this.verbose), createLogFileOptions(this.logFile, this.verbose));
|
|
33
33
|
logBuildInfo(_logger);
|
|
34
|
-
const screenshotPath =
|
|
34
|
+
const screenshotPath = AbsolutePath.fromAbsoluteOrRelative(this.screenshotDir, { base: projectDir });
|
|
35
35
|
const storage = new FileSystemStorage(screenshotPath);
|
|
36
36
|
let currentFiles = await storage.list('current');
|
|
37
|
-
if (this.
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
if (this.fixtureIdRegex) {
|
|
38
|
+
let regex;
|
|
39
|
+
try {
|
|
40
|
+
regex = new RegExp(this.fixtureIdRegex);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
this.context.stderr.write(`Error: Invalid --fixture-id-regex: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
currentFiles = currentFiles.filter(f => regex.test(f.replace(/^current\//, '').replace(/\.png$/, '')));
|
|
40
47
|
}
|
|
41
48
|
if (currentFiles.length === 0) {
|
|
42
49
|
this.context.stdout.write('No current screenshots to accept.\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptCommand.js","sources":["../../src/commands/acceptCommand.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;AAOM,MAAO,aAAc,SAAQ,OAAO,CAAA;IACzC,OAAgB,KAAK,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;AAE3C,IAAA,OAAgB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;AACrC,QAAA,WAAW,EAAE,2DAA2D;AACxE,QAAA,QAAQ,EAAE;YACT,CAAC,YAAY,EAAE,kBAAkB,CAAC;YAClC,CAAC,0BAA0B,EAAE,
|
|
1
|
+
{"version":3,"file":"acceptCommand.js","sources":["../../src/commands/acceptCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|