@futdevpro/dynamo-e2e 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +2 -2
  3. package/bin/dye2e.js +21 -0
  4. package/build/_modules/cwv/_collections/cwv-diagnose.util.d.ts +37 -0
  5. package/build/_modules/cwv/_collections/cwv-diagnose.util.d.ts.map +1 -0
  6. package/build/_modules/cwv/_collections/cwv-diagnose.util.js +108 -0
  7. package/build/_modules/cwv/_collections/cwv-diagnose.util.js.map +1 -0
  8. package/build/_modules/cwv/cwv-diagnose.spec.d.ts +2 -0
  9. package/build/_modules/cwv/cwv-diagnose.spec.d.ts.map +1 -0
  10. package/build/_modules/cwv/cwv-diagnose.spec.js +78 -0
  11. package/build/_modules/cwv/cwv-diagnose.spec.js.map +1 -0
  12. package/build/_modules/cwv/index.d.ts +1 -0
  13. package/build/_modules/cwv/index.d.ts.map +1 -1
  14. package/build/_modules/cwv/index.js +1 -0
  15. package/build/_modules/cwv/index.js.map +1 -1
  16. package/build/_modules/generators/_collections/cli-runner.util.d.ts +23 -0
  17. package/build/_modules/generators/_collections/cli-runner.util.d.ts.map +1 -1
  18. package/build/_modules/generators/_collections/cli-runner.util.js +57 -0
  19. package/build/_modules/generators/_collections/cli-runner.util.js.map +1 -1
  20. package/build/_modules/generators/doctor.spec.d.ts +2 -0
  21. package/build/_modules/generators/doctor.spec.d.ts.map +1 -0
  22. package/build/_modules/generators/doctor.spec.js +68 -0
  23. package/build/_modules/generators/doctor.spec.js.map +1 -0
  24. package/coverage/contracts/_collections/index.html +1 -1
  25. package/coverage/contracts/_collections/index.ts.html +1 -1
  26. package/coverage/contracts/_collections/utils/index.html +1 -1
  27. package/coverage/contracts/_collections/utils/test-id.util.ts.html +1 -1
  28. package/coverage/contracts/_enums/cwv-metric-type.enum.ts.html +1 -1
  29. package/coverage/contracts/_enums/field-test-case-type.enum.ts.html +1 -1
  30. package/coverage/contracts/_enums/index.html +1 -1
  31. package/coverage/contracts/_enums/index.ts.html +1 -1
  32. package/coverage/contracts/_enums/standard-viewport.enum.ts.html +1 -1
  33. package/coverage/contracts/_enums/test-expectation-type.enum.ts.html +1 -1
  34. package/coverage/contracts/_enums/test-run-mode-type.enum.ts.html +1 -1
  35. package/coverage/contracts/index.html +1 -1
  36. package/coverage/contracts/index.ts.html +1 -1
  37. package/coverage/cwv/_collections/cwv-aggregator.util.ts.html +1 -1
  38. package/coverage/cwv/_collections/cwv-diagnose.util.ts.html +553 -0
  39. package/coverage/cwv/_collections/cwv-emission.util.ts.html +1 -1
  40. package/coverage/cwv/_collections/index.html +23 -8
  41. package/coverage/cwv/_collections/inp-interaction-script.const.ts.html +1 -1
  42. package/coverage/cwv/_collections/web-vitals-page-script.const.ts.html +1 -1
  43. package/coverage/cwv/cwv-suite.generator.ts.html +1 -1
  44. package/coverage/cwv/index.html +1 -1
  45. package/coverage/generators/_collections/cli-runner.util.ts.html +219 -21
  46. package/coverage/generators/_collections/field-emission.util.ts.html +1 -1
  47. package/coverage/generators/_collections/form-level-emission.util.ts.html +1 -1
  48. package/coverage/generators/_collections/index.html +13 -13
  49. package/coverage/generators/_collections/spec-emission.util.ts.html +1 -1
  50. package/coverage/generators/_collections/test-case-filter.util.ts.html +1 -1
  51. package/coverage/generators/_collections/viewport-emission.util.ts.html +1 -1
  52. package/coverage/generators/form-suite.generator.ts.html +1 -1
  53. package/coverage/generators/index.html +1 -1
  54. package/coverage/generators/viewport-suite.generator.ts.html +1 -1
  55. package/coverage/index.html +26 -26
  56. package/coverage/lcov-report/contracts/_collections/index.html +1 -1
  57. package/coverage/lcov-report/contracts/_collections/index.ts.html +1 -1
  58. package/coverage/lcov-report/contracts/_collections/utils/index.html +1 -1
  59. package/coverage/lcov-report/contracts/_collections/utils/test-id.util.ts.html +1 -1
  60. package/coverage/lcov-report/contracts/_enums/cwv-metric-type.enum.ts.html +1 -1
  61. package/coverage/lcov-report/contracts/_enums/field-test-case-type.enum.ts.html +1 -1
  62. package/coverage/lcov-report/contracts/_enums/index.html +1 -1
  63. package/coverage/lcov-report/contracts/_enums/index.ts.html +1 -1
  64. package/coverage/lcov-report/contracts/_enums/standard-viewport.enum.ts.html +1 -1
  65. package/coverage/lcov-report/contracts/_enums/test-expectation-type.enum.ts.html +1 -1
  66. package/coverage/lcov-report/contracts/_enums/test-run-mode-type.enum.ts.html +1 -1
  67. package/coverage/lcov-report/contracts/index.html +1 -1
  68. package/coverage/lcov-report/contracts/index.ts.html +1 -1
  69. package/coverage/lcov-report/cwv/_collections/cwv-aggregator.util.ts.html +1 -1
  70. package/coverage/lcov-report/cwv/_collections/cwv-diagnose.util.ts.html +553 -0
  71. package/coverage/lcov-report/cwv/_collections/cwv-emission.util.ts.html +1 -1
  72. package/coverage/lcov-report/cwv/_collections/index.html +23 -8
  73. package/coverage/lcov-report/cwv/_collections/inp-interaction-script.const.ts.html +1 -1
  74. package/coverage/lcov-report/cwv/_collections/web-vitals-page-script.const.ts.html +1 -1
  75. package/coverage/lcov-report/cwv/cwv-suite.generator.ts.html +1 -1
  76. package/coverage/lcov-report/cwv/index.html +1 -1
  77. package/coverage/lcov-report/generators/_collections/cli-runner.util.ts.html +219 -21
  78. package/coverage/lcov-report/generators/_collections/field-emission.util.ts.html +1 -1
  79. package/coverage/lcov-report/generators/_collections/form-level-emission.util.ts.html +1 -1
  80. package/coverage/lcov-report/generators/_collections/index.html +13 -13
  81. package/coverage/lcov-report/generators/_collections/spec-emission.util.ts.html +1 -1
  82. package/coverage/lcov-report/generators/_collections/test-case-filter.util.ts.html +1 -1
  83. package/coverage/lcov-report/generators/_collections/viewport-emission.util.ts.html +1 -1
  84. package/coverage/lcov-report/generators/form-suite.generator.ts.html +1 -1
  85. package/coverage/lcov-report/generators/index.html +1 -1
  86. package/coverage/lcov-report/generators/viewport-suite.generator.ts.html +1 -1
  87. package/coverage/lcov-report/index.html +26 -26
  88. package/coverage/lcov-report/runtime/_collections/assertion-helpers.util.ts.html +1 -1
  89. package/coverage/lcov-report/runtime/_collections/index.html +1 -1
  90. package/coverage/lcov-report/runtime/_collections/unique-generator.util.ts.html +1 -1
  91. package/coverage/lcov-report/runtime/_collections/wait-helpers.util.ts.html +1 -1
  92. package/coverage/lcov-report/runtime/_services/dialog-page-object.ts.html +1 -1
  93. package/coverage/lcov-report/runtime/_services/field-page-object.ts.html +1 -1
  94. package/coverage/lcov-report/runtime/_services/form-page-object.ts.html +1 -1
  95. package/coverage/lcov-report/runtime/_services/index.html +1 -1
  96. package/coverage/lcov-report/runtime/_services/loader-page-object.ts.html +1 -1
  97. package/coverage/lcov-report/runtime/_services/logger.service.ts.html +1 -1
  98. package/coverage/lcov-report/runtime/_services/login-flow-helper.base.ts.html +1 -1
  99. package/coverage/lcov-report/runtime/_services/nav-page-object.ts.html +1 -1
  100. package/coverage/lcov-report/runtime/_services/toast-page-object.ts.html +1 -1
  101. package/coverage/lcov-report/runtime/_services/wave-2b-page-objects.ts.html +1 -1
  102. package/coverage/lcov-report/runtime/index.html +1 -1
  103. package/coverage/lcov-report/runtime/index.ts.html +1 -1
  104. package/coverage/lcov.info +374 -63
  105. package/coverage/runtime/_collections/assertion-helpers.util.ts.html +1 -1
  106. package/coverage/runtime/_collections/index.html +1 -1
  107. package/coverage/runtime/_collections/unique-generator.util.ts.html +1 -1
  108. package/coverage/runtime/_collections/wait-helpers.util.ts.html +1 -1
  109. package/coverage/runtime/_services/dialog-page-object.ts.html +1 -1
  110. package/coverage/runtime/_services/field-page-object.ts.html +1 -1
  111. package/coverage/runtime/_services/form-page-object.ts.html +1 -1
  112. package/coverage/runtime/_services/index.html +1 -1
  113. package/coverage/runtime/_services/loader-page-object.ts.html +1 -1
  114. package/coverage/runtime/_services/logger.service.ts.html +1 -1
  115. package/coverage/runtime/_services/login-flow-helper.base.ts.html +1 -1
  116. package/coverage/runtime/_services/nav-page-object.ts.html +1 -1
  117. package/coverage/runtime/_services/toast-page-object.ts.html +1 -1
  118. package/coverage/runtime/_services/wave-2b-page-objects.ts.html +1 -1
  119. package/coverage/runtime/index.html +1 -1
  120. package/coverage/runtime/index.ts.html +1 -1
  121. package/coverage/tmp/{coverage-225712-1781070050591-0.json → coverage-224932-1781071393426-0.json} +1 -1
  122. package/coverage/tmp/coverage-226960-1781071394780-0.json +1 -0
  123. package/package.json +1 -1
  124. package/coverage/tmp/coverage-222216-1781070051665-0.json +0 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,27 @@
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.10.0] — 2026-06-10
7
+
8
+ ### Added (Wave-3 attribution diagnose + `dye2e doctor` CLI)
9
+ - `DyE2E_CWVDiagnose_Util` (`cwv/_collections/cwv-diagnose.util.ts`):
10
+ - `diagnoseMetric()` — per-metric p75 + threshold check + attribution-target
11
+ + optimalizálási suggestion (IMG/H1/DIV LCP, CLS-dimension, INP-long-tasks,
12
+ TTFB-caching, FCP-critical-CSS)
13
+ - `diagnoseAll()` — minden metric egyszerre
14
+ - `DyE2E_CWVDiagnose_Hint` interface (metric, p75, threshold, worstTarget,
15
+ summary, suggestion)
16
+ - **`dye2e doctor`** CLI parancs:
17
+ - `pwd` flag (default cwd)
18
+ - 5 check: @futdevpro/dynamo-e2e, @playwright/test, playwright.config,
19
+ e2e/tests dir, .dynamo/pipeline.cicd.config.json
20
+ - Per-check suggestion + exit 0 (all ✓) / 1 (suggestions present)
21
+ - `DyE2E_CliRunner_Util.doctorReport()` testable factory
22
+
23
+ ### Test
24
+ - 183/0 Jasmine zöld (167 előbb + 8 CWV diagnose + 8 CLI doctor)
25
+ - Coverage: 98.2% / 86.43% / 97.36% / 98.2%
26
+
6
27
  ## [01.09.0] — 2026-06-10
