@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 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
- [![npm](https://img.shields.io/npm/v/@futdevpro/dynamo-e2e.svg?label=npm)](https://www.npmjs.com/package/@futdevpro/dynamo-e2e)
4
- [![coverage](https://img.shields.io/badge/coverage-98.37%25-brightgreen.svg)](./coverage/)
5
- [![specs](https://img.shields.io/badge/specs-254%2F0-brightgreen.svg)](./src/)
6
- [![hyperplan](https://img.shields.io/badge/hyperplan-109%2F112-brightgreen.svg)](./__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
+ [![npm](https://img.shields.io/npm/v/@futdevpro/dynamo-e2e.svg?label=npm)](https://www.npmjs.com/package/@futdevpro/dynamo-e2e)
4
+ [![coverage](https://img.shields.io/badge/coverage-98.37%25-brightgreen.svg)](./coverage/)
5
+ [![specs](https://img.shields.io/badge/specs-254%2F0-brightgreen.svg)](./src/)
6
+ [![hyperplan](https://img.shields.io/badge/hyperplan-109%2F112-brightgreen.svg)](./__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":"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"}
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.25';
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.25",
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",