@wdio/browserstack-service 8.51.1 → 8.53.0

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 (55) hide show
  1. package/README.md +32 -0
  2. package/build/Percy/PercySDK.d.ts +3 -3
  3. package/build/Percy/PercySDK.d.ts.map +1 -1
  4. package/build/Percy/PercySDK.js +54 -13
  5. package/build/Percy/PercySDK.js.map +1 -1
  6. package/build/cli/cliUtils.d.ts.map +1 -1
  7. package/build/cli/cliUtils.js +1 -1
  8. package/build/cli/cliUtils.js.map +1 -1
  9. package/build/cli/eventDispatcher.d.ts.map +1 -1
  10. package/build/cli/eventDispatcher.js +11 -1
  11. package/build/cli/eventDispatcher.js.map +1 -1
  12. package/build/cli/frameworks/constants/testFrameworkConstants.d.ts +1 -0
  13. package/build/cli/frameworks/constants/testFrameworkConstants.d.ts.map +1 -1
  14. package/build/cli/frameworks/constants/testFrameworkConstants.js +1 -0
  15. package/build/cli/frameworks/constants/testFrameworkConstants.js.map +1 -1
  16. package/build/cli/frameworks/wdioCucumberTestFramework.d.ts +153 -0
  17. package/build/cli/frameworks/wdioCucumberTestFramework.d.ts.map +1 -0
  18. package/build/cli/frameworks/wdioCucumberTestFramework.js +574 -0
  19. package/build/cli/frameworks/wdioCucumberTestFramework.js.map +1 -0
  20. package/build/cli/grpcClient.d.ts +20 -0
  21. package/build/cli/grpcClient.d.ts.map +1 -1
  22. package/build/cli/grpcClient.js +96 -0
  23. package/build/cli/grpcClient.js.map +1 -1
  24. package/build/cli/index.d.ts +3 -3
  25. package/build/cli/index.d.ts.map +1 -1
  26. package/build/cli/index.js +11 -3
  27. package/build/cli/index.js.map +1 -1
  28. package/build/cli/modules/accessibilityModule.d.ts.map +1 -1
  29. package/build/cli/modules/accessibilityModule.js +5 -1
  30. package/build/cli/modules/accessibilityModule.js.map +1 -1
  31. package/build/cli/modules/automateModule.d.ts +17 -1
  32. package/build/cli/modules/automateModule.d.ts.map +1 -1
  33. package/build/cli/modules/automateModule.js +159 -12
  34. package/build/cli/modules/automateModule.js.map +1 -1
  35. package/build/cli/modules/testHubModule.d.ts +7 -1
  36. package/build/cli/modules/testHubModule.d.ts.map +1 -1
  37. package/build/cli/modules/testHubModule.js +14 -3
  38. package/build/cli/modules/testHubModule.js.map +1 -1
  39. package/build/constants.d.ts.map +1 -1
  40. package/build/constants.js +1 -1
  41. package/build/constants.js.map +1 -1
  42. package/build/grpc/generated/sdk-messages.d.ts +22 -0
  43. package/build/grpc/generated/sdk-messages.d.ts.map +1 -1
  44. package/build/grpc/generated/sdk-messages.js +112 -1
  45. package/build/grpc/generated/sdk-messages.js.map +1 -1
  46. package/build/insights-handler.d.ts +1 -1
  47. package/build/insights-handler.d.ts.map +1 -1
  48. package/build/insights-handler.js +7 -6
  49. package/build/insights-handler.js.map +1 -1
  50. package/build/service.d.ts +34 -0
  51. package/build/service.d.ts.map +1 -1
  52. package/build/service.js +214 -7
  53. package/build/service.js.map +1 -1
  54. package/package.json +3 -2
  55. package/src/proto/browserstack/sdk/v1/sdk-messages.proto +18 -0
