modestbench 0.0.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +39 -31
- package/dist/bootstrap.cjs +10 -12
- package/dist/bootstrap.cjs.map +1 -1
- package/dist/bootstrap.d.cts.map +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +5 -7
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/commands/history.cjs +108 -265
- package/dist/cli/commands/history.cjs.map +1 -1
- package/dist/cli/commands/history.d.cts +75 -12
- package/dist/cli/commands/history.d.cts.map +1 -1
- package/dist/cli/commands/history.d.ts +75 -12
- package/dist/cli/commands/history.d.ts.map +1 -1
- package/dist/cli/commands/history.js +105 -267
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/init.cjs +5 -4
- package/dist/cli/commands/init.cjs.map +1 -1
- package/dist/cli/commands/init.d.cts.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +5 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.cjs +32 -9
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.d.cts +1 -0
- package/dist/cli/commands/run.d.cts.map +1 -1
- package/dist/cli/commands/run.d.ts +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +32 -9
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.cjs +336 -103
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +1 -2
- package/dist/cli/index.d.cts.map +1 -1
- package/dist/cli/index.d.ts +1 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +332 -99
- package/dist/cli/index.js.map +1 -1
- package/dist/constants.cjs +53 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +36 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +52 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/engine.cjs +23 -43
- package/dist/core/engine.cjs.map +1 -1
- package/dist/core/engine.d.cts +4 -3
- package/dist/core/engine.d.cts.map +1 -1
- package/dist/core/engine.d.ts +4 -3
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +23 -43
- package/dist/core/engine.js.map +1 -1
- package/dist/core/engines/accurate-engine.cjs +2 -1
- package/dist/core/engines/accurate-engine.cjs.map +1 -1
- package/dist/core/engines/accurate-engine.d.cts.map +1 -1
- package/dist/core/engines/accurate-engine.d.ts.map +1 -1
- package/dist/core/engines/accurate-engine.js +2 -1
- package/dist/core/engines/accurate-engine.js.map +1 -1
- package/dist/core/engines/tinybench-engine.cjs +6 -5
- package/dist/core/engines/tinybench-engine.cjs.map +1 -1
- package/dist/core/engines/tinybench-engine.d.cts.map +1 -1
- package/dist/core/engines/tinybench-engine.d.ts.map +1 -1
- package/dist/core/engines/tinybench-engine.js +6 -5
- package/dist/core/engines/tinybench-engine.js.map +1 -1
- package/dist/core/output-path-resolver.cjs +34 -0
- package/dist/core/output-path-resolver.cjs.map +1 -0
- package/dist/core/output-path-resolver.d.cts +10 -0
- package/dist/core/output-path-resolver.d.cts.map +1 -0
- package/dist/core/output-path-resolver.d.ts +10 -0
- package/dist/core/output-path-resolver.d.ts.map +1 -0
- package/dist/core/output-path-resolver.js +30 -0
- package/dist/core/output-path-resolver.js.map +1 -0
- package/dist/errors/base.cjs +130 -0
- package/dist/errors/base.cjs.map +1 -0
- package/dist/errors/base.d.cts +97 -0
- package/dist/errors/base.d.cts.map +1 -0
- package/dist/errors/base.d.ts +97 -0
- package/dist/errors/base.d.ts.map +1 -0
- package/dist/errors/base.js +124 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/cli.cjs +58 -0
- package/dist/errors/cli.cjs.map +1 -0
- package/dist/errors/cli.d.cts +44 -0
- package/dist/errors/cli.d.cts.map +1 -0
- package/dist/errors/cli.d.ts +44 -0
- package/dist/errors/cli.d.ts.map +1 -0
- package/dist/errors/cli.js +52 -0
- package/dist/errors/cli.js.map +1 -0
- package/dist/errors/configuration.cjs +48 -0
- package/dist/errors/configuration.cjs.map +1 -0
- package/dist/errors/configuration.d.cts +41 -0
- package/dist/errors/configuration.d.cts.map +1 -0
- package/dist/errors/configuration.d.ts +41 -0
- package/dist/errors/configuration.d.ts.map +1 -0
- package/dist/errors/configuration.js +41 -0
- package/dist/errors/configuration.js.map +1 -0
- package/dist/errors/execution.cjs +65 -0
- package/dist/errors/execution.cjs.map +1 -0
- package/dist/errors/execution.d.cts +56 -0
- package/dist/errors/execution.d.cts.map +1 -0
- package/dist/errors/execution.d.ts +56 -0
- package/dist/errors/execution.d.ts.map +1 -0
- package/dist/errors/execution.js +56 -0
- package/dist/errors/execution.js.map +1 -0
- package/dist/errors/file.cjs +56 -0
- package/dist/errors/file.cjs.map +1 -0
- package/dist/errors/file.d.cts +48 -0
- package/dist/errors/file.d.cts.map +1 -0
- package/dist/errors/file.d.ts +48 -0
- package/dist/errors/file.d.ts.map +1 -0
- package/dist/errors/file.js +48 -0
- package/dist/errors/file.js.map +1 -0
- package/dist/errors/index.cjs +59 -0
- package/dist/errors/index.cjs.map +1 -0
- package/dist/errors/index.d.cts +16 -0
- package/dist/errors/index.d.cts.map +1 -0
- package/dist/errors/index.d.ts +16 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +24 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/reporter.cjs +38 -0
- package/dist/errors/reporter.cjs.map +1 -0
- package/dist/errors/reporter.d.cts +32 -0
- package/dist/errors/reporter.d.cts.map +1 -0
- package/dist/errors/reporter.d.ts +32 -0
- package/dist/errors/reporter.d.ts.map +1 -0
- package/dist/errors/reporter.js +32 -0
- package/dist/errors/reporter.js.map +1 -0
- package/dist/errors/storage.cjs +55 -0
- package/dist/errors/storage.cjs.map +1 -0
- package/dist/errors/storage.d.cts +47 -0
- package/dist/errors/storage.d.cts.map +1 -0
- package/dist/errors/storage.d.ts +47 -0
- package/dist/errors/storage.d.ts.map +1 -0
- package/dist/errors/storage.js +47 -0
- package/dist/errors/storage.js.map +1 -0
- package/dist/errors/validation.cjs +38 -0
- package/dist/errors/validation.cjs.map +1 -0
- package/dist/errors/validation.d.cts +32 -0
- package/dist/errors/validation.d.cts.map +1 -0
- package/dist/errors/validation.d.ts +32 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +32 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/formatters/history/base.cjs +9 -0
- package/dist/formatters/history/base.cjs.map +1 -0
- package/dist/formatters/history/base.d.cts +26 -0
- package/dist/formatters/history/base.d.cts.map +1 -0
- package/dist/formatters/history/base.d.ts +26 -0
- package/dist/formatters/history/base.d.ts.map +1 -0
- package/dist/formatters/history/base.js +8 -0
- package/dist/formatters/history/base.js.map +1 -0
- package/dist/formatters/history/compare.cjs +127 -0
- package/dist/formatters/history/compare.cjs.map +1 -0
- package/dist/formatters/history/compare.d.cts +21 -0
- package/dist/formatters/history/compare.d.cts.map +1 -0
- package/dist/formatters/history/compare.d.ts +21 -0
- package/dist/formatters/history/compare.d.ts.map +1 -0
- package/dist/formatters/history/compare.js +123 -0
- package/dist/formatters/history/compare.js.map +1 -0
- package/dist/formatters/history/list.cjs +74 -0
- package/dist/formatters/history/list.cjs.map +1 -0
- package/dist/formatters/history/list.d.cts +25 -0
- package/dist/formatters/history/list.d.cts.map +1 -0
- package/dist/formatters/history/list.d.ts +25 -0
- package/dist/formatters/history/list.d.ts.map +1 -0
- package/dist/formatters/history/list.js +70 -0
- package/dist/formatters/history/list.js.map +1 -0
- package/dist/formatters/history/show.cjs +98 -0
- package/dist/formatters/history/show.cjs.map +1 -0
- package/dist/formatters/history/show.d.cts +21 -0
- package/dist/formatters/history/show.d.cts.map +1 -0
- package/dist/formatters/history/show.d.ts +21 -0
- package/dist/formatters/history/show.d.ts.map +1 -0
- package/dist/formatters/history/show.js +94 -0
- package/dist/formatters/history/show.js.map +1 -0
- package/dist/formatters/history/trends.cjs +194 -0
- package/dist/formatters/history/trends.cjs.map +1 -0
- package/dist/formatters/history/trends.d.cts +22 -0
- package/dist/formatters/history/trends.d.cts.map +1 -0
- package/dist/formatters/history/trends.d.ts +22 -0
- package/dist/formatters/history/trends.d.ts.map +1 -0
- package/dist/formatters/history/trends.js +190 -0
- package/dist/formatters/history/trends.js.map +1 -0
- package/dist/formatters/history/visualization.cjs +79 -0
- package/dist/formatters/history/visualization.cjs.map +1 -0
- package/dist/formatters/history/visualization.d.cts +24 -0
- package/dist/formatters/history/visualization.d.cts.map +1 -0
- package/dist/formatters/history/visualization.d.ts +24 -0
- package/dist/formatters/history/visualization.d.ts.map +1 -0
- package/dist/formatters/history/visualization.js +74 -0
- package/dist/formatters/history/visualization.js.map +1 -0
- package/dist/index.cjs +17 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -11
- package/dist/index.js.map +1 -1
- package/dist/reporters/csv.cjs +5 -4
- package/dist/reporters/csv.cjs.map +1 -1
- package/dist/reporters/csv.d.cts +1 -1
- package/dist/reporters/csv.d.cts.map +1 -1
- package/dist/reporters/csv.d.ts +1 -1
- package/dist/reporters/csv.d.ts.map +1 -1
- package/dist/reporters/csv.js +4 -3
- package/dist/reporters/csv.js.map +1 -1
- package/dist/reporters/human.cjs +24 -62
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts +1 -1
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts +1 -1
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +3 -41
- package/dist/reporters/human.js.map +1 -1
- package/dist/reporters/json.cjs +5 -4
- package/dist/reporters/json.cjs.map +1 -1
- package/dist/reporters/json.d.cts +1 -1
- package/dist/reporters/json.d.cts.map +1 -1
- package/dist/reporters/json.d.ts +1 -1
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +4 -3
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/simple.cjs +3 -3
- package/dist/reporters/simple.cjs.map +1 -1
- package/dist/reporters/simple.d.cts +1 -1
- package/dist/reporters/simple.d.cts.map +1 -1
- package/dist/reporters/simple.d.ts +1 -1
- package/dist/reporters/simple.d.ts.map +1 -1
- package/dist/reporters/simple.js +2 -2
- package/dist/reporters/simple.js.map +1 -1
- package/dist/{config/manager.cjs → services/config-manager.cjs} +10 -4
- package/dist/services/config-manager.cjs.map +1 -0
- package/dist/{config/manager.d.cts → services/config-manager.d.cts} +1 -1
- package/dist/services/config-manager.d.cts.map +1 -0
- package/dist/{config/manager.d.ts → services/config-manager.d.ts} +1 -1
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/{config/manager.js → services/config-manager.js} +10 -4
- package/dist/services/config-manager.js.map +1 -0
- package/dist/{core/loader.cjs → services/file-loader.cjs} +18 -7
- package/dist/services/file-loader.cjs.map +1 -0
- package/dist/{core/loader.d.cts → services/file-loader.d.cts} +1 -1
- package/dist/services/file-loader.d.cts.map +1 -0
- package/dist/{core/loader.d.ts → services/file-loader.d.ts} +1 -1
- package/dist/services/file-loader.d.ts.map +1 -0
- package/dist/{core/loader.js → services/file-loader.js} +18 -7
- package/dist/services/file-loader.js.map +1 -0
- package/dist/services/history/comparison.cjs +124 -0
- package/dist/services/history/comparison.cjs.map +1 -0
- package/dist/services/history/comparison.d.cts +18 -0
- package/dist/services/history/comparison.d.cts.map +1 -0
- package/dist/services/history/comparison.d.ts +18 -0
- package/dist/services/history/comparison.d.ts.map +1 -0
- package/dist/services/history/comparison.js +120 -0
- package/dist/services/history/comparison.js.map +1 -0
- package/dist/services/history/models.cjs +9 -0
- package/dist/services/history/models.cjs.map +1 -0
- package/dist/services/history/models.d.cts +139 -0
- package/dist/services/history/models.d.cts.map +1 -0
- package/dist/services/history/models.d.ts +139 -0
- package/dist/services/history/models.d.ts.map +1 -0
- package/dist/services/history/models.js +8 -0
- package/dist/services/history/models.js.map +1 -0
- package/dist/services/history/query.cjs +97 -0
- package/dist/services/history/query.cjs.map +1 -0
- package/dist/services/history/query.d.cts +38 -0
- package/dist/services/history/query.d.cts.map +1 -0
- package/dist/services/history/query.d.ts +38 -0
- package/dist/services/history/query.d.ts.map +1 -0
- package/dist/services/history/query.js +92 -0
- package/dist/services/history/query.js.map +1 -0
- package/dist/services/history/trend-analysis.cjs +187 -0
- package/dist/services/history/trend-analysis.cjs.map +1 -0
- package/dist/services/history/trend-analysis.d.cts +34 -0
- package/dist/services/history/trend-analysis.d.cts.map +1 -0
- package/dist/services/history/trend-analysis.d.ts +34 -0
- package/dist/services/history/trend-analysis.d.ts.map +1 -0
- package/dist/services/history/trend-analysis.js +179 -0
- package/dist/services/history/trend-analysis.js.map +1 -0
- package/dist/{storage/history.cjs → services/history-storage.cjs} +33 -12
- package/dist/services/history-storage.cjs.map +1 -0
- package/dist/{storage/history.d.cts → services/history-storage.d.cts} +1 -1
- package/dist/services/history-storage.d.cts.map +1 -0
- package/dist/{storage/history.d.ts → services/history-storage.d.ts} +1 -1
- package/dist/services/history-storage.d.ts.map +1 -0
- package/dist/{storage/history.js → services/history-storage.js} +33 -12
- package/dist/services/history-storage.js.map +1 -0
- package/dist/{progress/manager.cjs → services/progress-manager.cjs} +1 -1
- package/dist/services/progress-manager.cjs.map +1 -0
- package/dist/{progress/manager.d.cts → services/progress-manager.d.cts} +1 -1
- package/dist/services/progress-manager.d.cts.map +1 -0
- package/dist/{progress/manager.d.ts → services/progress-manager.d.ts} +1 -1
- package/dist/services/progress-manager.d.ts.map +1 -0
- package/dist/{progress/manager.js → services/progress-manager.js} +1 -1
- package/dist/services/progress-manager.js.map +1 -0
- package/dist/{reporters/registry.cjs → services/reporter-registry.cjs} +4 -3
- package/dist/services/reporter-registry.cjs.map +1 -0
- package/dist/{reporters/registry.d.cts → services/reporter-registry.d.cts} +1 -1
- package/dist/services/reporter-registry.d.cts.map +1 -0
- package/dist/{reporters/registry.d.ts → services/reporter-registry.d.ts} +1 -1
- package/dist/services/reporter-registry.d.ts.map +1 -0
- package/dist/{reporters/registry.js → services/reporter-registry.js} +4 -3
- package/dist/services/reporter-registry.js.map +1 -0
- package/dist/types/cli.d.cts +3 -0
- package/dist/types/cli.d.cts.map +1 -1
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/interfaces.d.cts +1 -34
- package/dist/types/interfaces.d.cts.map +1 -1
- package/dist/types/interfaces.d.ts +1 -34
- package/dist/types/interfaces.d.ts.map +1 -1
- package/dist/utils/ansi.cjs +61 -0
- package/dist/utils/ansi.cjs.map +1 -0
- package/dist/utils/ansi.d.cts +53 -0
- package/dist/utils/ansi.d.cts.map +1 -0
- package/dist/utils/ansi.d.ts +53 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +57 -0
- package/dist/utils/ansi.js.map +1 -0
- package/package.json +10 -8
- package/src/bootstrap.ts +5 -7
- package/src/cli/commands/history.ts +195 -341
- package/src/cli/commands/init.ts +14 -4
- package/src/cli/commands/run.ts +52 -7
- package/src/cli/index.ts +393 -119
- package/src/constants.ts +60 -0
- package/src/core/engine.ts +40 -48
- package/src/core/engines/accurate-engine.ts +4 -1
- package/src/core/engines/tinybench-engine.ts +12 -5
- package/src/core/output-path-resolver.ts +38 -0
- package/src/errors/base.ts +152 -0
- package/src/errors/cli.ts +59 -0
- package/src/errors/configuration.ts +45 -0
- package/src/errors/execution.ts +62 -0
- package/src/errors/file.ts +53 -0
- package/src/errors/index.ts +71 -0
- package/src/errors/reporter.ts +35 -0
- package/src/errors/storage.ts +52 -0
- package/src/errors/validation.ts +35 -0
- package/src/formatters/history/base.ts +28 -0
- package/src/formatters/history/compare.ts +186 -0
- package/src/formatters/history/list.ts +101 -0
- package/src/formatters/history/show.ts +155 -0
- package/src/formatters/history/trends.ts +281 -0
- package/src/formatters/history/visualization.ts +93 -0
- package/src/index.ts +10 -14
- package/src/reporters/csv.ts +5 -3
- package/src/reporters/human.ts +3 -43
- package/src/reporters/json.ts +5 -3
- package/src/reporters/simple.ts +2 -2
- package/src/{config/manager.ts → services/config-manager.ts} +13 -3
- package/src/{core/loader.ts → services/file-loader.ts} +28 -6
- package/src/services/history/comparison.ts +130 -0
- package/src/services/history/models.ts +148 -0
- package/src/services/history/query.ts +116 -0
- package/src/services/history/trend-analysis.ts +238 -0
- package/src/{storage/history.ts → services/history-storage.ts} +58 -11
- package/src/{reporters/registry.ts → services/reporter-registry.ts} +9 -2
- package/src/types/cli.ts +3 -0
- package/src/types/interfaces.ts +0 -43
- package/src/utils/ansi.ts +59 -0
- package/dist/config/manager.cjs.map +0 -1
- package/dist/config/manager.d.cts.map +0 -1
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/manager.js.map +0 -1
- package/dist/core/error-manager.cjs +0 -303
- package/dist/core/error-manager.cjs.map +0 -1
- package/dist/core/error-manager.d.cts +0 -77
- package/dist/core/error-manager.d.cts.map +0 -1
- package/dist/core/error-manager.d.ts +0 -77
- package/dist/core/error-manager.d.ts.map +0 -1
- package/dist/core/error-manager.js +0 -299
- package/dist/core/error-manager.js.map +0 -1
- package/dist/core/loader.cjs.map +0 -1
- package/dist/core/loader.d.cts.map +0 -1
- package/dist/core/loader.d.ts.map +0 -1
- package/dist/core/loader.js.map +0 -1
- package/dist/progress/manager.cjs.map +0 -1
- package/dist/progress/manager.d.cts.map +0 -1
- package/dist/progress/manager.d.ts.map +0 -1
- package/dist/progress/manager.js.map +0 -1
- package/dist/reporters/registry.cjs.map +0 -1
- package/dist/reporters/registry.d.cts.map +0 -1
- package/dist/reporters/registry.d.ts.map +0 -1
- package/dist/reporters/registry.js.map +0 -1
- package/dist/storage/history.cjs.map +0 -1
- package/dist/storage/history.d.cts.map +0 -1
- package/dist/storage/history.d.ts.map +0 -1
- package/dist/storage/history.js.map +0 -1
- package/src/core/error-manager.ts +0 -372
- /package/src/{progress/manager.ts → services/progress-manager.ts} +0 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* History Query Service
|
|
4
|
+
*
|
|
5
|
+
* Handles querying benchmark run history with date parsing and filtering.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.parseDate = exports.HistoryQueryService = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Service for querying historical benchmark runs
|
|
11
|
+
*/
|
|
12
|
+
class HistoryQueryService {
|
|
13
|
+
storage;
|
|
14
|
+
constructor(storage) {
|
|
15
|
+
this.storage = storage;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Query runs with automatic date string parsing
|
|
19
|
+
*/
|
|
20
|
+
async queryWithDateParsing(options) {
|
|
21
|
+
// Build query object all at once
|
|
22
|
+
const query = {
|
|
23
|
+
...(options.since && { since: (0, exports.parseDate)(options.since) }),
|
|
24
|
+
...(options.until && { until: (0, exports.parseDate)(options.until) }),
|
|
25
|
+
...(options.pattern && { pattern: options.pattern }),
|
|
26
|
+
...(options.tags && options.tags.length > 0 && { tags: options.tags }),
|
|
27
|
+
...(options.limit && { limit: options.limit }),
|
|
28
|
+
};
|
|
29
|
+
return await this.storage.queryRuns(query);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.HistoryQueryService = HistoryQueryService;
|
|
33
|
+
/**
|
|
34
|
+
* Parse date string (ISO 8601 or relative)
|
|
35
|
+
*
|
|
36
|
+
* Supports:
|
|
37
|
+
*
|
|
38
|
+
* - ISO 8601: "2025-10-24T12:00:00Z", "2025-10-24"
|
|
39
|
+
* - Relative: "1 day ago", "3 weeks ago", "2 hours ago"
|
|
40
|
+
* - Shorthand: "1d", "2w", "3m", "6h"
|
|
41
|
+
*
|
|
42
|
+
* @param dateStr - Date string to parse
|
|
43
|
+
* @returns Parsed Date object
|
|
44
|
+
* @throws Error if date format is invalid
|
|
45
|
+
*/
|
|
46
|
+
const parseDate = (dateStr) => {
|
|
47
|
+
if (!dateStr || dateStr.trim() === '') {
|
|
48
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
49
|
+
}
|
|
50
|
+
// Try parsing as ISO 8601 first
|
|
51
|
+
const isoDate = new Date(dateStr);
|
|
52
|
+
if (!isNaN(isoDate.getTime())) {
|
|
53
|
+
return isoDate;
|
|
54
|
+
}
|
|
55
|
+
// Parse relative dates like "1 week ago", "3 days ago"
|
|
56
|
+
const relativePattern = /^(\d+)\s+(hour|day|week|month)s?\s+ago$/i;
|
|
57
|
+
const relativeMatch = dateStr.trim().match(relativePattern);
|
|
58
|
+
if (relativeMatch && relativeMatch[1] && relativeMatch[2]) {
|
|
59
|
+
const amount = parseInt(relativeMatch[1], 10);
|
|
60
|
+
const unit = relativeMatch[2].toLowerCase();
|
|
61
|
+
if (amount <= 0) {
|
|
62
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
63
|
+
}
|
|
64
|
+
const now = new Date();
|
|
65
|
+
const msPerUnit = {
|
|
66
|
+
day: 24 * 60 * 60 * 1000,
|
|
67
|
+
hour: 60 * 60 * 1000,
|
|
68
|
+
month: 30 * 24 * 60 * 60 * 1000, // Approximate
|
|
69
|
+
week: 7 * 24 * 60 * 60 * 1000,
|
|
70
|
+
};
|
|
71
|
+
const offset = amount * (msPerUnit[unit] || 0);
|
|
72
|
+
return new Date(now.getTime() - offset);
|
|
73
|
+
}
|
|
74
|
+
// Parse shorthand formats like "1d", "2w", "3m", "6h"
|
|
75
|
+
// cspell:ignore hdwm
|
|
76
|
+
const shorthandPattern = /^(\d+)([hdwm])$/i;
|
|
77
|
+
const shorthandMatch = dateStr.trim().match(shorthandPattern);
|
|
78
|
+
if (shorthandMatch && shorthandMatch[1] && shorthandMatch[2]) {
|
|
79
|
+
const amount = parseInt(shorthandMatch[1], 10);
|
|
80
|
+
const unit = shorthandMatch[2].toLowerCase();
|
|
81
|
+
if (amount <= 0) {
|
|
82
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
83
|
+
}
|
|
84
|
+
const now = new Date();
|
|
85
|
+
const msPerUnit = {
|
|
86
|
+
d: 24 * 60 * 60 * 1000,
|
|
87
|
+
h: 60 * 60 * 1000,
|
|
88
|
+
m: 30 * 24 * 60 * 60 * 1000, // Approximate month
|
|
89
|
+
w: 7 * 24 * 60 * 60 * 1000,
|
|
90
|
+
};
|
|
91
|
+
const offset = amount * (msPerUnit[unit] || 0);
|
|
92
|
+
return new Date(now.getTime() - offset);
|
|
93
|
+
}
|
|
94
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
95
|
+
};
|
|
96
|
+
exports.parseDate = parseDate;
|
|
97
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/services/history/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History Query Service
|
|
3
|
+
*
|
|
4
|
+
* Handles querying benchmark run history with date parsing and filtering.
|
|
5
|
+
*/
|
|
6
|
+
import type { BenchmarkRun, HistoryStorage } from "../../types/index.cjs";
|
|
7
|
+
/**
|
|
8
|
+
* Service for querying historical benchmark runs
|
|
9
|
+
*/
|
|
10
|
+
export declare class HistoryQueryService {
|
|
11
|
+
private readonly storage;
|
|
12
|
+
constructor(storage: HistoryStorage);
|
|
13
|
+
/**
|
|
14
|
+
* Query runs with automatic date string parsing
|
|
15
|
+
*/
|
|
16
|
+
queryWithDateParsing(options: {
|
|
17
|
+
limit?: number;
|
|
18
|
+
pattern?: string;
|
|
19
|
+
since?: string;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
until?: string;
|
|
22
|
+
}): Promise<BenchmarkRun[]>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse date string (ISO 8601 or relative)
|
|
26
|
+
*
|
|
27
|
+
* Supports:
|
|
28
|
+
*
|
|
29
|
+
* - ISO 8601: "2025-10-24T12:00:00Z", "2025-10-24"
|
|
30
|
+
* - Relative: "1 day ago", "3 weeks ago", "2 hours ago"
|
|
31
|
+
* - Shorthand: "1d", "2w", "3m", "6h"
|
|
32
|
+
*
|
|
33
|
+
* @param dateStr - Date string to parse
|
|
34
|
+
* @returns Parsed Date object
|
|
35
|
+
* @throws Error if date format is invalid
|
|
36
|
+
*/
|
|
37
|
+
export declare const parseDate: (dateStr: string) => Date;
|
|
38
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/services/history/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACf,8BAA6B;AAE9B;;GAEG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAY5B;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,KAAG,IA6D3C,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History Query Service
|
|
3
|
+
*
|
|
4
|
+
* Handles querying benchmark run history with date parsing and filtering.
|
|
5
|
+
*/
|
|
6
|
+
import type { BenchmarkRun, HistoryStorage } from "../../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Service for querying historical benchmark runs
|
|
9
|
+
*/
|
|
10
|
+
export declare class HistoryQueryService {
|
|
11
|
+
private readonly storage;
|
|
12
|
+
constructor(storage: HistoryStorage);
|
|
13
|
+
/**
|
|
14
|
+
* Query runs with automatic date string parsing
|
|
15
|
+
*/
|
|
16
|
+
queryWithDateParsing(options: {
|
|
17
|
+
limit?: number;
|
|
18
|
+
pattern?: string;
|
|
19
|
+
since?: string;
|
|
20
|
+
tags?: string[];
|
|
21
|
+
until?: string;
|
|
22
|
+
}): Promise<BenchmarkRun[]>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parse date string (ISO 8601 or relative)
|
|
26
|
+
*
|
|
27
|
+
* Supports:
|
|
28
|
+
*
|
|
29
|
+
* - ISO 8601: "2025-10-24T12:00:00Z", "2025-10-24"
|
|
30
|
+
* - Relative: "1 day ago", "3 weeks ago", "2 hours ago"
|
|
31
|
+
* - Shorthand: "1d", "2w", "3m", "6h"
|
|
32
|
+
*
|
|
33
|
+
* @param dateStr - Date string to parse
|
|
34
|
+
* @returns Parsed Date object
|
|
35
|
+
* @throws Error if date format is invalid
|
|
36
|
+
*/
|
|
37
|
+
export declare const parseDate: (dateStr: string) => Date;
|
|
38
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/services/history/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EACf,6BAA6B;AAE9B;;GAEG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,cAAc;IAEpD;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAY5B;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,KAAG,IA6D3C,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History Query Service
|
|
3
|
+
*
|
|
4
|
+
* Handles querying benchmark run history with date parsing and filtering.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Service for querying historical benchmark runs
|
|
8
|
+
*/
|
|
9
|
+
export class HistoryQueryService {
|
|
10
|
+
storage;
|
|
11
|
+
constructor(storage) {
|
|
12
|
+
this.storage = storage;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Query runs with automatic date string parsing
|
|
16
|
+
*/
|
|
17
|
+
async queryWithDateParsing(options) {
|
|
18
|
+
// Build query object all at once
|
|
19
|
+
const query = {
|
|
20
|
+
...(options.since && { since: parseDate(options.since) }),
|
|
21
|
+
...(options.until && { until: parseDate(options.until) }),
|
|
22
|
+
...(options.pattern && { pattern: options.pattern }),
|
|
23
|
+
...(options.tags && options.tags.length > 0 && { tags: options.tags }),
|
|
24
|
+
...(options.limit && { limit: options.limit }),
|
|
25
|
+
};
|
|
26
|
+
return await this.storage.queryRuns(query);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse date string (ISO 8601 or relative)
|
|
31
|
+
*
|
|
32
|
+
* Supports:
|
|
33
|
+
*
|
|
34
|
+
* - ISO 8601: "2025-10-24T12:00:00Z", "2025-10-24"
|
|
35
|
+
* - Relative: "1 day ago", "3 weeks ago", "2 hours ago"
|
|
36
|
+
* - Shorthand: "1d", "2w", "3m", "6h"
|
|
37
|
+
*
|
|
38
|
+
* @param dateStr - Date string to parse
|
|
39
|
+
* @returns Parsed Date object
|
|
40
|
+
* @throws Error if date format is invalid
|
|
41
|
+
*/
|
|
42
|
+
export const parseDate = (dateStr) => {
|
|
43
|
+
if (!dateStr || dateStr.trim() === '') {
|
|
44
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
45
|
+
}
|
|
46
|
+
// Try parsing as ISO 8601 first
|
|
47
|
+
const isoDate = new Date(dateStr);
|
|
48
|
+
if (!isNaN(isoDate.getTime())) {
|
|
49
|
+
return isoDate;
|
|
50
|
+
}
|
|
51
|
+
// Parse relative dates like "1 week ago", "3 days ago"
|
|
52
|
+
const relativePattern = /^(\d+)\s+(hour|day|week|month)s?\s+ago$/i;
|
|
53
|
+
const relativeMatch = dateStr.trim().match(relativePattern);
|
|
54
|
+
if (relativeMatch && relativeMatch[1] && relativeMatch[2]) {
|
|
55
|
+
const amount = parseInt(relativeMatch[1], 10);
|
|
56
|
+
const unit = relativeMatch[2].toLowerCase();
|
|
57
|
+
if (amount <= 0) {
|
|
58
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
59
|
+
}
|
|
60
|
+
const now = new Date();
|
|
61
|
+
const msPerUnit = {
|
|
62
|
+
day: 24 * 60 * 60 * 1000,
|
|
63
|
+
hour: 60 * 60 * 1000,
|
|
64
|
+
month: 30 * 24 * 60 * 60 * 1000, // Approximate
|
|
65
|
+
week: 7 * 24 * 60 * 60 * 1000,
|
|
66
|
+
};
|
|
67
|
+
const offset = amount * (msPerUnit[unit] || 0);
|
|
68
|
+
return new Date(now.getTime() - offset);
|
|
69
|
+
}
|
|
70
|
+
// Parse shorthand formats like "1d", "2w", "3m", "6h"
|
|
71
|
+
// cspell:ignore hdwm
|
|
72
|
+
const shorthandPattern = /^(\d+)([hdwm])$/i;
|
|
73
|
+
const shorthandMatch = dateStr.trim().match(shorthandPattern);
|
|
74
|
+
if (shorthandMatch && shorthandMatch[1] && shorthandMatch[2]) {
|
|
75
|
+
const amount = parseInt(shorthandMatch[1], 10);
|
|
76
|
+
const unit = shorthandMatch[2].toLowerCase();
|
|
77
|
+
if (amount <= 0) {
|
|
78
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
79
|
+
}
|
|
80
|
+
const now = new Date();
|
|
81
|
+
const msPerUnit = {
|
|
82
|
+
d: 24 * 60 * 60 * 1000,
|
|
83
|
+
h: 60 * 60 * 1000,
|
|
84
|
+
m: 30 * 24 * 60 * 60 * 1000, // Approximate month
|
|
85
|
+
w: 7 * 24 * 60 * 60 * 1000,
|
|
86
|
+
};
|
|
87
|
+
const offset = amount * (msPerUnit[unit] || 0);
|
|
88
|
+
return new Date(now.getTime() - offset);
|
|
89
|
+
}
|
|
90
|
+
throw new Error(`Invalid date format: "${dateStr}"`);
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/services/history/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Trend Analysis Service
|
|
4
|
+
*
|
|
5
|
+
* Statistical analysis of benchmark performance trends over time, including
|
|
6
|
+
* regression detection and trend classification.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.detectRegression = exports.calculateTrend = exports.calculateStatistics = exports.calculatePercentChange = exports.TrendAnalysisService = void 0;
|
|
10
|
+
/**
|
|
11
|
+
* Service for analyzing performance trends
|
|
12
|
+
*/
|
|
13
|
+
class TrendAnalysisService {
|
|
14
|
+
/**
|
|
15
|
+
* Analyze trends across multiple benchmark runs
|
|
16
|
+
*/
|
|
17
|
+
analyzeTrends(runs) {
|
|
18
|
+
// Build trend data for each task across runs
|
|
19
|
+
const taskTrendsMap = new Map();
|
|
20
|
+
for (const run of runs) {
|
|
21
|
+
for (const file of run.files) {
|
|
22
|
+
for (const suite of file.suites) {
|
|
23
|
+
for (const task of suite.tasks) {
|
|
24
|
+
if (!task.error) {
|
|
25
|
+
const key = `${file.filePath}::${suite.name}::${task.name}`;
|
|
26
|
+
const dataPoints = taskTrendsMap.get(key) || [];
|
|
27
|
+
dataPoints.push({
|
|
28
|
+
date: new Date(run.startTime),
|
|
29
|
+
mean: task.mean,
|
|
30
|
+
});
|
|
31
|
+
taskTrendsMap.set(key, dataPoints);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Calculate trends for each task
|
|
38
|
+
const trendsData = [];
|
|
39
|
+
for (const [key, dataPoints] of taskTrendsMap.entries()) {
|
|
40
|
+
// Sort by date (oldest first)
|
|
41
|
+
dataPoints.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
42
|
+
const [_filePath, suiteName, taskName] = key.split('::');
|
|
43
|
+
const statistics = (0, exports.calculateStatistics)(dataPoints);
|
|
44
|
+
const trend = (0, exports.calculateTrend)(dataPoints);
|
|
45
|
+
const percentChange = (0, exports.calculatePercentChange)(dataPoints);
|
|
46
|
+
trendsData.push({
|
|
47
|
+
confidence: 95, // Fixed confidence level for now
|
|
48
|
+
dataPoints,
|
|
49
|
+
percentChange,
|
|
50
|
+
runs: dataPoints.length,
|
|
51
|
+
statistics,
|
|
52
|
+
task: `${suiteName} › ${taskName}`,
|
|
53
|
+
trend,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// Sort by absolute percent change (most significant first)
|
|
57
|
+
trendsData.sort((a, b) => Math.abs(b.percentChange) - Math.abs(a.percentChange));
|
|
58
|
+
// Calculate summary statistics
|
|
59
|
+
const summary = {
|
|
60
|
+
degradingTasks: trendsData.filter((t) => t.trend === 'degrading').length,
|
|
61
|
+
improvingTasks: trendsData.filter((t) => t.trend === 'improving').length,
|
|
62
|
+
stableTasks: trendsData.filter((t) => t.trend === 'stable').length,
|
|
63
|
+
totalTasks: trendsData.length,
|
|
64
|
+
};
|
|
65
|
+
// Get timespan
|
|
66
|
+
const firstRun = runs[runs.length - 1];
|
|
67
|
+
const lastRun = runs[0];
|
|
68
|
+
const timespan = {
|
|
69
|
+
end: lastRun ? new Date(lastRun.startTime) : new Date(),
|
|
70
|
+
start: firstRun ? new Date(firstRun.startTime) : new Date(),
|
|
71
|
+
};
|
|
72
|
+
// Detect regressions (require minimum 5 runs for confidence)
|
|
73
|
+
const minRunsForRegression = 5;
|
|
74
|
+
const regressions = trendsData.filter((t) => (0, exports.detectRegression)(t, 5, minRunsForRegression));
|
|
75
|
+
// Also track low-confidence potential regressions (2-4 runs showing degradation)
|
|
76
|
+
const lowConfidenceRegressions = trendsData.filter((t) => t.trend === 'degrading' &&
|
|
77
|
+
t.percentChange >= 5 &&
|
|
78
|
+
t.runs < minRunsForRegression &&
|
|
79
|
+
t.runs >= 2);
|
|
80
|
+
return {
|
|
81
|
+
lowConfidenceRegressions,
|
|
82
|
+
regressions,
|
|
83
|
+
runs: runs.length,
|
|
84
|
+
summary,
|
|
85
|
+
timespan,
|
|
86
|
+
trends: trendsData,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.TrendAnalysisService = TrendAnalysisService;
|
|
91
|
+
/**
|
|
92
|
+
* Calculate percent change from first to last data point
|
|
93
|
+
*/
|
|
94
|
+
const calculatePercentChange = (dataPoints) => {
|
|
95
|
+
if (dataPoints.length === 0 || dataPoints.length === 1) {
|
|
96
|
+
return 0;
|
|
97
|
+
}
|
|
98
|
+
const firstPoint = dataPoints[0];
|
|
99
|
+
const lastPoint = dataPoints[dataPoints.length - 1];
|
|
100
|
+
if (!firstPoint || !lastPoint) {
|
|
101
|
+
return 0;
|
|
102
|
+
}
|
|
103
|
+
const first = firstPoint.mean;
|
|
104
|
+
const last = lastPoint.mean;
|
|
105
|
+
if (first === 0) {
|
|
106
|
+
return 0; // Avoid division by zero
|
|
107
|
+
}
|
|
108
|
+
return ((last - first) / first) * 100;
|
|
109
|
+
};
|
|
110
|
+
exports.calculatePercentChange = calculatePercentChange;
|
|
111
|
+
/**
|
|
112
|
+
* Calculate statistical metrics from data points
|
|
113
|
+
*/
|
|
114
|
+
const calculateStatistics = (dataPoints) => {
|
|
115
|
+
if (dataPoints.length === 0) {
|
|
116
|
+
throw new Error('Cannot calculate statistics for empty data points array');
|
|
117
|
+
}
|
|
118
|
+
const values = dataPoints.map((dp) => dp.mean);
|
|
119
|
+
const n = values.length;
|
|
120
|
+
// Calculate mean
|
|
121
|
+
const mean = values.reduce((sum, val) => sum + val, 0) / n;
|
|
122
|
+
// Calculate median
|
|
123
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
124
|
+
const median = n % 2 === 0
|
|
125
|
+
? ((sorted[n / 2 - 1] ?? 0) + (sorted[n / 2] ?? 0)) / 2
|
|
126
|
+
: (sorted[Math.floor(n / 2)] ?? 0);
|
|
127
|
+
// Calculate variance and standard deviation
|
|
128
|
+
const variance = n === 1
|
|
129
|
+
? 0
|
|
130
|
+
: values.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / n;
|
|
131
|
+
const stdDeviation = Math.sqrt(variance);
|
|
132
|
+
return {
|
|
133
|
+
mean,
|
|
134
|
+
median,
|
|
135
|
+
stdDeviation,
|
|
136
|
+
variance,
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
exports.calculateStatistics = calculateStatistics;
|
|
140
|
+
/**
|
|
141
|
+
* Calculate trend direction from data points using linear regression
|
|
142
|
+
*/
|
|
143
|
+
const calculateTrend = (dataPoints) => {
|
|
144
|
+
if (dataPoints.length === 0) {
|
|
145
|
+
return 'stable';
|
|
146
|
+
}
|
|
147
|
+
if (dataPoints.length === 1) {
|
|
148
|
+
return 'stable';
|
|
149
|
+
}
|
|
150
|
+
// Simple linear regression to determine slope
|
|
151
|
+
const n = dataPoints.length;
|
|
152
|
+
const x = Array.from({ length: n }, (_, i) => i); // Time indices
|
|
153
|
+
const y = dataPoints.map((dp) => dp.mean);
|
|
154
|
+
const sumX = x.reduce((a, b) => a + b, 0);
|
|
155
|
+
const sumY = y.reduce((a, b) => a + b, 0);
|
|
156
|
+
const sumXY = x.reduce((sum, xi, i) => sum + xi * (y[i] ?? 0), 0);
|
|
157
|
+
const sumXX = x.reduce((sum, xi) => sum + xi * xi, 0);
|
|
158
|
+
// Calculate slope: (n*sumXY - sumX*sumY) / (n*sumXX - sumX*sumX)
|
|
159
|
+
const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
|
|
160
|
+
// Determine significance threshold (5% of mean)
|
|
161
|
+
const meanValue = sumY / n;
|
|
162
|
+
const significanceThreshold = Math.abs(meanValue * 0.05);
|
|
163
|
+
// Classify trend based on slope
|
|
164
|
+
if (Math.abs(slope) < significanceThreshold / n) {
|
|
165
|
+
return 'stable';
|
|
166
|
+
}
|
|
167
|
+
else if (slope < 0) {
|
|
168
|
+
// Negative slope = values decreasing = performance improving
|
|
169
|
+
return 'improving';
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Positive slope = values increasing = performance degrading
|
|
173
|
+
return 'degrading';
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
exports.calculateTrend = calculateTrend;
|
|
177
|
+
/**
|
|
178
|
+
* Detect if a trend represents a performance regression
|
|
179
|
+
*/
|
|
180
|
+
const detectRegression = (trendData, threshold, minRuns) => {
|
|
181
|
+
// Regression is a degrading trend with percent change exceeding threshold
|
|
182
|
+
return (trendData.trend === 'degrading' &&
|
|
183
|
+
trendData.percentChange >= threshold &&
|
|
184
|
+
trendData.runs >= minRuns);
|
|
185
|
+
};
|
|
186
|
+
exports.detectRegression = detectRegression;
|
|
187
|
+
//# sourceMappingURL=trend-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trend-analysis.js","sourceRoot":"","sources":["../../../src/services/history/trend-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trend Analysis Service
|
|
3
|
+
*
|
|
4
|
+
* Statistical analysis of benchmark performance trends over time, including
|
|
5
|
+
* regression detection and trend classification.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkRun } from "../../types/index.cjs";
|
|
8
|
+
import type { TrendData, TrendDataPoint, TrendsResult, TrendStatistics } from "./models.cjs";
|
|
9
|
+
/**
|
|
10
|
+
* Service for analyzing performance trends
|
|
11
|
+
*/
|
|
12
|
+
export declare class TrendAnalysisService {
|
|
13
|
+
/**
|
|
14
|
+
* Analyze trends across multiple benchmark runs
|
|
15
|
+
*/
|
|
16
|
+
analyzeTrends(runs: BenchmarkRun[]): TrendsResult;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Calculate percent change from first to last data point
|
|
20
|
+
*/
|
|
21
|
+
export declare const calculatePercentChange: (dataPoints: TrendDataPoint[]) => number;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate statistical metrics from data points
|
|
24
|
+
*/
|
|
25
|
+
export declare const calculateStatistics: (dataPoints: TrendDataPoint[]) => TrendStatistics;
|
|
26
|
+
/**
|
|
27
|
+
* Calculate trend direction from data points using linear regression
|
|
28
|
+
*/
|
|
29
|
+
export declare const calculateTrend: (dataPoints: TrendDataPoint[]) => "degrading" | "improving" | "stable";
|
|
30
|
+
/**
|
|
31
|
+
* Detect if a trend represents a performance regression
|
|
32
|
+
*/
|
|
33
|
+
export declare const detectRegression: (trendData: TrendData, threshold: number, minRuns: number) => boolean;
|
|
34
|
+
//# sourceMappingURL=trend-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trend-analysis.d.ts","sourceRoot":"","sources":["../../../src/services/history/trend-analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA6B;AACzD,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,eAAe,EAChB,qBAAoB;AAErB;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY;CA2FlD;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,YAAY,cAAc,EAAE,KAC3B,MAoBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,cAAc,EAAE,KAC3B,eA+BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,YAAY,cAAc,EAAE,KAC3B,WAAW,GAAG,WAAW,GAAG,QAoC9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,SAAS,EACpB,WAAW,MAAM,EACjB,SAAS,MAAM,KACd,OAOF,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trend Analysis Service
|
|
3
|
+
*
|
|
4
|
+
* Statistical analysis of benchmark performance trends over time, including
|
|
5
|
+
* regression detection and trend classification.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkRun } from "../../types/index.js";
|
|
8
|
+
import type { TrendData, TrendDataPoint, TrendsResult, TrendStatistics } from "./models.js";
|
|
9
|
+
/**
|
|
10
|
+
* Service for analyzing performance trends
|
|
11
|
+
*/
|
|
12
|
+
export declare class TrendAnalysisService {
|
|
13
|
+
/**
|
|
14
|
+
* Analyze trends across multiple benchmark runs
|
|
15
|
+
*/
|
|
16
|
+
analyzeTrends(runs: BenchmarkRun[]): TrendsResult;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Calculate percent change from first to last data point
|
|
20
|
+
*/
|
|
21
|
+
export declare const calculatePercentChange: (dataPoints: TrendDataPoint[]) => number;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate statistical metrics from data points
|
|
24
|
+
*/
|
|
25
|
+
export declare const calculateStatistics: (dataPoints: TrendDataPoint[]) => TrendStatistics;
|
|
26
|
+
/**
|
|
27
|
+
* Calculate trend direction from data points using linear regression
|
|
28
|
+
*/
|
|
29
|
+
export declare const calculateTrend: (dataPoints: TrendDataPoint[]) => "degrading" | "improving" | "stable";
|
|
30
|
+
/**
|
|
31
|
+
* Detect if a trend represents a performance regression
|
|
32
|
+
*/
|
|
33
|
+
export declare const detectRegression: (trendData: TrendData, threshold: number, minRuns: number) => boolean;
|
|
34
|
+
//# sourceMappingURL=trend-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trend-analysis.d.ts","sourceRoot":"","sources":["../../../src/services/history/trend-analysis.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,6BAA6B;AACzD,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,YAAY,EACZ,eAAe,EAChB,oBAAoB;AAErB;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY;CA2FlD;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,GACjC,YAAY,cAAc,EAAE,KAC3B,MAoBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,cAAc,EAAE,KAC3B,eA+BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GACzB,YAAY,cAAc,EAAE,KAC3B,WAAW,GAAG,WAAW,GAAG,QAoC9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,SAAS,EACpB,WAAW,MAAM,EACjB,SAAS,MAAM,KACd,OAOF,CAAC"}
|