@vscode/component-explorer-cli 0.2.1-1 → 0.2.1-100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -6
- package/dist/WorktreePool.d.ts +5 -4
- package/dist/WorktreePool.d.ts.map +1 -1
- package/dist/WorktreePool.js +3 -3
- package/dist/WorktreePool.js.map +1 -1
- package/dist/_virtual/_build-info.js +1 -1
- package/dist/browserPage.d.ts +54 -4
- package/dist/browserPage.d.ts.map +1 -1
- package/dist/browserPage.js +113 -2
- package/dist/browserPage.js.map +1 -1
- package/dist/commands/acceptCommand.d.ts +2 -1
- package/dist/commands/acceptCommand.d.ts.map +1 -1
- package/dist/commands/acceptCommand.js +30 -14
- package/dist/commands/acceptCommand.js.map +1 -1
- package/dist/commands/checkStabilityCommand.d.ts +3 -0
- package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
- package/dist/commands/checkStabilityCommand.js +39 -18
- package/dist/commands/checkStabilityCommand.js.map +1 -1
- package/dist/commands/compareCommand.d.ts +2 -1
- package/dist/commands/compareCommand.d.ts.map +1 -1
- package/dist/commands/compareCommand.js +53 -25
- package/dist/commands/compareCommand.js.map +1 -1
- package/dist/commands/inputArg.d.ts +33 -0
- package/dist/commands/inputArg.d.ts.map +1 -0
- package/dist/commands/inputArg.js +103 -0
- package/dist/commands/inputArg.js.map +1 -0
- package/dist/commands/mcpCommand.d.ts +3 -0
- package/dist/commands/mcpCommand.d.ts.map +1 -1
- package/dist/commands/mcpCommand.js +189 -51
- package/dist/commands/mcpCommand.js.map +1 -1
- package/dist/commands/renderCommand.d.ts +28 -0
- package/dist/commands/renderCommand.d.ts.map +1 -0
- package/dist/commands/renderCommand.js +495 -0
- package/dist/commands/renderCommand.js.map +1 -0
- package/dist/commands/serveCommand.d.ts +2 -0
- package/dist/commands/serveCommand.d.ts.map +1 -1
- package/dist/commands/serveCommand.js +85 -44
- package/dist/commands/serveCommand.js.map +1 -1
- package/dist/commands/serviceDiffCommitsCommand.d.ts +16 -0
- package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -0
- package/dist/commands/serviceDiffCommitsCommand.js +230 -0
- package/dist/commands/serviceDiffCommitsCommand.js.map +1 -0
- package/dist/commands/watchCommand.d.ts +2 -0
- package/dist/commands/watchCommand.d.ts.map +1 -1
- package/dist/commands/watchCommand.js +47 -41
- package/dist/commands/watchCommand.js.map +1 -1
- package/dist/comparison.d.ts +4 -3
- package/dist/comparison.d.ts.map +1 -1
- package/dist/comparison.js +17 -14
- package/dist/comparison.js.map +1 -1
- package/dist/component-explorer-config.schema.json +55 -2
- package/dist/componentExplorer.d.ts +122 -20
- package/dist/componentExplorer.d.ts.map +1 -1
- package/dist/componentExplorer.js +250 -78
- package/dist/componentExplorer.js.map +1 -1
- package/dist/{watchConfig.d.ts → config.d.ts} +59 -26
- package/dist/config.d.ts.map +1 -0
- package/dist/{watchConfig.js → config.js} +108 -31
- package/dist/config.js.map +1 -0
- package/dist/coverage.d.ts +64 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +212 -0
- package/dist/coverage.js.map +1 -0
- package/dist/daemon/DaemonService.d.ts +17 -8
- package/dist/daemon/DaemonService.d.ts.map +1 -1
- package/dist/daemon/DaemonService.js +64 -57
- package/dist/daemon/DaemonService.js.map +1 -1
- package/dist/daemon/approvalStore.d.ts +2 -1
- package/dist/daemon/approvalStore.d.ts.map +1 -1
- package/dist/daemon/approvalStore.js +4 -3
- package/dist/daemon/approvalStore.js.map +1 -1
- package/dist/daemon/client.d.ts +5 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +7 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/inProcessClient.d.ts +11 -0
- package/dist/daemon/inProcessClient.d.ts.map +1 -0
- package/dist/daemon/inProcessClient.js +35 -0
- package/dist/daemon/inProcessClient.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +8 -1
- package/dist/daemon/lifecycle.d.ts.map +1 -1
- package/dist/daemon/lifecycle.js +13 -3
- package/dist/daemon/lifecycle.js.map +1 -1
- package/dist/daemon/pipeClient.d.ts +2 -0
- package/dist/daemon/pipeClient.d.ts.map +1 -1
- package/dist/daemon/pipeClient.js +29 -9
- package/dist/daemon/pipeClient.js.map +1 -1
- package/dist/daemon/pipeName.d.ts +7 -1
- package/dist/daemon/pipeName.d.ts.map +1 -1
- package/dist/daemon/pipeName.js +8 -4
- package/dist/daemon/pipeName.js.map +1 -1
- package/dist/daemon/pipeServer.d.ts.map +1 -1
- package/dist/daemon/pipeServer.js +10 -4
- package/dist/daemon/pipeServer.js.map +1 -1
- package/dist/daemon/version.d.ts +2 -2
- package/dist/daemon/version.d.ts.map +1 -1
- package/dist/daemon/version.js +2 -2
- package/dist/dependencyInstaller.d.ts +3 -2
- package/dist/dependencyInstaller.d.ts.map +1 -1
- package/dist/dependencyInstaller.js +4 -4
- package/dist/dependencyInstaller.js.map +1 -1
- package/dist/evaluateFn.d.ts +21 -0
- package/dist/evaluateFn.d.ts.map +1 -0
- package/dist/evaluateFn.js +17 -0
- package/dist/evaluateFn.js.map +1 -0
- package/dist/explorerSession.d.ts +2 -3
- package/dist/explorerSession.d.ts.map +1 -1
- package/dist/explorerSession.js +3 -20
- package/dist/explorerSession.js.map +1 -1
- package/dist/git/gitCommitResolver.d.ts +2 -1
- package/dist/git/gitCommitResolver.d.ts.map +1 -1
- package/dist/git/gitCommitResolver.js +8 -8
- package/dist/git/gitCommitResolver.js.map +1 -1
- package/dist/git/gitIndexResolver.d.ts +2 -1
- package/dist/git/gitIndexResolver.d.ts.map +1 -1
- package/dist/git/gitIndexResolver.js +7 -7
- package/dist/git/gitIndexResolver.js.map +1 -1
- package/dist/git/gitService.d.ts +5 -4
- package/dist/git/gitService.d.ts.map +1 -1
- package/dist/git/gitService.js.map +1 -1
- package/dist/git/gitUtils.d.ts +6 -4
- package/dist/git/gitUtils.d.ts.map +1 -1
- package/dist/git/gitUtils.js +10 -5
- package/dist/git/gitUtils.js.map +1 -1
- package/dist/git/gitWorktreeManager.d.ts +15 -14
- package/dist/git/gitWorktreeManager.d.ts.map +1 -1
- package/dist/git/gitWorktreeManager.js +10 -11
- package/dist/git/gitWorktreeManager.js.map +1 -1
- package/dist/git/testUtils.d.ts +2 -1
- package/dist/git/testUtils.d.ts.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/js-component-explorer/packages/common/dist/explorerUrl.js +21 -0
- package/dist/js-component-explorer/packages/common/dist/explorerUrl.js.map +1 -0
- package/dist/js-component-explorer/packages/common/dist/renderManifest.js +68 -0
- package/dist/js-component-explorer/packages/common/dist/renderManifest.js.map +1 -0
- package/dist/js-component-explorer/packages/semver/dist/index.js +186 -0
- package/dist/js-component-explorer/packages/semver/dist/index.js.map +1 -0
- package/dist/{packages/simple-api/dist/chunk-3R7GHWBM.js → js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js} +2 -1
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +1 -0
- package/dist/{packages/simple-api/dist/chunk-SGBCNXYH.js → js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js} +4 -1
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js.map +1 -0
- package/dist/{packages/simple-api/dist/chunk-TAEFVNPN.js → js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js} +2 -1
- package/dist/js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js.map +1 -0
- package/dist/{packages → js-component-explorer/packages}/simple-api/dist/express.js +1 -1
- package/dist/js-component-explorer/packages/simple-api/dist/express.js.map +1 -0
- package/dist/logger.d.ts +12 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +35 -2
- package/dist/logger.js.map +1 -1
- package/dist/manifest.schema.json +215 -0
- package/dist/mcp/DaemonAccessor.d.ts +22 -0
- package/dist/mcp/DaemonAccessor.d.ts.map +1 -0
- package/dist/mcp/McpServer.d.ts +5 -19
- package/dist/mcp/McpServer.d.ts.map +1 -1
- package/dist/mcp/McpServer.js +391 -304
- package/dist/mcp/McpServer.js.map +1 -1
- package/dist/path.d.ts +30 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +78 -0
- package/dist/path.js.map +1 -0
- package/dist/processTree.d.ts +14 -0
- package/dist/processTree.d.ts.map +1 -0
- package/dist/processTree.js +84 -0
- package/dist/processTree.js.map +1 -0
- package/dist/renderManifest.d.ts +5 -0
- package/dist/renderManifest.d.ts.map +1 -0
- package/dist/renderManifest.js +11 -0
- package/dist/renderManifest.js.map +1 -0
- package/dist/screenshotServiceClient.d.ts +31 -0
- package/dist/screenshotServiceClient.d.ts.map +1 -0
- package/dist/screenshotServiceClient.js +38 -0
- package/dist/screenshotServiceClient.js.map +1 -0
- package/dist/server/httpServer.d.ts +14 -0
- package/dist/server/httpServer.d.ts.map +1 -0
- package/dist/server/httpServer.js +110 -0
- package/dist/server/httpServer.js.map +1 -0
- package/dist/server/httpServer.test.d.ts.map +1 -0
- package/dist/server/serverConfig.d.ts +59 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +53 -0
- package/dist/server/serverConfig.js.map +1 -0
- package/dist/server/types.d.ts +6 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/viteServer.d.ts +31 -0
- package/dist/server/viteServer.d.ts.map +1 -0
- package/dist/{httpServer.js → server/viteServer.js} +96 -115
- package/dist/server/viteServer.js.map +1 -0
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1 -1
- package/dist/storage.js.map +1 -1
- package/dist/utils.d.ts +3 -25
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -23
- package/dist/utils.js.map +1 -1
- package/dist/visualCache.d.ts +2 -1
- package/dist/visualCache.d.ts.map +1 -1
- package/dist/visualCache.js +4 -3
- package/dist/visualCache.js.map +1 -1
- package/dist/viteProjectRef.d.ts +4 -12
- package/dist/viteProjectRef.d.ts.map +1 -1
- package/dist/viteProjectRef.js +9 -17
- package/dist/viteProjectRef.js.map +1 -1
- package/dist/vscode-observables/observables/dist/disposables.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/base.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/debugName.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/index.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -0
- package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +1 -1
- package/dist/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -0
- package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js → vscode-observables/observables/dist/observableInternal/reactions/createEffect.js} +9 -5
- package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffect.js.map +1 -0
- package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js → vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js} +1 -1
- package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/transaction.js.map +1 -0
- package/dist/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +1 -0
- package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utilsCancellation.js +2 -2
- package/dist/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +1 -0
- package/package.json +34 -22
- package/dist/commands/screenshotCommand.d.ts +0 -18
- package/dist/commands/screenshotCommand.d.ts.map +0 -1
- package/dist/commands/screenshotCommand.js +0 -127
- package/dist/commands/screenshotCommand.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/disposables.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/base.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +0 -1
- package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +0 -1
- package/dist/httpServer.d.ts +0 -36
- package/dist/httpServer.d.ts.map +0 -1
- package/dist/httpServer.js.map +0 -1
- package/dist/httpServer.test.d.ts.map +0 -1
- package/dist/packages/simple-api/dist/chunk-3R7GHWBM.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-SGBCNXYH.js.map +0 -1
- package/dist/packages/simple-api/dist/chunk-TAEFVNPN.js.map +0 -1
- package/dist/packages/simple-api/dist/express.js.map +0 -1
- package/dist/resolveProject.d.ts +0 -21
- package/dist/resolveProject.d.ts.map +0 -1
- package/dist/resolveProject.js +0 -39
- package/dist/resolveProject.js.map +0 -1
- package/dist/watchConfig.d.ts.map +0 -1
- package/dist/watchConfig.js.map +0 -1
- /package/dist/{httpServer.test.d.ts → server/httpServer.test.d.ts} +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/disposables.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/base.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/commonFacade/deps.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugLocation.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugName.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/index.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/consoleObservableLogger.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/logging.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/baseObservable.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derived.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derivedImpl.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableFromEvent.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableValue.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/transaction.js +0 -0
- /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utils.js +0 -0
|
@@ -1,8 +1,50 @@
|
|
|
1
|
-
import type { BrowserPageFactory } from './browserPage.js';
|
|
2
|
-
import type { ComponentExplorerHttpServer } from './
|
|
1
|
+
import type { BrowserPage, BrowserPageFactory } from './browserPage.js';
|
|
2
|
+
import type { ComponentExplorerHttpServer } from './server/types.js';
|
|
3
3
|
import type { IObservable } from '@vscode/observables';
|
|
4
|
+
import type { IJsonSchema } from '@vscode/component-explorer-common';
|
|
4
5
|
import { type ILogger } from './logger.js';
|
|
5
6
|
import { SourceTreeId } from './sourceTreeId.js';
|
|
7
|
+
export interface ScreenshotOptions {
|
|
8
|
+
/**
|
|
9
|
+
* If true, reload the browser page if the fixture had an error during rendering. This can help avoid contamination of subsequent renders when the page is in a bad state, at the cost of longer execution time.
|
|
10
|
+
*/
|
|
11
|
+
readonly reloadOnError?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* If true, reload the browser page before rendering this fixture.
|
|
14
|
+
* Useful for bulk rendering to ensure each fixture starts from a clean page state.
|
|
15
|
+
*/
|
|
16
|
+
readonly reloadBeforeRender?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Arbitrary JSON-serializable data passed to the fixture's `RenderContext.input`.
|
|
19
|
+
* The fixture decides how to interpret it (e.g. theme switch, scenario selection).
|
|
20
|
+
* Must be JSON-serializable since it crosses the CLI → browser boundary.
|
|
21
|
+
*/
|
|
22
|
+
readonly input?: unknown;
|
|
23
|
+
/**
|
|
24
|
+
* If true, dispose the fixture after taking the screenshot and capture any
|
|
25
|
+
* errors / events that surface during dispose.
|
|
26
|
+
* Default: false — the fixture stays mounted until the next render, so
|
|
27
|
+
* `evaluate_js` can still operate on it. Use `disposeAfter` when you want to
|
|
28
|
+
* validate the teardown of a specific fixture.
|
|
29
|
+
*/
|
|
30
|
+
readonly disposeAfter?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface ComponentExplorer {
|
|
33
|
+
readonly sourceTreeId: IObservable<SourceTreeId>;
|
|
34
|
+
listFixtures(): Promise<ListFixturesResult>;
|
|
35
|
+
screenshotFixture(fixtureId: string, options?: ScreenshotOptions): Promise<ScreenshotResult>;
|
|
36
|
+
screenshotFixtureStabilityCheck(fixtureId: string, options?: ScreenshotOptions): Promise<StabilityCheckResult>;
|
|
37
|
+
evaluateJs(expression: string, fixtureId?: string): Promise<unknown>;
|
|
38
|
+
codeCoverage(id: FixtureId | FixtureGroupId): Promise<CoverageData>;
|
|
39
|
+
waitForUpdate(timeoutMs?: number): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Open the underlying browser page (if not already open) and return it.
|
|
42
|
+
* Used by coverage tooling to call `startJSCoverage` / `stopJSCoverage` on the
|
|
43
|
+
* exact same page used for fixture rendering.
|
|
44
|
+
*/
|
|
45
|
+
getOrOpenPage(): Promise<BrowserPage>;
|
|
46
|
+
dispose(): Promise<void>;
|
|
47
|
+
}
|
|
6
48
|
export interface FixtureInfo {
|
|
7
49
|
readonly fixtureId: string;
|
|
8
50
|
readonly fixtureName: string;
|
|
@@ -10,6 +52,8 @@ export interface FixtureInfo {
|
|
|
10
52
|
readonly background: 'light' | 'dark';
|
|
11
53
|
readonly labels: readonly string[];
|
|
12
54
|
readonly expectedVisualDescriptions: readonly string[];
|
|
55
|
+
/** JSON Schema describing the fixture's expected `input` object, if declared. */
|
|
56
|
+
readonly inputSchema?: IJsonSchema;
|
|
13
57
|
}
|
|
14
58
|
export interface ListFixturesResult {
|
|
15
59
|
readonly fixtures: FixtureInfo[];
|
|
@@ -37,37 +81,90 @@ export type RenderEventType = 'console.error' | 'console.warn' | 'console.log' |
|
|
|
37
81
|
export interface RenderEvent {
|
|
38
82
|
readonly type: RenderEventType;
|
|
39
83
|
readonly message: string;
|
|
84
|
+
readonly stack?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Errors / events captured while disposing a fixture.
|
|
88
|
+
* `previousDispose` is populated when a screenshot's implicit dispose of the
|
|
89
|
+
* previous fixture surfaced something; `currentDispose` is populated when
|
|
90
|
+
* `disposeAfter: true` was requested.
|
|
91
|
+
*
|
|
92
|
+
* `hasError` is a derived getter: `true` when any exception was captured
|
|
93
|
+
* or a significant event (console.error / window.error / unhandledrejection) occurred.
|
|
94
|
+
*/
|
|
95
|
+
export declare class DisposeReport {
|
|
96
|
+
readonly errors: readonly ExceptionError[];
|
|
97
|
+
readonly events: readonly RenderEvent[];
|
|
98
|
+
constructor(data: {
|
|
99
|
+
readonly errors: readonly ExceptionError[];
|
|
100
|
+
readonly events: readonly RenderEvent[];
|
|
101
|
+
});
|
|
102
|
+
get hasError(): boolean;
|
|
103
|
+
static from(raw: {
|
|
104
|
+
errors: readonly ExceptionError[];
|
|
105
|
+
events: readonly RenderEvent[];
|
|
106
|
+
}): DisposeReport;
|
|
107
|
+
static fromIfSignificant(raw: {
|
|
108
|
+
errors: readonly ExceptionError[];
|
|
109
|
+
events: readonly RenderEvent[];
|
|
110
|
+
}): DisposeReport | undefined;
|
|
40
111
|
}
|
|
41
112
|
/**
|
|
42
113
|
* Result of taking a screenshot, including any errors captured during rendering.
|
|
114
|
+
*
|
|
115
|
+
* `hasError` is a derived getter that is `true` when any phase (render,
|
|
116
|
+
* previousDispose, or currentDispose) reported an error so that consumers
|
|
117
|
+
* never need to combine the flags manually.
|
|
43
118
|
*/
|
|
44
|
-
export
|
|
119
|
+
export declare class ScreenshotResult {
|
|
45
120
|
readonly image: Uint8Array | undefined;
|
|
46
|
-
readonly
|
|
121
|
+
readonly renderHasError: boolean;
|
|
47
122
|
readonly error?: ExceptionError;
|
|
48
123
|
readonly events: RenderEvent[];
|
|
49
|
-
readonly
|
|
124
|
+
readonly output?: unknown;
|
|
125
|
+
readonly renderTimeMs: {
|
|
126
|
+
readonly sync: number;
|
|
127
|
+
readonly total: number;
|
|
128
|
+
};
|
|
129
|
+
readonly previousDispose?: DisposeReport;
|
|
130
|
+
readonly currentDispose?: DisposeReport;
|
|
131
|
+
constructor(data: {
|
|
132
|
+
readonly image: Uint8Array | undefined;
|
|
133
|
+
readonly renderHasError: boolean;
|
|
134
|
+
readonly error?: ExceptionError;
|
|
135
|
+
readonly events: RenderEvent[];
|
|
136
|
+
readonly output?: unknown;
|
|
137
|
+
readonly renderTimeMs: {
|
|
138
|
+
readonly sync: number;
|
|
139
|
+
readonly total: number;
|
|
140
|
+
};
|
|
141
|
+
readonly previousDispose?: DisposeReport;
|
|
142
|
+
readonly currentDispose?: DisposeReport;
|
|
143
|
+
});
|
|
144
|
+
get hasError(): boolean;
|
|
50
145
|
}
|
|
51
146
|
export interface StabilityScreenshot {
|
|
52
147
|
readonly image: Uint8Array;
|
|
53
148
|
readonly delayMs: number;
|
|
54
149
|
}
|
|
55
|
-
export
|
|
150
|
+
export declare class StabilityCheckResult {
|
|
56
151
|
readonly screenshots: readonly StabilityScreenshot[];
|
|
57
|
-
readonly
|
|
152
|
+
readonly renderHasError: boolean;
|
|
58
153
|
readonly error?: ExceptionError;
|
|
59
154
|
readonly events: RenderEvent[];
|
|
60
|
-
readonly
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
155
|
+
readonly output?: unknown;
|
|
156
|
+
readonly previousDispose?: DisposeReport;
|
|
157
|
+
readonly currentDispose?: DisposeReport;
|
|
158
|
+
constructor(data: {
|
|
159
|
+
readonly screenshots: readonly StabilityScreenshot[];
|
|
160
|
+
readonly renderHasError: boolean;
|
|
161
|
+
readonly error?: ExceptionError;
|
|
162
|
+
readonly events: RenderEvent[];
|
|
163
|
+
readonly output?: unknown;
|
|
164
|
+
readonly previousDispose?: DisposeReport;
|
|
165
|
+
readonly currentDispose?: DisposeReport;
|
|
166
|
+
});
|
|
167
|
+
get hasError(): boolean;
|
|
71
168
|
}
|
|
72
169
|
export declare class BrowserComponentExplorer implements ComponentExplorer {
|
|
73
170
|
private readonly _browserPageFactory;
|
|
@@ -76,16 +173,21 @@ export declare class BrowserComponentExplorer implements ComponentExplorer {
|
|
|
76
173
|
private _page;
|
|
77
174
|
private _lastState;
|
|
78
175
|
private _screenshotMutex;
|
|
176
|
+
private _pollingActive;
|
|
79
177
|
readonly sourceTreeId: import("@vscode/observables").ISettableObservable<SourceTreeId, void>;
|
|
80
178
|
constructor(_browserPageFactory: BrowserPageFactory, _server: ComponentExplorerHttpServer, _logger?: ILogger);
|
|
81
179
|
private _bumpSourceTreeId;
|
|
180
|
+
getOrOpenPage(): Promise<BrowserPage>;
|
|
82
181
|
private _ensureReady;
|
|
182
|
+
private _reloadPage;
|
|
183
|
+
private _startPolling;
|
|
184
|
+
private _pollLoop;
|
|
83
185
|
private _waitForCliApi;
|
|
84
186
|
private _assertRuntimeVersionCompatibility;
|
|
85
187
|
private _getState;
|
|
86
188
|
listFixtures(): Promise<ListFixturesResult>;
|
|
87
|
-
screenshotFixture(fixtureId: string): Promise<ScreenshotResult>;
|
|
88
|
-
screenshotFixtureStabilityCheck(fixtureId: string): Promise<StabilityCheckResult>;
|
|
189
|
+
screenshotFixture(fixtureId: string, options?: ScreenshotOptions): Promise<ScreenshotResult>;
|
|
190
|
+
screenshotFixtureStabilityCheck(fixtureId: string, options?: ScreenshotOptions): Promise<StabilityCheckResult>;
|
|
89
191
|
evaluateJs(expression: string, fixtureId?: string): Promise<unknown>;
|
|
90
192
|
codeCoverage(_id: FixtureId | FixtureGroupId): Promise<CoverageData>;
|
|
91
193
|
waitForUpdate(timeoutMs?: number): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentExplorer.d.ts","sourceRoot":"","sources":["../src/componentExplorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"componentExplorer.d.ts","sourceRoot":"","sources":["../src/componentExplorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +1,100 @@
|
|
|
1
|
-
import './
|
|
2
|
-
import
|
|
3
|
-
import './
|
|
4
|
-
import './
|
|
5
|
-
import './
|
|
6
|
-
import './
|
|
1
|
+
import { evaluateFn, explorerApiGetter, explorerApi, explorerApiOrUndefined } from './evaluateFn.js';
|
|
2
|
+
import './vscode-observables/observables/dist/observableInternal/index.js';
|
|
3
|
+
import { observableValue } from './vscode-observables/observables/dist/observableInternal/observables/observableValue.js';
|
|
4
|
+
import './vscode-observables/observables/dist/observableInternal/debugLocation.js';
|
|
5
|
+
import './vscode-observables/observables/dist/observableInternal/observables/derived.js';
|
|
6
|
+
import { waitForState } from './vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js';
|
|
7
|
+
import './vscode-observables/observables/dist/observableInternal/utils/utils.js';
|
|
8
|
+
import './vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
|
|
7
9
|
import { nullLogger } from './logger.js';
|
|
8
10
|
import { SourceTreeId } from './sourceTreeId.js';
|
|
9
|
-
import
|
|
11
|
+
import './js-component-explorer/packages/common/dist/renderManifest.js';
|
|
12
|
+
import { buildExplorerUrl } from './js-component-explorer/packages/common/dist/explorerUrl.js';
|
|
13
|
+
import { EXPLORER_ROUTE } from './utils.js';
|
|
10
14
|
import { parseVersion, isCompatibleVersion, runtimeVersionNeededByCliText } from './daemon/version.js';
|
|
11
15
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Errors / events captured while disposing a fixture.
|
|
18
|
+
* `previousDispose` is populated when a screenshot's implicit dispose of the
|
|
19
|
+
* previous fixture surfaced something; `currentDispose` is populated when
|
|
20
|
+
* `disposeAfter: true` was requested.
|
|
21
|
+
*
|
|
22
|
+
* `hasError` is a derived getter: `true` when any exception was captured
|
|
23
|
+
* or a significant event (console.error / window.error / unhandledrejection) occurred.
|
|
24
|
+
*/
|
|
25
|
+
class DisposeReport {
|
|
26
|
+
errors;
|
|
27
|
+
events;
|
|
28
|
+
constructor(data) {
|
|
29
|
+
this.errors = data.errors;
|
|
30
|
+
this.events = data.events;
|
|
31
|
+
}
|
|
32
|
+
get hasError() {
|
|
33
|
+
return this.errors.length > 0
|
|
34
|
+
|| this.events.some(e => e.type === 'console.error' || e.type === 'window.error' || e.type === 'window.unhandledrejection');
|
|
35
|
+
}
|
|
36
|
+
static from(raw) {
|
|
37
|
+
return new DisposeReport({ errors: raw.errors, events: raw.events });
|
|
38
|
+
}
|
|
39
|
+
static fromIfSignificant(raw) {
|
|
40
|
+
const report = DisposeReport.from(raw);
|
|
41
|
+
return (report.hasError || report.events.length > 0) ? report : undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Result of taking a screenshot, including any errors captured during rendering.
|
|
46
|
+
*
|
|
47
|
+
* `hasError` is a derived getter that is `true` when any phase (render,
|
|
48
|
+
* previousDispose, or currentDispose) reported an error so that consumers
|
|
49
|
+
* never need to combine the flags manually.
|
|
50
|
+
*/
|
|
51
|
+
class ScreenshotResult {
|
|
52
|
+
image;
|
|
53
|
+
renderHasError;
|
|
54
|
+
error;
|
|
55
|
+
events;
|
|
56
|
+
output;
|
|
57
|
+
renderTimeMs;
|
|
58
|
+
previousDispose;
|
|
59
|
+
currentDispose;
|
|
60
|
+
constructor(data) {
|
|
61
|
+
this.image = data.image;
|
|
62
|
+
this.renderHasError = data.renderHasError;
|
|
63
|
+
this.error = data.error;
|
|
64
|
+
this.events = data.events;
|
|
65
|
+
this.output = data.output;
|
|
66
|
+
this.renderTimeMs = data.renderTimeMs;
|
|
67
|
+
this.previousDispose = data.previousDispose;
|
|
68
|
+
this.currentDispose = data.currentDispose;
|
|
69
|
+
}
|
|
70
|
+
get hasError() {
|
|
71
|
+
return this.renderHasError
|
|
72
|
+
|| !!this.previousDispose?.hasError
|
|
73
|
+
|| !!this.currentDispose?.hasError;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
class StabilityCheckResult {
|
|
77
|
+
screenshots;
|
|
78
|
+
renderHasError;
|
|
79
|
+
error;
|
|
80
|
+
events;
|
|
81
|
+
output;
|
|
82
|
+
previousDispose;
|
|
83
|
+
currentDispose;
|
|
84
|
+
constructor(data) {
|
|
85
|
+
this.screenshots = data.screenshots;
|
|
86
|
+
this.renderHasError = data.renderHasError;
|
|
87
|
+
this.error = data.error;
|
|
88
|
+
this.events = data.events;
|
|
89
|
+
this.output = data.output;
|
|
90
|
+
this.previousDispose = data.previousDispose;
|
|
91
|
+
this.currentDispose = data.currentDispose;
|
|
92
|
+
}
|
|
93
|
+
get hasError() {
|
|
94
|
+
return this.renderHasError
|
|
95
|
+
|| !!this.previousDispose?.hasError
|
|
96
|
+
|| !!this.currentDispose?.hasError;
|
|
16
97
|
}
|
|
17
|
-
return result.screenshot;
|
|
18
98
|
}
|
|
19
99
|
class BrowserComponentExplorer {
|
|
20
100
|
_browserPageFactory;
|
|
@@ -23,6 +103,7 @@ class BrowserComponentExplorer {
|
|
|
23
103
|
_page;
|
|
24
104
|
_lastState;
|
|
25
105
|
_screenshotMutex = Promise.resolve();
|
|
106
|
+
_pollingActive = false;
|
|
26
107
|
sourceTreeId;
|
|
27
108
|
constructor(_browserPageFactory, _server, _logger = nullLogger) {
|
|
28
109
|
this._browserPageFactory = _browserPageFactory;
|
|
@@ -38,29 +119,85 @@ class BrowserComponentExplorer {
|
|
|
38
119
|
_bumpSourceTreeId() {
|
|
39
120
|
this.sourceTreeId.set(new SourceTreeId(Date.now().toString()), undefined);
|
|
40
121
|
}
|
|
122
|
+
getOrOpenPage() {
|
|
123
|
+
return this._ensureReady();
|
|
124
|
+
}
|
|
41
125
|
async _ensureReady() {
|
|
42
126
|
if (!this._page) {
|
|
43
|
-
const cliUrl = buildExplorerUrl({ baseUrl: this._server.url,
|
|
127
|
+
const cliUrl = buildExplorerUrl({ baseUrl: this._server.url, pathname: EXPLORER_ROUTE, mode: 'headless' });
|
|
44
128
|
this._logger.debug(`Opening browser page: ${cliUrl}`);
|
|
45
129
|
this._page = await this._browserPageFactory.openPage(cliUrl);
|
|
46
130
|
await this._waitForCliApi(this._page);
|
|
131
|
+
this._startPolling();
|
|
47
132
|
}
|
|
48
133
|
return this._page;
|
|
49
134
|
}
|
|
135
|
+
async _reloadPage(page) {
|
|
136
|
+
await page.reload();
|
|
137
|
+
await this._waitForCliApi(page);
|
|
138
|
+
}
|
|
139
|
+
_startPolling() {
|
|
140
|
+
if (this._pollingActive) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
this._pollingActive = true;
|
|
144
|
+
this._pollLoop();
|
|
145
|
+
}
|
|
146
|
+
async _pollLoop() {
|
|
147
|
+
while (this._pollingActive && this._page) {
|
|
148
|
+
try {
|
|
149
|
+
const page = this._page;
|
|
150
|
+
const prev = this._lastState;
|
|
151
|
+
const newState = await evaluateFn(page, (getApi, prev) => new Promise((resolve) => {
|
|
152
|
+
function check() {
|
|
153
|
+
const api = getApi();
|
|
154
|
+
// This allows faked time
|
|
155
|
+
const setTimeoutFn = typeof globalThis.setTimeout.originalFn === 'function' ?
|
|
156
|
+
globalThis.setTimeout.originalFn : globalThis.setTimeout;
|
|
157
|
+
if (!api) {
|
|
158
|
+
setTimeoutFn(check, 50);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (api.pageInstanceId !== prev.pageInstanceId || api.updateVersion > prev.updateVersion) {
|
|
162
|
+
resolve({ pageInstanceId: api.pageInstanceId, updateVersion: api.updateVersion, runtimeVersion: api.runtimeVersion });
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
setTimeoutFn(check, 50);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
check();
|
|
169
|
+
}), explorerApiGetter, prev);
|
|
170
|
+
if (!this._pollingActive) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
const reloaded = newState.pageInstanceId !== prev.pageInstanceId;
|
|
174
|
+
if (reloaded) {
|
|
175
|
+
this._logger.debug(`Page reloaded: pageInstanceId ${prev.pageInstanceId} → ${newState.pageInstanceId}`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
this._logger.debug(`HMR update: version ${prev.updateVersion} → ${newState.updateVersion}`);
|
|
179
|
+
}
|
|
180
|
+
this._lastState = newState;
|
|
181
|
+
this._bumpSourceTreeId();
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
if (!this._pollingActive) {
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
this._logger.debug(`Polling error: ${err}`);
|
|
188
|
+
await new Promise(r => setTimeout(r, 500));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
50
192
|
async _waitForCliApi(page) {
|
|
51
|
-
this._logger.trace('
|
|
52
|
-
await page
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
else setTimeout(check, 50);
|
|
57
|
-
}
|
|
58
|
-
check();
|
|
59
|
-
})
|
|
60
|
-
`);
|
|
193
|
+
this._logger.trace('Checking for __componentExplorer__ global...');
|
|
194
|
+
const hasGlobal = await evaluateFn(page, (api) => !!api, explorerApiOrUndefined);
|
|
195
|
+
if (!hasGlobal) {
|
|
196
|
+
throw new Error('Component Explorer runtime not found. Ensure the explorer is properly configured and the page serves the explorer bundle.');
|
|
197
|
+
}
|
|
61
198
|
this._lastState = await this._getState(page);
|
|
62
199
|
this._assertRuntimeVersionCompatibility(this._lastState.runtimeVersion);
|
|
63
|
-
this._logger.debug(`CLI API ready,
|
|
200
|
+
this._logger.debug(`CLI API ready, pageInstanceId=${this._lastState.pageInstanceId}, version=${this._lastState.updateVersion}`);
|
|
64
201
|
}
|
|
65
202
|
_assertRuntimeVersionCompatibility(runtimeVersion) {
|
|
66
203
|
const expected = parseVersion(runtimeVersionNeededByCliText);
|
|
@@ -70,16 +207,16 @@ class BrowserComponentExplorer {
|
|
|
70
207
|
}
|
|
71
208
|
}
|
|
72
209
|
async _getState(page) {
|
|
73
|
-
return page
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
210
|
+
return evaluateFn(page, (api) => ({
|
|
211
|
+
pageInstanceId: api.pageInstanceId,
|
|
212
|
+
updateVersion: api.updateVersion,
|
|
213
|
+
runtimeVersion: api.runtimeVersion,
|
|
214
|
+
}), explorerApi);
|
|
78
215
|
}
|
|
79
216
|
async listFixtures() {
|
|
80
217
|
const page = await this._ensureReady();
|
|
81
218
|
try {
|
|
82
|
-
const fixtures = await page
|
|
219
|
+
const fixtures = await evaluateFn(page, (api) => api.listFixtures(), explorerApi);
|
|
83
220
|
return { fixtures };
|
|
84
221
|
}
|
|
85
222
|
catch (e) {
|
|
@@ -87,7 +224,7 @@ class BrowserComponentExplorer {
|
|
|
87
224
|
return { fixtures: [], loadError };
|
|
88
225
|
}
|
|
89
226
|
}
|
|
90
|
-
async screenshotFixture(fixtureId) {
|
|
227
|
+
async screenshotFixture(fixtureId, options) {
|
|
91
228
|
// Serialize screenshot calls — the single browser page can only render one fixture at a time
|
|
92
229
|
const prev = this._screenshotMutex;
|
|
93
230
|
let resolve;
|
|
@@ -98,21 +235,44 @@ class BrowserComponentExplorer {
|
|
|
98
235
|
const startTime = Date.now();
|
|
99
236
|
try {
|
|
100
237
|
const page = await this._ensureReady();
|
|
101
|
-
const
|
|
102
|
-
const debugUrl = buildExplorerUrl({ baseUrl: this._server.url, rawRender: true, fixtureId });
|
|
238
|
+
const debugUrl = buildExplorerUrl({ baseUrl: this._server.url, pathname: EXPLORER_ROUTE, mode: 'headless', fixtureId });
|
|
103
239
|
this._logger.debug(`Rendering fixture: ${debugUrl}`);
|
|
104
|
-
|
|
240
|
+
if (options?.reloadBeforeRender) {
|
|
241
|
+
this._logger.debug(`Reloading page before render: ${fixtureId}`);
|
|
242
|
+
await this._reloadPage(page);
|
|
243
|
+
}
|
|
244
|
+
const input = options?.input;
|
|
245
|
+
const renderResult = await evaluateFn(page, (api, args) => api.renderFixture(args.id, args.input), explorerApi, { id: fixtureId, input });
|
|
105
246
|
this._logger.debug(`Render completed: ${fixtureId} (hasError=${renderResult.hasError}, ${Date.now() - startTime}ms)`);
|
|
106
247
|
const image = await page.screenshot(`document.getElementById('root').lastElementChild`);
|
|
107
248
|
this._logger.debug(`Screenshot done: ${fixtureId} (ok=${image.ok}, ${Date.now() - startTime}ms)`);
|
|
108
|
-
|
|
249
|
+
let currentDispose;
|
|
250
|
+
if (options?.disposeAfter) {
|
|
251
|
+
this._logger.debug(`Disposing fixture after screenshot: ${fixtureId}`);
|
|
252
|
+
const rawDispose = await evaluateFn(page, (api) => api.disposeCurrentFixture(), explorerApi);
|
|
253
|
+
currentDispose = DisposeReport.fromIfSignificant(rawDispose);
|
|
254
|
+
}
|
|
255
|
+
if (renderResult.hasError && options?.reloadOnError) {
|
|
256
|
+
this._logger.debug(`Fixture had error, reloading page to avoid contamination: ${fixtureId}`);
|
|
257
|
+
await this._reloadPage(page);
|
|
258
|
+
}
|
|
259
|
+
return new ScreenshotResult({
|
|
260
|
+
image: image.ok ? image.screenshot : undefined,
|
|
261
|
+
renderHasError: renderResult.hasError,
|
|
262
|
+
error: renderResult.error,
|
|
263
|
+
events: renderResult.events,
|
|
264
|
+
output: renderResult.output,
|
|
265
|
+
renderTimeMs: renderResult.renderTimeMs,
|
|
266
|
+
previousDispose: renderResult.previousDispose ? DisposeReport.from(renderResult.previousDispose) : undefined,
|
|
267
|
+
currentDispose,
|
|
268
|
+
});
|
|
109
269
|
}
|
|
110
270
|
finally {
|
|
111
271
|
this._logger.trace(`Screenshot mutex: released for ${fixtureId}`);
|
|
112
272
|
resolve();
|
|
113
273
|
}
|
|
114
274
|
}
|
|
115
|
-
async screenshotFixtureStabilityCheck(fixtureId) {
|
|
275
|
+
async screenshotFixtureStabilityCheck(fixtureId, options) {
|
|
116
276
|
const prev = this._screenshotMutex;
|
|
117
277
|
let resolve;
|
|
118
278
|
this._screenshotMutex = new Promise(r => { resolve = r; });
|
|
@@ -121,12 +281,16 @@ class BrowserComponentExplorer {
|
|
|
121
281
|
this._logger.trace(`Screenshot mutex: acquired for stability check ${fixtureId}`);
|
|
122
282
|
try {
|
|
123
283
|
const page = await this._ensureReady();
|
|
124
|
-
const
|
|
125
|
-
const debugUrl = buildExplorerUrl({ baseUrl: this._server.url, rawRender: true, fixtureId });
|
|
284
|
+
const debugUrl = buildExplorerUrl({ baseUrl: this._server.url, pathname: EXPLORER_ROUTE, mode: 'headless', fixtureId });
|
|
126
285
|
this._logger.debug(`Stability check: ${debugUrl}`);
|
|
127
|
-
|
|
286
|
+
if (options?.reloadBeforeRender) {
|
|
287
|
+
this._logger.debug(`Reloading page before stability check: ${fixtureId}`);
|
|
288
|
+
await this._reloadPage(page);
|
|
289
|
+
}
|
|
290
|
+
const priorDispose = DisposeReport.fromIfSignificant(await evaluateFn(page, (api) => api.disposeCurrentFixture(), explorerApi));
|
|
128
291
|
const startTime = Date.now();
|
|
129
|
-
const
|
|
292
|
+
const input = options?.input;
|
|
293
|
+
const renderResult = await evaluateFn(page, (api, args) => api.renderFixture(args.id, args.input), explorerApi, { id: fixtureId, input });
|
|
130
294
|
const domExpr = `document.getElementById('root').lastElementChild`;
|
|
131
295
|
const image0 = await unwrapScreenshot(page, domExpr);
|
|
132
296
|
const delay0 = Date.now() - startTime;
|
|
@@ -145,14 +309,33 @@ class BrowserComponentExplorer {
|
|
|
145
309
|
const image2 = await unwrapScreenshot(page, domExpr);
|
|
146
310
|
const delay2 = Date.now() - startTime;
|
|
147
311
|
this._logger.debug(`Stability check done: ${fixtureId} (${delay2}ms total)`);
|
|
148
|
-
|
|
312
|
+
let currentDispose;
|
|
313
|
+
if (options?.disposeAfter) {
|
|
314
|
+
this._logger.debug(`Disposing fixture after stability check: ${fixtureId}`);
|
|
315
|
+
const rawDispose = await evaluateFn(page, (api) => api.disposeCurrentFixture(), explorerApi);
|
|
316
|
+
currentDispose = DisposeReport.fromIfSignificant(rawDispose);
|
|
317
|
+
}
|
|
318
|
+
const previousDispose = renderResult.previousDispose
|
|
319
|
+
? DisposeReport.from(renderResult.previousDispose)
|
|
320
|
+
: priorDispose;
|
|
321
|
+
const result = new StabilityCheckResult({
|
|
149
322
|
screenshots: [
|
|
150
323
|
{ image: image0, delayMs: delay0 },
|
|
151
324
|
{ image: image1, delayMs: delay1 },
|
|
152
325
|
{ image: image2, delayMs: delay2 },
|
|
153
326
|
],
|
|
154
|
-
|
|
155
|
-
|
|
327
|
+
renderHasError: renderResult.hasError,
|
|
328
|
+
error: renderResult.error,
|
|
329
|
+
events: renderResult.events,
|
|
330
|
+
output: renderResult.output,
|
|
331
|
+
previousDispose,
|
|
332
|
+
currentDispose,
|
|
333
|
+
});
|
|
334
|
+
if (renderResult.hasError && options?.reloadOnError) {
|
|
335
|
+
this._logger.debug(`Stability check fixture had error, reloading page to avoid contamination: ${fixtureId}`);
|
|
336
|
+
await this._reloadPage(page);
|
|
337
|
+
}
|
|
338
|
+
return result;
|
|
156
339
|
}
|
|
157
340
|
finally {
|
|
158
341
|
this._logger.trace(`Screenshot mutex: released for stability check ${fixtureId}`);
|
|
@@ -168,8 +351,7 @@ class BrowserComponentExplorer {
|
|
|
168
351
|
this._logger.trace(`evaluateJs: expression length=${expression.length}${fixtureId ? `, fixtureId=${fixtureId}` : ''}`);
|
|
169
352
|
const page = await this._ensureReady();
|
|
170
353
|
if (fixtureId !== undefined) {
|
|
171
|
-
|
|
172
|
-
await page.evaluateJs(`window.__componentExplorer__.renderFixture(${escapedId})`);
|
|
354
|
+
await evaluateFn(page, (api, id) => api.renderFixture(id), explorerApi, fixtureId);
|
|
173
355
|
}
|
|
174
356
|
const result = await page.evaluateJs(expression);
|
|
175
357
|
this._logger.trace(`evaluateJs: result length=${JSON.stringify(result)?.length ?? 0}`);
|
|
@@ -183,50 +365,40 @@ class BrowserComponentExplorer {
|
|
|
183
365
|
throw new Error('Code coverage not yet implemented');
|
|
184
366
|
}
|
|
185
367
|
async waitForUpdate(timeoutMs = 0) {
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
this._logger.debug(`Waiting for
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
}
|
|
198
|
-
const s = window.__componentExplorer__.sessionId;
|
|
199
|
-
const v = window.__componentExplorer__.updateVersion;
|
|
200
|
-
const r = window.__componentExplorer__.runtimeVersion;
|
|
201
|
-
if (s !== '${prev.sessionId}' || v > ${prev.updateVersion}) {
|
|
202
|
-
${timeoutMs > 0 ? 'clearTimeout(timeout);' : ''}
|
|
203
|
-
resolve({ sessionId: s, updateVersion: v, runtimeVersion: r });
|
|
204
|
-
} else {
|
|
205
|
-
setTimeout(check, 50);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
check();
|
|
209
|
-
})
|
|
210
|
-
`);
|
|
211
|
-
this._assertRuntimeVersionCompatibility(newState.runtimeVersion);
|
|
212
|
-
const reloaded = newState.sessionId !== prev.sessionId;
|
|
213
|
-
if (reloaded) {
|
|
214
|
-
this._logger.debug(`Page reloaded: sessionId ${prev.sessionId} → ${newState.sessionId}`);
|
|
368
|
+
await this._ensureReady();
|
|
369
|
+
const currentId = this.sourceTreeId.get();
|
|
370
|
+
this._logger.debug(`Waiting for sourceTreeId to change from ${currentId.value}...`);
|
|
371
|
+
if (timeoutMs > 0) {
|
|
372
|
+
const result = await Promise.race([
|
|
373
|
+
waitForState(this.sourceTreeId, id => id !== currentId),
|
|
374
|
+
new Promise(r => setTimeout(() => r('timeout'), timeoutMs)),
|
|
375
|
+
]);
|
|
376
|
+
if (result === 'timeout') {
|
|
377
|
+
throw new Error('Timeout waiting for HMR update');
|
|
378
|
+
}
|
|
215
379
|
}
|
|
216
380
|
else {
|
|
217
|
-
this.
|
|
381
|
+
await waitForState(this.sourceTreeId, id => id !== currentId);
|
|
218
382
|
}
|
|
219
|
-
this.
|
|
220
|
-
this._bumpSourceTreeId();
|
|
383
|
+
this._logger.debug(`sourceTreeId changed to ${this.sourceTreeId.get().value}`);
|
|
221
384
|
}
|
|
222
385
|
closePage() {
|
|
386
|
+
this._pollingActive = false;
|
|
223
387
|
this._page = undefined;
|
|
224
388
|
}
|
|
225
389
|
async dispose() {
|
|
390
|
+
this._pollingActive = false;
|
|
226
391
|
await this._page?.dispose();
|
|
227
392
|
this._page = undefined;
|
|
228
393
|
}
|
|
229
394
|
}
|
|
395
|
+
async function unwrapScreenshot(page, domExpr) {
|
|
396
|
+
const result = await page.screenshot(domExpr);
|
|
397
|
+
if (!result.ok) {
|
|
398
|
+
throw new Error(`Fixture DOM node not found`);
|
|
399
|
+
}
|
|
400
|
+
return result.screenshot;
|
|
401
|
+
}
|
|
230
402
|
|
|
231
|
-
export { BrowserComponentExplorer };
|
|
403
|
+
export { BrowserComponentExplorer, DisposeReport, ScreenshotResult, StabilityCheckResult };
|
|
232
404
|
//# sourceMappingURL=componentExplorer.js.map
|