@vscode/component-explorer-cli 0.1.1-2 → 0.1.1-21

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 (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/SECURITY.md +14 -0
  4. package/dist/WorktreePool.d.ts +22 -0
  5. package/dist/WorktreePool.d.ts.map +1 -0
  6. package/dist/WorktreePool.js +58 -0
  7. package/dist/WorktreePool.js.map +1 -0
  8. package/dist/WorktreePool.test.d.ts +2 -0
  9. package/dist/WorktreePool.test.d.ts.map +1 -0
  10. package/dist/_virtual/_build-info.js +4 -0
  11. package/dist/_virtual/_build-info.js.map +1 -0
  12. package/dist/browserPage.d.ts +5 -0
  13. package/dist/browserPage.d.ts.map +1 -1
  14. package/dist/browserPage.js +28 -2
  15. package/dist/browserPage.js.map +1 -1
  16. package/dist/commands/acceptCommand.d.ts +2 -1
  17. package/dist/commands/acceptCommand.d.ts.map +1 -1
  18. package/dist/commands/acceptCommand.js +15 -8
  19. package/dist/commands/acceptCommand.js.map +1 -1
  20. package/dist/commands/checkStabilityCommand.d.ts +12 -0
  21. package/dist/commands/checkStabilityCommand.d.ts.map +1 -0
  22. package/dist/commands/checkStabilityCommand.js +84 -0
  23. package/dist/commands/checkStabilityCommand.js.map +1 -0
  24. package/dist/commands/compareCommand.d.ts +6 -1
  25. package/dist/commands/compareCommand.d.ts.map +1 -1
  26. package/dist/commands/compareCommand.js +64 -71
  27. package/dist/commands/compareCommand.js.map +1 -1
  28. package/dist/commands/mcpCommand.d.ts +4 -1
  29. package/dist/commands/mcpCommand.d.ts.map +1 -1
  30. package/dist/commands/mcpCommand.js +51 -8
  31. package/dist/commands/mcpCommand.js.map +1 -1
  32. package/dist/commands/screenshotCommand.d.ts +9 -2
  33. package/dist/commands/screenshotCommand.d.ts.map +1 -1
  34. package/dist/commands/screenshotCommand.js +73 -15
  35. package/dist/commands/screenshotCommand.js.map +1 -1
  36. package/dist/commands/serveCommand.d.ts +6 -1
  37. package/dist/commands/serveCommand.d.ts.map +1 -1
  38. package/dist/commands/serveCommand.js +104 -23
  39. package/dist/commands/serveCommand.js.map +1 -1
  40. package/dist/commands/watchCommand.d.ts +3 -2
  41. package/dist/commands/watchCommand.d.ts.map +1 -1
  42. package/dist/commands/watchCommand.js +28 -80
  43. package/dist/commands/watchCommand.js.map +1 -1
  44. package/dist/comparison.d.ts +70 -0
  45. package/dist/comparison.d.ts.map +1 -0
  46. package/dist/comparison.js +264 -0
  47. package/dist/comparison.js.map +1 -0
  48. package/dist/component-explorer-config.schema.json +222 -0
  49. package/dist/componentExplorer.d.ts +40 -2
  50. package/dist/componentExplorer.d.ts.map +1 -1
  51. package/dist/componentExplorer.js +118 -24
  52. package/dist/componentExplorer.js.map +1 -1
  53. package/dist/daemon/DaemonContext.d.ts +4 -0
  54. package/dist/daemon/DaemonContext.d.ts.map +1 -0
  55. package/dist/daemon/DaemonService.d.ts +146 -21
  56. package/dist/daemon/DaemonService.d.ts.map +1 -1
  57. package/dist/daemon/DaemonService.js +620 -123
  58. package/dist/daemon/DaemonService.js.map +1 -1
  59. package/dist/daemon/dynamicSessions.test.d.ts +2 -0
  60. package/dist/daemon/dynamicSessions.test.d.ts.map +1 -0
  61. package/dist/daemon/lifecycle.d.ts +8 -3
  62. package/dist/daemon/lifecycle.d.ts.map +1 -1
  63. package/dist/daemon/lifecycle.js +27 -10
  64. package/dist/daemon/lifecycle.js.map +1 -1
  65. package/dist/daemon/pipeClient.d.ts +6 -1
  66. package/dist/daemon/pipeClient.d.ts.map +1 -1
  67. package/dist/daemon/pipeClient.js +101 -8
  68. package/dist/daemon/pipeClient.js.map +1 -1
  69. package/dist/daemon/pipeServer.d.ts +2 -1
  70. package/dist/daemon/pipeServer.d.ts.map +1 -1
  71. package/dist/daemon/pipeServer.js +56 -6
  72. package/dist/daemon/pipeServer.js.map +1 -1
  73. package/dist/daemon/types.d.ts +12 -0
  74. package/dist/daemon/types.d.ts.map +1 -0
  75. package/dist/daemon/version.d.ts +10 -0
  76. package/dist/daemon/version.d.ts.map +1 -0
  77. package/dist/daemon/version.js +17 -0
  78. package/dist/daemon/version.js.map +1 -0
  79. package/dist/dependencyInstaller.d.ts +2 -2
  80. package/dist/dependencyInstaller.d.ts.map +1 -1
  81. package/dist/dependencyInstaller.js +1 -1
  82. package/dist/dependencyInstaller.js.map +1 -1
  83. package/dist/external/vscode-observables/observables/dist/disposables.js +24 -1
  84. package/dist/external/vscode-observables/observables/dist/disposables.js.map +1 -1
  85. package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js +1 -4
  86. package/dist/external/vscode-observables/observables/dist/observableInternal/commonFacade/deps.js.map +1 -1
  87. package/dist/external/vscode-observables/observables/dist/observableInternal/index.js +2 -5
  88. package/dist/external/vscode-observables/observables/dist/observableInternal/index.js.map +1 -1
  89. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js +30 -6
  90. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/consoleObservableLogger.js.map +1 -1
  91. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js +1 -1
  92. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/baseObservable.js.map +1 -1
  93. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js +12 -1
  94. package/dist/external/vscode-observables/observables/dist/observableInternal/observables/derived.js.map +1 -1
  95. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js +55 -0
  96. package/dist/external/vscode-observables/observables/dist/observableInternal/utils/utilsCancellation.js.map +1 -0
  97. package/dist/formatValue.d.ts +2 -0
  98. package/dist/formatValue.d.ts.map +1 -0
  99. package/dist/formatValue.js +96 -0
  100. package/dist/formatValue.js.map +1 -0
  101. package/dist/formatValue.test.d.ts +2 -0
  102. package/dist/formatValue.test.d.ts.map +1 -0
  103. package/dist/git/gitIndexResolver.d.ts +25 -0
  104. package/dist/git/gitIndexResolver.d.ts.map +1 -0
  105. package/dist/git/gitIndexResolver.js +91 -0
  106. package/dist/git/gitIndexResolver.js.map +1 -0
  107. package/dist/git/gitIndexResolver.test.d.ts +2 -0
  108. package/dist/git/gitIndexResolver.test.d.ts.map +1 -0
  109. package/dist/git/gitService.d.ts +2 -0
  110. package/dist/git/gitService.d.ts.map +1 -1
  111. package/dist/git/gitService.js +6 -0
  112. package/dist/git/gitService.js.map +1 -1
  113. package/dist/git/gitUtils.js +1 -1
  114. package/dist/git/gitUtils.js.map +1 -1
  115. package/dist/git/gitWorktreeManager.d.ts +6 -0
  116. package/dist/git/gitWorktreeManager.d.ts.map +1 -1
  117. package/dist/git/gitWorktreeManager.js +42 -13
  118. package/dist/git/gitWorktreeManager.js.map +1 -1
  119. package/dist/git/gitWorktreeManager.test.d.ts +2 -0
  120. package/dist/git/gitWorktreeManager.test.d.ts.map +1 -0
  121. package/dist/git/testUtils.d.ts +13 -0
  122. package/dist/git/testUtils.d.ts.map +1 -0
  123. package/dist/httpServer.d.ts +6 -1
  124. package/dist/httpServer.d.ts.map +1 -1
  125. package/dist/httpServer.js +30 -10
  126. package/dist/httpServer.js.map +1 -1
  127. package/dist/index.js +11 -2
  128. package/dist/index.js.map +1 -1
  129. package/dist/logger.d.ts +1 -0
  130. package/dist/logger.d.ts.map +1 -1
  131. package/dist/logger.js +7 -1
  132. package/dist/logger.js.map +1 -1
  133. package/dist/mcp/McpServer.d.ts +47 -4
  134. package/dist/mcp/McpServer.d.ts.map +1 -1
  135. package/dist/mcp/McpServer.js +913 -155
  136. package/dist/mcp/McpServer.js.map +1 -1
  137. package/dist/mcp/TaskManager.d.ts +28 -0
  138. package/dist/mcp/TaskManager.d.ts.map +1 -0
  139. package/dist/mcp/TaskManager.js +54 -0
  140. package/dist/mcp/TaskManager.js.map +1 -0
  141. package/dist/packages/simple-api/dist/chunk-3R7GHWBM.js +137 -0
  142. package/dist/packages/simple-api/dist/chunk-3R7GHWBM.js.map +1 -0
  143. package/dist/packages/simple-api/dist/chunk-SGBCNXYH.js +24 -0
  144. package/dist/packages/simple-api/dist/chunk-SGBCNXYH.js.map +1 -0
  145. package/dist/packages/simple-api/dist/chunk-TAEFVNPN.js +27 -0
  146. package/dist/packages/simple-api/dist/chunk-TAEFVNPN.js.map +1 -0
  147. package/dist/packages/simple-api/dist/express.js +104 -0
  148. package/dist/packages/simple-api/dist/express.js.map +1 -0
  149. package/dist/resolveProject.d.ts +21 -0
  150. package/dist/resolveProject.d.ts.map +1 -0
  151. package/dist/resolveProject.js +39 -0
  152. package/dist/resolveProject.js.map +1 -0
  153. package/dist/utils.d.ts +31 -0
  154. package/dist/utils.d.ts.map +1 -0
  155. package/dist/utils.js +49 -0
  156. package/dist/utils.js.map +1 -0
  157. package/dist/watchConfig.d.ts +52 -9
  158. package/dist/watchConfig.d.ts.map +1 -1
  159. package/dist/watchConfig.js +67 -62
  160. package/dist/watchConfig.js.map +1 -1
  161. package/package.json +31 -8
  162. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/debuggerRpc.js +0 -72
  163. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/debuggerRpc.js.map +0 -1
  164. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/devToolsLogger.js +0 -447
  165. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/devToolsLogger.js.map +0 -1
  166. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/rpc.js +0 -64
  167. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/rpc.js.map +0 -1
  168. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/utils.js +0 -52
  169. package/dist/external/vscode-observables/observables/dist/observableInternal/logging/debugger/utils.js.map +0 -1
@@ -0,0 +1,264 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { contentHash } from './screenshotCache.js';
4
+ import { writeFile } from './utils.js';
5
+
6
+ /**
7
+ * Compare screenshots between current and baseline.
8
+ * @param currentScreenshots Map of fixture IDs to screenshot data (already captured)
9
+ * @param baselineStorage Storage to read baseline screenshots from
10
+ */
11
+ async function compareScreenshotsInMemory(currentScreenshots, baselineStorage) {
12
+ const added = [];
13
+ const changed = [];
14
+ const unchanged = [];
15
+ const fixtures = {};
16
+ for (const [fixtureId, screenshot] of currentScreenshots) {
17
+ const currentHash = contentHash(screenshot.data);
18
+ if (await baselineStorage.exists(`${fixtureId}.png`)) {
19
+ const baselineData = await baselineStorage.read(`${fixtureId}.png`);
20
+ const baselineHash = contentHash(baselineData);
21
+ if (currentHash === baselineHash) {
22
+ unchanged.push(fixtureId);
23
+ fixtures[fixtureId] = { status: 'unchanged', baselineHash, currentHash, background: screenshot.background, labels: screenshot.labels };
24
+ }
25
+ else {
26
+ changed.push(fixtureId);
27
+ fixtures[fixtureId] = { status: 'changed', baselineHash, currentHash, background: screenshot.background, labels: [...(screenshot.labels ?? []), 'changed'] };
28
+ }
29
+ }
30
+ else {
31
+ added.push(fixtureId);
32
+ fixtures[fixtureId] = { status: 'added', currentHash, background: screenshot.background, labels: screenshot.labels };
33
+ }
34
+ }
35
+ added.sort();
36
+ changed.sort();
37
+ unchanged.sort();
38
+ return { added, removed: [], changed, unchanged, fixtures };
39
+ }
40
+ async function compareScreenshotsOnDisk(currentStorage, baselineStorage, currentFiles, baselineFiles, options) {
41
+ const baselineSet = new Set(baselineFiles);
42
+ const currentSet = new Set(currentFiles);
43
+ const added = [];
44
+ const removed = [];
45
+ const changed = [];
46
+ const unchanged = [];
47
+ const fixtures = {};
48
+ for (const file of currentSet) {
49
+ const fixtureId = file.replace(/\.png$/, '');
50
+ const currentMeta = options?.currentMetadata?.[fixtureId];
51
+ const baselineMeta = options?.baselineMetadata?.[fixtureId];
52
+ const labels = currentMeta?.labels;
53
+ const labelsChanged = baselineMeta && !arraysEqual(baselineMeta.labels ?? [], labels ?? []);
54
+ const labelsBefore = labelsChanged ? baselineMeta.labels : undefined;
55
+ if (!baselineSet.has(file)) {
56
+ added.push(fixtureId);
57
+ const currentData = await currentStorage.read(file);
58
+ fixtures[fixtureId] = { status: 'added', currentHash: contentHash(currentData), background: currentMeta?.background, labels };
59
+ }
60
+ else {
61
+ const baselineData = await baselineStorage.read(file);
62
+ const currentData = await currentStorage.read(file);
63
+ const baselineHash = contentHash(baselineData);
64
+ const currentHash = contentHash(currentData);
65
+ if (baselineHash === currentHash) {
66
+ unchanged.push(fixtureId);
67
+ fixtures[fixtureId] = { status: 'unchanged', baselineHash, currentHash, background: currentMeta?.background, labels, labelsBefore };
68
+ }
69
+ else {
70
+ changed.push(fixtureId);
71
+ fixtures[fixtureId] = { status: 'changed', baselineHash, currentHash, background: currentMeta?.background, labels: [...(labels ?? []), 'changed'], labelsBefore };
72
+ }
73
+ }
74
+ }
75
+ for (const file of baselineSet) {
76
+ const fixtureId = file.replace(/\.png$/, '');
77
+ if (!currentSet.has(file)) {
78
+ removed.push(fixtureId);
79
+ const baselineData = await baselineStorage.read(file);
80
+ const baselineMeta = options?.baselineMetadata?.[fixtureId];
81
+ fixtures[fixtureId] = { status: 'removed', baselineHash: contentHash(baselineData), labels: baselineMeta?.labels };
82
+ }
83
+ }
84
+ added.sort();
85
+ removed.sort();
86
+ changed.sort();
87
+ unchanged.sort();
88
+ return { added, removed, changed, unchanged, fixtures };
89
+ }
90
+ function printComparisonToConsole(result, stdout) {
91
+ if (result.added.length > 0) {
92
+ stdout.write(`Added (${result.added.length}):\n`);
93
+ for (const f of result.added) {
94
+ stdout.write(` + ${f}\n`);
95
+ }
96
+ }
97
+ if (result.removed.length > 0) {
98
+ stdout.write(`Removed (${result.removed.length}):\n`);
99
+ for (const f of result.removed) {
100
+ stdout.write(` - ${f}\n`);
101
+ }
102
+ }
103
+ if (result.changed.length > 0) {
104
+ stdout.write(`Changed (${result.changed.length}):\n`);
105
+ for (const f of result.changed) {
106
+ stdout.write(` ~ ${f}\n`);
107
+ }
108
+ }
109
+ const total = result.added.length + result.removed.length + result.changed.length + result.unchanged.length;
110
+ stdout.write(`\nSummary: ${total} fixtures`);
111
+ if (result.added.length > 0 || result.removed.length > 0 || result.changed.length > 0) {
112
+ const parts = [];
113
+ if (result.added.length > 0)
114
+ parts.push(`${result.added.length} added`);
115
+ if (result.removed.length > 0)
116
+ parts.push(`${result.removed.length} removed`);
117
+ if (result.changed.length > 0)
118
+ parts.push(`${result.changed.length} changed`);
119
+ if (result.unchanged.length > 0)
120
+ parts.push(`${result.unchanged.length} unchanged`);
121
+ stdout.write(` (${parts.join(', ')})\n`);
122
+ }
123
+ else {
124
+ stdout.write(' — no differences\n');
125
+ }
126
+ }
127
+ async function writeComparisonReport(options) {
128
+ const { reportDir, result, baselinePath, currentPath, getBaselineData, getCurrentData } = options;
129
+ await fs.mkdir(reportDir, { recursive: true });
130
+ const screenshotsRelDir = 'screenshots';
131
+ const fixturesWithPaths = { ...result.fixtures };
132
+ for (const id of result.changed) {
133
+ const relBase = `${screenshotsRelDir}/${id}/baseline.png`;
134
+ const relCurrent = `${screenshotsRelDir}/${id}/current.png`;
135
+ const baselineData = await getBaselineData(id);
136
+ const currentData = await getCurrentData(id);
137
+ await writeFile(path.join(reportDir, relBase), baselineData);
138
+ await writeFile(path.join(reportDir, relCurrent), currentData);
139
+ fixturesWithPaths[id] = { ...fixturesWithPaths[id], baselineScreenshot: relBase, currentScreenshot: relCurrent };
140
+ }
141
+ for (const id of result.added) {
142
+ const relCurrent = `${screenshotsRelDir}/${id}/current.png`;
143
+ const currentData = await getCurrentData(id);
144
+ await writeFile(path.join(reportDir, relCurrent), currentData);
145
+ fixturesWithPaths[id] = { ...fixturesWithPaths[id], currentScreenshot: relCurrent };
146
+ }
147
+ for (const id of result.removed) {
148
+ const relBase = `${screenshotsRelDir}/${id}/baseline.png`;
149
+ const baselineData = await getBaselineData(id);
150
+ await writeFile(path.join(reportDir, relBase), baselineData);
151
+ fixturesWithPaths[id] = { ...fixturesWithPaths[id], baselineScreenshot: relBase };
152
+ }
153
+ const hasDiffs = result.added.length + result.removed.length + result.changed.length > 0;
154
+ const report = {
155
+ timestamp: new Date().toISOString(),
156
+ baseline: baselinePath,
157
+ current: currentPath,
158
+ summary: {
159
+ total: result.added.length + result.removed.length + result.changed.length + result.unchanged.length,
160
+ added: result.added.length,
161
+ removed: result.removed.length,
162
+ changed: result.changed.length,
163
+ unchanged: result.unchanged.length,
164
+ },
165
+ fixtures: fixturesWithPaths,
166
+ };
167
+ await fs.writeFile(path.join(reportDir, 'report.json'), JSON.stringify(report, null, 2));
168
+ if (hasDiffs) {
169
+ const markdown = generateMarkdownReport(report);
170
+ await fs.writeFile(path.join(reportDir, 'report.md'), markdown);
171
+ }
172
+ }
173
+ function generateMarkdownReport(report) {
174
+ const lines = [];
175
+ const changed = Object.entries(report.fixtures).filter(([, d]) => d.status === 'changed').map(([id]) => id);
176
+ const added = Object.entries(report.fixtures).filter(([, d]) => d.status === 'added').map(([id]) => id);
177
+ const removed = Object.entries(report.fixtures).filter(([, d]) => d.status === 'removed').map(([id]) => id);
178
+ const unchanged = Object.entries(report.fixtures).filter(([, d]) => d.status === 'unchanged').map(([id]) => id);
179
+ lines.push('# Screenshot Comparison Report');
180
+ lines.push('');
181
+ lines.push(`**Generated:** ${report.timestamp}`);
182
+ lines.push(`**Baseline:** \`${report.baseline}\``);
183
+ lines.push(`**Current:** \`${report.current}\``);
184
+ lines.push('');
185
+ lines.push('## Summary');
186
+ lines.push('');
187
+ lines.push('| Status | Count |');
188
+ lines.push('|--------|-------|');
189
+ if (added.length > 0)
190
+ lines.push(`| Added | ${added.length} |`);
191
+ if (removed.length > 0)
192
+ lines.push(`| Removed | ${removed.length} |`);
193
+ if (changed.length > 0)
194
+ lines.push(`| Changed | ${changed.length} |`);
195
+ lines.push(`| Unchanged | ${unchanged.length} |`);
196
+ lines.push(`| **Total** | **${report.summary.total}** |`);
197
+ lines.push('');
198
+ if (changed.length > 0) {
199
+ lines.push('## Changed Fixtures');
200
+ lines.push('');
201
+ for (const id of changed) {
202
+ const detail = report.fixtures[id];
203
+ lines.push(`### \`${id}\``);
204
+ lines.push('');
205
+ lines.push('| Baseline | Current |');
206
+ lines.push('|----------|---------|');
207
+ const baseImg = detail.baselineScreenshot ? `![baseline](${detail.baselineScreenshot})` : '-';
208
+ const curImg = detail.currentScreenshot ? `![current](${detail.currentScreenshot})` : '-';
209
+ lines.push(`| ${baseImg} | ${curImg} |`);
210
+ lines.push('');
211
+ }
212
+ }
213
+ if (added.length > 0) {
214
+ lines.push('## Added Fixtures');
215
+ lines.push('');
216
+ for (const id of added) {
217
+ const detail = report.fixtures[id];
218
+ lines.push(`### \`${id}\``);
219
+ lines.push('');
220
+ if (detail.currentScreenshot) {
221
+ lines.push(`![current](${detail.currentScreenshot})`);
222
+ }
223
+ lines.push('');
224
+ }
225
+ }
226
+ if (removed.length > 0) {
227
+ lines.push('## Removed Fixtures');
228
+ lines.push('');
229
+ for (const id of removed) {
230
+ const detail = report.fixtures[id];
231
+ lines.push(`### \`${id}\``);
232
+ lines.push('');
233
+ if (detail.baselineScreenshot) {
234
+ lines.push(`![baseline](${detail.baselineScreenshot})`);
235
+ }
236
+ lines.push('');
237
+ }
238
+ }
239
+ if (unchanged.length > 0) {
240
+ lines.push('<details>');
241
+ lines.push(`<summary>Unchanged Fixtures (${unchanged.length})</summary>`);
242
+ lines.push('');
243
+ for (const id of unchanged) {
244
+ lines.push(`- \`${id}\``);
245
+ }
246
+ lines.push('');
247
+ lines.push('</details>');
248
+ }
249
+ return lines.join('\n');
250
+ }
251
+ function arraysEqual(a, b) {
252
+ if (a.length !== b.length) {
253
+ return false;
254
+ }
255
+ for (let i = 0; i < a.length; i++) {
256
+ if (a[i] !== b[i]) {
257
+ return false;
258
+ }
259
+ }
260
+ return true;
261
+ }
262
+
263
+ export { compareScreenshotsInMemory, compareScreenshotsOnDisk, generateMarkdownReport, printComparisonToConsole, writeComparisonReport };
264
+ //# sourceMappingURL=comparison.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comparison.js","sources":["../src/comparison.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,222 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "screenshotDir": {
6
+ "description": "Directory for storing screenshots (default: .screenshots)",
7
+ "type": "string"
8
+ },
9
+ "sessions": {
10
+ "minItems": 1,
11
+ "type": "array",
12
+ "items": {
13
+ "type": "object",
14
+ "properties": {
15
+ "name": {
16
+ "type": "string",
17
+ "description": "Unique session name"
18
+ },
19
+ "source": {
20
+ "description": "Source configuration (default: current working tree)",
21
+ "type": "object",
22
+ "properties": {
23
+ "worktree": {
24
+ "type": "object",
25
+ "properties": {
26
+ "ref": {
27
+ "type": "string",
28
+ "description": "Git ref to check out (branch, tag, commit, or \"INDEX\" for the git staging area)"
29
+ },
30
+ "install": {
31
+ "description": "Dependency install strategy override for this session",
32
+ "anyOf": [
33
+ {
34
+ "type": "string",
35
+ "const": "auto"
36
+ },
37
+ {
38
+ "type": "string",
39
+ "const": "npm"
40
+ },
41
+ {
42
+ "type": "string",
43
+ "const": "pnpm"
44
+ },
45
+ {
46
+ "type": "string",
47
+ "const": "yarn"
48
+ },
49
+ {
50
+ "type": "object",
51
+ "properties": {
52
+ "command": {
53
+ "type": "string",
54
+ "description": "Custom install command to run in the worktree"
55
+ }
56
+ },
57
+ "required": [
58
+ "command"
59
+ ],
60
+ "additionalProperties": false
61
+ },
62
+ {
63
+ "type": "boolean",
64
+ "const": false
65
+ }
66
+ ]
67
+ }
68
+ },
69
+ "required": [
70
+ "ref"
71
+ ],
72
+ "additionalProperties": false,
73
+ "description": "Worktree source configuration"
74
+ }
75
+ },
76
+ "required": [
77
+ "worktree"
78
+ ],
79
+ "additionalProperties": false
80
+ },
81
+ "viteConfig": {
82
+ "description": "Path to vite config file, relative to this config (overrides top-level viteConfig)",
83
+ "type": "string"
84
+ }
85
+ },
86
+ "required": [
87
+ "name"
88
+ ],
89
+ "additionalProperties": false,
90
+ "description": "A component explorer session"
91
+ },
92
+ "description": "List of explorer sessions (currently only \"current\" working tree sessions)"
93
+ },
94
+ "worktree": {
95
+ "description": "Dynamic worktree session pool configuration",
96
+ "type": "object",
97
+ "properties": {
98
+ "setup": {
99
+ "description": "Dependency install strategy for dynamic worktree sessions (default: auto)",
100
+ "anyOf": [
101
+ {
102
+ "type": "string",
103
+ "const": "auto"
104
+ },
105
+ {
106
+ "type": "string",
107
+ "const": "npm"
108
+ },
109
+ {
110
+ "type": "string",
111
+ "const": "pnpm"
112
+ },
113
+ {
114
+ "type": "string",
115
+ "const": "yarn"
116
+ },
117
+ {
118
+ "type": "object",
119
+ "properties": {
120
+ "command": {
121
+ "type": "string",
122
+ "description": "Custom install command to run in the worktree"
123
+ }
124
+ },
125
+ "required": [
126
+ "command"
127
+ ],
128
+ "additionalProperties": false
129
+ },
130
+ {
131
+ "type": "boolean",
132
+ "const": false
133
+ }
134
+ ]
135
+ },
136
+ "maxSlots": {
137
+ "description": "Maximum number of simultaneous worktree sessions (default: 2, max: 3)",
138
+ "type": "integer",
139
+ "minimum": 1,
140
+ "maximum": 3
141
+ }
142
+ },
143
+ "additionalProperties": false
144
+ },
145
+ "compare": {
146
+ "type": "object",
147
+ "properties": {
148
+ "baseline": {
149
+ "type": "string",
150
+ "description": "Session name to use as the baseline for comparisons"
151
+ },
152
+ "current": {
153
+ "type": "string",
154
+ "description": "Session name to use as the current version for comparisons"
155
+ }
156
+ },
157
+ "required": [
158
+ "baseline",
159
+ "current"
160
+ ],
161
+ "additionalProperties": false,
162
+ "description": "Screenshot comparison configuration"
163
+ },
164
+ "viteConfig": {
165
+ "description": "Default vite config file path, relative to this config (default: vite.config.ts)",
166
+ "type": "string"
167
+ },
168
+ "vite": {
169
+ "type": "object",
170
+ "properties": {
171
+ "hmr": {
172
+ "type": "object",
173
+ "properties": {
174
+ "allowedPaths": {
175
+ "type": "array",
176
+ "items": {
177
+ "type": "string"
178
+ },
179
+ "description": "Glob patterns for files that keep HMR; everything else triggers a full reload"
180
+ }
181
+ },
182
+ "required": [
183
+ "allowedPaths"
184
+ ],
185
+ "additionalProperties": false,
186
+ "description": "Vite HMR configuration"
187
+ }
188
+ },
189
+ "additionalProperties": false,
190
+ "description": "Vite configuration overrides"
191
+ },
192
+ "redirection": {
193
+ "type": "object",
194
+ "properties": {
195
+ "port": {
196
+ "type": "integer",
197
+ "minimum": 1,
198
+ "maximum": 65535,
199
+ "description": "Port for the redirection HTTP server"
200
+ },
201
+ "host": {
202
+ "description": "Host to bind the redirection server to (default: localhost)",
203
+ "type": "string"
204
+ }
205
+ },
206
+ "required": [
207
+ "port"
208
+ ],
209
+ "additionalProperties": false,
210
+ "description": "HTTP redirection server that redirects to the session URL"
211
+ },
212
+ "$schema": {
213
+ "type": "string",
214
+ "description": "URL of the JSON Schema for this config file"
215
+ }
216
+ },
217
+ "required": [
218
+ "sessions"
219
+ ],
220
+ "additionalProperties": false,
221
+ "description": "Component Explorer configuration"
222
+ }
@@ -5,6 +5,8 @@ export interface FixtureInfo {
5
5
  readonly fixtureId: string;
6
6
  readonly fixtureName: string;
7
7
  readonly groupPath: string[];
8
+ readonly background: 'light' | 'dark';
9
+ readonly labels: readonly string[];
8
10
  }
