@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.
Files changed (281) hide show
  1. package/README.md +14 -6
  2. package/dist/WorktreePool.d.ts +5 -4
  3. package/dist/WorktreePool.d.ts.map +1 -1
  4. package/dist/WorktreePool.js +3 -3
  5. package/dist/WorktreePool.js.map +1 -1
  6. package/dist/_virtual/_build-info.js +1 -1
  7. package/dist/browserPage.d.ts +54 -4
  8. package/dist/browserPage.d.ts.map +1 -1
  9. package/dist/browserPage.js +113 -2
  10. package/dist/browserPage.js.map +1 -1
  11. package/dist/commands/acceptCommand.d.ts +2 -1
  12. package/dist/commands/acceptCommand.d.ts.map +1 -1
  13. package/dist/commands/acceptCommand.js +30 -14
  14. package/dist/commands/acceptCommand.js.map +1 -1
  15. package/dist/commands/checkStabilityCommand.d.ts +3 -0
  16. package/dist/commands/checkStabilityCommand.d.ts.map +1 -1
  17. package/dist/commands/checkStabilityCommand.js +39 -18
  18. package/dist/commands/checkStabilityCommand.js.map +1 -1
  19. package/dist/commands/compareCommand.d.ts +2 -1
  20. package/dist/commands/compareCommand.d.ts.map +1 -1
  21. package/dist/commands/compareCommand.js +53 -25
  22. package/dist/commands/compareCommand.js.map +1 -1
  23. package/dist/commands/inputArg.d.ts +33 -0
  24. package/dist/commands/inputArg.d.ts.map +1 -0
  25. package/dist/commands/inputArg.js +103 -0
  26. package/dist/commands/inputArg.js.map +1 -0
  27. package/dist/commands/mcpCommand.d.ts +3 -0
  28. package/dist/commands/mcpCommand.d.ts.map +1 -1
  29. package/dist/commands/mcpCommand.js +189 -51
  30. package/dist/commands/mcpCommand.js.map +1 -1
  31. package/dist/commands/renderCommand.d.ts +28 -0
  32. package/dist/commands/renderCommand.d.ts.map +1 -0
  33. package/dist/commands/renderCommand.js +495 -0
  34. package/dist/commands/renderCommand.js.map +1 -0
  35. package/dist/commands/serveCommand.d.ts +2 -0
  36. package/dist/commands/serveCommand.d.ts.map +1 -1
  37. package/dist/commands/serveCommand.js +85 -44
  38. package/dist/commands/serveCommand.js.map +1 -1
  39. package/dist/commands/serviceDiffCommitsCommand.d.ts +16 -0
  40. package/dist/commands/serviceDiffCommitsCommand.d.ts.map +1 -0
  41. package/dist/commands/serviceDiffCommitsCommand.js +230 -0
  42. package/dist/commands/serviceDiffCommitsCommand.js.map +1 -0
  43. package/dist/commands/watchCommand.d.ts +2 -0
  44. package/dist/commands/watchCommand.d.ts.map +1 -1
  45. package/dist/commands/watchCommand.js +47 -41
  46. package/dist/commands/watchCommand.js.map +1 -1
  47. package/dist/comparison.d.ts +4 -3
  48. package/dist/comparison.d.ts.map +1 -1
  49. package/dist/comparison.js +17 -14
  50. package/dist/comparison.js.map +1 -1
  51. package/dist/component-explorer-config.schema.json +55 -2
  52. package/dist/componentExplorer.d.ts +122 -20
  53. package/dist/componentExplorer.d.ts.map +1 -1
  54. package/dist/componentExplorer.js +250 -78
  55. package/dist/componentExplorer.js.map +1 -1
  56. package/dist/{watchConfig.d.ts → config.d.ts} +59 -26
  57. package/dist/config.d.ts.map +1 -0
  58. package/dist/{watchConfig.js → config.js} +108 -31
  59. package/dist/config.js.map +1 -0
  60. package/dist/coverage.d.ts +64 -0
  61. package/dist/coverage.d.ts.map +1 -0
  62. package/dist/coverage.js +212 -0
  63. package/dist/coverage.js.map +1 -0
  64. package/dist/daemon/DaemonService.d.ts +17 -8
  65. package/dist/daemon/DaemonService.d.ts.map +1 -1
  66. package/dist/daemon/DaemonService.js +64 -57
  67. package/dist/daemon/DaemonService.js.map +1 -1
  68. package/dist/daemon/approvalStore.d.ts +2 -1
  69. package/dist/daemon/approvalStore.d.ts.map +1 -1
  70. package/dist/daemon/approvalStore.js +4 -3
  71. package/dist/daemon/approvalStore.js.map +1 -1
  72. package/dist/daemon/client.d.ts +5 -0
  73. package/dist/daemon/client.d.ts.map +1 -0
  74. package/dist/daemon/client.js +7 -0
  75. package/dist/daemon/client.js.map +1 -0
  76. package/dist/daemon/inProcessClient.d.ts +11 -0
  77. package/dist/daemon/inProcessClient.d.ts.map +1 -0
  78. package/dist/daemon/inProcessClient.js +35 -0
  79. package/dist/daemon/inProcessClient.js.map +1 -0
  80. package/dist/daemon/lifecycle.d.ts +8 -1
  81. package/dist/daemon/lifecycle.d.ts.map +1 -1
  82. package/dist/daemon/lifecycle.js +13 -3
  83. package/dist/daemon/lifecycle.js.map +1 -1
  84. package/dist/daemon/pipeClient.d.ts +2 -0
  85. package/dist/daemon/pipeClient.d.ts.map +1 -1
  86. package/dist/daemon/pipeClient.js +29 -9
  87. package/dist/daemon/pipeClient.js.map +1 -1
  88. package/dist/daemon/pipeName.d.ts +7 -1
  89. package/dist/daemon/pipeName.d.ts.map +1 -1
  90. package/dist/daemon/pipeName.js +8 -4
  91. package/dist/daemon/pipeName.js.map +1 -1
  92. package/dist/daemon/pipeServer.d.ts.map +1 -1
  93. package/dist/daemon/pipeServer.js +10 -4
  94. package/dist/daemon/pipeServer.js.map +1 -1
  95. package/dist/daemon/version.d.ts +2 -2
  96. package/dist/daemon/version.d.ts.map +1 -1
  97. package/dist/daemon/version.js +2 -2
  98. package/dist/dependencyInstaller.d.ts +3 -2
  99. package/dist/dependencyInstaller.d.ts.map +1 -1
  100. package/dist/dependencyInstaller.js +4 -4
  101. package/dist/dependencyInstaller.js.map +1 -1
  102. package/dist/evaluateFn.d.ts +21 -0
  103. package/dist/evaluateFn.d.ts.map +1 -0
  104. package/dist/evaluateFn.js +17 -0
  105. package/dist/evaluateFn.js.map +1 -0
  106. package/dist/explorerSession.d.ts +2 -3
  107. package/dist/explorerSession.d.ts.map +1 -1
  108. package/dist/explorerSession.js +3 -20
  109. package/dist/explorerSession.js.map +1 -1
  110. package/dist/git/gitCommitResolver.d.ts +2 -1
  111. package/dist/git/gitCommitResolver.d.ts.map +1 -1
  112. package/dist/git/gitCommitResolver.js +8 -8
  113. package/dist/git/gitCommitResolver.js.map +1 -1
  114. package/dist/git/gitIndexResolver.d.ts +2 -1
  115. package/dist/git/gitIndexResolver.d.ts.map +1 -1
  116. package/dist/git/gitIndexResolver.js +7 -7
  117. package/dist/git/gitIndexResolver.js.map +1 -1
  118. package/dist/git/gitService.d.ts +5 -4
  119. package/dist/git/gitService.d.ts.map +1 -1
  120. package/dist/git/gitService.js.map +1 -1
  121. package/dist/git/gitUtils.d.ts +6 -4
  122. package/dist/git/gitUtils.d.ts.map +1 -1
  123. package/dist/git/gitUtils.js +10 -5
  124. package/dist/git/gitUtils.js.map +1 -1
  125. package/dist/git/gitWorktreeManager.d.ts +15 -14
  126. package/dist/git/gitWorktreeManager.d.ts.map +1 -1
  127. package/dist/git/gitWorktreeManager.js +10 -11
  128. package/dist/git/gitWorktreeManager.js.map +1 -1
  129. package/dist/git/testUtils.d.ts +2 -1
  130. package/dist/git/testUtils.d.ts.map +1 -1
  131. package/dist/index.js +21 -3
  132. package/dist/index.js.map +1 -1
  133. package/dist/js-component-explorer/packages/common/dist/explorerUrl.js +21 -0
  134. package/dist/js-component-explorer/packages/common/dist/explorerUrl.js.map +1 -0
  135. package/dist/js-component-explorer/packages/common/dist/renderManifest.js +68 -0
  136. package/dist/js-component-explorer/packages/common/dist/renderManifest.js.map +1 -0
  137. package/dist/js-component-explorer/packages/semver/dist/index.js +186 -0
  138. package/dist/js-component-explorer/packages/semver/dist/index.js.map +1 -0
  139. package/dist/{packages/simple-api/dist/chunk-3R7GHWBM.js → js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js} +2 -1
  140. package/dist/js-component-explorer/packages/simple-api/dist/chunk-FJ7AVNQE.js.map +1 -0
  141. package/dist/{packages/simple-api/dist/chunk-SGBCNXYH.js → js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js} +4 -1
  142. package/dist/js-component-explorer/packages/simple-api/dist/chunk-TTRCY65Z.js.map +1 -0
  143. package/dist/{packages/simple-api/dist/chunk-TAEFVNPN.js → js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js} +2 -1
  144. package/dist/js-component-explorer/packages/simple-api/dist/chunk-WNXMRXWV.js.map +1 -0
  145. package/dist/{packages → js-component-explorer/packages}/simple-api/dist/express.js +1 -1
  146. package/dist/js-component-explorer/packages/simple-api/dist/express.js.map +1 -0
  147. package/dist/logger.d.ts +12 -1
  148. package/dist/logger.d.ts.map +1 -1
  149. package/dist/logger.js +35 -2
  150. package/dist/logger.js.map +1 -1
  151. package/dist/manifest.schema.json +215 -0
  152. package/dist/mcp/DaemonAccessor.d.ts +22 -0
  153. package/dist/mcp/DaemonAccessor.d.ts.map +1 -0
  154. package/dist/mcp/McpServer.d.ts +5 -19
  155. package/dist/mcp/McpServer.d.ts.map +1 -1
  156. package/dist/mcp/McpServer.js +391 -304
  157. package/dist/mcp/McpServer.js.map +1 -1
  158. package/dist/path.d.ts +30 -0
  159. package/dist/path.d.ts.map +1 -0
  160. package/dist/path.js +78 -0
  161. package/dist/path.js.map +1 -0
  162. package/dist/processTree.d.ts +14 -0
  163. package/dist/processTree.d.ts.map +1 -0
  164. package/dist/processTree.js +84 -0
  165. package/dist/processTree.js.map +1 -0
  166. package/dist/renderManifest.d.ts +5 -0
  167. package/dist/renderManifest.d.ts.map +1 -0
  168. package/dist/renderManifest.js +11 -0
  169. package/dist/renderManifest.js.map +1 -0
  170. package/dist/screenshotServiceClient.d.ts +31 -0
  171. package/dist/screenshotServiceClient.d.ts.map +1 -0
  172. package/dist/screenshotServiceClient.js +38 -0
  173. package/dist/screenshotServiceClient.js.map +1 -0
  174. package/dist/server/httpServer.d.ts +14 -0
  175. package/dist/server/httpServer.d.ts.map +1 -0
  176. package/dist/server/httpServer.js +110 -0
  177. package/dist/server/httpServer.js.map +1 -0
  178. package/dist/server/httpServer.test.d.ts.map +1 -0
  179. package/dist/server/serverConfig.d.ts +59 -0
  180. package/dist/server/serverConfig.d.ts.map +1 -0
  181. package/dist/server/serverConfig.js +53 -0
  182. package/dist/server/serverConfig.js.map +1 -0
  183. package/dist/server/types.d.ts +6 -0
  184. package/dist/server/types.d.ts.map +1 -0
  185. package/dist/server/viteServer.d.ts +31 -0
  186. package/dist/server/viteServer.d.ts.map +1 -0
  187. package/dist/{httpServer.js → server/viteServer.js} +96 -115
  188. package/dist/server/viteServer.js.map +1 -0
  189. package/dist/storage.d.ts +2 -1
  190. package/dist/storage.d.ts.map +1 -1
  191. package/dist/storage.js +1 -1
  192. package/dist/storage.js.map +1 -1
  193. package/dist/utils.d.ts +3 -25
  194. package/dist/utils.d.ts.map +1 -1
  195. package/dist/utils.js +4 -23
  196. package/dist/utils.js.map +1 -1
  197. package/dist/visualCache.d.ts +2 -1
  198. package/dist/visualCache.d.ts.map +1 -1
  199. package/dist/visualCache.js +4 -3
  200. package/dist/visualCache.js.map +1 -1
  201. package/dist/viteProjectRef.d.ts +4 -12
  202. package/dist/viteProjectRef.d.ts.map +1 -1
  203. package/dist/viteProjectRef.js +9 -17
  204. package/dist/viteProjectRef.js.map +1 -1
  205. package/dist/vscode-observables/observables/dist/disposables.js.map +1 -0
  206. package/dist/vscode-observables/observables/dist/observableInternal/base.js.map +1 -0
  207. package/dist/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -0
  208. package/dist/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +1 -0
  209. package/dist/vscode-observables/observables/dist/observableInternal/debugName.js.map +1 -0
  210. package/dist/vscode-observables/observables/dist/observableInternal/index.js.map +1 -0
  211. package/dist/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -0
  212. package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/debugGetDependencyGraph.js +1 -1
  213. package/dist/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +1 -0
  214. package/dist/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +1 -0
  215. package/dist/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -0
  216. package/dist/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -0
  217. package/dist/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +1 -0
  218. package/dist/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +1 -0
  219. package/dist/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +1 -0
  220. package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js → vscode-observables/observables/dist/observableInternal/reactions/createEffect.js} +9 -5
  221. package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffect.js.map +1 -0
  222. package/dist/{external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js → vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js} +1 -1
  223. package/dist/vscode-observables/observables/dist/observableInternal/reactions/createEffectImpl.js.map +1 -0
  224. package/dist/vscode-observables/observables/dist/observableInternal/transaction.js.map +1 -0
  225. package/dist/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +1 -0
  226. package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/utils/utilsCancellation.js +2 -2
  227. package/dist/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +1 -0
  228. package/package.json +34 -22
  229. package/dist/commands/screenshotCommand.d.ts +0 -18
  230. package/dist/commands/screenshotCommand.d.ts.map +0 -1
  231. package/dist/commands/screenshotCommand.js +0 -127
  232. package/dist/commands/screenshotCommand.js.map +0 -1
  233. package/dist/external/vscode-observables/observables/dist/disposables.js.map +0 -1
  234. package/dist/external/vscode-observables/observables/dist/observableInternal/base.js.map +0 -1
  235. package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +0 -1
  236. package/dist/external/vscode-observables/observables/dist/observableInternal/debugLocation.js.map +0 -1
  237. package/dist/external/vscode-observables/observables/dist/observableInternal/debugName.js.map +0 -1
  238. package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +0 -1
  239. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +0 -1
  240. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugGetDependencyGraph.js.map +0 -1
  241. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/logging.js.map +0 -1
  242. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +0 -1
  243. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +0 -1
  244. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derivedImpl.js.map +0 -1
  245. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js.map +0 -1
  246. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js.map +0 -1
  247. package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorun.js.map +0 -1
  248. package/dist/external/vscode-observables/observables/dist/observableInternal/reactions/autorunImpl.js.map +0 -1
  249. package/dist/external/vscode-observables/observables/dist/observableInternal/transaction.js.map +0 -1
  250. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utils.js.map +0 -1
  251. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +0 -1
  252. package/dist/httpServer.d.ts +0 -36
  253. package/dist/httpServer.d.ts.map +0 -1
  254. package/dist/httpServer.js.map +0 -1
  255. package/dist/httpServer.test.d.ts.map +0 -1
  256. package/dist/packages/simple-api/dist/chunk-3R7GHWBM.js.map +0 -1
  257. package/dist/packages/simple-api/dist/chunk-SGBCNXYH.js.map +0 -1
  258. package/dist/packages/simple-api/dist/chunk-TAEFVNPN.js.map +0 -1
  259. package/dist/packages/simple-api/dist/express.js.map +0 -1
  260. package/dist/resolveProject.d.ts +0 -21
  261. package/dist/resolveProject.d.ts.map +0 -1
  262. package/dist/resolveProject.js +0 -39
  263. package/dist/resolveProject.js.map +0 -1
  264. package/dist/watchConfig.d.ts.map +0 -1
  265. package/dist/watchConfig.js.map +0 -1
  266. /package/dist/{httpServer.test.d.ts → server/httpServer.test.d.ts} +0 -0
  267. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/disposables.js +0 -0
  268. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/base.js +0 -0
  269. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/commonFacade/deps.js +0 -0
  270. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugLocation.js +0 -0
  271. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/debugName.js +0 -0
  272. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/index.js +0 -0
  273. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/consoleObservableLogger.js +0 -0
  274. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/logging/logging.js +0 -0
  275. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/baseObservable.js +0 -0
  276. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derived.js +0 -0
  277. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/derivedImpl.js +0 -0
  278. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableFromEvent.js +0 -0
  279. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/observables/observableValue.js +0 -0
  280. /package/dist/{external/vscode-observables → vscode-observables}/observables/dist/observableInternal/transaction.js +0 -0
  281. /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 './httpServer.js';
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 interface ScreenshotResult {
119
+ export declare class ScreenshotResult {
45
120
  readonly image: Uint8Array | undefined;
46
- readonly hasError: boolean;
121
+ readonly renderHasError: boolean;
47
122
  readonly error?: ExceptionError;
48
123
  readonly events: RenderEvent[];
49
- readonly resultData?: unknown;
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 interface StabilityCheckResult {
150
+ export declare class StabilityCheckResult {
56
151
  readonly screenshots: readonly StabilityScreenshot[];
57
- readonly hasError: boolean;
152
+ readonly renderHasError: boolean;
58
153
  readonly error?: ExceptionError;
59
154
  readonly events: RenderEvent[];
60
- readonly resultData?: unknown;
61
- }
62
- export interface ComponentExplorer {
63
- readonly sourceTreeId: IObservable<SourceTreeId>;
64
- listFixtures(): Promise<ListFixturesResult>;
65
- screenshotFixture(fixtureId: string): Promise<ScreenshotResult>;
66
- screenshotFixtureStabilityCheck(fixtureId: string): Promise<StabilityCheckResult>;
67
- evaluateJs(expression: string, fixtureId?: string): Promise<unknown>;
68
- codeCoverage(id: FixtureId | FixtureGroupId): Promise<CoverageData>;
69
- waitForUpdate(timeoutMs?: number): Promise<void>;
70
- dispose(): Promise<void>;
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":"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"}
1
+ {"version":3,"file":"componentExplorer.d.ts","sourceRoot":"","sources":["../src/componentExplorer.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,100 @@
1
- import './external/vscode-observables/observables/dist/observableInternal/index.js';
2
- import { observableValue } from './external/vscode-observables/observables/dist/observableInternal/observables/observableValue.js';
3
- import './external/vscode-observables/observables/dist/observableInternal/debugLocation.js';
4
- import './external/vscode-observables/observables/dist/observableInternal/observables/derived.js';
5
- import './external/vscode-observables/observables/dist/observableInternal/utils/utils.js';
6
- import './external/vscode-observables/observables/dist/observableInternal/observables/observableFromEvent.js';
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 { buildExplorerUrl } from './utils.js';
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
- async function unwrapScreenshot(page, domExpr) {
13
- const result = await page.screenshot(domExpr);
14
- if (!result.ok) {
15
- throw new Error(`Fixture DOM node not found`);
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, rawRender: true });
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('Polling for __componentExplorer__ to initialize...');
52
- await page.evaluateJs(`
53
- new Promise(resolve => {
54
- function check() {
55
- if (window.__componentExplorer__) resolve();
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, sessionId=${this._lastState.sessionId}, version=${this._lastState.updateVersion}`);
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.evaluateJs(`({
74
- sessionId: window.__componentExplorer__.sessionId,
75
- updateVersion: window.__componentExplorer__.updateVersion,
76
- runtimeVersion: window.__componentExplorer__.runtimeVersion,
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.evaluateJs('window.__componentExplorer__.listFixtures()');
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 escapedId = JSON.stringify(fixtureId);
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
- const renderResult = await page.evaluateJs(`window.__componentExplorer__.renderFixture(${escapedId})`);
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
- return { image: image.ok ? image.screenshot : undefined, ...renderResult };
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 escapedId = JSON.stringify(fixtureId);
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
- await page.evaluateJs(`window.__componentExplorer__.disposeCurrentFixture?.()`);
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 renderResult = await page.evaluateJs(`window.__componentExplorer__.renderFixture(${escapedId})`);
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
- return {
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
- ...renderResult,
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
- const escapedId = JSON.stringify(fixtureId);
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
- const page = await this._ensureReady();
187
- const prev = await this._getState(page);
188
- this._logger.debug(`Waiting for update (sessionId=${prev.sessionId}, version=${prev.updateVersion})...`);
189
- const newState = await page.evaluateJs(`
190
- new Promise((resolve, reject) => {
191
- ${timeoutMs > 0 ? `const timeout = setTimeout(() => reject(new Error('Timeout waiting for HMR update')), ${timeoutMs});` : ''}
192
- function check() {
193
- if (!window.__componentExplorer__) {
194
- // Page reloaded CLI not yet re-initialized, keep waiting
195
- setTimeout(check, 50);
196
- return;
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._logger.debug(`HMR update: version ${prev.updateVersion} ${newState.updateVersion}`);
381
+ await waitForState(this.sourceTreeId, id => id !== currentId);
218
382
  }
219
- this._lastState = newState;
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