@futdevpro/dynamo-e2e 1.14.0 → 1.16.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 (145) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/README.md +2 -2
  3. package/bin/dye2e.js +81 -0
  4. package/build/_modules/generators/_collections/cli-runner.util.d.ts.map +1 -1
  5. package/build/_modules/generators/_collections/cli-runner.util.js +9 -0
  6. package/build/_modules/generators/_collections/cli-runner.util.js.map +1 -1
  7. package/build/_modules/generators/_collections/config-validator.util.d.ts +23 -0
  8. package/build/_modules/generators/_collections/config-validator.util.d.ts.map +1 -0
  9. package/build/_modules/generators/_collections/config-validator.util.js +94 -0
  10. package/build/_modules/generators/_collections/config-validator.util.js.map +1 -0
  11. package/build/_modules/generators/_collections/json-schema.util.d.ts +16 -0
  12. package/build/_modules/generators/_collections/json-schema.util.d.ts.map +1 -0
  13. package/build/_modules/generators/_collections/json-schema.util.js +190 -0
  14. package/build/_modules/generators/_collections/json-schema.util.js.map +1 -0
  15. package/build/_modules/generators/_collections/preset-configs.const.d.ts +14 -0
  16. package/build/_modules/generators/_collections/preset-configs.const.d.ts.map +1 -0
  17. package/build/_modules/generators/_collections/preset-configs.const.js +76 -0
  18. package/build/_modules/generators/_collections/preset-configs.const.js.map +1 -0
  19. package/build/_modules/generators/config-validator.spec.d.ts +2 -0
  20. package/build/_modules/generators/config-validator.spec.d.ts.map +1 -0
  21. package/build/_modules/generators/config-validator.spec.js +115 -0
  22. package/build/_modules/generators/config-validator.spec.js.map +1 -0
  23. package/build/_modules/generators/index.d.ts +3 -0
  24. package/build/_modules/generators/index.d.ts.map +1 -1
  25. package/build/_modules/generators/index.js +3 -0
  26. package/build/_modules/generators/index.js.map +1 -1
  27. package/build/_modules/generators/json-schema.spec.d.ts +2 -0
  28. package/build/_modules/generators/json-schema.spec.d.ts.map +1 -0
  29. package/build/_modules/generators/json-schema.spec.js +81 -0
  30. package/build/_modules/generators/json-schema.spec.js.map +1 -0
  31. package/build/_modules/generators/preset-configs.spec.d.ts +2 -0
  32. package/build/_modules/generators/preset-configs.spec.d.ts.map +1 -0
  33. package/build/_modules/generators/preset-configs.spec.js +53 -0
  34. package/build/_modules/generators/preset-configs.spec.js.map +1 -0
  35. package/coverage/contracts/_collections/index.html +1 -1
  36. package/coverage/contracts/_collections/index.ts.html +1 -1
  37. package/coverage/contracts/_collections/utils/index.html +1 -1
  38. package/coverage/contracts/_collections/utils/test-id.util.ts.html +8 -8
  39. package/coverage/contracts/_enums/cwv-metric-type.enum.ts.html +1 -1
  40. package/coverage/contracts/_enums/field-test-case-type.enum.ts.html +1 -1
  41. package/coverage/contracts/_enums/index.html +1 -1
  42. package/coverage/contracts/_enums/index.ts.html +1 -1
  43. package/coverage/contracts/_enums/standard-viewport.enum.ts.html +1 -1
  44. package/coverage/contracts/_enums/test-expectation-type.enum.ts.html +1 -1
  45. package/coverage/contracts/_enums/test-run-mode-type.enum.ts.html +1 -1
  46. package/coverage/contracts/index.html +1 -1
  47. package/coverage/contracts/index.ts.html +1 -1
  48. package/coverage/cwv/_collections/cwv-aggregator.util.ts.html +1 -1
  49. package/coverage/cwv/_collections/cwv-comparison.util.ts.html +1 -1
  50. package/coverage/cwv/_collections/cwv-diagnose.util.ts.html +1 -1
  51. package/coverage/cwv/_collections/cwv-emission.util.ts.html +104 -104
  52. package/coverage/cwv/_collections/cwv-summarize.util.ts.html +1 -1
  53. package/coverage/cwv/_collections/index.html +5 -5
  54. package/coverage/cwv/_collections/inp-interaction-script.const.ts.html +1 -1
  55. package/coverage/cwv/_collections/web-vitals-page-script.const.ts.html +1 -1
  56. package/coverage/cwv/cwv-suite.generator.ts.html +44 -44
  57. package/coverage/cwv/index.html +3 -3
  58. package/coverage/generators/_collections/cli-runner.util.ts.html +80 -53
  59. package/coverage/generators/_collections/config-validator.util.ts.html +397 -0
  60. package/coverage/generators/_collections/field-emission.util.ts.html +86 -86
  61. package/coverage/generators/_collections/form-level-emission.util.ts.html +34 -34
  62. package/coverage/generators/_collections/index.html +65 -20
  63. package/coverage/generators/_collections/json-schema.util.ts.html +652 -0
  64. package/coverage/generators/_collections/preset-configs.const.ts.html +328 -0
  65. package/coverage/generators/_collections/spec-emission.util.ts.html +32 -32
  66. package/coverage/generators/_collections/test-case-filter.util.ts.html +64 -64
  67. package/coverage/generators/_collections/viewport-emission.util.ts.html +58 -58
  68. package/coverage/generators/form-suite.generator.ts.html +70 -70
  69. package/coverage/generators/index.html +6 -6
  70. package/coverage/generators/viewport-suite.generator.ts.html +48 -48
  71. package/coverage/index.html +23 -23
  72. package/coverage/lcov-report/contracts/_collections/index.html +1 -1
  73. package/coverage/lcov-report/contracts/_collections/index.ts.html +1 -1
  74. package/coverage/lcov-report/contracts/_collections/utils/index.html +1 -1
  75. package/coverage/lcov-report/contracts/_collections/utils/test-id.util.ts.html +8 -8
  76. package/coverage/lcov-report/contracts/_enums/cwv-metric-type.enum.ts.html +1 -1
  77. package/coverage/lcov-report/contracts/_enums/field-test-case-type.enum.ts.html +1 -1
  78. package/coverage/lcov-report/contracts/_enums/index.html +1 -1
  79. package/coverage/lcov-report/contracts/_enums/index.ts.html +1 -1
  80. package/coverage/lcov-report/contracts/_enums/standard-viewport.enum.ts.html +1 -1
  81. package/coverage/lcov-report/contracts/_enums/test-expectation-type.enum.ts.html +1 -1
  82. package/coverage/lcov-report/contracts/_enums/test-run-mode-type.enum.ts.html +1 -1
  83. package/coverage/lcov-report/contracts/index.html +1 -1
  84. package/coverage/lcov-report/contracts/index.ts.html +1 -1
  85. package/coverage/lcov-report/cwv/_collections/cwv-aggregator.util.ts.html +1 -1
  86. package/coverage/lcov-report/cwv/_collections/cwv-comparison.util.ts.html +1 -1
  87. package/coverage/lcov-report/cwv/_collections/cwv-diagnose.util.ts.html +1 -1
  88. package/coverage/lcov-report/cwv/_collections/cwv-emission.util.ts.html +104 -104
  89. package/coverage/lcov-report/cwv/_collections/cwv-summarize.util.ts.html +1 -1
  90. package/coverage/lcov-report/cwv/_collections/index.html +5 -5
  91. package/coverage/lcov-report/cwv/_collections/inp-interaction-script.const.ts.html +1 -1
  92. package/coverage/lcov-report/cwv/_collections/web-vitals-page-script.const.ts.html +1 -1
  93. package/coverage/lcov-report/cwv/cwv-suite.generator.ts.html +44 -44
  94. package/coverage/lcov-report/cwv/index.html +3 -3
  95. package/coverage/lcov-report/generators/_collections/cli-runner.util.ts.html +80 -53
  96. package/coverage/lcov-report/generators/_collections/config-validator.util.ts.html +397 -0
  97. package/coverage/lcov-report/generators/_collections/field-emission.util.ts.html +86 -86
  98. package/coverage/lcov-report/generators/_collections/form-level-emission.util.ts.html +34 -34
  99. package/coverage/lcov-report/generators/_collections/index.html +65 -20
  100. package/coverage/lcov-report/generators/_collections/json-schema.util.ts.html +652 -0
  101. package/coverage/lcov-report/generators/_collections/preset-configs.const.ts.html +328 -0
  102. package/coverage/lcov-report/generators/_collections/spec-emission.util.ts.html +32 -32
  103. package/coverage/lcov-report/generators/_collections/test-case-filter.util.ts.html +64 -64
  104. package/coverage/lcov-report/generators/_collections/viewport-emission.util.ts.html +58 -58
  105. package/coverage/lcov-report/generators/form-suite.generator.ts.html +70 -70
  106. package/coverage/lcov-report/generators/index.html +6 -6
  107. package/coverage/lcov-report/generators/viewport-suite.generator.ts.html +48 -48
  108. package/coverage/lcov-report/index.html +23 -23
  109. package/coverage/lcov-report/runtime/_collections/assertion-helpers.util.ts.html +1 -1
  110. package/coverage/lcov-report/runtime/_collections/index.html +1 -1
  111. package/coverage/lcov-report/runtime/_collections/unique-generator.util.ts.html +1 -1
  112. package/coverage/lcov-report/runtime/_collections/wait-helpers.util.ts.html +5 -5
  113. package/coverage/lcov-report/runtime/_services/dialog-page-object.ts.html +1 -1
  114. package/coverage/lcov-report/runtime/_services/field-page-object.ts.html +1 -1
  115. package/coverage/lcov-report/runtime/_services/form-page-object.ts.html +1 -1
  116. package/coverage/lcov-report/runtime/_services/index.html +1 -1
  117. package/coverage/lcov-report/runtime/_services/loader-page-object.ts.html +1 -1
  118. package/coverage/lcov-report/runtime/_services/logger.service.ts.html +1 -1
  119. package/coverage/lcov-report/runtime/_services/login-flow-helper.base.ts.html +1 -1
  120. package/coverage/lcov-report/runtime/_services/nav-page-object.ts.html +1 -1
  121. package/coverage/lcov-report/runtime/_services/toast-page-object.ts.html +1 -1
  122. package/coverage/lcov-report/runtime/_services/wave-2b-page-objects.ts.html +1 -1
  123. package/coverage/lcov-report/runtime/index.html +1 -1
  124. package/coverage/lcov-report/runtime/index.ts.html +1 -1
  125. package/coverage/lcov.info +1352 -878
  126. package/coverage/runtime/_collections/assertion-helpers.util.ts.html +1 -1
  127. package/coverage/runtime/_collections/index.html +1 -1
  128. package/coverage/runtime/_collections/unique-generator.util.ts.html +1 -1
  129. package/coverage/runtime/_collections/wait-helpers.util.ts.html +5 -5
  130. package/coverage/runtime/_services/dialog-page-object.ts.html +1 -1
  131. package/coverage/runtime/_services/field-page-object.ts.html +1 -1
  132. package/coverage/runtime/_services/form-page-object.ts.html +1 -1
  133. package/coverage/runtime/_services/index.html +1 -1
  134. package/coverage/runtime/_services/loader-page-object.ts.html +1 -1
  135. package/coverage/runtime/_services/logger.service.ts.html +1 -1
  136. package/coverage/runtime/_services/login-flow-helper.base.ts.html +1 -1
  137. package/coverage/runtime/_services/nav-page-object.ts.html +1 -1
  138. package/coverage/runtime/_services/toast-page-object.ts.html +1 -1
  139. package/coverage/runtime/_services/wave-2b-page-objects.ts.html +1 -1
  140. package/coverage/runtime/index.html +1 -1
  141. package/coverage/runtime/index.ts.html +1 -1
  142. package/coverage/tmp/{coverage-207124-1781074674403-0.json → coverage-228636-1781075225757-0.json} +1 -1
  143. package/coverage/tmp/coverage-228704-1781075227108-0.json +1 -0
  144. package/package.json +1 -1
  145. package/coverage/tmp/coverage-142636-1781074676409-0.json +0 -1
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">100% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>269/269</span>
28
+ <span class='fraction'>278/278</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">100% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>269/269</span>
49
+ <span class='fraction'>278/278</span>
50
50
  </div>
