@elliemae/encw-leak-runner 1.0.3 → 1.0.5

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 (138) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +34 -17
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/bin/leak-runner.js +80 -11
  5. package/dist/cjs/cli/commands/runCommand.js +7 -3
  6. package/dist/cjs/config/missingRequiredParamError.js +1 -1
  7. package/dist/cjs/config/requiredEnvParams.js +13 -2
  8. package/dist/cjs/config/runnerConfigLoader.js +6 -3
  9. package/dist/cjs/config/runnerConfigSchema.js +5 -1
  10. package/dist/cjs/config/unknownEnvError.js +36 -0
  11. package/dist/cjs/index.js +1 -0
  12. package/dist/cjs/runner/scenarioRunner.js +9 -1
  13. package/dist/cjs/scenarios/one-admin/export-navigation.scenario.js +10 -1
  14. package/dist/cjs/scenarios/one-admin/page-models/AdminLandingPageModel.js +42 -0
  15. package/dist/cjs/scenarios/one-admin/page-models/index.js +2 -0
  16. package/dist/esm/cli/commands/runCommand.js +11 -4
  17. package/dist/esm/config/missingRequiredParamError.js +1 -1
  18. package/dist/esm/config/requiredEnvParams.js +13 -2
  19. package/dist/esm/config/runnerConfigLoader.js +6 -3
  20. package/dist/esm/config/runnerConfigSchema.js +5 -1
  21. package/dist/esm/config/unknownEnvError.js +16 -0
  22. package/dist/esm/index.js +3 -1
  23. package/dist/esm/runner/scenarioRunner.js +9 -1
  24. package/dist/esm/scenarios/one-admin/export-navigation.scenario.js +11 -1
  25. package/dist/esm/scenarios/one-admin/page-models/AdminLandingPageModel.js +22 -0
  26. package/dist/esm/scenarios/one-admin/page-models/index.js +2 -0
  27. package/dist/types/lib/config/requiredEnvParams.d.ts +4 -2
  28. package/dist/types/lib/config/runnerConfigLoader.d.ts +1 -0
  29. package/dist/types/lib/config/runnerConfigSchema.d.ts +7 -0
  30. package/dist/types/lib/config/unknownEnvError.d.ts +5 -0
  31. package/dist/types/lib/index.d.ts +1 -1
  32. package/dist/types/lib/runner/aiEnhancementStep.d.ts +4 -3
  33. package/dist/types/lib/scenarios/one-admin/page-models/AdminLandingPageModel.d.ts +8 -0
  34. package/dist/types/lib/scenarios/one-admin/page-models/index.d.ts +1 -0
  35. package/dist/types/lib/types/scenario.d.ts +1 -0
  36. package/leak-runner.config.json +18 -0
  37. package/leak-runner.schema.json +5 -0
  38. package/lib/cli/commands/runCommand.ts +15 -5
  39. package/lib/config/missingRequiredParamError.ts +2 -2
  40. package/lib/config/requiredEnvParams.ts +14 -3
  41. package/lib/config/runnerConfigLoader.ts +12 -5
  42. package/lib/config/runnerConfigSchema.ts +4 -0
  43. package/lib/config/tests/fileConfigSource.test.ts +26 -0
  44. package/lib/config/tests/requiredEnvParams.test.ts +80 -5
  45. package/lib/config/tests/runnerConfigLoader.test.ts +30 -0
  46. package/lib/config/unknownEnvError.ts +13 -0
  47. package/lib/index.ts +1 -0
  48. package/lib/runner/aiEnhancementStep.ts +4 -3
  49. package/lib/runner/scenarioRunner.ts +8 -1
  50. package/lib/scenarios/one-admin/export-navigation.scenario.ts +13 -1
  51. package/lib/scenarios/one-admin/page-models/AdminLandingPageModel.ts +24 -0
  52. package/lib/scenarios/one-admin/page-models/index.ts +1 -0
  53. package/lib/types/scenario.ts +1 -0
  54. package/package.json +3 -3
  55. package/reports/analysis/index.html +1 -1
  56. package/reports/analysis/thresholdEvaluator.ts.html +1 -1
  57. package/reports/browser/iframeHeapProfiler.ts.html +1 -1
  58. package/reports/browser/index.html +1 -1
  59. package/reports/cli/commands/index.html +3 -3
  60. package/reports/cli/commands/listCommand.ts.html +1 -1
  61. package/reports/cli/commands/runCommand.ts.html +38 -8
  62. package/reports/cli/index.html +1 -1
  63. package/reports/cli/index.ts.html +1 -1
  64. package/reports/config/index.html +36 -21
  65. package/reports/config/missingRequiredParamError.ts.html +6 -6
  66. package/reports/config/requiredEnvParams.ts.html +61 -28
  67. package/reports/config/runnerConfigLoader.ts.html +38 -17
  68. package/reports/config/runnerConfigSchema.ts.html +18 -6
  69. package/reports/config/sources/cliOverrideConfigSource.ts.html +1 -1
  70. package/reports/config/sources/configSource.ts.html +2 -2
  71. package/reports/config/sources/envVarConfigSource.ts.html +1 -1
  72. package/reports/config/sources/fileConfigSource.ts.html +13 -13
  73. package/reports/config/sources/index.html +1 -1
  74. package/reports/config/unknownEnvError.ts.html +124 -0
  75. package/reports/index.html +35 -35
  76. package/reports/lcov-report/analysis/index.html +1 -1
  77. package/reports/lcov-report/analysis/thresholdEvaluator.ts.html +1 -1
  78. package/reports/lcov-report/browser/iframeHeapProfiler.ts.html +1 -1
  79. package/reports/lcov-report/browser/index.html +1 -1
  80. package/reports/lcov-report/cli/commands/index.html +3 -3
  81. package/reports/lcov-report/cli/commands/listCommand.ts.html +1 -1
  82. package/reports/lcov-report/cli/commands/runCommand.ts.html +38 -8
  83. package/reports/lcov-report/cli/index.html +1 -1
  84. package/reports/lcov-report/cli/index.ts.html +1 -1
  85. package/reports/lcov-report/config/index.html +36 -21
  86. package/reports/lcov-report/config/missingRequiredParamError.ts.html +6 -6
  87. package/reports/lcov-report/config/requiredEnvParams.ts.html +61 -28
  88. package/reports/lcov-report/config/runnerConfigLoader.ts.html +38 -17
  89. package/reports/lcov-report/config/runnerConfigSchema.ts.html +18 -6
  90. package/reports/lcov-report/config/sources/cliOverrideConfigSource.ts.html +1 -1
  91. package/reports/lcov-report/config/sources/configSource.ts.html +2 -2
  92. package/reports/lcov-report/config/sources/envVarConfigSource.ts.html +1 -1
  93. package/reports/lcov-report/config/sources/fileConfigSource.ts.html +13 -13
  94. package/reports/lcov-report/config/sources/index.html +1 -1
  95. package/reports/lcov-report/config/unknownEnvError.ts.html +124 -0
  96. package/reports/lcov-report/index.html +35 -35
  97. package/reports/lcov-report/registry/index.html +1 -1
  98. package/reports/lcov-report/registry/scenarioRegistry.ts.html +1 -1
  99. package/reports/lcov-report/reporting/consoleReporter.ts.html +1 -1
  100. package/reports/lcov-report/reporting/index.html +1 -1
  101. package/reports/lcov-report/reporting/junitReporter.ts.html +1 -1
  102. package/reports/lcov-report/runner/aiEnhancementStep.ts.html +8 -5
  103. package/reports/lcov-report/runner/batchRunner.ts.html +1 -1
  104. package/reports/lcov-report/runner/index.html +15 -15
  105. package/reports/lcov-report/runner/scenarioRunner.ts.html +32 -11
  106. package/reports/lcov-report/scenarios/index.html +1 -1
  107. package/reports/lcov-report/scenarios/index.ts.html +1 -1
  108. package/reports/lcov-report/scenarios/one-admin/export-navigation.scenario.ts.html +44 -8
  109. package/reports/lcov-report/scenarios/one-admin/index.html +11 -11
  110. package/reports/lcov-report/scenarios/one-admin/index.ts.html +1 -1
  111. package/reports/lcov-report/scenarios/one-admin/page-models/AdminLandingPageModel.ts.html +157 -0
  112. package/reports/lcov-report/scenarios/one-admin/page-models/ExportPageModel.ts.html +1 -1
  113. package/reports/lcov-report/scenarios/one-admin/page-models/SelectSettingsPageModel.ts.html +1 -1
  114. package/reports/lcov-report/scenarios/one-admin/page-models/index.html +19 -4
  115. package/reports/lcov-report/types/config.ts.html +1 -1
  116. package/reports/lcov-report/types/index.html +1 -1
  117. package/reports/lcov.info +301 -231
  118. package/reports/registry/index.html +1 -1
  119. package/reports/registry/scenarioRegistry.ts.html +1 -1
  120. package/reports/reporting/consoleReporter.ts.html +1 -1
  121. package/reports/reporting/index.html +1 -1
  122. package/reports/reporting/junitReporter.ts.html +1 -1
  123. package/reports/runner/aiEnhancementStep.ts.html +8 -5
  124. package/reports/runner/batchRunner.ts.html +1 -1
  125. package/reports/runner/index.html +15 -15
  126. package/reports/runner/scenarioRunner.ts.html +32 -11
  127. package/reports/scenarios/index.html +1 -1
  128. package/reports/scenarios/index.ts.html +1 -1
  129. package/reports/scenarios/one-admin/export-navigation.scenario.ts.html +44 -8
  130. package/reports/scenarios/one-admin/index.html +11 -11
  131. package/reports/scenarios/one-admin/index.ts.html +1 -1
  132. package/reports/scenarios/one-admin/page-models/AdminLandingPageModel.ts.html +157 -0
  133. package/reports/scenarios/one-admin/page-models/ExportPageModel.ts.html +1 -1
  134. package/reports/scenarios/one-admin/page-models/SelectSettingsPageModel.ts.html +1 -1
  135. package/reports/scenarios/one-admin/page-models/index.html +19 -4
  136. package/reports/types/config.ts.html +1 -1
  137. package/reports/types/index.html +1 -1
  138. package/test-report.xml +74 -62
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">96.15% </span>
26
+ <span class="strong">94.59% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>25/26</span>
28
+ <span class='fraction'>35/37</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">100% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>16/16</span>
35
+ <span class='fraction'>20/20</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">95.23% </span>
47
+ <span class="strong">96.42% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>20/21</span>
49
+ <span class='fraction'>27/28</span>
50
50
  </div>
