@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
@@ -88,6 +88,8 @@ export class ScenarioRunner {
88
88
  snapshotsDir,
89
89
  );
90
90
 
91
+ if (scenario.setup) await scenario.setup(page, frame);
92
+
91
93
  paths.before = await profiler.captureSnapshot('before');
92
94
  await this.repeatScenarioActions(scenario, page, frame);
93
95
  await forceGarbageCollection(page);
@@ -111,12 +113,17 @@ export class ScenarioRunner {
111
113
  const pageSetup = new PageSetup();
112
114
 
113
115
  await pageSetup.apply(page);
116
+ await page.unroute(PageSetup.BLOCKED_PATTERN);
114
117
  await auth.login(page, {
115
118
  username: this.config.env.userId,
116
119
  password: this.config.env.password,
117
120
  instanceId: this.config.env.instanceId,
118
121
  });
119
- await page.goto(scenario.url());
122
+ process.stderr.write(`[scenarioRunner] post-login URL = ${page.url()}\n`);
123
+ await page.waitForURL(`**${scenario.url()}**`, { timeout: 30_000 });
124
+ process.stderr.write(
125
+ `[scenarioRunner] settled URL before iframe = ${page.url()}\n`,
126
+ );
120
127
 
121
128
  const frame = await resolveIframe(page, scenario.microappSelector);
122
129
  fs.mkdirSync(snapshotsDir, { recursive: true });
@@ -1,5 +1,6 @@
1
1
  import type { MicroappLeakScenario } from '../../types/scenario.js';
2
2
  import {
3
+ AdminLandingPageModel,
3
4
  SelectSettingsPageModel,
4
5
  ExportPageModel,
5
6
  } from './page-models/index.js';
@@ -11,9 +12,20 @@ export const exportNavigationScenario: MicroappLeakScenario = {
11
12
  tags: ['critical'],
12
13
  microappSelector: 'iframe#pui-iframe-container-emAdminUI',
13
14
 
14
- url: () => '/admin/oneadmin/migrate',
15
+ url: () => '/admin',
16
+
17
+ async setup(page) {
18
+ await AdminLandingPageModel.acceptCookiesIfShown(page);
19
+ },
15
20
 
16
21
  async action(page, frame) {
22
+ const path = new URL(page.url()).pathname.replace(/\/$/, '');
23
+ if (path === '/admin') {
24
+ const adminLanding = new AdminLandingPageModel(frame);
25
+ await adminLanding.oneAdminConsoleOption.waitFor({ state: 'visible' });
26
+ await adminLanding.clickOneAdminConsole();
27
+ }
28
+
17
29
  const settings = new SelectSettingsPageModel(frame);
18
30
  await settings.container.waitFor({ state: 'visible' });
19
31
  await settings.expandTreeItem('eFolder');
@@ -0,0 +1,24 @@
1
+ import type { Frame, Locator, Page } from '@playwright/test';
2
+
3
+ export class AdminLandingPageModel {
4
+ constructor(private readonly frame: Frame) {}
5
+
6
+ get oneAdminConsoleOption(): Locator {
7
+ return this.frame.getByText('ONE ADMIN CONSOLE');
8
+ }
9
+
10
+ async clickOneAdminConsole(): Promise<void> {
11
+ await this.oneAdminConsoleOption.click();
12
+ }
13
+
14
+ static async acceptCookiesIfShown(page: Page): Promise<void> {
15
+ try {
16
+ await page
17
+ .locator('#onetrust-group-container')
18
+ .waitFor({ state: 'visible', timeout: 5_000 });
19
+ await page.locator('button', { hasText: 'Accept All Cookies' }).click();
20
+ } catch {
21
+ // OneTrust banner not shown — proceed
22
+ }
23
+ }
24
+ }
@@ -1,2 +1,3 @@
1
+ export { AdminLandingPageModel } from './AdminLandingPageModel.js';
1
2
  export { SelectSettingsPageModel } from './SelectSettingsPageModel.js';
2
3
  export { ExportPageModel } from './ExportPageModel.js';
@@ -8,6 +8,7 @@ export interface MicroappLeakScenario {
8
8
  tags?: string[];
9
9
  microappSelector: string;
10
10
  url(): string;
11
+ setup?(page: Page, frame: Frame): Promise<void>;
11
12
  action(page: Page, frame: Frame): Promise<void>;
12
13
  back?(page: Page): Promise<void>;
13
14
  repeat?(): number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elliemae/encw-leak-runner",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Playwright orchestration framework for microapp memory leak detection",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -19,8 +19,8 @@
19
19
  "dependencies": {
20
20
  "commander": "^12.1.0",
21
21
  "zod": "^3.25.76",
22
- "@elliemae/encw-heap-doctor": "26.2.16",
23
- "@elliemae/smoked-suite": "26.2.27"
22
+ "@elliemae/encw-heap-doctor": "26.2.18",
23
+ "@elliemae/smoked-suite": "26.2.29"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@elliemae/pui-cli": "~8.59.3",
@@ -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-05-12T09:10:26.101Z
104
+ at 2026-05-14T05:23:28.095Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -178,7 +178,7 @@ export class ThresholdEvaluator {
178
178
  <div class='footer quiet pad2 space-top1 center small'>
179
179
  Code coverage generated by
180
180
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
181
- at 2026-05-12T09:10:26.101Z
181
+ at 2026-05-14T05:23:28.095Z
182
182
  </div>
183
183
  <script src="../prettify.js"></script>
184
184
  <script>
@@ -160,7 +160,7 @@ export class IframeHeapProfiler extends HeapMemoryProfiler {
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>
@@ -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-05-12T09:10:26.101Z
104
+ at 2026-05-14T05:23:28.095Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -32,7 +32,7 @@
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/17</span>
35
+ <span class='fraction'>0/19</span>
36
36
  </div>
37
37
 
38
38
 
@@ -101,7 +101,7 @@
101
101
  <td data-value="0" class="pct low">0%</td>
102
102
  <td data-value="35" class="abs low">0/35</td>
103
103
  <td data-value="0" class="pct low">0%</td>
104
- <td data-value="12" class="abs low">0/12</td>
104
+ <td data-value="14" class="abs low">0/14</td>
105
105
  <td data-value="0" class="pct low">0%</td>
106
106
  <td data-value="6" class="abs low">0/6</td>
107
107
  <td data-value="0" class="pct low">0%</td>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-05-12T09:10:26.101Z
119
+ at 2026-05-14T05:23:28.095Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -178,7 +178,7 @@ export class ListCommand implements CliCommand {
178
178
  <div class='footer quiet pad2 space-top1 center small'>
179
179
  Code coverage generated by
180
180
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
181
- at 2026-05-12T09:10:26.101Z
181
+ at 2026-05-14T05:23:28.095Z
182
182
  </div>
183
183
  <script src="../../prettify.js"></script>
184
184
  <script>
@@ -32,7 +32,7 @@
32
32
  <div class='fl pad1y space-right2'>
33
33
  <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/12</span>
35
+ <span class='fraction'>0/14</span>
36
36
  </div>
37
37
 
38
38
 
@@ -189,7 +189,20 @@
189
189
  <a name='L124'></a><a href='#L124'>124</a>
190
190
  <a name='L125'></a><a href='#L125'>125</a>
191
191
  <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
203
+ <span class="cline-any cline-neutral">&nbsp;</span>
204
+ <span class="cline-any cline-neutral">&nbsp;</span>
205
+ <span class="cline-any cline-neutral">&nbsp;</span>
193
206
  <span class="cline-any cline-neutral">&nbsp;</span>
194
207
  <span class="cline-any cline-neutral">&nbsp;</span>
195
208
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -228,6 +241,9 @@
228
241
  <span class="cline-any cline-neutral">&nbsp;</span>
229
242
  <span class="cline-any cline-neutral">&nbsp;</span>
230
243
  <span class="cline-any cline-neutral">&nbsp;</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
247
  <span class="cline-any cline-no">&nbsp;</span>
232
248
  <span class="cline-any cline-neutral">&nbsp;</span>
233
249
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -246,6 +262,9 @@
246
262
  <span class="cline-any cline-no">&nbsp;</span>
247
263
  <span class="cline-any cline-neutral">&nbsp;</span>
248
264
  <span class="cline-any cline-no">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
249
268
  <span class="cline-any cline-no">&nbsp;</span>
250
269
  <span class="cline-any cline-no">&nbsp;</span>
251
270
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -280,6 +299,7 @@
280
299
  <span class="cline-any cline-neutral">&nbsp;</span>
281
300
  <span class="cline-any cline-neutral">&nbsp;</span>
282
301
  <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
303
  <span class="cline-any cline-no">&nbsp;</span>
284
304
  <span class="cline-any cline-no">&nbsp;</span>
285
305
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -329,12 +349,15 @@ import {
329
349
  import { EnvVarConfigSource } from '../../config/sources/envVarConfigSource.js';
330
350
  import { FileConfigSource } from '../../config/sources/fileConfigSource.js';
331
351
  import { RunnerConfigLoader } from '../../config/runnerConfigLoader.js';
332
- import { MissingRequiredParamError } from '../../config/requiredEnvParams.js';
352
+ import {
353
+ MissingRequiredParamError,
354
+ UnknownEnvError,
355
+ } from '../../config/requiredEnvParams.js';
333
356
  &nbsp;
334
357
  interface RunOptions extends CliRunnerOverrides {
335
358
  all?: boolean;
336
359
  tag?: string;
337
- baseUrl?: string;
360
+ env?: string;
338
361
  instanceId?: string;
339
362
  userId?: string;
340
363
  configFile?: string;
@@ -349,7 +372,10 @@ export class RunCommand implements CliCommand {
349
372
  )
350
373
  .option('--all', 'Run all registered scenarios')
351
374
  .option('--tag &lt;tag&gt;', 'Run all scenarios matching a tag')
352
- .option('--base-url &lt;url&gt;', 'Override base URL')
375
+ .option(
376
+ '--env &lt;name&gt;',
377
+ 'Select a named environment from leak-runner.config.json envs (also reads ENCW_ENV)',
378
+ )
353
379
  .option('--instance-id &lt;id&gt;', 'Override instance ID')
354
380
  .option('--user-id &lt;id&gt;', 'Override user ID')
355
381
  .option('--output-dir &lt;dir&gt;', 'Override output directory')
@@ -371,7 +397,10 @@ export class RunCommand implements CliCommand {
371
397
  <span class="cstat-no" title="statement not covered" > await new JunitReporter().write(summary, config.runner.outputDir);</span>
372
398
  <span class="cstat-no" title="statement not covered" > process.exit(summary.failCount &gt; 0 ? 1 : 0);</span>
373
399
  } catch (err) {
374
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (err instanceof MissingRequiredParamError) {</span>
400
+ <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (</span>
401
+ err instanceof MissingRequiredParamError ||
402
+ err instanceof UnknownEnvError
403
+ ) {
375
404
  <span class="cstat-no" title="statement not covered" > process.stderr.write(`Configuration error: ${err.message}\n`);</span>
376
405
  <span class="cstat-no" title="statement not covered" > process.exit(2);</span>
377
406
  }
@@ -400,7 +429,8 @@ export class RunCommand implements CliCommand {
400
429
  const resolved = <span class="cstat-no" title="statement not covered" >loader.resolveOptions();</span>
401
430
  &nbsp;
402
431
  const env = <span class="cstat-no" title="statement not covered" >deps.envParams.resolve({</span>
403
- baseUrl: options.baseUrl,
432
+ env: options.env,
433
+ envs: resolved.envs,
404
434
  instanceId: options.instanceId,
405
435
  userId: options.userId,
406
436
  });
@@ -448,7 +478,7 @@ export class RunCommand implements CliCommand {
448
478
  <div class='footer quiet pad2 space-top1 center small'>
449
479
  Code coverage generated by
450
480
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
451
- at 2026-05-12T09:10:26.101Z
481
+ at 2026-05-14T05:23:28.095Z
452
482
  </div>
453
483
  <script src="../../prettify.js"></script>
454
484
  <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-05-12T09:10:26.101Z
104
+ at 2026-05-14T05:23:28.095Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -145,7 +145,7 @@ export function <span class="fstat-no" title="function not covered" >defaultDeps
145
145
  <div class='footer quiet pad2 space-top1 center small'>
146
146
  Code coverage generated by
147
147
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
148
- at 2026-05-12T09:10:26.101Z
148
+ at 2026-05-14T05:23:28.095Z
149
149
  </div>
150
150
  <script src="../prettify.js"></script>
151
151
  <script>
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">93.75% </span>
26
+ <span class="strong">92.3% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>45/48</span>
28
+ <span class='fraction'>60/65</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">84.09% </span>
33
+ <span class="strong">86.53% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>37/44</span>
35
+ <span class='fraction'>45/52</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
40
  <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>13/13</span>
42
+ <span class='fraction'>14/14</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">97.43% </span>
47
+ <span class="strong">98.03% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>38/39</span>
49
+ <span class='fraction'>50/51</span>
50
50
  </div>
51
51
 
52
52
 
@@ -95,17 +95,17 @@
95
95
 
96
96
  <tr>
97
97
  <td class="file high" data-value="requiredEnvParams.ts"><a href="requiredEnvParams.ts.html">requiredEnvParams.ts</a></td>
98
- <td data-value="96.15" class="pic high">
99
- <div class="chart"><div class="cover-fill" style="width: 96%"></div><div class="cover-empty" style="width: 4%"></div></div>
98
+ <td data-value="94.59" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 94%"></div><div class="cover-empty" style="width: 6%"></div></div>
100
100
  </td>
101
- <td data-value="96.15" class="pct high">96.15%</td>
102
- <td data-value="26" class="abs high">25/26</td>
101
+ <td data-value="94.59" class="pct high">94.59%</td>
102
+ <td data-value="37" class="abs high">35/37</td>
103
103
  <td data-value="100" class="pct high">100%</td>
104
- <td data-value="16" class="abs high">16/16</td>
104
+ <td data-value="20" class="abs high">20/20</td>
105
105
  <td data-value="100" class="pct high">100%</td>
106
106
  <td data-value="6" class="abs high">6/6</td>
107
- <td data-value="95.23" class="pct high">95.23%</td>
108
- <td data-value="21" class="abs high">20/21</td>
107
+ <td data-value="96.42" class="pct high">96.42%</td>
108
+ <td data-value="28" class="abs high">27/28</td>
109
109
  </tr>
110
110
 
111
111
  <tr>
@@ -115,8 +115,8 @@
115
115
  </td>
116
116
  <td data-value="100" class="pct high">100%</td>
117
117
  <td data-value="12" class="abs high">12/12</td>
118
- <td data-value="75" class="pct medium">75%</td>
119
- <td data-value="28" class="abs medium">21/28</td>
118
+ <td data-value="76.66" class="pct medium">76.66%</td>
119
+ <td data-value="30" class="abs medium">23/30</td>
120
120
  <td data-value="100" class="pct high">100%</td>
121
121
  <td data-value="6" class="abs high">6/6</td>
122
122
  <td data-value="100" class="pct high">100%</td>
@@ -125,16 +125,31 @@
125
125
 
126
126
  <tr>
127
127
  <td class="file medium" data-value="runnerConfigSchema.ts"><a href="runnerConfigSchema.ts.html">runnerConfigSchema.ts</a></td>
128
- <td data-value="71.42" class="pic medium">
129
- <div class="chart"><div class="cover-fill" style="width: 71%"></div><div class="cover-empty" style="width: 29%"></div></div>
128
+ <td data-value="66.66" class="pic medium">
129
+ <div class="chart"><div class="cover-fill" style="width: 66%"></div><div class="cover-empty" style="width: 34%"></div></div>
130
130
  </td>
131
- <td data-value="71.42" class="pct medium">71.42%</td>
132
- <td data-value="7" class="abs medium">5/7</td>
131
+ <td data-value="66.66" class="pct medium">66.66%</td>
132
+ <td data-value="9" class="abs medium">6/9</td>
133
133
  <td data-value="100" class="pct high">100%</td>
134
134
  <td data-value="0" class="abs high">0/0</td>
135
135
  <td data-value="100" class="pct high">100%</td>
136
136
  <td data-value="0" class="abs high">0/0</td>
137
137
  <td data-value="100" class="pct high">100%</td>
138
+ <td data-value="5" class="abs high">5/5</td>
139
+ </tr>
140
+
141
+ <tr>
142
+ <td class="file high" data-value="unknownEnvError.ts"><a href="unknownEnvError.ts.html">unknownEnvError.ts</a></td>
143
+ <td data-value="100" class="pic high">
144
+ <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div>
145
+ </td>
146
+ <td data-value="100" class="pct high">100%</td>
147
+ <td data-value="4" class="abs high">4/4</td>
148
+ <td data-value="100" class="pct high">100%</td>
149
+ <td data-value="2" class="abs high">2/2</td>
150
+ <td data-value="100" class="pct high">100%</td>
151
+ <td data-value="1" class="abs high">1/1</td>
152
+ <td data-value="100" class="pct high">100%</td>
138
153
  <td data-value="4" class="abs high">4/4</td>
139
154
  </tr>
140
155
 
@@ -146,7 +161,7 @@
146
161
  <div class='footer quiet pad2 space-top1 center small'>
147
162
  Code coverage generated by
148
163
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2026-05-12T09:10:26.101Z
164
+ at 2026-05-14T05:23:28.095Z
150
165
  </div>
151
166
  <script src="../prettify.js"></script>
152
167
  <script>
@@ -73,22 +73,22 @@
73
73
  <a name='L8'></a><a href='#L8'>8</a>
74
74
  <a name='L9'></a><a href='#L9'>9</a>
75
75
  <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">6x</span>
76
+ <a name='L11'></a><a href='#L11'>11</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">8x</span>
77
77
  <span class="cline-any cline-neutral">&nbsp;</span>
78
- <span class="cline-any cline-yes">4x</span>
78
+ <span class="cline-any cline-yes">5x</span>
79
79
  <span class="cline-any cline-neutral">&nbsp;</span>
80
80
  <span class="cline-any cline-neutral">&nbsp;</span>
81
81
  <span class="cline-any cline-neutral">&nbsp;</span>
82
82
  <span class="cline-any cline-neutral">&nbsp;</span>
83
- <span class="cline-any cline-yes">4x</span>
83
+ <span class="cline-any cline-yes">5x</span>
84
84
  <span class="cline-any cline-neutral">&nbsp;</span>
85
85
  <span class="cline-any cline-neutral">&nbsp;</span>
86
86
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export class MissingRequiredParamError extends Error {
87
87
  constructor(public readonly missing: readonly string[]) {
88
88
  super(
89
89
  `Missing required parameter(s): ${missing.join(', ')}.\n` +
90
- `Provide via CLI flag (--base-url / --instance-id / --user-id) ` +
91
- `or env var (BASE_URL / ENCW_INSTANCE_ID / ENCW_USER_ID / ENCW_PASSWORD).`,
90
+ `Provide via CLI flag (--env / --instance-id / --user-id) ` +
91
+ `or env var (BASE_URL / ENCW_ENV / ENCW_INSTANCE_ID / ENCW_USER_ID / ENCW_PASSWORD).`,
92
92
  );
93
93
  this.name = 'MissingRequiredParamError';
94
94
  }
@@ -100,7 +100,7 @@
100
100
  <div class='footer quiet pad2 space-top1 center small'>
101
101
  Code coverage generated by
102
102
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
103
- at 2026-05-12T09:10:26.101Z
103
+ at 2026-05-14T05:23:28.095Z
104
104
  </div>
105
105
  <script src="../prettify.js"></script>
106
106
  <script>