@vscode/component-explorer-cli 0.2.1-16 → 0.2.1-161
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 +40 -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 +12 -11
- 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.map +1 -1
- package/dist/commands/serveCommand.js +14 -11
- 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 +14 -5
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +47 -23
- package/dist/daemon/DaemonService.js.map +1 -1
- package/dist/daemon/approvalStore.d.ts +2 -1
- package/dist/daemon/approvalStore.d.ts.map +1 -1
- package/dist/daemon/approvalStore.js +4 -3
- package/dist/daemon/approvalStore.js.map +1 -1
- package/dist/daemon/inProcessClient.js +2 -2
- package/dist/daemon/lifecycle.d.ts +2 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +1 -1
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/pipeClient.js +8 -7
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/pipeName.d.ts +3 -3
- package/dist/daemon/pipeName.d.ts.map +1 -1
- package/dist/daemon/pipeName.js +1 -2
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.js +3 -3
- package/dist/daemon/version.d.ts +1 -1
- package/dist/daemon/version.js +2 -2
- 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/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.js +10 -1
- 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.map +1 -0
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +1 -0
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js.map +1 -0
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js.map +1 -0
- package/dist/js-component-explorer/packages/simple-api/dist/express.js.map +1 -0
- package/dist/manifest.schema.json +44 -16
- package/dist/mcp/McpServer.d.ts.map +1 -1
- package/dist/mcp/McpServer.js +183 -101
- 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.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 -6
- package/dist/server/serverConfig.d.ts.map +1 -1
- package/dist/server/serverConfig.js +11 -18
- package/dist/server/serverConfig.js.map +1 -1
- package/dist/server/viteServer.d.ts +16 -1
- package/dist/server/viteServer.d.ts.map +1 -1
- package/dist/server/viteServer.js +86 -5
- package/dist/server/viteServer.js.map +1 -1
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/utils.d.ts +3 -30
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -24
- package/dist/utils.js.map +1 -1
- package/dist/visualCache.d.ts +2 -1
- package/dist/visualCache.d.ts.map +1 -1
- package/dist/visualCache.js +4 -3
- package/dist/visualCache.js.map +1 -1
- package/dist/viteProjectRef.d.ts +4 -12
- package/dist/viteProjectRef.d.ts.map +1 -1
- package/dist/viteProjectRef.js +9 -17
- package/dist/viteProjectRef.js.map +1 -1
- package/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 +11 -9
- 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/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.map +0 -1
- package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js.map +0 -1
- 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/{packages → js-component-explorer/packages}/simple-api/dist/chunk-FJ7AVNQE.js +0 -0
- /package/dist/{packages → js-component-explorer/packages}/simple-api/dist/chunk-TTRCY65Z.js +0 -0
- /package/dist/{packages → js-component-explorer/packages}/simple-api/dist/chunk-WNXMRXWV.js +0 -0
- /package/dist/{packages → js-component-explorer/packages}/simple-api/dist/express.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,67 @@ 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
|
+
|
|
13
17
|
## Commands
|
|
14
18
|
|
|
15
|
-
### `
|
|
19
|
+
### `render`
|
|
16
20
|
|
|
17
|
-
Capture screenshots of all fixtures using a headless browser.
|
|
21
|
+
Capture screenshots of all fixtures using a headless browser and write a manifest.
|
|
22
|
+
The manifest is validated against the shared schema and includes its default
|
|
23
|
+
`projectId` of `"main"`.
|
|
18
24
|
|
|
19
25
|
```bash
|
|
20
|
-
component-explorer
|
|
26
|
+
component-explorer render [options]
|
|
21
27
|
```
|
|
22
28
|
|
|
23
29
|
| Option | Description |
|
|
24
30
|
|---|---|
|
|
25
31
|
| `-p, --project <path>` | Project: a directory, vite config file, or component-explorer.json (default: cwd) |
|
|
26
|
-
| `--
|
|
32
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
27
33
|
| `--accept` | Write to baseline instead of current (mutually exclusive with `--target`) |
|
|
28
34
|
| `--target <dir>` | Screenshot output directory (default: `.screenshots/current`, or `.screenshots/baseline` with `--accept`) |
|
|
29
35
|
| `--compare` | Compare screenshots after capturing |
|
|
30
36
|
| `--compare-target <dir>` | Directory to compare against (default: `.screenshots/baseline`, or `.screenshots/current` with `--accept`) |
|
|
31
37
|
| `--report <dir>` | Output report folder with report.json, report.md, and changed screenshots (requires `--compare`) |
|
|
38
|
+
| `--workers <count>` | Parallel render workers: defaults to the available CPU count, at least 1 and at most 8. Use `1` for serial rendering. |
|
|
32
39
|
| `-v, --verbose` | Increase log verbosity (`-v` debug, `-vv` trace) |
|
|
33
40
|
|
|
41
|
+
Workers share one server and browser, but each has an isolated browser context and
|
|
42
|
+
page. The selected fixture list is split into fixed, contiguous chunks whose sizes
|
|
43
|
+
differ by at most one. Each worker renders its chunk sequentially without taking
|
|
44
|
+
work from other workers, so assignment and per-worker order are deterministic for
|
|
45
|
+
the same fixture list and worker count. Pin `--workers` to keep the same assignment
|
|
46
|
+
across machines with different CPU counts. The worker count never exceeds the
|
|
47
|
+
number of selected fixtures.
|
|
48
|
+
Manifest entries stay in discovery order, while progress is logged as fixtures
|
|
49
|
+
finish. Total coverage is merged across workers; per-fixture coverage and
|
|
50
|
+
`--reload-between-fixtures` apply independently to each worker's page.
|
|
51
|
+
|
|
52
|
+
Parallel rendering is enabled by default, including in CI. For fixtures that rely
|
|
53
|
+
on cross-fixture state or external shared resources, use `--workers 1`. Additional
|
|
54
|
+
workers require more memory; use an explicit count to tune for your CI runner.
|
|
55
|
+
|
|
34
56
|
```bash
|
|
35
57
|
# Capture all fixtures
|
|
36
|
-
component-explorer
|
|
58
|
+
component-explorer render
|
|
37
59
|
|
|
38
60
|
# Capture and accept as baseline
|
|
39
|
-
component-explorer
|
|
61
|
+
component-explorer render --accept
|
|
40
62
|
|
|
41
63
|
# Capture, then compare against baseline
|
|
42
|
-
component-explorer
|
|
64
|
+
component-explorer render --compare
|
|
65
|
+
|
|
66
|
+
# Filter by fixture-id regex
|
|
67
|
+
component-explorer render --fixture-id-regex "^Button/"
|
|
68
|
+
|
|
69
|
+
# Use four parallel workers
|
|
70
|
+
component-explorer render --workers 4
|
|
43
71
|
|
|
44
|
-
#
|
|
45
|
-
component-explorer
|
|
72
|
+
# Retain serial rendering
|
|
73
|
+
component-explorer render --workers 1
|
|
46
74
|
```
|
|
47
75
|
|
|
48
76
|
### `screenshot:compare`
|
|
@@ -58,7 +86,7 @@ component-explorer screenshot:compare [options]
|
|
|
58
86
|
| `-p, --project <path>` | Project directory (default: cwd) |
|
|
59
87
|
| `--baseline <dir>` | Baseline screenshots directory (default: `.screenshots/baseline`) |
|
|
60
88
|
| `--current <dir>` | Current screenshots directory (default: `.screenshots/current`) |
|
|
61
|
-
| `--
|
|
89
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
62
90
|
| `--report <dir>` | Output report folder (contains report.json, report.md, and changed screenshots) |
|
|
63
91
|
| `-v, --verbose` | Increase log verbosity |
|
|
64
92
|
|
|
@@ -86,7 +114,7 @@ component-explorer screenshot:accept [options]
|
|
|
86
114
|
| Option | Description |
|
|
87
115
|
|---|---|
|
|
88
116
|
| `-p, --project <path>` | Project directory (default: cwd) |
|
|
89
|
-
| `--
|
|
117
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
90
118
|
| `--screenshot-dir <dir>` | Screenshots directory (default: `.screenshots`) |
|
|
91
119
|
| `-v, --verbose` | Increase log verbosity |
|
|
92
120
|
|
|
@@ -95,7 +123,7 @@ component-explorer screenshot:accept [options]
|
|
|
95
123
|
component-explorer screenshot:accept
|
|
96
124
|
|
|
97
125
|
# Accept specific fixtures
|
|
98
|
-
component-explorer screenshot:accept --
|
|
126
|
+
component-explorer screenshot:accept --fixture-id-regex "^Button/"
|
|
99
127
|
```
|
|
100
128
|
|
|
101
129
|
### `watch`
|
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":"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,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,eAAe,CAAC,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,IAAI,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;IACtD,gBAAgB,CAAC,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,eAAe,IAAI,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAAC;IACxD;;;;OAIG;IACH,qBAAqB,IAAI,IAAI,CAAC;IAC9B;;;;OAIG;IACH,oBAAoB,IAAI,SAAS,OAAO,EAAE,CAAC;IAC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACxB;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,eAAe,CAAA;CAAE,CAAC;AAE5G;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS;QAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;QAClC,QAAQ,CAAC,MAAM,EAAE,SAAS;YAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACjH,EAAE,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7E;AAED,qBAAa,4BAA6B,YAAW,kBAAkB;IAKjC,QAAQ,CAAC,SAAS,EAAE,MAAM;IAJ/D,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,OAAO,CAAU;gBAEb,MAAM,GAAE,OAAe,EAAW,SAAS,GAAE,MAAe,EAAE,MAAM,CAAC,EAAE,OAAO;IAK1F,IAAI,MAAM,IAAI,OAAO,CAAyB;IAExC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI9B"}
|
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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"}
|
|
@@ -8,6 +8,8 @@ export declare class CheckStabilityCommand extends Command {
|
|
|
8
8
|
readonly labelPattern: string | undefined;
|
|
9
9
|
readonly headed: boolean;
|
|
10
10
|
readonly timeout: string;
|
|
11
|
+
readonly reloadBetweenFixtures: boolean;
|
|
12
|
+
readonly input: string | undefined;
|
|
11
13
|
execute(): Promise<number>;
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=checkStabilityCommand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkStabilityCommand.d.ts","sourceRoot":"","sources":["../../src/commands/checkStabilityCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"checkStabilityCommand.d.ts","sourceRoot":"","sources":["../../src/commands/checkStabilityCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAU5C,qBAAa,qBAAsB,SAAQ,OAAO;IACjD,OAAgB,KAAK,aAAyB;IAE9C,OAAgB,KAAK,4BAMlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,OAAO,qBAAgG;IAChH,QAAQ,CAAC,OAAO,SAAuI;IACvJ,QAAQ,CAAC,YAAY,qBAA+I;IACpK,QAAQ,CAAC,MAAM,UAAwG;IACvH,QAAQ,CAAC,OAAO,SAA+G;IAC/H,QAAQ,CAAC,qBAAqB,UAAkJ;IAChL,QAAQ,CAAC,KAAK,qBAAmO;IAE3O,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAsFhC"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { Command, Option } from 'clipanion';
|
|
2
|
-
import '../
|
|
3
|
-
import { DisposableStore } from '../
|
|
4
|
-
import '../
|
|
5
|
-
import '../
|
|
6
|
-
import '../
|
|
7
|
-
import '../
|
|
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';
|
|
8
8
|
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
9
9
|
import { ConsoleLogger, verbosityToLogLevel, createLogFileOptions, logBuildInfo } from '../logger.js';
|
|
10
10
|
import { ResolvedConfig } from '../config.js';
|
|
11
|
+
import { AbsolutePath } from '../path.js';
|
|
11
12
|
import { ExplorerSession } from '../explorerSession.js';
|
|
12
13
|
import { contentHash } from '../screenshotCache.js';
|
|
14
|
+
import { parseInputJson } from './inputArg.js';
|
|
13
15
|
|
|
14
16
|
class CheckStabilityCommand extends Command {
|
|
15
17
|
static paths = [['check-stability']];
|
|
@@ -26,9 +28,19 @@ class CheckStabilityCommand extends Command {
|
|
|
26
28
|
labelPattern = Option.String('--label-pattern', { required: false, description: 'RegExp to filter fixtures by label (matched against inherited labels)' });
|
|
27
29
|
headed = Option.Boolean('--headed', false, { description: 'Show the browser window (useful for debugging)' });
|
|
28
30
|
timeout = Option.String('--timeout', '30000', { description: 'Navigation timeout in milliseconds (default: 30000)' });
|
|
31
|
+
reloadBetweenFixtures = Option.Boolean('--reload-between-fixtures', false, { description: 'Reload the browser page between fixtures for cleaner isolation (slower)' });
|
|
32
|
+
input = Option.String('--input', { required: false, description: 'JSON object passed to every fixture as `RenderContext.input` (e.g. \'{"theme":"dark"}\'). Combine with `--input-<key> <value>` to override individual properties.' });
|
|
29
33
|
async execute() {
|
|
30
34
|
const logger = new ConsoleLogger('check-stability', this.context.stderr, verbosityToLogLevel(this.verbose), createLogFileOptions(this.logFile, this.verbose));
|
|
31
35
|
logBuildInfo(logger);
|
|
36
|
+
let input;
|
|
37
|
+
try {
|
|
38
|
+
input = parseInputJson(this.input);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
this.context.stderr.write(`Error: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
42
|
+
return 1;
|
|
43
|
+
}
|
|
32
44
|
let labelRegex;
|
|
33
45
|
if (this.labelPattern) {
|
|
34
46
|
try {
|
|
@@ -40,7 +52,7 @@ class CheckStabilityCommand extends Command {
|
|
|
40
52
|
}
|
|
41
53
|
}
|
|
42
54
|
const disposables = new DisposableStore();
|
|
43
|
-
const config = await ResolvedConfig.fromProjectPath(this.project, disposables);
|
|
55
|
+
const config = await ResolvedConfig.fromProjectPath(AbsolutePath.resolve(this.project), disposables);
|
|
44
56
|
const serverConfig = config.sessions[0].server;
|
|
45
57
|
const browserFactory = new PlaywrightBrowserPageFactory(this.headed, Number(this.timeout));
|
|
46
58
|
let session;
|
|
@@ -60,7 +72,12 @@ class CheckStabilityCommand extends Command {
|
|
|
60
72
|
for (let i = 0; i < fixtures.length; i++) {
|
|
61
73
|
const fixture = fixtures[i];
|
|
62
74
|
this.context.stderr.write(`[${i + 1}/${fixtures.length}] Checking ${fixture.fixtureId}...`);
|
|
63
|
-
const result = await session.explorer.screenshotFixtureStabilityCheck(fixture.fixtureId
|
|
75
|
+
const result = await session.explorer.screenshotFixtureStabilityCheck(fixture.fixtureId, {
|
|
76
|
+
reloadOnError: true,
|
|
77
|
+
// Skip the reload before the first fixture — the page is already fresh.
|
|
78
|
+
reloadBeforeRender: this.reloadBetweenFixtures && i > 0,
|
|
79
|
+
input,
|
|
80
|
+
});
|
|
64
81
|
const hashes = result.screenshots.map(s => contentHash(s.image));
|
|
65
82
|
const isStable = hashes[0] === hashes[1] && hashes[1] === hashes[2];
|
|
66
83
|
results.push({
|