51
51
 
52
52
 
@@ -113,8 +113,21 @@
113
113
  <a name='L48'></a><a href='#L48'>48</a>
114
114
  <a name='L49'></a><a href='#L49'>49</a>
115
115
  <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
117
128
  <span class="cline-any cline-yes">1x</span>
129
+ <span class="cline-any cline-yes">1x</span>
130
+ <span class="cline-any cline-neutral">&nbsp;</span>
118
131
  <span class="cline-any cline-neutral">&nbsp;</span>
119
132
  <span class="cline-any cline-neutral">&nbsp;</span>
120
133
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -124,55 +137,66 @@
124
137
  <span class="cline-any cline-neutral">&nbsp;</span>
125
138
  <span class="cline-any cline-no">&nbsp;</span>
126
139
  <span class="cline-any cline-neutral">&nbsp;</span>
127
- <span class="cline-any cline-yes">6x</span>
140
+ <span class="cline-any cline-yes">13x</span>
128
141
  <span class="cline-any cline-neutral">&nbsp;</span>
129
- <span class="cline-any cline-yes">6x</span>
130
- <span class="cline-any cline-yes">6x</span>
131
- <span class="cline-any cline-yes">6x</span>
132
- <span class="cline-any cline-yes">6x</span>
142
+ <span class="cline-any cline-yes">13x</span>
143
+ <span class="cline-any cline-yes">11x</span>
144
+ <span class="cline-any cline-yes">11x</span>
145
+ <span class="cline-any cline-yes">11x</span>
146
+ <span class="cline-any cline-neutral">&nbsp;</span>
147
+ <span class="cline-any cline-yes">11x</span>
148
+ <span class="cline-any cline-yes">11x</span>
149
+ <span class="cline-any cline-yes">11x</span>
133
150
  <span class="cline-any cline-neutral">&nbsp;</span>
