@wp-tester/results 0.0.1 → 0.0.2
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/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/streaming.d.ts +198 -0
- package/dist/streaming.d.ts.map +1 -0
- package/dist/streaming.js +620 -0
- package/dist/streaming.js.map +1 -0
- package/dist/streaming.spec.d.ts +5 -0
- package/dist/streaming.spec.d.ts.map +1 -0
- package/dist/streaming.spec.js +217 -0
- package/dist/streaming.spec.js.map +1 -0
- package/dist/summary.d.ts +13 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +40 -0
- package/dist/summary.js.map +1 -0
- package/dist/teamcity-parser.d.ts +70 -0
- package/dist/teamcity-parser.d.ts.map +1 -0
- package/dist/teamcity-parser.js +256 -0
- package/dist/teamcity-parser.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/vitest-streaming-reporter.d.ts +67 -0
- package/dist/vitest-streaming-reporter.d.ts.map +1 -0
- package/dist/vitest-streaming-reporter.js +236 -0
- package/dist/vitest-streaming-reporter.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,620 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming Test Reporter
|
|
3
|
+
*
|
|
4
|
+
* Provides real-time test result output in a uniform format.
|
|
5
|
+
* Works with both Vitest and PHPUnit test runners.
|
|
6
|
+
*
|
|
7
|
+
* Uses a unified state model with full screen rerendering for clean
|
|
8
|
+
* parallel test execution without output interference.
|
|
9
|
+
*/
|
|
10
|
+
import pc from "picocolors";
|
|
11
|
+
/**
|
|
12
|
+
* Spinner frames for animated loader
|
|
13
|
+
*/
|
|
14
|
+
const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
15
|
+
/**
|
|
16
|
+
* Default stdout writer
|
|
17
|
+
*/
|
|
18
|
+
export const stdoutWriter = {
|
|
19
|
+
write(text) {
|
|
20
|
+
process.stdout.write(text);
|
|
21
|
+
},
|
|
22
|
+
writeLine(text) {
|
|
23
|
+
process.stdout.write(text + "\n");
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Format duration in human-readable format
|
|
28
|
+
*/
|
|
29
|
+
function formatDuration(ms) {
|
|
30
|
+
if (ms < 1000) {
|
|
31
|
+
return `${Math.round(ms)}ms`;
|
|
32
|
+
}
|
|
33
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Streaming test reporter for real-time test output
|
|
37
|
+
*
|
|
38
|
+
* Uses a unified state model where all test state is centralized and
|
|
39
|
+
* the entire output is rerendered on each update. This approach:
|
|
40
|
+
* - Eliminates output interference between parallel test runs
|
|
41
|
+
* - Simplifies state management (no per-file buffering)
|
|
42
|
+
* - Maintains dynamic UI with loaders/spinners
|
|
43
|
+
* - Makes the code much easier to understand and maintain
|
|
44
|
+
*/
|
|
45
|
+
export class StreamingReporter {
|
|
46
|
+
constructor(options = {}) {
|
|
47
|
+
this.enabled = true;
|
|
48
|
+
this.showRunBoundaries = true;
|
|
49
|
+
this.showSummary = true;
|
|
50
|
+
// Rendering state
|
|
51
|
+
this.lastOutputLineCount = 0;
|
|
52
|
+
this.spinnerFrame = 0;
|
|
53
|
+
this.spinnerInterval = null;
|
|
54
|
+
this.writer = options.writer ?? stdoutWriter;
|
|
55
|
+
this.showRunBoundaries = options.showRunBoundaries ?? true;
|
|
56
|
+
this.showSummary = options.showSummary ?? true;
|
|
57
|
+
this.enabled = options.enabled ?? true;
|
|
58
|
+
this.state = {
|
|
59
|
+
files: new Map(),
|
|
60
|
+
toolName: "wp-tester",
|
|
61
|
+
startTime: 0,
|
|
62
|
+
totalTests: 0,
|
|
63
|
+
passedTests: 0,
|
|
64
|
+
failedTests: 0,
|
|
65
|
+
skippedTests: 0,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Enable or disable run boundaries (header and summary)
|
|
70
|
+
*/
|
|
71
|
+
setShowRunBoundaries(show) {
|
|
72
|
+
this.showRunBoundaries = show;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Process a stream event
|
|
76
|
+
*/
|
|
77
|
+
onEvent(event) {
|
|
78
|
+
switch (event.type) {
|
|
79
|
+
case "run:start":
|
|
80
|
+
this.onRunStart(event.toolName);
|
|
81
|
+
break;
|
|
82
|
+
case "run:end":
|
|
83
|
+
this.onRunEnd();
|
|
84
|
+
break;
|
|
85
|
+
case "file:start":
|
|
86
|
+
this.onFileStart(event.fileId, event.fileName);
|
|
87
|
+
break;
|
|
88
|
+
case "file:end":
|
|
89
|
+
this.onFileEnd(event.fileId);
|
|
90
|
+
break;
|
|
91
|
+
case "suite:start":
|
|
92
|
+
this.onSuiteStart(event.name, event.fileId);
|
|
93
|
+
break;
|
|
94
|
+
case "suite:end":
|
|
95
|
+
this.onSuiteEnd(event.name, event.fileId);
|
|
96
|
+
break;
|
|
97
|
+
case "test:start":
|
|
98
|
+
this.onTestStart(event.name, event.suiteName, event.fileId);
|
|
99
|
+
break;
|
|
100
|
+
case "test:pass":
|
|
101
|
+
this.onTestPass(event.name, event.duration || 0, event.suiteName, event.fileId);
|
|
102
|
+
break;
|
|
103
|
+
case "test:fail":
|
|
104
|
+
this.onTestFail(event.name, event.duration || 0, event.message, event.trace, event.suiteName, event.fileId);
|
|
105
|
+
break;
|
|
106
|
+
case "test:skip":
|
|
107
|
+
this.onTestSkip(event.name, event.message, event.suiteName, event.fileId);
|
|
108
|
+
break;
|
|
109
|
+
case "test:pending":
|
|
110
|
+
this.onTestPending(event.name, event.suiteName, event.fileId);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Start the spinner animation
|
|
116
|
+
*/
|
|
117
|
+
startSpinner() {
|
|
118
|
+
if (this.spinnerInterval || !this.enabled)
|
|
119
|
+
return;
|
|
120
|
+
this.spinnerInterval = setInterval(() => {
|
|
121
|
+
this.spinnerFrame = (this.spinnerFrame + 1) % SPINNER_FRAMES.length;
|
|
122
|
+
this.render();
|
|
123
|
+
}, 80);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Stop the spinner animation
|
|
127
|
+
*/
|
|
128
|
+
stopSpinner() {
|
|
129
|
+
if (this.spinnerInterval) {
|
|
130
|
+
clearInterval(this.spinnerInterval);
|
|
131
|
+
this.spinnerInterval = null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Clear the previous output
|
|
136
|
+
*/
|
|
137
|
+
clearPreviousOutput() {
|
|
138
|
+
if (!this.enabled || this.lastOutputLineCount === 0)
|
|
139
|
+
return;
|
|
140
|
+
// Move cursor up and clear each line
|
|
141
|
+
for (let i = 0; i < this.lastOutputLineCount; i++) {
|
|
142
|
+
this.writer.write("\x1b[1A\x1b[2K");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Render the current state to output
|
|
147
|
+
*/
|
|
148
|
+
render() {
|
|
149
|
+
if (!this.enabled)
|
|
150
|
+
return;
|
|
151
|
+
// Build output lines
|
|
152
|
+
const lines = [];
|
|
153
|
+
// Check if there are any running tests or loading suites
|
|
154
|
+
let hasRunningTests = false;
|
|
155
|
+
for (const file of this.state.files.values()) {
|
|
156
|
+
for (const suite of file.suites) {
|
|
157
|
+
if (suite.isLoading || suite.tests.some(t => t.status === "running")) {
|
|
158
|
+
hasRunningTests = true;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (hasRunningTests)
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
// Render each file
|
|
166
|
+
for (const file of this.state.files.values()) {
|
|
167
|
+
this.renderFile(file, lines);
|
|
168
|
+
}
|
|
169
|
+
// Clear previous output and render new output
|
|
170
|
+
this.clearPreviousOutput();
|
|
171
|
+
for (const line of lines) {
|
|
172
|
+
this.writer.writeLine(line);
|
|
173
|
+
}
|
|
174
|
+
this.lastOutputLineCount = lines.length;
|
|
175
|
+
// Start/stop spinner based on running tests
|
|
176
|
+
if (hasRunningTests && !this.spinnerInterval) {
|
|
177
|
+
this.startSpinner();
|
|
178
|
+
}
|
|
179
|
+
else if (!hasRunningTests && this.spinnerInterval) {
|
|
180
|
+
this.stopSpinner();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Render a file's tests to output lines
|
|
185
|
+
*/
|
|
186
|
+
renderFile(file, lines) {
|
|
187
|
+
for (const suite of file.suites) {
|
|
188
|
+
this.renderSuite(suite, lines);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Render a suite and its tests
|
|
193
|
+
*/
|
|
194
|
+
renderSuite(suite, lines) {
|
|
195
|
+
const indent = " ".repeat(suite.depth);
|
|
196
|
+
// Only show spinner if suite is loading AND has no tests yet
|
|
197
|
+
// Don't show spinner if tests have been reported (loading is complete)
|
|
198
|
+
const showSpinner = suite.isLoading && suite.tests.length === 0;
|
|
199
|
+
if (showSpinner) {
|
|
200
|
+
const spinner = pc.cyan(SPINNER_FRAMES[this.spinnerFrame]);
|
|
201
|
+
lines.push(`${indent}${spinner} ${pc.bold(suite.name)}`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// Use two spaces to replace the spinner character and space, preventing text shift
|
|
205
|
+
lines.push(`${indent} ${pc.bold(suite.name)}`);
|
|
206
|
+
}
|
|
207
|
+
// Render tests
|
|
208
|
+
for (const test of suite.tests) {
|
|
209
|
+
this.renderTest(test, suite.depth + 1, lines);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Render a single test
|
|
214
|
+
*/
|
|
215
|
+
renderTest(test, depth, lines) {
|
|
216
|
+
const indent = " ".repeat(depth);
|
|
217
|
+
switch (test.status) {
|
|
218
|
+
case "running": {
|
|
219
|
+
const spinner = pc.cyan(SPINNER_FRAMES[this.spinnerFrame]);
|
|
220
|
+
lines.push(`${indent}${spinner} ${pc.dim(test.name)}`);
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
case "passed": {
|
|
224
|
+
const durationStr = test.duration ? pc.dim(` ${formatDuration(test.duration)}`) : "";
|
|
225
|
+
lines.push(`${indent}${pc.green("✓")} ${test.name}${durationStr}`);
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
case "failed": {
|
|
229
|
+
const durationStr = test.duration ? pc.dim(` ${formatDuration(test.duration)}`) : "";
|
|
230
|
+
lines.push(`${indent}${pc.red("✗")} ${test.name}${durationStr}`);
|
|
231
|
+
if (test.message) {
|
|
232
|
+
const messageIndent = " ".repeat(depth + 1);
|
|
233
|
+
const indentedMessage = test.message
|
|
234
|
+
.split("\n")
|
|
235
|
+
.map((line) => `${messageIndent}${pc.red(line)}`)
|
|
236
|
+
.join("\n");
|
|
237
|
+
lines.push(indentedMessage);
|
|
238
|
+
}
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
case "skipped": {
|
|
242
|
+
const reasonStr = test.message ? ` ${pc.dim(`(${test.message})`)}` : "";
|
|
243
|
+
lines.push(`${indent}${pc.yellow("○")} ${pc.dim(test.name)}${reasonStr}`);
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case "pending": {
|
|
247
|
+
lines.push(`${indent}${pc.yellow("○")} ${pc.dim(test.name)}`);
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get or create a file state
|
|
254
|
+
*/
|
|
255
|
+
getOrCreateFile(fileId, fileName) {
|
|
256
|
+
let file = this.state.files.get(fileId);
|
|
257
|
+
if (!file) {
|
|
258
|
+
file = {
|
|
259
|
+
fileId,
|
|
260
|
+
fileName,
|
|
261
|
+
suites: [],
|
|
262
|
+
currentSuiteStack: [],
|
|
263
|
+
};
|
|
264
|
+
this.state.files.set(fileId, file);
|
|
265
|
+
}
|
|
266
|
+
return file;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Find or create a suite in a file
|
|
270
|
+
*/
|
|
271
|
+
getOrCreateSuite(file, suiteName) {
|
|
272
|
+
// Find existing suite
|
|
273
|
+
let suite = file.suites.find(s => s.name === suiteName);
|
|
274
|
+
if (!suite) {
|
|
275
|
+
suite = {
|
|
276
|
+
name: suiteName,
|
|
277
|
+
depth: file.currentSuiteStack.length,
|
|
278
|
+
tests: [],
|
|
279
|
+
isLoading: true, // Start in loading state
|
|
280
|
+
};
|
|
281
|
+
file.suites.push(suite);
|
|
282
|
+
}
|
|
283
|
+
return suite;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Called when test run starts
|
|
287
|
+
*/
|
|
288
|
+
onRunStart(toolName) {
|
|
289
|
+
this.state = {
|
|
290
|
+
files: new Map(),
|
|
291
|
+
toolName: toolName || "wp-tester",
|
|
292
|
+
startTime: Date.now(),
|
|
293
|
+
totalTests: 0,
|
|
294
|
+
passedTests: 0,
|
|
295
|
+
failedTests: 0,
|
|
296
|
+
skippedTests: 0,
|
|
297
|
+
};
|
|
298
|
+
this.lastOutputLineCount = 0;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Called when test run ends
|
|
302
|
+
*/
|
|
303
|
+
onRunEnd() {
|
|
304
|
+
this.stopSpinner();
|
|
305
|
+
// Clean up any tests still in "running" state across all files
|
|
306
|
+
// This ensures we never show spinners in the final output
|
|
307
|
+
for (const file of this.state.files.values()) {
|
|
308
|
+
for (const suite of file.suites) {
|
|
309
|
+
suite.isLoading = false;
|
|
310
|
+
for (const test of suite.tests) {
|
|
311
|
+
if (test.status === "running") {
|
|
312
|
+
test.status = "pending";
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
// Final render
|
|
318
|
+
this.render();
|
|
319
|
+
if (!this.enabled || !this.showSummary)
|
|
320
|
+
return;
|
|
321
|
+
const duration = Date.now() - this.state.startTime;
|
|
322
|
+
this.writer.writeLine("");
|
|
323
|
+
this.printSummary(duration);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Called when a test file starts
|
|
327
|
+
*/
|
|
328
|
+
onFileStart(fileId, fileName) {
|
|
329
|
+
this.getOrCreateFile(fileId, fileName);
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Called when a test file ends
|
|
333
|
+
*/
|
|
334
|
+
onFileEnd(_fileId) {
|
|
335
|
+
// Nothing to do - state is already complete
|
|
336
|
+
// We keep the file in state for final rendering
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Called when a test suite starts
|
|
340
|
+
*/
|
|
341
|
+
onSuiteStart(name, fileId) {
|
|
342
|
+
const file = fileId ? this.getOrCreateFile(fileId) : this.getOrCreateFile("__global__");
|
|
343
|
+
file.currentSuiteStack.push(name);
|
|
344
|
+
const suite = this.getOrCreateSuite(file, name);
|
|
345
|
+
// When a child suite is created, mark all parent suites as not loading
|
|
346
|
+
// Parent suites are those with depth less than the current suite's depth
|
|
347
|
+
for (const s of file.suites) {
|
|
348
|
+
if (s.depth < suite.depth) {
|
|
349
|
+
s.isLoading = false;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
this.render();
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Called when a test suite ends
|
|
356
|
+
*/
|
|
357
|
+
onSuiteEnd(name, fileId) {
|
|
358
|
+
const file = fileId ? this.state.files.get(fileId) : this.state.files.get("__global__");
|
|
359
|
+
if (file) {
|
|
360
|
+
const index = file.currentSuiteStack.lastIndexOf(name);
|
|
361
|
+
if (index !== -1) {
|
|
362
|
+
file.currentSuiteStack.splice(index, 1);
|
|
363
|
+
}
|
|
364
|
+
// Mark suite as no longer loading when it ends
|
|
365
|
+
// This ensures loaders are removed even if no tests were reported
|
|
366
|
+
const suite = file.suites.find(s => s.name === name);
|
|
367
|
+
if (suite) {
|
|
368
|
+
suite.isLoading = false;
|
|
369
|
+
// Clean up any tests still in "running" state - they should be marked as pending
|
|
370
|
+
// This handles cases where test:start was received but no completion event followed
|
|
371
|
+
for (const test of suite.tests) {
|
|
372
|
+
if (test.status === "running") {
|
|
373
|
+
test.status = "pending";
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
this.render();
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Called when a test starts
|
|
382
|
+
*/
|
|
383
|
+
onTestStart(name, suiteName, fileId) {
|
|
384
|
+
const file = fileId ? this.getOrCreateFile(fileId) : this.getOrCreateFile("__global__");
|
|
385
|
+
const suite = this.getOrCreateSuite(file, suiteName || "Tests");
|
|
386
|
+
// Mark ALL suites in this file as no longer loading once any test starts
|
|
387
|
+
// This handles nested suite structures where parent suites don't directly contain tests
|
|
388
|
+
for (const s of file.suites) {
|
|
389
|
+
s.isLoading = false;
|
|
390
|
+
}
|
|
391
|
+
suite.tests.push({
|
|
392
|
+
name,
|
|
393
|
+
suiteName,
|
|
394
|
+
status: "running",
|
|
395
|
+
});
|
|
396
|
+
this.render();
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Called when a test passes
|
|
400
|
+
*/
|
|
401
|
+
onTestPass(name, duration, suiteName, fileId) {
|
|
402
|
+
const file = fileId ? this.getOrCreateFile(fileId) : this.getOrCreateFile("__global__");
|
|
403
|
+
const suite = this.getOrCreateSuite(file, suiteName || "Tests");
|
|
404
|
+
// Mark ALL suites in this file as no longer loading once any test completes
|
|
405
|
+
// This handles nested suite structures where parent suites don't directly contain tests
|
|
406
|
+
for (const s of file.suites) {
|
|
407
|
+
s.isLoading = false;
|
|
408
|
+
}
|
|
409
|
+
// Find and update the test - try exact match first, then fallback to name-only match
|
|
410
|
+
let test = suite.tests.find(t => t.name === name && t.suiteName === suiteName);
|
|
411
|
+
if (!test) {
|
|
412
|
+
// Fallback: try to find by name only (handles cases where suiteName might differ)
|
|
413
|
+
test = suite.tests.find(t => t.name === name && t.status === "running");
|
|
414
|
+
}
|
|
415
|
+
if (test) {
|
|
416
|
+
test.status = "passed";
|
|
417
|
+
test.duration = duration;
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
suite.tests.push({
|
|
421
|
+
name,
|
|
422
|
+
suiteName,
|
|
423
|
+
status: "passed",
|
|
424
|
+
duration,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
this.state.totalTests++;
|
|
428
|
+
this.state.passedTests++;
|
|
429
|
+
this.render();
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Called when a test fails
|
|
433
|
+
*/
|
|
434
|
+
onTestFail(name, duration, message, trace, suiteName, fileId) {
|
|
435
|
+
const file = fileId ? this.getOrCreateFile(fileId) : this.getOrCreateFile("__global__");
|
|
436
|
+
const suite = this.getOrCreateSuite(file, suiteName || "Tests");
|
|
437
|
+
// Mark ALL suites in this file as no longer loading once any test completes
|
|
438
|
+
// This handles nested suite structures where parent suites don't directly contain tests
|
|
439
|
+
for (const s of file.suites) {
|
|
440
|
+
s.isLoading = false;
|
|
441
|
+
}
|
|
442
|
+
// Find and update the test - try exact match first, then fallback to name-only match
|
|
443
|
+
let test = suite.tests.find(t => t.name === name && t.suiteName === suiteName);
|
|
444
|
+
if (!test) {
|
|
445
|
+
// Fallback: try to find by name only (handles cases where suiteName might differ)
|
|
446
|
+
test = suite.tests.find(t => t.name === name && t.status === "running");
|
|
447
|
+
}
|
|
448
|
+
if (test) {
|
|
449
|
+
test.status = "failed";
|
|
450
|
+
test.duration = duration;
|
|
451
|
+
test.message = message;
|
|
452
|
+
test.trace = trace;
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
suite.tests.push({
|
|
456
|
+
name,
|
|
457
|
+
suiteName,
|
|
458
|
+
status: "failed",
|
|
459
|
+
duration,
|
|
460
|
+
message,
|
|
461
|
+
trace,
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
this.state.totalTests++;
|
|
465
|
+
this.state.failedTests++;
|
|
466
|
+
this.render();
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Called when a test is skipped
|
|
470
|
+
*/
|
|
471
|
+
onTestSkip(name, reason, suiteName, fileId) {
|
|
472
|
+
const file = fileId ? this.getOrCreateFile(fileId) : this.getOrCreateFile("__global__");
|
|
473
|
+
const suite = this.getOrCreateSuite(file, suiteName || "Tests");
|
|
474
|
+
// Mark ALL suites in this file as no longer loading once any test completes
|
|
475
|
+
// This handles nested suite structures where parent suites don't directly contain tests
|
|
476
|
+
for (const s of file.suites) {
|
|
477
|
+
s.isLoading = false;
|
|
478
|
+
}
|
|
479
|
+
// Find and update the test - try exact match first, then fallback to name-only match
|
|
480
|
+
let test = suite.tests.find(t => t.name === name && t.suiteName === suiteName);
|
|
481
|
+
if (!test) {
|
|
482
|
+
// Fallback: try to find by name only (handles cases where suiteName might differ)
|
|
483
|
+
test = suite.tests.find(t => t.name === name && t.status === "running");
|
|
484
|
+
}
|
|
485
|
+
if (test) {
|
|
486
|
+
test.status = "skipped";
|
|
487
|
+
test.message = reason;
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
suite.tests.push({
|
|
491
|
+
name,
|
|
492
|
+
suiteName,
|
|
493
|
+
status: "skipped",
|
|
494
|
+
message: reason,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
this.state.totalTests++;
|
|
498
|
+
this.state.skippedTests++;
|
|
499
|
+
this.render();
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Called when a test is pending
|
|
503
|
+
*/
|
|
504
|
+
onTestPending(name, suiteName, fileId) {
|
|
505
|
+
const file = fileId ? this.getOrCreateFile(fileId) : this.getOrCreateFile("__global__");
|
|
506
|
+
const suite = this.getOrCreateSuite(file, suiteName || "Tests");
|
|
507
|
+
// Mark suite as no longer loading once first test completes
|
|
508
|
+
suite.isLoading = false;
|
|
509
|
+
// Find and update the test
|
|
510
|
+
const test = suite.tests.find(t => t.name === name && t.suiteName === suiteName);
|
|
511
|
+
if (test) {
|
|
512
|
+
test.status = "pending";
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
suite.tests.push({
|
|
516
|
+
name,
|
|
517
|
+
suiteName,
|
|
518
|
+
status: "pending",
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
this.state.totalTests++;
|
|
522
|
+
this.render();
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Print final summary
|
|
526
|
+
*/
|
|
527
|
+
printSummary(duration) {
|
|
528
|
+
this.writer.writeLine("");
|
|
529
|
+
if (this.state.passedTests > 0) {
|
|
530
|
+
this.writer.writeLine(pc.green(` ✓ ${this.state.passedTests} passed`));
|
|
531
|
+
}
|
|
532
|
+
if (this.state.failedTests > 0) {
|
|
533
|
+
this.writer.writeLine(pc.red(` ✗ ${this.state.failedTests} failed`));
|
|
534
|
+
}
|
|
535
|
+
if (this.state.skippedTests > 0) {
|
|
536
|
+
this.writer.writeLine(pc.yellow(` ○ ${this.state.skippedTests} skipped`));
|
|
537
|
+
}
|
|
538
|
+
this.writer.writeLine("");
|
|
539
|
+
this.writer.writeLine(pc.dim(` ${this.state.totalTests} tests in ${formatDuration(duration)}`));
|
|
540
|
+
this.writer.writeLine("");
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* Get the current report in CTRF format
|
|
544
|
+
*/
|
|
545
|
+
getReport() {
|
|
546
|
+
const tests = [];
|
|
547
|
+
// Collect all tests from all files
|
|
548
|
+
for (const file of this.state.files.values()) {
|
|
549
|
+
for (const suite of file.suites) {
|
|
550
|
+
for (const test of suite.tests) {
|
|
551
|
+
const ctrf = {
|
|
552
|
+
name: test.suiteName ? `${test.suiteName}::${test.name}` : test.name,
|
|
553
|
+
status: test.status === "running" ? "other" : test.status,
|
|
554
|
+
duration: test.duration || 0,
|
|
555
|
+
};
|
|
556
|
+
if (test.message) {
|
|
557
|
+
ctrf.message = test.message;
|
|
558
|
+
}
|
|
559
|
+
if (test.trace) {
|
|
560
|
+
ctrf.trace = test.trace;
|
|
561
|
+
}
|
|
562
|
+
tests.push(ctrf);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
return {
|
|
567
|
+
reportFormat: "CTRF",
|
|
568
|
+
specVersion: "1.0.0",
|
|
569
|
+
results: {
|
|
570
|
+
tool: {
|
|
571
|
+
name: this.state.toolName,
|
|
572
|
+
},
|
|
573
|
+
summary: {
|
|
574
|
+
tests: this.state.totalTests,
|
|
575
|
+
passed: this.state.passedTests,
|
|
576
|
+
failed: this.state.failedTests,
|
|
577
|
+
skipped: this.state.skippedTests,
|
|
578
|
+
pending: 0,
|
|
579
|
+
other: 0,
|
|
580
|
+
start: this.state.startTime,
|
|
581
|
+
stop: Date.now(),
|
|
582
|
+
},
|
|
583
|
+
tests,
|
|
584
|
+
},
|
|
585
|
+
};
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Get current counts for external tracking
|
|
589
|
+
*/
|
|
590
|
+
getCounts() {
|
|
591
|
+
return {
|
|
592
|
+
total: this.state.totalTests,
|
|
593
|
+
passed: this.state.passedTests,
|
|
594
|
+
failed: this.state.failedTests,
|
|
595
|
+
skipped: this.state.skippedTests,
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Create a CTRF Test object from event data
|
|
601
|
+
*/
|
|
602
|
+
export function createTestFromEvent(event) {
|
|
603
|
+
const status = event.type === "test:pass"
|
|
604
|
+
? "passed"
|
|
605
|
+
: event.type === "test:fail"
|
|
606
|
+
? "failed"
|
|
607
|
+
: event.type === "test:skip"
|
|
608
|
+
? "skipped"
|
|
609
|
+
: event.type === "test:pending"
|
|
610
|
+
? "pending"
|
|
611
|
+
: "other";
|
|
612
|
+
return {
|
|
613
|
+
name: event.suiteName ? `${event.suiteName}::${event.name}` : event.name,
|
|
614
|
+
status,
|
|
615
|
+
duration: event.duration || 0,
|
|
616
|
+
...(event.message && { message: event.message }),
|
|
617
|
+
...(event.trace && { trace: event.trace }),
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
//# sourceMappingURL=streaming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.js","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAoD1E;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,KAAK,CAAC,IAAY;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,SAAS,CAAC,IAAY;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,cAAc,CAAC,EAAU;IAChC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACd,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,CAAC;AAyDD;;;;;;;;;GASG;AACH,MAAM,OAAO,iBAAiB;IAc5B,YAAY,UAAoC,EAAE;QAZ1C,YAAO,GAAG,IAAI,CAAC;QACf,sBAAiB,GAAG,IAAI,CAAC;QACzB,gBAAW,GAAG,IAAI,CAAC;QAK3B,kBAAkB;QACV,wBAAmB,GAAG,CAAC,CAAC;QACxB,iBAAY,GAAG,CAAC,CAAC;QACjB,oBAAe,GAA0B,IAAI,CAAC;QAGpD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,YAAY,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QAEvC,IAAI,CAAC,KAAK,GAAG;YACX,KAAK,EAAE,IAAI,GAAG,EAAE;YAChB,QAAQ,EAAE,WAAW;YACrB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;SAChB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,IAAa;QAChC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,KAAkB;QACxB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5C,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC5D,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAChF,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CACb,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,QAAQ,IAAI,CAAC,EACnB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,MAAM,CACb,CAAC;gBACF,MAAM;YACR,KAAK,WAAW;gBACd,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC1E,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9D,MAAM;QACV,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAElD,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;YACpE,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,mBAAmB,KAAK,CAAC;YAAE,OAAO;QAE5D,qCAAqC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,MAAM;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,qBAAqB;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,yDAAyD;QACzD,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;oBACrE,eAAe,GAAG,IAAI,CAAC;oBACvB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,eAAe;gBAAE,MAAM;QAC7B,CAAC;QAED,mBAAmB;QACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,MAAM,CAAC;QAExC,4CAA4C;QAC5C,IAAI,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;aAAM,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,IAAe,EAAE,KAAe;QACjD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAiB,EAAE,KAAe;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAExC,6DAA6D;QAC7D,uEAAuE;QACvE,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAEhE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,mFAAmF;YACnF,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,eAAe;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,IAAe,EAAE,KAAa,EAAE,KAAe;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAElC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvD,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;gBACnE,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrF,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;gBACjE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO;yBACjC,KAAK,CAAC,IAAI,CAAC;yBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,aAAa,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;yBAChD,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;gBAC1E,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,MAAc,EAAE,QAAiB;QACvD,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG;gBACL,MAAM;gBACN,QAAQ;gBACR,MAAM,EAAE,EAAE;gBACV,iBAAiB,EAAE,EAAE;aACtB,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAe,EAAE,SAAiB;QACzD,sBAAsB;QACtB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM;gBACpC,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,IAAI,EAAE,yBAAyB;aAC3C,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAiB;QAC1B,IAAI,CAAC,KAAK,GAAG;YACX,KAAK,EAAE,IAAI,GAAG,EAAE;YAChB,QAAQ,EAAE,QAAQ,IAAI,WAAW;YACjC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;SAChB,CAAC;QAEF,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,+DAA+D;QAC/D,0DAA0D;QAC1D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBACxB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,eAAe;QACf,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAc,EAAE,QAAiB;QAC3C,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe;QACvB,4CAA4C;QAC5C,gDAAgD;IAClD,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY,EAAE,MAAe;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEhD,uEAAuE;QACvE,yEAAyE;QACzE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1B,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY,EAAE,MAAe;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACxF,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;YAED,+CAA+C;YAC/C,kEAAkE;YAClE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACrD,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBAExB,iFAAiF;gBACjF,oFAAoF;gBACpF,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAC9B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY,EAAE,SAAkB,EAAE,MAAe;QAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;QAEhE,yEAAyE;QACzE,wFAAwF;QACxF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YACf,IAAI;YACJ,SAAS;YACT,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY,EAAE,QAAgB,EAAE,SAAkB,EAAE,MAAe;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;QAEhE,4EAA4E;QAC5E,wFAAwF;QACxF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,qFAAqF;QACrF,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,kFAAkF;YAClF,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,SAAS;gBACT,MAAM,EAAE,QAAQ;gBAChB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CACR,IAAY,EACZ,QAAgB,EAChB,OAAgB,EAChB,KAAc,EACd,SAAkB,EAClB,MAAe;QAEf,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;QAEhE,4EAA4E;QAC5E,wFAAwF;QACxF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,qFAAqF;QACrF,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,kFAAkF;YAClF,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,SAAS;gBACT,MAAM,EAAE,QAAQ;gBAChB,QAAQ;gBACR,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY,EAAE,MAAe,EAAE,SAAkB,EAAE,MAAe;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;QAEhE,4EAA4E;QAC5E,wFAAwF;QACxF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;QACtB,CAAC;QAED,qFAAqF;QACrF,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,kFAAkF;YAClF,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC1E,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY,EAAE,SAAkB,EAAE,MAAe;QAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC;QAEhE,4DAA4D;QAC5D,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QAExB,2BAA2B;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QACjF,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;gBACf,IAAI;gBACJ,SAAS;gBACT,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE1B,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,SAAS,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,UAAU,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,aAAa,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,MAAM,KAAK,GAAW,EAAE,CAAC;QAEzB,mCAAmC;QACnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC/B,MAAM,IAAI,GAAS;wBACjB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;wBACpE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAoB;wBACvE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;qBAC7B,CAAC;oBAEF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;oBAC9B,CAAC;oBACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;oBAC1B,CAAC;oBAED,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,OAAO;YACpB,OAAO,EAAE;gBACP,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ;iBAC1B;gBACD,OAAO,EAAE;oBACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;oBAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;oBAC9B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;oBAChC,OAAO,EAAE,CAAC;oBACV,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;oBAC3B,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;iBACjB;gBACD,KAAK;aACN;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU;YAC5B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;SACjC,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,WAAW;QACxB,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;YAC1B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;gBAC1B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;oBAC7B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,OAAO,CAAC;IAEpB,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;QACxE,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAChD,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming.spec.d.ts","sourceRoot":"","sources":["../src/streaming.spec.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|