9
11
  export type FixtureId = {
10
12
  readonly fixtureId: string;
@@ -20,9 +22,41 @@ export interface CoverageFileEntry {
20
22
  readonly coveredLines: readonly number[];
21
23
  readonly uncoveredLines: readonly number[];
22
24
  }
25
+ export interface ExceptionError {
26
+ readonly message: string;
27
+ readonly stack?: string;
28
+ }
29
+ export type RenderEventType = 'console.error' | 'console.warn' | 'console.log' | 'window.error' | 'window.unhandledrejection';
30
+ export interface RenderEvent {
31
+ readonly type: RenderEventType;
32
+ readonly message: string;
33
+ }
34
+ /**
35
+ * Result of taking a screenshot, including any errors captured during rendering.
36
+ */
37
+ export interface ScreenshotResult {
38
+ readonly image: Uint8Array;
39
+ readonly hasError: boolean;
40
+ readonly error?: ExceptionError;
41
+ readonly events: RenderEvent[];
42
+ readonly resultData?: unknown;
43
+ }
44
+ export interface StabilityScreenshot {
45
+ readonly image: Uint8Array;
46
+ readonly delayMs: number;
47
+ }
48
+ export interface StabilityCheckResult {
49
+ readonly screenshots: readonly StabilityScreenshot[];
50
+ readonly hasError: boolean;
51
+ readonly error?: ExceptionError;
52
+ readonly events: RenderEvent[];
53
+ readonly resultData?: unknown;
54
+ }
23
55
  export interface ComponentExplorer {
24
56
  listFixtures(): Promise<FixtureInfo[]>;
25
- screenshotFixture(fixtureId: string): Promise<Uint8Array>;
57
+ screenshotFixture(fixtureId: string): Promise<ScreenshotResult>;
58
+ screenshotFixtureStabilityCheck(fixtureId: string): Promise<StabilityCheckResult>;
59
+ evaluateJs(expression: string, fixtureId?: string): Promise<unknown>;
26
60
  codeCoverage(id: FixtureId | FixtureGroupId): Promise<CoverageData>;
27
61
  waitForUpdate(timeoutMs?: number): Promise<void>;
28
62
  dispose(): Promise<void>;
@@ -33,12 +67,16 @@ export declare class BrowserComponentExplorer implements ComponentExplorer {
33
67
  private readonly _logger;
34
68
  private _page;
35
69
  private _lastState;
70
+ private _screenshotMutex;
36
71
  constructor(_browserPageFactory: BrowserPageFactory, _server: ComponentExplorerHttpServer, _logger?: ILogger);
37
72
  private _ensureReady;
38
73
  private _waitForCliApi;
74
+ private _assertRuntimeVersionCompatibility;
39
75
  private _getState;
40
76
  listFixtures(): Promise<FixtureInfo[]>;
41
- screenshotFixture(fixtureId: string): Promise<Uint8Array>;
77
+ screenshotFixture(fixtureId: string): Promise<ScreenshotResult>;
78
+ screenshotFixtureStabilityCheck(fixtureId: string): Promise<StabilityCheckResult>;
79
+ evaluateJs(expression: string, fixtureId?: string): Promise<unknown>;
42
80
  codeCoverage(_id: FixtureId | FixtureGroupId): Promise<CoverageData>;
43
81
  waitForUpdate(timeoutMs?: number): Promise<void>;
44
82
  dispose(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"componentExplorer.d.ts","sourceRoot":"","sources":["../src/componentExplorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,KAAK,OAAO,EAAc,MAAM,aAAa,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACvD,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IACjC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1D,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpE,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAOD,qBAAa,wBAAyB,YAAW,iBAAiB;IAKhE,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,UAAU,CAAuB;gBAGvB,mBAAmB,EAAE,kBAAkB,EACvC,OAAO,EAAE,2BAA2B,EACpC,OAAO,GAAE,OAAoB;YAGjC,YAAY;YAUZ,cAAc;YAed,SAAS;IAOjB,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IASzD,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAIpE,aAAa,CAAC,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI9B"}
1
+ {"version":3,"file":"componentExplorer.d.ts","sourceRoot":"","sources":["../src/componentExplorer.ts"],"names":[],"mappings":"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"}