134
- <span class="cline-any cline-yes">6x</span>
135
- <span class="cline-any cline-yes">6x</span>
136
151
  <span class="cline-any cline-yes">6x</span>
137
152
  <span class="cline-any cline-neutral">&nbsp;</span>
138
- <span class="cline-any cline-yes">2x</span>
139
153
  <span class="cline-any cline-neutral">&nbsp;</span>
140
154
  <span class="cline-any cline-neutral">&nbsp;</span>
141
155
  <span class="cline-any cline-neutral">&nbsp;</span>
142
- <span class="cline-any cline-yes">6x</span>
143
156
  <span class="cline-any cline-neutral">&nbsp;</span>
144
157
  <span class="cline-any cline-neutral">&nbsp;</span>
158
+ <span class="cline-any cline-yes">13x</span>
159
+ <span class="cline-any cline-yes">8x</span>
160
+ <span class="cline-any cline-yes">8x</span>
161
+ <span class="cline-any cline-yes">5x</span>
162
+ <span class="cline-any cline-yes">5x</span>
163
+ <span class="cline-any cline-yes">5x</span>
164
+ <span class="cline-any cline-yes">3x</span>
145
165
  <span class="cline-any cline-neutral">&nbsp;</span>
146
- <span class="cline-any cline-yes">6x</span>
147
166
  <span class="cline-any cline-neutral">&nbsp;</span>