51
51
 
52
52
 
@@ -332,7 +332,16 @@
332
332
  <a name='L267'></a><a href='#L267'>267</a>
333
333
  <a name='L268'></a><a href='#L268'>268</a>
334
334
  <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
336
345
  <span class="cline-any cline-yes">1x</span>
337
346
  <span class="cline-any cline-yes">1x</span>
338
347
  <span class="cline-any cline-yes">1x</span>
@@ -370,55 +379,64 @@
370
379
  <span class="cline-any cline-yes">3x</span>
371
380
  <span class="cline-any cline-yes">1x</span>
372
381
  <span class="cline-any cline-yes">1x</span>
373
- <span class="cline-any cline-yes">4x</span>
374
- <span class="cline-any cline-yes">4x</span>
375
- <span class="cline-any cline-yes">4x</span>
376
- <span class="cline-any cline-yes">4x</span>
377
- <span class="cline-any cline-yes">4x</span>
378
- <span class="cline-any cline-yes">4x</span>
379
- <span class="cline-any cline-yes">4x</span>
380
- <span class="cline-any cline-yes">4x</span>
381
- <span class="cline-any cline-yes">4x</span>
382
- <span class="cline-any cline-yes">4x</span>
383
- <span class="cline-any cline-yes">4x</span>
384
- <span class="cline-any cline-yes">4x</span>
385
- <span class="cline-any cline-yes">4x</span>
386
- <span class="cline-any cline-yes">4x</span>
387
- <span class="cline-any cline-yes">4x</span>
388
- <span class="cline-any cline-yes">4x</span>
389
- <span class="cline-any cline-yes">4x</span>
390
- <span class="cline-any cline-yes">4x</span>
391
- <span class="cline-any cline-yes">4x</span>
392
- <span class="cline-any cline-yes">4x</span>
393
- <span class="cline-any cline-yes">4x</span>
394
- <span class="cline-any cline-yes">4x</span>
395
- <span class="cline-any cline-yes">4x</span>
396
- <span class="cline-any cline-yes">4x</span>
397
- <span class="cline-any cline-yes">4x</span>
398
- <span class="cline-any cline-yes">4x</span>
399
- <span class="cline-any cline-yes">4x</span>
400
- <span class="cline-any cline-yes">4x</span>
401
- <span class="cline-any cline-yes">4x</span>
402
- <span class="cline-any cline-yes">4x</span>
403
- <span class="cline-any cline-yes">4x</span>
404
- <span class="cline-any cline-yes">4x</span>
405
- <span class="cline-any cline-yes">4x</span>
406
- <span class="cline-any cline-yes">4x</span>
407
- <span class="cline-any cline-yes">4x</span>
408
- <span class="cline-any cline-yes">4x</span>
409
- <span class="cline-any cline-yes">4x</span>
410
- <span class="cline-any cline-yes">4x</span>
411
- <span class="cline-any cline-yes">4x</span>
412
- <span class="cline-any cline-yes">4x</span>
413
- <span class="cline-any cline-yes">4x</span>
414
- <span class="cline-any cline-yes">4x</span>
415
- <span class="cline-any cline-yes">4x</span>
416
- <span class="cline-any cline-yes">4x</span>
417
- <span class="cline-any cline-yes">4x</span>
418
- <span class="cline-any cline-yes">4x</span>
419
- <span class="cline-any cline-yes">4x</span>
420
- <span class="cline-any cline-yes">4x</span>
421
- <span class="cline-any cline-yes">4x</span>
382
+ <span class="cline-any cline-yes">5x</span>
383
+ <span class="cline-any cline-yes">5x</span>
384
+ <span class="cline-any cline-yes">5x</span>
385
+ <span class="cline-any cline-yes">5x</span>
386
+ <span class="cline-any cline-yes">5x</span>
387
+ <span class="cline-any cline-yes">5x</span>
388
+ <span class="cline-any cline-yes">5x</span>
389
+ <span class="cline-any cline-yes">5x</span>
390
+ <span class="cline-any cline-yes">5x</span>
391
+ <span class="cline-any cline-yes">5x</span>
392
+ <span class="cline-any cline-yes">5x</span>
393
+ <span class="cline-any cline-yes">5x</span>
394
+ <span class="cline-any cline-yes">5x</span>
395
+ <span class="cline-any cline-yes">5x</span>
396
+ <span class="cline-any cline-yes">5x</span>
397
+ <span class="cline-any cline-yes">5x</span>
398
+ <span class="cline-any cline-yes">5x</span>
399
+ <span class="cline-any cline-yes">5x</span>
400
+ <span class="cline-any cline-yes">5x</span>
401
+ <span class="cline-any cline-yes">5x</span>
402
+ <span class="cline-any cline-yes">5x</span>
403
+ <span class="cline-any cline-yes">5x</span>
404
+ <span class="cline-any cline-yes">5x</span>
405
+ <span class="cline-any cline-yes">5x</span>
406
+ <span class="cline-any cline-yes">5x</span>
407
+ <span class="cline-any cline-yes">5x</span>
408
+ <span class="cline-any cline-yes">5x</span>
409
+ <span class="cline-any cline-yes">5x</span>
410
+ <span class="cline-any cline-yes">5x</span>
411
+ <span class="cline-any cline-yes">5x</span>
412
+ <span class="cline-any cline-yes">5x</span>
413
+ <span class="cline-any cline-yes">5x</span>
414
+ <span class="cline-any cline-yes">5x</span>
415
+ <span class="cline-any cline-yes">5x</span>
416
+ <span class="cline-any cline-yes">5x</span>
417
+ <span class="cline-any cline-yes">5x</span>
418
+ <span class="cline-any cline-yes">5x</span>
419
+ <span class="cline-any cline-yes">5x</span>
420
+ <span class="cline-any cline-yes">5x</span>
421
+ <span class="cline-any cline-yes">5x</span>
422
+ <span class="cline-any cline-yes">5x</span>
423
+ <span class="cline-any cline-yes">5x</span>
424
+ <span class="cline-any cline-yes">5x</span>
425
+ <span class="cline-any cline-yes">5x</span>
426
+ <span class="cline-any cline-yes">5x</span>
427
+ <span class="cline-any cline-yes">5x</span>
428
+ <span class="cline-any cline-yes">5x</span>
429
+ <span class="cline-any cline-yes">5x</span>
430
+ <span class="cline-any cline-yes">5x</span>
431
+ <span class="cline-any cline-yes">5x</span>
432
+ <span class="cline-any cline-yes">5x</span>
433
+ <span class="cline-any cline-yes">5x</span>
434
+ <span class="cline-any cline-yes">5x</span>
435
+ <span class="cline-any cline-yes">5x</span>
436
+ <span class="cline-any cline-yes">5x</span>
437
+ <span class="cline-any cline-yes">5x</span>
438
+ <span class="cline-any cline-yes">5x</span>
439
+ <span class="cline-any cline-yes">5x</span>
422
440
  <span class="cline-any cline-yes">1x</span>
