@vscode/component-explorer-cli 0.2.1-5 → 0.2.1-50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/WorktreePool.d.ts +5 -4
- package/dist/WorktreePool.d.ts.map +1 -1
- package/dist/WorktreePool.js +3 -3
- package/dist/WorktreePool.js.map +1 -1
- package/dist/_virtual/_build-info.js +1 -1
- package/dist/browserPage.d.ts +50 -0
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +78 -0
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts +1 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +15 -8
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/checkStabilityCommand.d.ts +2 -0
- package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
- package/dist/commands/checkStabilityCommand.js +19 -2
- package/dist/commands/checkStabilityCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts +1 -1
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +24 -15
- package/dist/commands/compareCommand.js.map +1 -1
- package/dist/commands/inputArg.d.ts +33 -0
- package/dist/commands/inputArg.d.ts.map +1 -0
- package/dist/commands/inputArg.js +103 -0
- package/dist/commands/inputArg.js.map +1 -0
- package/dist/commands/mcpCommand.d.ts +0 -2
- package/dist/commands/mcpCommand.d.ts.map +1 -1
- package/dist/commands/mcpCommand.js +136 -68
- package/dist/commands/mcpCommand.js.map +1 -1
- package/dist/commands/renderCommand.d.ts +9 -1
- package/dist/commands/renderCommand.d.ts.map +1 -1
- package/dist/commands/renderCommand.js +308 -21
- package/dist/commands/renderCommand.js.map +1 -1
- package/dist/commands/serveCommand.d.ts +1 -0
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +11 -6
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.d.ts +1 -0
- package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.js +34 -28
- package/dist/commands/serviceDiffCommitsCommand.js.map +1 -1
- package/dist/commands/watchCommand.d.ts +1 -0
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +24 -13
- package/dist/commands/watchCommand.js.map +1 -1
- package/dist/comparison.d.ts +4 -3
- package/dist/comparison.d.ts.map +1 -1
- package/dist/comparison.js +17 -14
- package/dist/comparison.js.map +1 -1
- package/dist/component-explorer-config.schema.json +55 -2
- package/dist/componentExplorer.d.ts +106 -11
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +159 -16
- package/dist/componentExplorer.js.map +1 -1
- package/dist/config.d.ts +33 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +64 -27
- package/dist/config.js.map +1 -1
- package/dist/coverage.d.ts +64 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +212 -0
- package/dist/coverage.js.map +1 -0
- package/dist/daemon/DaemonService.d.ts +14 -5
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +39 -15
- package/dist/daemon/DaemonService.js.map +1 -1
- package/dist/daemon/approvalStore.d.ts +2 -1
- package/dist/daemon/approvalStore.d.ts.map +1 -1
- package/dist/daemon/approvalStore.js +4 -3
- package/dist/daemon/approvalStore.js.map +1 -1
- package/dist/daemon/inProcessClient.js +2 -2
- package/dist/daemon/lifecycle.d.ts +4 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +1 -1
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/pipeClient.d.ts +2 -0
- package/dist/daemon/pipeClient.d.ts.map +1 -1
- package/dist/daemon/pipeClient.js +21 -3
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/pipeName.d.ts +3 -3
- package/dist/daemon/pipeName.d.ts.map +1 -1
- package/dist/daemon/pipeName.js +1 -2
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.js +2 -2
- package/dist/daemon/version.d.ts +1 -1
- package/dist/daemon/version.js +1 -1
- package/dist/dependencyInstaller.d.ts +2 -1
- package/dist/dependencyInstaller.d.ts.map +1 -1
- package/dist/dependencyInstaller.js +4 -4
- package/dist/dependencyInstaller.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js +3 -2
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/experimental/manualObserver.js +85 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/experimental/manualObserver.js.map +1 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/index.js +3 -3
- package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +171 -28
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js +9 -6
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js +11 -8
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js +7 -5
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js +16 -0
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +1 -1
- package/dist/git/gitCommitResolver.d.ts +2 -1
- package/dist/git/gitCommitResolver.d.ts.map +1 -1
- package/dist/git/gitCommitResolver.js +2 -2
- package/dist/git/gitCommitResolver.js.map +1 -1
- package/dist/git/gitIndexResolver.d.ts +2 -1
- package/dist/git/gitIndexResolver.d.ts.map +1 -1
- package/dist/git/gitIndexResolver.js +1 -1
- package/dist/git/gitIndexResolver.js.map +1 -1
- package/dist/git/gitService.d.ts +5 -4
- package/dist/git/gitService.d.ts.map +1 -1
- package/dist/git/gitService.js.map +1 -1
- package/dist/git/gitUtils.d.ts +6 -5
- package/dist/git/gitUtils.d.ts.map +1 -1
- package/dist/git/gitUtils.js +5 -4
- package/dist/git/gitUtils.js.map +1 -1
- package/dist/git/gitWorktreeManager.d.ts +15 -14
- package/dist/git/gitWorktreeManager.d.ts.map +1 -1
- package/dist/git/gitWorktreeManager.js +10 -11
- package/dist/git/gitWorktreeManager.js.map +1 -1
- package/dist/git/testUtils.d.ts +2 -1
- package/dist/git/testUtils.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest.schema.json +38 -16
- package/dist/mcp/DaemonAccessor.d.ts +22 -0
- package/dist/mcp/DaemonAccessor.d.ts.map +1 -0
- package/dist/mcp/McpServer.d.ts +5 -19
- package/dist/mcp/McpServer.d.ts.map +1 -1
- package/dist/mcp/McpServer.js +367 -281
- package/dist/mcp/McpServer.js.map +1 -1
- package/dist/packages/common/dist/explorerUrl.js +21 -0
- package/dist/packages/common/dist/explorerUrl.js.map +1 -0
- package/dist/packages/common/dist/renderManifest.js +26 -5
- package/dist/packages/common/dist/renderManifest.js.map +1 -1
- package/dist/packages/simple-api/dist/{chunk-3R7GHWBM.js → chunk-FJ7AVNQE.js} +2 -1
- package/dist/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +1 -0
- package/dist/packages/simple-api/dist/{chunk-SGBCNXYH.js → chunk-TTRCY65Z.js} +4 -1
- package/dist/packages/simple-api/dist/chunk-TTRCY65Z.js.map +1 -0
- package/dist/packages/simple-api/dist/{chunk-TAEFVNPN.js → chunk-WNXMRXWV.js} +2 -1
- package/dist/packages/simple-api/dist/chunk-WNXMRXWV.js.map +1 -0
- package/dist/packages/simple-api/dist/express.js +1 -1
- package/dist/packages/simple-api/dist/express.js.map +1 -1
- package/dist/path.d.ts +30 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +78 -0
- package/dist/path.js.map +1 -0
- package/dist/processTree.d.ts +9 -0
- package/dist/processTree.d.ts.map +1 -0
- package/dist/processTree.js +41 -0
- package/dist/processTree.js.map +1 -0
- package/dist/screenshotServiceClient.d.ts +5 -1
- package/dist/screenshotServiceClient.d.ts.map +1 -1
- package/dist/screenshotServiceClient.js +8 -2
- package/dist/screenshotServiceClient.js.map +1 -1
- package/dist/server/httpServer.d.ts +1 -1
- package/dist/server/httpServer.d.ts.map +1 -1
- package/dist/server/httpServer.js +22 -20
- package/dist/server/httpServer.js.map +1 -1
- package/dist/server/serverConfig.d.ts +23 -6
- package/dist/server/serverConfig.d.ts.map +1 -1
- package/dist/server/serverConfig.js +11 -18
- package/dist/server/serverConfig.js.map +1 -1
- package/dist/server/viteServer.d.ts +16 -1
- package/dist/server/viteServer.d.ts.map +1 -1
- package/dist/server/viteServer.js +86 -5
- package/dist/server/viteServer.js.map +1 -1
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/utils.d.ts +3 -30
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -24
- package/dist/utils.js.map +1 -1
- package/dist/visualCache.d.ts +2 -1
- package/dist/visualCache.d.ts.map +1 -1
- package/dist/visualCache.js +4 -3
- package/dist/visualCache.js.map +1 -1
- package/dist/viteProjectRef.d.ts +4 -12
- package/dist/viteProjectRef.d.ts.map +1 -1
- package/dist/viteProjectRef.js +9 -17
- package/dist/viteProjectRef.js.map +1 -1
- package/package.json +20 -19
- package/dist/commands/artifactCommand.d.ts +0 -14
- package/dist/commands/artifactCommand.d.ts.map +0 -1
- package/dist/commands/screenshotCommand.d.ts +0 -19
- package/dist/commands/screenshotCommand.d.ts.map +0 -1
- package/dist/packages/simple-api/dist/chunk-3R7GHWBM.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-SGBCNXYH.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-TAEFVNPN.js.map +0 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ component-explorer screenshot [options]
|
|
|
23
23
|
| Option | Description |
|
|
24
24
|
|---|---|
|
|
25
25
|
| `-p, --project <path>` | Project: a directory, vite config file, or component-explorer.json (default: cwd) |
|
|
26
|
-
| `--
|
|
26
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
27
27
|
| `--accept` | Write to baseline instead of current (mutually exclusive with `--target`) |
|
|
28
28
|
| `--target <dir>` | Screenshot output directory (default: `.screenshots/current`, or `.screenshots/baseline` with `--accept`) |
|
|
29
29
|
| `--compare` | Compare screenshots after capturing |
|
|
@@ -41,8 +41,8 @@ component-explorer screenshot --accept
|
|
|
41
41
|
# Capture, then compare against baseline
|
|
42
42
|
component-explorer screenshot --compare
|
|
43
43
|
|
|
44
|
-
# Filter by
|
|
45
|
-
component-explorer screenshot --
|
|
44
|
+
# Filter by fixture-id regex
|
|
45
|
+
component-explorer screenshot --fixture-id-regex "^Button/"
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
### `screenshot:compare`
|
|
@@ -58,7 +58,7 @@ component-explorer screenshot:compare [options]
|
|
|
58
58
|
| `-p, --project <path>` | Project directory (default: cwd) |
|
|
59
59
|
| `--baseline <dir>` | Baseline screenshots directory (default: `.screenshots/baseline`) |
|
|
60
60
|
| `--current <dir>` | Current screenshots directory (default: `.screenshots/current`) |
|
|
61
|
-
| `--
|
|
61
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
62
62
|
| `--report <dir>` | Output report folder (contains report.json, report.md, and changed screenshots) |
|
|
63
63
|
| `-v, --verbose` | Increase log verbosity |
|
|
64
64
|
|
|
@@ -86,7 +86,7 @@ component-explorer screenshot:accept [options]
|
|
|
86
86
|
| Option | Description |
|
|
87
87
|
|---|---|
|
|
88
88
|
| `-p, --project <path>` | Project directory (default: cwd) |
|
|
89
|
-
| `--
|
|
89
|
+
| `--fixture-id-regex <regex>` | Filter fixtures whose fixtureId matches this regular expression (unanchored) |
|
|
90
90
|
| `--screenshot-dir <dir>` | Screenshots directory (default: `.screenshots`) |
|
|
91
91
|
| `-v, --verbose` | Increase log verbosity |
|
|
92
92
|
|
|
@@ -95,7 +95,7 @@ component-explorer screenshot:accept [options]
|
|
|
95
95
|
component-explorer screenshot:accept
|
|
96
96
|
|
|
97
97
|
# Accept specific fixtures
|
|
98
|
-
component-explorer screenshot:accept --
|
|
98
|
+
component-explorer screenshot:accept --fixture-id-regex "^Button/"
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
### `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,6 +6,27 @@ 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
|
}
|
|
11
32
|
export type ScreenshotResult = {
|
|
@@ -15,6 +36,35 @@ export type ScreenshotResult = {
|
|
|
15
36
|
ok: false;
|
|
16
37
|
error: 'noDomNode';
|
|
17
38
|
};
|
|
39
|
+
/**
|
|
40
|
+
* Raw V8 JavaScript coverage entry as returned by Playwright's `page.coverage.stopJSCoverage()`.
|
|
41
|
+
* Compatible with the input shape of `v8-to-istanbul`.
|
|
42
|
+
*/
|
|
43
|
+
export interface JSCoverageEntry {
|
|
44
|
+
readonly url: string;
|
|
45
|
+
readonly scriptId: string;
|
|
46
|
+
readonly source?: string;
|
|
47
|
+
readonly functions: readonly {
|
|
48
|
+
readonly functionName: string;
|
|
49
|
+
readonly isBlockCoverage: boolean;
|
|
50
|
+
readonly ranges: readonly {
|
|
51
|
+
readonly startOffset: number;
|
|
52
|
+
readonly endOffset: number;
|
|
53
|
+
readonly count: number;
|
|
54
|
+
}[];
|
|
55
|
+
}[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* CSS coverage entry as returned by Playwright's `page.coverage.stopCSSCoverage()`.
|
|
59
|
+
*/
|
|
60
|
+
export interface CSSCoverageEntry {
|
|
61
|
+
readonly url: string;
|
|
62
|
+
readonly text?: string;
|
|
63
|
+
readonly ranges: readonly {
|
|
64
|
+
readonly start: number;
|
|
65
|
+
readonly end: number;
|
|
66
|
+
}[];
|
|
67
|
+
}
|
|
18
68
|
export declare class PlaywrightBrowserPageFactory implements BrowserPageFactory {
|
|
19
69
|
readonly timeoutMs: number;
|
|
20
70
|
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,WAAW,CAAA;CAAE,CAAC;AAExG,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;IA+B3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI9B"}
|
|
1
|
+
{"version":3,"file":"browserPage.d.ts","sourceRoot":"","sources":["../src/browserPage.ts"],"names":[],"mappings":"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"}
|
package/dist/browserPage.js
CHANGED
|
@@ -59,6 +59,12 @@ class PlaywrightBrowserPageFactory {
|
|
|
59
59
|
}
|
|
60
60
|
class PlaywrightBrowserPage {
|
|
61
61
|
_page;
|
|
62
|
+
_jsCoverageActive = false;
|
|
63
|
+
_jsCoverageAccumulated = [];
|
|
64
|
+
_cssCoverageActive = false;
|
|
65
|
+
_cssCoverageAccumulated = [];
|
|
66
|
+
_istanbulSnapshotActive = false;
|
|
67
|
+
_istanbulSnapshots = [];
|
|
62
68
|
constructor(_page) {
|
|
63
69
|
this._page = _page;
|
|
64
70
|
}
|
|
@@ -82,6 +88,78 @@ class PlaywrightBrowserPage {
|
|
|
82
88
|
return { ok: false, error: 'noDomNode' };
|
|
83
89
|
}
|
|
84
90
|
}
|
|
91
|
+
async reload() {
|
|
92
|
+
// Chrome's `CSS.startRuleUsageTracking` and V8's precise coverage are
|
|
93
|
+
// both bound to the document; on reload the data is gone even with
|
|
94
|
+
// Playwright's `resetOnNavigation: false`. Snapshot before reload and
|
|
95
|
+
// restart afterwards so callers see the union across the entire
|
|
96
|
+
// tracking window. Same for vite-plugin-istanbul's `window.__coverage__`,
|
|
97
|
+
// which lives in JS memory and is wiped on reload.
|
|
98
|
+
if (this._cssCoverageActive) {
|
|
99
|
+
const entries = await this._page.coverage.stopCSSCoverage();
|
|
100
|
+
this._cssCoverageAccumulated.push(...entries);
|
|
101
|
+
}
|
|
102
|
+
if (this._jsCoverageActive) {
|
|
103
|
+
const entries = await this._page.coverage.stopJSCoverage();
|
|
104
|
+
this._jsCoverageAccumulated.push(...entries);
|
|
105
|
+
}
|
|
106
|
+
if (this._istanbulSnapshotActive) {
|
|
107
|
+
try {
|
|
108
|
+
const snap = await this._page.evaluate('window.__coverage__ ?? null');
|
|
109
|
+
if (snap) {
|
|
110
|
+
this._istanbulSnapshots.push(snap);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Page may be in a transitional state; skip this snapshot.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
await this._page.reload({ waitUntil: 'networkidle' });
|
|
118
|
+
if (this._cssCoverageActive) {
|
|
119
|
+
await this._page.coverage.startCSSCoverage({ resetOnNavigation: false });
|
|
120
|
+
}
|
|
121
|
+
if (this._jsCoverageActive) {
|
|
122
|
+
await this._page.coverage.startJSCoverage({ resetOnNavigation: false });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async startJSCoverage(options) {
|
|
126
|
+
this._jsCoverageActive = true;
|
|
127
|
+
this._jsCoverageAccumulated = [];
|
|
128
|
+
await this._page.coverage.startJSCoverage({
|
|
129
|
+
resetOnNavigation: options?.resetOnNavigation ?? false,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
async stopJSCoverage() {
|
|
133
|
+
this._jsCoverageActive = false;
|
|
134
|
+
const final = await this._page.coverage.stopJSCoverage();
|
|
135
|
+
const all = [...this._jsCoverageAccumulated, ...final];
|
|
136
|
+
this._jsCoverageAccumulated = [];
|
|
137
|
+
return all;
|
|
138
|
+
}
|
|
139
|
+
async startCSSCoverage(options) {
|
|
140
|
+
this._cssCoverageActive = true;
|
|
141
|
+
this._cssCoverageAccumulated = [];
|
|
142
|
+
await this._page.coverage.startCSSCoverage({
|
|
143
|
+
resetOnNavigation: options?.resetOnNavigation ?? false,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async stopCSSCoverage() {
|
|
147
|
+
this._cssCoverageActive = false;
|
|
148
|
+
const final = await this._page.coverage.stopCSSCoverage();
|
|
149
|
+
const all = [...this._cssCoverageAccumulated, ...final];
|
|
150
|
+
this._cssCoverageAccumulated = [];
|
|
151
|
+
return all;
|
|
152
|
+
}
|
|
153
|
+
startIstanbulSnapshot() {
|
|
154
|
+
this._istanbulSnapshotActive = true;
|
|
155
|
+
this._istanbulSnapshots = [];
|
|
156
|
+
}
|
|
157
|
+
stopIstanbulSnapshot() {
|
|
158
|
+
this._istanbulSnapshotActive = false;
|
|
159
|
+
const snaps = this._istanbulSnapshots;
|
|
160
|
+
this._istanbulSnapshots = [];
|
|
161
|
+
return snaps;
|
|
162
|
+
}
|
|
85
163
|
async dispose() {
|
|
86
164
|
await this._page.close();
|
|
87
165
|
}
|
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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"}
|
|
@@ -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,5 +1,4 @@
|
|
|
1
1
|
import { Command, Option } from 'clipanion';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
2
|
import '../external/vscode-observables/observables/dist/observableInternal/index.js';
|
|
4
3
|
import { DisposableStore } from '../external/vscode-observables/observables/dist/disposables.js';
|
|
5
4
|
import '../external/vscode-observables/observables/dist/observableInternal/debugLocation.js';
|
|
@@ -9,6 +8,7 @@ import '../external/vscode-observables/observables/dist/observableInternal/obser
|
|
|
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"}
|
|
@@ -8,8 +8,10 @@ import '../external/vscode-observables/observables/dist/observableInternal/obser
|
|
|
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({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkStabilityCommand.js","sources":["../../src/commands/checkStabilityCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkStabilityCommand.js","sources":["../../src/commands/checkStabilityCommand.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ export declare class CompareCommand 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 baseline: string;
|
|
10
10
|
readonly current: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compareCommand.d.ts","sourceRoot":"","sources":["../../src/commands/compareCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"compareCommand.d.ts","sourceRoot":"","sources":["../../src/commands/compareCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAC;AAY5C,qBAAa,cAAe,SAAQ,OAAO;IAC1C,OAAgB,KAAK,aAAwB;IAE7C,OAAgB,KAAK,4BAOlB;IAEH,QAAQ,CAAC,OAAO,SAAsG;IACtH,QAAQ,CAAC,OAAO,qBAAgG;IAChH,QAAQ,CAAC,cAAc,qBAAyJ;IAChL,QAAQ,CAAC,OAAO,SAAuI;IACvJ,QAAQ,CAAC,QAAQ,SAAsI;IACvJ,QAAQ,CAAC,OAAO,SAAmI;IACnJ,QAAQ,CAAC,MAAM,qBAAoK;IACnL,QAAQ,CAAC,YAAY,uBAAuI;IAEtJ,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CA+DhC"}
|
|
@@ -11,7 +11,8 @@ import { compareScreenshotsOnDisk, printComparisonToConsole, writeComparisonRepo
|
|
|
11
11
|
import { ConsoleLogger, verbosityToLogLevel, createLogFileOptions, logBuildInfo } from '../logger.js';
|
|
12
12
|
import { FileSystemStorage } from '../storage.js';
|
|
13
13
|
import { ResolvedConfig } from '../config.js';
|
|
14
|
-
import {
|
|
14
|
+
import { AbsolutePath } from '../path.js';
|
|
15
|
+
import { listPngFiles } from '../utils.js';
|
|
15
16
|
import '../renderManifest.js';
|
|
16
17
|
import { MANIFEST_FILENAME } from '../packages/common/dist/renderManifest.js';
|
|
17
18
|
|
|
@@ -27,43 +28,51 @@ class CompareCommand extends Command {
|
|
|
27
28
|
});
|
|
28
29
|
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
29
30
|
logFile = Option.String('--log-file', { description: 'Append logs to this file (works with -v/-vv)' });
|
|
30
|
-
|
|
31
|
+
fixtureIdRegex = Option.String('--fixture-id-regex', { required: false, description: 'Filter fixtures whose fixtureId matches this regular expression (unanchored)' });
|
|
31
32
|
project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
|
|
32
|
-
baseline = Option.String('--baseline', '.screenshots/baseline', { description: 'Baseline screenshots directory' });
|
|
33
|
-
current = Option.String('--current', '.screenshots/current', { description: 'Current screenshots directory' });
|
|
34
|
-
report = Option.String('--report', { required: false, description: 'Output report folder (contains report.json, report.md, and changed screenshots)' });
|
|
33
|
+
baseline = Option.String('--baseline', '.screenshots/baseline', { description: 'Baseline screenshots directory, relative to project file.' });
|
|
34
|
+
current = Option.String('--current', '.screenshots/current', { description: 'Current screenshots directory, relative to project file.' });
|
|
35
|
+
report = Option.String('--report', { required: false, description: 'Output report folder (contains report.json, report.md, and changed screenshots), relative to cwd.' });
|
|
35
36
|
failOnLabels = Option.Array('--fail-on-labels', { required: false, description: 'Only fail when fixtures with any of these labels have changes' });
|
|
36
37
|
async execute() {
|
|
37
38
|
const disposables = new DisposableStore();
|
|
38
|
-
const config = await ResolvedConfig.fromProjectPath(this.project, disposables);
|
|
39
|
+
const config = await ResolvedConfig.fromProjectPath(AbsolutePath.resolve(this.project), disposables);
|
|
39
40
|
const projectDir = config.configDir;
|
|
40
41
|
disposables.dispose();
|
|
41
42
|
const _logger = new ConsoleLogger('compare', this.context.stdout, verbosityToLogLevel(this.verbose), createLogFileOptions(this.logFile, this.verbose));
|
|
42
43
|
logBuildInfo(_logger);
|
|
43
|
-
const baselineDir =
|
|
44
|
-
const currentDir =
|
|
44
|
+
const baselineDir = AbsolutePath.fromAbsoluteOrRelative(this.baseline, { base: projectDir });
|
|
45
|
+
const currentDir = AbsolutePath.fromAbsoluteOrRelative(this.current, { base: projectDir });
|
|
45
46
|
const baselineStorage = new FileSystemStorage(baselineDir);
|
|
46
47
|
const currentStorage = new FileSystemStorage(currentDir);
|
|
47
48
|
// List all PNG files
|
|
48
49
|
let baselineFiles = await listPngFiles(baselineDir);
|
|
49
50
|
let currentFiles = await listPngFiles(currentDir);
|
|
50
51
|
// Apply filter if specified
|
|
51
|
-
if (this.
|
|
52
|
-
|
|
52
|
+
if (this.fixtureIdRegex) {
|
|
53
|
+
let regex;
|
|
54
|
+
try {
|
|
55
|
+
regex = new RegExp(this.fixtureIdRegex);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
this.context.stderr.write(`Error: Invalid --fixture-id-regex: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
59
|
+
return 1;
|
|
60
|
+
}
|
|
61
|
+
const filterFn = (file) => regex.test(file.replace(/\.png$/, ''));
|
|
53
62
|
baselineFiles = baselineFiles.filter(filterFn);
|
|
54
63
|
currentFiles = currentFiles.filter(filterFn);
|
|
55
64
|
}
|
|
56
|
-
const currentMetadata = await readFixturesJson(currentDir);
|
|
57
|
-
const baselineMetadata = await readFixturesJson(baselineDir);
|
|
65
|
+
const currentMetadata = await readFixturesJson(currentDir.value);
|
|
66
|
+
const baselineMetadata = await readFixturesJson(baselineDir.value);
|
|
58
67
|
const result = await compareScreenshotsOnDisk({ list: async () => currentFiles, read: (id) => currentStorage.read(id), exists: (id) => currentStorage.exists(id) }, { list: async () => baselineFiles, read: (id) => baselineStorage.read(id), exists: (id) => baselineStorage.exists(id) }, currentFiles, baselineFiles, { currentMetadata, baselineMetadata });
|
|
59
68
|
printComparisonToConsole(result, this.context.stdout);
|
|
60
69
|
if (this.report) {
|
|
61
|
-
const reportDir =
|
|
70
|
+
const reportDir = AbsolutePath.fromAbsoluteOrRelative(this.report, { base: AbsolutePath.resolve('.') });
|
|
62
71
|
await writeComparisonReport({
|
|
63
72
|
reportDir,
|
|
64
73
|
result,
|
|
65
|
-
baselinePath:
|
|
66
|
-
currentPath:
|
|
74
|
+
baselinePath: baselineDir,
|
|
75
|
+
currentPath: currentDir,
|
|
67
76
|
getBaselineData: (id) => baselineStorage.read(`${id}.png`),
|
|
68
77
|
getCurrentData: (id) => currentStorage.read(`${id}.png`),
|
|
69
78
|
});
|