@elliemae/encw-leak-runner 1.0.2

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 (261) hide show
  1. package/.eslintrc.cjs +10 -0
  2. package/.stylelintignore +4 -0
  3. package/CHANGELOG.md +51 -0
  4. package/README.md +309 -0
  5. package/babel.config.cjs +2 -0
  6. package/bin/leak-runner.ts +9 -0
  7. package/dist/.tsbuildinfo +1 -0
  8. package/dist/bin/leak-runner.js +792 -0
  9. package/dist/cjs/analysis/thresholdEvaluator.js +46 -0
  10. package/dist/cjs/browser/iframeHeapProfiler.js +46 -0
  11. package/dist/cjs/cli/command.js +16 -0
  12. package/dist/cjs/cli/commands/listCommand.js +47 -0
  13. package/dist/cjs/cli/commands/runCommand.js +111 -0
  14. package/dist/cjs/cli/index.js +42 -0
  15. package/dist/cjs/config/missingRequiredParamError.js +34 -0
  16. package/dist/cjs/config/requiredEnvParams.js +57 -0
  17. package/dist/cjs/config/runnerConfigLoader.js +73 -0
  18. package/dist/cjs/config/runnerConfigSchema.js +40 -0
  19. package/dist/cjs/config/sources/cliOverrideConfigSource.js +44 -0
  20. package/dist/cjs/config/sources/configSource.js +35 -0
  21. package/dist/cjs/config/sources/envVarConfigSource.js +41 -0
  22. package/dist/cjs/config/sources/fileConfigSource.js +62 -0
  23. package/dist/cjs/index.js +52 -0
  24. package/dist/cjs/package.json +7 -0
  25. package/dist/cjs/registry/scenarioRegistry.js +51 -0
  26. package/dist/cjs/reporting/consoleReporter.js +60 -0
  27. package/dist/cjs/reporting/junitReporter.js +75 -0
  28. package/dist/cjs/reporting/reporter.js +16 -0
  29. package/dist/cjs/runner/aiEnhancementStep.js +39 -0
  30. package/dist/cjs/runner/batchRunner.js +76 -0
  31. package/dist/cjs/runner/scenarioRunner.js +165 -0
  32. package/dist/cjs/scenarios/index.js +29 -0
  33. package/dist/cjs/scenarios/one-admin/export-navigation.scenario.js +50 -0
  34. package/dist/cjs/scenarios/one-admin/index.js +27 -0
  35. package/dist/cjs/scenarios/one-admin/page-models/ExportPageModel.js +43 -0
  36. package/dist/cjs/scenarios/one-admin/page-models/SelectSettingsPageModel.js +47 -0
  37. package/dist/cjs/scenarios/one-admin/page-models/index.js +26 -0
  38. package/dist/cjs/types/config.js +27 -0
  39. package/dist/cjs/types/results.js +16 -0
  40. package/dist/cjs/types/scenario.js +16 -0
  41. package/dist/esm/analysis/thresholdEvaluator.js +26 -0
  42. package/dist/esm/browser/iframeHeapProfiler.js +26 -0
  43. package/dist/esm/cli/command.js +0 -0
  44. package/dist/esm/cli/commands/listCommand.js +27 -0
  45. package/dist/esm/cli/commands/runCommand.js +93 -0
  46. package/dist/esm/cli/index.js +22 -0
  47. package/dist/esm/config/missingRequiredParamError.js +14 -0
  48. package/dist/esm/config/requiredEnvParams.js +37 -0
  49. package/dist/esm/config/runnerConfigLoader.js +53 -0
  50. package/dist/esm/config/runnerConfigSchema.js +20 -0
  51. package/dist/esm/config/sources/cliOverrideConfigSource.js +24 -0
  52. package/dist/esm/config/sources/configSource.js +15 -0
  53. package/dist/esm/config/sources/envVarConfigSource.js +21 -0
  54. package/dist/esm/config/sources/fileConfigSource.js +34 -0
  55. package/dist/esm/index.js +35 -0
  56. package/dist/esm/package.json +7 -0
  57. package/dist/esm/registry/scenarioRegistry.js +31 -0
  58. package/dist/esm/reporting/consoleReporter.js +40 -0
  59. package/dist/esm/reporting/junitReporter.js +45 -0
  60. package/dist/esm/reporting/reporter.js +0 -0
  61. package/dist/esm/runner/aiEnhancementStep.js +22 -0
  62. package/dist/esm/runner/batchRunner.js +56 -0
  63. package/dist/esm/runner/scenarioRunner.js +137 -0
  64. package/dist/esm/scenarios/index.js +9 -0
  65. package/dist/esm/scenarios/one-admin/export-navigation.scenario.js +33 -0
  66. package/dist/esm/scenarios/one-admin/index.js +7 -0
  67. package/dist/esm/scenarios/one-admin/page-models/ExportPageModel.js +23 -0
  68. package/dist/esm/scenarios/one-admin/page-models/SelectSettingsPageModel.js +27 -0
  69. package/dist/esm/scenarios/one-admin/page-models/index.js +6 -0
  70. package/dist/esm/types/config.js +7 -0
  71. package/dist/esm/types/results.js +0 -0
  72. package/dist/esm/types/scenario.js +0 -0
  73. package/dist/types/bin/leak-runner.d.ts +2 -0
  74. package/dist/types/lib/analysis/tests/thresholdEvaluator.test.d.ts +1 -0
  75. package/dist/types/lib/analysis/thresholdEvaluator.d.ts +6 -0
  76. package/dist/types/lib/browser/iframeHeapProfiler.d.ts +9 -0
  77. package/dist/types/lib/browser/tests/iframeHeapProfiler.test.d.ts +1 -0
  78. package/dist/types/lib/cli/command.d.ts +17 -0
  79. package/dist/types/lib/cli/commands/listCommand.d.ts +5 -0
  80. package/dist/types/lib/cli/commands/runCommand.d.ts +7 -0
  81. package/dist/types/lib/cli/index.d.ts +4 -0
  82. package/dist/types/lib/config/missingRequiredParamError.d.ts +4 -0
  83. package/dist/types/lib/config/requiredEnvParams.d.ts +16 -0
  84. package/dist/types/lib/config/runnerConfigLoader.d.ts +13 -0
  85. package/dist/types/lib/config/runnerConfigSchema.d.ts +78 -0
  86. package/dist/types/lib/config/sources/cliOverrideConfigSource.d.ts +14 -0
  87. package/dist/types/lib/config/sources/configSource.d.ts +14 -0
  88. package/dist/types/lib/config/sources/envVarConfigSource.d.ts +7 -0
  89. package/dist/types/lib/config/sources/fileConfigSource.d.ts +9 -0
  90. package/dist/types/lib/config/tests/cliOverrideConfigSource.test.d.ts +1 -0
  91. package/dist/types/lib/config/tests/envVarConfigSource.test.d.ts +1 -0
  92. package/dist/types/lib/config/tests/fileConfigSource.test.d.ts +1 -0
  93. package/dist/types/lib/config/tests/requiredEnvParams.test.d.ts +1 -0
  94. package/dist/types/lib/config/tests/runnerConfigLoader.test.d.ts +1 -0
  95. package/dist/types/lib/index.d.ts +18 -0
  96. package/dist/types/lib/registry/scenarioRegistry.d.ts +18 -0
  97. package/dist/types/lib/registry/tests/scenarioRegistry.test.d.ts +1 -0
  98. package/dist/types/lib/reporting/consoleReporter.d.ts +5 -0
  99. package/dist/types/lib/reporting/junitReporter.d.ts +5 -0
  100. package/dist/types/lib/reporting/reporter.d.ts +4 -0
  101. package/dist/types/lib/reporting/tests/consoleReporter.test.d.ts +1 -0
  102. package/dist/types/lib/reporting/tests/junitReporter.test.d.ts +1 -0
  103. package/dist/types/lib/runner/aiEnhancementStep.d.ts +15 -0
  104. package/dist/types/lib/runner/batchRunner.d.ts +14 -0
  105. package/dist/types/lib/runner/scenarioRunner.d.ts +15 -0
  106. package/dist/types/lib/runner/tests/aiEnhancementStep.test.d.ts +1 -0
  107. package/dist/types/lib/runner/tests/batchRunner.test.d.ts +1 -0
  108. package/dist/types/lib/runner/tests/scenarioRunner.test.d.ts +1 -0
  109. package/dist/types/lib/scenarios/index.d.ts +2 -0
  110. package/dist/types/lib/scenarios/one-admin/export-navigation.scenario.d.ts +2 -0
  111. package/dist/types/lib/scenarios/one-admin/index.d.ts +2 -0
  112. package/dist/types/lib/scenarios/one-admin/page-models/ExportPageModel.d.ts +8 -0
  113. package/dist/types/lib/scenarios/one-admin/page-models/SelectSettingsPageModel.d.ts +10 -0
  114. package/dist/types/lib/scenarios/one-admin/page-models/index.d.ts +2 -0
  115. package/dist/types/lib/types/config.d.ts +26 -0
  116. package/dist/types/lib/types/results.d.ts +19 -0
  117. package/dist/types/lib/types/scenario.d.ts +17 -0
  118. package/jest.config.cjs +9 -0
  119. package/leak-runner.config.json +13 -0
  120. package/leak-runner.schema.json +27 -0
  121. package/lib/analysis/tests/thresholdEvaluator.test.ts +125 -0
  122. package/lib/analysis/thresholdEvaluator.ts +36 -0
  123. package/lib/browser/iframeHeapProfiler.ts +30 -0
  124. package/lib/browser/tests/iframeHeapProfiler.test.ts +71 -0
  125. package/lib/cli/command.ts +19 -0
  126. package/lib/cli/commands/listCommand.ts +36 -0
  127. package/lib/cli/commands/runCommand.ts +126 -0
  128. package/lib/cli/index.ts +25 -0
  129. package/lib/config/missingRequiredParamError.ts +10 -0
  130. package/lib/config/requiredEnvParams.ts +50 -0
  131. package/lib/config/runnerConfigLoader.ts +84 -0
  132. package/lib/config/runnerConfigSchema.ts +27 -0
  133. package/lib/config/sources/cliOverrideConfigSource.ts +30 -0
  134. package/lib/config/sources/configSource.ts +27 -0
  135. package/lib/config/sources/envVarConfigSource.ts +23 -0
  136. package/lib/config/sources/fileConfigSource.ts +39 -0
  137. package/lib/config/tests/cliOverrideConfigSource.test.ts +25 -0
  138. package/lib/config/tests/envVarConfigSource.test.ts +57 -0
  139. package/lib/config/tests/fileConfigSource.test.ts +49 -0
  140. package/lib/config/tests/requiredEnvParams.test.ts +113 -0
  141. package/lib/config/tests/runnerConfigLoader.test.ts +59 -0
  142. package/lib/index.ts +37 -0
  143. package/lib/registry/scenarioRegistry.ts +48 -0
  144. package/lib/registry/tests/scenarioRegistry.test.ts +96 -0
  145. package/lib/reporting/consoleReporter.ts +48 -0
  146. package/lib/reporting/junitReporter.ts +62 -0
  147. package/lib/reporting/reporter.ts +5 -0
  148. package/lib/reporting/tests/consoleReporter.test.ts +82 -0
  149. package/lib/reporting/tests/junitReporter.test.ts +103 -0
  150. package/lib/runner/aiEnhancementStep.ts +39 -0
  151. package/lib/runner/batchRunner.ts +71 -0
  152. package/lib/runner/scenarioRunner.ts +189 -0
  153. package/lib/runner/tests/aiEnhancementStep.test.ts +174 -0
  154. package/lib/runner/tests/batchRunner.test.ts +133 -0
  155. package/lib/runner/tests/scenarioRunner.test.ts +162 -0
  156. package/lib/scenarios/index.ts +8 -0
  157. package/lib/scenarios/one-admin/export-navigation.scenario.ts +38 -0
  158. package/lib/scenarios/one-admin/index.ts +6 -0
  159. package/lib/scenarios/one-admin/page-models/ExportPageModel.ts +26 -0
  160. package/lib/scenarios/one-admin/page-models/SelectSettingsPageModel.ts +30 -0
  161. package/lib/scenarios/one-admin/page-models/index.ts +2 -0
  162. package/lib/types/config.ts +34 -0
  163. package/lib/types/results.ts +22 -0
  164. package/lib/types/scenario.ts +18 -0
  165. package/package.json +46 -0
  166. package/reports/analysis/index.html +116 -0
  167. package/reports/analysis/thresholdEvaluator.ts.html +193 -0
  168. package/reports/base.css +224 -0
  169. package/reports/block-navigation.js +87 -0
  170. package/reports/browser/iframeHeapProfiler.ts.html +175 -0
  171. package/reports/browser/index.html +116 -0
  172. package/reports/cli/commands/index.html +131 -0
  173. package/reports/cli/commands/listCommand.ts.html +193 -0
  174. package/reports/cli/commands/runCommand.ts.html +463 -0
  175. package/reports/cli/index.html +116 -0
  176. package/reports/cli/index.ts.html +160 -0
  177. package/reports/config/index.html +161 -0
  178. package/reports/config/missingRequiredParamError.ts.html +115 -0
  179. package/reports/config/requiredEnvParams.ts.html +235 -0
  180. package/reports/config/runnerConfigLoader.ts.html +337 -0
  181. package/reports/config/runnerConfigSchema.ts.html +166 -0
  182. package/reports/config/sources/cliOverrideConfigSource.ts.html +175 -0
  183. package/reports/config/sources/configSource.ts.html +166 -0
  184. package/reports/config/sources/envVarConfigSource.ts.html +154 -0
  185. package/reports/config/sources/fileConfigSource.ts.html +202 -0
  186. package/reports/config/sources/index.html +161 -0
  187. package/reports/favicon.png +0 -0
  188. package/reports/index.html +296 -0
  189. package/reports/lcov-report/analysis/index.html +116 -0
  190. package/reports/lcov-report/analysis/thresholdEvaluator.ts.html +193 -0
  191. package/reports/lcov-report/base.css +224 -0
  192. package/reports/lcov-report/block-navigation.js +87 -0
  193. package/reports/lcov-report/browser/iframeHeapProfiler.ts.html +175 -0
  194. package/reports/lcov-report/browser/index.html +116 -0
  195. package/reports/lcov-report/cli/commands/index.html +131 -0
  196. package/reports/lcov-report/cli/commands/listCommand.ts.html +193 -0
  197. package/reports/lcov-report/cli/commands/runCommand.ts.html +463 -0
  198. package/reports/lcov-report/cli/index.html +116 -0
  199. package/reports/lcov-report/cli/index.ts.html +160 -0
  200. package/reports/lcov-report/config/index.html +161 -0
  201. package/reports/lcov-report/config/missingRequiredParamError.ts.html +115 -0
  202. package/reports/lcov-report/config/requiredEnvParams.ts.html +235 -0
  203. package/reports/lcov-report/config/runnerConfigLoader.ts.html +337 -0
  204. package/reports/lcov-report/config/runnerConfigSchema.ts.html +166 -0
  205. package/reports/lcov-report/config/sources/cliOverrideConfigSource.ts.html +175 -0
  206. package/reports/lcov-report/config/sources/configSource.ts.html +166 -0
  207. package/reports/lcov-report/config/sources/envVarConfigSource.ts.html +154 -0
  208. package/reports/lcov-report/config/sources/fileConfigSource.ts.html +202 -0
  209. package/reports/lcov-report/config/sources/index.html +161 -0
  210. package/reports/lcov-report/favicon.png +0 -0
  211. package/reports/lcov-report/index.html +296 -0
  212. package/reports/lcov-report/prettify.css +1 -0
  213. package/reports/lcov-report/prettify.js +2 -0
  214. package/reports/lcov-report/registry/index.html +116 -0
  215. package/reports/lcov-report/registry/scenarioRegistry.ts.html +229 -0
  216. package/reports/lcov-report/reporting/consoleReporter.ts.html +229 -0
  217. package/reports/lcov-report/reporting/index.html +131 -0
  218. package/reports/lcov-report/reporting/junitReporter.ts.html +271 -0
  219. package/reports/lcov-report/runner/aiEnhancementStep.ts.html +202 -0
  220. package/reports/lcov-report/runner/batchRunner.ts.html +298 -0
  221. package/reports/lcov-report/runner/index.html +146 -0
  222. package/reports/lcov-report/runner/scenarioRunner.ts.html +652 -0
  223. package/reports/lcov-report/scenarios/index.html +116 -0
  224. package/reports/lcov-report/scenarios/index.ts.html +109 -0
  225. package/reports/lcov-report/scenarios/one-admin/export-navigation.scenario.ts.html +199 -0
  226. package/reports/lcov-report/scenarios/one-admin/index.html +131 -0
  227. package/reports/lcov-report/scenarios/one-admin/index.ts.html +103 -0
  228. package/reports/lcov-report/scenarios/one-admin/page-models/ExportPageModel.ts.html +163 -0
  229. package/reports/lcov-report/scenarios/one-admin/page-models/SelectSettingsPageModel.ts.html +175 -0
  230. package/reports/lcov-report/scenarios/one-admin/page-models/index.html +131 -0
  231. package/reports/lcov-report/sort-arrow-sprite.png +0 -0
  232. package/reports/lcov-report/sorter.js +210 -0
  233. package/reports/lcov-report/types/config.ts.html +187 -0
  234. package/reports/lcov-report/types/index.html +116 -0
  235. package/reports/lcov.info +883 -0
  236. package/reports/prettify.css +1 -0
  237. package/reports/prettify.js +2 -0
  238. package/reports/registry/index.html +116 -0
  239. package/reports/registry/scenarioRegistry.ts.html +229 -0
  240. package/reports/reporting/consoleReporter.ts.html +229 -0
  241. package/reports/reporting/index.html +131 -0
  242. package/reports/reporting/junitReporter.ts.html +271 -0
  243. package/reports/runner/aiEnhancementStep.ts.html +202 -0
  244. package/reports/runner/batchRunner.ts.html +298 -0
  245. package/reports/runner/index.html +146 -0
  246. package/reports/runner/scenarioRunner.ts.html +652 -0
  247. package/reports/scenarios/index.html +116 -0
  248. package/reports/scenarios/index.ts.html +109 -0
  249. package/reports/scenarios/one-admin/export-navigation.scenario.ts.html +199 -0
  250. package/reports/scenarios/one-admin/index.html +131 -0
  251. package/reports/scenarios/one-admin/index.ts.html +103 -0
  252. package/reports/scenarios/one-admin/page-models/ExportPageModel.ts.html +163 -0
  253. package/reports/scenarios/one-admin/page-models/SelectSettingsPageModel.ts.html +175 -0
  254. package/reports/scenarios/one-admin/page-models/index.html +131 -0
  255. package/reports/sort-arrow-sprite.png +0 -0
  256. package/reports/sorter.js +210 -0
  257. package/reports/types/config.ts.html +187 -0
  258. package/reports/types/index.html +116 -0
  259. package/stylelint.config.cjs +2 -0
  260. package/test-report.xml +100 -0
  261. package/tsconfig.json +12 -0
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var export_navigation_scenario_exports = {};
20
+ __export(export_navigation_scenario_exports, {
21
+ exportNavigationScenario: () => exportNavigationScenario
22
+ });
23
+ module.exports = __toCommonJS(export_navigation_scenario_exports);
24
+ var import_page_models = require("./page-models/index.js");
25
+ const exportNavigationScenario = {
26
+ id: "export-navigation",
27
+ name: "Export Navigation",
28
+ description: "Navigate to export page and come back - verify iframe GC",
29
+ tags: ["critical"],
30
+ microappSelector: "iframe#pui-iframe-container-emAdminUI",
31
+ url: () => "/admin/oneadmin/migrate",
32
+ async action(page, frame) {
33
+ const settings = new import_page_models.SelectSettingsPageModel(frame);
34
+ await settings.container.waitFor({ state: "visible" });
35
+ await settings.expandTreeItem("eFolder");
36
+ await settings.selectTreeItem("Enhanced Conditions");
37
+ await settings.clickExport();
38
+ const exportPage = new import_page_models.ExportPageModel(frame);
39
+ await exportPage.sourceDataTab.waitFor({ state: "visible" });
40
+ await exportPage.dataTable.waitFor({ state: "visible" });
41
+ },
42
+ async back(page) {
43
+ await import_page_models.ExportPageModel.clickBackAndWaitForSettings(page);
44
+ },
45
+ repeat: () => 3,
46
+ thresholds: {
47
+ maxRetainedSizeDeltaBytes: 10 * 1024 * 1024,
48
+ maxNewLeakGroups: 0
49
+ }
50
+ };
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var one_admin_exports = {};
20
+ __export(one_admin_exports, {
21
+ oneAdminScenarios: () => oneAdminScenarios
22
+ });
23
+ module.exports = __toCommonJS(one_admin_exports);
24
+ var import_export_navigation_scenario = require("./export-navigation.scenario.js");
25
+ const oneAdminScenarios = [
26
+ import_export_navigation_scenario.exportNavigationScenario
27
+ ];
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var ExportPageModel_exports = {};
20
+ __export(ExportPageModel_exports, {
21
+ ExportPageModel: () => ExportPageModel
22
+ });
23
+ module.exports = __toCommonJS(ExportPageModel_exports);
24
+ const IFRAME_SELECTOR = "iframe#pui-iframe-container-emAdminUI";
25
+ const SETTINGS_URL_PATTERN = /\/admin\/oneadmin\/migrate(?:\/)?$/;
26
+ class ExportPageModel {
27
+ constructor(frame) {
28
+ this.frame = frame;
29
+ }
30
+ frame;
31
+ get sourceDataTab() {
32
+ return this.frame.getByRole("tab", { name: /Source Data/i });
33
+ }
34
+ get dataTable() {
35
+ return this.frame.locator('[role="table"]').first();
36
+ }
37
+ static async clickBackAndWaitForSettings(page) {
38
+ await Promise.all([
39
+ page.waitForURL(SETTINGS_URL_PATTERN),
40
+ page.frameLocator(IFRAME_SELECTOR).getByRole("button", { name: /back/i }).click()
41
+ ]);
42
+ }
43
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var SelectSettingsPageModel_exports = {};
20
+ __export(SelectSettingsPageModel_exports, {
21
+ SelectSettingsPageModel: () => SelectSettingsPageModel
22
+ });
23
+ module.exports = __toCommonJS(SelectSettingsPageModel_exports);
24
+ class SelectSettingsPageModel {
25
+ constructor(frame) {
26
+ this.frame = frame;
27
+ }
28
+ frame;
29
+ get container() {
30
+ return this.frame.locator("#one-admin-console-container");
31
+ }
32
+ get exportButton() {
33
+ return this.frame.getByRole("button", { name: "Export" });
34
+ }
35
+ async expandTreeItem(name) {
36
+ const treeItem = this.frame.locator(
37
+ `[role="treeitem"]:has-text("${name}")`
38
+ );
39
+ await treeItem.locator('button[aria-label*="expand"], button[aria-label*="toggle"]').click();
40
+ }
41
+ async selectTreeItem(name) {
42
+ await this.frame.locator(`[role="treeitem"]:has-text("${name}")`).click();
43
+ }
44
+ async clickExport() {
45
+ await this.exportButton.click();
46
+ }
47
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var page_models_exports = {};
20
+ __export(page_models_exports, {
21
+ ExportPageModel: () => import_ExportPageModel.ExportPageModel,
22
+ SelectSettingsPageModel: () => import_SelectSettingsPageModel.SelectSettingsPageModel
23
+ });
24
+ module.exports = __toCommonJS(page_models_exports);
25
+ var import_SelectSettingsPageModel = require("./SelectSettingsPageModel.js");
26
+ var import_ExportPageModel = require("./ExportPageModel.js");
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var config_exports = {};
20
+ __export(config_exports, {
21
+ DEFAULT_THRESHOLDS: () => DEFAULT_THRESHOLDS
22
+ });
23
+ module.exports = __toCommonJS(config_exports);
24
+ const DEFAULT_THRESHOLDS = {
25
+ maxRetainedSizeDeltaBytes: 10 * 1024 * 1024,
26
+ maxNewLeakGroups: 0
27
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var results_exports = {};
16
+ module.exports = __toCommonJS(results_exports);
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var scenario_exports = {};
16
+ module.exports = __toCommonJS(scenario_exports);
@@ -0,0 +1,26 @@
1
+ function toMB(bytes) {
2
+ return (bytes / (1024 * 1024)).toFixed(1);
3
+ }
4
+ class ThresholdEvaluator {
5
+ static evaluate(report, thresholds) {
6
+ const reasons = [];
7
+ if (report.delta.retainedSizeDelta > thresholds.maxRetainedSizeDeltaBytes) {
8
+ reasons.push(
9
+ `Retained size delta ${toMB(report.delta.retainedSizeDelta)} MB exceeds threshold ${toMB(thresholds.maxRetainedSizeDeltaBytes)} MB`
10
+ );
11
+ }
12
+ const newLeakCount = report.delta.newLeakGroups.length;
13
+ if (newLeakCount > thresholds.maxNewLeakGroups) {
14
+ reasons.push(
15
+ `${newLeakCount} new leak groups detected (threshold: ${thresholds.maxNewLeakGroups})`
16
+ );
17
+ }
18
+ if (reasons.length === 0) {
19
+ return { passed: true, reason: null };
20
+ }
21
+ return { passed: false, reason: reasons.join("; ") };
22
+ }
23
+ }
24
+ export {
25
+ ThresholdEvaluator
26
+ };
@@ -0,0 +1,26 @@
1
+ import { HeapMemoryProfiler } from "@elliemae/smoked-suite";
2
+ class IframeHeapProfiler extends HeapMemoryProfiler {
3
+ constructor(profiledPage, frame, outputDir) {
4
+ super(profiledPage, outputDir);
5
+ this.profiledPage = profiledPage;
6
+ this.frame = frame;
7
+ }
8
+ profiledPage;
9
+ frame;
10
+ getCDPTarget() {
11
+ return this.isSameOriginAsPage(this.frame) ? this.profiledPage : this.frame;
12
+ }
13
+ isSameOriginAsPage(frame) {
14
+ const frameUrl = frame.url();
15
+ const pageUrl = this.profiledPage.url();
16
+ if (!frameUrl || frameUrl === "about:blank") return true;
17
+ try {
18
+ return new URL(frameUrl).origin === new URL(pageUrl).origin;
19
+ } catch {
20
+ return true;
21
+ }
22
+ }
23
+ }
24
+ export {
25
+ IframeHeapProfiler
26
+ };
File without changes
@@ -0,0 +1,27 @@
1
+ class ListCommand {
2
+ register(program, deps) {
3
+ program.command("list").description("List all registered scenarios").option("--tag <tag>", "Filter by tag").action((options) => {
4
+ const entries = options.tag ? deps.registry.filterByTag(options.tag) : deps.registry.list();
5
+ if (entries.length === 0) {
6
+ process.stdout.write("No scenarios found.\n");
7
+ return;
8
+ }
9
+ const keyWidth = Math.max(...entries.map((e) => e.key.length), 32);
10
+ process.stdout.write(`
11
+ REGISTERED SCENARIOS (${entries.length})
12
+
13
+ `);
14
+ entries.forEach(({ key, scenario }) => {
15
+ const tags = scenario.tags?.length ? `[${scenario.tags.join(", ")}]` : "";
16
+ process.stdout.write(
17
+ ` ${key.padEnd(keyWidth)} ${tags.padEnd(20)} ${scenario.description}
18
+ `
19
+ );
20
+ });
21
+ process.stdout.write("\n");
22
+ });
23
+ }
24
+ }
25
+ export {
26
+ ListCommand
27
+ };
@@ -0,0 +1,93 @@
1
+ import { BatchRunner } from "../../runner/batchRunner.js";
2
+ import { ConsoleReporter } from "../../reporting/consoleReporter.js";
3
+ import { JunitReporter } from "../../reporting/junitReporter.js";
4
+ import {
5
+ CliOverrideConfigSource
6
+ } from "../../config/sources/cliOverrideConfigSource.js";
7
+ import { EnvVarConfigSource } from "../../config/sources/envVarConfigSource.js";
8
+ import { FileConfigSource } from "../../config/sources/fileConfigSource.js";
9
+ import { RunnerConfigLoader } from "../../config/runnerConfigLoader.js";
10
+ import { MissingRequiredParamError } from "../../config/requiredEnvParams.js";
11
+ class RunCommand {
12
+ register(program, deps) {
13
+ program.command("run [key]").description(
14
+ "Run a scenario by `<microapp>/<id>`, or use --all / --tag to run multiple"
15
+ ).option("--all", "Run all registered scenarios").option("--tag <tag>", "Run all scenarios matching a tag").option("--base-url <url>", "Override base URL").option("--instance-id <id>", "Override instance ID").option("--user-id <id>", "Override user ID").option("--output-dir <dir>", "Override output directory").option(
16
+ "--top-n <n>",
17
+ "Override top-N for heap comparison",
18
+ (v) => parseInt(v, 10)
19
+ ).option(
20
+ "--headless <bool>",
21
+ "Override headless mode",
22
+ (v) => v !== "false"
23
+ ).option("--config-file <path>", "Path to leak-runner.config.json").action(async (key, options) => {
24
+ try {
25
+ const config = this.buildConfig(options, deps);
26
+ const runner = new BatchRunner(config, deps.registry);
27
+ const summary = await this.selectSummary(runner, key, options);
28
+ new ConsoleReporter().write(summary);
29
+ await new JunitReporter().write(summary, config.runner.outputDir);
30
+ process.exit(summary.failCount > 0 ? 1 : 0);
31
+ } catch (err) {
32
+ if (err instanceof MissingRequiredParamError) {
33
+ process.stderr.write(`Configuration error: ${err.message}
34
+ `);
35
+ process.exit(2);
36
+ }
37
+ process.stderr.write(`Fatal: ${err.message}
38
+ `);
39
+ process.exit(1);
40
+ }
41
+ });
42
+ }
43
+ buildConfig(options, deps) {
44
+ const filePath = options.configFile ?? `${process.cwd()}/leak-runner.config.json`;
45
+ const loader = new RunnerConfigLoader([
46
+ new FileConfigSource(filePath),
47
+ new EnvVarConfigSource(),
48
+ new CliOverrideConfigSource({
49
+ headless: options.headless,
50
+ outputDir: options.outputDir,
51
+ topN: options.topN
52
+ })
53
+ ]);
54
+ const resolved = loader.resolveOptions();
55
+ const env = deps.envParams.resolve({
56
+ baseUrl: options.baseUrl,
57
+ instanceId: options.instanceId,
58
+ userId: options.userId
59
+ });
60
+ let ai;
61
+ if (resolved.aiEnabled) {
62
+ ai = {
63
+ model: resolved.aiModel,
64
+ temperature: resolved.aiTemperature,
65
+ apiKey: process.env.GENICE_API_KEY ?? ""
66
+ };
67
+ }
68
+ return { env, runner: resolved.runner, ai };
69
+ }
70
+ async selectSummary(runner, key, options) {
71
+ if (options.all) return runner.runAll();
72
+ if (options.tag) {
73
+ const summary = await runner.runByTag(options.tag);
74
+ if (summary.results.length === 0) {
75
+ process.stderr.write(
76
+ `Warning: no scenarios matched tag "${options.tag}"
77
+ `
78
+ );
79
+ process.exit(1);
80
+ }
81
+ return summary;
82
+ }
83
+ if (key) return runner.runByName(key);
84
+ process.stderr.write(
85
+ "Error: specify a scenario key (e.g. one-admin/export-navigation), --all, or --tag <tag>\n"
86
+ );
87
+ process.exit(1);
88
+ throw new Error("unreachable");
89
+ }
90
+ }
91
+ export {
92
+ RunCommand
93
+ };
@@ -0,0 +1,22 @@
1
+ import { Command } from "commander";
2
+ import { RunCommand } from "./commands/runCommand.js";
3
+ import { ListCommand } from "./commands/listCommand.js";
4
+ import { RequiredEnvParamsResolver } from "../config/requiredEnvParams.js";
5
+ import { scenarioRegistry as populatedRegistry } from "../scenarios/index.js";
6
+ function buildProgram(deps = defaultDeps()) {
7
+ const program = new Command();
8
+ program.name("leak-runner").description("Microapp memory leak runner for Encompass Web").version("1.0.0");
9
+ const commands = [new RunCommand(), new ListCommand()];
10
+ commands.forEach((cmd) => cmd.register(program, deps));
11
+ return program;
12
+ }
13
+ function defaultDeps() {
14
+ return {
15
+ registry: populatedRegistry,
16
+ envParams: new RequiredEnvParamsResolver()
17
+ };
18
+ }
19
+ export {
20
+ buildProgram,
21
+ defaultDeps
22
+ };
@@ -0,0 +1,14 @@
1
+ class MissingRequiredParamError extends Error {
2
+ constructor(missing) {
3
+ super(
4
+ `Missing required parameter(s): ${missing.join(", ")}.
5
+ Provide via CLI flag (--base-url / --instance-id / --user-id) or env var (BASE_URL / ENCW_INSTANCE_ID / ENCW_USER_ID / ENCW_PASSWORD).`
6
+ );
7
+ this.missing = missing;
8
+ this.name = "MissingRequiredParamError";
9
+ }
10
+ missing;
11
+ }
12
+ export {
13
+ MissingRequiredParamError
14
+ };
@@ -0,0 +1,37 @@
1
+ import { MissingRequiredParamError } from "./missingRequiredParamError.js";
2
+ class RequiredEnvParamsResolver {
3
+ resolve(cliOpts) {
4
+ const baseUrl = this.resolveBaseUrl(cliOpts);
5
+ const instanceId = this.resolveInstanceId(cliOpts);
6
+ const userId = this.resolveUserId(cliOpts);
7
+ const password = this.resolvePassword();
8
+ const params = { baseUrl, instanceId, userId, password };
9
+ const missing = this.collectMissing(params);
10
+ if (missing.length > 0) throw new MissingRequiredParamError(missing);
11
+ return params;
12
+ }
13
+ resolveBaseUrl(cliOpts) {
14
+ return cliOpts.baseUrl || process.env.BASE_URL || "";
15
+ }
16
+ resolveInstanceId(cliOpts) {
17
+ return cliOpts.instanceId || process.env.ENCW_INSTANCE_ID || "";
18
+ }
19
+ resolveUserId(cliOpts) {
20
+ return cliOpts.userId || process.env.ENCW_USER_ID || "";
21
+ }
22
+ resolvePassword() {
23
+ return process.env.ENCW_PASSWORD || "";
24
+ }
25
+ collectMissing(params) {
26
+ const missing = [];
27
+ if (!params.baseUrl) missing.push("baseUrl");
28
+ if (!params.instanceId) missing.push("instanceId");
29
+ if (!params.userId) missing.push("userId");
30
+ if (!params.password) missing.push("password (ENCW_PASSWORD)");
31
+ return missing;
32
+ }
33
+ }
34
+ export {
35
+ MissingRequiredParamError,
36
+ RequiredEnvParamsResolver
37
+ };
@@ -0,0 +1,53 @@
1
+ import { BUILT_IN_DEFAULTS } from "./sources/configSource.js";
2
+ function applyRunnerPayload(acc, payload) {
3
+ return {
4
+ headless: payload.headless ?? acc.headless,
5
+ outputDir: payload.outputDir ?? acc.outputDir,
6
+ topN: payload.topN ?? acc.topN
7
+ };
8
+ }
9
+ function applyAiPayload(acc, payload) {
10
+ return {
11
+ aiEnabled: payload.enabled ?? acc.aiEnabled,
12
+ aiModel: payload.model ?? acc.aiModel,
13
+ aiTemperature: payload.temperature ?? acc.aiTemperature
14
+ };
15
+ }
16
+ function applySource(acc, source) {
17
+ const payload = source.load();
18
+ return {
19
+ runner: payload.runner ? applyRunnerPayload(acc.runner, payload.runner) : acc.runner,
20
+ ai: payload.ai ? applyAiPayload(acc.ai, payload.ai) : acc.ai
21
+ };
22
+ }
23
+ class RunnerConfigLoader {
24
+ constructor(sources) {
25
+ this.sources = sources;
26
+ }
27
+ sources;
28
+ resolveOptions() {
29
+ const ordered = [...this.sources].sort((a, b) => a.priority - b.priority);
30
+ const initial = {
31
+ runner: {
32
+ headless: BUILT_IN_DEFAULTS.runner.headless ?? true,
33
+ outputDir: BUILT_IN_DEFAULTS.runner.outputDir ?? "./leak-reports/",
34
+ topN: BUILT_IN_DEFAULTS.runner.topN ?? 5
35
+ },
36
+ ai: {
37
+ aiEnabled: BUILT_IN_DEFAULTS.ai.enabled ?? false,
38
+ aiModel: BUILT_IN_DEFAULTS.ai.model ?? "Claude3.7",
39
+ aiTemperature: BUILT_IN_DEFAULTS.ai.temperature ?? 0.3
40
+ }
41
+ };
42
+ const resolved = ordered.reduce(applySource, initial);
43
+ return {
44
+ runner: resolved.runner,
45
+ aiEnabled: resolved.ai.aiEnabled,
46
+ aiModel: resolved.ai.aiModel,
47
+ aiTemperature: resolved.ai.aiTemperature
48
+ };
49
+ }
50
+ }
51
+ export {
52
+ RunnerConfigLoader
53
+ };
@@ -0,0 +1,20 @@
1
+ import { z } from "zod";
2
+ const runnerOptionsSchema = z.object({
3
+ headless: z.boolean(),
4
+ outputDir: z.string().min(1),
5
+ topN: z.number().int().min(1)
6
+ }).partial();
7
+ const aiConfigFileSchema = z.object({
8
+ enabled: z.boolean(),
9
+ model: z.string().min(1),
10
+ temperature: z.number().min(0).max(2)
11
+ }).partial();
12
+ const runnerConfigFileSchema = z.object({
13
+ runner: runnerOptionsSchema,
14
+ ai: aiConfigFileSchema
15
+ }).partial().strict();
16
+ export {
17
+ aiConfigFileSchema,
18
+ runnerConfigFileSchema,
19
+ runnerOptionsSchema
20
+ };
@@ -0,0 +1,24 @@
1
+ class CliOverrideConfigSource {
2
+ constructor(overrides) {
3
+ this.overrides = overrides;
4
+ }
5
+ overrides;
6
+ priority = 3;
7
+ name = "cli";
8
+ load() {
9
+ const runner = {};
10
+ if (this.overrides.headless !== void 0) {
11
+ runner.headless = this.overrides.headless;
12
+ }
13
+ if (this.overrides.outputDir !== void 0) {
14
+ runner.outputDir = this.overrides.outputDir;
15
+ }
16
+ if (this.overrides.topN !== void 0) {
17
+ runner.topN = this.overrides.topN;
18
+ }
19
+ return Object.keys(runner).length === 0 ? {} : { runner };
20
+ }
21
+ }
22
+ export {
23
+ CliOverrideConfigSource
24
+ };
@@ -0,0 +1,15 @@
1
+ const BUILT_IN_DEFAULTS = {
2
+ runner: {
3
+ headless: true,
4
+ outputDir: "./leak-reports/",
5
+ topN: 5
6
+ },
7
+ ai: {
8
+ enabled: false,
9
+ model: "Claude3.7",
10
+ temperature: 0.3
11
+ }
12
+ };
13
+ export {
14
+ BUILT_IN_DEFAULTS
15
+ };
@@ -0,0 +1,21 @@
1
+ class EnvVarConfigSource {
2
+ priority = 2;
3
+ name = "env";
4
+ load() {
5
+ const runner = {};
6
+ if (process.env.HEADLESS !== void 0) {
7
+ runner.headless = process.env.HEADLESS !== "false";
8
+ }
9
+ if (process.env.LEAK_OUTPUT_DIR) {
10
+ runner.outputDir = process.env.LEAK_OUTPUT_DIR;
11
+ }
12
+ if (process.env.LEAK_TOP_N) {
13
+ const parsed = parseInt(process.env.LEAK_TOP_N, 10);
14
+ if (Number.isFinite(parsed) && parsed > 0) runner.topN = parsed;
15
+ }
16
+ return Object.keys(runner).length === 0 ? {} : { runner };
17
+ }
18
+ }
19
+ export {
20
+ EnvVarConfigSource
21
+ };