@futdevpro/dynamo-e2e 1.18.25 → 1.18.26
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/CHANGELOG.md +8 -0
- package/README.md +139 -139
- package/build/_modules/runtime/_collections/notification-detector-page-script.const.js +136 -136
- package/build/_modules/vqa/generators/review-bundle.generator.d.ts +16 -0
- package/build/_modules/vqa/generators/review-bundle.generator.d.ts.map +1 -1
- package/build/_modules/vqa/generators/review-bundle.generator.js +11 -0
- package/build/_modules/vqa/generators/review-bundle.generator.js.map +1 -1
- package/build/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
Minden release a `dynamo-e2e-foundation` HYPERPLAN MP-N ütemezést követi.
|
|
4
4
|
Verzióformátum: `MM.mm.p` (két-számjegyes major-minor, Dynamo-konvenció).
|
|
5
5
|
|
|
6
|
+
## [01.18.26] — 2026-10-05 — VQA: `captureRun()` — the capture run as `{ command, args, env }` (BFR-MASTERPROMPTER-093)
|
|
7
|
+
|
|
8
|
+
- Added `captureRun(bundlePath)` next to `captureCommand`: `{ command: 'npx', args: [ 'playwright', 'test', '--config',
|
|
9
|
+
<path> ], env: { VQA_OUT_DIR } }`. The POSIX `captureCommand` line (`VQA_OUT_DIR=… npx …`) fails under `cmd.exe`; the
|
|
10
|
+
structured form runs through `spawn` on every shell. `captureCommand` is unchanged.
|
|
11
|
+
- The package-version constant `DYE2E_PACKAGE_VERSION` follows the release (the guard spec checks it against
|
|
12
|
+
`package.json`).
|
|
13
|
+
|
|
6
14
|
## [01.18.25] — 2026-09-29 — Form suite: a failed setup names the status + URL; configurable `test` import (BFR-ADVENTOR-038)
|
|
7
15
|
|
|
8
16
|
- Every generated setup hook's load check now carries the route, the HTTP status and the final URL in its failure
|
package/README.md
CHANGED
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
# @futdevpro/dynamo-e2e
|
|
2
|
-
|
|
3
|
-
[](https://www.npmjs.com/package/@futdevpro/dynamo-e2e)
|
|
4
|
-
[](./coverage/)
|
|
5
|
-
[](./src/)
|
|
6
|
-
[](./__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md)
|
|
7
|
-
|
|
8
|
-
End-to-end testing engine for the Dynamo + FDP ecosystem.
|
|
9
|
-
|
|
10
|
-
## What
|
|
11
|
-
|
|
12
|
-
A Dynamo bedrock-package that turns Forms v2 Settings POJOs into Playwright
|
|
13
|
-
test suites — **auto-generated**, **typed**, **overridable**, **diffable**.
|
|
14
|
-
|
|
15
|
-
Three layers in one package:
|
|
16
|
-
|
|
17
|
-
1. **Form-coverage** — every field-type has a pre-curated positive + negative
|
|
18
|
-
input matrix; the generator emits ~20-50 tests per form from a single
|
|
19
|
-
Settings POJO.
|
|
20
|
-
2. **Viewport matrix** *(Wave-2)* — auto-fan-out tests over 7 standard
|
|
21
|
-
viewports + overflow/touch-target a11y detection.
|
|
22
|
-
3. **Core Web Vitals diagnostics** *(Wave-3)* — synthetic LCP / CLS / INP /
|
|
23
|
-
TTFB measurement + percentile aggregation + attribution.
|
|
24
|
-
|
|
25
|
-
## Status
|
|
26
|
-
|
|
27
|
-
**Wave-1..4 + MP-10/MP-11** (2026-06-10) — Layer A contracts, Layer B
|
|
28
|
-
generators (form-suite + viewport-suite + CWV-suite), Layer C runtime
|
|
29
|
-
fixtures + page-objects, Overseer CICD pipeline registered, **75%+ test
|
|
30
|
-
coverage gate** active (statements **97.84%**, branches **87.13%**,
|
|
31
|
-
functions **98.55%**, lines **97.84%**). 104 specs, 0 failures.
|
|
32
|
-
|
|
33
|
-
Plan-net: `__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md`
|
|
34
|
-
(11 MPs, 4900+ LOC planning).
|
|
35
|
-
|
|
36
|
-
## Install
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
pnpm add -D @futdevpro/dynamo-e2e @playwright/test
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
`@futdevpro/fsm-dynamo` is a peer-dep — bring your own (or no Settings
|
|
43
|
-
POJO source if you only use the runtime presets).
|
|
44
|
-
|
|
45
|
-
## Quick start
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
import { DyFM_TextFieldNew_Settings } from '@futdevpro/fsm-dynamo/ngx-models';
|
|
49
|
-
import { DyE2E_FormSuite_Generator } from '@futdevpro/dynamo-e2e/generators';
|
|
50
|
-
|
|
51
|
-
const settings = new DyFM_FormNew_Settings({
|
|
52
|
-
key: 'login',
|
|
53
|
-
fields: [
|
|
54
|
-
new DyFM_TextFieldNew_Settings({ key: 'email', /* ... */ }),
|
|
55
|
-
],
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
const specSource = DyE2E_FormSuite_Generator.emit({
|
|
59
|
-
formSettings: settings,
|
|
60
|
-
formRoute: '/login',
|
|
61
|
-
formSelector: 'dynamo-form-new',
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
// → write specSource to `e2e/tests/generated/login-form.spec.ts`
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Sub-exports
|
|
68
|
-
|
|
69
|
-
- `@futdevpro/dynamo-e2e/contracts` — POJO types
|
|
70
|
-
- `@futdevpro/dynamo-e2e/generators` — Node-only emission engine
|
|
71
|
-
- `@futdevpro/dynamo-e2e/runtime` — Playwright fixtures + page-objects (Wave-4) + the live notification detector
|
|
72
|
-
(`DyE2E_NotificationDetector_Util`, see below)
|
|
73
|
-
- `@futdevpro/dynamo-e2e/presets` — pre-built suites + `DyE2E_getPlaywrightConfig` / `DyE2E_getGlobalSetup` playwright-config factory (fleet e2e-config SSOT)
|
|
74
|
-
- `@futdevpro/dynamo-e2e/game` — capability-gated deterministic game seam, failure artifacts and bidirectional journey-catalog validation
|
|
75
|
-
- `@futdevpro/dynamo-e2e/cwv` — Core Web Vitals (Wave-3)
|
|
76
|
-
|
|
77
|
-
## Playwright preset — CI timeouts and the failure budget
|
|
78
|
-
|
|
79
|
-
```ts
|
|
80
|
-
import { DyE2E_getPlaywrightConfig, DyE2E_ciTimeout } from '@futdevpro/dynamo-e2e/presets';
|
|
81
|
-
|
|
82
|
-
export default DyE2E_getPlaywrightConfig({
|
|
83
|
-
defaultBaseUrl: 'https://test.example.hu',
|
|
84
|
-
ciTimeoutFactor: 3, // CI only: timeout / expectTimeout / actionTimeout / navigationTimeout × 3 (default 1)
|
|
85
|
-
maxFailuresInCi: 1, // CI only: stop after the first failure (default: unset = unchanged)
|
|
86
|
-
});
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
> ⚠️ **A call-site `{ timeout }` overrides the config.** `expect(x).toBeVisible({ timeout: 15_000 })` ignores the preset's
|
|
90
|
-
> `expect.timeout` (and its `ciTimeoutFactor`). Scale those values with `DyE2E_ciTimeout(15_000)` — unchanged locally,
|
|
91
|
-
> × `E2E_CI_TIMEOUT_FACTOR` (or 3) under `CI`. Measured: a shared CI runner was 2.3–4.7× slower than a local machine,
|
|
92
|
-
> and a smoke suite with hard-coded call-site timeouts stayed red for months while its config "looked right".
|
|
93
|
-
|
|
94
|
-
## Live notification detector (`/runtime`)
|
|
95
|
-
|
|
96
|
-
Records every user-visible notification — DyNX `dynamo-notification-card` / `dynamo-notifications-area`, mat-snackbar
|
|
97
|
-
(`red-` / `yellow-` / `blue-` / `green-snackbar`), `[role=alert]` — at the moment it APPEARS, so a toast that
|
|
98
|
-
auto-dismissed before the end of the test is still in the report. It also snapshots the visible error banners (with a
|
|
99
|
-
`rawTechnicalLeak` flag for texts like `Http failure response`, `/api/`, `[object Object]`) and collects the page's
|
|
100
|
-
`console` errors/warnings and uncaught `pageerror`s.
|
|
101
|
-
|
|
102
|
-
```ts
|
|
103
|
-
import { DyE2E_NotificationDetector_Util } from '@futdevpro/dynamo-e2e/runtime';
|
|
104
|
-
|
|
105
|
-
await DyE2E_NotificationDetector_Util.attach(context); // before the first navigation
|
|
106
|
-
// ... the flow ...
|
|
107
|
-
const report = await DyE2E_NotificationDetector_Util.collect(page);
|
|
108
|
-
expect(report.notifications.filter((n) => n.type === 'error')).toEqual([]);
|
|
109
|
-
console.log(DyE2E_NotificationDetector_Util.summarize(report, 'login'));
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Captures survive a full-page navigation (they are reported to Node through a Playwright binding). The page-side code
|
|
113
|
-
is plain JavaScript, so no `__name` shim is needed under `tsx` / esbuild. `collect()` throws on a context without
|
|
114
|
-
`attach()` — an empty report would otherwise read as "no notifications".
|
|
115
|
-
|
|
116
|
-
## Login-flow notification sweep (`/runtime` + CLI)
|
|
117
|
-
|
|
118
|
-
Built on the detector: opens the login page of many projects, submits it with a WRONG password (so the ERROR branch
|
|
119
|
-
is measured without a test account) and prints one matrix row per project — notifications · error/warning · banners ·
|
|
120
|
-
modal dialogs · raw-technical leaks · console errors. Framework-level defects show up only when many projects are
|
|
121
|
-
measured the same way.
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
dye2e notification-sweep --targets TEST-TARGETS.md --json sweep.json # or a JSON [{ key, loginUrl | baseUrl }]
|
|
125
|
-
dye2e notification-sweep --targets targets.json --only a,b --fail-on-leak # exit 1 on a raw technical leak
|
|
126
|
-
```
|
|
127
|
-
```ts
|
|
128
|
-
const outcomes = await DyE2E_NotificationSweep_Util.sweep(browser, targets, { settleMs: 5000 });
|
|
129
|
-
console.log(DyE2E_NotificationSweep_Util.matrix(outcomes.map((o) => o.row)));
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
Guards in code, not in docs: the probe address must be on a reserved domain (`example.com`, `*.test`, `*.invalid` …)
|
|
133
|
-
or on one you declare with `ownDomains` — anything else throws before a page is opened; the form is submitted only on
|
|
134
|
-
a test host (`test.*`, `*.test`, `localhost` …, or `allowSubmitHosts`) — anything else is loaded but NOT submitted,
|
|
135
|
-
and the row says so. `real: true` / `--real` uses `E2E_PERSISTENT_USER_EMAIL` / `_PASSWORD`; without them the row says
|
|
136
|
-
it fell back to the probe. Modal dialogs (a "not the production system" notice, an error dialog) are RECORDED —
|
|
137
|
-
text + leak flag — before they are closed; a non-modal cookie bar is left alone.
|
|
138
|
-
|
|
139
|
-
Detailed game-preset contract: [`__documentations/game-preset.md`](__documentations/game-preset.md).
|
|
1
|
+
# @futdevpro/dynamo-e2e
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@futdevpro/dynamo-e2e)
|
|
4
|
+
[](./coverage/)
|
|
5
|
+
[](./src/)
|
|
6
|
+
[](./__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md)
|
|
7
|
+
|
|
8
|
+
End-to-end testing engine for the Dynamo + FDP ecosystem.
|
|
9
|
+
|
|
10
|
+
## What
|
|
11
|
+
|
|
12
|
+
A Dynamo bedrock-package that turns Forms v2 Settings POJOs into Playwright
|
|
13
|
+
test suites — **auto-generated**, **typed**, **overridable**, **diffable**.
|
|
14
|
+
|
|
15
|
+
Three layers in one package:
|
|
16
|
+
|
|
17
|
+
1. **Form-coverage** — every field-type has a pre-curated positive + negative
|
|
18
|
+
input matrix; the generator emits ~20-50 tests per form from a single
|
|
19
|
+
Settings POJO.
|
|
20
|
+
2. **Viewport matrix** *(Wave-2)* — auto-fan-out tests over 7 standard
|
|
21
|
+
viewports + overflow/touch-target a11y detection.
|
|
22
|
+
3. **Core Web Vitals diagnostics** *(Wave-3)* — synthetic LCP / CLS / INP /
|
|
23
|
+
TTFB measurement + percentile aggregation + attribution.
|
|
24
|
+
|
|
25
|
+
## Status
|
|
26
|
+
|
|
27
|
+
**Wave-1..4 + MP-10/MP-11** (2026-06-10) — Layer A contracts, Layer B
|
|
28
|
+
generators (form-suite + viewport-suite + CWV-suite), Layer C runtime
|
|
29
|
+
fixtures + page-objects, Overseer CICD pipeline registered, **75%+ test
|
|
30
|
+
coverage gate** active (statements **97.84%**, branches **87.13%**,
|
|
31
|
+
functions **98.55%**, lines **97.84%**). 104 specs, 0 failures.
|
|
32
|
+
|
|
33
|
+
Plan-net: `__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md`
|
|
34
|
+
(11 MPs, 4900+ LOC planning).
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
pnpm add -D @futdevpro/dynamo-e2e @playwright/test
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`@futdevpro/fsm-dynamo` is a peer-dep — bring your own (or no Settings
|
|
43
|
+
POJO source if you only use the runtime presets).
|
|
44
|
+
|
|
45
|
+
## Quick start
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { DyFM_TextFieldNew_Settings } from '@futdevpro/fsm-dynamo/ngx-models';
|
|
49
|
+
import { DyE2E_FormSuite_Generator } from '@futdevpro/dynamo-e2e/generators';
|
|
50
|
+
|
|
51
|
+
const settings = new DyFM_FormNew_Settings({
|
|
52
|
+
key: 'login',
|
|
53
|
+
fields: [
|
|
54
|
+
new DyFM_TextFieldNew_Settings({ key: 'email', /* ... */ }),
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const specSource = DyE2E_FormSuite_Generator.emit({
|
|
59
|
+
formSettings: settings,
|
|
60
|
+
formRoute: '/login',
|
|
61
|
+
formSelector: 'dynamo-form-new',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// → write specSource to `e2e/tests/generated/login-form.spec.ts`
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Sub-exports
|
|
68
|
+
|
|
69
|
+
- `@futdevpro/dynamo-e2e/contracts` — POJO types
|
|
70
|
+
- `@futdevpro/dynamo-e2e/generators` — Node-only emission engine
|
|
71
|
+
- `@futdevpro/dynamo-e2e/runtime` — Playwright fixtures + page-objects (Wave-4) + the live notification detector
|
|
72
|
+
(`DyE2E_NotificationDetector_Util`, see below)
|
|
73
|
+
- `@futdevpro/dynamo-e2e/presets` — pre-built suites + `DyE2E_getPlaywrightConfig` / `DyE2E_getGlobalSetup` playwright-config factory (fleet e2e-config SSOT)
|
|
74
|
+
- `@futdevpro/dynamo-e2e/game` — capability-gated deterministic game seam, failure artifacts and bidirectional journey-catalog validation
|
|
75
|
+
- `@futdevpro/dynamo-e2e/cwv` — Core Web Vitals (Wave-3)
|
|
76
|
+
|
|
77
|
+
## Playwright preset — CI timeouts and the failure budget
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { DyE2E_getPlaywrightConfig, DyE2E_ciTimeout } from '@futdevpro/dynamo-e2e/presets';
|
|
81
|
+
|
|
82
|
+
export default DyE2E_getPlaywrightConfig({
|
|
83
|
+
defaultBaseUrl: 'https://test.example.hu',
|
|
84
|
+
ciTimeoutFactor: 3, // CI only: timeout / expectTimeout / actionTimeout / navigationTimeout × 3 (default 1)
|
|
85
|
+
maxFailuresInCi: 1, // CI only: stop after the first failure (default: unset = unchanged)
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
> ⚠️ **A call-site `{ timeout }` overrides the config.** `expect(x).toBeVisible({ timeout: 15_000 })` ignores the preset's
|
|
90
|
+
> `expect.timeout` (and its `ciTimeoutFactor`). Scale those values with `DyE2E_ciTimeout(15_000)` — unchanged locally,
|
|
91
|
+
> × `E2E_CI_TIMEOUT_FACTOR` (or 3) under `CI`. Measured: a shared CI runner was 2.3–4.7× slower than a local machine,
|
|
92
|
+
> and a smoke suite with hard-coded call-site timeouts stayed red for months while its config "looked right".
|
|
93
|
+
|
|
94
|
+
## Live notification detector (`/runtime`)
|
|
95
|
+
|
|
96
|
+
Records every user-visible notification — DyNX `dynamo-notification-card` / `dynamo-notifications-area`, mat-snackbar
|
|
97
|
+
(`red-` / `yellow-` / `blue-` / `green-snackbar`), `[role=alert]` — at the moment it APPEARS, so a toast that
|
|
98
|
+
auto-dismissed before the end of the test is still in the report. It also snapshots the visible error banners (with a
|
|
99
|
+
`rawTechnicalLeak` flag for texts like `Http failure response`, `/api/`, `[object Object]`) and collects the page's
|
|
100
|
+
`console` errors/warnings and uncaught `pageerror`s.
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { DyE2E_NotificationDetector_Util } from '@futdevpro/dynamo-e2e/runtime';
|
|
104
|
+
|
|
105
|
+
await DyE2E_NotificationDetector_Util.attach(context); // before the first navigation
|
|
106
|
+
// ... the flow ...
|
|
107
|
+
const report = await DyE2E_NotificationDetector_Util.collect(page);
|
|
108
|
+
expect(report.notifications.filter((n) => n.type === 'error')).toEqual([]);
|
|
109
|
+
console.log(DyE2E_NotificationDetector_Util.summarize(report, 'login'));
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Captures survive a full-page navigation (they are reported to Node through a Playwright binding). The page-side code
|
|
113
|
+
is plain JavaScript, so no `__name` shim is needed under `tsx` / esbuild. `collect()` throws on a context without
|
|
114
|
+
`attach()` — an empty report would otherwise read as "no notifications".
|
|
115
|
+
|
|
116
|
+
## Login-flow notification sweep (`/runtime` + CLI)
|
|
117
|
+
|
|
118
|
+
Built on the detector: opens the login page of many projects, submits it with a WRONG password (so the ERROR branch
|
|
119
|
+
is measured without a test account) and prints one matrix row per project — notifications · error/warning · banners ·
|
|
120
|
+
modal dialogs · raw-technical leaks · console errors. Framework-level defects show up only when many projects are
|
|
121
|
+
measured the same way.
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
dye2e notification-sweep --targets TEST-TARGETS.md --json sweep.json # or a JSON [{ key, loginUrl | baseUrl }]
|
|
125
|
+
dye2e notification-sweep --targets targets.json --only a,b --fail-on-leak # exit 1 on a raw technical leak
|
|
126
|
+
```
|
|
127
|
+
```ts
|
|
128
|
+
const outcomes = await DyE2E_NotificationSweep_Util.sweep(browser, targets, { settleMs: 5000 });
|
|
129
|
+
console.log(DyE2E_NotificationSweep_Util.matrix(outcomes.map((o) => o.row)));
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Guards in code, not in docs: the probe address must be on a reserved domain (`example.com`, `*.test`, `*.invalid` …)
|
|
133
|
+
or on one you declare with `ownDomains` — anything else throws before a page is opened; the form is submitted only on
|
|
134
|
+
a test host (`test.*`, `*.test`, `localhost` …, or `allowSubmitHosts`) — anything else is loaded but NOT submitted,
|
|
135
|
+
and the row says so. `real: true` / `--real` uses `E2E_PERSISTENT_USER_EMAIL` / `_PASSWORD`; without them the row says
|
|
136
|
+
it fell back to the probe. Modal dialogs (a "not the production system" notice, an error dialog) are RECORDED —
|
|
137
|
+
text + leak flag — before they are closed; a non-modal cookie bar is left alone.
|
|
138
|
+
|
|
139
|
+
Detailed game-preset contract: [`__documentations/game-preset.md`](__documentations/game-preset.md).
|
|
@@ -22,115 +22,115 @@ exports.DYE2E_NOTIFICATION_BINDING_NAME = '__dye2e_notification_binding__';
|
|
|
22
22
|
* → error · `bg-orange-50` / `yellow-snackbar` / `warning` → warning · `bg-green-50` / `green-snackbar` /
|
|
23
23
|
* `check_circle` → success · `bg-blue-50` / `blue-snackbar` → info.
|
|
24
24
|
*/
|
|
25
|
-
exports.DYE2E_NOTIFICATION_DETECTOR_PAGE_SCRIPT = `
|
|
26
|
-
(function () {
|
|
27
|
-
var w = window;
|
|
28
|
-
if (w.__dye2e_notifications__) { return; }
|
|
29
|
-
var list = [];
|
|
30
|
-
w.__dye2e_notifications__ = list;
|
|
31
|
-
var bindingName = '${exports.DYE2E_NOTIFICATION_BINDING_NAME}';
|
|
32
|
-
var perf = w.performance;
|
|
33
|
-
var origin = String(Math.round(perf && perf.timeOrigin ? perf.timeOrigin : Date.now()));
|
|
34
|
-
var counter = 0;
|
|
35
|
-
var recentKeys = {};
|
|
36
|
-
var recorded = {};
|
|
37
|
-
var checks = [
|
|
38
|
-
['dynx-card', 'dynamo-notification-card'],
|
|
39
|
-
['notif-area', 'dynamo-notifications-area'],
|
|
40
|
-
['snackbar', 'mat-snack-bar-container, .mat-mdc-snack-bar-container, simple-snack-bar, ' +
|
|
41
|
-
'.red-snackbar, .yellow-snackbar, .green-snackbar, .blue-snackbar'],
|
|
42
|
-
['role-alert', '[role="alert"], [role="alertdialog"]']
|
|
43
|
-
];
|
|
44
|
-
|
|
45
|
-
function nowMs() { return perf ? perf.now() : 0; }
|
|
46
|
-
function squash(text) { return (text || '').replace(/\\s+/g, ' ').trim(); }
|
|
47
|
-
function textOf(el, selector) {
|
|
48
|
-
try {
|
|
49
|
-
var node = el.querySelector(selector);
|
|
50
|
-
return node ? squash(node.textContent) : '';
|
|
51
|
-
} catch (e) { return ''; }
|
|
52
|
-
}
|
|
53
|
-
function classify(el) {
|
|
54
|
-
var html = el.outerHTML || '';
|
|
55
|
-
if (/bg-red-50|red-snackbar|>\\s*error\\s*</.test(html)) { return 'error'; }
|
|
56
|
-
if (/bg-orange-50|yellow-snackbar|>\\s*warning\\s*</.test(html)) { return 'warning'; }
|
|
57
|
-
if (/bg-green-50|green-snackbar|>\\s*check_circle\\s*</.test(html)) { return 'success'; }
|
|
58
|
-
if (/bg-blue-50|blue-snackbar/.test(html)) { return 'info'; }
|
|
59
|
-
return 'unknown';
|
|
60
|
-
}
|
|
61
|
-
function read(el) {
|
|
62
|
-
var structured = textOf(el, '.text-slate-700') || textOf(el, '.mat-mdc-snack-bar-label') ||
|
|
63
|
-
textOf(el, '[matsnackbarlabel]');
|
|
64
|
-
return {
|
|
65
|
-
type: classify(el),
|
|
66
|
-
structured: !!structured,
|
|
67
|
-
title: (structured || squash(el.textContent)).slice(0, 400),
|
|
68
|
-
message: textOf(el, '.text-slate-500').slice(0, 400),
|
|
69
|
-
html: squash(el.outerHTML).slice(0, 500)
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function emit(entry) {
|
|
73
|
-
try {
|
|
74
|
-
if (typeof w[bindingName] === 'function') { w[bindingName](entry); }
|
|
75
|
-
} catch (e) { /* the page must never break because of the detector */ }
|
|
76
|
-
}
|
|
77
|
-
function enrich(entry, state, el) {
|
|
78
|
-
if (!el.isConnected) { return; }
|
|
79
|
-
var fresh = read(el);
|
|
80
|
-
var changed = false;
|
|
81
|
-
if (entry.type === 'unknown' && fresh.type !== 'unknown') { entry.type = fresh.type; changed = true; }
|
|
82
|
-
if (fresh.title && fresh.title !== entry.title && (!entry.title || !state.structured)) {
|
|
83
|
-
entry.title = fresh.title; state.structured = fresh.structured; changed = true;
|
|
84
|
-
}
|
|
85
|
-
if (!entry.message && fresh.message) { entry.message = fresh.message; changed = true; }
|
|
86
|
-
if (changed) { entry.html = fresh.html; emit(entry); }
|
|
87
|
-
}
|
|
88
|
-
function record(kind, el) {
|
|
89
|
-
var seen = recorded[kind] || (recorded[kind] = new WeakSet());
|
|
90
|
-
if (seen.has(el)) { return; }
|
|
91
|
-
seen.add(el);
|
|
92
|
-
var data = read(el);
|
|
93
|
-
var t = nowMs();
|
|
94
|
-
var key = kind + '|' + data.type + '|' + data.title;
|
|
95
|
-
if (data.title && recentKeys[key] !== undefined && t - recentKeys[key] < 1500) { return; }
|
|
96
|
-
recentKeys[key] = t;
|
|
97
|
-
counter += 1;
|
|
98
|
-
var entry = {
|
|
99
|
-
id: origin + '-' + counter,
|
|
100
|
-
kind: kind,
|
|
101
|
-
type: data.type,
|
|
102
|
-
title: data.title,
|
|
103
|
-
message: data.message,
|
|
104
|
-
url: location.href,
|
|
105
|
-
at: Date.now(),
|
|
106
|
-
sinceDocumentStartMs: Math.round(t),
|
|
107
|
-
html: data.html
|
|
108
|
-
};
|
|
109
|
-
var state = { structured: data.structured };
|
|
110
|
-
list.push(entry);
|
|
111
|
-
emit(entry);
|
|
112
|
-
setTimeout(function () { enrich(entry, state, el); }, 50);
|
|
113
|
-
setTimeout(function () { enrich(entry, state, el); }, 300);
|
|
114
|
-
}
|
|
115
|
-
function scan(node) {
|
|
116
|
-
if (!node || node.nodeType !== 1) { return; }
|
|
117
|
-
for (var i = 0; i < checks.length; i++) {
|
|
118
|
-
try {
|
|
119
|
-
if (node.matches(checks[i][1])) { record(checks[i][0], node); }
|
|
120
|
-
var found = node.querySelectorAll(checks[i][1]);
|
|
121
|
-
for (var j = 0; j < found.length; j++) { record(checks[i][0], found[j]); }
|
|
122
|
-
} catch (e) { /* one bad selector must not stop the other checks */ }
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
new MutationObserver(function (mutations) {
|
|
127
|
-
for (var i = 0; i < mutations.length; i++) {
|
|
128
|
-
var added = mutations[i].addedNodes;
|
|
129
|
-
for (var j = 0; j < added.length; j++) { scan(added[j]); }
|
|
130
|
-
}
|
|
131
|
-
}).observe(document, { childList: true, subtree: true });
|
|
132
|
-
scan(document.documentElement);
|
|
133
|
-
})();
|
|
25
|
+
exports.DYE2E_NOTIFICATION_DETECTOR_PAGE_SCRIPT = `
|
|
26
|
+
(function () {
|
|
27
|
+
var w = window;
|
|
28
|
+
if (w.__dye2e_notifications__) { return; }
|
|
29
|
+
var list = [];
|
|
30
|
+
w.__dye2e_notifications__ = list;
|
|
31
|
+
var bindingName = '${exports.DYE2E_NOTIFICATION_BINDING_NAME}';
|
|
32
|
+
var perf = w.performance;
|
|
33
|
+
var origin = String(Math.round(perf && perf.timeOrigin ? perf.timeOrigin : Date.now()));
|
|
34
|
+
var counter = 0;
|
|
35
|
+
var recentKeys = {};
|
|
36
|
+
var recorded = {};
|
|
37
|
+
var checks = [
|
|
38
|
+
['dynx-card', 'dynamo-notification-card'],
|
|
39
|
+
['notif-area', 'dynamo-notifications-area'],
|
|
40
|
+
['snackbar', 'mat-snack-bar-container, .mat-mdc-snack-bar-container, simple-snack-bar, ' +
|
|
41
|
+
'.red-snackbar, .yellow-snackbar, .green-snackbar, .blue-snackbar'],
|
|
42
|
+
['role-alert', '[role="alert"], [role="alertdialog"]']
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
function nowMs() { return perf ? perf.now() : 0; }
|
|
46
|
+
function squash(text) { return (text || '').replace(/\\s+/g, ' ').trim(); }
|
|
47
|
+
function textOf(el, selector) {
|
|
48
|
+
try {
|
|
49
|
+
var node = el.querySelector(selector);
|
|
50
|
+
return node ? squash(node.textContent) : '';
|
|
51
|
+
} catch (e) { return ''; }
|
|
52
|
+
}
|
|
53
|
+
function classify(el) {
|
|
54
|
+
var html = el.outerHTML || '';
|
|
55
|
+
if (/bg-red-50|red-snackbar|>\\s*error\\s*</.test(html)) { return 'error'; }
|
|
56
|
+
if (/bg-orange-50|yellow-snackbar|>\\s*warning\\s*</.test(html)) { return 'warning'; }
|
|
57
|
+
if (/bg-green-50|green-snackbar|>\\s*check_circle\\s*</.test(html)) { return 'success'; }
|
|
58
|
+
if (/bg-blue-50|blue-snackbar/.test(html)) { return 'info'; }
|
|
59
|
+
return 'unknown';
|
|
60
|
+
}
|
|
61
|
+
function read(el) {
|
|
62
|
+
var structured = textOf(el, '.text-slate-700') || textOf(el, '.mat-mdc-snack-bar-label') ||
|
|
63
|
+
textOf(el, '[matsnackbarlabel]');
|
|
64
|
+
return {
|
|
65
|
+
type: classify(el),
|
|
66
|
+
structured: !!structured,
|
|
67
|
+
title: (structured || squash(el.textContent)).slice(0, 400),
|
|
68
|
+
message: textOf(el, '.text-slate-500').slice(0, 400),
|
|
69
|
+
html: squash(el.outerHTML).slice(0, 500)
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function emit(entry) {
|
|
73
|
+
try {
|
|
74
|
+
if (typeof w[bindingName] === 'function') { w[bindingName](entry); }
|
|
75
|
+
} catch (e) { /* the page must never break because of the detector */ }
|
|
76
|
+
}
|
|
77
|
+
function enrich(entry, state, el) {
|
|
78
|
+
if (!el.isConnected) { return; }
|
|
79
|
+
var fresh = read(el);
|
|
80
|
+
var changed = false;
|
|
81
|
+
if (entry.type === 'unknown' && fresh.type !== 'unknown') { entry.type = fresh.type; changed = true; }
|
|
82
|
+
if (fresh.title && fresh.title !== entry.title && (!entry.title || !state.structured)) {
|
|
83
|
+
entry.title = fresh.title; state.structured = fresh.structured; changed = true;
|
|
84
|
+
}
|
|
85
|
+
if (!entry.message && fresh.message) { entry.message = fresh.message; changed = true; }
|
|
86
|
+
if (changed) { entry.html = fresh.html; emit(entry); }
|
|
87
|
+
}
|
|
88
|
+
function record(kind, el) {
|
|
89
|
+
var seen = recorded[kind] || (recorded[kind] = new WeakSet());
|
|
90
|
+
if (seen.has(el)) { return; }
|
|
91
|
+
seen.add(el);
|
|
92
|
+
var data = read(el);
|
|
93
|
+
var t = nowMs();
|
|
94
|
+
var key = kind + '|' + data.type + '|' + data.title;
|
|
95
|
+
if (data.title && recentKeys[key] !== undefined && t - recentKeys[key] < 1500) { return; }
|
|
96
|
+
recentKeys[key] = t;
|
|
97
|
+
counter += 1;
|
|
98
|
+
var entry = {
|
|
99
|
+
id: origin + '-' + counter,
|
|
100
|
+
kind: kind,
|
|
101
|
+
type: data.type,
|
|
102
|
+
title: data.title,
|
|
103
|
+
message: data.message,
|
|
104
|
+
url: location.href,
|
|
105
|
+
at: Date.now(),
|
|
106
|
+
sinceDocumentStartMs: Math.round(t),
|
|
107
|
+
html: data.html
|
|
108
|
+
};
|
|
109
|
+
var state = { structured: data.structured };
|
|
110
|
+
list.push(entry);
|
|
111
|
+
emit(entry);
|
|
112
|
+
setTimeout(function () { enrich(entry, state, el); }, 50);
|
|
113
|
+
setTimeout(function () { enrich(entry, state, el); }, 300);
|
|
114
|
+
}
|
|
115
|
+
function scan(node) {
|
|
116
|
+
if (!node || node.nodeType !== 1) { return; }
|
|
117
|
+
for (var i = 0; i < checks.length; i++) {
|
|
118
|
+
try {
|
|
119
|
+
if (node.matches(checks[i][1])) { record(checks[i][0], node); }
|
|
120
|
+
var found = node.querySelectorAll(checks[i][1]);
|
|
121
|
+
for (var j = 0; j < found.length; j++) { record(checks[i][0], found[j]); }
|
|
122
|
+
} catch (e) { /* one bad selector must not stop the other checks */ }
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
new MutationObserver(function (mutations) {
|
|
127
|
+
for (var i = 0; i < mutations.length; i++) {
|
|
128
|
+
var added = mutations[i].addedNodes;
|
|
129
|
+
for (var j = 0; j < added.length; j++) { scan(added[j]); }
|
|
130
|
+
}
|
|
131
|
+
}).observe(document, { childList: true, subtree: true });
|
|
132
|
+
scan(document.documentElement);
|
|
133
|
+
})();
|
|
134
134
|
`;
|
|
135
135
|
/**
|
|
136
136
|
* Page-side expression: the visible error banners / inline error texts at this moment (not toasts — e.g. a login
|
|
@@ -138,32 +138,32 @@ exports.DYE2E_NOTIFICATION_DETECTOR_PAGE_SCRIPT = `
|
|
|
138
138
|
* already counted banner is part of it, not a new one (measured: a `role=alert` box with its `.error-text` and icon
|
|
139
139
|
* was counted three times). PURE JavaScript.
|
|
140
140
|
*/
|
|
141
|
-
exports.DYE2E_VISIBLE_ERRORS_PAGE_EXPRESSION = `
|
|
142
|
-
(function () {
|
|
143
|
-
var selectors = ['.error-text', '[class*="error-text"]', 'mat-error', '.mat-mdc-form-field-error',
|
|
144
|
-
'.text-red-200', '.text-red-500', '.text-red-600', '.text-red-700', '[role="alert"]'];
|
|
145
|
-
var out = [];
|
|
146
|
-
var seen = {};
|
|
147
|
-
var picked = [];
|
|
148
|
-
var found = document.querySelectorAll(selectors.join(','));
|
|
149
|
-
for (var i = 0; i < found.length; i++) {
|
|
150
|
-
var el = found[i];
|
|
151
|
-
var text = (el.textContent || '').replace(/\\s+/g, ' ').trim();
|
|
152
|
-
if (!text || text.length > 300 || !(el instanceof HTMLElement)) { continue; }
|
|
153
|
-
var rect = el.getBoundingClientRect();
|
|
154
|
-
var style = getComputedStyle(el);
|
|
155
|
-
var visible = el.offsetParent !== null && rect.width > 0 && rect.height > 0 &&
|
|
156
|
-
style.visibility !== 'hidden' && style.display !== 'none';
|
|
157
|
-
var key = el.tagName + '|' + text;
|
|
158
|
-
if (!visible || seen[key]) { continue; }
|
|
159
|
-
var inside = false;
|
|
160
|
-
for (var j = 0; j < picked.length; j++) { if (picked[j].contains(el)) { inside = true; break; } }
|
|
161
|
-
if (inside) { continue; }
|
|
162
|
-
seen[key] = true;
|
|
163
|
-
picked.push(el);
|
|
164
|
-
out.push({ tag: el.tagName.toLowerCase(), cls: String(el.className || '').slice(0, 120), text: text.slice(0, 260) });
|
|
165
|
-
}
|
|
166
|
-
return out;
|
|
167
|
-
})()
|
|
141
|
+
exports.DYE2E_VISIBLE_ERRORS_PAGE_EXPRESSION = `
|
|
142
|
+
(function () {
|
|
143
|
+
var selectors = ['.error-text', '[class*="error-text"]', 'mat-error', '.mat-mdc-form-field-error',
|
|
144
|
+
'.text-red-200', '.text-red-500', '.text-red-600', '.text-red-700', '[role="alert"]'];
|
|
145
|
+
var out = [];
|
|
146
|
+
var seen = {};
|
|
147
|
+
var picked = [];
|
|
148
|
+
var found = document.querySelectorAll(selectors.join(','));
|
|
149
|
+
for (var i = 0; i < found.length; i++) {
|
|
150
|
+
var el = found[i];
|
|
151
|
+
var text = (el.textContent || '').replace(/\\s+/g, ' ').trim();
|
|
152
|
+
if (!text || text.length > 300 || !(el instanceof HTMLElement)) { continue; }
|
|
153
|
+
var rect = el.getBoundingClientRect();
|
|
154
|
+
var style = getComputedStyle(el);
|
|
155
|
+
var visible = el.offsetParent !== null && rect.width > 0 && rect.height > 0 &&
|
|
156
|
+
style.visibility !== 'hidden' && style.display !== 'none';
|
|
157
|
+
var key = el.tagName + '|' + text;
|
|
158
|
+
if (!visible || seen[key]) { continue; }
|
|
159
|
+
var inside = false;
|
|
160
|
+
for (var j = 0; j < picked.length; j++) { if (picked[j].contains(el)) { inside = true; break; } }
|
|
161
|
+
if (inside) { continue; }
|
|
162
|
+
seen[key] = true;
|
|
163
|
+
picked.push(el);
|
|
164
|
+
out.push({ tag: el.tagName.toLowerCase(), cls: String(el.className || '').slice(0, 120), text: text.slice(0, 260) });
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
})()
|
|
168
168
|
`;
|
|
169
169
|
//# sourceMappingURL=notification-detector-page-script.const.js.map
|
|
@@ -41,12 +41,28 @@ export interface DyE2E_VQA_ReviewBundle_Result {
|
|
|
41
41
|
export declare const DYE2E_VQA_CAPTURE_SPEC_FILE: string;
|
|
42
42
|
/** BFR-FSMED-015 — a bundle SAJÁT Playwright configja (a bundle a projekt `testDir`-én kívül él). */
|
|
43
43
|
export declare const DYE2E_VQA_CAPTURE_CONFIG_FILE: string;
|
|
44
|
+
/**
|
|
45
|
+
* BFR-MASTERPROMPTER-093 ② — the capture run as STRUCTURED data: the executable, its arguments and the environment.
|
|
46
|
+
* `captureCommand` returns a POSIX shell line (`VQA_OUT_DIR="…" npx …`), which `cmd.exe` cannot run (measured on Windows:
|
|
47
|
+
* `'VQA_OUT_DIR' is not recognized…` ⇒ 0 capture). Pass this to `spawn` / `spawnSync` / `execFileSync` with
|
|
48
|
+
* `env: { ...process.env, ...run.env }` (on Windows add `shell: true` so `npx` resolves to `npx.cmd`).
|
|
49
|
+
*/
|
|
50
|
+
export interface DyE2E_VQA_CaptureRun_Interface {
|
|
51
|
+
command: string;
|
|
52
|
+
args: string[];
|
|
53
|
+
env: Record<string, string>;
|
|
54
|
+
}
|
|
44
55
|
export declare class DyE2E_VQA_ReviewBundle_Generator {
|
|
45
56
|
/**
|
|
46
57
|
* BFR-FSMED-015 — a bizonyítottan futó capture-parancs: a bundle saját configjával (a projekt `testDir` / `testMatch`
|
|
47
58
|
* beállítása nem számít). Futtasd a projekt gyökeréből (ott oldódik fel a `@playwright/test` és a dynamo-e2e).
|
|
48
59
|
*/
|
|
49
60
|
static captureCommand(bundlePath: string): string;
|
|
61
|
+
/**
|
|
62
|
+
* BFR-MASTERPROMPTER-093 ② — the same capture run, platform-independent: no shell syntax, the environment travels to
|
|
63
|
+
* the process (see `DyE2E_VQA_CaptureRun_Interface`). Run it from the project root, like `captureCommand`.
|
|
64
|
+
*/
|
|
65
|
+
static captureRun(bundlePath: string): DyE2E_VQA_CaptureRun_Interface;
|
|
50
66
|
/** BFR-FSMED-015 — a bundle Playwright-configja: csak a saját capture-spec-jét futtatja, a saját mappájából. */
|
|
51
67
|
static emitCaptureConfig(): string;
|
|
52
68
|
static generate(manifest: DyE2E_VQA_FeatureManifest_Interface, outputBase: string, options?: DyE2E_VQA_ReviewBundle_Options): DyE2E_VQA_ReviewBundle_Result;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-bundle.generator.d.ts","sourceRoot":"","sources":["../../../../src/_modules/vqa/generators/review-bundle.generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mCAAmC,EAEpC,MAAM,kDAAkD,CAAC;AAM1D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,8BAA8B;IAC7C,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpE;AAED,gHAAgH;AAChH,eAAO,MAAM,2BAA2B,EAAE,MAA0B,CAAC;AAErE,qGAAqG;AACrG,eAAO,MAAM,6BAA6B,EAAE,MAA+B,CAAC;AAE5E,qBAAa,gCAAgC;IAE3C;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIjD,gHAAgH;IAChH,MAAM,CAAC,iBAAiB,IAAI,MAAM;IAclC,MAAM,CAAC,QAAQ,CACb,QAAQ,EAAE,mCAAmC,EAC7C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,8BAA8B,GACvC,6BAA6B;IA+EhC,oGAAoG;IACpG,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,mCAAmC,GAAG;QAC/F,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB;IAsBD,qEAAqE;IACrE,OAAO,CAAC,MAAM,CAAC,cAAc;CAG9B"}
|
|
1
|
+
{"version":3,"file":"review-bundle.generator.d.ts","sourceRoot":"","sources":["../../../../src/_modules/vqa/generators/review-bundle.generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mCAAmC,EAEpC,MAAM,kDAAkD,CAAC;AAM1D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,8BAA8B;IAC7C,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpE;AAED,gHAAgH;AAChH,eAAO,MAAM,2BAA2B,EAAE,MAA0B,CAAC;AAErE,qGAAqG;AACrG,eAAO,MAAM,6BAA6B,EAAE,MAA+B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,qBAAa,gCAAgC;IAE3C;;;OAGG;IACH,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIjD;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,8BAA8B;IAQrE,gHAAgH;IAChH,MAAM,CAAC,iBAAiB,IAAI,MAAM;IAclC,MAAM,CAAC,QAAQ,CACb,QAAQ,EAAE,mCAAmC,EAC7C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,8BAA8B,GACvC,6BAA6B;IA+EhC,oGAAoG;IACpG,MAAM,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,mCAAmC,GAAG;QAC/F,EAAE,EAAE,OAAO,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,CAAC;KACnB;IAsBD,qEAAqE;IACrE,OAAO,CAAC,MAAM,CAAC,cAAc;CAG9B"}
|
|
@@ -42,6 +42,17 @@ class DyE2E_VQA_ReviewBundle_Generator {
|
|
|
42
42
|
static captureCommand(bundlePath) {
|
|
43
43
|
return `VQA_OUT_DIR="${bundlePath}" npx playwright test --config "${path.join(bundlePath, exports.DYE2E_VQA_CAPTURE_CONFIG_FILE)}"`;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* BFR-MASTERPROMPTER-093 ② — the same capture run, platform-independent: no shell syntax, the environment travels to
|
|
47
|
+
* the process (see `DyE2E_VQA_CaptureRun_Interface`). Run it from the project root, like `captureCommand`.
|
|
48
|
+
*/
|
|
49
|
+
static captureRun(bundlePath) {
|
|
50
|
+
return {
|
|
51
|
+
command: 'npx',
|
|
52
|
+
args: ['playwright', 'test', '--config', path.join(bundlePath, exports.DYE2E_VQA_CAPTURE_CONFIG_FILE)],
|
|
53
|
+
env: { VQA_OUT_DIR: bundlePath },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
45
56
|
/** BFR-FSMED-015 — a bundle Playwright-configja: csak a saját capture-spec-jét futtatja, a saját mappájából. */
|
|
46
57
|
static emitCaptureConfig() {
|
|
47
58
|
return `// AUTOGEN by @futdevpro/dynamo-e2e/vqa — DyE2E_VQA_ReviewBundle_Generator. DO NOT EDIT.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-bundle.generator.js","sourceRoot":"","sources":["../../../../src/_modules/vqa/generators/review-bundle.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAK7B,2FAAiG;AACjG,yEAA8E;AAC9E,uEAA6E;AAC7E,qEAA2E;AAsC3E,gHAAgH;AACnG,QAAA,2BAA2B,GAAW,iBAAiB,CAAC;AAErE,qGAAqG;AACxF,QAAA,6BAA6B,GAAW,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-bundle.generator.js","sourceRoot":"","sources":["../../../../src/_modules/vqa/generators/review-bundle.generator.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -25,5 +25,5 @@ __exportStar(require("./_modules/vqa/index"), exports);
|
|
|
25
25
|
__exportStar(require("./_modules/game/index"), exports);
|
|
26
26
|
__exportStar(require("./_modules/coverage/index"), exports);
|
|
27
27
|
/** Package-version stamp — npm-publish-time runtime-érték. */
|
|
28
|
-
exports.DYE2E_PACKAGE_VERSION = '01.18.
|
|
28
|
+
exports.DYE2E_PACKAGE_VERSION = '01.18.26';
|
|
29
29
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/dynamo-e2e",
|
|
3
|
-
"version": "01.18.
|
|
3
|
+
"version": "01.18.26",
|
|
4
4
|
"description": "End-to-end testing engine for the Dynamo + FDP ecosystem — auto-generated form-coverage tests, viewport audit matrix, CWV diagnostics. Settings-POJO-first.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "core-package",
|