modestbench 0.2.0 → 0.3.1
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 +27 -0
- package/README.md +131 -34
- package/dist/cli/commands/analyze.cjs +60 -0
- package/dist/cli/commands/analyze.cjs.map +1 -0
- package/dist/cli/commands/analyze.d.cts +35 -0
- package/dist/cli/commands/analyze.d.cts.map +1 -0
- package/dist/cli/commands/analyze.d.ts +35 -0
- package/dist/cli/commands/analyze.d.ts.map +1 -0
- package/dist/cli/commands/analyze.js +56 -0
- package/dist/cli/commands/analyze.js.map +1 -0
- package/dist/cli/commands/baseline.cjs +404 -0
- package/dist/cli/commands/baseline.cjs.map +1 -0
- package/dist/cli/commands/baseline.d.cts +72 -0
- package/dist/cli/commands/baseline.d.cts.map +1 -0
- package/dist/cli/commands/baseline.d.ts +72 -0
- package/dist/cli/commands/baseline.d.ts.map +1 -0
- package/dist/cli/commands/baseline.js +396 -0
- package/dist/cli/commands/baseline.js.map +1 -0
- package/dist/cli/commands/history.d.cts +1 -1
- package/dist/cli/commands/history.d.cts.map +1 -1
- package/dist/cli/commands/history.d.ts +1 -1
- package/dist/cli/commands/history.d.ts.map +1 -1
- package/dist/cli/commands/init.cjs +99 -166
- package/dist/cli/commands/init.cjs.map +1 -1
- package/dist/cli/commands/init.d.cts +4 -4
- package/dist/cli/commands/init.d.cts.map +1 -1
- package/dist/cli/commands/init.d.ts +4 -4
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +99 -166
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.cjs +146 -127
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.d.cts +16 -3
- package/dist/cli/commands/run.d.cts.map +1 -1
- package/dist/cli/commands/run.d.ts +16 -3
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +145 -93
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.cjs +583 -394
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +4 -16
- package/dist/cli/index.d.cts.map +1 -1
- package/dist/cli/index.d.ts +4 -16
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +575 -386
- package/dist/cli/index.js.map +1 -1
- package/dist/config/budget-schema.cjs +172 -0
- package/dist/config/budget-schema.cjs.map +1 -0
- package/dist/config/budget-schema.d.cts +59 -0
- package/dist/config/budget-schema.d.cts.map +1 -0
- package/dist/config/budget-schema.d.ts +59 -0
- package/dist/config/budget-schema.d.ts.map +1 -0
- package/dist/config/budget-schema.js +166 -0
- package/dist/config/budget-schema.js.map +1 -0
- package/dist/config/schema.cjs +182 -2
- package/dist/config/schema.cjs.map +1 -1
- package/dist/config/schema.d.cts +122 -3
- package/dist/config/schema.d.cts.map +1 -1
- package/dist/config/schema.d.ts +122 -3
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +180 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/constants.cjs +45 -2
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +41 -0
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.ts +41 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +44 -1
- package/dist/constants.js.map +1 -1
- package/dist/core/engine.cjs +114 -23
- package/dist/core/engine.cjs.map +1 -1
- package/dist/core/engine.d.cts +7 -7
- package/dist/core/engine.d.cts.map +1 -1
- package/dist/core/engine.d.ts +7 -7
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +115 -24
- package/dist/core/engine.js.map +1 -1
- package/dist/core/engines/accurate-engine.cjs +171 -36
- package/dist/core/engines/accurate-engine.cjs.map +1 -1
- package/dist/core/engines/accurate-engine.d.cts +5 -0
- package/dist/core/engines/accurate-engine.d.cts.map +1 -1
- package/dist/core/engines/accurate-engine.d.ts +5 -0
- package/dist/core/engines/accurate-engine.d.ts.map +1 -1
- package/dist/core/engines/accurate-engine.js +171 -36
- package/dist/core/engines/accurate-engine.js.map +1 -1
- package/dist/core/engines/tinybench-engine.cjs +3 -2
- 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 +3 -2
- package/dist/core/engines/tinybench-engine.js.map +1 -1
- package/dist/core/output-path-resolver.cjs +8 -1
- package/dist/core/output-path-resolver.cjs.map +1 -1
- package/dist/core/output-path-resolver.d.cts.map +1 -1
- package/dist/core/output-path-resolver.d.ts.map +1 -1
- package/dist/core/output-path-resolver.js +9 -2
- package/dist/core/output-path-resolver.js.map +1 -1
- package/dist/errors/base.cjs +12 -3
- package/dist/errors/base.cjs.map +1 -1
- package/dist/errors/base.d.cts +7 -0
- package/dist/errors/base.d.cts.map +1 -1
- package/dist/errors/base.d.ts +7 -0
- package/dist/errors/base.d.ts.map +1 -1
- package/dist/errors/base.js +10 -2
- package/dist/errors/base.js.map +1 -1
- package/dist/errors/budget.cjs +37 -0
- package/dist/errors/budget.cjs.map +1 -0
- package/dist/errors/budget.d.cts +31 -0
- package/dist/errors/budget.d.cts.map +1 -0
- package/dist/errors/budget.d.ts +31 -0
- package/dist/errors/budget.d.ts.map +1 -0
- package/dist/errors/budget.js +33 -0
- package/dist/errors/budget.js.map +1 -0
- package/dist/errors/index.cjs +4 -1
- package/dist/errors/index.cjs.map +1 -1
- package/dist/errors/index.d.cts +1 -0
- package/dist/errors/index.d.cts.map +1 -1
- package/dist/errors/index.d.ts +1 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +2 -0
- package/dist/errors/index.js.map +1 -1
- package/dist/index.cjs +13 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/reporters/csv.cjs +37 -17
- package/dist/reporters/csv.cjs.map +1 -1
- package/dist/reporters/csv.d.cts +3 -6
- package/dist/reporters/csv.d.cts.map +1 -1
- package/dist/reporters/csv.d.ts +3 -6
- package/dist/reporters/csv.d.ts.map +1 -1
- package/dist/reporters/csv.js +37 -17
- package/dist/reporters/csv.js.map +1 -1
- package/dist/reporters/human.cjs +290 -67
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts +25 -13
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts +25 -13
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +290 -67
- package/dist/reporters/human.js.map +1 -1
- package/dist/reporters/json.cjs +23 -48
- package/dist/reporters/json.cjs.map +1 -1
- package/dist/reporters/json.d.cts +2 -28
- package/dist/reporters/json.d.cts.map +1 -1
- package/dist/reporters/json.d.ts +2 -28
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +25 -50
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/profile-human.cjs +154 -0
- package/dist/reporters/profile-human.cjs.map +1 -0
- package/dist/reporters/profile-human.d.cts +44 -0
- package/dist/reporters/profile-human.d.cts.map +1 -0
- package/dist/reporters/profile-human.d.ts +44 -0
- package/dist/reporters/profile-human.d.ts.map +1 -0
- package/dist/reporters/profile-human.js +147 -0
- package/dist/reporters/profile-human.js.map +1 -0
- package/dist/reporters/simple.cjs +67 -45
- package/dist/reporters/simple.cjs.map +1 -1
- package/dist/reporters/simple.d.cts +14 -14
- package/dist/reporters/simple.d.cts.map +1 -1
- package/dist/reporters/simple.d.ts +14 -14
- package/dist/reporters/simple.d.ts.map +1 -1
- package/dist/reporters/simple.js +67 -45
- package/dist/reporters/simple.js.map +1 -1
- package/dist/schema/modestbench-config.schema.json +153 -0
- package/dist/services/baseline-storage.cjs +151 -0
- package/dist/services/baseline-storage.cjs.map +1 -0
- package/dist/services/baseline-storage.d.cts +55 -0
- package/dist/services/baseline-storage.d.cts.map +1 -0
- package/dist/services/baseline-storage.d.ts +55 -0
- package/dist/services/baseline-storage.d.ts.map +1 -0
- package/dist/services/baseline-storage.js +147 -0
- package/dist/services/baseline-storage.js.map +1 -0
- package/dist/services/budget-evaluator.cjs +146 -0
- package/dist/services/budget-evaluator.cjs.map +1 -0
- package/dist/services/budget-evaluator.d.cts +29 -0
- package/dist/services/budget-evaluator.d.cts.map +1 -0
- package/dist/services/budget-evaluator.d.ts +29 -0
- package/dist/services/budget-evaluator.d.ts.map +1 -0
- package/dist/services/budget-evaluator.js +142 -0
- package/dist/services/budget-evaluator.js.map +1 -0
- package/dist/services/config-manager.cjs +24 -10
- package/dist/services/config-manager.cjs.map +1 -1
- package/dist/services/config-manager.d.cts +6 -1
- package/dist/services/config-manager.d.cts.map +1 -1
- package/dist/services/config-manager.d.ts +6 -1
- package/dist/services/config-manager.d.ts.map +1 -1
- package/dist/services/config-manager.js +24 -10
- package/dist/services/config-manager.js.map +1 -1
- package/dist/services/file-loader.cjs +3 -6
- package/dist/services/file-loader.cjs.map +1 -1
- package/dist/services/file-loader.d.cts.map +1 -1
- package/dist/services/file-loader.d.ts.map +1 -1
- package/dist/services/file-loader.js +3 -6
- package/dist/services/file-loader.js.map +1 -1
- package/dist/services/profiler/profile-filter.cjs +116 -0
- package/dist/services/profiler/profile-filter.cjs.map +1 -0
- package/dist/services/profiler/profile-filter.d.cts +20 -0
- package/dist/services/profiler/profile-filter.d.cts.map +1 -0
- package/dist/services/profiler/profile-filter.d.ts +20 -0
- package/dist/services/profiler/profile-filter.d.ts.map +1 -0
- package/dist/services/profiler/profile-filter.js +112 -0
- package/dist/services/profiler/profile-filter.js.map +1 -0
- package/dist/services/profiler/profile-parser.cjs +139 -0
- package/dist/services/profiler/profile-parser.cjs.map +1 -0
- package/dist/services/profiler/profile-parser.d.cts +18 -0
- package/dist/services/profiler/profile-parser.d.cts.map +1 -0
- package/dist/services/profiler/profile-parser.d.ts +18 -0
- package/dist/services/profiler/profile-parser.d.ts.map +1 -0
- package/dist/services/profiler/profile-parser.js +132 -0
- package/dist/services/profiler/profile-parser.js.map +1 -0
- package/dist/services/profiler/profile-runner.cjs +90 -0
- package/dist/services/profiler/profile-runner.cjs.map +1 -0
- package/dist/services/profiler/profile-runner.d.cts +29 -0
- package/dist/services/profiler/profile-runner.d.cts.map +1 -0
- package/dist/services/profiler/profile-runner.d.ts +29 -0
- package/dist/services/profiler/profile-runner.d.ts.map +1 -0
- package/dist/services/profiler/profile-runner.js +86 -0
- package/dist/services/profiler/profile-runner.js.map +1 -0
- package/dist/services/progress-manager.cjs +10 -2
- package/dist/services/progress-manager.cjs.map +1 -1
- package/dist/services/progress-manager.d.cts +2 -0
- package/dist/services/progress-manager.d.cts.map +1 -1
- package/dist/services/progress-manager.d.ts +2 -0
- package/dist/services/progress-manager.d.ts.map +1 -1
- package/dist/services/progress-manager.js +10 -2
- package/dist/services/progress-manager.js.map +1 -1
- package/dist/services/reporter-registry.cjs +18 -24
- package/dist/services/reporter-registry.cjs.map +1 -1
- package/dist/services/reporter-registry.d.cts +18 -40
- package/dist/services/reporter-registry.d.cts.map +1 -1
- package/dist/services/reporter-registry.d.ts +18 -40
- package/dist/services/reporter-registry.d.ts.map +1 -1
- package/dist/services/reporter-registry.js +18 -24
- package/dist/services/reporter-registry.js.map +1 -1
- package/dist/types/budgets.cjs +8 -0
- package/dist/types/budgets.cjs.map +1 -0
- package/dist/types/budgets.d.cts +149 -0
- package/dist/types/budgets.d.cts.map +1 -0
- package/dist/types/budgets.d.ts +149 -0
- package/dist/types/budgets.d.ts.map +1 -0
- package/dist/types/budgets.js +7 -0
- package/dist/types/budgets.js.map +1 -0
- package/dist/types/cli.cjs +2 -11
- package/dist/types/cli.cjs.map +1 -1
- package/dist/types/cli.d.cts +3 -227
- package/dist/types/cli.d.cts.map +1 -1
- package/dist/types/cli.d.ts +3 -227
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/cli.js +2 -11
- package/dist/types/cli.js.map +1 -1
- package/dist/types/core.cjs +6 -1
- package/dist/types/core.cjs.map +1 -1
- package/dist/types/core.d.cts +15 -2
- package/dist/types/core.d.cts.map +1 -1
- package/dist/types/core.d.ts +15 -2
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/core.js +2 -1
- package/dist/types/core.js.map +1 -1
- package/dist/types/index.cjs +5 -0
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +2 -0
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/interfaces.d.cts +19 -8
- package/dist/types/interfaces.d.cts.map +1 -1
- package/dist/types/interfaces.d.ts +19 -8
- package/dist/types/interfaces.d.ts.map +1 -1
- package/dist/types/profiler.cjs +11 -0
- package/dist/types/profiler.cjs.map +1 -0
- package/dist/types/profiler.d.cts +102 -0
- package/dist/types/profiler.d.cts.map +1 -0
- package/dist/types/profiler.d.ts +102 -0
- package/dist/types/profiler.d.ts.map +1 -0
- package/dist/types/profiler.js +10 -0
- package/dist/types/profiler.js.map +1 -0
- package/dist/types/utility.cjs.map +1 -1
- package/dist/types/utility.d.cts +0 -8
- package/dist/types/utility.d.cts.map +1 -1
- package/dist/types/utility.d.ts +0 -8
- package/dist/types/utility.d.ts.map +1 -1
- package/dist/types/utility.js.map +1 -1
- package/dist/utils/identifiers.cjs +32 -0
- package/dist/utils/identifiers.cjs.map +1 -0
- package/dist/utils/identifiers.d.cts +32 -0
- package/dist/utils/identifiers.d.cts.map +1 -0
- package/dist/utils/identifiers.d.ts +32 -0
- package/dist/utils/identifiers.d.ts.map +1 -0
- package/dist/utils/identifiers.js +27 -0
- package/dist/utils/identifiers.js.map +1 -0
- package/dist/utils/package.cjs +40 -0
- package/dist/utils/package.cjs.map +1 -0
- package/dist/utils/package.d.cts +15 -0
- package/dist/utils/package.d.cts.map +1 -0
- package/dist/utils/package.d.ts +15 -0
- package/dist/utils/package.d.ts.map +1 -0
- package/dist/utils/package.js +33 -0
- package/dist/utils/package.js.map +1 -0
- package/dist/utils/type-guards.cjs +48 -0
- package/dist/utils/type-guards.cjs.map +1 -0
- package/dist/utils/type-guards.d.cts +22 -0
- package/dist/utils/type-guards.d.cts.map +1 -0
- package/dist/utils/type-guards.d.ts +22 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +43 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/package.json +18 -19
- package/src/cli/commands/analyze.ts +101 -0
- package/src/cli/commands/baseline.ts +577 -0
- package/src/cli/commands/history.ts +1 -1
- package/src/cli/commands/init.ts +116 -194
- package/src/cli/commands/run.ts +183 -113
- package/src/cli/index.ts +425 -183
- package/src/config/budget-schema.ts +189 -0
- package/src/config/schema.ts +260 -1
- package/src/constants.ts +53 -1
- package/src/core/engine.ts +169 -22
- package/src/core/engines/accurate-engine.ts +195 -44
- package/src/core/engines/tinybench-engine.ts +3 -2
- package/src/core/output-path-resolver.ts +10 -2
- package/src/errors/base.ts +11 -2
- package/src/errors/budget.ts +38 -0
- package/src/errors/index.ts +3 -0
- package/src/index.ts +9 -0
- package/src/reporters/csv.ts +54 -25
- package/src/reporters/human.ts +434 -115
- package/src/reporters/json.ts +26 -71
- package/src/reporters/profile-human.ts +210 -0
- package/src/reporters/simple.ts +88 -54
- package/src/services/baseline-storage.ts +199 -0
- package/src/services/budget-evaluator.ts +182 -0
- package/src/services/config-manager.ts +24 -9
- package/src/services/file-loader.ts +3 -6
- package/src/services/profiler/profile-filter.ts +147 -0
- package/src/services/profiler/profile-parser.ts +194 -0
- package/src/services/profiler/profile-runner.ts +121 -0
- package/src/services/progress-manager.ts +12 -2
- package/src/services/reporter-registry.ts +46 -81
- package/src/types/budgets.ts +180 -0
- package/src/types/cli.ts +5 -238
- package/src/types/core.ts +52 -10
- package/src/types/index.ts +5 -0
- package/src/types/interfaces.ts +24 -6
- package/src/types/profiler.ts +135 -0
- package/src/types/utility.ts +0 -10
- package/src/utils/identifiers.ts +58 -0
- package/src/utils/package.ts +35 -0
- package/src/utils/type-guards.ts +51 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.1](https://github.com/boneskull/modestbench/compare/modestbench-v0.3.0...modestbench-v0.3.1) (2025-10-29)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* fix engine and reporter problems ([b4a14f3](https://github.com/boneskull/modestbench/commit/b4a14f3eac2600752939c295935901091843bf00))
|
|
9
|
+
|
|
10
|
+
## [0.3.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.2.0...modestbench-v0.3.0) (2025-10-28)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* add analyze command for code profiling and benchmark discovery ([330b345](https://github.com/boneskull/modestbench/commit/330b345493fc43ba6e00d64c245e2a84fd734e6d))
|
|
16
|
+
* add performance budgets ([367c554](https://github.com/boneskull/modestbench/commit/367c5542efea8bab7a64d22728b2ea793de91f99))
|
|
17
|
+
* implement --bail ([#82](https://github.com/boneskull/modestbench/issues/82)) ([69d4327](https://github.com/boneskull/modestbench/commit/69d4327ee9327ab5e6076654e79dd4a21f15770a))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* **deps:** pin dependency tinybench to 5.1.0 ([#81](https://github.com/boneskull/modestbench/issues/81)) ([1be5bbe](https://github.com/boneskull/modestbench/commit/1be5bbe332545eea8d25143f61492f87cbb2089d))
|
|
23
|
+
* **deps:** update dependency tinybench to v5.1.0 ([#76](https://github.com/boneskull/modestbench/issues/76)) ([cbd763c](https://github.com/boneskull/modestbench/commit/cbd763ca7d7335f9b3e7e4cda2217160b76e366c))
|
|
24
|
+
* **deps:** upgrade to tinybench@5.1.0 ([6668a38](https://github.com/boneskull/modestbench/commit/6668a38c1ea737320a132efd884a57a4c5f91a25))
|
|
25
|
+
* fix bin script ([68155e9](https://github.com/boneskull/modestbench/commit/68155e93a19cd88fa8add5fad4e2baae356eaba0))
|
|
26
|
+
* resolve merge conflict issues and test failures ([ab1e288](https://github.com/boneskull/modestbench/commit/ab1e288cbe11d729266fd74dc14dedc58a01bf27))
|
|
27
|
+
* resolve test failures and improve default behavior ([a61d798](https://github.com/boneskull/modestbench/commit/a61d798127ca58eac4ef2f3e03944703459dda31))
|
|
28
|
+
* resolve TypeScript type errors in budget transformation ([b8f2155](https://github.com/boneskull/modestbench/commit/b8f215533829e533515c7af1f8396aea71517c10))
|
|
29
|
+
|
|
3
30
|
## [0.2.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.1.0...modestbench-v0.2.0) (2025-10-26)
|
|
4
31
|
|
|
5
32
|
|
package/README.md
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
- **Multiple Output Formats**: Human-readable, JSON, and CSV reports (at the same time!!)
|
|
15
15
|
- **Historical Tracking**: Store and compare benchmark results over time
|
|
16
16
|
- **Tagging System**: Organize and filter benchmarks by categories
|
|
17
|
+
- **Performance Budgets**: Enforce performance standards and prevent regressions
|
|
17
18
|
- **CLI & API**: Command-line interface and programmatic API
|
|
18
19
|
- **TypeScript Support**: Full type safety
|
|
19
20
|
|
|
@@ -125,7 +126,7 @@ export default {
|
|
|
125
126
|
modestbench
|
|
126
127
|
|
|
127
128
|
# Run with specific options
|
|
128
|
-
modestbench --iterations 5000 --
|
|
129
|
+
modestbench --iterations 5000 --reporter human --reporter json
|
|
129
130
|
```
|
|
130
131
|
|
|
131
132
|
### View Results
|
|
@@ -170,9 +171,12 @@ modestbench file.bench.js benchmarks/ "tests/**/*.bench.ts"
|
|
|
170
171
|
modestbench \
|
|
171
172
|
--config ./config.json \
|
|
172
173
|
--iterations 2000 \
|
|
173
|
-
--
|
|
174
|
+
--reporter human \
|
|
175
|
+
--reporter json \
|
|
176
|
+
--reporter csv \
|
|
174
177
|
--output ./results \
|
|
175
|
-
--
|
|
178
|
+
--tag performance \
|
|
179
|
+
--tag algorithm \
|
|
176
180
|
--concurrent
|
|
177
181
|
```
|
|
178
182
|
|
|
@@ -222,23 +226,23 @@ Run specific subsets of benchmarks using tags:
|
|
|
222
226
|
|
|
223
227
|
```bash
|
|
224
228
|
# Run only benchmarks tagged with 'fast'
|
|
225
|
-
modestbench --
|
|
229
|
+
modestbench --tag fast
|
|
226
230
|
|
|
227
231
|
# Run benchmarks with multiple tags (OR logic - matches ANY)
|
|
228
|
-
modestbench --
|
|
232
|
+
modestbench --tag string --tag array --tag algorithm
|
|
229
233
|
|
|
230
234
|
# Exclude specific benchmarks
|
|
231
|
-
modestbench --exclude-
|
|
235
|
+
modestbench --exclude-tag slow --exclude-tag experimental
|
|
232
236
|
|
|
233
237
|
# Combine: run fast benchmarks except experimental ones
|
|
234
|
-
modestbench --
|
|
238
|
+
modestbench --tag fast --exclude-tag experimental
|
|
235
239
|
```
|
|
236
240
|
|
|
237
241
|
**Key Features:**
|
|
238
242
|
|
|
239
243
|
- Tags cascade from file → suite → task levels
|
|
240
|
-
- `--
|
|
241
|
-
- `--exclude-
|
|
244
|
+
- `--tag` uses OR logic when specified multiple times (matches ANY specified tag)
|
|
245
|
+
- `--exclude-tag` takes precedence over `--tag`
|
|
242
246
|
- Suite setup/teardown only runs if at least one task matches
|
|
243
247
|
|
|
244
248
|
See [Tagging and Filtering](#tagging-and-filtering) for detailed examples.
|
|
@@ -249,22 +253,22 @@ Control where and how benchmark results are saved:
|
|
|
249
253
|
|
|
250
254
|
```bash
|
|
251
255
|
# Write to a directory (creates results.json, results.csv, etc.)
|
|
252
|
-
modestbench --
|
|
256
|
+
modestbench --reporter json --reporter csv --output ./results
|
|
253
257
|
|
|
254
258
|
# Custom filename for single reporter
|
|
255
|
-
modestbench --
|
|
259
|
+
modestbench --reporter json --output-file my-benchmarks.json
|
|
256
260
|
|
|
257
261
|
# Custom filename in specific directory
|
|
258
|
-
modestbench --
|
|
262
|
+
modestbench --reporter json --output ./results --output-file benchmarks-2024.json
|
|
259
263
|
|
|
260
264
|
# Custom filename with absolute path
|
|
261
|
-
modestbench --
|
|
265
|
+
modestbench --reporter json --output-file /tmp/my-benchmarks.json
|
|
262
266
|
|
|
263
267
|
# With subdirectories
|
|
264
|
-
modestbench --
|
|
268
|
+
modestbench --reporter csv --output ./results --output-file reports/performance.csv
|
|
265
269
|
|
|
266
|
-
# Short flag alias
|
|
267
|
-
modestbench
|
|
270
|
+
# Short flag alias (using -r for --reporter)
|
|
271
|
+
modestbench -r json --of custom.json
|
|
268
272
|
```
|
|
269
273
|
|
|
270
274
|
**Key Options:**
|
|
@@ -272,7 +276,7 @@ modestbench --reporters json --of custom.json
|
|
|
272
276
|
- `--output <dir>`, `-o <dir>` - Directory to write output files (default: stdout)
|
|
273
277
|
- `--output-file <filename>`, `--of <filename>` - Custom filename for output
|
|
274
278
|
- Works with absolute or relative paths
|
|
275
|
-
- Requires exactly one reporter (e.g., `--
|
|
279
|
+
- Requires exactly one reporter (e.g., `--reporter json`)
|
|
276
280
|
- When used with `--output`, the filename is relative to that directory
|
|
277
281
|
- When used alone, the path is relative to current working directory
|
|
278
282
|
|
|
@@ -307,6 +311,98 @@ modestbench history export --format csv --output results.csv
|
|
|
307
311
|
modestbench history clean --older-than 30d
|
|
308
312
|
```
|
|
309
313
|
|
|
314
|
+
### Performance Budgets
|
|
315
|
+
|
|
316
|
+
**modestbench** supports performance budgets to prevent regressions and enforce performance standards in CI/CD.
|
|
317
|
+
|
|
318
|
+
#### Configuring Budgets
|
|
319
|
+
|
|
320
|
+
Define budgets in your `modestbench.config.json`:
|
|
321
|
+
|
|
322
|
+
```json
|
|
323
|
+
{
|
|
324
|
+
"budgetMode": "fail",
|
|
325
|
+
"budgets": {
|
|
326
|
+
"benchmarks/critical.bench.js/default/parseConfig": {
|
|
327
|
+
"absolute": {
|
|
328
|
+
"maxTime": "10ms",
|
|
329
|
+
"minOpsPerSec": 100000
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Budget Types:**
|
|
337
|
+
|
|
338
|
+
- **Absolute Budgets**: Fixed thresholds
|
|
339
|
+
- `maxTime` - Maximum mean execution time (e.g., `"10ms"`, `"500us"`)
|
|
340
|
+
- `minOpsPerSec` - Minimum operations per second
|
|
341
|
+
- `maxP99` - Maximum 99th percentile latency
|
|
342
|
+
|
|
343
|
+
- **Relative Budgets**: Comparison against baseline
|
|
344
|
+
- `maxRegression` - Maximum performance degradation (e.g., `"10%"`, `0.1`)
|
|
345
|
+
|
|
346
|
+
**Budget Modes:**
|
|
347
|
+
|
|
348
|
+
- `fail` (default) - Exit with error code if budgets fail
|
|
349
|
+
- `warn` - Show warnings but don't fail
|
|
350
|
+
- `report` - Include in output without failing
|
|
351
|
+
|
|
352
|
+
#### Managing Baselines
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
# Save current run as a baseline
|
|
356
|
+
modestbench baseline set production-v1.0
|
|
357
|
+
|
|
358
|
+
# List all baselines
|
|
359
|
+
modestbench baseline list
|
|
360
|
+
|
|
361
|
+
# Compare against a baseline
|
|
362
|
+
modestbench run --baseline production-v1.0
|
|
363
|
+
|
|
364
|
+
# Analyze history and suggest budgets
|
|
365
|
+
modestbench baseline analyze
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Profile Code Execution
|
|
369
|
+
|
|
370
|
+
Identify hot code paths that are good candidates for benchmarking:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
# Profile a command
|
|
374
|
+
modestbench analyze "npm test"
|
|
375
|
+
|
|
376
|
+
# Profile a specific script
|
|
377
|
+
modestbench analyze "node ./src/server.js"
|
|
378
|
+
|
|
379
|
+
# Analyze existing profile
|
|
380
|
+
modestbench analyze --input isolate-0x123-v8.log
|
|
381
|
+
|
|
382
|
+
# Filter and customize output
|
|
383
|
+
modestbench analyze "npm test" \
|
|
384
|
+
--filter-file "src/**" \
|
|
385
|
+
--min-percent 2.0 \
|
|
386
|
+
--top 50 \
|
|
387
|
+
--group-by-file
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**Profile Options:**
|
|
391
|
+
|
|
392
|
+
- `[command]` - Command to profile (e.g., `npm test`, `node script.js`)
|
|
393
|
+
- `--input`, `-i` - Path to existing V8 profile log file
|
|
394
|
+
- `--filter-file` - Filter functions by file glob pattern
|
|
395
|
+
- `--min-percent` - Minimum execution percentage to show (default: 1.0)
|
|
396
|
+
- `--top`, `-n` - Number of top functions to show (default: 25)
|
|
397
|
+
- `--group-by-file` - Group results by source file
|
|
398
|
+
- `--color` - Enable/disable color output
|
|
399
|
+
|
|
400
|
+
**How It Works:**
|
|
401
|
+
|
|
402
|
+
The profile command uses Node.js's built-in V8 profiler to identify functions that consume the most execution time. It automatically filters out Node.js internals and `node_modules` to focus on your code.
|
|
403
|
+
|
|
404
|
+
Functions that appear at the top of the profile report are good candidates for benchmarking, as optimizing them will have the most impact on overall performance.
|
|
405
|
+
|
|
310
406
|
## Configuration
|
|
311
407
|
|
|
312
408
|
### Project Configuration
|
|
@@ -509,37 +605,37 @@ export default {
|
|
|
509
605
|
|
|
510
606
|
#### Filtering Benchmarks
|
|
511
607
|
|
|
512
|
-
Use `--
|
|
608
|
+
Use `--tag` (or `-t`) to include only benchmarks with specific tags (OR logic - matches ANY tag):
|
|
513
609
|
|
|
514
610
|
```bash
|
|
515
|
-
# Run
|
|
516
|
-
modestbench run --
|
|
611
|
+
# Run fast algorithms
|
|
612
|
+
modestbench run --tag fast
|
|
517
613
|
|
|
518
614
|
# Run benchmarks tagged with 'string' OR 'array'
|
|
519
|
-
modestbench run --
|
|
615
|
+
modestbench run --tag string --tag array
|
|
520
616
|
|
|
521
|
-
#
|
|
522
|
-
modestbench run
|
|
617
|
+
# Using short aliases
|
|
618
|
+
modestbench run -t fast -t optimized
|
|
523
619
|
```
|
|
524
620
|
|
|
525
|
-
Use `--exclude-
|
|
621
|
+
Use `--exclude-tag` (or `-e`) to skip benchmarks with specific tags:
|
|
526
622
|
|
|
527
623
|
```bash
|
|
528
624
|
# Exclude slow benchmarks
|
|
529
|
-
modestbench run --exclude-
|
|
625
|
+
modestbench run --exclude-tag slow
|
|
530
626
|
|
|
531
627
|
# Exclude experimental and unstable benchmarks
|
|
532
|
-
modestbench run --exclude-
|
|
628
|
+
modestbench run --exclude-tag experimental --exclude-tag unstable
|
|
533
629
|
```
|
|
534
630
|
|
|
535
631
|
Combine both to fine-tune your benchmark runs (exclusion takes precedence):
|
|
536
632
|
|
|
537
633
|
```bash
|
|
538
634
|
# Run fast benchmarks, but exclude experimental ones
|
|
539
|
-
modestbench run --
|
|
635
|
+
modestbench run --tag fast --exclude-tag experimental
|
|
540
636
|
|
|
541
637
|
# Run algorithm benchmarks but skip slow reference implementations
|
|
542
|
-
modestbench run --
|
|
638
|
+
modestbench run --tag algorithm --exclude-tag slow --exclude-tag reference
|
|
543
639
|
```
|
|
544
640
|
|
|
545
641
|
#### Tag Cascading Example
|
|
@@ -565,10 +661,10 @@ export default {
|
|
|
565
661
|
|
|
566
662
|
**Filtering Behavior:**
|
|
567
663
|
|
|
568
|
-
- `--
|
|
569
|
-
- `--
|
|
570
|
-
- `--
|
|
571
|
-
- `--exclude-
|
|
664
|
+
- `--tag math` → Runs only Task A (matches 'math')
|
|
665
|
+
- `--tag fast` → Runs both Task A and Task B (both have 'fast')
|
|
666
|
+
- `--tag file-level` → Runs both tasks (both inherit 'file-level')
|
|
667
|
+
- `--exclude-tag math` → Runs only Task B (Task A excluded)
|
|
572
668
|
|
|
573
669
|
#### Suite Lifecycle with Filtering
|
|
574
670
|
|
|
@@ -597,7 +693,8 @@ jobs:
|
|
|
597
693
|
- name: Run Benchmarks
|
|
598
694
|
run: |
|
|
599
695
|
modestbench \
|
|
600
|
-
--
|
|
696
|
+
--reporter json \
|
|
697
|
+
--reporter csv \
|
|
601
698
|
--output ./results
|
|
602
699
|
|
|
603
700
|
- name: Upload Results
|
|
@@ -615,7 +712,7 @@ import { execSync } from 'child_process';
|
|
|
615
712
|
import { readFileSync } from 'fs';
|
|
616
713
|
|
|
617
714
|
// Run current benchmarks
|
|
618
|
-
execSync('modestbench --
|
|
715
|
+
execSync('modestbench --reporter json --output ./current');
|
|
619
716
|
const current = JSON.parse(readFileSync('./current/results.json'));
|
|
620
717
|
|
|
621
718
|
// Load baseline results
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Analyze Command
|
|
4
|
+
*
|
|
5
|
+
* CLI command for analyzing code execution and identifying benchmark
|
|
6
|
+
* candidates. Uses Node.js V8 profiler to capture function execution data.
|
|
7
|
+
*
|
|
8
|
+
* @packageDocumentation
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.handleAnalyzeCommand = void 0;
|
|
12
|
+
const profile_human_js_1 = require("../../reporters/profile-human.cjs");
|
|
13
|
+
const profile_filter_js_1 = require("../../services/profiler/profile-filter.cjs");
|
|
14
|
+
const profile_parser_js_1 = require("../../services/profiler/profile-parser.cjs");
|
|
15
|
+
const profile_runner_js_1 = require("../../services/profiler/profile-runner.cjs");
|
|
16
|
+
const package_js_1 = require("../../utils/package.cjs");
|
|
17
|
+
/**
|
|
18
|
+
* Handle analyze command
|
|
19
|
+
*/
|
|
20
|
+
const handleAnalyzeCommand = async (_context, options) => {
|
|
21
|
+
try {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
// Run profiling or load existing profile
|
|
24
|
+
const logPath = options.input
|
|
25
|
+
? options.input
|
|
26
|
+
: await (0, profile_runner_js_1.runWithProfiling)(options.command, {
|
|
27
|
+
cwd: options.cwd,
|
|
28
|
+
});
|
|
29
|
+
const duration = Date.now() - startTime;
|
|
30
|
+
// Parse profile data
|
|
31
|
+
const profileData = await (0, profile_parser_js_1.parseProfile)(logPath);
|
|
32
|
+
// Find package root for smart detection
|
|
33
|
+
const packageRoot = await (0, package_js_1.findPackageRoot)(options.cwd);
|
|
34
|
+
// Apply filtering
|
|
35
|
+
const config = {
|
|
36
|
+
focus: options.filterFile ? [options.filterFile] : undefined,
|
|
37
|
+
groupByFile: options.groupByFile,
|
|
38
|
+
minExecutionPercent: options.minPercent,
|
|
39
|
+
smartDetection: true,
|
|
40
|
+
topN: options.top,
|
|
41
|
+
};
|
|
42
|
+
const filtered = (0, profile_filter_js_1.filterProfile)(profileData, config, packageRoot);
|
|
43
|
+
// Add command and duration to filtered data
|
|
44
|
+
filtered.command = options.command;
|
|
45
|
+
filtered.duration = duration;
|
|
46
|
+
// Report results
|
|
47
|
+
const reporter = new profile_human_js_1.ProfileHumanReporter({
|
|
48
|
+
color: options.color,
|
|
49
|
+
groupByFile: options.groupByFile,
|
|
50
|
+
});
|
|
51
|
+
reporter.report(filtered);
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('Analyze command failed:', error);
|
|
56
|
+
return 1;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
exports.handleAnalyzeCommand = handleAnalyzeCommand;
|
|
60
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAKH,wEAAwE;AACxE,kFAA0E;AAC1E,kFAAyE;AACzE,kFAA6E;AAC7E,wDAAyD;AA+BzD;;GAEG;AACI,MAAM,oBAAoB,GAAG,KAAK,EACvC,QAAoB,EACpB,OAAuB,EACN,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,yCAAyC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;YAC3B,CAAC,CAAC,OAAO,CAAC,KAAK;YACf,CAAC,CAAC,MAAM,IAAA,oCAAgB,EAAC,OAAO,CAAC,OAAQ,EAAE;gBACvC,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;QAEP,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,IAAA,gCAAY,EAAC,OAAO,CAAC,CAAC;QAEhD,wCAAwC;QACxC,MAAM,WAAW,GAAG,MAAM,IAAA,4BAAe,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEvD,kBAAkB;QAClB,MAAM,MAAM,GAAkB;YAC5B,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5D,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,mBAAmB,EAAE,OAAO,CAAC,UAAU;YACvC,cAAc,EAAE,IAAI;YACpB,IAAI,EAAE,OAAO,CAAC,GAAG;SAClB,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAA,iCAAa,EAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAEjE,4CAA4C;QAC5C,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE7B,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAI,uCAAoB,CAAC;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1B,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC,CAAC;AAlDW,QAAA,oBAAoB,wBAkD/B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command for analyzing code execution and identifying benchmark
|
|
5
|
+
* candidates. Uses Node.js V8 profiler to capture function execution data.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { CliContext } from "../index.cjs";
|
|
10
|
+
/**
|
|
11
|
+
* Analyze command options interface
|
|
12
|
+
*/
|
|
13
|
+
export interface AnalyzeOptions {
|
|
14
|
+
/** Enable color output */
|
|
15
|
+
color?: boolean | undefined;
|
|
16
|
+
/** Command to analyze */
|
|
17
|
+
command?: string | undefined;
|
|
18
|
+
/** Working directory */
|
|
19
|
+
cwd: string;
|
|
20
|
+
/** Filter by file pattern */
|
|
21
|
+
filterFile?: string | undefined;
|
|
22
|
+
/** Group by file */
|
|
23
|
+
groupByFile?: boolean | undefined;
|
|
24
|
+
/** Input profile file */
|
|
25
|
+
input?: string | undefined;
|
|
26
|
+
/** Minimum execution percentage */
|
|
27
|
+
minPercent?: number | undefined;
|
|
28
|
+
/** Number of top functions to show */
|
|
29
|
+
top?: number | undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Handle analyze command
|
|
33
|
+
*/
|
|
34
|
+
export declare const handleAnalyzeCommand: (_context: CliContext, options: AnalyzeOptions) => Promise<number>;
|
|
35
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,qBAAoB;AAQ9C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE5B,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,oBAAoB;IACpB,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAElC,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,UAAU,EACpB,SAAS,cAAc,KACtB,OAAO,CAAC,MAAM,CA+ChB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command for analyzing code execution and identifying benchmark
|
|
5
|
+
* candidates. Uses Node.js V8 profiler to capture function execution data.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { CliContext } from "../index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Analyze command options interface
|
|
12
|
+
*/
|
|
13
|
+
export interface AnalyzeOptions {
|
|
14
|
+
/** Enable color output */
|
|
15
|
+
color?: boolean | undefined;
|
|
16
|
+
/** Command to analyze */
|
|
17
|
+
command?: string | undefined;
|
|
18
|
+
/** Working directory */
|
|
19
|
+
cwd: string;
|
|
20
|
+
/** Filter by file pattern */
|
|
21
|
+
filterFile?: string | undefined;
|
|
22
|
+
/** Group by file */
|
|
23
|
+
groupByFile?: boolean | undefined;
|
|
24
|
+
/** Input profile file */
|
|
25
|
+
input?: string | undefined;
|
|
26
|
+
/** Minimum execution percentage */
|
|
27
|
+
minPercent?: number | undefined;
|
|
28
|
+
/** Number of top functions to show */
|
|
29
|
+
top?: number | undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Handle analyze command
|
|
33
|
+
*/
|
|
34
|
+
export declare const handleAnalyzeCommand: (_context: CliContext, options: AnalyzeOptions) => Promise<number>;
|
|
35
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB;AAQ9C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE5B,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE7B,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IAEZ,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,oBAAoB;IACpB,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAElC,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,sCAAsC;IACtC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,UAAU,EACpB,SAAS,cAAc,KACtB,OAAO,CAAC,MAAM,CA+ChB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Analyze Command
|
|
3
|
+
*
|
|
4
|
+
* CLI command for analyzing code execution and identifying benchmark
|
|
5
|
+
* candidates. Uses Node.js V8 profiler to capture function execution data.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { ProfileHumanReporter } from "../../reporters/profile-human.js";
|
|
10
|
+
import { filterProfile } from "../../services/profiler/profile-filter.js";
|
|
11
|
+
import { parseProfile } from "../../services/profiler/profile-parser.js";
|
|
12
|
+
import { runWithProfiling } from "../../services/profiler/profile-runner.js";
|
|
13
|
+
import { findPackageRoot } from "../../utils/package.js";
|
|
14
|
+
/**
|
|
15
|
+
* Handle analyze command
|
|
16
|
+
*/
|
|
17
|
+
export const handleAnalyzeCommand = async (_context, options) => {
|
|
18
|
+
try {
|
|
19
|
+
const startTime = Date.now();
|
|
20
|
+
// Run profiling or load existing profile
|
|
21
|
+
const logPath = options.input
|
|
22
|
+
? options.input
|
|
23
|
+
: await runWithProfiling(options.command, {
|
|
24
|
+
cwd: options.cwd,
|
|
25
|
+
});
|
|
26
|
+
const duration = Date.now() - startTime;
|
|
27
|
+
// Parse profile data
|
|
28
|
+
const profileData = await parseProfile(logPath);
|
|
29
|
+
// Find package root for smart detection
|
|
30
|
+
const packageRoot = await findPackageRoot(options.cwd);
|
|
31
|
+
// Apply filtering
|
|
32
|
+
const config = {
|
|
33
|
+
focus: options.filterFile ? [options.filterFile] : undefined,
|
|
34
|
+
groupByFile: options.groupByFile,
|
|
35
|
+
minExecutionPercent: options.minPercent,
|
|
36
|
+
smartDetection: true,
|
|
37
|
+
topN: options.top,
|
|
38
|
+
};
|
|
39
|
+
const filtered = filterProfile(profileData, config, packageRoot);
|
|
40
|
+
// Add command and duration to filtered data
|
|
41
|
+
filtered.command = options.command;
|
|
42
|
+
filtered.duration = duration;
|
|
43
|
+
// Report results
|
|
44
|
+
const reporter = new ProfileHumanReporter({
|
|
45
|
+
color: options.color,
|
|
46
|
+
groupByFile: options.groupByFile,
|
|
47
|
+
});
|
|
48
|
+
reporter.report(filtered);
|
|
49
|
+
return 0;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
console.error('Analyze command failed:', error);
|
|
53
|
+
return 1;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=analyze.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,oBAAoB,EAAE,yCAAyC;AACxE,OAAO,EAAE,aAAa,EAAE,kDAAkD;AAC1E,OAAO,EAAE,YAAY,EAAE,kDAAkD;AACzE,OAAO,EAAE,gBAAgB,EAAE,kDAAkD;AAC7E,OAAO,EAAE,eAAe,EAAE,+BAA+B;AA+BzD;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EACvC,QAAoB,EACpB,OAAuB,EACN,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,yCAAyC;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK;YAC3B,CAAC,CAAC,OAAO,CAAC,KAAK;YACf,CAAC,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,OAAQ,EAAE;gBACvC,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;QAEP,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAEhD,wCAAwC;QACxC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEvD,kBAAkB;QAClB,MAAM,MAAM,GAAkB;YAC5B,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5D,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,mBAAmB,EAAE,OAAO,CAAC,UAAU;YACvC,cAAc,EAAE,IAAI;YACpB,IAAI,EAAE,OAAO,CAAC,GAAG;SAClB,CAAC;QAEF,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAEjE,4CAA4C;QAC5C,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAE7B,iBAAiB;QACjB,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC;YACxC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE1B,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC,CAAC"}
|