modestbench 0.1.0 → 0.3.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 +31 -0
- package/README.md +162 -57
- package/dist/bootstrap.cjs +10 -10
- 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 -5
- package/dist/bootstrap.js.map +1 -1
- 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.cjs +108 -266
- 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 -268
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/init.cjs +88 -155
- 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 +88 -155
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.cjs +143 -112
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.d.cts +17 -3
- package/dist/cli/commands/run.d.cts.map +1 -1
- package/dist/cli/commands/run.d.ts +17 -3
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +142 -78
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/index.cjs +671 -266
- 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 +664 -259
- 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 +104 -15
- package/dist/core/engine.cjs.map +1 -1
- package/dist/core/engine.d.cts +7 -4
- package/dist/core/engine.d.cts.map +1 -1
- package/dist/core/engine.d.ts +7 -4
- package/dist/core/engine.d.ts.map +1 -1
- package/dist/core/engine.js +105 -16
- package/dist/core/engine.js.map +1 -1
- package/dist/core/output-path-resolver.cjs +41 -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 +37 -0
- package/dist/core/output-path-resolver.js.map +1 -0
- 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/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 +27 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -5
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -9
- package/dist/index.js.map +1 -1
- package/dist/reporters/csv.cjs +39 -19
- package/dist/reporters/csv.cjs.map +1 -1
- package/dist/reporters/csv.d.cts +4 -7
- package/dist/reporters/csv.d.cts.map +1 -1
- package/dist/reporters/csv.d.ts +4 -7
- package/dist/reporters/csv.d.ts.map +1 -1
- package/dist/reporters/csv.js +38 -18
- package/dist/reporters/csv.js.map +1 -1
- package/dist/reporters/human.cjs +87 -99
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts +15 -14
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts +15 -14
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +68 -80
- package/dist/reporters/human.js.map +1 -1
- package/dist/reporters/json.cjs +25 -50
- package/dist/reporters/json.cjs.map +1 -1
- package/dist/reporters/json.d.cts +3 -29
- package/dist/reporters/json.d.cts.map +1 -1
- package/dist/reporters/json.d.ts +3 -29
- package/dist/reporters/json.d.ts.map +1 -1
- package/dist/reporters/json.js +26 -51
- package/dist/reporters/json.js.map +1 -1
- package/dist/reporters/profile-human.cjs +149 -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 +142 -0
- package/dist/reporters/profile-human.js.map +1 -0
- package/dist/reporters/simple.cjs +66 -46
- package/dist/reporters/simple.cjs.map +1 -1
- package/dist/reporters/simple.d.cts +15 -15
- package/dist/reporters/simple.d.cts.map +1 -1
- package/dist/reporters/simple.d.ts +15 -15
- package/dist/reporters/simple.d.ts.map +1 -1
- package/dist/reporters/simple.js +65 -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/{config/manager.cjs → services/config-manager.cjs} +25 -11
- package/dist/services/config-manager.cjs.map +1 -0
- package/dist/{config/manager.d.cts → services/config-manager.d.cts} +7 -2
- package/dist/services/config-manager.d.cts.map +1 -0
- package/dist/{config/manager.d.ts → services/config-manager.d.ts} +7 -2
- package/dist/services/config-manager.d.ts.map +1 -0
- package/dist/{config/manager.js → services/config-manager.js} +25 -11
- package/dist/services/config-manager.js.map +1 -0
- package/dist/{core/loader.cjs → services/file-loader.cjs} +5 -8
- 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} +5 -8
- 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} +1 -1
- 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} +1 -1
- package/dist/services/history-storage.js.map +1 -0
- package/dist/services/profiler/profile-filter.cjs +113 -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 +109 -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/{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} +19 -25
- package/dist/services/reporter-registry.cjs.map +1 -0
- package/dist/{reporters/registry.d.cts → services/reporter-registry.d.cts} +19 -41
- package/dist/services/reporter-registry.d.cts.map +1 -0
- package/dist/{reporters/registry.d.ts → services/reporter-registry.d.ts} +19 -41
- package/dist/services/reporter-registry.d.ts.map +1 -0
- package/dist/{reporters/registry.js → services/reporter-registry.js} +19 -25
- package/dist/services/reporter-registry.js.map +1 -0
- 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 -224
- package/dist/types/cli.d.cts.map +1 -1
- package/dist/types/cli.d.ts +3 -224
- 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 +13 -2
- package/dist/types/core.d.cts.map +1 -1
- package/dist/types/core.d.ts +13 -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 +15 -8
- package/dist/types/interfaces.d.cts.map +1 -1
- package/dist/types/interfaces.d.ts +15 -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 +100 -0
- package/dist/types/profiler.d.cts.map +1 -0
- package/dist/types/profiler.d.ts +100 -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/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/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 +14 -13
- package/src/bootstrap.ts +5 -5
- package/src/cli/commands/analyze.ts +101 -0
- package/src/cli/commands/baseline.ts +577 -0
- package/src/cli/commands/history.ts +194 -342
- package/src/cli/commands/init.ts +105 -183
- package/src/cli/commands/run.ts +186 -88
- package/src/cli/index.ts +731 -234
- 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 +153 -14
- package/src/core/output-path-resolver.ts +46 -0
- package/src/errors/base.ts +11 -2
- package/src/errors/budget.ts +38 -0
- package/src/errors/index.ts +3 -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 +17 -12
- package/src/reporters/csv.ts +55 -26
- package/src/reporters/human.ts +90 -89
- package/src/reporters/json.ts +27 -72
- package/src/reporters/profile-human.ts +204 -0
- package/src/reporters/simple.ts +85 -54
- package/src/services/baseline-storage.ts +199 -0
- package/src/services/budget-evaluator.ts +182 -0
- package/src/{config/manager.ts → services/config-manager.ts} +24 -9
- package/src/{core/loader.ts → services/file-loader.ts} +4 -7
- 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/services/profiler/profile-filter.ts +143 -0
- package/src/services/profiler/profile-parser.ts +194 -0
- package/src/services/profiler/profile-runner.ts +121 -0
- package/src/{reporters/registry.ts → services/reporter-registry.ts} +46 -81
- package/src/types/budgets.ts +180 -0
- package/src/types/cli.ts +5 -235
- package/src/types/core.ts +50 -10
- package/src/types/index.ts +5 -0
- package/src/types/interfaces.ts +16 -6
- package/src/types/profiler.ts +132 -0
- package/src/types/utility.ts +0 -10
- package/src/utils/ansi.ts +59 -0
- package/src/utils/identifiers.ts +58 -0
- package/src/utils/package.ts +35 -0
- package/src/utils/type-guards.ts +51 -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/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/{storage/history.ts → services/history-storage.ts} +0 -0
- /package/src/{progress/manager.ts → services/progress-manager.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.3.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.2.0...modestbench-v0.3.0) (2025-10-28)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* add analyze command for code profiling and benchmark discovery ([330b345](https://github.com/boneskull/modestbench/commit/330b345493fc43ba6e00d64c245e2a84fd734e6d))
|
|
9
|
+
* add performance budgets ([367c554](https://github.com/boneskull/modestbench/commit/367c5542efea8bab7a64d22728b2ea793de91f99))
|
|
10
|
+
* implement --bail ([#82](https://github.com/boneskull/modestbench/issues/82)) ([69d4327](https://github.com/boneskull/modestbench/commit/69d4327ee9327ab5e6076654e79dd4a21f15770a))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **deps:** pin dependency tinybench to 5.1.0 ([#81](https://github.com/boneskull/modestbench/issues/81)) ([1be5bbe](https://github.com/boneskull/modestbench/commit/1be5bbe332545eea8d25143f61492f87cbb2089d))
|
|
16
|
+
* **deps:** update dependency tinybench to v5.1.0 ([#76](https://github.com/boneskull/modestbench/issues/76)) ([cbd763c](https://github.com/boneskull/modestbench/commit/cbd763ca7d7335f9b3e7e4cda2217160b76e366c))
|
|
17
|
+
* **deps:** upgrade to tinybench@5.1.0 ([6668a38](https://github.com/boneskull/modestbench/commit/6668a38c1ea737320a132efd884a57a4c5f91a25))
|
|
18
|
+
* fix bin script ([68155e9](https://github.com/boneskull/modestbench/commit/68155e93a19cd88fa8add5fad4e2baae356eaba0))
|
|
19
|
+
* resolve merge conflict issues and test failures ([ab1e288](https://github.com/boneskull/modestbench/commit/ab1e288cbe11d729266fd74dc14dedc58a01bf27))
|
|
20
|
+
* resolve test failures and improve default behavior ([a61d798](https://github.com/boneskull/modestbench/commit/a61d798127ca58eac4ef2f3e03944703459dda31))
|
|
21
|
+
* resolve TypeScript type errors in budget transformation ([b8f2155](https://github.com/boneskull/modestbench/commit/b8f215533829e533515c7af1f8396aea71517c10))
|
|
22
|
+
|
|
23
|
+
## [0.2.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.1.0...modestbench-v0.2.0) (2025-10-26)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
### Features
|
|
27
|
+
|
|
28
|
+
* add --output-file CLI option ([#66](https://github.com/boneskull/modestbench/issues/66)) ([09bb5ae](https://github.com/boneskull/modestbench/commit/09bb5ae7468c9d5eb9d1e9641c58350a5b3856dd))
|
|
29
|
+
* **history:** implement trend analysis and comparison ([#64](https://github.com/boneskull/modestbench/issues/64)) ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
30
|
+
* **history:** implement trends and comparison ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
31
|
+
* implement date parsing, compare, and trend analysis core ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
32
|
+
* implement full trends command with visualizations ([acf7dda](https://github.com/boneskull/modestbench/commit/acf7ddaa91f7ae242c2a2df86fd610ce88f8ac91))
|
|
33
|
+
|
|
3
34
|
## [0.1.0](https://github.com/boneskull/modestbench/compare/modestbench-v0.0.3...modestbench-v0.1.0) (2025-10-24)
|
|
4
35
|
|
|
5
36
|
|
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,42 +126,12 @@ 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
|
|
132
133
|
|
|
133
|
-
|
|
134
|
-
🚀 ModestBench
|
|
135
|
-
|
|
136
|
-
Environment:
|
|
137
|
-
Node.js: v24.10.0
|
|
138
|
-
Platform: darwin arm64
|
|
139
|
-
CPU: Apple M4 Max (16 cores)
|
|
140
|
-
Memory: 48.0 GB
|
|
141
|
-
|
|
142
|
-
Found 1 benchmark file(s)
|
|
143
|
-
|
|
144
|
-
▶ benchmarks/example.bench.js
|
|
145
|
-
|
|
146
|
-
▶ Array Operations
|
|
147
|
-
✓ Array.push()
|
|
148
|
-
810.05μs ±2.45% (1.23M ops/sec)
|
|
149
|
-
✓ Array spread
|
|
150
|
-
81.01ms ±4.12% (12.34K ops/sec)
|
|
151
|
-
✓ 2 passed
|
|
152
|
-
|
|
153
|
-
✓ All 2 tasks passed
|
|
154
|
-
|
|
155
|
-
📊 Results
|
|
156
|
-
|
|
157
|
-
✓ All tests passed: 2
|
|
158
|
-
📁 Files: 1
|
|
159
|
-
📊 Suites: 1
|
|
160
|
-
⏱️ Duration: 1.82s
|
|
161
|
-
|
|
162
|
-
🎉 All benchmarks completed successfully!
|
|
163
|
-
```
|
|
134
|
+

|
|
164
135
|
|
|
165
136
|
## Getting Started
|
|
166
137
|
|
|
@@ -200,9 +171,12 @@ modestbench file.bench.js benchmarks/ "tests/**/*.bench.ts"
|
|
|
200
171
|
modestbench \
|
|
201
172
|
--config ./config.json \
|
|
202
173
|
--iterations 2000 \
|
|
203
|
-
--
|
|
174
|
+
--reporter human \
|
|
175
|
+
--reporter json \
|
|
176
|
+
--reporter csv \
|
|
204
177
|
--output ./results \
|
|
205
|
-
--
|
|
178
|
+
--tag performance \
|
|
179
|
+
--tag algorithm \
|
|
206
180
|
--concurrent
|
|
207
181
|
```
|
|
208
182
|
|
|
@@ -252,27 +226,65 @@ Run specific subsets of benchmarks using tags:
|
|
|
252
226
|
|
|
253
227
|
```bash
|
|
254
228
|
# Run only benchmarks tagged with 'fast'
|
|
255
|
-
modestbench --
|
|
229
|
+
modestbench --tag fast
|
|
256
230
|
|
|
257
231
|
# Run benchmarks with multiple tags (OR logic - matches ANY)
|
|
258
|
-
modestbench --
|
|
232
|
+
modestbench --tag string --tag array --tag algorithm
|
|
259
233
|
|
|
260
234
|
# Exclude specific benchmarks
|
|
261
|
-
modestbench --exclude-
|
|
235
|
+
modestbench --exclude-tag slow --exclude-tag experimental
|
|
262
236
|
|
|
263
237
|
# Combine: run fast benchmarks except experimental ones
|
|
264
|
-
modestbench --
|
|
238
|
+
modestbench --tag fast --exclude-tag experimental
|
|
265
239
|
```
|
|
266
240
|
|
|
267
241
|
**Key Features:**
|
|
268
242
|
|
|
269
243
|
- Tags cascade from file → suite → task levels
|
|
270
|
-
- `--
|
|
271
|
-
- `--exclude-
|
|
244
|
+
- `--tag` uses OR logic when specified multiple times (matches ANY specified tag)
|
|
245
|
+
- `--exclude-tag` takes precedence over `--tag`
|
|
272
246
|
- Suite setup/teardown only runs if at least one task matches
|
|
273
247
|
|
|
274
248
|
See [Tagging and Filtering](#tagging-and-filtering) for detailed examples.
|
|
275
249
|
|
|
250
|
+
#### Output Options
|
|
251
|
+
|
|
252
|
+
Control where and how benchmark results are saved:
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# Write to a directory (creates results.json, results.csv, etc.)
|
|
256
|
+
modestbench --reporter json --reporter csv --output ./results
|
|
257
|
+
|
|
258
|
+
# Custom filename for single reporter
|
|
259
|
+
modestbench --reporter json --output-file my-benchmarks.json
|
|
260
|
+
|
|
261
|
+
# Custom filename in specific directory
|
|
262
|
+
modestbench --reporter json --output ./results --output-file benchmarks-2024.json
|
|
263
|
+
|
|
264
|
+
# Custom filename with absolute path
|
|
265
|
+
modestbench --reporter json --output-file /tmp/my-benchmarks.json
|
|
266
|
+
|
|
267
|
+
# With subdirectories
|
|
268
|
+
modestbench --reporter csv --output ./results --output-file reports/performance.csv
|
|
269
|
+
|
|
270
|
+
# Short flag alias (using -r for --reporter)
|
|
271
|
+
modestbench -r json --of custom.json
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**Key Options:**
|
|
275
|
+
|
|
276
|
+
- `--output <dir>`, `-o <dir>` - Directory to write output files (default: stdout)
|
|
277
|
+
- `--output-file <filename>`, `--of <filename>` - Custom filename for output
|
|
278
|
+
- Works with absolute or relative paths
|
|
279
|
+
- Requires exactly one reporter (e.g., `--reporter json`)
|
|
280
|
+
- When used with `--output`, the filename is relative to that directory
|
|
281
|
+
- When used alone, the path is relative to current working directory
|
|
282
|
+
|
|
283
|
+
**Limitations:**
|
|
284
|
+
|
|
285
|
+
- `--output-file` only works with a single reporter
|
|
286
|
+
- For multiple reporters, use `--output <dir>` (defaults to `results.json`, `results.csv`, etc.)
|
|
287
|
+
|
|
276
288
|
### History Management
|
|
277
289
|
|
|
278
290
|
**modestbench** automatically tracks benchmark results over time in a local `.modestbench/` directory. This history enables you to:
|
|
@@ -299,6 +311,98 @@ modestbench history export --format csv --output results.csv
|
|
|
299
311
|
modestbench history clean --older-than 30d
|
|
300
312
|
```
|
|
301
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
|
+
|
|
302
406
|
## Configuration
|
|
303
407
|
|
|
304
408
|
### Project Configuration
|
|
@@ -501,37 +605,37 @@ export default {
|
|
|
501
605
|
|
|
502
606
|
#### Filtering Benchmarks
|
|
503
607
|
|
|
504
|
-
Use `--
|
|
608
|
+
Use `--tag` (or `-t`) to include only benchmarks with specific tags (OR logic - matches ANY tag):
|
|
505
609
|
|
|
506
610
|
```bash
|
|
507
|
-
# Run
|
|
508
|
-
modestbench run --
|
|
611
|
+
# Run fast algorithms
|
|
612
|
+
modestbench run --tag fast
|
|
509
613
|
|
|
510
614
|
# Run benchmarks tagged with 'string' OR 'array'
|
|
511
|
-
modestbench run --
|
|
615
|
+
modestbench run --tag string --tag array
|
|
512
616
|
|
|
513
|
-
#
|
|
514
|
-
modestbench run
|
|
617
|
+
# Using short aliases
|
|
618
|
+
modestbench run -t fast -t optimized
|
|
515
619
|
```
|
|
516
620
|
|
|
517
|
-
Use `--exclude-
|
|
621
|
+
Use `--exclude-tag` (or `-e`) to skip benchmarks with specific tags:
|
|
518
622
|
|
|
519
623
|
```bash
|
|
520
624
|
# Exclude slow benchmarks
|
|
521
|
-
modestbench run --exclude-
|
|
625
|
+
modestbench run --exclude-tag slow
|
|
522
626
|
|
|
523
627
|
# Exclude experimental and unstable benchmarks
|
|
524
|
-
modestbench run --exclude-
|
|
628
|
+
modestbench run --exclude-tag experimental --exclude-tag unstable
|
|
525
629
|
```
|
|
526
630
|
|
|
527
631
|
Combine both to fine-tune your benchmark runs (exclusion takes precedence):
|
|
528
632
|
|
|
529
633
|
```bash
|
|
530
634
|
# Run fast benchmarks, but exclude experimental ones
|
|
531
|
-
modestbench run --
|
|
635
|
+
modestbench run --tag fast --exclude-tag experimental
|
|
532
636
|
|
|
533
637
|
# Run algorithm benchmarks but skip slow reference implementations
|
|
534
|
-
modestbench run --
|
|
638
|
+
modestbench run --tag algorithm --exclude-tag slow --exclude-tag reference
|
|
535
639
|
```
|
|
536
640
|
|
|
537
641
|
#### Tag Cascading Example
|
|
@@ -557,10 +661,10 @@ export default {
|
|
|
557
661
|
|
|
558
662
|
**Filtering Behavior:**
|
|
559
663
|
|
|
560
|
-
- `--
|
|
561
|
-
- `--
|
|
562
|
-
- `--
|
|
563
|
-
- `--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)
|
|
564
668
|
|
|
565
669
|
#### Suite Lifecycle with Filtering
|
|
566
670
|
|
|
@@ -589,7 +693,8 @@ jobs:
|
|
|
589
693
|
- name: Run Benchmarks
|
|
590
694
|
run: |
|
|
591
695
|
modestbench \
|
|
592
|
-
--
|
|
696
|
+
--reporter json \
|
|
697
|
+
--reporter csv \
|
|
593
698
|
--output ./results
|
|
594
699
|
|
|
595
700
|
- name: Upload Results
|
|
@@ -607,7 +712,7 @@ import { execSync } from 'child_process';
|
|
|
607
712
|
import { readFileSync } from 'fs';
|
|
608
713
|
|
|
609
714
|
// Run current benchmarks
|
|
610
|
-
execSync('modestbench --
|
|
715
|
+
execSync('modestbench --reporter json --output ./current');
|
|
611
716
|
const current = JSON.parse(readFileSync('./current/results.json'));
|
|
612
717
|
|
|
613
718
|
// Load baseline results
|
package/dist/bootstrap.cjs
CHANGED
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.bootstrap = void 0;
|
|
10
|
-
const manager_js_1 = require("./config/manager.cjs");
|
|
11
10
|
const index_js_1 = require("./core/engines/index.cjs");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
11
|
+
const config_manager_js_1 = require("./services/config-manager.cjs");
|
|
12
|
+
const file_loader_js_1 = require("./services/file-loader.cjs");
|
|
13
|
+
const history_storage_js_1 = require("./services/history-storage.cjs");
|
|
14
|
+
const progress_manager_js_1 = require("./services/progress-manager.cjs");
|
|
15
|
+
const reporter_registry_js_1 = require("./services/reporter-registry.cjs");
|
|
16
16
|
/**
|
|
17
17
|
* Initializes the ModestBench engine with default dependencies.
|
|
18
18
|
*
|
|
@@ -23,11 +23,11 @@ const history_js_1 = require("./storage/history.cjs");
|
|
|
23
23
|
*/
|
|
24
24
|
const bootstrap = () => {
|
|
25
25
|
const engine = new index_js_1.TinybenchEngine({
|
|
26
|
-
configManager: new
|
|
27
|
-
fileLoader: new
|
|
28
|
-
historyStorage: new
|
|
29
|
-
progressManager: new
|
|
30
|
-
reporterRegistry: new
|
|
26
|
+
configManager: new config_manager_js_1.ModestBenchConfigurationManager(),
|
|
27
|
+
fileLoader: new file_loader_js_1.BenchmarkFileLoader(),
|
|
28
|
+
historyStorage: new history_storage_js_1.FileHistoryStorage(),
|
|
29
|
+
progressManager: new progress_manager_js_1.ModestBenchProgressManager(),
|
|
30
|
+
reporterRegistry: new reporter_registry_js_1.ModestBenchReporterRegistry(),
|
|
31
31
|
});
|
|
32
32
|
return engine;
|
|
33
33
|
};
|
package/dist/bootstrap.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,uDAA0D;AAC1D,qEAA+E;AAC/E,+DAAgE;AAChE,uEAAmE;AACnE,yEAA4E;AAC5E,2EAA8E;AAE9E;;;;;;;GAOG;AACI,MAAM,SAAS,GAAG,GAAsB,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAI,0BAAe,CAAC;QACjC,aAAa,EAAE,IAAI,mDAA+B,EAAE;QACpD,UAAU,EAAE,IAAI,oCAAmB,EAAE;QACrC,cAAc,EAAE,IAAI,uCAAkB,EAAE;QACxC,eAAe,EAAE,IAAI,gDAA0B,EAAE;QACjD,gBAAgB,EAAE,IAAI,kDAA2B,EAAE;KACpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AATW,QAAA,SAAS,aASpB"}
|
package/dist/bootstrap.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,0BAAyB;AAQ1D;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,QAAO,iBAS5B,CAAC"}
|
package/dist/bootstrap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,iBAAiB,EAAE,yBAAyB;AAQ1D;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,QAAO,iBAS5B,CAAC"}
|
package/dist/bootstrap.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @packageDocumentation
|
|
6
6
|
*/
|
|
7
|
-
import { ModestBenchConfigurationManager } from "./config/manager.js";
|
|
8
7
|
import { TinybenchEngine } from "./core/engines/index.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
8
|
+
import { ModestBenchConfigurationManager } from "./services/config-manager.js";
|
|
9
|
+
import { BenchmarkFileLoader } from "./services/file-loader.js";
|
|
10
|
+
import { FileHistoryStorage } from "./services/history-storage.js";
|
|
11
|
+
import { ModestBenchProgressManager } from "./services/progress-manager.js";
|
|
12
|
+
import { ModestBenchReporterRegistry } from "./services/reporter-registry.js";
|
|
13
13
|
/**
|
|
14
14
|
* Initializes the ModestBench engine with default dependencies.
|
|
15
15
|
*
|
package/dist/bootstrap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,gCAAgC;AAC1D,OAAO,EAAE,+BAA+B,EAAE,qCAAqC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,kCAAkC;AAChE,OAAO,EAAE,kBAAkB,EAAE,sCAAsC;AACnE,OAAO,EAAE,0BAA0B,EAAE,uCAAuC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,wCAAwC;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAsB,EAAE;IAC/C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,IAAI,+BAA+B,EAAE;QACpD,UAAU,EAAE,IAAI,mBAAmB,EAAE;QACrC,cAAc,EAAE,IAAI,kBAAkB,EAAE;QACxC,eAAe,EAAE,IAAI,0BAA0B,EAAE;QACjD,gBAAgB,EAAE,IAAI,2BAA2B,EAAE;KACpD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -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"}
|