148
167
  <span class="cline-any cline-neutral">&nbsp;</span>
168
+ <span class="cline-any cline-yes">11x</span>
149
169
  <span class="cline-any cline-neutral">&nbsp;</span>
150
- <span class="cline-any cline-yes">6x</span>
151
170
  <span class="cline-any cline-neutral">&nbsp;</span>
152
171
  <span class="cline-any cline-neutral">&nbsp;</span>
172
+ <span class="cline-any cline-yes">11x</span>
153
173
  <span class="cline-any cline-neutral">&nbsp;</span>
154
- <span class="cline-any cline-yes">6x</span>
155
174
  <span class="cline-any cline-neutral">&nbsp;</span>
156
175
  <span class="cline-any cline-neutral">&nbsp;</span>
176
+ <span class="cline-any cline-yes">11x</span>
157
177
  <span class="cline-any cline-neutral">&nbsp;</span>
158
- <span class="cline-any cline-yes">6x</span>
159
- <span class="cline-any cline-yes">6x</span>
160
- <span class="cline-any cline-yes">6x</span>
161
- <span class="cline-any cline-yes">6x</span>
162
- <span class="cline-any cline-yes">6x</span>
163
- <span class="cline-any cline-yes">6x</span>
178
+ <span class="cline-any cline-neutral">&nbsp;</span>
179
+ <span class="cline-any cline-neutral">&nbsp;</span>
180
+ <span class="cline-any cline-yes">11x</span>
181
+ <span class="cline-any cline-yes">11x</span>
182
+ <span class="cline-any cline-yes">11x</span>
183
+ <span class="cline-any cline-yes">11x</span>
184
+ <span class="cline-any cline-yes">11x</span>
185
+ <span class="cline-any cline-yes">11x</span>
164
186
  <span class="cline-any cline-neutral">&nbsp;</span>
165
187
  <span class="cline-any cline-neutral">&nbsp;</span>
166
188
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { EnvironmentParams } from '../types/config.js';
167
189
  import { MissingRequiredParamError } from './missingRequiredParamError.js';
190
+ import { UnknownEnvError } from './unknownEnvError.js';
168
191
  &nbsp;
169
192
  export interface CliEnvOpts {
170
- readonly baseUrl?: string;
193
+ readonly env?: string;
194
+ readonly envs?: Readonly&lt;Record&lt;string, string&gt;&gt;;
171
195
  readonly instanceId?: string;
172
196
  readonly userId?: string;
173
197
  }
174
198
  &nbsp;
175
- export { <span class="cstat-no" title="statement not covered" >MissingRequiredParamError };</span>
199
+ export { <span class="cstat-no" title="statement not covered" >MissingRequiredParamError, <span class="cstat-no" title="statement not covered" >U</span>nknownEnvError };</span>
176
200
  &nbsp;