7
28
 
8
29
  ### Added (Wave-3 INP integration + Wave-2b fixture + CONTRIBUTING)
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @futdevpro/dynamo-e2e
2
2
 
3
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.3%25-brightgreen.svg)](./coverage/)
5
- [![specs](https://img.shields.io/badge/specs-167%2F0-brightgreen.svg)](./src/)
4
+ [![coverage](https://img.shields.io/badge/coverage-98.2%25-brightgreen.svg)](./coverage/)
5
+ [![specs](https://img.shields.io/badge/specs-183%2F0-brightgreen.svg)](./src/)
6
6
  [![hyperplan](https://img.shields.io/badge/hyperplan-109%2F112-brightgreen.svg)](./__documentations/plans/dynamo-e2e-foundation/HYPERPLAN.md)
7
7
 
8
8
  End-to-end testing engine for the Dynamo + FDP ecosystem.
package/bin/dye2e.js CHANGED
@@ -25,6 +25,27 @@ function main() {
25
25
  process.exit(0);
26
26
  }
27
27
 
28
+ if (parsed.command === 'doctor') {
29
+ const projectRoot = parsed.flags.pwd ? path.resolve(parsed.flags.pwd) : process.cwd();
30
+ const report = DyE2E_CliRunner_Util.doctorReport(projectRoot, fs);
31
+ process.stdout.write('dye2e doctor — project config check\n');
32
+ process.stdout.write(' pwd: ' + projectRoot + '\n\n');
33
+ process.stdout.write(' [' + (report.hasDynamoE2E ? '✓' : '✗') + '] @futdevpro/dynamo-e2e installed\n');
34
+ process.stdout.write(' [' + (report.hasPlaywrightTest ? '✓' : '✗') + '] @playwright/test installed\n');
35
+ process.stdout.write(' [' + (report.hasPlaywrightConfig ? '✓' : '✗') + '] playwright.config.{ts,js} present\n');
36
+ process.stdout.write(' [' + (report.hasE2EDir ? '✓' : '✗') + '] e2e/ or tests/ directory present\n');
37
+ process.stdout.write(' [' + (report.hasCicdConfig ? '✓' : '✗') + '] .dynamo/pipeline.cicd.config.json present (Overseer CICD)\n');
38
+ if (report.suggestions.length > 0) {
39
+ process.stdout.write('\n Suggestions:\n');
40
+ for (const s of report.suggestions) {
41
+ process.stdout.write(' - ' + s + '\n');
42
+ }
43
+ } else {
44
+ process.stdout.write('\n ✓ all checks passed.\n');
45
+ }
46
+ process.exit(report.suggestions.length > 0 ? 1 : 0);
47
+ }
48
+
28
49
  const generateCommands = ['generate-form-suite', 'generate-viewport-audit', 'generate-cwv-diag'];
29
50
  if (generateCommands.indexOf(parsed.command) !== -1) {
30
51
  const configPath = parsed.flags.config;
@@ -0,0 +1,37 @@
1
+ import { DyE2E_CWVMetric_Type } from '../../contracts/_enums/cwv-metric-type.enum';
2
+ import { DyE2E_CWVThresholds_Interface } from '../../contracts/_models/interfaces/cwv-thresholds.interface';
3
+ import { DyE2E_CWVMeasurement_DataModel } from '../_models/cwv-measurement.data-model';
4
+ /**
5
+ * MP-05/Wave-3 — Attribution-based diagnose util.
6
+ *
7
+ * Bemenet: measurement-tömb + thresholds. Kimenet: human-readable diagnose
8
+ * sorok — "LCP p75 = 4200ms (cél: 2500ms). A leglassabb LCP target:
9
+ * `IMG#hero-banner`. Optimalizálás: preload + dimension-set."
10
+ */
11
+ export interface DyE2E_CWVDiagnose_Hint {
12
+ metric: DyE2E_CWVMetric_Type;
13
+ /** A measured p75 érték. */
14
+ p75: number;
15
+ /** A threshold (ha definiált). */
16
+ threshold?: number;
17
+ /** A legrosszabb futás target-info (a `measurement.attribution`-ből). */
18
+ worstTarget?: string;
19
+ /** Human-readable summary. */
20
+ summary: string;
21
+ /** Optimalizálási javaslat. */
22
+ suggestion: string;
23
+ }
24
+ export declare class DyE2E_CWVDiagnose_Util {
25
+ /**
26
+ * Per-metric percentile-számolás (lásd `DyE2E_CWVAggregator_Util` is —
27
+ * itt egy-self-contained verzió a diagnose-flow-hoz).
28
+ */
29
+ private static percentile;
30
+ /** Diagnose egy metricre — visszaadja a hint-et vagy null-t ha nincs adat. */
31
+ static diagnoseMetric(measurements: DyE2E_CWVMeasurement_DataModel[], metric: DyE2E_CWVMetric_Type, thresholds: DyE2E_CWVThresholds_Interface): DyE2E_CWVDiagnose_Hint | null;
32
+ /** Diagnose minden metric-re egyszerre. */
33
+ static diagnoseAll(measurements: DyE2E_CWVMeasurement_DataModel[], thresholds: DyE2E_CWVThresholds_Interface): DyE2E_CWVDiagnose_Hint[];
34
+ /** Egy metric-szintű optimalizálási javaslat. */
35
+ private static suggest;
36
+ }
37
+ //# sourceMappingURL=cwv-diagnose.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwv-diagnose.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/cwv/_collections/cwv-diagnose.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,6BAA6B,EAAE,MAAM,6DAA6D,CAAC;AAC5G,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AAEvF;;;;;;GAMG;AAEH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AASD,qBAAa,sBAAsB;IAEjC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAiBzB,8EAA8E;IAC9E,MAAM,CAAC,cAAc,CACnB,YAAY,EAAE,8BAA8B,EAAE,EAC9C,MAAM,EAAE,oBAAoB,EAC5B,UAAU,EAAE,6BAA6B,GACxC,sBAAsB,GAAG,IAAI;IAkDhC,2CAA2C;IAC3C,MAAM,CAAC,WAAW,CAChB,YAAY,EAAE,8BAA8B,EAAE,EAC9C,UAAU,EAAE,6BAA6B,GACxC,sBAAsB,EAAE;IAa3B,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,OAAO;CA0BvB"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyE2E_CWVDiagnose_Util = void 0;
4
+ const cwv_metric_type_enum_1 = require("../../contracts/_enums/cwv-metric-type.enum");
5
+ const LCP_SUGGESTIONS = {
6
+ IMG: 'IMG → preload + explicit width/height + responsive-srcset',
7
+ VIDEO: 'VIDEO → poster-image + preload="metadata"',
8
+ H1: 'H1 → font-display:swap + preload critical CSS',
9
+ DIV: 'DIV background-image → image preload + CSS containment',
10
+ };
11
+ class DyE2E_CWVDiagnose_Util {
12
+ /**
13
+ * Per-metric percentile-számolás (lásd `DyE2E_CWVAggregator_Util` is —
14
+ * itt egy-self-contained verzió a diagnose-flow-hoz).
15
+ */
16
+ static percentile(values, p) {
17
+ if (values.length === 0) {
18
+ return NaN;
19
+ }
20
+ const sorted = [...values].sort((a, b) => a - b);
21
+ if (sorted.length === 1) {
22
+ return sorted[0];
23
+ }
24
+ const rank = p * (sorted.length - 1);
25
+ const lo = Math.floor(rank);
26
+ const hi = Math.ceil(rank);
27
+ if (lo === hi) {
28
+ return sorted[lo];
29
+ }
30
+ return sorted[lo] * (1 - (rank - lo)) + sorted[hi] * (rank - lo);
31
+ }
32
+ /** Diagnose egy metricre — visszaadja a hint-et vagy null-t ha nincs adat. */
33
+ static diagnoseMetric(measurements, metric, thresholds) {
34
+ const filtered = measurements.filter((m) => m.metric === metric);
35
+ if (filtered.length === 0) {
36
+ return null;
37
+ }
38
+ const values = filtered.map((m) => m.value);
39
+ const p75 = DyE2E_CWVDiagnose_Util.percentile(values, 0.75);
40
+ // Az "legrosszabb" futás attribution-ja a target-info forrása.
41
+ const worst = filtered.reduce((acc, m) => m.value > acc.value ? m : acc, filtered[0]);
42
+ const worstTarget = typeof worst.attribution?.element === 'string'
43
+ ? worst.attribution.element
44
+ : typeof worst.attribution?.target === 'string'
45
+ ? worst.attribution.target
46
+ : undefined;
47
+ const thresholdKey = metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp ? 'lcp_p75_ms' :
48
+ metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls ? 'cls_p75' :
49
+ metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.inp ? 'inp_p75_ms' :
50
+ metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.ttfb ? 'ttfb_p75_ms' :
51
+ metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.fcp ? 'fcp_p75_ms' :
52
+ 'lcp_p75_ms';
53
+ const threshold = thresholds[thresholdKey];
54
+ const fails = typeof threshold === 'number' && p75 > threshold;
55
+ const suggestion = DyE2E_CWVDiagnose_Util.suggest(metric, worstTarget, fails);
56
+ const summary = `${metric.toUpperCase()} p75 = ${p75.toFixed(2)}${metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls ? '' : 'ms'}${typeof threshold === 'number' ? ` (cél: ${threshold}${metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls ? '' : 'ms'})` : ''}${fails ? ' ⚠️ FAIL' : ''}${worstTarget ? `. Legrosszabb target: \`${worstTarget}\`` : ''}.`;
57
+ return {
58
+ metric: metric,
59
+ p75: p75,
60
+ threshold: threshold,
61
+ worstTarget: worstTarget,
62
+ summary: summary,
63
+ suggestion: suggestion,
64
+ };
65
+ }
66
+ /** Diagnose minden metric-re egyszerre. */
67
+ static diagnoseAll(measurements, thresholds) {
68
+ const metrics = [
69
+ cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp,
70
+ cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls,
71
+ cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.inp,
72
+ cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.ttfb,
73
+ cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.fcp,
74
+ ];
75
+ return metrics
76
+ .map((m) => DyE2E_CWVDiagnose_Util.diagnoseMetric(measurements, m, thresholds))
77
+ .filter((h) => h !== null);
78
+ }
79
+ /** Egy metric-szintű optimalizálási javaslat. */
80
+ static suggest(metric, target, fails) {
81
+ if (!fails) {
82
+ return 'OK — threshold tartva.';
83
+ }
84
+ if (metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp && target) {
85
+ // Az IMG/H1/DIV stb. prefixet vegye ki
86
+ const tag = target.split(/[#.]/)[0].toUpperCase();
87
+ return LCP_SUGGESTIONS[tag] ?? `LCP target ${target} — optimalizálás: preload + critical CSS + lazy-load other content`;
88
+ }
89
+ if (metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp) {
90
+ return 'LCP — preload critical resources + reduce render-blocking JS + use CDN';
91
+ }
92
+ if (metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls) {
93
+ return 'CLS — set explicit dimensions on IMG/IFRAME/AD-slots + avoid font-swap layout-shift + use `font-display: optional`';
94
+ }
95
+ if (metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.inp) {
96
+ return 'INP — break up long tasks (yield to main thread) + remove unused JS + defer non-critical interactivity';
97
+ }
98
+ if (metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.ttfb) {
99
+ return 'TTFB — server-side caching + CDN + reduce DB query time + edge-deploy';
100
+ }
101
+ if (metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.fcp) {
102
+ return 'FCP — inline critical CSS + preconnect to third-party origins + reduce render-blocking JS';
103
+ }
104
+ return 'Optimalizálási javaslat — lásd web.dev metric-specific docs.';
105
+ }
106
+ }
107
+ exports.DyE2E_CWVDiagnose_Util = DyE2E_CWVDiagnose_Util;
108
+ //# sourceMappingURL=cwv-diagnose.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwv-diagnose.util.js","sourceRoot":"","sources":["../../../../src/_modules/cwv/_collections/cwv-diagnose.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cwv-diagnose.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwv-diagnose.spec.d.ts","sourceRoot":"","sources":["../../../src/_modules/cwv/cwv-diagnose.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cwv_metric_type_enum_1 = require("../contracts/_enums/cwv-metric-type.enum");
4
+ const cwv_default_thresholds_const_1 = require("../contracts/_collections/constants/cwv-default-thresholds.const");
5
+ const cwv_measurement_data_model_1 = require("./_models/cwv-measurement.data-model");
6
+ const cwv_diagnose_util_1 = require("./_collections/cwv-diagnose.util");
7
+ describe('| dynamo-e2e | CWV Diagnose Util (Wave-3)', () => {
8
+ it('| üres measurement → null', () => {
9
+ const result = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric([], cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
10
+ expect(result).toBeNull();
11
+ });
12
+ it('| LCP p75 < threshold → OK', () => {
13
+ const ms = [
14
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, value: 1500, iteration: 0, route: '/x' }),
15
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, value: 2000, iteration: 1, route: '/x' }),
16
+ ];
17
+ const result = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(ms, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
18
+ expect(result).not.toBeNull();
19
+ expect(result?.suggestion).toBe('OK — threshold tartva.');
20
+ expect(result?.summary).toContain('LCP p75');
21
+ expect(result?.summary).not.toContain('FAIL');
22
+ });
23
+ it('| LCP p75 > threshold → FAIL + suggestion', () => {
24
+ const ms = [
25
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, value: 4000, iteration: 0, route: '/x' }),
26
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, value: 5500, iteration: 1, route: '/x' }),
27
+ ];
28
+ const result = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(ms, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
29
+ expect(result?.summary).toContain('FAIL');
30
+ expect(result?.suggestion).not.toBe('OK — threshold tartva.');
31
+ });
32
+ it('| LCP target IMG → IMG-specifikus suggestion', () => {
33
+ const ms = [
34
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({
35
+ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, value: 5000, iteration: 0, route: '/x',
36
+ attribution: { element: 'IMG#hero-banner' },
37
+ }),
38
+ ];
39
+ const result = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(ms, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
40
+ expect(result?.worstTarget).toBe('IMG#hero-banner');
41
+ expect(result?.suggestion).toContain('preload');
42
+ });
43
+ it('| CLS p75 > 0.1 → FAIL + dimension suggestion', () => {
44
+ const ms = [
45
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls, value: 0.2, iteration: 0, route: '/x' }),
46
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls, value: 0.3, iteration: 1, route: '/x' }),
47
+ ];
48
+ const result = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(ms, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
49
+ expect(result?.summary).toContain('FAIL');
50
+ expect(result?.suggestion).toContain('dimension');
51
+ });
52
+ it('| INP p75 > 200ms → FAIL + long-task suggestion', () => {
53
+ const ms = [
54
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.inp, value: 500, iteration: 0, route: '/x' }),
55
+ ];
56
+ const result = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(ms, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.inp, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
57
+ expect(result?.suggestion).toContain('long tasks');
58
+ });
59
+ it('| TTFB / FCP suggestion-ágak', () => {
60
+ const ttfbMs = [new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.ttfb, value: 2000, iteration: 0, route: '/x' })];
61
+ const fcpMs = [new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.fcp, value: 3000, iteration: 0, route: '/x' })];
62
+ const ttfb = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(ttfbMs, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.ttfb, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
63
+ const fcp = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseMetric(fcpMs, cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.fcp, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
64
+ expect(ttfb?.suggestion).toContain('caching');
65
+ expect(fcp?.suggestion).toContain('critical CSS');
66
+ });
67
+ it('| diagnoseAll több metric-re egyszerre', () => {
68
+ const ms = [
69
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp, value: 1500, iteration: 0, route: '/x' }),
70
+ new cwv_measurement_data_model_1.DyE2E_CWVMeasurement_DataModel({ metric: cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls, value: 0.05, iteration: 0, route: '/x' }),
71
+ ];
72
+ const all = cwv_diagnose_util_1.DyE2E_CWVDiagnose_Util.diagnoseAll(ms, cwv_default_thresholds_const_1.CWV_GOOD_THRESHOLDS);
73
+ expect(all.length).toBe(2); // LCP + CLS
74
+ expect(all.find(h => h.metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.lcp)).toBeDefined();
75
+ expect(all.find(h => h.metric === cwv_metric_type_enum_1.DyE2E_CWVMetric_Type.cls)).toBeDefined();
76
+ });
77
+ });
78
+ //# sourceMappingURL=cwv-diagnose.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwv-diagnose.spec.js","sourceRoot":"","sources":["../../../src/_modules/cwv/cwv-diagnose.spec.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * `@futdevpro/dynamo-e2e/cwv` — Core Web Vitals diagnostics (Wave-3).
3
3
  */
4
4
  export * from './_collections/cwv-aggregator.util';
5
+ export * from './_collections/cwv-diagnose.util';
5
6
  export * from './_collections/cwv-emission.util';
6
7
  export * from './_collections/inp-interaction-script.const';
7
8
  export * from './_collections/web-vitals-page-script.const';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/cwv/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AAEtC,eAAO,MAAM,iBAAiB,EAAE,MAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/cwv/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,oCAAoC,CAAC;AACnD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AAEtC,eAAO,MAAM,iBAAiB,EAAE,MAAuB,CAAC"}
@@ -19,6 +19,7 @@ exports.DYE2E_CWV_VERSION = void 0;
19
19
  * `@futdevpro/dynamo-e2e/cwv` — Core Web Vitals diagnostics (Wave-3).
20
20
  */
21
21
  __exportStar(require("./_collections/cwv-aggregator.util"), exports);
22
+ __exportStar(require("./_collections/cwv-diagnose.util"), exports);
22
23
  __exportStar(require("./_collections/cwv-emission.util"), exports);
23
24
  __exportStar(require("./_collections/inp-interaction-script.const"), exports);
24
25
  __exportStar(require("./_collections/web-vitals-page-script.const"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/cwv/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,qEAAmD;AACnD,mEAAiD;AACjD,8EAA4D;AAC5D,8EAA4D;AAC5D,kDAAgC;AAChC,wDAAsC;AAEzB,QAAA,iBAAiB,GAAW,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/cwv/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,qEAAmD;AACnD,mEAAiD;AACjD,mEAAiD;AACjD,8EAA4D;AAC5D,8EAA4D;AAC5D,kDAAgC;AAChC,wDAAsC;AAEzB,QAAA,iBAAiB,GAAW,cAAc,CAAC"}
@@ -10,6 +10,29 @@ export declare class DyE2E_CliRunner_Util {
10
10
  flags: Record<string, string>;
11
11
  };
12
12
  static helpText(): string;
13
+ /**
14
+ * Doctor parancs — projekt-config-validáció.
15
+ *
16
+ * Megnézi:
17
+ * - van-e `@futdevpro/dynamo-e2e` a package.json deps-jében
18
+ * - van-e `@playwright/test`
19
+ * - létezik-e `playwright.config.ts` vagy `playwright.config.js`
20
+ * - létezik-e `e2e/` vagy `tests/` mappa
21
+ * - létezik-e `.dynamo/pipeline.cicd.config.json` (FDP-project esetén)
22
+ *
23
+ * Bemenet: cwd → kimenet JSON-szerű object.
24
+ */
25
+ static doctorReport(cwd: string, fs: {
26
+ existsSync: (p: string) => boolean;
27
+ readFileSync: (p: string, enc: string) => string;
28
+ }): {
29
+ hasDynamoE2E: boolean;
30
+ hasPlaywrightTest: boolean;
31
+ hasPlaywrightConfig: boolean;
32
+ hasE2EDir: boolean;
33
+ hasCicdConfig: boolean;
34
+ suggestions: string[];
35
+ };
13
36
  static versionText(version: string): string;
14
37
  /**
15
38
  * A 3 generate-parancs köztes-runner-je. A konfig egy JSON-string (filesystem
@@ -1 +1 @@
1
- {"version":3,"file":"cli-runner.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,qBAAa,oBAAoB;IAE/B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAsBpF,MAAM,CAAC,QAAQ,IAAI,MAAM;IA8BzB,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI3C;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,qBAAqB,GAAG,yBAAyB,GAAG,mBAAmB,EAChF,UAAU,EAAE,MAAM,GACjB,MAAM;CAaV"}
1
+ {"version":3,"file":"cli-runner.util.d.ts","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,qBAAa,oBAAoB;IAE/B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAsBpF,MAAM,CAAC,QAAQ,IAAI,MAAM;IAkCzB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QAAE,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;QAAC,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,GAAG;QAC9H,YAAY,EAAE,OAAO,CAAC;QACtB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,mBAAmB,EAAE,OAAO,CAAC;QAC7B,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB;IA2CD,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAI3C;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,OAAO,EAAE,qBAAqB,GAAG,yBAAyB,GAAG,mBAAmB,EAChF,UAAU,EAAE,MAAM,GACjB,MAAM;CAaV"}
@@ -43,6 +43,7 @@ Commands:
43
43
  generate-form-suite Settings POJO → Playwright form-coverage spec.ts
44
44
  generate-viewport-audit Route-list → 7 viewport × theme spec.ts
45
45
  generate-cwv-diag Route-list → CWV synthetic measurement spec.ts
46
+ doctor Diagnose project config (config-files, deps, conventions)
46
47
  version Print package version
47
48
  help This message
48
49
 
@@ -60,8 +61,64 @@ Flags (generate-cwv-diag):
60
61
  --config <path> Path to JSON config (routes, thresholds, ...)
61
62
  --out <path> Output spec.ts path
62
63
  --stdout Print to stdout
64
+
65
+ Flags (doctor):
66
+ --pwd <path> Project root (default: cwd)
63
67
  `;
64
68
  }
69
+ /**
70
+ * Doctor parancs — projekt-config-validáció.
71
+ *
72
+ * Megnézi:
73
+ * - van-e `@futdevpro/dynamo-e2e` a package.json deps-jében
74
+ * - van-e `@playwright/test`
75
+ * - létezik-e `playwright.config.ts` vagy `playwright.config.js`
76
+ * - létezik-e `e2e/` vagy `tests/` mappa
77
+ * - létezik-e `.dynamo/pipeline.cicd.config.json` (FDP-project esetén)
78
+ *
79
+ * Bemenet: cwd → kimenet JSON-szerű object.
80
+ */
81
+ static doctorReport(cwd, fs) {
82
+ const pkgJsonPath = `${cwd}/package.json`;
83
+ let hasDynamoE2E = false;
84
+ let hasPlaywrightTest = false;
85
+ if (fs.existsSync(pkgJsonPath)) {
86
+ try {
87
+ const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
88
+ const allDeps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
89
+ hasDynamoE2E = '@futdevpro/dynamo-e2e' in allDeps;
90
+ hasPlaywrightTest = '@playwright/test' in allDeps;
91
+ }
92
+ catch (e) { /* swallow */ }
93
+ }
94
+ const hasPlaywrightConfig = fs.existsSync(`${cwd}/playwright.config.ts`) || fs.existsSync(`${cwd}/playwright.config.js`);
95
+ const hasE2EDir = fs.existsSync(`${cwd}/e2e`) || fs.existsSync(`${cwd}/tests`);
96
+ const hasCicdConfig = fs.existsSync(`${cwd}/.dynamo/pipeline.cicd.config.json`);
97
+ const suggestions = [];
98
+ if (!hasDynamoE2E) {
99
+ suggestions.push('Install: pnpm add -D @futdevpro/dynamo-e2e');
100
+ }
101
+ if (!hasPlaywrightTest) {
102
+ suggestions.push('Install: pnpm add -D @playwright/test');
103
+ }
104
+ if (!hasPlaywrightConfig) {
105
+ suggestions.push('Create: playwright.config.ts — lásd getting-started.md');
106
+ }
107
+ if (!hasE2EDir) {
108
+ suggestions.push('Create: e2e/ folder a generated spec-eknek');
109
+ }
110
+ if (!hasCicdConfig) {
111
+ suggestions.push('Optional: .dynamo/pipeline.cicd.config.json — Overseer CICD step (lásd overseer-step-template.md)');
112
+ }
113
+ return {
114
+ hasDynamoE2E,
115
+ hasPlaywrightTest,
116
+ hasPlaywrightConfig,
117
+ hasE2EDir,
118
+ hasCicdConfig,
119
+ suggestions,
120
+ };
121
+ }
65
122
  static versionText(version) {
66
123
  return `@futdevpro/dynamo-e2e ${version}`;
67
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-runner.util.js","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":";;;AAAA,kEAAoE;AACpE,0EAA4E;AAC5E,uEAAyE;AAKzE;;;;;GAKG;AACH,MAAa,oBAAoB;IAE/B,MAAM,CAAC,SAAS,CAAC,IAAc;QAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACxC,CAAC;QACD,MAAM,OAAO,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAW,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjC,MAAM,IAAI,GAAuB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC7C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBAClB,CAAC,EAAE,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,QAAQ;QACb,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BV,CAAC;IACA,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,OAAe;QAChC,OAAO,yBAAyB,OAAO,EAAE,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,WAAW,CAChB,OAAgF,EAChF,UAAkB;QAElB,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;YACtC,OAAO,gDAAyB,CAAC,IAAI,CAAC,MAAyC,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,OAAO,KAAK,yBAAyB,EAAE,CAAC;YAC1C,OAAO,wDAA6B,CAAC,IAAI,CAAC,MAA6C,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,OAAO,KAAK,mBAAmB,EAAE,CAAC;YACpC,OAAO,8CAAwB,CAAC,IAAI,CAAC,MAAwC,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;CACF;AA9ED,oDA8EC"}
1
+ {"version":3,"file":"cli-runner.util.js","sourceRoot":"","sources":["../../../../src/_modules/generators/_collections/cli-runner.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=doctor.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.spec.d.ts","sourceRoot":"","sources":["../../../src/_modules/generators/doctor.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const cli_runner_util_1 = require("./_collections/cli-runner.util");
4
+ describe('| dynamo-e2e | CLI doctor (v01.10)', () => {
5
+ function mockFs(files) {
6
+ return {
7
+ existsSync: (p) => p in files,
8
+ readFileSync: (p, _enc) => files[p] ?? '',
9
+ };
10
+ }
11
+ it('| üres projekt → MIND ✗ + 5 suggestion', () => {
12
+ const fs = mockFs({});
13
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
14
+ expect(report.hasDynamoE2E).toBe(false);
15
+ expect(report.hasPlaywrightTest).toBe(false);
16
+ expect(report.hasPlaywrightConfig).toBe(false);
17
+ expect(report.hasE2EDir).toBe(false);
18
+ expect(report.hasCicdConfig).toBe(false);
19
+ expect(report.suggestions.length).toBe(5);
20
+ });
21
+ it('| dynamo-e2e + playwright installed → 2 ✓', () => {
22
+ const fs = mockFs({
23
+ '/proj/package.json': JSON.stringify({
24
+ devDependencies: { '@futdevpro/dynamo-e2e': '^1.0', '@playwright/test': '^1.48' },
25
+ }),
26
+ });
27
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
28
+ expect(report.hasDynamoE2E).toBe(true);
29
+ expect(report.hasPlaywrightTest).toBe(true);
30
+ });
31
+ it('| playwright.config.ts present', () => {
32
+ const fs = mockFs({ '/proj/playwright.config.ts': '' });
33
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
34
+ expect(report.hasPlaywrightConfig).toBe(true);
35
+ });
36
+ it('| e2e/ dir present', () => {
37
+ const fs = mockFs({ '/proj/e2e': '' });
38
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
39
+ expect(report.hasE2EDir).toBe(true);
40
+ });
41
+ it('| .dynamo/pipeline.cicd.config.json present', () => {
42
+ const fs = mockFs({ '/proj/.dynamo/pipeline.cicd.config.json': '{}' });
43
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
44
+ expect(report.hasCicdConfig).toBe(true);
45
+ });
46
+ it('| helpText "doctor" parancsot megemlít', () => {
47
+ const help = cli_runner_util_1.DyE2E_CliRunner_Util.helpText();
48
+ expect(help).toContain('doctor');
49
+ });
50
+ it('| invalid package.json → swallow + false-flagek', () => {
51
+ const fs = mockFs({ '/proj/package.json': '{not-valid-json' });
52
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
53
+ expect(report.hasDynamoE2E).toBe(false);
54
+ });
55
+ it('| minden ✓ → suggestions []', () => {
56
+ const fs = mockFs({
57
+ '/proj/package.json': JSON.stringify({
58
+ devDependencies: { '@futdevpro/dynamo-e2e': '^1.0', '@playwright/test': '^1.48' },
59
+ }),
60
+ '/proj/playwright.config.ts': '',
61
+ '/proj/e2e': '',
62
+ '/proj/.dynamo/pipeline.cicd.config.json': '{}',
63
+ });
64
+ const report = cli_runner_util_1.DyE2E_CliRunner_Util.doctorReport('/proj', fs);
65
+ expect(report.suggestions.length).toBe(0);
66
+ });
67
+ });
68
+ //# sourceMappingURL=doctor.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.spec.js","sourceRoot":"","sources":["../../../src/_modules/generators/doctor.spec.ts"],"names":[],"mappings":"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"}
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-06-10T05:40:51.967Z
104
+ at 2026-06-10T06:03:15.190Z
105
105
  </div>
106
106
  <script src="../../prettify.js"></script>
107
107
  <script>
@@ -82,7 +82,7 @@ export * from './test-case-sets/field-type-registry.const';
82
82
  <div class='footer quiet pad2 space-top1 center small'>
83
83
  Code coverage generated by
84
84
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
85
- at 2026-06-10T05:40:51.967Z
85
+ at 2026-06-10T06:03:15.190Z
86
86
  </div>
87
87
  <script src="../../prettify.js"></script>
88
88
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-06-10T05:40:51.967Z
104
+ at 2026-06-10T06:03:15.190Z
105
105
  </div>
106
106
  <script src="../../../prettify.js"></script>
107
107
  <script>
@@ -157,7 +157,7 @@ export class DyE2E_TestId_Util {
157
157
  <div class='footer quiet pad2 space-top1 center small'>
158
158
  Code coverage generated by
159
159
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
160
- at 2026-06-10T05:40:51.967Z
160
+ at 2026-06-10T06:03:15.190Z
161
161
  </div>
162
162
  <script src="../../../prettify.js"></script>
163
163
  <script>
@@ -130,7 +130,7 @@ export enum DyE2E_CWVMetric_Type {
130
130
  <div class='footer quiet pad2 space-top1 center small'>
131
131
  Code coverage generated by
132
132
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
133
- at 2026-06-10T05:40:51.967Z
133
+ at 2026-06-10T06:03:15.190Z
134
134
  </div>
135
135
  <script src="../../prettify.js"></script>
136
136
  <script>