@@ -0,0 +1,574 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import path from 'node:path';
3
+ import TestFramework from './testFramework.js';
4
+ import { TestFrameworkState } from '../states/testFrameworkState.js';
5
+ import { HookState } from '../states/hookState.js';
6
+ import TestFrameworkInstance from '../instances/testFrameworkInstance.js';
7
+ import TrackedInstance from '../instances/trackedInstance.js';
8
+ import { CLIUtils } from '../cliUtils.js';
9
+ import { TestFrameworkConstants } from './constants/testFrameworkConstants.js';
10
+ import { BStackLogger as logger } from '../cliLogger.js';
11
+ import { TEST_ANALYTICS_ID } from '../../constants.js';
12
+ import { getScenarioExamples, removeAnsiColors } from '../../util.js';
13
+ /**
14
+ * Wire keys the binary's WebdriverIO-cucumber module consumes that have no entry in
15
+ * TestFrameworkConstants. Kept local rather than appended to that file, which mocha shares.
16
+ */
17
+ const KEY_TEST_DURATION = 'test_duration';
18
+ const KEY_BDD_META_INFO = 'bdd_meta_info';
19
+ const KEY_TEST_SKIPPED_CASCADE = 'test_skipped_cascade';
20
+ const KEY_HOOK_SCOPE = 'hook_scope';
21
+ const KEY_HOOK_RETRIES = 'hook_retries';
22
+ const KEY_HOOK_DURATION = 'hook_duration';
23
+ const HOOK_STATES = {
24
+ BEFORE_ALL: TestFrameworkState.BEFORE_ALL,
25
+ AFTER_ALL: TestFrameworkState.AFTER_ALL,
26
+ BEFORE_EACH: TestFrameworkState.BEFORE_EACH,
27
+ AFTER_EACH: TestFrameworkState.AFTER_EACH,
28
+ };
29
+ /**
30
+ * CLI test framework for `framework: 'cucumber'` under WebdriverIO.
31
+ *
32
+ * Extends the BASE TestFramework, never WdioMochaTestFramework: WDIO does not call
33
+ * `beforeTest`/`afterTest` or deliver titled hooks for cucumber, so mocha's INIT_TEST / TEST /
34
+ * hook-boundary semantics have no source here.
35
+ *
36
+ * A scenario raises TEST/PRE at `beforeScenario` and TEST/POST at `afterScenario`. That is not a
37
+ * preference: the binary's WDIO language index dispatches only on `TEST` and `^(BEFORE_|AFTER_)`,
38
+ * so an additional state would be silently discarded on the far side.
39
+ */
40
+ export default class WdioCucumberTestFramework extends TestFramework {
41
+ static KEY_HOOK_LAST_STARTED = 'test_hook_last_started';
42
+ static KEY_HOOK_LAST_FINISHED = 'test_hook_last_finished';
43
+ /**
44
+ * The bookkeeping hook classification is derived from. A cucumber hook invocation carries no
45
+ * title and `BeforeAll`/`AfterAll` pass no hook object at all, so `util.ts → getHookType()`
46
+ * (Mocha quoted-title matching) can only return 'unknown' or throw on the property access.
47
+ *
48
+ * `stepDepth` is deliberately NOT reset per scenario. Legacy pushes to and pops from
49
+ * `_cucumberData.steps` with no per-scenario reset, so a step that never reaches `afterStep`
50
+ * leaves the depth above zero for the rest of the run and every later AFTER_EACH is
51
+ * classified null and dropped. That is v8 behaviour and therefore the parity target
52
+ * (pre-existing-bugs PB-V8-1); the per-scenario reset exists only on the v9 line.
53
+ */
54
+ cucumberData = { scenariosStarted: false, stepsStarted: false, stepDepth: 0 };
55
+ /**
56
+ * Steps of the scenario in flight, mirroring legacy's per-scenario `_tests[uniqueId].steps`.
57
+ * Re-allocated (never cleared in place) at each scenario start, so a payload already built
58
+ * from the previous scenario cannot observe this one's steps through a retained reference.
59
+ */
60
+ scenarioSteps = [];
61
+ /** The hook started and not yet finished on this worker — legacy's `_currentHook`. */
62
+ openHook = null;
63
+ /**
64
+ * Set when a hook finish arrived with no recorded start. Legacy throws at that point and the
65
+ * wrapper swallows it, which drops the HookRunFinished *and* the BEFORE_ALL cascade in the
66
+ * same call; this flag reproduces the second half.
67
+ */
68
+ lastHookFinishOrphaned = false;
69
+ constructor(testFrameworks, testFrameworkVersions, binSessionId) {
70
+ super(testFrameworks, testFrameworkVersions, binSessionId);
71
+ logger.debug('WdioCucumberTestFramework: constructed');
72
+ }
73
+ /**
74
+ * Feature bookkeeping. Raises no state — cucumber has no feature-level wire event, and
75
+ * `beforeSuite`/`afterSuite` are not part of its WDIO surface.
76
+ */
77
+ onFeatureStart(uri, feature) {
78
+ logger.debug(`WdioCucumberTestFramework.onFeatureStart: uri=${uri} feature=${feature?.name}`);
79
+ this.cucumberData.scenariosStarted = false;
80
+ this.cucumberData.feature = feature;
81
+ this.cucumberData.uri = uri;
82
+ }
83
+ /** Step bookkeeping. Steps travel inside the scenario payload's BDD meta, never as events. */
84
+ onStepStart(step) {
85
+ this.cucumberData.stepsStarted = true;
86
+ this.cucumberData.stepDepth++;
87
+ this.scenarioSteps.push({
88
+ id: step.id,
89
+ text: step.text,
90
+ keyword: step.keyword,
91
+ started_at: (new Date()).toISOString(),
92
+ });
93
+ }
94
+ onStepEnd(step, result) {
95
+ // Math.max mirrors Array.pop() on an empty array, which legacy relies on.
96
+ this.cucumberData.stepDepth = Math.max(0, this.cucumberData.stepDepth - 1);
97
+ const stepMeta = this.scenarioSteps.find(item => item.id === step.id);
98
+ if (!stepMeta) {
99
+ return;
100
+ }
101
+ stepMeta.finished_at = (new Date()).toISOString();
102
+ stepMeta.result = result.passed ? 'PASSED' : 'FAILED';
103
+ stepMeta.duration = result.duration;
104
+ if (result.error) {
105
+ stepMeta.failure = removeAnsiColors(result.error);
106
+ }
107
+ }
108
+ /**
109
+ * Classify a cucumber hook invocation from the bookkeeping state — legacy's
110
+ * `getCucumberHookType()` algorithm.
111
+ *
112
+ * Returns null for a step-scoped hook (`BeforeStep`/`AfterStep`), which is never reported;
113
+ * reporting one would change the dashboard hook count.
114
+ */
115
+ classifyHookType(test) {
116
+ if (!test) {
117
+ return this.cucumberData.scenariosStarted ? 'AFTER_ALL' : 'BEFORE_ALL';
118
+ }
119
+ if (!this.cucumberData.stepsStarted) {
120
+ return 'BEFORE_EACH';
121
+ }
122
+ if (this.cucumberData.stepDepth > 0) {
123
+ return null;
124
+ }
125
+ return 'AFTER_EACH';
126
+ }
127
+ /** The TestFrameworkState a cucumber hook maps to, or null when it is never reported. */
128
+ classifyHookState(test) {
129
+ const hookType = this.classifyHookType(test);
130
+ return hookType ? HOOK_STATES[hookType] : null;
131
+ }
132
+ /**
133
+ * Whether a failed BEFORE_ALL should run the skip cascade. False when the finish that just
134
+ * arrived had no recorded start — see `lastHookFinishOrphaned`.
135
+ */
136
+ shouldCascadeSkippedScenarios() {
137
+ return !this.lastHookFinishOrphaned;
138
+ }
139
+ /** `<HOOK_TYPE> for <scenario|feature name>`; the separator is a literal ' for '. */
140
+ hookName(hookType) {
141
+ switch (hookType) {
142
+ case 'BEFORE_EACH':
143
+ case 'AFTER_EACH':
144
+ return `${hookType} for ${this.cucumberData.scenario?.name}`;
145
+ case 'BEFORE_ALL':
146
+ case 'AFTER_ALL':
147
+ return `${hookType} for ${this.cucumberData.feature?.name}`;
148
+ }
149
+ }
150
+ /**
151
+ * The ABSOLUTE feature path. `beforeFeature`'s uri is already absolute; path.resolve only
152
+ * normalises it. The binary re-bases this itself — `path.relative(session.pathProject, …)`
153
+ * for file_name/location and against the git root for vc_filepath — so sending a
154
+ * pre-relativised value makes both fields depend on the binary's own cwd (SDK-7233).
155
+ */
156
+ featurePath() {
157
+ const uri = this.cucumberData.uri;
158
+ return uri ? path.resolve(process.cwd(), uri) : undefined;
159
+ }
160
+ /**
161
+ * The feature path as the bdd meta blob wants it — cwd-relative, matching legacy.
162
+ *
163
+ * Not `featurePath()`: the binary re-bases `test_file_path`/`location` itself but never touches
164
+ * this blob, so an absolute value reaches the dashboard verbatim, home directory and all.
165
+ * Legacy reads the world's `gherkinDocument.uri`, which is already cwd-relative.
166
+ */
167
+ featureUriForMeta() {
168
+ const absolute = this.featurePath();
169
+ return absolute ? path.relative(process.cwd(), absolute) : undefined;
170
+ }
171
+ featureFilePathEntries() {
172
+ const featurePath = this.featurePath();
173
+ return {
174
+ [TestFrameworkConstants.KEY_TEST_FILE_PATH]: featurePath,
175
+ [TestFrameworkConstants.KEY_TEST_LOCATION]: featurePath,
176
+ };
177
+ }
178
+ async trackEvent(testFrameworkState, hookState, args = {}) {
179
+ logger.debug(`WdioCucumberTestFramework.trackEvent: testFrameworkState=${testFrameworkState} hookState=${hookState}`);
180
+ await super.trackEvent(testFrameworkState, hookState, args);
181
+ const instance = this.resolveInstance(testFrameworkState, hookState);
182
+ if (!instance) {
183
+ // Console output before the first scenario has nothing to attach to; legacy drops it
184
+ // just as silently (appendTestItemLog needs a test or hook uuid and has neither).
185
+ const detail = `trackEvent: no instance for testFrameworkState=${testFrameworkState} hookState=${hookState}`;
186
+ if (testFrameworkState === TestFrameworkState.LOG) {
187
+ logger.debug(detail);
188
+ }
189
+ else {
190
+ logger.error(detail);
191
+ }
192
+ return;
193
+ }
194
+ const shortState = testFrameworkState.toString().split('.')[1];
195
+ const isHook = CLIUtils.matchHookRegex(shortState);
196
+ try {
197
+ if (isHook && hookState === HookState.PRE) {
198
+ instance.updateMultipleEntries({
199
+ [TestFrameworkConstants.KEY_HOOK_ID]: uuidv4(),
200
+ });
201
+ }
202
+ if (testFrameworkState === TestFrameworkState.TEST) {
203
+ if (hookState === HookState.PRE) {
204
+ this.loadScenarioData(instance, args.world);
205
+ instance.updateMultipleEntries({
206
+ [TestFrameworkConstants.KEY_TEST_STARTED_AT]: new Date().toISOString(),
207
+ });
208
+ }
209
+ else if (hookState === HookState.POST) {
210
+ instance.updateMultipleEntries({
211
+ [TestFrameworkConstants.KEY_TEST_ENDED_AT]: new Date().toISOString(),
212
+ });
213
+ this.loadScenarioResult(instance, args);
214
+ }
215
+ }
216
+ else if (testFrameworkState === TestFrameworkState.LOG) {
217
+ this.loadLogEntry(instance, args.logEntry);
218
+ }
219
+ if (isHook && !this.trackHookEvents(instance, shortState, hookState, args)) {
220
+ // Orphaned hook finish: legacy emits nothing for it at all.
221
+ return;
222
+ }
223
+ }
224
+ catch (error) {
225
+ logger.error(`trackEvent: Error in tracking events: ${error} hookState=${hookState} testFrameworkState=${testFrameworkState}`);
226
+ }
227
+ args.instance = instance;
228
+ await this.runHooks(instance, testFrameworkState, hookState, args);
229
+ }
230
+ /**
231
+ * One instance per scenario. `TestFramework.instances` is keyed on
232
+ * `sha256(CLIUtils.getCurrentInstanceName())` = `sha256('<pid>:<threadId>')`, and every
233
+ * `cli/modules/*` reads it through the single `TestFramework.getTrackedInstance()` lookup, so
234
+ * that key is the only one to register under.
235
+ *
236
+ * WDIO forks a worker process per spec and registers its own `beforeScenario`/`afterScenario`
237
+ * as cucumber Before/After hooks that cucumber awaits sequentially, so the previous scenario
238
+ * has always finished before the next one mints its instance — the slot cannot be clobbered
239
+ * mid-scenario the way mocha's two instance-creation triggers can.
240
+ */
241
+ resolveInstance(testFrameworkState, hookState) {
242
+ let instance = TestFramework.getTrackedInstance();
243
+ const isHook = CLIUtils.matchHookRegex(testFrameworkState.toString().split('.')[1]);
244
+ if (testFrameworkState === TestFrameworkState.TEST && hookState === HookState.PRE) {
245
+ this.trackWdioCucumberInstance(testFrameworkState);
246
+ }
247
+ else if (isHook && hookState === HookState.PRE && !instance) {
248
+ // BEFORE_ALL runs before any scenario exists. Every other hook reuses the live
249
+ // instance: WDIO's beforeScenario is registered before the user's Before hooks and
250
+ // its afterScenario runs after their After hooks, so an EACH hook always lands on
251
+ // its own scenario's instance and an ALL hook on the last scenario's — which is the
252
+ // uuid legacy stamps as test_run_id.
253
+ this.trackWdioCucumberInstance(testFrameworkState);
254
+ }
255
+ instance = TestFramework.getTrackedInstance();
256
+ if (!instance) {
257
+ logger.debug(`resolveInstance: no instance for testFrameworkState=${testFrameworkState} hookState=${hookState}`);
258
+ return null;
259
+ }
260
+ this.updateInstanceState(instance, testFrameworkState, hookState);
261
+ return instance;
262
+ }
263
+ trackWdioCucumberInstance(testFrameworkState) {
264
+ const target = CLIUtils.getCurrentInstanceName();
265
+ const trackedContext = TrackedInstance.createContext(target);
266
+ const instance = new TestFrameworkInstance(trackedContext, this.getTestFrameworks(), this.getTestFrameworksVersions(), testFrameworkState, HookState.NONE);
267
+ const frameworkName = this.getTestFrameworks()[0];
268
+ const testUuid = uuidv4();
269
+ instance.updateMultipleEntries({
270
+ [TestFrameworkConstants.KEY_TEST_FRAMEWORK_NAME]: frameworkName,
271
+ [TestFrameworkConstants.KEY_TEST_FRAMEWORK_VERSION]: this.getTestFrameworksVersions()[frameworkName],
272
+ [TestFrameworkConstants.KEY_TEST_LOGS]: [],
273
+ [TestFrameworkConstants.KEY_HOOKS_FINISHED]: new Map(),
274
+ [TestFrameworkConstants.KEY_HOOKS_STARTED]: new Map(),
275
+ [TestFrameworkConstants.KEY_TEST_UUID]: testUuid,
276
+ [TestFrameworkConstants.KEY_TEST_RESULT]: TestFrameworkConstants.DEFAULT_TEST_RESULT,
277
+ });
278
+ // Read by the Web-A11y and App-A11y scan paths to stamp the scan with this test run.
279
+ process.env[TEST_ANALYTICS_ID] = testUuid;
280
+ TestFramework.setTrackedInstance(trackedContext, instance);
281
+ logger.debug(`trackWdioCucumberInstance: contextId=${trackedContext.getId()} target=${target} testUuid=${testUuid}`);
282
+ }
283
+ /** Scenario identity. The asymmetries between the fields are deliberate. */
284
+ loadScenarioData(instance, world) {
285
+ if (!world?.pickle) {
286
+ logger.error('loadScenarioData: no pickle on the world object; scenario identity will be empty');
287
+ return;
288
+ }
289
+ const pickle = world.pickle;
290
+ const feature = world.gherkinDocument?.feature;
291
+ this.cucumberData.scenario = pickle;
292
+ this.cucumberData.scenariosStarted = true;
293
+ this.cucumberData.stepsStarted = false;
294
+ // stepDepth is NOT reset here — see the cucumberData doc comment (PB-V8-1).
295
+ this.scenarioSteps = [];
296
+ const examples = getScenarioExamples(world);
297
+ // One space before '(' and ', ' between cells, no trailing space.
298
+ const qualifiedName = examples
299
+ ? pickle.name + ' (' + examples.join(', ') + ')'
300
+ : pickle.name;
301
+ instance.updateMultipleEntries({
302
+ // The RAW pickle name, deliberately without the examples qualifier that name/scope
303
+ // carry: the binary maps this to `identifier`, and collapsing the two would fold
304
+ // every row of a Scenario Outline into one dashboard test.
305
+ [TestFrameworkConstants.KEY_TEST_ID]: pickle.name,
306
+ [TestFrameworkConstants.KEY_TEST_NAME]: qualifiedName,
307
+ [TestFrameworkConstants.KEY_TEST_SCOPE]: qualifiedName,
308
+ [TestFrameworkConstants.KEY_TEST_SCOPES]: [feature?.name || ''],
309
+ // Step source is never reported for cucumber, unlike the mocha path's test.body.
310
+ [TestFrameworkConstants.KEY_TEST_CODE]: null,
311
+ // Gherkin tag text INCLUDING the leading '@', source order, no dedupe, no casing
312
+ // change. `.map` allocates a new array; the pickle's own collection is never mutated.
313
+ [TestFrameworkConstants.KEY_TEST_TAGS]: pickle.tags.map(({ name }) => name),
314
+ ...this.featureFilePathEntries(),
315
+ [KEY_BDD_META_INFO]: this.buildBddMetaInfo(pickle, feature, examples),
316
+ });
317
+ }
318
+ buildBddMetaInfo(pickle, feature, examples) {
319
+ return {
320
+ feature: {
321
+ name: feature?.name,
322
+ path: this.featureUriForMeta(),
323
+ description: feature?.description,
324
+ },
325
+ scenario: { name: pickle.name },
326
+ steps: this.scenarioSteps.map(step => ({ ...step })),
327
+ examples: examples ?? [],
328
+ };
329
+ }
330
+ /**
331
+ * Scenario result.
332
+ *
333
+ * KEY_TEST_RESULT_AT is set even though `testHubModule.onAllTestEvents()` cannot actually
334
+ * defer a completion on this line — its `sendTestFrameworkEvent()` call sits outside the
335
+ * else-if chain and runs regardless. Setting it keeps `test_deferred` off the wire and the
336
+ * "dropping due to lack of results" line out of the log.
337
+ */
338
+ loadScenarioResult(instance, args) {
339
+ const world = args.world;
340
+ const pickle = world?.pickle ?? this.cucumberData.scenario;
341
+ const feature = world?.gherkinDocument?.feature ?? this.cucumberData.feature;
342
+ const updates = {
343
+ [TestFrameworkConstants.KEY_TEST_RESULT_AT]: new Date().toISOString(),
344
+ };
345
+ if (pickle) {
346
+ updates[KEY_BDD_META_INFO] = this.buildBddMetaInfo(pickle, feature, getScenarioExamples(world));
347
+ }
348
+ const result = world?.result;
349
+ if (result) {
350
+ let testResult = result.status.toLowerCase();
351
+ if (testResult !== 'passed' && testResult !== 'failed') {
352
+ // UNKNOWN / UNDEFINED / AMBIGUOUS / PENDING / SKIPPED all collapse to skipped.
353
+ testResult = 'skipped';
354
+ }
355
+ // A scenario that failed only in a hook reports passed to Observability when the user
356
+ // declared ignoreHooksStatus. `hasStepFailures` is read from the same step store
357
+ // service.afterScenario() consults, so the o11y result and the session status cannot
358
+ // disagree; absent that store, legacy treats the failure as a step failure.
359
+ const hasStepFailures = args.hasStepFailures === undefined ? true : args.hasStepFailures === true;
360
+ if (args.ignoreHooksStatus === true && testResult === 'failed' && !hasStepFailures) {
361
+ testResult = 'passed';
362
+ }
363
+ updates[TestFrameworkConstants.KEY_TEST_RESULT] = testResult;
364
+ // Cucumber's own protobuf Duration, never an ended_at - started_at delta.
365
+ updates[KEY_TEST_DURATION] = result.duration
366
+ ? result.duration.seconds * 1000 + result.duration.nanos / 1000000
367
+ : undefined;
368
+ if (testResult === 'failed') {
369
+ const message = result.message;
370
+ // A ONE-element backtrace; the mocha path sends message + stack.
371
+ updates[TestFrameworkConstants.KEY_TEST_FAILURE] = [
372
+ { backtrace: [message ? removeAnsiColors(message) : 'unknown'] }
373
+ ];
374
+ updates[TestFrameworkConstants.KEY_TEST_FAILURE_REASON] = message ? removeAnsiColors(message) : message;
375
+ if (message) {
376
+ updates[TestFrameworkConstants.KEY_TEST_FAILURE_TYPE] = message.match(/AssertionError/)
377
+ ? 'AssertionError'
378
+ : 'UnhandledError';
379
+ }
380
+ }
381
+ }
382
+ instance.updateMultipleEntries(updates);
383
+ this.cucumberData.scenario = undefined;
384
+ }
385
+ /**
386
+ * One detached instance per scenario the feature never reached, for the BEFORE_ALL cascade
387
+ * (Rule-nested scenarios included).
388
+ *
389
+ * Detached is load-bearing: these are not registered via `setTrackedInstance`, so neither the
390
+ * live instance nor `process.env[TEST_ANALYTICS_ID]` is disturbed, and the caller sends them
391
+ * straight to TestHub. Routing them through the observers would rename the Automate session,
392
+ * stop the accessibility scan and run a Percy teardown per row, none of which legacy does.
393
+ */
394
+ buildSkippedScenarioInstances() {
395
+ const feature = this.cucumberData.feature;
396
+ if (!feature) {
397
+ logger.debug('buildSkippedScenarioInstances: no feature recorded; nothing to cascade');
398
+ return [];
399
+ }
400
+ const scenarios = [];
401
+ for (const child of (feature.children || [])) {
402
+ if (child.rule) {
403
+ for (const ruleChild of (child.rule.children || [])) {
404
+ if (ruleChild.scenario) {
405
+ scenarios.push(ruleChild.scenario);
406
+ }
407
+ }
408
+ }
409
+ else if (child.scenario) {
410
+ scenarios.push(child.scenario);
411
+ }
412
+ }
413
+ return scenarios.map(scenario => this.buildSkippedScenarioInstance(scenario, feature));
414
+ }
415
+ buildSkippedScenarioInstance(scenario, feature) {
416
+ const now = new Date().toISOString();
417
+ const instance = new TestFrameworkInstance(TrackedInstance.createContext(CLIUtils.getCurrentInstanceName()), this.getTestFrameworks(), this.getTestFrameworksVersions(), TestFrameworkState.TEST, HookState.POST);
418
+ const frameworkName = this.getTestFrameworks()[0];
419
+ instance.updateMultipleEntries({
420
+ [TestFrameworkConstants.KEY_TEST_FRAMEWORK_NAME]: frameworkName,
421
+ [TestFrameworkConstants.KEY_TEST_FRAMEWORK_VERSION]: this.getTestFrameworksVersions()[frameworkName],
422
+ [TestFrameworkConstants.KEY_TEST_LOGS]: [],
423
+ [TestFrameworkConstants.KEY_HOOKS_STARTED]: new Map(),
424
+ [TestFrameworkConstants.KEY_HOOKS_FINISHED]: new Map(),
425
+ [TestFrameworkConstants.KEY_TEST_UUID]: uuidv4(),
426
+ // The feature never ran, so no Examples row was selected and there is nothing to
427
+ // qualify: the raw scenario name is name, scope and identifier alike. No tags either
428
+ // — legacy's cascade payload has no world to read them from.
429
+ [TestFrameworkConstants.KEY_TEST_ID]: scenario.name,
430
+ [TestFrameworkConstants.KEY_TEST_NAME]: scenario.name,
431
+ [TestFrameworkConstants.KEY_TEST_SCOPE]: scenario.name,
432
+ [TestFrameworkConstants.KEY_TEST_SCOPES]: [feature.name || ''],
433
+ [TestFrameworkConstants.KEY_TEST_CODE]: null,
434
+ [TestFrameworkConstants.KEY_TEST_RESULT]: 'skipped',
435
+ [TestFrameworkConstants.KEY_TEST_STARTED_AT]: now,
436
+ [TestFrameworkConstants.KEY_TEST_ENDED_AT]: now,
437
+ [TestFrameworkConstants.KEY_TEST_RESULT_AT]: now,
438
+ ...this.featureFilePathEntries(),
439
+ [KEY_TEST_SKIPPED_CASCADE]: true,
440
+ [KEY_BDD_META_INFO]: {
441
+ feature: { name: feature.name, path: this.featureUriForMeta(), description: feature.description },
442
+ scenario: { name: scenario.name },
443
+ steps: (scenario.steps || []).map((step) => ({
444
+ id: step.id,
445
+ text: step.text,
446
+ keyword: step.keyword,
447
+ result: 'skipped',
448
+ })),
449
+ examples: [],
450
+ },
451
+ });
452
+ return instance;
453
+ }
454
+ /**
455
+ * Whether the scenario in flight failed in a STEP rather than only in a hook. Kept for
456
+ * callers that have no access to the legacy step store.
457
+ */
458
+ hasStepFailures() {
459
+ return this.scenarioSteps.some(step => step.result === 'FAILED');
460
+ }
461
+ /**
462
+ * Route a console log to the row it belongs on: the open hook's uuid while a hook is in
463
+ * flight and unfinished, otherwise the scenario's.
464
+ *
465
+ * The record always goes into KEY_TEST_LOGS, because the send path
466
+ * (`testHubModule.onAllTestEvents`) collects the test logs plus the last FINISHED hook's — a
467
+ * record parked on a still-open hook's own array would never be picked up. Routing rides on
468
+ * KEY_HOOK_ID, which `sendLogCreatedEvent` reads in preference to the test uuid.
469
+ *
470
+ * Not delegated to `WdioMochaTestFramework.loadLogEntries()`: its hook check is
471
+ * `matchHookRegex(instance.getCurrentTestState().toString())`, which tests the fully-qualified
472
+ * `TestFrameworkState.BEFORE_ALL` against an anchored `^(BEFORE_|AFTER_)` and never matches.
473
+ */
474
+ loadLogEntry(instance, logEntry) {
475
+ if (!logEntry) {
476
+ return;
477
+ }
478
+ const { level, message, timestamp, kind } = logEntry;
479
+ const logRecord = {
480
+ // SDK-6277 forwards a saveScreenshot() result through this same state with
481
+ // kind: 'TEST_SCREENSHOT'; hardcoding KIND_LOG would reclassify it as a log line.
482
+ kind: kind ?? TestFrameworkConstants.KIND_LOG,
483
+ message: Buffer.from(message),
484
+ level,
485
+ timestamp,
486
+ };
487
+ if (this.openHook) {
488
+ logRecord[TestFrameworkConstants.KEY_HOOK_ID] = this.openHook.hookId;
489
+ // The uuid alone is not enough: the binary reads the log's own testFrameworkState to
490
+ // decide hook_run_uuid vs test_run_uuid, and at flush time that is 'LOG'. Carrying
491
+ // the hook's state on the record is what makes the pairing survive (row 24).
492
+ logRecord[TestFrameworkConstants.KEY_HOOK_STATE] = this.openHook.key;
493
+ }
494
+ const entries = TestFramework.getState(instance, TestFrameworkConstants.KEY_TEST_LOGS);
495
+ entries.push(logRecord);
496
+ instance.updateMultipleEntries({
497
+ [TestFrameworkConstants.KEY_TEST_LOGS]: entries,
498
+ });
499
+ }
500
+ /**
501
+ * Hook lifecycle. Entries are keyed by the short state name, matching how the binary looks
502
+ * them up via `event.test_hooks_started[request.testFrameworkState]`.
503
+ *
504
+ * @returns false when a finish arrived with no recorded start, so the caller emits nothing.
505
+ */
506
+ trackHookEvents(instance, key, hookState, args) {
507
+ const hooksStarted = TestFramework.getState(instance, TestFrameworkConstants.KEY_HOOKS_STARTED);
508
+ if (!hooksStarted.has(key)) {
509
+ hooksStarted.set(key, []);
510
+ }
511
+ const hooksFinished = TestFramework.getState(instance, TestFrameworkConstants.KEY_HOOKS_FINISHED);
512
+ if (!hooksFinished.has(key)) {
513
+ hooksFinished.set(key, []);
514
+ }
515
+ const updates = {
516
+ [TestFrameworkConstants.KEY_HOOKS_STARTED]: hooksStarted,
517
+ [TestFrameworkConstants.KEY_HOOKS_FINISHED]: hooksFinished,
518
+ };
519
+ if (hookState === HookState.PRE) {
520
+ const hookId = (TestFramework.getState(instance, TestFrameworkConstants.KEY_HOOK_ID) || '');
521
+ const hook = {
522
+ key,
523
+ [TestFrameworkConstants.KEY_HOOK_ID]: hookId,
524
+ [TestFrameworkConstants.KEY_HOOK_RESULT]: TestFrameworkConstants.DEFAULT_HOOK_RESULT,
525
+ [TestFrameworkConstants.KEY_EVENT_STARTED_AT]: new Date().toISOString(),
526
+ [TestFrameworkConstants.KEY_HOOK_LOGS]: [],
527
+ [TestFrameworkConstants.KEY_HOOK_NAME]: this.hookName(key),
528
+ // A hook's scope is the FEATURE name for all four types. `event.test_scope` is the
529
+ // examples-qualified scenario name, and an ALL hook has no scenario data at all,
530
+ // so the binary reads this key off the hook record first.
531
+ [KEY_HOOK_SCOPE]: this.cucumberData.feature?.name,
532
+ ...this.featureFilePathEntries(),
533
+ };
534
+ hooksStarted.get(key)?.push(hook);
535
+ updates[WdioCucumberTestFramework.KEY_HOOK_LAST_STARTED] = key;
536
+ this.openHook = { key, hookId };
537
+ this.lastHookFinishOrphaned = false;
538
+ instance.updateMultipleEntries(updates);
539
+ logger.debug(`trackHookEvents: hook started hookState=${key} name=${hook[TestFrameworkConstants.KEY_HOOK_NAME]}`);
540
+ return true;
541
+ }
542
+ const hooksList = hooksStarted.get(key) || [];
543
+ if (hooksList.length === 0) {
544
+ logger.warn(`trackHookEvents: hook finish for hookState=${key} has no recorded start — dropping the finish and any cascade`);
545
+ this.openHook = null;
546
+ this.lastHookFinishOrphaned = true;
547
+ instance.updateMultipleEntries(updates);
548
+ return false;
549
+ }
550
+ const hook = hooksList.pop();
551
+ const hookResult = args.result;
552
+ if (hookResult) {
553
+ // passed / failed only — the hook path has no 'skipped' arm, unlike the scenario path.
554
+ // Leaving hook_result at 'pending' makes the binary coerce a finished hook to
555
+ // 'passed', so a failing before-hook would show green while the runner exits 1.
556
+ hook[TestFrameworkConstants.KEY_HOOK_RESULT] = hookResult.passed ? 'passed' : 'failed';
557
+ // WDIO reports hook duration as plain ms on the result, not as cucumber's Duration.
558
+ hook[KEY_HOOK_RETRIES] = hookResult.retries;
559
+ hook[KEY_HOOK_DURATION] = hookResult.duration;
560
+ }
561
+ else {
562
+ logger.warn(`trackHookEvents: no result on the hook finish for '${key}'; result stays pending`);
563
+ }
564
+ hook[TestFrameworkConstants.KEY_EVENT_ENDED_AT] = new Date().toISOString();
565
+ hooksFinished.get(key)?.push(hook);
566
+ updates[WdioCucumberTestFramework.KEY_HOOK_LAST_FINISHED] = key;
567
+ this.openHook = null;
568
+ this.lastHookFinishOrphaned = false;
569
+ instance.updateMultipleEntries(updates);
570
+ logger.debug(`trackHookEvents: hook finished hookState=${key} result=${hook[TestFrameworkConstants.KEY_HOOK_RESULT]}`);
571
+ return true;
572
+ }
573
+ }
574
+ //# sourceMappingURL=wdioCucumberTestFramework.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wdioCucumberTestFramework.js","sourceRoot":"","sources":["../../../src/cli/frameworks/wdioCucumberTestFramework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,qBAAqB,MAAM,uCAAuC,CAAA;AACzE,OAAO,eAAe,MAAM,iCAAiC,CAAA;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAC9E,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAKrE;;;GAGG;AACH,MAAM,iBAAiB,GAAG,eAAe,CAAA;AACzC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AACzC,MAAM,wBAAwB,GAAG,sBAAsB,CAAA;AACvD,MAAM,cAAc,GAAG,YAAY,CAAA;AACnC,MAAM,gBAAgB,GAAG,cAAc,CAAA;AACvC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAIzC,MAAM,WAAW,GAAoC;IACjD,UAAU,EAAE,kBAAkB,CAAC,UAAU;IACzC,SAAS,EAAE,kBAAkB,CAAC,SAAS;IACvC,WAAW,EAAE,kBAAkB,CAAC,WAAW;IAC3C,UAAU,EAAE,kBAAkB,CAAC,UAAU;CAC5C,CAAA;AAaD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,aAAa;IAChE,MAAM,CAAC,qBAAqB,GAAG,wBAAwB,CAAA;IACvD,MAAM,CAAC,sBAAsB,GAAG,yBAAyB,CAAA;IAEzD;;;;;;;;;;OAUG;IACK,YAAY,GAOhB,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IAElE;;;;OAIG;IACK,aAAa,GAAe,EAAE,CAAA;IAEtC,sFAAsF;IAC9E,QAAQ,GAA2C,IAAI,CAAA;IAE/D;;;;OAIG;IACK,sBAAsB,GAAG,KAAK,CAAA;IAEtC,YAAY,cAAwB,EAAE,qBAA6C,EAAE,YAAoB;QACrG,KAAK,CAAC,cAAc,EAAE,qBAAqB,EAAE,YAAY,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC1D,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,GAAW,EAAE,OAAgB;QACxC,MAAM,CAAC,KAAK,CAAC,iDAAiD,GAAG,YAAY,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7F,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,KAAK,CAAA;QAC1C,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,OAAO,CAAA;QACnC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,CAAA;IAC/B,CAAC;IAED,8FAA8F;IAC9F,WAAW,CAAC,IAA2B;QACnC,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,IAAI,CAAA;QACrC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAA;QAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACpB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;SACzC,CAAC,CAAA;IACN,CAAC;IAED,SAAS,CAAC,IAA2B,EAAE,MAA+B;QAClE,0EAA0E;QAC1E,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC,CAAA;QAC1E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,CAAA;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAM;QACV,CAAC;QACD,QAAQ,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QACjD,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;QACrD,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;QACnC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrD,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,IAA8B;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAA;QAC1E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;YAClC,OAAO,aAAa,CAAA;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,YAAY,CAAA;IACvB,CAAC;IAED,yFAAyF;IACzF,iBAAiB,CAAC,IAA8B;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;QAC5C,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClD,CAAC;IAED;;;OAGG;IACH,6BAA6B;QACzB,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAA;IACvC,CAAC;IAED,qFAAqF;IAC7E,QAAQ,CAAC,QAA0B;QACvC,QAAQ,QAAQ,EAAE,CAAC;YACnB,KAAK,aAAa,CAAC;YACnB,KAAK,YAAY;gBACb,OAAO,GAAG,QAAQ,QAAQ,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAA;YAChE,KAAK,YAAY,CAAC;YAClB,KAAK,WAAW;gBACZ,OAAO,GAAG,QAAQ,QAAQ,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;QAC/D,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,WAAW;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAA;QACjC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QACnC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,CAAC;IAEO,sBAAsB;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QACtC,OAAO;YACH,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,WAAW;YACxD,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,WAAW;SAC1D,CAAA;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,kBAAyB,EAAE,SAAgB,EAAE,OAAgC,EAAE;QAC5F,MAAM,CAAC,KAAK,CAAC,4DAA4D,kBAAkB,cAAc,SAAS,EAAE,CAAC,CAAA;QACrH,MAAM,KAAK,CAAC,UAAU,CAAC,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAE3D,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAA;QACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,qFAAqF;YACrF,kFAAkF;YAClF,MAAM,MAAM,GAAG,kDAAkD,kBAAkB,cAAc,SAAS,EAAE,CAAA;YAC5G,IAAI,kBAAkB,KAAK,kBAAkB,CAAC,GAAG,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACxB,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACxB,CAAC;YACD,OAAM;QACV,CAAC;QAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QAElD,IAAI,CAAC;YACD,IAAI,MAAM,IAAI,SAAS,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;gBACxC,QAAQ,CAAC,qBAAqB,CAAC;oBAC3B,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE;iBACjD,CAAC,CAAA;YACN,CAAC;YAED,IAAI,kBAAkB,KAAK,kBAAkB,CAAC,IAAI,EAAE,CAAC;gBACjD,IAAI,SAAS,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;oBAC9B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAA+B,CAAC,CAAA;oBACrE,QAAQ,CAAC,qBAAqB,CAAC;wBAC3B,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACzE,CAAC,CAAA;gBACN,CAAC;qBAAM,IAAI,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACtC,QAAQ,CAAC,qBAAqB,CAAC;wBAC3B,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACvE,CAAC,CAAA;oBACF,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBAC3C,CAAC;YACL,CAAC;iBAAM,IAAI,kBAAkB,KAAK,kBAAkB,CAAC,GAAG,EAAE,CAAC;gBACvD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAmC,CAAC,CAAA;YACzE,CAAC;YAED,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBACzE,4DAA4D;gBAC5D,OAAM;YACV,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,yCAAyC,KAAK,cAAc,SAAS,uBAAuB,kBAAkB,EAAE,CAAC,CAAA;QAClI,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IACtE,CAAC;IAED;;;;;;;;;;OAUG;IACK,eAAe,CAAC,kBAAyB,EAAE,SAAgB;QAC/D,IAAI,QAAQ,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAA;QACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEnF,IAAI,kBAAkB,KAAK,kBAAkB,CAAC,IAAI,IAAI,SAAS,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;YAChF,IAAI,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,CAAA;QACtD,CAAC;aAAM,IAAI,MAAM,IAAI,SAAS,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5D,+EAA+E;YAC/E,mFAAmF;YACnF,kFAAkF;YAClF,oFAAoF;YACpF,qCAAqC;YACrC,IAAI,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,CAAA;QACtD,CAAC;QAED,QAAQ,GAAG,aAAa,CAAC,kBAAkB,EAAE,CAAA;QAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,uDAAuD,kBAAkB,cAAc,SAAS,EAAE,CAAC,CAAA;YAChH,OAAO,IAAI,CAAA;QACf,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAA;QACjE,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,yBAAyB,CAAC,kBAAyB;QACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAA;QAChD,MAAM,cAAc,GAAG,eAAe,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;QAE5D,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CACtC,cAAc,EACd,IAAI,CAAC,iBAAiB,EAAE,EACxB,IAAI,CAAC,yBAAyB,EAAE,EAChC,kBAAkB,EAClB,SAAS,CAAC,IAAI,CACjB,CAAA;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAA;QACjD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAA;QAEzB,QAAQ,CAAC,qBAAqB,CAAC;YAC3B,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,EAAE,aAAa;YAC/D,CAAC,sBAAsB,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,aAAa,CAAC;YACpG,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,EAAE;YAC1C,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,IAAI,GAAG,EAAE;YACtD,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,IAAI,GAAG,EAAE;YACrD,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,QAAQ;YAChD,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAC,mBAAmB;SACvF,CAAC,CAAA;QAEF,qFAAqF;QACrF,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,QAAQ,CAAA;QAEzC,aAAa,CAAC,kBAAkB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;QAC1D,MAAM,CAAC,KAAK,CAAC,wCAAwC,cAAc,CAAC,KAAK,EAAE,WAAW,MAAM,aAAa,QAAQ,EAAE,CAAC,CAAA;IACxH,CAAC;IAED,4EAA4E;IACpE,gBAAgB,CAAC,QAA+B,EAAE,KAA6B;QACnF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAA;YAChG,OAAM;QACV,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,EAAE,OAAO,CAAA;QAC9C,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,MAAM,CAAA;QACnC,IAAI,CAAC,YAAY,CAAC,gBAAgB,GAAG,IAAI,CAAA;QACzC,IAAI,CAAC,YAAY,CAAC,YAAY,GAAG,KAAK,CAAA;QACtC,4EAA4E;QAC5E,IAAI,CAAC,aAAa,GAAG,EAAE,CAAA;QAEvB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAC3C,kEAAkE;QAClE,MAAM,aAAa,GAAG,QAAQ;YAC1B,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG;YAChD,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA;QAEjB,QAAQ,CAAC,qBAAqB,CAAC;YAC3B,mFAAmF;YACnF,iFAAiF;YACjF,2DAA2D;YAC3D,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,IAAI;YACjD,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,aAAa;YACrD,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE,aAAa;YACtD,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;YAC/D,iFAAiF;YACjF,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,IAAI;YAC5C,iFAAiF;YACjF,sFAAsF;YACtF,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE,CAAC,IAAI,CAAC;YAC7F,GAAG,IAAI,CAAC,sBAAsB,EAAE;YAChC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;SACxE,CAAC,CAAA;IACN,CAAC;IAEO,gBAAgB,CAAC,MAAc,EAAE,OAA4B,EAAE,QAA8B;QACjG,OAAO;YACH,OAAO,EAAE;gBACL,IAAI,EAAE,OAAO,EAAE,IAAI;gBACnB,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE;gBAC9B,WAAW,EAAE,OAAO,EAAE,WAAW;aACpC;YACD,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;YAC/B,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACpD,QAAQ,EAAE,QAAQ,IAAI,EAAE;SAC3B,CAAA;IACL,CAAC;IAED;;;;;;;OAOG;IACK,kBAAkB,CAAC,QAA+B,EAAE,IAA6B;QACrF,MAAM,KAAK,GAAG,IAAI,CAAC,KAA2C,CAAA;QAC9D,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAA;QAC1D,MAAM,OAAO,GAAG,KAAK,EAAE,eAAe,EAAE,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAA;QAE5E,MAAM,OAAO,GAA4B;YACrC,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACxE,CAAA;QAED,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,KAA+B,CAAC,CAAC,CAAA;QAC7H,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,CAAA;QAC5B,IAAI,MAAM,EAAE,CAAC;YACT,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YAC5C,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACrD,+EAA+E;gBAC/E,UAAU,GAAG,SAAS,CAAA;YAC1B,CAAC;YAED,sFAAsF;YACtF,iFAAiF;YACjF,qFAAqF;YACrF,4EAA4E;YAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,KAAK,IAAI,CAAA;YACjG,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,IAAI,UAAU,KAAK,QAAQ,IAAI,CAAC,eAAe,EAAE,CAAC;gBACjF,UAAU,GAAG,QAAQ,CAAA;YACzB,CAAC;YAED,OAAO,CAAC,sBAAsB,CAAC,eAAe,CAAC,GAAG,UAAU,CAAA;YAC5D,0EAA0E;YAC1E,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,QAAQ;gBACxC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO;gBAClE,CAAC,CAAC,SAAS,CAAA;YAEf,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAA;gBAC9B,iEAAiE;gBACjE,OAAO,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,GAAG;oBAC/C,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE;iBACnE,CAAA;gBACD,OAAO,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;gBACvG,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC;wBACnF,CAAC,CAAC,gBAAgB;wBAClB,CAAC,CAAC,gBAAgB,CAAA;gBAC1B,CAAC;YACL,CAAC;QACL,CAAC;QAED,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;QACvC,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,SAAS,CAAA;IAC1C,CAAC;IAED;;;;;;;;OAQG;IACH,6BAA6B;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAA;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAA;YACtF,OAAO,EAAE,CAAA;QACb,CAAC;QAED,MAAM,SAAS,GAAe,EAAE,CAAA;QAChC,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAmB,EAAE,CAAC;YAC7D,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACb,KAAK,MAAM,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;oBAClD,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;wBACrB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;oBACtC,CAAC;gBACL,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACxB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;YAClC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;IAC1F,CAAC;IAEO,4BAA4B,CAAC,QAAkB,EAAE,OAAgB;QACrE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CACtC,eAAe,CAAC,aAAa,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC,EAChE,IAAI,CAAC,iBAAiB,EAAE,EACxB,IAAI,CAAC,yBAAyB,EAAE,EAChC,kBAAkB,CAAC,IAAI,EACvB,SAAS,CAAC,IAAI,CACjB,CAAA;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAA;QACjD,QAAQ,CAAC,qBAAqB,CAAC;YAC3B,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,EAAE,aAAa;YAC/D,CAAC,sBAAsB,CAAC,0BAA0B,CAAC,EAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC,aAAa,CAAC;YACpG,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,EAAE;YAC1C,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,IAAI,GAAG,EAAE;YACrD,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,IAAI,GAAG,EAAE;YACtD,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE;YAChD,iFAAiF;YACjF,qFAAqF;YACrF,6DAA6D;YAC7D,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,IAAI;YACnD,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,IAAI;YACrD,CAAC,sBAAsB,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,IAAI;YACtD,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAC9D,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,IAAI;YAC5C,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE,SAAS;YACnD,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,GAAG;YACjD,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,GAAG;YAC/C,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,GAAG;YAChD,GAAG,IAAI,CAAC,sBAAsB,EAAE;YAChC,CAAC,wBAAwB,CAAC,EAAE,IAAI;YAChC,CAAC,iBAAiB,CAAC,EAAE;gBACjB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE;gBACjG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE;gBACjC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAU,EAAE,EAAE,CAAC,CAAC;oBAC/C,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,SAAS;iBACpB,CAAC,CAAC;gBACH,QAAQ,EAAE,EAAE;aACf;SACJ,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAA;IACnB,CAAC;IAED;;;OAGG;IACH,eAAe;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;IACpE,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,YAAY,CAAC,QAA+B,EAAE,QAAiC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,OAAM;QACV,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;QACpD,MAAM,SAAS,GAA4B;YACvC,2EAA2E;YAC3E,kFAAkF;YAClF,IAAI,EAAG,IAAe,IAAI,sBAAsB,CAAC,QAAQ;YACzD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAiB,CAAC;YACvC,KAAK;YACL,SAAS;SACZ,CAAA;QAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,SAAS,CAAC,sBAAsB,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAA;YACpE,qFAAqF;YACrF,mFAAmF;YACnF,6EAA6E;YAC7E,SAAS,CAAC,sBAAsB,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA;QACxE,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC,aAAa,CAAc,CAAA;QACnG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvB,QAAQ,CAAC,qBAAqB,CAAC;YAC3B,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,OAAO;SAClD,CAAC,CAAA;IACN,CAAC;IAED;;;;;OAKG;IACK,eAAe,CAAC,QAA+B,EAAE,GAAW,EAAE,SAAgB,EAAE,IAA6B;QACjH,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC,iBAAiB,CAA2B,CAAA;QACzH,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC,kBAAkB,CAA2B,CAAA;QAC3H,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QAC9B,CAAC;QAED,MAAM,OAAO,GAA4B;YACrC,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,YAAY;YACxD,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,EAAE,aAAa;SAC7D,CAAA;QAED,IAAI,SAAS,KAAK,SAAS,CAAC,GAAG,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC,WAAW,CAAC,IAAI,EAAE,CAAW,CAAA;YACrG,MAAM,IAAI,GAA4B;gBAClC,GAAG;gBACH,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM;gBAC5C,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAC,mBAAmB;gBACpF,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACvE,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,EAAE;gBAC1C,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAuB,CAAC;gBAC9E,mFAAmF;gBACnF,iFAAiF;gBACjF,0DAA0D;gBAC1D,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI;gBACjD,GAAG,IAAI,CAAC,sBAAsB,EAAE;aACnC,CAAA;YACD,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;YACjC,OAAO,CAAC,yBAAyB,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAA;YAC9D,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAA;YAC/B,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAA;YACnC,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;YACvC,MAAM,CAAC,KAAK,CAAC,2CAA2C,GAAG,SAAS,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YACjH,OAAO,IAAI,CAAA;QACf,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,8CAA8C,GAAG,8DAA8D,CAAC,CAAA;YAC5H,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;YACpB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;YAClC,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;YACvC,OAAO,KAAK,CAAA;QAChB,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,EAA6B,CAAA;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,MAA2C,CAAA;QACnE,IAAI,UAAU,EAAE,CAAC;YACb,uFAAuF;YACvF,8EAA8E;YAC9E,gFAAgF;YAChF,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;YACtF,oFAAoF;YACpF,IAAI,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAAC,OAAO,CAAA;YAC3C,IAAI,CAAC,iBAAiB,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAA;QACjD,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,sDAAsD,GAAG,yBAAyB,CAAC,CAAA;QACnG,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAC1E,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAClC,OAAO,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,GAAG,GAAG,CAAA;QAC/D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAA;QACnC,QAAQ,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;QACvC,MAAM,CAAC,KAAK,CAAC,4CAA4C,GAAG,WAAW,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;QACtH,OAAO,IAAI,CAAA;IACf,CAAC"}
@@ -51,6 +51,26 @@ export declare class GrpcClient {
51
51
  * @private
52
52
  */
53
53
  stopBinSession(): Promise<unknown>;
54
+ /**
55
+ * Render end-of-build customer-visible summary entries.
56
+ *
57
+ * Per the binary proto contract (CustomerVisibleSummaryEntry in
58
+ * sdk-messages.proto): iterate by `severity` + `body`, write `body` verbatim,
59
+ * and pick the stream from `severity`. Never branches on `entryType`, so new
60
+ * entry types need no SDK change.
61
+ * @private
62
+ */
63
+ private renderCustomerVisibleSummary;
64
+ /**
65
+ * Tint a summary block by severity — yellow for warn (an outdated SDK), red for
66
+ * error (a deprecated one), untouched otherwise.
67
+ *
68
+ * Each line is wrapped and reset on its own rather than the block as a whole, so
69
+ * a truncated or interleaved write cannot leave the customer's terminal stuck in
70
+ * colour. The first non-blank, non-border line is emphasised.
71
+ * @private
72
+ */
73
+ private colouriseSummaryBody;
54
74
  testSessionEvent(data: Omit<TestSessionEventRequest, 'binSessionId'>): Promise<TestSessionEventResponse | undefined>;
55
75
  /**
56
76
  *
@@ -1 +1 @@
1
- {"version":3,"file":"grpcClient.d.ts","sourceRoot":"","sources":["../../src/cli/grpcClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,SAAS,EAeZ,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAGR,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EAEtB,iBAAiB,EACjB,oCAAoC,EACpC,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,qCAAqC,EAGxC,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAK7C;;;;;GAKG;AACH,qBAAa,UAAU;;IAGnB,YAAY,EAAE,MAAM,GAAC,SAAS,CAAA;IAC9B,aAAa,EAAE,MAAM,GAAC,SAAS,CAAA;IAC/B,OAAO,EAAE,GAAG,GAAC,IAAI,CAAO;IACxB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAO;IAC/B,MAAM,sBAAe;;IAIrB;;;OAGG;IACH,MAAM,CAAC,WAAW;IAOlB;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IAIpC;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAcnC;;;OAGG;IACH,OAAO;IAsCD,eAAe,CAAC,UAAU,EAAE,MAAM;IAuDxC;;;OAGG;IACG,iBAAiB;IAoCvB;;;;OAIG;IACG,cAAc;IA4Cd,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,uBAAuB,EAAE,cAAc,CAAC;IA6D1E;;;OAGG;IAEG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,cAAc,CAAC;IA8D9E;;;OAGG;IAEG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC;IAkC7D,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,cAAc,CAAC;IA8DlE,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,oCAAoC,EAAE,cAAc,CAAC;IAmCpG;;;;;;OAMG;IACG,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IA4C3I;;;OAGG;IACH,SAAS;IAIT;;;OAGG;IACH,UAAU;CAGb"}
1
+ {"version":3,"file":"grpcClient.d.ts","sourceRoot":"","sources":["../../src/cli/grpcClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,SAAS,EAeZ,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EAGR,yBAAyB,EACzB,uBAAuB,EACvB,sBAAsB,EAEtB,iBAAiB,EACjB,oCAAoC,EACpC,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,qCAAqC,EAGxC,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAa7C;;;;;GAKG;AACH,qBAAa,UAAU;;IAGnB,YAAY,EAAE,MAAM,GAAC,SAAS,CAAA;IAC9B,aAAa,EAAE,MAAM,GAAC,SAAS,CAAA;IAC/B,OAAO,EAAE,GAAG,GAAC,IAAI,CAAO;IACxB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAO;IAC/B,MAAM,sBAAe;;IAIrB;;;OAGG;IACH,MAAM,CAAC,WAAW;IAOlB;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IAIpC;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAcnC;;;OAGG;IACH,OAAO;IAsCD,eAAe,CAAC,UAAU,EAAE,MAAM;IAuDxC;;;OAGG;IACG,iBAAiB;IAoCvB;;;;OAIG;IACG,cAAc;IA6CpB;;;;;;;;OAQG;IACH,OAAO,CAAC,4BAA4B;IA8CpC;;;;;;;;OAQG;IACH,OAAO,CAAC,oBAAoB;IA+BtB,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,uBAAuB,EAAE,cAAc,CAAC;IA6D1E;;;OAGG;IAEG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,yBAAyB,EAAE,cAAc,CAAC;IA8D9E;;;OAGG;IAEG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC;IAkC7D,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,cAAc,CAAC;IA8DlE,6BAA6B,CAAC,IAAI,EAAE,IAAI,CAAC,oCAAoC,EAAE,cAAc,CAAC;IAmCpG;;;;;;OAMG;IACG,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IA4C3I;;;OAGG;IACH,SAAS;IAIT;;;OAGG;IACH,UAAU;CAGb"}