177
201
  export class RequiredEnvParamsResolver {
178
202
  resolve(cliOpts: CliEnvOpts): EnvironmentParams {
@@ -188,8 +212,17 @@ export class RequiredEnvParamsResolver {
188
212
  return params;
189
213
  }
190
214
  &nbsp;
215
+ // Precedence: BASE_URL env &gt; --env / ENCW_ENV map lookup.
216
+ // Throws UnknownEnvError when an env name is supplied but not in the map,
217
+ // so a typo fails loudly instead of silently falling through to "missing baseUrl".
191
218
  private resolveBaseUrl(cliOpts: CliEnvOpts): string {
192
- return cliOpts.baseUrl || process.env.BASE_URL || '';
219
+ if (process.env.BASE_URL) return process.env.BASE_URL;
220
+ const envName = cliOpts.env || process.env.ENCW_ENV;
221
+ if (!envName) return '';
222
+ const envs = cliOpts.envs ?? {};
223
+ const fromMap = envs[envName];
224
+ if (!fromMap) throw new UnknownEnvError(envName, Object.keys(envs));
225
+ return fromMap;
193
226
  }
194
227
  &nbsp;
195
228
  private resolveInstanceId(cliOpts: CliEnvOpts): string {
@@ -220,7 +253,7 @@ export class RequiredEnvParamsResolver {
220
253
  <div class='footer quiet pad2 space-top1 center small'>
221
254
  Code coverage generated by
222
255
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
223
- at 2026-05-12T09:10:26.101Z
256
+ at 2026-05-14T05:23:28.095Z
224
257
  </div>
225
258
  <script src="../prettify.js"></script>
226
259
  <script>
@@ -30,9 +30,9 @@
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">75% </span>
33
+ <span class="strong">76.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>21/28</span>
35
+ <span class='fraction'>23/30</span>
36
36
  </div>
37
37
 
38
38
 
@@ -147,7 +147,14 @@
147
147
  <a name='L82'></a><a href='#L82'>82</a>
148
148
  <a name='L83'></a><a href='#L83'>83</a>
149
149
  <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
151
158
  <span class="cline-any cline-neutral">&nbsp;</span>
152
159
  <span class="cline-any cline-neutral">&nbsp;</span>
153
160
  <span class="cline-any cline-yes">1x</span>
@@ -171,6 +178,13 @@
171
178
  <span class="cline-any cline-neutral">&nbsp;</span>
172
179
  <span class="cline-any cline-neutral">&nbsp;</span>
173
180
  <span class="cline-any cline-neutral">&nbsp;</span>
181
+ <span class="cline-any cline-neutral">&nbsp;</span>
182
+ <span class="cline-any cline-neutral">&nbsp;</span>
183
+ <span class="cline-any cline-neutral">&nbsp;</span>
184
+ <span class="cline-any cline-neutral">&nbsp;</span>
185
+ <span class="cline-any cline-neutral">&nbsp;</span>
186
+ <span class="cline-any cline-neutral">&nbsp;</span>
187
+ <span class="cline-any cline-neutral">&nbsp;</span>
174
188
  <span class="cline-any cline-yes">5x</span>
175
189
  <span class="cline-any cline-neutral">&nbsp;</span>
176
190
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -190,25 +204,25 @@
190
204
  <span class="cline-any cline-neutral">&nbsp;</span>
191
205
  <span class="cline-any cline-neutral">&nbsp;</span>
192
206
  <span class="cline-any cline-neutral">&nbsp;</span>
207
+ <span class="cline-any cline-yes">9x</span>
208
+ <span class="cline-any cline-yes">9x</span>
193
209
  <span class="cline-any cline-neutral">&nbsp;</span>
194
210
  <span class="cline-any cline-neutral">&nbsp;</span>
195
211
  <span class="cline-any cline-neutral">&nbsp;</span>
196
- <span class="cline-any cline-yes">6x</span>
197
- <span class="cline-any cline-yes">6x</span>
198
212
  <span class="cline-any cline-neutral">&nbsp;</span>
199
213
  <span class="cline-any cline-neutral">&nbsp;</span>
200
214
  <span class="cline-any cline-neutral">&nbsp;</span>
201
215
  <span class="cline-any cline-neutral">&nbsp;</span>
202
216
  <span class="cline-any cline-neutral">&nbsp;</span>
217
+ <span class="cline-any cline-yes">8x</span>
218
+ <span class="cline-any cline-yes">8x</span>
203
219
  <span class="cline-any cline-neutral">&nbsp;</span>
204
220
  <span class="cline-any cline-neutral">&nbsp;</span>
205
- <span class="cline-any cline-yes">5x</span>
206
- <span class="cline-any cline-yes">5x</span>
221
+ <span class="cline-any cline-yes">8x</span>
207
222
  <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-yes">8x</span>
208
224
  <span class="cline-any cline-neutral">&nbsp;</span>
209
- <span class="cline-any cline-yes">5x</span>
210
225
  <span class="cline-any cline-neutral">&nbsp;</span>
211
- <span class="cline-any cline-yes">5x</span>
212
226
  <span class="cline-any cline-neutral">&nbsp;</span>
213
227
  <span class="cline-any cline-neutral">&nbsp;</span>
214
228
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -220,10 +234,10 @@
220
234
  <span class="cline-any cline-neutral">&nbsp;</span>
221
235
  <span class="cline-any cline-neutral">&nbsp;</span>
222
236
  <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-yes">8x</span>
223
238
  <span class="cline-any cline-neutral">&nbsp;</span>
224
- <span class="cline-any cline-yes">5x</span>
239
+ <span class="cline-any cline-yes">8x</span>
225
240
  <span class="cline-any cline-neutral">&nbsp;</span>
226
- <span class="cline-any cline-yes">5x</span>
227
241
  <span class="cline-any cline-neutral">&nbsp;</span>
228
242
  <span class="cline-any cline-neutral">&nbsp;</span>
229
243
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -241,6 +255,7 @@ export interface ResolvedRunnerConfigPartial {
241
255
  readonly aiEnabled: boolean;
242
256
  readonly aiModel: string;
243
257
  readonly aiTemperature: number;
258
+ readonly envs: Readonly&lt;Record&lt;string, string&gt;&gt;;
244
259
  }
245
260
  &nbsp;
246
261
  type MutableRunner = { headless: boolean; outputDir: string; topN: number };
@@ -251,6 +266,12 @@ type AiAccumulator = {
251
266
  aiTemperature: number;
252
267
  };
253
268
  &nbsp;
269
+ type Accumulator = {
270
+ runner: MutableRunner;
271
+ ai: AiAccumulator;
272
+ envs: Record&lt;string, string&gt;;
273
+ };
274
+ &nbsp;
254
275
  function applyRunnerPayload(
255
276
  acc: MutableRunner,
256
277
  payload: NonNullable&lt;RawRunnerConfigFile['runner']&gt;,
@@ -273,16 +294,14 @@ function applyAiPayload(
273
294
  };
274
295
  }
275
296
  &nbsp;
276
- function applySource(
277
- acc: { runner: MutableRunner; ai: AiAccumulator },
278
- source: ConfigSource,
279
- ): { runner: MutableRunner; ai: AiAccumulator } {
297
+ function applySource(acc: Accumulator, source: ConfigSource): Accumulator {
280
298
  const payload = source.load();
281
299
  return {
282
300
  runner: payload.runner
283
301
  ? applyRunnerPayload(acc.runner, payload.runner)
284
302
  : acc.runner,
285
303
  ai: payload.ai ? applyAiPayload(acc.ai, payload.ai) : acc.ai,
304
+ envs: payload.envs ? { ...acc.envs, ...payload.envs } : acc.envs,
286
305
  };
287
306
  }
288
307
  &nbsp;
@@ -292,7 +311,7 @@ export class RunnerConfigLoader {
292
311
  resolveOptions(): ResolvedRunnerConfigPartial {
293
312
  const ordered = [...this.sources].sort((a, b) =&gt; a.priority - b.priority);
294
313
  &nbsp;
295
- const initial = {
314
+ const initial: Accumulator = {
296
315
  runner: {
297
316
  headless: BUILT_IN_DEFAULTS.runner.headless ?? <span class="branch-1 cbranch-no" title="branch not covered" >true,</span>
298
317
  outputDir: BUILT_IN_DEFAULTS.runner.outputDir ?? <span class="branch-1 cbranch-no" title="branch not covered" >'./leak-reports/',</span>
@@ -303,6 +322,7 @@ export class RunnerConfigLoader {
303
322
  aiModel: BUILT_IN_DEFAULTS.ai.model ?? <span class="branch-1 cbranch-no" title="branch not covered" >'Claude3.7',</span>
304
323
  aiTemperature: BUILT_IN_DEFAULTS.ai.temperature ?? <span class="branch-1 cbranch-no" title="branch not covered" >0.3,</span>
305
324
  },
325
+ envs: {},
306
326
  };
307
327
  &nbsp;
308
328
  const resolved = ordered.reduce(applySource, initial);
@@ -312,6 +332,7 @@ export class RunnerConfigLoader {
312
332
  aiEnabled: resolved.ai.aiEnabled,
313
333
  aiModel: resolved.ai.aiModel,
314
334
  aiTemperature: resolved.ai.aiTemperature,
335
+ envs: resolved.envs,
315
336
  };
316
337
  }
317
338
  }
@@ -322,7 +343,7 @@ export class RunnerConfigLoader {
322
343
  <div class='footer quiet pad2 space-top1 center small'>
323
344
  Code coverage generated by
324
345
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
325
- at 2026-05-12T09:10:26.101Z
346
+ at 2026-05-14T05:23:28.095Z
326
347
  </div>
327
348
  <script src="../prettify.js"></script>
328
349
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">71.42% </span>
26
+ <span class="strong">66.66% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>5/7</span>
28
+ <span class='fraction'>6/9</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'>4/4</span>
49
+ <span class='fraction'>5/5</span>
50
50
  </div>
51
51
 
52
52
 
@@ -90,7 +90,11 @@
90
90
  <a name='L25'></a><a href='#L25'>25</a>
91
91
  <a name='L26'></a><a href='#L26'>26</a>
92
92
  <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
94
98
  <span class="cline-any cline-neutral">&nbsp;</span>
95
99
  <span class="cline-any cline-yes">1x</span>
96
100
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -108,7 +112,11 @@
108
112
  <span class="cline-any cline-neutral">&nbsp;</span>
109
113
  <span class="cline-any cline-neutral">&nbsp;</span>
110
114
  <span class="cline-any cline-neutral">&nbsp;</span>
111
- <span class="cline-any cline-yes">2x</span>
115
+ <span class="cline-any cline-yes">1x</span>
116
+ <span class="cline-any cline-neutral">&nbsp;</span>
117
+ <span class="cline-any cline-yes">4x</span>
118
+ <span class="cline-any cline-neutral">&nbsp;</span>
119
+ <span class="cline-any cline-neutral">&nbsp;</span>
112
120
  <span class="cline-any cline-neutral">&nbsp;</span>
113
121
  <span class="cline-any cline-neutral">&nbsp;</span>
114
122
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -135,10 +143,14 @@ export const <span class="cstat-no" title="statement not covered" >aiConfigFileS
135
143
  })
136
144
  .partial();
137
145
  &nbsp;
146
+ export const <span class="cstat-no" title="statement not covered" >envsSchema </span>= z.record(z.string().min(1));
147
+ &nbsp;
138
148
  export const runnerConfigFileSchema = z
139
149
  .object({
150
+ $schema: z.string().optional(),
140
151
  runner: runnerOptionsSchema,
141
152
  ai: aiConfigFileSchema,
153
+ envs: envsSchema,
142
154
  })
143
155
  .partial()
144
156
  .strict();
@@ -151,7 +163,7 @@ export type RawRunnerConfigFile = z.infer&lt;typeof runnerConfigFileSchema&gt;;
151
163
  <div class='footer quiet pad2 space-top1 center small'>
152
164
  Code coverage generated by
153
165
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
154
- at 2026-05-12T09:10:26.101Z
166
+ at 2026-05-14T05:23:28.095Z
155
167
  </div>
156
168
  <script src="../prettify.js"></script>
157
169
  <script>
@@ -160,7 +160,7 @@ export class CliOverrideConfigSource implements ConfigSource {
160
160
  <div class='footer quiet pad2 space-top1 center small'>
161
161
  Code coverage generated by
162
162
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
163
- at 2026-05-12T09:10:26.101Z
163
+ at 2026-05-14T05:23:28.095Z
164
164
  </div>
165
165
  <script src="../../prettify.js"></script>
166
166
  <script>
@@ -102,7 +102,7 @@
102
102
  <span class="cline-any cline-neutral">&nbsp;</span>
103
103
  <span class="cline-any cline-neutral">&nbsp;</span>
104
104
  <span class="cline-any cline-neutral">&nbsp;</span>
105
- <span class="cline-any cline-yes">30x</span>
105
+ <span class="cline-any cline-yes">48x</span>
106
106
  <span class="cline-any cline-neutral">&nbsp;</span>
107
107
  <span class="cline-any cline-neutral">&nbsp;</span>
108
108
  <span class="cline-any cline-yes">1x</span>
@@ -151,7 +151,7 @@ export const BUILT_IN_DEFAULTS: Required&lt;{
151
151
  <div class='footer quiet pad2 space-top1 center small'>
152
152
  Code coverage generated by
153
153
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
154
- at 2026-05-12T09:10:26.101Z
154
+ at 2026-05-14T05:23:28.095Z
155
155
  </div>
156
156
  <script src="../../prettify.js"></script>
157
157
  <script>
@@ -139,7 +139,7 @@ export class EnvVarConfigSource implements ConfigSource {
139
139
  <div class='footer quiet pad2 space-top1 center small'>
140
140
  Code coverage generated by
141
141
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
142
- at 2026-05-12T09:10:26.101Z
142
+ at 2026-05-14T05:23:28.095Z
143
143
  </div>
144
144
  <script src="../../prettify.js"></script>
145
145
  <script>
@@ -109,20 +109,20 @@
109
109
  <span class="cline-any cline-yes">1x</span>
110
110
  <span class="cline-any cline-neutral">&nbsp;</span>
111
111
  <span class="cline-any cline-neutral">&nbsp;</span>
112
- <span class="cline-any cline-yes">5x</span>
113
- <span class="cline-any cline-yes">5x</span>
112
+ <span class="cline-any cline-yes">7x</span>
113
+ <span class="cline-any cline-yes">7x</span>
114
114
  <span class="cline-any cline-neutral">&nbsp;</span>
115
- <span class="cline-any cline-yes">5x</span>
115
+ <span class="cline-any cline-yes">7x</span>
116
116
  <span class="cline-any cline-neutral">&nbsp;</span>
117
- <span class="cline-any cline-yes">5x</span>
117
+ <span class="cline-any cline-yes">7x</span>
118
118
  <span class="cline-any cline-neutral">&nbsp;</span>
119
119
  <span class="cline-any cline-neutral">&nbsp;</span>
120
- <span class="cline-any cline-yes">4x</span>
120
+ <span class="cline-any cline-yes">6x</span>
121
121
  <span class="cline-any cline-neutral">&nbsp;</span>
122
- <span class="cline-any cline-yes">3x</span>
122
+ <span class="cline-any cline-yes">5x</span>
123
123
  <span class="cline-any cline-neutral">&nbsp;</span>
124
- <span class="cline-any cline-yes">3x</span>
125
- <span class="cline-any cline-yes">3x</span>
124
+ <span class="cline-any cline-yes">5x</span>
125
+ <span class="cline-any cline-yes">5x</span>
126
126
  <span class="cline-any cline-neutral">&nbsp;</span>
127
127
  <span class="cline-any cline-yes">1x</span>
128
128
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -131,14 +131,14 @@
131
131
  <span class="cline-any cline-neutral">&nbsp;</span>
132
132
  <span class="cline-any cline-neutral">&nbsp;</span>
133
133
  <span class="cline-any cline-neutral">&nbsp;</span>
134
+ <span class="cline-any cline-yes">4x</span>
135
+ <span class="cline-any cline-yes">4x</span>
134
136
  <span class="cline-any cline-yes">2x</span>
135
137
  <span class="cline-any cline-yes">2x</span>
136
- <span class="cline-any cline-yes">1x</span>
137
- <span class="cline-any cline-yes">1x</span>
138
138
  <span class="cline-any cline-neutral">&nbsp;</span>
139
- <span class="cline-any cline-yes">1x</span>
139
+ <span class="cline-any cline-yes">2x</span>
140
140
  <span class="cline-any cline-neutral">&nbsp;</span>
141
- <span class="cline-any cline-yes">1x</span>
141
+ <span class="cline-any cline-yes">2x</span>
142
142
  <span class="cline-any cline-neutral">&nbsp;</span>
143
143
  <span class="cline-any cline-neutral">&nbsp;</span>
144
144
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import fs from 'node:fs';
@@ -187,7 +187,7 @@ export class FileConfigSource implements ConfigSource {
187
187
  <div class='footer quiet pad2 space-top1 center small'>
188
188
  Code coverage generated by
189
189
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
190
- at 2026-05-12T09:10:26.101Z
190
+ at 2026-05-14T05:23:28.095Z
191
191
  </div>
192
192
  <script src="../../prettify.js"></script>
193
193
  <script>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-05-12T09:10:26.101Z
149
+ at 2026-05-14T05:23:28.095Z
150
150
  </div>
151
151
  <script src="../../prettify.js"></script>
152
152
  <script>
@@ -0,0 +1,124 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for config/unknownEnvError.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">config</a> unknownEnvError.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">100% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>4/4</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>2/2</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'>1/1</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">100% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>4/4</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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">4x</span>
80
+ <span class="cline-any cline-neutral">&nbsp;</span>
81
+ <span class="cline-any cline-neutral">&nbsp;</span>
82
+ <span class="cline-any cline-neutral">&nbsp;</span>
83
+ <span class="cline-any cline-neutral">&nbsp;</span>
84
+ <span class="cline-any cline-neutral">&nbsp;</span>
85
+ <span class="cline-any cline-yes">2x</span>
86
+ <span class="cline-any cline-yes">2x</span>
87
+ <span class="cline-any cline-neutral">&nbsp;</span>
88
+ <span class="cline-any cline-neutral">&nbsp;</span>
89
+ <span class="cline-any cline-yes">2x</span>
90
+ <span class="cline-any cline-neutral">&nbsp;</span>
91
+ <span class="cline-any cline-neutral">&nbsp;</span>
92
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export class UnknownEnvError extends Error {
93
+ constructor(
94
+ public readonly name: string,
95
+ public readonly knownEnvs: readonly string[],
96
+ ) {
97
+ const knownList =
98
+ knownEnvs.length &gt; 0 ? knownEnvs.join(', ') : '(none defined)';
99
+ super(
100
+ `Unknown env "${name}". Known envs in leak-runner.config.json: ${knownList}.`,
101
+ );
102
+ this.name = 'UnknownEnvError';
103
+ }
104
+ }
105
+ &nbsp;</pre></td></tr></table></pre>
106
+
107
+ <div class='push'></div><!-- for sticky footer -->
108
+ </div><!-- /wrapper -->
109
+ <div class='footer quiet pad2 space-top1 center small'>
110
+ Code coverage generated by
111
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
112
+ at 2026-05-14T05:23:28.095Z
113
+ </div>
114
+ <script src="../prettify.js"></script>
115
+ <script>
116
+ window.onload = function () {
117
+ prettyPrint();
118
+ };
119
+ </script>
120
+ <script src="../sorter.js"></script>
121
+ <script src="../block-navigation.js"></script>
122
+ </body>
123
+ </html>
124
+