423
441
  <span class="cline-any cline-yes">1x</span>
424
442
  <span class="cline-any cline-yes">1x</span>
@@ -653,6 +671,8 @@ Commands:
653
671
  summarize Read CWV JSON-report → human-readable summary
654
672
  diff Compare two CWV reports → regression analysis
655
673
  info Show registered field-types + CLI capabilities
674
+ schema Print JSON Schema for a config type
675
+ validate-config Validate a config file against its JSON Schema
656
676
  version Print package version
657
677
  help This message
658
678
  &nbsp;
@@ -686,6 +706,13 @@ Flags (diff):
686
706
  --old &lt;path&gt; Path to baseline CWV JSON-report
687
707
  --new &lt;path&gt; Path to current CWV JSON-report
688
708
  --tolerance &lt;pct&gt; Stable-tolerance % (default 5)
709
+ &nbsp;
710
+ Flags (schema):
711
+ --type &lt;type&gt; Schema type: 'form-suite' | 'viewport-audit' | 'cwv-diag'
712
+ &nbsp;
713
+ Flags (validate-config):
714
+ --config &lt;path&gt; Path to config file
715
+ --type &lt;type&gt; Schema type: 'form-suite' | 'viewport-audit' | 'cwv-diag'
689
716
  `;
690
717
  }
691
718
  &nbsp;
@@ -877,7 +904,7 @@ Docs: github.com/futdevpro/dynamo-e2e/__documentations/
877
904
  <div class='footer quiet pad2 space-top1 center small'>
878
905
  Code coverage generated by
879
906
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
880
- at 2026-06-10T06:57:57.053Z
907
+ at 2026-06-10T07:07:07.643Z
881
908
  </div>
882
909
  <script src="../../prettify.js"></script>
883
910
  <script>
@@ -0,0 +1,397 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for generators/_collections/config-validator.util.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">generators/_collections</a> config-validator.util.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">94.23% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>98/104</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">87.5% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>35/40</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">100% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>4/4</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">94.23% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>98/104</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
171
+ <span class="cline-any cline-yes">1x</span>
172
+ <span class="cline-any cline-yes">1x</span>
173
+ <span class="cline-any cline-yes">1x</span>
174
+ <span class="cline-any cline-yes">1x</span>
175
+ <span class="cline-any cline-yes">1x</span>
176
+ <span class="cline-any cline-yes">1x</span>
177
+ <span class="cline-any cline-yes">1x</span>
178
+ <span class="cline-any cline-yes">1x</span>
179
+ <span class="cline-any cline-yes">1x</span>
180
+ <span class="cline-any cline-yes">1x</span>
181
+ <span class="cline-any cline-yes">1x</span>
182
+ <span class="cline-any cline-yes">1x</span>
183
+ <span class="cline-any cline-yes">1x</span>
184
+ <span class="cline-any cline-yes">1x</span>
185
+ <span class="cline-any cline-yes">1x</span>
186
+ <span class="cline-any cline-yes">1x</span>
187
+ <span class="cline-any cline-yes">1x</span>
188
+ <span class="cline-any cline-yes">1x</span>
189
+ <span class="cline-any cline-yes">1x</span>
190
+ <span class="cline-any cline-yes">1x</span>
191
+ <span class="cline-any cline-yes">18x</span>
192
+ <span class="cline-any cline-yes">18x</span>
193
+ <span class="cline-any cline-yes">18x</span>
194
+ <span class="cline-any cline-yes">18x</span>
195
+ <span class="cline-any cline-yes">1x</span>
196
+ <span class="cline-any cline-yes">1x</span>
197
+ <span class="cline-any cline-yes">51x</span>
198
+ <span class="cline-any cline-no">&nbsp;</span>
199
+ <span class="cline-any cline-no">&nbsp;</span>
200
+ <span class="cline-any cline-yes">51x</span>
201
+ <span class="cline-any cline-yes">51x</span>
202
+ <span class="cline-any cline-yes">51x</span>
203
+ <span class="cline-any cline-yes">49x</span>
204
+ <span class="cline-any cline-yes">49x</span>
205
+ <span class="cline-any cline-yes">2x</span>
206
+ <span class="cline-any cline-yes">2x</span>
207
+ <span class="cline-any cline-yes">2x</span>
208
+ <span class="cline-any cline-yes">49x</span>
209
+ <span class="cline-any cline-yes">49x</span>
210
+ <span class="cline-any cline-yes">49x</span>
211
+ <span class="cline-any cline-yes">51x</span>
212
+ <span class="cline-any cline-yes">2x</span>
213
+ <span class="cline-any cline-yes">2x</span>
214
+ <span class="cline-any cline-yes">49x</span>
215
+ <span class="cline-any cline-yes">49x</span>
216
+ <span class="cline-any cline-yes">51x</span>
217
+ <span class="cline-any cline-yes">2x</span>
218
+ <span class="cline-any cline-yes">2x</span>
219
+ <span class="cline-any cline-yes">49x</span>
220
+ <span class="cline-any cline-yes">49x</span>
221
+ <span class="cline-any cline-yes">51x</span>
222
+ <span class="cline-any cline-yes">16x</span>
223
+ <span class="cline-any cline-yes">16x</span>
224
+ <span class="cline-any cline-yes">15x</span>
225
+ <span class="cline-any cline-yes">26x</span>
226
+ <span class="cline-any cline-yes">2x</span>
227
+ <span class="cline-any cline-yes">2x</span>
228
+ <span class="cline-any cline-yes">26x</span>
229
+ <span class="cline-any cline-yes">15x</span>
230
+ <span class="cline-any cline-yes">16x</span>
231
+ <span class="cline-any cline-yes">16x</span>
232
+ <span class="cline-any cline-yes">94x</span>
233
+ <span class="cline-any cline-yes">28x</span>
234
+ <span class="cline-any cline-yes">28x</span>
235
+ <span class="cline-any cline-yes">94x</span>
236
+ <span class="cline-any cline-yes">16x</span>
237
+ <span class="cline-any cline-yes">16x</span>
238
+ <span class="cline-any cline-yes">49x</span>
239
+ <span class="cline-any cline-yes">49x</span>
240
+ <span class="cline-any cline-yes">51x</span>
241
+ <span class="cline-any cline-yes">6x</span>
242
+ <span class="cline-any cline-yes">1x</span>
243
+ <span class="cline-any cline-yes">1x</span>
244
+ <span class="cline-any cline-yes">6x</span>
245
+ <span class="cline-any cline-yes">5x</span>
246
+ <span class="cline-any cline-yes">5x</span>
247
+ <span class="cline-any cline-yes">6x</span>
248
+ <span class="cline-any cline-yes">51x</span>
249
+ <span class="cline-any cline-yes">1x</span>
250
+ <span class="cline-any cline-yes">1x</span>
251
+ <span class="cline-any cline-yes">100x</span>
252
+ <span class="cline-any cline-no">&nbsp;</span>
253
+ <span class="cline-any cline-no">&nbsp;</span>
254
+ <span class="cline-any cline-yes">100x</span>
255
+ <span class="cline-any cline-yes">14x</span>
256
+ <span class="cline-any cline-yes">14x</span>
257
+ <span class="cline-any cline-yes">86x</span>
258
+ <span class="cline-any cline-yes">86x</span>
259
+ <span class="cline-any cline-yes">1x</span>
260
+ <span class="cline-any cline-yes">1x</span>
261
+ <span class="cline-any cline-yes">98x</span>
262
+ <span class="cline-any cline-yes">98x</span>
263
+ <span class="cline-any cline-yes">98x</span>
264
+ <span class="cline-any cline-yes">100x</span>
265
+ <span class="cline-any cline-no">&nbsp;</span>
266
+ <span class="cline-any cline-no">&nbsp;</span>
267
+ <span class="cline-any cline-yes">100x</span>
268
+ <span class="cline-any cline-yes">63x</span>
269
+ <span class="cline-any cline-yes">63x</span>
270
+ <span class="cline-any cline-yes">100x</span>
271
+ <span class="cline-any cline-yes">35x</span>
272
+ <span class="cline-any cline-yes">35x</span>
273
+ <span class="cline-any cline-yes">1x</span>
274
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
275
+ * Lightweight config-validator — `dye2e validate-config` parancs alapja.
276
+ *
277
+ * NEM teljes ajv-szintű JSON Schema validátor — csak a `required` + `type`
278
+ * + `enum` + `minimum` ellenőrzéseket fedi (a leggyakoribb hibák ~80%-a).
279
+ * Teljes draft-07 validátor: a consumer-projekt használhat `ajv`-t a
280
+ * `DyE2E_JsonSchema_Util` schémájával.
281
+ */
282
+ &nbsp;
283
+ export interface DyE2E_ValidationError {
284
+ path: string;
285
+ message: string;
286
+ }
287
+ &nbsp;
288
+ export class DyE2E_ConfigValidator_Util {
289
+ &nbsp;
290
+ /**
291
+ * Egy `data` objektumot validál egy `schema` JSON-Schema (draft-07) ellen.
292
+ * Visszaadja a hibákat — üres tömb = valid.
293
+ */
294
+ static validate(data: unknown, schema: any, basePath: string = '$'): DyE2E_ValidationError[] {
295
+ const errors: DyE2E_ValidationError[] = [];
296
+ DyE2E_ConfigValidator_Util.walkValidate(data, schema, basePath, errors);
297
+ return errors;
298
+ }
299
+ &nbsp;
300
+ private static walkValidate(data: unknown, schema: any, path: string, errors: DyE2E_ValidationError[]): void {
301
+ if (!schema || typeof schema !== 'object') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
302
+ <span class="cstat-no" title="statement not covered" > return;</span>
303
+ <span class="cstat-no" title="statement not covered" > }</span>
304
+ &nbsp;
305
+ // Type check
306
+ if (schema.type) {
307
+ const ok: boolean = DyE2E_ConfigValidator_Util.typeMatches(data, schema.type);
308
+ if (!ok) {
309
+ errors.push({ path: path, message: `expected type "${Array.isArray(schema.type) ? schema.type.join('|') : schema.type}", got "${DyE2E_ConfigValidator_Util.typeOf(data)}"` });
310
+ return; // ne menjünk tovább rossz type-on
311
+ }
312
+ }
313
+ &nbsp;
314
+ // Enum check
315
+ if (Array.isArray(schema.enum) &amp;&amp; schema.enum.indexOf(data) === -1) {
316
+ errors.push({ path: path, message: `value not in enum: ${schema.enum.join(', ')}` });
317
+ }
318
+ &nbsp;
319
+ // Number minimum
320
+ if (typeof data === 'number' &amp;&amp; typeof schema.minimum === 'number' &amp;&amp; data &lt; schema.minimum) {
321
+ errors.push({ path: path, message: `value ${data} below minimum ${schema.minimum}` });
322
+ }
323
+ &nbsp;
324
+ // Object — required + properties
325
+ if (DyE2E_ConfigValidator_Util.typeMatches(data, 'object') &amp;&amp; typeof data === 'object' &amp;&amp; data !== null) {
326
+ const obj: Record&lt;string, unknown&gt; = data as Record&lt;string, unknown&gt;;
327
+ if (Array.isArray(schema.required)) {
328
+ for (const r of schema.required) {
329
+ if (!(r in obj)) {
330
+ errors.push({ path: `${path}.${r}`, message: `required property missing` });
331
+ }
332
+ }
333
+ }
334
+ if (schema.properties &amp;&amp; typeof schema.properties === 'object') {
335
+ for (const k of Object.keys(schema.properties)) {
336
+ if (k in obj) {
337
+ DyE2E_ConfigValidator_Util.walkValidate(obj[k], schema.properties[k], `${path}.${k}`, errors);
338
+ }
339
+ }
340
+ }
341
+ }
342
+ &nbsp;
343
+ // Array — items
344
+ if (Array.isArray(data) &amp;&amp; schema.items) {
345
+ if (typeof schema.minItems === 'number' &amp;&amp; data.length &lt; schema.minItems) {
346
+ errors.push({ path: path, message: `array length ${data.length} below minItems ${schema.minItems}` });
347
+ }
348
+ for (let i: number = 0; i &lt; data.length; i++) {
349
+ DyE2E_ConfigValidator_Util.walkValidate(data[i], schema.items, `${path}[${i}]`, errors);
350
+ }
351
+ }
352
+ }
353
+ &nbsp;
354
+ private static typeOf(data: unknown): string {
355
+ if (data === null) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
356
+ <span class="cstat-no" title="statement not covered" > return 'null';</span>
357
+ <span class="cstat-no" title="statement not covered" > }</span>
358
+ if (Array.isArray(data)) {
359
+ return 'array';
360
+ }
361
+ return typeof data;
362
+ }
363
+ &nbsp;
364
+ private static typeMatches(data: unknown, type: string | string[]): boolean {
365
+ const actual: string = DyE2E_ConfigValidator_Util.typeOf(data);
366
+ const types: string[] = Array.isArray(type) ? type : [type];
367
+ for (const t of types) {
368
+ if (t === 'integer'<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; actual === 'number'<span class="branch-0 cbranch-no" title="branch not covered" > </span>&amp;&amp; Number.isInteger(data as number))</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
369
+ <span class="cstat-no" title="statement not covered" > return true;</span>
370
+ <span class="cstat-no" title="statement not covered" > }</span>
371
+ if (t === actual) {
372
+ return true;
373
+ }
374
+ }
375
+ return false;
376
+ }
377
+ }
378
+ &nbsp;</pre></td></tr></table></pre>
379
+
380
+ <div class='push'></div><!-- for sticky footer -->
381
+ </div><!-- /wrapper -->
382
+ <div class='footer quiet pad2 space-top1 center small'>
383
+ Code coverage generated by
384
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
385
+ at 2026-06-10T07:07:07.643Z
386
+ </div>
387
+ <script src="../../prettify.js"></script>
388
+ <script>
389
+ window.onload = function () {
390
+ prettyPrint();
391
+ };
392
+ </script>
393
+ <script src="../../sorter.js"></script>
394
+ <script src="../../block-navigation.js"></script>
395
+ </body>
396
+ </html>
397
+