@vscode/component-explorer-cli 0.2.1-3 → 0.2.1-30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/dist/WorktreePool.d.ts +5 -4
- package/dist/WorktreePool.d.ts.map +1 -1
- package/dist/WorktreePool.js +3 -3
- package/dist/WorktreePool.js.map +1 -1
- package/dist/_virtual/_build-info.js +1 -1
- package/dist/browserPage.d.ts +51 -1
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +107 -1
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts +2 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +18 -10
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/checkStabilityCommand.d.ts +3 -0
- package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
- package/dist/commands/checkStabilityCommand.js +22 -4
- package/dist/commands/checkStabilityCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts +2 -1
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +27 -17
- package/dist/commands/compareCommand.js.map +1 -1
- package/dist/commands/inputArg.d.ts +33 -0
- package/dist/commands/inputArg.d.ts.map +1 -0
- package/dist/commands/inputArg.js +103 -0
- package/dist/commands/inputArg.js.map +1 -0
- package/dist/commands/mcpCommand.d.ts +3 -0
- package/dist/commands/mcpCommand.d.ts.map +1 -1
- package/dist/commands/mcpCommand.js +178 -45
- 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 +311 -23
- package/dist/commands/renderCommand.js.map +1 -1
- package/dist/commands/serveCommand.d.ts +2 -0
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +73 -41
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.d.ts +16 -0
- package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -0
- package/dist/commands/serviceDiffCommitsCommand.js +230 -0
- package/dist/commands/serviceDiffCommitsCommand.js.map +1 -0
- package/dist/commands/watchCommand.d.ts +2 -0
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +28 -16
- 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 +10 -10
- package/dist/comparison.js.map +1 -1
- package/dist/component-explorer-config.schema.json +55 -2
- package/dist/componentExplorer.d.ts +109 -11
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +235 -58
- 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 +42 -18
- package/dist/daemon/DaemonService.js.map +1 -1
- package/dist/daemon/approvalStore.d.ts +2 -1
- package/dist/daemon/approvalStore.d.ts.map +1 -1
- package/dist/daemon/approvalStore.js +4 -3
- package/dist/daemon/approvalStore.js.map +1 -1
- package/dist/daemon/client.d.ts +5 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +7 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/inProcessClient.d.ts +11 -0
- package/dist/daemon/inProcessClient.d.ts.map +1 -0
- package/dist/daemon/inProcessClient.js +35 -0
- package/dist/daemon/inProcessClient.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +8 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +13 -3
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/pipeClient.d.ts +2 -0
- package/dist/daemon/pipeClient.d.ts.map +1 -1
- package/dist/daemon/pipeClient.js +22 -3
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/pipeName.d.ts +7 -1
- package/dist/daemon/pipeName.d.ts.map +1 -1
- package/dist/daemon/pipeName.js +8 -4
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.d.ts.map +1 -1
- package/dist/daemon/pipeServer.js +9 -3
- package/dist/daemon/pipeServer.js.map +1 -1
- 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/evaluateFn.d.ts +21 -0
- package/dist/evaluateFn.d.ts.map +1 -0
- package/dist/evaluateFn.js +17 -0
- package/dist/evaluateFn.js.map +1 -0
- package/dist/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 -4
- package/dist/git/gitUtils.d.ts.map +1 -1
- package/dist/git/gitUtils.js +10 -5
- package/dist/git/gitUtils.js.map +1 -1
- package/dist/git/gitWorktreeManager.d.ts +15 -14
- package/dist/git/gitWorktreeManager.d.ts.map +1 -1
- package/dist/git/gitWorktreeManager.js +10 -11
- package/dist/git/gitWorktreeManager.js.map +1 -1
- package/dist/git/testUtils.d.ts +2 -1
- package/dist/git/testUtils.d.ts.map +1 -1
- package/dist/index.js +19 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +12 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +35 -2
- package/dist/logger.js.map +1 -1
- package/dist/manifest.schema.json +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 +384 -297
- 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 +31 -0
- package/dist/screenshotServiceClient.d.ts.map +1 -0
- package/dist/screenshotServiceClient.js +38 -0
- package/dist/screenshotServiceClient.js.map +1 -0
- package/dist/server/httpServer.d.ts +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 +91 -10
- 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 -25
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -23
- package/dist/utils.js.map +1 -1
- package/dist/visualCache.d.ts +2 -1
- package/dist/visualCache.d.ts.map +1 -1
- package/dist/visualCache.js +4 -3
- package/dist/visualCache.js.map +1 -1
- package/dist/viteProjectRef.d.ts +4 -12
- package/dist/viteProjectRef.d.ts.map +1 -1
- package/dist/viteProjectRef.js +9 -17
- package/dist/viteProjectRef.js.map +1 -1
- package/package.json +23 -19
- package/dist/commands/artifactCommand.d.ts +0 -13
- package/dist/commands/artifactCommand.d.ts.map +0 -1
- package/dist/commands/screenshotCommand.d.ts +0 -18
- 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`
|
|
@@ -175,3 +175,11 @@ component-explorer mcp --project config.json
|
|
|
175
175
|
## Global Options
|
|
176
176
|
|
|
177
177
|
All commands support `-v` / `--verbose` for increased log output. Use `-vv` for trace-level logging.
|
|
178
|
+
|
|
179
|
+
All commands also support `--log-file <path>` to append log messages to a file. This works in combination with `-v`/`-vv` to control what gets written. Multiple processes can safely append to the same file. Log entries include timestamp, log level, process type, and PID:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
2024-01-15T10:30:45.123Z [DEBUG] [serve] [pid:12345] Server started on port 5173
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
When the MCP server spawns a daemon, it inherits the verbosity level and log file path.
|
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
|
@@ -4,8 +4,29 @@ export interface BrowserPageFactory {
|
|
|
4
4
|
dispose(): Promise<void>;
|
|
5
5
|
}
|
|
6
6
|
export interface BrowserPage {
|
|
7
|
-
evaluateJs
|
|
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":"
|
|
1
|
+
{"version":3,"file":"browserPage.d.ts","sourceRoot":"","sources":["../src/browserPage.ts"],"names":[],"mappings":"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"}
|
package/dist/browserPage.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import { nullLogger } from './logger.js';
|
|
2
3
|
|
|
3
4
|
class PlaywrightBrowserPageFactory {
|
|
@@ -24,7 +25,7 @@ class PlaywrightBrowserPageFactory {
|
|
|
24
25
|
async openPage(url) {
|
|
25
26
|
if (!this._browser) {
|
|
26
27
|
const { chromium } = await import('playwright');
|
|
27
|
-
this._browser = await chromium.launch({ headless: !this._headed });
|
|
28
|
+
this._browser = await withWindowsHide(() => chromium.launch({ headless: !this._headed }));
|
|
28
29
|
}
|
|
29
30
|
const page = await this._browser.newPage();
|
|
30
31
|
page.on('console', (msg) => {
|
|
@@ -58,6 +59,12 @@ class PlaywrightBrowserPageFactory {
|
|
|
58
59
|
}
|
|
59
60
|
class PlaywrightBrowserPage {
|
|
60
61
|
_page;
|
|
62
|
+
_jsCoverageActive = false;
|
|
63
|
+
_jsCoverageAccumulated = [];
|
|
64
|
+
_cssCoverageActive = false;
|
|
65
|
+
_cssCoverageAccumulated = [];
|
|
66
|
+
_istanbulSnapshotActive = false;
|
|
67
|
+
_istanbulSnapshots = [];
|
|
61
68
|
constructor(_page) {
|
|
62
69
|
this._page = _page;
|
|
63
70
|
}
|
|
@@ -81,10 +88,109 @@ class PlaywrightBrowserPage {
|
|
|
81
88
|
return { ok: false, error: 'noDomNode' };
|
|
82
89
|
}
|
|
83
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
|
+
}
|
|
84
163
|
async dispose() {
|
|
85
164
|
await this._page.close();
|
|
86
165
|
}
|
|
87
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* Playwright doesn't pass `windowsHide: true` when spawning the browser process,
|
|
169
|
+
* which causes a visible console window when the daemon runs in the background.
|
|
170
|
+
* This temporarily patches `child_process.spawn` to inject `windowsHide: true`.
|
|
171
|
+
*/
|
|
172
|
+
async function withWindowsHide(fn) {
|
|
173
|
+
if (process.platform !== 'win32') {
|
|
174
|
+
return fn();
|
|
175
|
+
}
|
|
176
|
+
// Use createRequire to get the mutable CJS module object.
|
|
177
|
+
// ESM namespace objects (import * as X) are frozen and can't be patched.
|
|
178
|
+
const cp = createRequire(import.meta.url)('node:child_process');
|
|
179
|
+
const original = cp.spawn;
|
|
180
|
+
cp.spawn = function patchedSpawn(...args) {
|
|
181
|
+
const opts = typeof args[args.length - 1] === 'object' ? args[args.length - 1] : undefined;
|
|
182
|
+
if (opts && !('windowsHide' in opts)) {
|
|
183
|
+
opts.windowsHide = true;
|
|
184
|
+
}
|
|
185
|
+
return original.apply(this, args);
|
|
186
|
+
};
|
|
187
|
+
try {
|
|
188
|
+
return await fn();
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
cp.spawn = original;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
88
194
|
|
|
89
195
|
export { PlaywrightBrowserPageFactory };
|
|
90
196
|
//# sourceMappingURL=browserPage.js.map
|
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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"}
|
|
@@ -3,7 +3,8 @@ export declare class AcceptCommand extends Command {
|
|
|
3
3
|
static paths: string[][];
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
5
|
readonly verbose: number;
|
|
6
|
-
readonly
|
|
6
|
+
readonly logFile: string | undefined;
|
|
7
|
+
readonly fixtureIdRegex: string | undefined;
|
|
7
8
|
readonly project: string;
|
|
8
9
|
readonly screenshotDir: string;
|
|
9
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,
|
|
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 * 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';
|
|
6
5
|
import '../external/vscode-observables/observables/dist/observableInternal/observables/derived.js';
|
|
7
6
|
import '../external/vscode-observables/observables/dist/observableInternal/utils/utils.js';
|
|
8
7
|
import '../external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
9
|
-
import { ConsoleLogger, verbosityToLogLevel, logBuildInfo } from '../logger.js';
|
|
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,26 +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
|
+
fixtureIdRegex = Option.String('--fixture-id-regex', { required: false, description: 'Filter fixtures whose fixtureId matches this regular expression (unanchored)' });
|
|
24
25
|
project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
|
|
25
26
|
screenshotDir = Option.String('--screenshot-dir', '.screenshots', { description: 'Screenshots directory' });
|
|
26
27
|
async execute() {
|
|
27
28
|
const disposables = new DisposableStore();
|
|
28
|
-
const config = await ResolvedConfig.fromProjectPath(this.project, disposables);
|
|
29
|
+
const config = await ResolvedConfig.fromProjectPath(AbsolutePath.resolve(this.project), disposables);
|
|
29
30
|
const projectDir = config.configDir;
|
|
30
31
|
disposables.dispose();
|
|
31
|
-
const _logger = new ConsoleLogger('accept', this.context.stdout, verbosityToLogLevel(this.verbose));
|
|
32
|
+
const _logger = new ConsoleLogger('accept', this.context.stdout, verbosityToLogLevel(this.verbose), createLogFileOptions(this.logFile, this.verbose));
|
|
32
33
|
logBuildInfo(_logger);
|
|
33
|
-
const screenshotPath =
|
|
34
|
+
const screenshotPath = AbsolutePath.fromAbsoluteOrRelative(this.screenshotDir, { base: projectDir });
|
|
34
35
|
const storage = new FileSystemStorage(screenshotPath);
|
|
35
36
|
let currentFiles = await storage.list('current');
|
|
36
|
-
if (this.
|
|
37
|
-
|
|
38
|
-
|
|
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$/, '')));
|
|
39
47
|
}
|
|
40
48
|
if (currentFiles.length === 0) {
|
|
41
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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"}
|
|
@@ -3,10 +3,13 @@ export declare class CheckStabilityCommand extends Command {
|
|
|
3
3
|
static paths: string[][];
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
5
|
readonly verbose: number;
|
|
6
|
+
readonly logFile: string | undefined;
|
|
6
7
|
readonly project: string;
|
|
7
8
|
readonly labelPattern: string | undefined;
|
|
8
9
|
readonly headed: boolean;
|
|
9
10
|
readonly timeout: string;
|
|
11
|
+
readonly reloadBetweenFixtures: boolean;
|
|
12
|
+
readonly input: string | undefined;
|
|
10
13
|
execute(): Promise<number>;
|
|
11
14
|
}
|
|
12
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"}
|
|
@@ -6,10 +6,12 @@ import '../external/vscode-observables/observables/dist/observableInternal/obser
|
|
|
6
6
|
import '../external/vscode-observables/observables/dist/observableInternal/utils/utils.js';
|
|
7
7
|
import '../external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
8
8
|
import { PlaywrightBrowserPageFactory } from '../browserPage.js';
|
|
9
|
-
import { ConsoleLogger, verbosityToLogLevel, logBuildInfo } from '../logger.js';
|
|
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']];
|
|
@@ -21,13 +23,24 @@ class CheckStabilityCommand extends Command {
|
|
|
21
23
|
],
|
|
22
24
|
});
|
|
23
25
|
verbose = Option.Counter('-v,--verbose', 0, { description: 'Increase log verbosity (-v debug, -vv trace)' });
|
|
26
|
+
logFile = Option.String('--log-file', { description: 'Append logs to this file (works with -v/-vv)' });
|
|
24
27
|
project = Option.String('-p,--project', process.cwd(), { description: 'Project: a directory, vite config file, or component-explorer.json' });
|
|
25
28
|
labelPattern = Option.String('--label-pattern', { required: false, description: 'RegExp to filter fixtures by label (matched against inherited labels)' });
|
|
26
29
|
headed = Option.Boolean('--headed', false, { description: 'Show the browser window (useful for debugging)' });
|
|
27
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.' });
|
|
28
33
|
async execute() {
|
|
29
|
-
const logger = new ConsoleLogger('check-stability', this.context.stderr, verbosityToLogLevel(this.verbose));
|
|
34
|
+
const logger = new ConsoleLogger('check-stability', this.context.stderr, verbosityToLogLevel(this.verbose), createLogFileOptions(this.logFile, this.verbose));
|
|
30
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
|
+
}
|
|
31
44
|
let labelRegex;
|
|
32
45
|
if (this.labelPattern) {
|
|
33
46
|
try {
|
|
@@ -39,7 +52,7 @@ class CheckStabilityCommand extends Command {
|
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
54
|
const disposables = new DisposableStore();
|
|
42
|
-
const config = await ResolvedConfig.fromProjectPath(this.project, disposables);
|
|
55
|
+
const config = await ResolvedConfig.fromProjectPath(AbsolutePath.resolve(this.project), disposables);
|
|
43
56
|
const serverConfig = config.sessions[0].server;
|
|
44
57
|
const browserFactory = new PlaywrightBrowserPageFactory(this.headed, Number(this.timeout));
|
|
45
58
|
let session;
|
|
@@ -59,7 +72,12 @@ class CheckStabilityCommand extends Command {
|
|
|
59
72
|
for (let i = 0; i < fixtures.length; i++) {
|
|
60
73
|
const fixture = fixtures[i];
|
|
61
74
|
this.context.stderr.write(`[${i + 1}/${fixtures.length}] Checking ${fixture.fixtureId}...`);
|
|
62
|
-
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
|
+
});
|
|
63
81
|
const hashes = result.screenshots.map(s => contentHash(s.image));
|
|
64
82
|
const isStable = hashes[0] === hashes[1] && hashes[1] === hashes[2];
|
|
65
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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"}
|
|
@@ -3,7 +3,8 @@ export declare class CompareCommand extends Command {
|
|
|
3
3
|
static paths: string[][];
|
|
4
4
|
static usage: import("clipanion").Usage;
|
|
5
5
|
readonly verbose: number;
|
|
6
|
-
readonly
|
|
6
|
+
readonly logFile: string | undefined;
|
|
7
|
+
readonly fixtureIdRegex: string | undefined;
|
|
7
8
|
readonly project: string;
|
|
8
9
|
readonly baseline: string;
|
|
9
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"}
|