@gate-forge/pack-playwright 0.7.0 → 0.8.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.
- package/README.md +31 -0
- package/dist/constants.d.ts +13 -140
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +13 -148
- package/dist/constants.js.map +1 -1
- package/dist/cypress/plugin.d.ts +53 -0
- package/dist/cypress/plugin.d.ts.map +1 -0
- package/dist/cypress/plugin.js +369 -0
- package/dist/cypress/plugin.js.map +1 -0
- package/dist/cypress/spec-scan.d.ts +39 -0
- package/dist/cypress/spec-scan.d.ts.map +1 -0
- package/dist/cypress/spec-scan.js +301 -0
- package/dist/cypress/spec-scan.js.map +1 -0
- package/dist/diagnosis.d.ts +39 -0
- package/dist/diagnosis.d.ts.map +1 -0
- package/dist/diagnosis.js +63 -0
- package/dist/diagnosis.js.map +1 -0
- package/dist/discovery/adapter-projection.d.ts +13 -0
- package/dist/discovery/adapter-projection.d.ts.map +1 -0
- package/dist/discovery/adapter-projection.js +84 -0
- package/dist/discovery/adapter-projection.js.map +1 -0
- package/dist/discovery/config-locations.d.ts +5 -0
- package/dist/discovery/config-locations.d.ts.map +1 -0
- package/dist/discovery/config-locations.js +19 -0
- package/dist/discovery/config-locations.js.map +1 -0
- package/dist/discovery/cypress-runner-adapter.d.ts +112 -0
- package/dist/discovery/cypress-runner-adapter.d.ts.map +1 -0
- package/dist/discovery/cypress-runner-adapter.js +501 -0
- package/dist/discovery/cypress-runner-adapter.js.map +1 -0
- package/dist/discovery/discover.d.ts +53 -1
- package/dist/discovery/discover.d.ts.map +1 -1
- package/dist/discovery/discover.js +100 -3
- package/dist/discovery/discover.js.map +1 -1
- package/dist/discovery/git-ignore.d.ts +13 -0
- package/dist/discovery/git-ignore.d.ts.map +1 -0
- package/dist/discovery/git-ignore.js +62 -0
- package/dist/discovery/git-ignore.js.map +1 -0
- package/dist/discovery/index.d.ts +9 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +9 -0
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/playwright-runner-adapter.d.ts +108 -0
- package/dist/discovery/playwright-runner-adapter.d.ts.map +1 -0
- package/dist/discovery/playwright-runner-adapter.js +185 -0
- package/dist/discovery/playwright-runner-adapter.js.map +1 -0
- package/dist/discovery/prepare-barrier.d.ts +522 -0
- package/dist/discovery/prepare-barrier.d.ts.map +1 -0
- package/dist/discovery/prepare-barrier.js +739 -0
- package/dist/discovery/prepare-barrier.js.map +1 -0
- package/dist/discovery/pytest-adapter.d.ts.map +1 -1
- package/dist/discovery/pytest-adapter.js +6 -2
- package/dist/discovery/pytest-adapter.js.map +1 -1
- package/dist/discovery/pytest-runner-adapter.d.ts +124 -0
- package/dist/discovery/pytest-runner-adapter.d.ts.map +1 -0
- package/dist/discovery/pytest-runner-adapter.js +454 -0
- package/dist/discovery/pytest-runner-adapter.js.map +1 -0
- package/dist/discovery/reconcile.d.ts +80 -11
- package/dist/discovery/reconcile.d.ts.map +1 -1
- package/dist/discovery/reconcile.js +395 -78
- package/dist/discovery/reconcile.js.map +1 -1
- package/dist/discovery/runner-env.d.ts +88 -2
- package/dist/discovery/runner-env.d.ts.map +1 -1
- package/dist/discovery/runner-env.js +142 -4
- package/dist/discovery/runner-env.js.map +1 -1
- package/dist/discovery/static-discovery.d.ts +38 -3
- package/dist/discovery/static-discovery.d.ts.map +1 -1
- package/dist/discovery/static-discovery.js +454 -15
- package/dist/discovery/static-discovery.js.map +1 -1
- package/dist/discovery/supervised-run.d.ts +199 -10
- package/dist/discovery/supervised-run.d.ts.map +1 -1
- package/dist/discovery/supervised-run.js +350 -39
- package/dist/discovery/supervised-run.js.map +1 -1
- package/dist/discovery/trusted-config.d.ts +180 -6
- package/dist/discovery/trusted-config.d.ts.map +1 -1
- package/dist/discovery/trusted-config.js +279 -10
- package/dist/discovery/trusted-config.js.map +1 -1
- package/dist/discovery/vitest-runner-adapter.d.ts +172 -0
- package/dist/discovery/vitest-runner-adapter.d.ts.map +1 -0
- package/dist/discovery/vitest-runner-adapter.js +607 -0
- package/dist/discovery/vitest-runner-adapter.js.map +1 -0
- package/dist/fixture/consumer-runner.d.ts +4 -0
- package/dist/fixture/consumer-runner.d.ts.map +1 -0
- package/dist/fixture/consumer-runner.js +38 -0
- package/dist/fixture/consumer-runner.js.map +1 -0
- package/dist/fixture/evidence.d.ts +27 -0
- package/dist/fixture/evidence.d.ts.map +1 -1
- package/dist/fixture/evidence.js +12 -0
- package/dist/fixture/evidence.js.map +1 -1
- package/dist/fixture/fixture.d.ts +2 -1
- package/dist/fixture/fixture.d.ts.map +1 -1
- package/dist/fixture/fixture.js +1 -17
- package/dist/fixture/fixture.js.map +1 -1
- package/dist/fixture/witness-client.d.ts +6 -174
- package/dist/fixture/witness-client.d.ts.map +1 -1
- package/dist/fixture/witness-client.js +6 -267
- package/dist/fixture/witness-client.js.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +6 -12
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js +6 -17
- package/dist/json.js.map +1 -1
- package/dist/reporter/project-graph-reporter.d.ts +92 -0
- package/dist/reporter/project-graph-reporter.d.ts.map +1 -0
- package/dist/reporter/project-graph-reporter.js +92 -0
- package/dist/reporter/project-graph-reporter.js.map +1 -0
- package/dist/reporter/reporter.cjs.map +1 -1
- package/dist/reporter/reporter.d.ts +93 -4
- package/dist/reporter/reporter.d.ts.map +1 -1
- package/dist/reporter/reporter.js +174 -18
- package/dist/reporter/reporter.js.map +1 -1
- package/dist/runner-claims.d.ts +13 -0
- package/dist/runner-claims.d.ts.map +1 -0
- package/dist/runner-claims.js +46 -0
- package/dist/runner-claims.js.map +1 -0
- package/dist/runner-resolution.d.ts +3 -0
- package/dist/runner-resolution.d.ts.map +1 -0
- package/dist/runner-resolution.js +14 -0
- package/dist/runner-resolution.js.map +1 -0
- package/dist/supervisor/client.d.ts +23 -1
- package/dist/supervisor/client.d.ts.map +1 -1
- package/dist/supervisor/client.js +49 -0
- package/dist/supervisor/client.js.map +1 -1
- package/dist/supervisor/drain.d.ts +65 -0
- package/dist/supervisor/drain.d.ts.map +1 -1
- package/dist/supervisor/drain.js +353 -9
- package/dist/supervisor/drain.js.map +1 -1
- package/dist/supervisor/index.d.ts +7 -3
- package/dist/supervisor/index.d.ts.map +1 -1
- package/dist/supervisor/index.js +7 -3
- package/dist/supervisor/index.js.map +1 -1
- package/dist/supervisor/spool.d.ts +65 -2
- package/dist/supervisor/spool.d.ts.map +1 -1
- package/dist/supervisor/spool.js +47 -0
- package/dist/supervisor/spool.js.map +1 -1
- package/dist/surface.d.ts +6 -207
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +6 -264
- package/dist/surface.js.map +1 -1
- package/dist/vitest/index.d.ts +23 -0
- package/dist/vitest/index.d.ts.map +1 -0
- package/dist/vitest/index.js +356 -0
- package/dist/vitest/index.js.map +1 -0
- package/dist/vitest/reporter.d.ts +83 -0
- package/dist/vitest/reporter.d.ts.map +1 -0
- package/dist/vitest/reporter.js +211 -0
- package/dist/vitest/reporter.js.map +1 -0
- package/dist/vitest/worker-slot.d.ts +36 -0
- package/dist/vitest/worker-slot.d.ts.map +1 -0
- package/dist/vitest/worker-slot.js +51 -0
- package/dist/vitest/worker-slot.js.map +1 -0
- package/dist/witness/adapter-registry.d.ts +6 -50
- package/dist/witness/adapter-registry.d.ts.map +1 -1
- package/dist/witness/adapter-registry.js +6 -257
- package/dist/witness/adapter-registry.js.map +1 -1
- package/dist/witness/behavior-request.d.ts +6 -76
- package/dist/witness/behavior-request.d.ts.map +1 -1
- package/dist/witness/behavior-request.js +6 -273
- package/dist/witness/behavior-request.js.map +1 -1
- package/dist/witness/behavior.d.ts +6 -48
- package/dist/witness/behavior.d.ts.map +1 -1
- package/dist/witness/behavior.js +6 -114
- package/dist/witness/behavior.js.map +1 -1
- package/dist/witness/bin.d.ts +6 -17
- package/dist/witness/bin.d.ts.map +1 -1
- package/dist/witness/bin.js +6 -168
- package/dist/witness/bin.js.map +1 -1
- package/dist/witness/browser.d.ts +14 -206
- package/dist/witness/browser.d.ts.map +1 -1
- package/dist/witness/browser.js +15 -654
- package/dist/witness/browser.js.map +1 -1
- package/dist/witness/classifications.d.ts +6 -38
- package/dist/witness/classifications.d.ts.map +1 -1
- package/dist/witness/classifications.js +6 -83
- package/dist/witness/classifications.js.map +1 -1
- package/dist/witness/env-attestation.d.ts +6 -94
- package/dist/witness/env-attestation.d.ts.map +1 -1
- package/dist/witness/env-attestation.js +6 -198
- package/dist/witness/env-attestation.js.map +1 -1
- package/dist/witness/fixture-provider.d.ts +6 -82
- package/dist/witness/fixture-provider.d.ts.map +1 -1
- package/dist/witness/fixture-provider.js +6 -105
- package/dist/witness/fixture-provider.js.map +1 -1
- package/dist/witness/loopback-pins.d.ts +6 -75
- package/dist/witness/loopback-pins.d.ts.map +1 -1
- package/dist/witness/loopback-pins.js +6 -240
- package/dist/witness/loopback-pins.js.map +1 -1
- package/dist/witness/server.d.ts +8 -26
- package/dist/witness/server.d.ts.map +1 -1
- package/dist/witness/server.js +24 -3761
- package/dist/witness/server.js.map +1 -1
- package/dist/witness/types.d.ts +6 -882
- package/dist/witness/types.d.ts.map +1 -1
- package/dist/witness/types.js +9 -1
- package/dist/witness/types.js.map +1 -1
- package/examples/overlay-proof.spec.js +75 -0
- package/package.json +8 -2
- package/python/gateforge_pytest_plugin.py +462 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { RunnerExecutionEnvelope } from '@gate-forge/core';
|
|
2
|
+
import type { RunnerAdapter, RunnerChildEnv, RunnerChildEnvContext, RunnerEnumeration, RunnerExecuteRequest, RunnerRawResults, RunnerSessionTag } from '@gate-forge/witness/adapter';
|
|
3
|
+
import { cypressSupportSource, registerGateforgeCypressPlugin, type CypressRunReport } from '../cypress/plugin.js';
|
|
4
|
+
export { cypressSupportSource, registerGateforgeCypressPlugin };
|
|
5
|
+
export type { CypressRunReport };
|
|
6
|
+
/** Per-test session variables a runner adapter publishes to the test. */
|
|
7
|
+
export declare const CYPRESS_ENV_SESSION_ID = "GATEFORGE_SESSION_ID";
|
|
8
|
+
export declare const CYPRESS_ENV_SESSION_TOKEN = "GATEFORGE_SESSION_TOKEN";
|
|
9
|
+
export declare const CYPRESS_ENV_SESSION_PROXY_URL = "GATEFORGE_SESSION_PROXY_URL";
|
|
10
|
+
/** The variables that carry ONE test's identity to its traffic. */
|
|
11
|
+
export declare const CYPRESS_IDENTITY_ENV: readonly string[];
|
|
12
|
+
/** Options the Cypress runner adapter accepts. */
|
|
13
|
+
export interface CypressRunnerAdapterOptions {
|
|
14
|
+
/**
|
|
15
|
+
* Run-scoped witness wiring for `execute` (the trusted caller's
|
|
16
|
+
* channel). Absent falls back to the ambient
|
|
17
|
+
* `GATEFORGE_WITNESS_URL`/`GATEFORGE_RUN_TOKEN`/`GATEFORGE_APP_BASE_URL`.
|
|
18
|
+
*/
|
|
19
|
+
witness?: {
|
|
20
|
+
url?: string;
|
|
21
|
+
token?: string;
|
|
22
|
+
appBaseUrl?: string;
|
|
23
|
+
};
|
|
24
|
+
/** The browser Cypress runs (`electron` unless the project says otherwise). */
|
|
25
|
+
browser?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The Cypress runner adapter.
|
|
29
|
+
*
|
|
30
|
+
* The CLI is resolved LOCAL FIRST (`<cwd>/node_modules/.bin/cypress`,
|
|
31
|
+
* the same rule the supervised Playwright run applies to its browser),
|
|
32
|
+
* and an absent CLI is `unavailable` — never a silent pass.
|
|
33
|
+
*/
|
|
34
|
+
export declare class CypressRunnerAdapter implements RunnerAdapter<CypressRunReport | null> {
|
|
35
|
+
private readonly options;
|
|
36
|
+
readonly runner = "cypress";
|
|
37
|
+
readonly capabilities: {
|
|
38
|
+
readonly inventory: "available";
|
|
39
|
+
readonly resolveInstances: "available";
|
|
40
|
+
readonly execute: "available";
|
|
41
|
+
};
|
|
42
|
+
constructor(options?: CypressRunnerAdapterOptions);
|
|
43
|
+
/**
|
|
44
|
+
* Job 1: the expected set, fixed BEFORE the run, read from the spec
|
|
45
|
+
* sources (Cypress has no list mode that does not execute the suite).
|
|
46
|
+
*
|
|
47
|
+
* Args:
|
|
48
|
+
* cwd: absolute project root.
|
|
49
|
+
*
|
|
50
|
+
* Returns:
|
|
51
|
+
* Promise<RunnerEnumeration>: the enumerated tests, or an
|
|
52
|
+
* `unavailable` verdict with a single cause (no specs, a spec with
|
|
53
|
+
* non-literal titles, or a spec tree that declares no test).
|
|
54
|
+
*/
|
|
55
|
+
enumerate(cwd: string): Promise<RunnerEnumeration>;
|
|
56
|
+
/**
|
|
57
|
+
* Job 2: the per-test tag. Cypress cannot carry per-test environment
|
|
58
|
+
* (one process serves the whole run), so the tag is issued at task
|
|
59
|
+
* time by the pack's plugin and delivered to the browser by the
|
|
60
|
+
* generated support file; these variables document the channel the
|
|
61
|
+
* fixture resolves.
|
|
62
|
+
*
|
|
63
|
+
* Args:
|
|
64
|
+
* _session: the test being tagged.
|
|
65
|
+
* context: run-scoped, non-secret witness wiring.
|
|
66
|
+
*
|
|
67
|
+
* Returns:
|
|
68
|
+
* RunnerChildEnv: the run identity plus the session-scoped tag.
|
|
69
|
+
*/
|
|
70
|
+
childEnv(_session: RunnerSessionTag, context: RunnerChildEnvContext): RunnerChildEnv;
|
|
71
|
+
/**
|
|
72
|
+
* Job 3: runs the SELECTED spec files through the project's own
|
|
73
|
+
* Cypress CLI with a generated config that chains the project's
|
|
74
|
+
* config, wires the pack's plugin and support file, and forwards the
|
|
75
|
+
* run-scoped (never secret) wiring through the witnessed-session env
|
|
76
|
+
* allowlist.
|
|
77
|
+
*
|
|
78
|
+
* Args:
|
|
79
|
+
* request: the exact selection, run identity, and wall-clock bound.
|
|
80
|
+
*
|
|
81
|
+
* Returns:
|
|
82
|
+
* Promise<RunnerExecutionEnvelope>: the structured outcome envelope
|
|
83
|
+
* (a Cypress exit code alone is never a gate result).
|
|
84
|
+
*/
|
|
85
|
+
execute(request: RunnerExecuteRequest): Promise<RunnerExecutionEnvelope>;
|
|
86
|
+
/**
|
|
87
|
+
* Job 4: the sealed run report, strictly mapped.
|
|
88
|
+
*
|
|
89
|
+
* Args:
|
|
90
|
+
* raw: the report text plus the runner exit status.
|
|
91
|
+
*
|
|
92
|
+
* Returns:
|
|
93
|
+
* RunnerExecutionEnvelope: reporter INPUT, never a verdict. An
|
|
94
|
+
* unreadable report, a zero-test run, and a report whose rows carry
|
|
95
|
+
* no attributable identity are all `complete: false`.
|
|
96
|
+
*/
|
|
97
|
+
parseResults(raw: RunnerRawResults): RunnerExecutionEnvelope;
|
|
98
|
+
/**
|
|
99
|
+
* The runner's native parsed report (diagnostics surfaces).
|
|
100
|
+
*
|
|
101
|
+
* Args:
|
|
102
|
+
* raw: the report text plus the runner exit status.
|
|
103
|
+
*
|
|
104
|
+
* Returns:
|
|
105
|
+
* CypressRunReport | null: the parsed document, or null when the
|
|
106
|
+
* report is absent or unparsable (never a guess).
|
|
107
|
+
*/
|
|
108
|
+
parseReport(raw: RunnerRawResults): CypressRunReport | null;
|
|
109
|
+
/** The Cypress CLI for a project (local-first), or null. */
|
|
110
|
+
private cypressCliOf;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=cypress-runner-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypress-runner-adapter.d.ts","sourceRoot":"","sources":["../../src/discovery/cypress-runner-adapter.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,uBAAuB,EAAyB,MAAM,kBAAkB,CAAC;AACvF,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,6BAA6B,CAAC;AAQrC,OAAO,EACL,oBAAoB,EACpB,8BAA8B,EAC9B,KAAK,gBAAgB,EACtB,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC,yEAAyE;AACzE,eAAO,MAAM,sBAAsB,yBAAyB,CAAC;AAC7D,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AACnE,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAE3E,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAIjD,CAAC;AAiBF,kDAAkD;AAClD,MAAM,WAAW,2BAA2B;IAC1C;;;;OAIG;IACH,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,YAAW,aAAa,CAAC,gBAAgB,GAAG,IAAI,CAAC;IASrE,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,QAAQ,CAAC,MAAM,aAAa;IAE5B,QAAQ,CAAC,YAAY;;;;MAIV;gBAEkB,OAAO,GAAE,2BAAgC;IAEtE;;;;;;;;;;;OAWG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsBxD;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,qBAAqB,GAAG,cAAc;IAoBpF;;;;;;;;;;;;;OAaG;IACG,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA0G9E;;;;;;;;;;OAUG;IACH,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,uBAAuB;IAiE5D;;;;;;;;;OASG;IACH,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,IAAI;IAY3D,4DAA4D;IAC5D,OAAO,CAAC,YAAY;CAIrB"}
|
|
@@ -0,0 +1,501 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Cypress runner adapter behind the runner-neutral `RunnerAdapter`
|
|
3
|
+
* contract (plan 2026-09-25 phase 2).
|
|
4
|
+
*
|
|
5
|
+
* Cypress is the second witness-producing runner: same evidence rules
|
|
6
|
+
* as Playwright, same supervision, no new trust tier.
|
|
7
|
+
* - enumerate: Cypress cannot list tests without running them, so the
|
|
8
|
+
* expected set is read from the spec SOURCES (`cypress/spec-scan.ts`)
|
|
9
|
+
* and fixed BEFORE the run. A spec whose titles are not static
|
|
10
|
+
* literals enumerates `unavailable` — never a guessed half-set.
|
|
11
|
+
* - tag: the pack's Cypress plugin (`cypress/plugin.ts`) registers the
|
|
12
|
+
* lifecycle tasks the generated support file calls; the support file
|
|
13
|
+
* resolves THIS test's session and rewrites `cy.request` traffic at
|
|
14
|
+
* the app origin onto that session's proxy origin (the same
|
|
15
|
+
* `session-proxy` channel the Playwright fixture uses). Traffic that
|
|
16
|
+
* does not go through it (a raw browser `fetch`) stays unattributed
|
|
17
|
+
* and is credited to nothing.
|
|
18
|
+
* - execute: the project's own Cypress CLI, driven with a GENERATED
|
|
19
|
+
* config file that chains the project's config and adds the pack's
|
|
20
|
+
* plugin and support file. Selection granularity is the spec FILE.
|
|
21
|
+
* - parse: the report the plugin seals from mocha's own `after:run`
|
|
22
|
+
* results, strictly: a row with no spec file or no title path is
|
|
23
|
+
* never attributed, a zero-test run is incomplete, and more than one
|
|
24
|
+
* attempt for a test is a runner-assisted retry (required retries
|
|
25
|
+
* are zero) that blocks the run.
|
|
26
|
+
*/
|
|
27
|
+
import { spawn } from 'node:child_process';
|
|
28
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
29
|
+
import { fileURLToPath } from 'node:url';
|
|
30
|
+
import { join } from 'node:path';
|
|
31
|
+
import { ENV_APP_BASE_URL, ENV_RUN_ID, ENV_RUN_TOKEN, ENV_STATE_DIR, ENV_WITNESS_URL, } from '@gate-forge/witness/constants';
|
|
32
|
+
import { cypressSupportSource, registerGateforgeCypressPlugin, } from '../cypress/plugin.js';
|
|
33
|
+
import { scanCypressSpecs } from '../cypress/spec-scan.js';
|
|
34
|
+
import { buildWitnessedSessionRunnerEnv } from './runner-env.js';
|
|
35
|
+
// Public re-exports (the CLI supervised surface drives the adapter and
|
|
36
|
+
// needs the plugin registration plus the report type).
|
|
37
|
+
export { cypressSupportSource, registerGateforgeCypressPlugin };
|
|
38
|
+
/** Per-test session variables a runner adapter publishes to the test. */
|
|
39
|
+
export const CYPRESS_ENV_SESSION_ID = 'GATEFORGE_SESSION_ID';
|
|
40
|
+
export const CYPRESS_ENV_SESSION_TOKEN = 'GATEFORGE_SESSION_TOKEN';
|
|
41
|
+
export const CYPRESS_ENV_SESSION_PROXY_URL = 'GATEFORGE_SESSION_PROXY_URL';
|
|
42
|
+
/** The variables that carry ONE test's identity to its traffic. */
|
|
43
|
+
export const CYPRESS_IDENTITY_ENV = [
|
|
44
|
+
CYPRESS_ENV_SESSION_ID,
|
|
45
|
+
CYPRESS_ENV_SESSION_TOKEN,
|
|
46
|
+
CYPRESS_ENV_SESSION_PROXY_URL,
|
|
47
|
+
];
|
|
48
|
+
/** The report document the plugin seals for one run. */
|
|
49
|
+
const REPORT_FILE = 'report.json';
|
|
50
|
+
/** Project config file names the generated config can chain. */
|
|
51
|
+
const PROJECT_CONFIG_NAMES = [
|
|
52
|
+
'cypress.config.cjs',
|
|
53
|
+
'cypress.config.js',
|
|
54
|
+
'cypress.config.mjs',
|
|
55
|
+
'cypress.config.ts',
|
|
56
|
+
'cypress.config.mts',
|
|
57
|
+
];
|
|
58
|
+
/** Cypress exit codes: 0 = all specs passed, 1 = tests failed. */
|
|
59
|
+
const CYPRESS_EXIT_TESTS_FAILED = 1;
|
|
60
|
+
/**
|
|
61
|
+
* The Cypress runner adapter.
|
|
62
|
+
*
|
|
63
|
+
* The CLI is resolved LOCAL FIRST (`<cwd>/node_modules/.bin/cypress`,
|
|
64
|
+
* the same rule the supervised Playwright run applies to its browser),
|
|
65
|
+
* and an absent CLI is `unavailable` — never a silent pass.
|
|
66
|
+
*/
|
|
67
|
+
export class CypressRunnerAdapter {
|
|
68
|
+
options;
|
|
69
|
+
runner = 'cypress';
|
|
70
|
+
capabilities = {
|
|
71
|
+
inventory: 'available',
|
|
72
|
+
resolveInstances: 'available',
|
|
73
|
+
execute: 'available',
|
|
74
|
+
};
|
|
75
|
+
constructor(options = {}) {
|
|
76
|
+
this.options = options;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Job 1: the expected set, fixed BEFORE the run, read from the spec
|
|
80
|
+
* sources (Cypress has no list mode that does not execute the suite).
|
|
81
|
+
*
|
|
82
|
+
* Args:
|
|
83
|
+
* cwd: absolute project root.
|
|
84
|
+
*
|
|
85
|
+
* Returns:
|
|
86
|
+
* Promise<RunnerEnumeration>: the enumerated tests, or an
|
|
87
|
+
* `unavailable` verdict with a single cause (no specs, a spec with
|
|
88
|
+
* non-literal titles, or a spec tree that declares no test).
|
|
89
|
+
*/
|
|
90
|
+
async enumerate(cwd) {
|
|
91
|
+
const scanned = scanCypressSpecs(cwd);
|
|
92
|
+
if (scanned.status === 'unavailable') {
|
|
93
|
+
return { status: 'unavailable', detail: scanned.detail, tests: [] };
|
|
94
|
+
}
|
|
95
|
+
const tests = scanned.tests.map((test) => ({
|
|
96
|
+
logicalKey: `${test.file}#${test.titlePath.join('>')}`,
|
|
97
|
+
project: null,
|
|
98
|
+
file: test.file,
|
|
99
|
+
titlePath: [...test.titlePath],
|
|
100
|
+
blockingAnnotations: [],
|
|
101
|
+
// The generated support file spools `<file>#<title path>` —
|
|
102
|
+
// registration must name the same id.
|
|
103
|
+
frameworkId: `${test.file}#${test.titlePath.join('>')}`,
|
|
104
|
+
}));
|
|
105
|
+
return {
|
|
106
|
+
status: 'discovered',
|
|
107
|
+
detail: `enumerated ${String(tests.length)} Cypress test(s) from the spec sources under ${cwd}`,
|
|
108
|
+
tests: tests.sort((a, b) => (a.logicalKey < b.logicalKey ? -1 : a.logicalKey > b.logicalKey ? 1 : 0)),
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Job 2: the per-test tag. Cypress cannot carry per-test environment
|
|
113
|
+
* (one process serves the whole run), so the tag is issued at task
|
|
114
|
+
* time by the pack's plugin and delivered to the browser by the
|
|
115
|
+
* generated support file; these variables document the channel the
|
|
116
|
+
* fixture resolves.
|
|
117
|
+
*
|
|
118
|
+
* Args:
|
|
119
|
+
* _session: the test being tagged.
|
|
120
|
+
* context: run-scoped, non-secret witness wiring.
|
|
121
|
+
*
|
|
122
|
+
* Returns:
|
|
123
|
+
* RunnerChildEnv: the run identity plus the session-scoped tag.
|
|
124
|
+
*/
|
|
125
|
+
childEnv(_session, context) {
|
|
126
|
+
return {
|
|
127
|
+
vars: {
|
|
128
|
+
[ENV_WITNESS_URL]: context.witnessUrl,
|
|
129
|
+
[ENV_RUN_TOKEN]: context.runToken,
|
|
130
|
+
[ENV_APP_BASE_URL]: context.appBaseUrl,
|
|
131
|
+
[ENV_STATE_DIR]: '<run-state dir>',
|
|
132
|
+
[ENV_RUN_ID]: '<run id>',
|
|
133
|
+
[CYPRESS_ENV_SESSION_ID]: context.sessionId,
|
|
134
|
+
[CYPRESS_ENV_SESSION_TOKEN]: context.sessionToken,
|
|
135
|
+
[CYPRESS_ENV_SESSION_PROXY_URL]: context.sessionProxyUrl,
|
|
136
|
+
},
|
|
137
|
+
tagChannel: 'session-proxy',
|
|
138
|
+
identityVars: CYPRESS_IDENTITY_ENV,
|
|
139
|
+
mechanism: 'the gateforge Cypress plugin resolves the supervisor session per started test and the ' +
|
|
140
|
+
"generated support file rewrites cy.request traffic at the app origin onto that session's proxy",
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Job 3: runs the SELECTED spec files through the project's own
|
|
145
|
+
* Cypress CLI with a generated config that chains the project's
|
|
146
|
+
* config, wires the pack's plugin and support file, and forwards the
|
|
147
|
+
* run-scoped (never secret) wiring through the witnessed-session env
|
|
148
|
+
* allowlist.
|
|
149
|
+
*
|
|
150
|
+
* Args:
|
|
151
|
+
* request: the exact selection, run identity, and wall-clock bound.
|
|
152
|
+
*
|
|
153
|
+
* Returns:
|
|
154
|
+
* Promise<RunnerExecutionEnvelope>: the structured outcome envelope
|
|
155
|
+
* (a Cypress exit code alone is never a gate result).
|
|
156
|
+
*/
|
|
157
|
+
async execute(request) {
|
|
158
|
+
const cli = this.cypressCliOf(request.cwd);
|
|
159
|
+
if (cli === null) {
|
|
160
|
+
return envelopeIncomplete(null, `cypress execution found no Cypress CLI under ${request.cwd} — install cypress in the project`);
|
|
161
|
+
}
|
|
162
|
+
const projectConfig = projectConfigOf(request.cwd);
|
|
163
|
+
if (projectConfig.unsupported !== null) {
|
|
164
|
+
return envelopeIncomplete(null, `cypress execution cannot chain the project config ${projectConfig.unsupported} — a config ` +
|
|
165
|
+
'gateforge cannot load would silently change what the run exercises, so it fails closed');
|
|
166
|
+
}
|
|
167
|
+
const files = new Set();
|
|
168
|
+
for (const logicalKey of request.logicalKeys) {
|
|
169
|
+
const file = logicalKeyFileOf(logicalKey);
|
|
170
|
+
if (file === null) {
|
|
171
|
+
return envelopeIncomplete(null, `cypress execution cannot run '${logicalKey}': not a <spec file>#<title path> identity this adapter enumerated`);
|
|
172
|
+
}
|
|
173
|
+
files.add(file);
|
|
174
|
+
}
|
|
175
|
+
const runDir = join(request.stateDir, 'cypress', request.runId);
|
|
176
|
+
const appBaseUrl = this.options.witness?.appBaseUrl ?? process.env[ENV_APP_BASE_URL] ?? '';
|
|
177
|
+
let generated;
|
|
178
|
+
try {
|
|
179
|
+
mkdirSync(runDir, { recursive: true });
|
|
180
|
+
generated = writeGeneratedConfig(runDir, projectConfig.path, projectConfig.supportFile);
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
return envelopeIncomplete(null, `cypress execution cannot write its generated config: ${error.message}`);
|
|
184
|
+
}
|
|
185
|
+
const argv = [
|
|
186
|
+
'run',
|
|
187
|
+
'--project',
|
|
188
|
+
request.cwd,
|
|
189
|
+
'--config-file',
|
|
190
|
+
generated.configFile,
|
|
191
|
+
'--browser',
|
|
192
|
+
this.options.browser ?? 'electron',
|
|
193
|
+
'--quiet',
|
|
194
|
+
...(files.size > 0 ? ['--spec', [...files].sort().join(',')] : []),
|
|
195
|
+
];
|
|
196
|
+
const child = spawn(cli, argv, {
|
|
197
|
+
cwd: request.cwd,
|
|
198
|
+
env: buildWitnessedSessionRunnerEnv({
|
|
199
|
+
[ENV_WITNESS_URL]: this.options.witness?.url ?? process.env[ENV_WITNESS_URL] ?? '',
|
|
200
|
+
[ENV_RUN_TOKEN]: this.options.witness?.token ?? process.env[ENV_RUN_TOKEN] ?? '',
|
|
201
|
+
[ENV_STATE_DIR]: request.stateDir,
|
|
202
|
+
[ENV_RUN_ID]: request.runId,
|
|
203
|
+
[ENV_APP_BASE_URL]: appBaseUrl,
|
|
204
|
+
}, process.env),
|
|
205
|
+
// Cypress drives a browser process tree; the run is killed as a
|
|
206
|
+
// GROUP so no orphan browser survives a timeout.
|
|
207
|
+
detached: true,
|
|
208
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
209
|
+
});
|
|
210
|
+
const outcome = await new Promise((settle) => {
|
|
211
|
+
let timedOut = false;
|
|
212
|
+
const timer = setTimeout(() => {
|
|
213
|
+
timedOut = true;
|
|
214
|
+
killGroup(child);
|
|
215
|
+
}, request.timeoutMs);
|
|
216
|
+
child.stdout?.resume();
|
|
217
|
+
child.stderr?.resume();
|
|
218
|
+
child.once('error', (error) => {
|
|
219
|
+
clearTimeout(timer);
|
|
220
|
+
settle({ code: null, timedOut: false, error });
|
|
221
|
+
});
|
|
222
|
+
child.once('exit', (code) => {
|
|
223
|
+
clearTimeout(timer);
|
|
224
|
+
settle({ code, timedOut, error: null });
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
if (outcome.error !== null) {
|
|
228
|
+
return envelopeIncomplete(null, `cypress execution could not start (${cli}): ${outcome.error.message}`);
|
|
229
|
+
}
|
|
230
|
+
if (outcome.timedOut) {
|
|
231
|
+
return envelopeIncomplete(null, `cypress execution exceeded its ${String(request.timeoutMs)}ms bound and was killed — an incomplete run never grades complete`);
|
|
232
|
+
}
|
|
233
|
+
let report = '';
|
|
234
|
+
try {
|
|
235
|
+
report = readFileSync(join(runDir, REPORT_FILE), 'utf8');
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
report = '';
|
|
239
|
+
}
|
|
240
|
+
const envelope = this.parseResults({ processExit: outcome.code, report });
|
|
241
|
+
if (report === '') {
|
|
242
|
+
return {
|
|
243
|
+
...envelope,
|
|
244
|
+
incompleteDetail: `cypress produced no run report in ${runDir} (exit ${String(outcome.code)}) — fail closed`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return envelope;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Job 4: the sealed run report, strictly mapped.
|
|
251
|
+
*
|
|
252
|
+
* Args:
|
|
253
|
+
* raw: the report text plus the runner exit status.
|
|
254
|
+
*
|
|
255
|
+
* Returns:
|
|
256
|
+
* RunnerExecutionEnvelope: reporter INPUT, never a verdict. An
|
|
257
|
+
* unreadable report, a zero-test run, and a report whose rows carry
|
|
258
|
+
* no attributable identity are all `complete: false`.
|
|
259
|
+
*/
|
|
260
|
+
parseResults(raw) {
|
|
261
|
+
if (raw.report.trim() === '') {
|
|
262
|
+
return envelopeIncomplete(raw.processExit, 'no Cypress run report — a missing report never proves anything');
|
|
263
|
+
}
|
|
264
|
+
let report;
|
|
265
|
+
try {
|
|
266
|
+
const parsed = JSON.parse(raw.report);
|
|
267
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
268
|
+
throw new Error('the Cypress run report is not an object');
|
|
269
|
+
}
|
|
270
|
+
report = parsed;
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
return envelopeIncomplete(raw.processExit, `unparsable Cypress run report — fail closed: ${error instanceof Error ? error.message : String(error)}`);
|
|
274
|
+
}
|
|
275
|
+
const rows = [];
|
|
276
|
+
let rowCount = 0;
|
|
277
|
+
for (const spec of report.specs ?? []) {
|
|
278
|
+
const file = typeof spec.file === 'string' ? spec.file : '';
|
|
279
|
+
for (const test of spec.tests ?? []) {
|
|
280
|
+
rowCount += 1;
|
|
281
|
+
const titlePath = Array.isArray(test.titlePath) ? test.titlePath : [];
|
|
282
|
+
// A row with no spec file or no title cannot be joined to an
|
|
283
|
+
// enumerated identity: it is attributed to NOTHING.
|
|
284
|
+
if (file === '' || titlePath.length === 0)
|
|
285
|
+
continue;
|
|
286
|
+
rows.push({ identity: { file, titlePath }, row: test });
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (rowCount > 0 && rows.length === 0) {
|
|
290
|
+
return envelopeIncomplete(raw.processExit, `the Cypress report carries ${String(rowCount)} row(s) with no attributable spec/title identity — ` +
|
|
291
|
+
'an unidentified row is never attributed to a test');
|
|
292
|
+
}
|
|
293
|
+
if (rowCount === 0) {
|
|
294
|
+
return envelopeIncomplete(raw.processExit, 'the Cypress report covers zero tests — a zero-test run is incomplete');
|
|
295
|
+
}
|
|
296
|
+
const outcomes = rows.map((entry) => ({
|
|
297
|
+
logicalKey: `${entry.identity.file}#${entry.identity.titlePath.join('>')}`,
|
|
298
|
+
project: null,
|
|
299
|
+
frameworkId: `${entry.identity.file}::${entry.identity.titlePath.join('::')}`,
|
|
300
|
+
status: entry.row.state === 'passed' ? 'passed' : entry.row.state === 'pending' ? 'skipped' : 'failed',
|
|
301
|
+
attempt: entry.row.attempts >= 1 ? entry.row.attempts : 1,
|
|
302
|
+
}));
|
|
303
|
+
if (report.retriesDetected === true || outcomes.some((outcome) => outcome.attempt > 1)) {
|
|
304
|
+
return {
|
|
305
|
+
processExit: raw.processExit,
|
|
306
|
+
complete: false,
|
|
307
|
+
incompleteDetail: 'cypress runner-assisted retry detected (required retries are zero) — the run blocks',
|
|
308
|
+
outcomes,
|
|
309
|
+
fixtureOutcome: 'passed',
|
|
310
|
+
retriesDetected: true,
|
|
311
|
+
retriesDetail: 'mocha recorded more than one attempt for at least one Cypress test',
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
const exitDetail = cypressExitIncompleteDetail(raw.processExit);
|
|
315
|
+
if (exitDetail !== null)
|
|
316
|
+
return { ...envelopeIncomplete(raw.processExit, exitDetail), outcomes };
|
|
317
|
+
return { processExit: raw.processExit, complete: true, outcomes, fixtureOutcome: 'passed' };
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* The runner's native parsed report (diagnostics surfaces).
|
|
321
|
+
*
|
|
322
|
+
* Args:
|
|
323
|
+
* raw: the report text plus the runner exit status.
|
|
324
|
+
*
|
|
325
|
+
* Returns:
|
|
326
|
+
* CypressRunReport | null: the parsed document, or null when the
|
|
327
|
+
* report is absent or unparsable (never a guess).
|
|
328
|
+
*/
|
|
329
|
+
parseReport(raw) {
|
|
330
|
+
if (raw.report.trim() === '')
|
|
331
|
+
return null;
|
|
332
|
+
try {
|
|
333
|
+
const parsed = JSON.parse(raw.report);
|
|
334
|
+
return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
|
|
335
|
+
? parsed
|
|
336
|
+
: null;
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
return null;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/** The Cypress CLI for a project (local-first), or null. */
|
|
343
|
+
cypressCliOf(cwd) {
|
|
344
|
+
const local = join(cwd, 'node_modules', '.bin', 'cypress');
|
|
345
|
+
return existsSync(local) ? local : null;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Locates the project's Cypress config and its support file.
|
|
350
|
+
*
|
|
351
|
+
* @param cwd absolute project root.
|
|
352
|
+
* @returns the config path, the support file path (when the config
|
|
353
|
+
* declares one that exists), or the reason the config cannot be
|
|
354
|
+
* chained (ESM/TypeScript configs are refused rather than silently
|
|
355
|
+
* replaced by a config that would exercise something else).
|
|
356
|
+
*/
|
|
357
|
+
function projectConfigOf(cwd) {
|
|
358
|
+
for (const name of PROJECT_CONFIG_NAMES) {
|
|
359
|
+
const path = join(cwd, name);
|
|
360
|
+
if (!existsSync(path))
|
|
361
|
+
continue;
|
|
362
|
+
if (!name.endsWith('.cjs') && !name.endsWith('.js')) {
|
|
363
|
+
return { path: null, supportFile: null, unsupported: name };
|
|
364
|
+
}
|
|
365
|
+
return { path, supportFile: supportFileOf(cwd), unsupported: null };
|
|
366
|
+
}
|
|
367
|
+
return { path: null, supportFile: supportFileOf(cwd), unsupported: null };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* The project's own support file (the default locations Cypress itself
|
|
371
|
+
* probes), or null when the project declares/has none.
|
|
372
|
+
*
|
|
373
|
+
* @param cwd absolute project root.
|
|
374
|
+
* @returns the absolute support-file path, or null.
|
|
375
|
+
*/
|
|
376
|
+
function supportFileOf(cwd) {
|
|
377
|
+
const candidates = [
|
|
378
|
+
'cypress/support/e2e.js',
|
|
379
|
+
'cypress/support/e2e.cjs',
|
|
380
|
+
'cypress/support/e2e.ts',
|
|
381
|
+
'cypress/support/index.js',
|
|
382
|
+
'cypress/support/index.ts',
|
|
383
|
+
];
|
|
384
|
+
for (const candidate of candidates) {
|
|
385
|
+
const path = join(cwd, candidate);
|
|
386
|
+
if (existsSync(path))
|
|
387
|
+
return path;
|
|
388
|
+
}
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Writes the generated config and support file for one run.
|
|
393
|
+
*
|
|
394
|
+
* The generated config chains the project's own settings and pins the
|
|
395
|
+
* screenshot, video and download folders into `runDir`: Cypress writes
|
|
396
|
+
* them on any failing test, and inside the candidate they would enter
|
|
397
|
+
* the tree the evidence run is supposed to certify.
|
|
398
|
+
*
|
|
399
|
+
* @param runDir the run-scoped Cypress directory.
|
|
400
|
+
* @param projectConfigPath the project's chainable config, or null.
|
|
401
|
+
* @param projectSupportFile the project's own support file to chain first.
|
|
402
|
+
* @returns the generated file paths.
|
|
403
|
+
*/
|
|
404
|
+
function writeGeneratedConfig(runDir, projectConfigPath, projectSupportFile) {
|
|
405
|
+
const pluginModule = cypressPluginModulePath();
|
|
406
|
+
if (pluginModule === null) {
|
|
407
|
+
throw new Error('the gateforge Cypress plugin module is not built — a run without it could not tag or ' +
|
|
408
|
+
'report anything, so it fails closed');
|
|
409
|
+
}
|
|
410
|
+
const supportFile = join(runDir, 'support.cjs');
|
|
411
|
+
writeFileSync(supportFile, cypressSupportSource(projectSupportFile), 'utf8');
|
|
412
|
+
const configFile = join(runDir, 'gateforge.config.cjs');
|
|
413
|
+
const source = [
|
|
414
|
+
"// Generated by gateforge (plan 2026-09-25 phase 2). Do not edit.",
|
|
415
|
+
"'use strict';",
|
|
416
|
+
`const { registerGateforgeCypressPlugin } = require(${JSON.stringify(pluginModule)});`,
|
|
417
|
+
`const base = ${projectConfigPath === null ? '{}' : `require(${JSON.stringify(projectConfigPath)})`};`,
|
|
418
|
+
'const e2e = Object.assign({}, base.e2e || {});',
|
|
419
|
+
`e2e.supportFile = ${JSON.stringify(supportFile)};`,
|
|
420
|
+
"// A failing Cypress run writes screenshots, videos and downloads",
|
|
421
|
+
'// under the project by default. Those files would enter the',
|
|
422
|
+
"// candidate's own tree and the fail-closed drift gate would then",
|
|
423
|
+
'// report the run changing its own inputs instead of the test',
|
|
424
|
+
'// failure. The run state directory is outside the candidate, so',
|
|
425
|
+
'// the three artifact folders are pinned there for this run and',
|
|
426
|
+
'// the project\'s other settings are chained unchanged.',
|
|
427
|
+
`e2e.screenshotsFolder = ${JSON.stringify(join(runDir, 'screenshots'))};`,
|
|
428
|
+
`e2e.videosFolder = ${JSON.stringify(join(runDir, 'videos'))};`,
|
|
429
|
+
`e2e.downloadsFolder = ${JSON.stringify(join(runDir, 'downloads'))};`,
|
|
430
|
+
'const baseSetup = e2e.setupNodeEvents;',
|
|
431
|
+
'// setupNodeEvents lives under the testing type: that is where',
|
|
432
|
+
"// Cypress looks for it (config[testingType].setupNodeEvents).",
|
|
433
|
+
'e2e.setupNodeEvents = function (on, config) {',
|
|
434
|
+
' registerGateforgeCypressPlugin(on);',
|
|
435
|
+
' if (typeof baseSetup === "function") baseSetup.call(this, on, config);',
|
|
436
|
+
'};',
|
|
437
|
+
'module.exports = Object.assign({}, base, {',
|
|
438
|
+
' e2e,',
|
|
439
|
+
'});',
|
|
440
|
+
'',
|
|
441
|
+
].join('\n');
|
|
442
|
+
writeFileSync(configFile, source, 'utf8');
|
|
443
|
+
return { configFile, supportFile };
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* The built Cypress plugin module the generated config requires (the
|
|
447
|
+
* dist layout, or the monorepo's compiled dist when this module runs
|
|
448
|
+
* from source). Null when nothing is built.
|
|
449
|
+
*
|
|
450
|
+
* @returns the absolute module path, or null.
|
|
451
|
+
*/
|
|
452
|
+
function cypressPluginModulePath() {
|
|
453
|
+
const candidates = [
|
|
454
|
+
fileURLToPath(new URL('../cypress/plugin.js', import.meta.url)),
|
|
455
|
+
fileURLToPath(new URL('../../dist/cypress/plugin.js', import.meta.url)),
|
|
456
|
+
];
|
|
457
|
+
return candidates.find((candidate) => existsSync(candidate)) ?? null;
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Kills a Cypress process GROUP (the CLI plus its browser children), so
|
|
461
|
+
* a timed-out run leaves no orphan browser behind.
|
|
462
|
+
*
|
|
463
|
+
* @param child the spawned Cypress CLI process.
|
|
464
|
+
* @returns void
|
|
465
|
+
*/
|
|
466
|
+
function killGroup(child) {
|
|
467
|
+
if (child.pid === undefined) {
|
|
468
|
+
child.kill('SIGKILL');
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
try {
|
|
472
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
473
|
+
}
|
|
474
|
+
catch {
|
|
475
|
+
child.kill('SIGKILL');
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/** The file part of a logical key, or null (never a wildcard). */
|
|
479
|
+
function logicalKeyFileOf(logicalKey) {
|
|
480
|
+
const hash = logicalKey.indexOf('#');
|
|
481
|
+
if (hash <= 0)
|
|
482
|
+
return null;
|
|
483
|
+
const file = logicalKey.slice(0, hash);
|
|
484
|
+
if (file === '' || logicalKey.slice(hash + 1).includes('#'))
|
|
485
|
+
return null;
|
|
486
|
+
return file;
|
|
487
|
+
}
|
|
488
|
+
/** Cypress exit codes, fail closed (0 passed, 1 test failures). */
|
|
489
|
+
function cypressExitIncompleteDetail(exit) {
|
|
490
|
+
if (exit === null)
|
|
491
|
+
return 'cypress ended without an exit status — incomplete';
|
|
492
|
+
if (exit !== 0 && exit !== CYPRESS_EXIT_TESTS_FAILED) {
|
|
493
|
+
return `cypress ended with status ${String(exit)} (fatal runner error) — incomplete`;
|
|
494
|
+
}
|
|
495
|
+
return null;
|
|
496
|
+
}
|
|
497
|
+
/** Single-cause incomplete envelope (no outcomes are ever invented). */
|
|
498
|
+
function envelopeIncomplete(processExit, detail) {
|
|
499
|
+
return { processExit, complete: false, incompleteDetail: detail, outcomes: [], fixtureOutcome: 'unknown' };
|
|
500
|
+
}
|
|
501
|
+
//# sourceMappingURL=cypress-runner-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypress-runner-adapter.js","sourceRoot":"","sources":["../../src/discovery/cypress-runner-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,8BAA8B,GAE/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAEjE,uEAAuE;AACvE,uDAAuD;AACvD,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,CAAC;AAGhE,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,sBAAsB,CAAC;AAC7D,MAAM,CAAC,MAAM,yBAAyB,GAAG,yBAAyB,CAAC;AACnE,MAAM,CAAC,MAAM,6BAA6B,GAAG,6BAA6B,CAAC;AAE3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,sBAAsB;IACtB,yBAAyB;IACzB,6BAA6B;CAC9B,CAAC;AAEF,wDAAwD;AACxD,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,gEAAgE;AAChE,MAAM,oBAAoB,GAAsB;IAC9C,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;IACpB,mBAAmB;IACnB,oBAAoB;CACrB,CAAC;AAEF,kEAAkE;AAClE,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAcpC;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IASF;IARpB,MAAM,GAAG,SAAS,CAAC;IAEnB,YAAY,GAAG;QACtB,SAAS,EAAE,WAAW;QACtB,gBAAgB,EAAE,WAAW;QAC7B,OAAO,EAAE,WAAW;KACZ,CAAC;IAEX,YAA6B,UAAuC,EAAE;QAAzC,YAAO,GAAP,OAAO,CAAkC;IAAG,CAAC;IAE1E;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YACrC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACtE,CAAC;QACD,MAAM,KAAK,GAAyB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC/D,UAAU,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACtD,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;YAC9B,mBAAmB,EAAE,EAAE;YACvB,4DAA4D;YAC5D,sCAAsC;YACtC,WAAW,EAAE,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;SACxD,CAAC,CAAC,CAAC;QACJ,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,cAAc,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,gDAAgD,GAAG,EAAE;YAC/F,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACtG,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,QAA0B,EAAE,OAA8B;QACjE,OAAO;YACL,IAAI,EAAE;gBACJ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,UAAU;gBACrC,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ;gBACjC,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,UAAU;gBACtC,CAAC,aAAa,CAAC,EAAE,iBAAiB;gBAClC,CAAC,UAAU,CAAC,EAAE,UAAU;gBACxB,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC,SAAS;gBAC3C,CAAC,yBAAyB,CAAC,EAAE,OAAO,CAAC,YAAY;gBACjD,CAAC,6BAA6B,CAAC,EAAE,OAAO,CAAC,eAAe;aACzD;YACD,UAAU,EAAE,eAAe;YAC3B,YAAY,EAAE,oBAAoB;YAClC,SAAS,EACP,wFAAwF;gBACxF,gGAAgG;SACnG,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,OAAO,CAAC,OAA6B;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,kBAAkB,CACvB,IAAI,EACJ,gDAAgD,OAAO,CAAC,GAAG,mCAAmC,CAC/F,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,aAAa,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YACvC,OAAO,kBAAkB,CACvB,IAAI,EACJ,qDAAqD,aAAa,CAAC,WAAW,cAAc;gBAC1F,wFAAwF,CAC3F,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,OAAO,kBAAkB,CACvB,IAAI,EACJ,iCAAiC,UAAU,oEAAoE,CAChH,CAAC;YACJ,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC3F,IAAI,SAAsD,CAAC;QAC3D,IAAI,CAAC;YACH,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,SAAS,GAAG,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;QAC1F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,kBAAkB,CAAC,IAAI,EAAE,wDAAyD,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACtH,CAAC;QACD,MAAM,IAAI,GAAG;YACX,KAAK;YACL,WAAW;YACX,OAAO,CAAC,GAAG;YACX,eAAe;YACf,SAAS,CAAC,UAAU;YACpB,WAAW;YACX,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,UAAU;YAClC,SAAS;YACT,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACnE,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,8BAA8B,CACjC;gBACE,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE;gBAClF,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE;gBAChF,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ;gBACjC,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,KAAK;gBAC3B,CAAC,gBAAgB,CAAC,EAAE,UAAU;aAC/B,EACD,OAAO,CAAC,GAAG,CACZ;YACD,gEAAgE;YAChE,iDAAiD;YACjD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAkE,CAAC,MAAM,EAAE,EAAE;YAC5G,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC1B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,kBAAkB,CAAC,IAAI,EAAE,sCAAsC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1G,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,kBAAkB,CACvB,IAAI,EACJ,kCAAkC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,mEAAmE,CAC/H,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1E,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAClB,OAAO;gBACL,GAAG,QAAQ;gBACX,gBAAgB,EAAE,qCAAqC,MAAM,UAAU,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB;aAC7G,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;;;OAUG;IACH,YAAY,CAAC,GAAqB;QAChC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7B,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,gEAAgE,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,MAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3E,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,GAAG,MAA0B,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,kBAAkB,CACvB,GAAG,CAAC,WAAW,EACf,gDAAgD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzG,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAwH,EAAE,CAAC;QACrI,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;gBACpC,QAAQ,IAAI,CAAC,CAAC;gBACd,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,6DAA6D;gBAC7D,oDAAoD;gBACpD,IAAI,IAAI,KAAK,EAAE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACpD,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,kBAAkB,CACvB,GAAG,CAAC,WAAW,EACf,8BAA8B,MAAM,CAAC,QAAQ,CAAC,qDAAqD;gBACjG,mDAAmD,CACtD,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,sEAAsE,CAAC,CAAC;QACrH,CAAC;QACD,MAAM,QAAQ,GAA4B,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7D,UAAU,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC1E,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7E,MAAM,EACJ,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;YAChG,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAC1D,CAAC,CAAC,CAAC;QACJ,IAAI,MAAM,CAAC,eAAe,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC;YACvF,OAAO;gBACL,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,QAAQ,EAAE,KAAK;gBACf,gBAAgB,EACd,qFAAqF;gBACvF,QAAQ;gBACR,cAAc,EAAE,QAAiB;gBACjC,eAAe,EAAE,IAAI;gBACrB,aAAa,EAAE,oEAAoE;aACpF,CAAC;QACJ,CAAC;QACD,MAAM,UAAU,GAAG,2BAA2B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAChE,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;QACjG,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAiB,EAAE,CAAC;IACvG,CAAC;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,GAAqB;QAC/B,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC5E,CAAC,CAAE,MAA2B;gBAC9B,CAAC,CAAC,IAAI,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,4DAA4D;IACpD,YAAY,CAAC,GAAW;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;CACF;AASD;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC9D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,UAAU,GAAG;QACjB,wBAAwB;QACxB,yBAAyB;QACzB,wBAAwB;QACxB,0BAA0B;QAC1B,0BAA0B;KAC3B,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAClC,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,SAAS,oBAAoB,CAC3B,MAAc,EACd,iBAAgC,EAChC,kBAAiC;IAEjC,MAAM,YAAY,GAAG,uBAAuB,EAAE,CAAC;IAC/C,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,uFAAuF;YACrF,qCAAqC,CACxC,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAChD,aAAa,CAAC,WAAW,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG;QACb,mEAAmE;QACnE,eAAe;QACf,sDAAsD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI;QACtF,gBAAgB,iBAAiB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,GAAG,GAAG;QACtG,gDAAgD;QAChD,qBAAqB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG;QACnD,mEAAmE;QACnE,8DAA8D;QAC9D,mEAAmE;QACnE,+DAA+D;QAC/D,kEAAkE;QAClE,iEAAiE;QACjE,yDAAyD;QACzD,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,GAAG;QACzE,sBAAsB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG;QAC/D,yBAAyB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG;QACrE,wCAAwC;QACxC,gEAAgE;QAChE,gEAAgE;QAChE,+CAA+C;QAC/C,uCAAuC;QACvC,0EAA0E;QAC1E,IAAI;QACJ,4CAA4C;QAC5C,QAAQ;QACR,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;GAMG;AACH,SAAS,uBAAuB;IAC9B,MAAM,UAAU,GAAG;QACjB,aAAa,CAAC,IAAI,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,aAAa,CAAC,IAAI,GAAG,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACxE,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC;AACvE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,KAAmB;IACpC,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,SAAS,2BAA2B,CAAC,IAAmB;IACtD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,mDAAmD,CAAC;IAC9E,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;QACrD,OAAO,6BAA6B,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC;IACvF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,wEAAwE;AACxE,SAAS,kBAAkB,CAAC,WAA0B,EAAE,MAAc;IACpE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,SAAkB,EAAE,CAAC;AACtH,CAAC"}
|