modestbench 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dist/cli/builder.cjs +259 -0
- package/dist/cli/builder.cjs.map +1 -0
- package/dist/cli/builder.d.cts +37 -0
- package/dist/cli/builder.d.cts.map +1 -0
- package/dist/cli/builder.d.ts +37 -0
- package/dist/cli/builder.d.ts.map +1 -0
- package/dist/cli/builder.js +255 -0
- package/dist/cli/builder.js.map +1 -0
- package/dist/cli/commands/baseline.cjs +4 -33
- package/dist/cli/commands/baseline.cjs.map +1 -1
- package/dist/cli/commands/baseline.d.cts.map +1 -1
- package/dist/cli/commands/baseline.d.ts.map +1 -1
- package/dist/cli/commands/baseline.js +2 -31
- package/dist/cli/commands/baseline.js.map +1 -1
- package/dist/cli/commands/history.cjs +2 -14
- package/dist/cli/commands/history.cjs.map +1 -1
- package/dist/cli/commands/history.d.cts.map +1 -1
- package/dist/cli/commands/history.d.ts.map +1 -1
- package/dist/cli/commands/history.js +1 -13
- package/dist/cli/commands/history.js.map +1 -1
- package/dist/cli/commands/init.cjs +2 -2
- package/dist/cli/commands/init.cjs.map +1 -1
- package/dist/cli/commands/init.js +2 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/run.cjs +3 -3
- package/dist/cli/commands/run.cjs.map +1 -1
- package/dist/cli/commands/run.d.cts +0 -13
- package/dist/cli/commands/run.d.cts.map +1 -1
- package/dist/cli/commands/run.d.ts +0 -13
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/test.cjs +1 -1
- package/dist/cli/commands/test.cjs.map +1 -1
- package/dist/cli/commands/test.js +1 -1
- package/dist/cli/commands/test.js.map +1 -1
- package/dist/cli/context.cjs +60 -0
- package/dist/cli/context.cjs.map +1 -0
- package/dist/cli/context.d.cts +28 -0
- package/dist/cli/context.d.cts.map +1 -0
- package/dist/cli/context.d.ts +28 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +56 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/handlers.cjs +74 -0
- package/dist/cli/handlers.cjs.map +1 -0
- package/dist/cli/handlers.d.cts +13 -0
- package/dist/cli/handlers.d.cts.map +1 -0
- package/dist/cli/handlers.d.ts +13 -0
- package/dist/cli/handlers.d.ts.map +1 -0
- package/dist/cli/handlers.js +70 -0
- package/dist/cli/handlers.js.map +1 -0
- package/dist/cli/index.cjs +45 -978
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +6 -31
- package/dist/cli/index.d.cts.map +1 -1
- package/dist/cli/index.d.ts +6 -31
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +43 -974
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/parsers/analyze.cjs +54 -0
- package/dist/cli/parsers/analyze.cjs.map +1 -0
- package/dist/cli/parsers/analyze.d.cts +37 -0
- package/dist/cli/parsers/analyze.d.cts.map +1 -0
- package/dist/cli/parsers/analyze.d.ts +37 -0
- package/dist/cli/parsers/analyze.d.ts.map +1 -0
- package/dist/cli/parsers/analyze.js +51 -0
- package/dist/cli/parsers/analyze.js.map +1 -0
- package/dist/cli/parsers/baseline.cjs +75 -0
- package/dist/cli/parsers/baseline.cjs.map +1 -0
- package/dist/cli/parsers/baseline.d.cts +59 -0
- package/dist/cli/parsers/baseline.d.cts.map +1 -0
- package/dist/cli/parsers/baseline.d.ts +59 -0
- package/dist/cli/parsers/baseline.d.ts.map +1 -0
- package/dist/cli/parsers/baseline.js +72 -0
- package/dist/cli/parsers/baseline.js.map +1 -0
- package/dist/cli/parsers/global.cjs +49 -0
- package/dist/cli/parsers/global.cjs.map +1 -0
- package/dist/cli/parsers/global.d.cts +45 -0
- package/dist/cli/parsers/global.d.cts.map +1 -0
- package/dist/cli/parsers/global.d.ts +45 -0
- package/dist/cli/parsers/global.d.ts.map +1 -0
- package/dist/cli/parsers/global.js +46 -0
- package/dist/cli/parsers/global.js.map +1 -0
- package/dist/cli/parsers/history.cjs +138 -0
- package/dist/cli/parsers/history.cjs.map +1 -0
- package/dist/cli/parsers/history.d.cts +108 -0
- package/dist/cli/parsers/history.d.cts.map +1 -0
- package/dist/cli/parsers/history.d.ts +108 -0
- package/dist/cli/parsers/history.d.ts.map +1 -0
- package/dist/cli/parsers/history.js +135 -0
- package/dist/cli/parsers/history.js.map +1 -0
- package/dist/cli/parsers/index.cjs +35 -0
- package/dist/cli/parsers/index.cjs.map +1 -0
- package/dist/cli/parsers/index.d.cts +15 -0
- package/dist/cli/parsers/index.d.cts.map +1 -0
- package/dist/cli/parsers/index.d.ts +15 -0
- package/dist/cli/parsers/index.d.ts.map +1 -0
- package/dist/cli/parsers/index.js +15 -0
- package/dist/cli/parsers/index.js.map +1 -0
- package/dist/cli/parsers/init.cjs +39 -0
- package/dist/cli/parsers/init.cjs.map +1 -0
- package/dist/cli/parsers/init.d.cts +32 -0
- package/dist/cli/parsers/init.d.cts.map +1 -0
- package/dist/cli/parsers/init.d.ts +32 -0
- package/dist/cli/parsers/init.d.ts.map +1 -0
- package/dist/cli/parsers/init.js +36 -0
- package/dist/cli/parsers/init.js.map +1 -0
- package/dist/cli/parsers/run.cjs +99 -0
- package/dist/cli/parsers/run.cjs.map +1 -0
- package/dist/cli/parsers/run.d.cts +62 -0
- package/dist/cli/parsers/run.d.cts.map +1 -0
- package/dist/cli/parsers/run.d.ts +62 -0
- package/dist/cli/parsers/run.d.ts.map +1 -0
- package/dist/cli/parsers/run.js +96 -0
- package/dist/cli/parsers/run.js.map +1 -0
- package/dist/cli/parsers/test.cjs +42 -0
- package/dist/cli/parsers/test.cjs.map +1 -0
- package/dist/cli/parsers/test.d.cts +31 -0
- package/dist/cli/parsers/test.d.cts.map +1 -0
- package/dist/cli/parsers/test.d.ts +31 -0
- package/dist/cli/parsers/test.d.ts.map +1 -0
- package/dist/cli/parsers/test.js +39 -0
- package/dist/cli/parsers/test.js.map +1 -0
- package/dist/cli/theme.cjs +35 -0
- package/dist/cli/theme.cjs.map +1 -0
- package/dist/cli/theme.d.cts +31 -0
- package/dist/cli/theme.d.cts.map +1 -0
- package/dist/cli/theme.d.ts +31 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +32 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/config/budget-schema.cjs +1 -1
- package/dist/config/budget-schema.cjs.map +1 -1
- package/dist/config/budget-schema.js +1 -1
- package/dist/config/budget-schema.js.map +1 -1
- package/dist/core/engines/accurate-engine.cjs +1 -1
- package/dist/core/engines/accurate-engine.cjs.map +1 -1
- package/dist/core/engines/accurate-engine.d.cts.map +1 -1
- package/dist/core/engines/accurate-engine.d.ts.map +1 -1
- package/dist/core/engines/accurate-engine.js +1 -1
- package/dist/core/engines/accurate-engine.js.map +1 -1
- package/dist/errors/base.cjs +3 -12
- package/dist/errors/base.cjs.map +1 -1
- package/dist/errors/base.d.cts +0 -7
- package/dist/errors/base.d.cts.map +1 -1
- package/dist/errors/base.d.ts +0 -7
- package/dist/errors/base.d.ts.map +1 -1
- package/dist/errors/base.js +1 -9
- package/dist/errors/base.js.map +1 -1
- package/dist/formatters/history/compare.cjs +6 -6
- package/dist/formatters/history/compare.cjs.map +1 -1
- package/dist/formatters/history/compare.js +6 -6
- package/dist/formatters/history/compare.js.map +1 -1
- package/dist/formatters/history/show.cjs +2 -2
- package/dist/formatters/history/show.cjs.map +1 -1
- package/dist/formatters/history/show.js +2 -2
- package/dist/formatters/history/show.js.map +1 -1
- package/dist/formatters/history/trends.cjs +1 -1
- package/dist/formatters/history/trends.cjs.map +1 -1
- package/dist/formatters/history/trends.js +1 -1
- package/dist/formatters/history/trends.js.map +1 -1
- package/dist/reporters/human.cjs +3 -3
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +3 -3
- package/dist/reporters/human.js.map +1 -1
- package/dist/reporters/nyan.cjs +1 -1
- package/dist/reporters/nyan.cjs.map +1 -1
- package/dist/reporters/nyan.js +1 -1
- package/dist/reporters/nyan.js.map +1 -1
- package/dist/services/budget-evaluator.cjs +2 -2
- package/dist/services/budget-evaluator.cjs.map +1 -1
- package/dist/services/budget-evaluator.js +2 -2
- package/dist/services/budget-evaluator.js.map +1 -1
- package/dist/services/config-manager.cjs +2 -2
- package/dist/services/config-manager.cjs.map +1 -1
- package/dist/services/config-manager.js +2 -2
- package/dist/services/config-manager.js.map +1 -1
- package/dist/services/profiler/profile-runner.cjs +11 -0
- package/dist/services/profiler/profile-runner.cjs.map +1 -1
- package/dist/services/profiler/profile-runner.d.cts +2 -0
- package/dist/services/profiler/profile-runner.d.cts.map +1 -1
- package/dist/services/profiler/profile-runner.d.ts +2 -0
- package/dist/services/profiler/profile-runner.d.ts.map +1 -1
- package/dist/services/profiler/profile-runner.js +11 -0
- package/dist/services/profiler/profile-runner.js.map +1 -1
- package/dist/services/reporter-registry.cjs +8 -8
- package/dist/services/reporter-registry.cjs.map +1 -1
- package/dist/services/reporter-registry.js +8 -8
- package/dist/services/reporter-registry.js.map +1 -1
- package/package.json +7 -9
- package/src/cli/builder.ts +387 -0
- package/src/cli/commands/baseline.ts +7 -33
- package/src/cli/commands/history.ts +1 -16
- package/src/cli/commands/init.ts +2 -2
- package/src/cli/commands/run.ts +1 -1
- package/src/cli/commands/test.ts +1 -1
- package/src/cli/context.ts +117 -0
- package/src/cli/handlers.ts +76 -0
- package/src/cli/index.ts +49 -1194
- package/src/cli/parsers/analyze.ts +61 -0
- package/src/cli/parsers/baseline.ts +92 -0
- package/src/cli/parsers/global.ts +51 -0
- package/src/cli/parsers/history.ts +168 -0
- package/src/cli/parsers/index.ts +28 -0
- package/src/cli/parsers/init.ts +45 -0
- package/src/cli/parsers/run.ts +118 -0
- package/src/cli/parsers/test.ts +46 -0
- package/src/cli/theme.ts +33 -0
- package/src/config/budget-schema.ts +1 -1
- package/src/core/engines/accurate-engine.ts +1 -1
- package/src/errors/base.ts +1 -10
- package/src/formatters/history/compare.ts +6 -6
- package/src/formatters/history/show.ts +2 -2
- package/src/formatters/history/trends.ts +1 -1
- package/src/reporters/human.ts +5 -3
- package/src/reporters/nyan.ts +1 -1
- package/src/services/budget-evaluator.ts +2 -2
- package/src/services/config-manager.ts +2 -2
- package/src/services/profiler/profile-runner.ts +15 -0
- package/src/services/reporter-registry.ts +8 -8
package/src/cli/commands/init.ts
CHANGED
|
@@ -51,7 +51,7 @@ const PROJECT_TEMPLATES = {
|
|
|
51
51
|
outputDir: DEFAULT_OUTPUT_DIR,
|
|
52
52
|
pattern: `${DEFAULT_BENCHMARK_DIR}/**/*.bench.{js,ts}`,
|
|
53
53
|
reporters: ['human', 'json'],
|
|
54
|
-
time:
|
|
54
|
+
time: 10_000,
|
|
55
55
|
warmup: 50,
|
|
56
56
|
},
|
|
57
57
|
description: 'Feature-rich setup with multiple reporters and configuration',
|
|
@@ -77,7 +77,7 @@ const PROJECT_TEMPLATES = {
|
|
|
77
77
|
outputDir: DEFAULT_OUTPUT_DIR,
|
|
78
78
|
pattern: `${DEFAULT_BENCHMARK_DIR}/**/*.bench.{js,ts}`,
|
|
79
79
|
reporters: ['human', 'json'],
|
|
80
|
-
time:
|
|
80
|
+
time: 15_000,
|
|
81
81
|
warmup: 100,
|
|
82
82
|
},
|
|
83
83
|
description: 'Optimized for library performance testing',
|
package/src/cli/commands/run.ts
CHANGED
|
@@ -46,7 +46,7 @@ import { hasErrorCode, isError } from '../../utils/type-guards.js';
|
|
|
46
46
|
* arguments provide values. They represent sensible defaults for running
|
|
47
47
|
* benchmarks.
|
|
48
48
|
*/
|
|
49
|
-
|
|
49
|
+
const RUN_COMMAND_DEFAULTS = {
|
|
50
50
|
bail: false,
|
|
51
51
|
quiet: false,
|
|
52
52
|
reporters: ['human'],
|
package/src/cli/commands/test.ts
CHANGED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Context
|
|
3
|
+
*
|
|
4
|
+
* Provides dependency injection container for CLI commands, including
|
|
5
|
+
* configuration manager, benchmark engine, history storage, and reporters.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { InferParserValues } from '@boneskull/bargs';
|
|
11
|
+
|
|
12
|
+
import type {
|
|
13
|
+
BenchmarkEngine,
|
|
14
|
+
ConfigurationManager,
|
|
15
|
+
Engine,
|
|
16
|
+
HistoryStorage,
|
|
17
|
+
ProgressManager,
|
|
18
|
+
ReporterRegistry,
|
|
19
|
+
} from '../types/index.js';
|
|
20
|
+
import type { globalOptions } from './parsers/global.js';
|
|
21
|
+
|
|
22
|
+
import { bootstrap } from '../bootstrap.js';
|
|
23
|
+
import { DEFAULT_ENGINE, Engines, ExitCodes, Reporters } from '../constants.js';
|
|
24
|
+
import { AccurateEngine, TinybenchEngine } from '../core/engines/index.js';
|
|
25
|
+
import {
|
|
26
|
+
CsvReporter,
|
|
27
|
+
HumanReporter,
|
|
28
|
+
JsonReporter,
|
|
29
|
+
NyanReporter,
|
|
30
|
+
SimpleReporter,
|
|
31
|
+
} from '../reporters/index.js';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* CLI context with initialized services
|
|
35
|
+
*/
|
|
36
|
+
export interface CliContext {
|
|
37
|
+
readonly abortController: AbortController;
|
|
38
|
+
readonly configManager: ConfigurationManager;
|
|
39
|
+
readonly engine: BenchmarkEngine;
|
|
40
|
+
readonly historyStorage: HistoryStorage;
|
|
41
|
+
readonly options: InferParserValues<typeof globalOptions>;
|
|
42
|
+
readonly progressManager: ProgressManager;
|
|
43
|
+
readonly reporterRegistry: ReporterRegistry;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Create CLI context with dependency injection
|
|
48
|
+
*/
|
|
49
|
+
export const createCliContext = async (
|
|
50
|
+
options: InferParserValues<typeof globalOptions>,
|
|
51
|
+
abortController: AbortController,
|
|
52
|
+
engineType: Engine = DEFAULT_ENGINE,
|
|
53
|
+
): Promise<CliContext> => {
|
|
54
|
+
try {
|
|
55
|
+
const dependencies = bootstrap();
|
|
56
|
+
|
|
57
|
+
// Select engine based on type
|
|
58
|
+
const engine =
|
|
59
|
+
engineType === Engines.ACCURATE
|
|
60
|
+
? new AccurateEngine(dependencies)
|
|
61
|
+
: new TinybenchEngine(dependencies);
|
|
62
|
+
|
|
63
|
+
// Register built-in reporters
|
|
64
|
+
engine.registerReporter(
|
|
65
|
+
Reporters.HUMAN,
|
|
66
|
+
new HumanReporter({
|
|
67
|
+
color: !options.noColor,
|
|
68
|
+
verbose: options.verbose,
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
engine.registerReporter(
|
|
73
|
+
'json',
|
|
74
|
+
new JsonReporter({
|
|
75
|
+
prettyPrint: false,
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
engine.registerReporter(
|
|
80
|
+
'csv',
|
|
81
|
+
new CsvReporter({
|
|
82
|
+
includeHeaders: true,
|
|
83
|
+
includeMetadata: true,
|
|
84
|
+
}),
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
engine.registerReporter(
|
|
88
|
+
'simple',
|
|
89
|
+
new SimpleReporter({
|
|
90
|
+
verbose: options.verbose,
|
|
91
|
+
}),
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
engine.registerReporter(
|
|
95
|
+
'nyan',
|
|
96
|
+
new NyanReporter({
|
|
97
|
+
color: !options.noColor,
|
|
98
|
+
}),
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
abortController,
|
|
103
|
+
configManager: engine.configManager,
|
|
104
|
+
engine,
|
|
105
|
+
historyStorage: engine.historyStorage,
|
|
106
|
+
options,
|
|
107
|
+
progressManager: engine.progressManager,
|
|
108
|
+
reporterRegistry: engine.reporterRegistry,
|
|
109
|
+
};
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.error(
|
|
112
|
+
'Failed to initialize ModestBench:',
|
|
113
|
+
error instanceof Error ? error.message : String(error),
|
|
114
|
+
);
|
|
115
|
+
process.exit(ExitCodes.CONFIG_ERROR);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Signal Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handles process signals (SIGINT, SIGTERM, etc.) and uncaught errors for
|
|
5
|
+
* graceful shutdown of benchmark runs.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { ABORT_TIMEOUT, ExitCodes } from '../constants.js';
|
|
11
|
+
import { isModestBenchError, UnknownError } from '../errors/index.js';
|
|
12
|
+
import { isError } from '../utils/type-guards.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Handle process signals gracefully
|
|
16
|
+
*/
|
|
17
|
+
export const setupSignalHandlers = (abortController: AbortController): void => {
|
|
18
|
+
let abortRequested = false;
|
|
19
|
+
|
|
20
|
+
const handleSignal = (signal: NodeJS.Signals) => {
|
|
21
|
+
if (abortRequested) {
|
|
22
|
+
// Second signal, force exit
|
|
23
|
+
console.log(`\nReceived ${signal} again, forcing exit...`);
|
|
24
|
+
process.exit(computeExitCode(signal));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
console.log(`\nReceived ${signal}, aborting benchmarks...`);
|
|
28
|
+
abortRequested = true;
|
|
29
|
+
abortController.abort();
|
|
30
|
+
|
|
31
|
+
// Give a short grace period for cleanup, then exit
|
|
32
|
+
setTimeout(() => {
|
|
33
|
+
console.log('\nBenchmark aborted.');
|
|
34
|
+
process.exit(computeExitCode(signal));
|
|
35
|
+
}, ABORT_TIMEOUT);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
process
|
|
39
|
+
.once('SIGINT', handleSignal)
|
|
40
|
+
.once('SIGQUIT', handleSignal)
|
|
41
|
+
.once('SIGTERM', handleSignal)
|
|
42
|
+
.once('uncaughtException', (error) => {
|
|
43
|
+
// Wrap non-ModestBench errors with UnknownError
|
|
44
|
+
const wrappedError: Error = isModestBenchError(error)
|
|
45
|
+
? error
|
|
46
|
+
: new UnknownError(error.message, { cause: error });
|
|
47
|
+
console.error(`${wrappedError}`);
|
|
48
|
+
process.exit(ExitCodes.RUNTIME_ERROR);
|
|
49
|
+
})
|
|
50
|
+
.once('unhandledRejection', (reason) => {
|
|
51
|
+
const wrappedError: Error = isModestBenchError(reason)
|
|
52
|
+
? reason
|
|
53
|
+
: new UnknownError(isError(reason) ? reason.message : String(reason), {
|
|
54
|
+
cause: reason,
|
|
55
|
+
});
|
|
56
|
+
console.error(`${wrappedError}`);
|
|
57
|
+
process.exit(ExitCodes.RUNTIME_ERROR);
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Compute the exit code based on the signal
|
|
63
|
+
*
|
|
64
|
+
* @param signal - The signal that caused the exit
|
|
65
|
+
* @returns The exit code
|
|
66
|
+
*/
|
|
67
|
+
const computeExitCode = (signal: NodeJS.Signals): number => {
|
|
68
|
+
switch (signal) {
|
|
69
|
+
case 'SIGINT':
|
|
70
|
+
return 130; // 128 + 2
|
|
71
|
+
case 'SIGQUIT':
|
|
72
|
+
return 131; // 128 + 3
|
|
73
|
+
default:
|
|
74
|
+
return 143; // 128 + 15 (SIGTERM)
|
|
75
|
+
}
|
|
76
|
+
};
|