@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.
- package/.eslintrc.cjs +10 -0
- package/.stylelintignore +4 -0
- package/CHANGELOG.md +51 -0
- package/README.md +309 -0
- package/babel.config.cjs +2 -0
- package/bin/leak-runner.ts +9 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/bin/leak-runner.js +792 -0
- package/dist/cjs/analysis/thresholdEvaluator.js +46 -0
- package/dist/cjs/browser/iframeHeapProfiler.js +46 -0
- package/dist/cjs/cli/command.js +16 -0
- package/dist/cjs/cli/commands/listCommand.js +47 -0
- package/dist/cjs/cli/commands/runCommand.js +111 -0
- package/dist/cjs/cli/index.js +42 -0
- package/dist/cjs/config/missingRequiredParamError.js +34 -0
- package/dist/cjs/config/requiredEnvParams.js +57 -0
- package/dist/cjs/config/runnerConfigLoader.js +73 -0
- package/dist/cjs/config/runnerConfigSchema.js +40 -0
- package/dist/cjs/config/sources/cliOverrideConfigSource.js +44 -0
- package/dist/cjs/config/sources/configSource.js +35 -0
- package/dist/cjs/config/sources/envVarConfigSource.js +41 -0
- package/dist/cjs/config/sources/fileConfigSource.js +62 -0
- package/dist/cjs/index.js +52 -0
- package/dist/cjs/package.json +7 -0
- package/dist/cjs/registry/scenarioRegistry.js +51 -0
- package/dist/cjs/reporting/consoleReporter.js +60 -0
- package/dist/cjs/reporting/junitReporter.js +75 -0
- package/dist/cjs/reporting/reporter.js +16 -0
- package/dist/cjs/runner/aiEnhancementStep.js +39 -0
- package/dist/cjs/runner/batchRunner.js +76 -0
- package/dist/cjs/runner/scenarioRunner.js +165 -0
- package/dist/cjs/scenarios/index.js +29 -0
- package/dist/cjs/scenarios/one-admin/export-navigation.scenario.js +50 -0
- package/dist/cjs/scenarios/one-admin/index.js +27 -0
- package/dist/cjs/scenarios/one-admin/page-models/ExportPageModel.js +43 -0
- package/dist/cjs/scenarios/one-admin/page-models/SelectSettingsPageModel.js +47 -0
- package/dist/cjs/scenarios/one-admin/page-models/index.js +26 -0
- package/dist/cjs/types/config.js +27 -0
- package/dist/cjs/types/results.js +16 -0
- package/dist/cjs/types/scenario.js +16 -0
- package/dist/esm/analysis/thresholdEvaluator.js +26 -0
- package/dist/esm/browser/iframeHeapProfiler.js +26 -0
- package/dist/esm/cli/command.js +0 -0
- package/dist/esm/cli/commands/listCommand.js +27 -0
- package/dist/esm/cli/commands/runCommand.js +93 -0
- package/dist/esm/cli/index.js +22 -0
- package/dist/esm/config/missingRequiredParamError.js +14 -0
- package/dist/esm/config/requiredEnvParams.js +37 -0
- package/dist/esm/config/runnerConfigLoader.js +53 -0
- package/dist/esm/config/runnerConfigSchema.js +20 -0
- package/dist/esm/config/sources/cliOverrideConfigSource.js +24 -0
- package/dist/esm/config/sources/configSource.js +15 -0
- package/dist/esm/config/sources/envVarConfigSource.js +21 -0
- package/dist/esm/config/sources/fileConfigSource.js +34 -0
- package/dist/esm/index.js +35 -0
- package/dist/esm/package.json +7 -0
- package/dist/esm/registry/scenarioRegistry.js +31 -0
- package/dist/esm/reporting/consoleReporter.js +40 -0
- package/dist/esm/reporting/junitReporter.js +45 -0
- package/dist/esm/reporting/reporter.js +0 -0
- package/dist/esm/runner/aiEnhancementStep.js +22 -0
- package/dist/esm/runner/batchRunner.js +56 -0
- package/dist/esm/runner/scenarioRunner.js +137 -0
- package/dist/esm/scenarios/index.js +9 -0
- package/dist/esm/scenarios/one-admin/export-navigation.scenario.js +33 -0
- package/dist/esm/scenarios/one-admin/index.js +7 -0
- package/dist/esm/scenarios/one-admin/page-models/ExportPageModel.js +23 -0
- package/dist/esm/scenarios/one-admin/page-models/SelectSettingsPageModel.js +27 -0
- package/dist/esm/scenarios/one-admin/page-models/index.js +6 -0
- package/dist/esm/types/config.js +7 -0
- package/dist/esm/types/results.js +0 -0
- package/dist/esm/types/scenario.js +0 -0
- package/dist/types/bin/leak-runner.d.ts +2 -0
- package/dist/types/lib/analysis/tests/thresholdEvaluator.test.d.ts +1 -0
- package/dist/types/lib/analysis/thresholdEvaluator.d.ts +6 -0
- package/dist/types/lib/browser/iframeHeapProfiler.d.ts +9 -0
- package/dist/types/lib/browser/tests/iframeHeapProfiler.test.d.ts +1 -0
- package/dist/types/lib/cli/command.d.ts +17 -0
- package/dist/types/lib/cli/commands/listCommand.d.ts +5 -0
- package/dist/types/lib/cli/commands/runCommand.d.ts +7 -0
- package/dist/types/lib/cli/index.d.ts +4 -0
- package/dist/types/lib/config/missingRequiredParamError.d.ts +4 -0
- package/dist/types/lib/config/requiredEnvParams.d.ts +16 -0
- package/dist/types/lib/config/runnerConfigLoader.d.ts +13 -0
- package/dist/types/lib/config/runnerConfigSchema.d.ts +78 -0
- package/dist/types/lib/config/sources/cliOverrideConfigSource.d.ts +14 -0
- package/dist/types/lib/config/sources/configSource.d.ts +14 -0
- package/dist/types/lib/config/sources/envVarConfigSource.d.ts +7 -0
- package/dist/types/lib/config/sources/fileConfigSource.d.ts +9 -0
- package/dist/types/lib/config/tests/cliOverrideConfigSource.test.d.ts +1 -0
- package/dist/types/lib/config/tests/envVarConfigSource.test.d.ts +1 -0
- package/dist/types/lib/config/tests/fileConfigSource.test.d.ts +1 -0
- package/dist/types/lib/config/tests/requiredEnvParams.test.d.ts +1 -0
- package/dist/types/lib/config/tests/runnerConfigLoader.test.d.ts +1 -0
- package/dist/types/lib/index.d.ts +18 -0
- package/dist/types/lib/registry/scenarioRegistry.d.ts +18 -0
- package/dist/types/lib/registry/tests/scenarioRegistry.test.d.ts +1 -0
- package/dist/types/lib/reporting/consoleReporter.d.ts +5 -0
- package/dist/types/lib/reporting/junitReporter.d.ts +5 -0
- package/dist/types/lib/reporting/reporter.d.ts +4 -0
- package/dist/types/lib/reporting/tests/consoleReporter.test.d.ts +1 -0
- package/dist/types/lib/reporting/tests/junitReporter.test.d.ts +1 -0
- package/dist/types/lib/runner/aiEnhancementStep.d.ts +15 -0
- package/dist/types/lib/runner/batchRunner.d.ts +14 -0
- package/dist/types/lib/runner/scenarioRunner.d.ts +15 -0
- package/dist/types/lib/runner/tests/aiEnhancementStep.test.d.ts +1 -0
- package/dist/types/lib/runner/tests/batchRunner.test.d.ts +1 -0
- package/dist/types/lib/runner/tests/scenarioRunner.test.d.ts +1 -0
- package/dist/types/lib/scenarios/index.d.ts +2 -0
- package/dist/types/lib/scenarios/one-admin/export-navigation.scenario.d.ts +2 -0
- package/dist/types/lib/scenarios/one-admin/index.d.ts +2 -0
- package/dist/types/lib/scenarios/one-admin/page-models/ExportPageModel.d.ts +8 -0
- package/dist/types/lib/scenarios/one-admin/page-models/SelectSettingsPageModel.d.ts +10 -0
- package/dist/types/lib/scenarios/one-admin/page-models/index.d.ts +2 -0
- package/dist/types/lib/types/config.d.ts +26 -0
- package/dist/types/lib/types/results.d.ts +19 -0
- package/dist/types/lib/types/scenario.d.ts +17 -0
- package/jest.config.cjs +9 -0
- package/leak-runner.config.json +13 -0
- package/leak-runner.schema.json +27 -0
- package/lib/analysis/tests/thresholdEvaluator.test.ts +125 -0
- package/lib/analysis/thresholdEvaluator.ts +36 -0
- package/lib/browser/iframeHeapProfiler.ts +30 -0
- package/lib/browser/tests/iframeHeapProfiler.test.ts +71 -0
- package/lib/cli/command.ts +19 -0
- package/lib/cli/commands/listCommand.ts +36 -0
- package/lib/cli/commands/runCommand.ts +126 -0
- package/lib/cli/index.ts +25 -0
- package/lib/config/missingRequiredParamError.ts +10 -0
- package/lib/config/requiredEnvParams.ts +50 -0
- package/lib/config/runnerConfigLoader.ts +84 -0
- package/lib/config/runnerConfigSchema.ts +27 -0
- package/lib/config/sources/cliOverrideConfigSource.ts +30 -0
- package/lib/config/sources/configSource.ts +27 -0
- package/lib/config/sources/envVarConfigSource.ts +23 -0
- package/lib/config/sources/fileConfigSource.ts +39 -0
- package/lib/config/tests/cliOverrideConfigSource.test.ts +25 -0
- package/lib/config/tests/envVarConfigSource.test.ts +57 -0
- package/lib/config/tests/fileConfigSource.test.ts +49 -0
- package/lib/config/tests/requiredEnvParams.test.ts +113 -0
- package/lib/config/tests/runnerConfigLoader.test.ts +59 -0
- package/lib/index.ts +37 -0
- package/lib/registry/scenarioRegistry.ts +48 -0
- package/lib/registry/tests/scenarioRegistry.test.ts +96 -0
- package/lib/reporting/consoleReporter.ts +48 -0
- package/lib/reporting/junitReporter.ts +62 -0
- package/lib/reporting/reporter.ts +5 -0
- package/lib/reporting/tests/consoleReporter.test.ts +82 -0
- package/lib/reporting/tests/junitReporter.test.ts +103 -0
- package/lib/runner/aiEnhancementStep.ts +39 -0
- package/lib/runner/batchRunner.ts +71 -0
- package/lib/runner/scenarioRunner.ts +189 -0
- package/lib/runner/tests/aiEnhancementStep.test.ts +174 -0
- package/lib/runner/tests/batchRunner.test.ts +133 -0
- package/lib/runner/tests/scenarioRunner.test.ts +162 -0
- package/lib/scenarios/index.ts +8 -0
- package/lib/scenarios/one-admin/export-navigation.scenario.ts +38 -0
- package/lib/scenarios/one-admin/index.ts +6 -0
- package/lib/scenarios/one-admin/page-models/ExportPageModel.ts +26 -0
- package/lib/scenarios/one-admin/page-models/SelectSettingsPageModel.ts +30 -0
- package/lib/scenarios/one-admin/page-models/index.ts +2 -0
- package/lib/types/config.ts +34 -0
- package/lib/types/results.ts +22 -0
- package/lib/types/scenario.ts +18 -0
- package/package.json +46 -0
- package/reports/analysis/index.html +116 -0
- package/reports/analysis/thresholdEvaluator.ts.html +193 -0
- package/reports/base.css +224 -0
- package/reports/block-navigation.js +87 -0
- package/reports/browser/iframeHeapProfiler.ts.html +175 -0
- package/reports/browser/index.html +116 -0
- package/reports/cli/commands/index.html +131 -0
- package/reports/cli/commands/listCommand.ts.html +193 -0
- package/reports/cli/commands/runCommand.ts.html +463 -0
- package/reports/cli/index.html +116 -0
- package/reports/cli/index.ts.html +160 -0
- package/reports/config/index.html +161 -0
- package/reports/config/missingRequiredParamError.ts.html +115 -0
- package/reports/config/requiredEnvParams.ts.html +235 -0
- package/reports/config/runnerConfigLoader.ts.html +337 -0
- package/reports/config/runnerConfigSchema.ts.html +166 -0
- package/reports/config/sources/cliOverrideConfigSource.ts.html +175 -0
- package/reports/config/sources/configSource.ts.html +166 -0
- package/reports/config/sources/envVarConfigSource.ts.html +154 -0
- package/reports/config/sources/fileConfigSource.ts.html +202 -0
- package/reports/config/sources/index.html +161 -0
- package/reports/favicon.png +0 -0
- package/reports/index.html +296 -0
- package/reports/lcov-report/analysis/index.html +116 -0
- package/reports/lcov-report/analysis/thresholdEvaluator.ts.html +193 -0
- package/reports/lcov-report/base.css +224 -0
- package/reports/lcov-report/block-navigation.js +87 -0
- package/reports/lcov-report/browser/iframeHeapProfiler.ts.html +175 -0
- package/reports/lcov-report/browser/index.html +116 -0
- package/reports/lcov-report/cli/commands/index.html +131 -0
- package/reports/lcov-report/cli/commands/listCommand.ts.html +193 -0
- package/reports/lcov-report/cli/commands/runCommand.ts.html +463 -0
- package/reports/lcov-report/cli/index.html +116 -0
- package/reports/lcov-report/cli/index.ts.html +160 -0
- package/reports/lcov-report/config/index.html +161 -0
- package/reports/lcov-report/config/missingRequiredParamError.ts.html +115 -0
- package/reports/lcov-report/config/requiredEnvParams.ts.html +235 -0
- package/reports/lcov-report/config/runnerConfigLoader.ts.html +337 -0
- package/reports/lcov-report/config/runnerConfigSchema.ts.html +166 -0
- package/reports/lcov-report/config/sources/cliOverrideConfigSource.ts.html +175 -0
- package/reports/lcov-report/config/sources/configSource.ts.html +166 -0
- package/reports/lcov-report/config/sources/envVarConfigSource.ts.html +154 -0
- package/reports/lcov-report/config/sources/fileConfigSource.ts.html +202 -0
- package/reports/lcov-report/config/sources/index.html +161 -0
- package/reports/lcov-report/favicon.png +0 -0
- package/reports/lcov-report/index.html +296 -0
- package/reports/lcov-report/prettify.css +1 -0
- package/reports/lcov-report/prettify.js +2 -0
- package/reports/lcov-report/registry/index.html +116 -0
- package/reports/lcov-report/registry/scenarioRegistry.ts.html +229 -0
- package/reports/lcov-report/reporting/consoleReporter.ts.html +229 -0
- package/reports/lcov-report/reporting/index.html +131 -0
- package/reports/lcov-report/reporting/junitReporter.ts.html +271 -0
- package/reports/lcov-report/runner/aiEnhancementStep.ts.html +202 -0
- package/reports/lcov-report/runner/batchRunner.ts.html +298 -0
- package/reports/lcov-report/runner/index.html +146 -0
- package/reports/lcov-report/runner/scenarioRunner.ts.html +652 -0
- package/reports/lcov-report/scenarios/index.html +116 -0
- package/reports/lcov-report/scenarios/index.ts.html +109 -0
- package/reports/lcov-report/scenarios/one-admin/export-navigation.scenario.ts.html +199 -0
- package/reports/lcov-report/scenarios/one-admin/index.html +131 -0
- package/reports/lcov-report/scenarios/one-admin/index.ts.html +103 -0
- package/reports/lcov-report/scenarios/one-admin/page-models/ExportPageModel.ts.html +163 -0
- package/reports/lcov-report/scenarios/one-admin/page-models/SelectSettingsPageModel.ts.html +175 -0
- package/reports/lcov-report/scenarios/one-admin/page-models/index.html +131 -0
- package/reports/lcov-report/sort-arrow-sprite.png +0 -0
- package/reports/lcov-report/sorter.js +210 -0
- package/reports/lcov-report/types/config.ts.html +187 -0
- package/reports/lcov-report/types/index.html +116 -0
- package/reports/lcov.info +883 -0
- package/reports/prettify.css +1 -0
- package/reports/prettify.js +2 -0
- package/reports/registry/index.html +116 -0
- package/reports/registry/scenarioRegistry.ts.html +229 -0
- package/reports/reporting/consoleReporter.ts.html +229 -0
- package/reports/reporting/index.html +131 -0
- package/reports/reporting/junitReporter.ts.html +271 -0
- package/reports/runner/aiEnhancementStep.ts.html +202 -0
- package/reports/runner/batchRunner.ts.html +298 -0
- package/reports/runner/index.html +146 -0
- package/reports/runner/scenarioRunner.ts.html +652 -0
- package/reports/scenarios/index.html +116 -0
- package/reports/scenarios/index.ts.html +109 -0
- package/reports/scenarios/one-admin/export-navigation.scenario.ts.html +199 -0
- package/reports/scenarios/one-admin/index.html +131 -0
- package/reports/scenarios/one-admin/index.ts.html +103 -0
- package/reports/scenarios/one-admin/page-models/ExportPageModel.ts.html +163 -0
- package/reports/scenarios/one-admin/page-models/SelectSettingsPageModel.ts.html +175 -0
- package/reports/scenarios/one-admin/page-models/index.html +131 -0
- package/reports/sort-arrow-sprite.png +0 -0
- package/reports/sorter.js +210 -0
- package/reports/types/config.ts.html +187 -0
- package/reports/types/index.html +116 -0
- package/stylelint.config.cjs +2 -0
- package/test-report.xml +100 -0
- 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,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
|
+
};
|