modestbench 0.2.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 +20 -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 +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 +132 -114
- 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 +131 -80
- 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 +103 -21
- 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 +104 -22
- package/dist/core/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 +66 -40
- package/dist/reporters/human.cjs.map +1 -1
- package/dist/reporters/human.d.cts +14 -13
- package/dist/reporters/human.d.cts.map +1 -1
- package/dist/reporters/human.d.ts +14 -13
- package/dist/reporters/human.d.ts.map +1 -1
- package/dist/reporters/human.js +66 -40
- 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 +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 +64 -44
- 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 +64 -44
- 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 +23 -9
- 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 +23 -9
- 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 +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/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 +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/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 +10 -10
- 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 +105 -183
- package/src/cli/commands/run.ts +167 -98
- 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 +151 -20
- 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 +88 -47
- package/src/reporters/json.ts +26 -71
- package/src/reporters/profile-human.ts +204 -0
- package/src/reporters/simple.ts +84 -53
- package/src/services/baseline-storage.ts +199 -0
- package/src/services/budget-evaluator.ts +182 -0
- package/src/services/config-manager.ts +23 -8
- package/src/services/file-loader.ts +3 -6
- 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/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 +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/identifiers.ts +58 -0
- package/src/utils/package.ts +35 -0
- package/src/utils/type-guards.ts +51 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Profiler Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the profile command, including configuration options,
|
|
5
|
+
* profiled function data, and filtering results.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Filtered profile data ready for reporting
|
|
12
|
+
*/
|
|
13
|
+
export interface FilteredProfileData {
|
|
14
|
+
/** Command that was profiled */
|
|
15
|
+
command?: string;
|
|
16
|
+
|
|
17
|
+
/** Duration of profiled execution (ms) */
|
|
18
|
+
duration?: number;
|
|
19
|
+
|
|
20
|
+
/** Filtered and sorted functions */
|
|
21
|
+
functions: ProfiledFunction[];
|
|
22
|
+
|
|
23
|
+
/** Grouped by file (if requested) */
|
|
24
|
+
groupedByFile?: Map<string, ProfiledFunction[]>;
|
|
25
|
+
|
|
26
|
+
/** Profile summary */
|
|
27
|
+
summary: ProfileSummary;
|
|
28
|
+
|
|
29
|
+
/** Total functions before filtering */
|
|
30
|
+
totalFiltered: number;
|
|
31
|
+
|
|
32
|
+
/** Number of functions shown */
|
|
33
|
+
totalShown: number;
|
|
34
|
+
|
|
35
|
+
/** Total CPU ticks */
|
|
36
|
+
totalTicks: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Profile command configuration
|
|
41
|
+
*/
|
|
42
|
+
export interface ProfileConfig {
|
|
43
|
+
/** Command to profile (e.g., "npm test") */
|
|
44
|
+
command?: string;
|
|
45
|
+
|
|
46
|
+
/** Patterns to exclude */
|
|
47
|
+
exclude?: string[];
|
|
48
|
+
|
|
49
|
+
/** Explicit patterns to focus on */
|
|
50
|
+
focus?: string[];
|
|
51
|
+
|
|
52
|
+
/** Group results by file */
|
|
53
|
+
groupByFile?: boolean;
|
|
54
|
+
|
|
55
|
+
/** Path to existing *.cpuprofile file */
|
|
56
|
+
input?: string;
|
|
57
|
+
|
|
58
|
+
/** Minimum call count to show */
|
|
59
|
+
minCallCount?: number;
|
|
60
|
+
|
|
61
|
+
/** Minimum execution percentage to show (default: 0.5) */
|
|
62
|
+
minExecutionPercent?: number;
|
|
63
|
+
|
|
64
|
+
/** Output file path */
|
|
65
|
+
outputFile?: string;
|
|
66
|
+
|
|
67
|
+
/** Smart detection: only show functions from your package */
|
|
68
|
+
smartDetection?: boolean;
|
|
69
|
+
|
|
70
|
+
/** Number of top functions to show (default: 25) */
|
|
71
|
+
topN?: number;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* A profiled JavaScript function
|
|
76
|
+
*/
|
|
77
|
+
export interface ProfiledFunction {
|
|
78
|
+
/** Function category */
|
|
79
|
+
category: 'C++' | 'GC' | 'JavaScript' | 'Unknown';
|
|
80
|
+
|
|
81
|
+
/** File path */
|
|
82
|
+
file: string;
|
|
83
|
+
|
|
84
|
+
/** Line number (if available) */
|
|
85
|
+
line: null | number;
|
|
86
|
+
|
|
87
|
+
/** Function name */
|
|
88
|
+
name: string;
|
|
89
|
+
|
|
90
|
+
/** Percentage of total execution time */
|
|
91
|
+
percentage: number;
|
|
92
|
+
|
|
93
|
+
/** CPU ticks in this function */
|
|
94
|
+
ticks: number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Profile execution summary
|
|
99
|
+
*/
|
|
100
|
+
export interface ProfileSummary {
|
|
101
|
+
/** C++ ticks */
|
|
102
|
+
cppTicks: number;
|
|
103
|
+
|
|
104
|
+
/** Garbage collection ticks */
|
|
105
|
+
gcTicks: number;
|
|
106
|
+
|
|
107
|
+
/** JavaScript ticks */
|
|
108
|
+
javascriptTicks: number;
|
|
109
|
+
|
|
110
|
+
/** Shared library ticks */
|
|
111
|
+
sharedLibraryTicks: number;
|
|
112
|
+
|
|
113
|
+
/** Total CPU ticks */
|
|
114
|
+
totalTicks: number;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Raw profile data from V8 profiler
|
|
119
|
+
*/
|
|
120
|
+
export interface RawProfileData {
|
|
121
|
+
/** All profiled functions */
|
|
122
|
+
functions: ProfiledFunction[];
|
|
123
|
+
|
|
124
|
+
/** Path to log file */
|
|
125
|
+
logPath: string;
|
|
126
|
+
|
|
127
|
+
/** Profile summary */
|
|
128
|
+
summary: ProfileSummary;
|
|
129
|
+
|
|
130
|
+
/** Total CPU ticks */
|
|
131
|
+
totalTicks: number;
|
|
132
|
+
}
|
package/src/types/utility.ts
CHANGED
|
@@ -281,11 +281,6 @@ export type Result<T, E = Error> =
|
|
|
281
281
|
| { readonly data: T; readonly success: true }
|
|
282
282
|
| { readonly error: E; readonly success: false };
|
|
283
283
|
|
|
284
|
-
/**
|
|
285
|
-
* Run identifier
|
|
286
|
-
*/
|
|
287
|
-
export type RunId = Brand<string, 'RunId'>;
|
|
288
|
-
|
|
289
284
|
/**
|
|
290
285
|
* Configuration that can be serialized to JSON
|
|
291
286
|
*/
|
|
@@ -324,11 +319,6 @@ export interface Stream<T> extends AsyncIterable<T> {
|
|
|
324
319
|
*/
|
|
325
320
|
export type SuiteId = Brand<string, 'SuiteId'>;
|
|
326
321
|
|
|
327
|
-
/**
|
|
328
|
-
* Task identifier
|
|
329
|
-
*/
|
|
330
|
-
export type TaskId = Brand<string, 'TaskId'>;
|
|
331
|
-
|
|
332
322
|
/**
|
|
333
323
|
* Timing information
|
|
334
324
|
*/
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for creating branded identifier types
|
|
3
|
+
*
|
|
4
|
+
* @module utils/identifiers
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { RunId, TaskId } from '../types/budgets.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Create a RunId from a string (validation should happen elsewhere)
|
|
11
|
+
*
|
|
12
|
+
* @param id - The run identifier string (typically 7 alphanumeric characters)
|
|
13
|
+
* @returns A branded RunId
|
|
14
|
+
*/
|
|
15
|
+
export const createRunId = (id: string): RunId => id as RunId;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Create a TaskId from file, suite, and task names
|
|
19
|
+
*
|
|
20
|
+
* @param filePath - Path to the benchmark file
|
|
21
|
+
* @param suiteName - Name of the test suite
|
|
22
|
+
* @param taskName - Name of the benchmark task
|
|
23
|
+
* @returns A branded TaskId in the format `{filePath}/{suiteName}/{taskName}`
|
|
24
|
+
*/
|
|
25
|
+
export function createTaskId(
|
|
26
|
+
filePath: string,
|
|
27
|
+
suiteName: string,
|
|
28
|
+
taskName: string,
|
|
29
|
+
): TaskId;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Create a TaskId from a single string
|
|
33
|
+
*
|
|
34
|
+
* @param filePath - Path to the benchmark file
|
|
35
|
+
* @param suiteName - Name of the test suite
|
|
36
|
+
* @param taskName - Name of the benchmark task
|
|
37
|
+
* @returns A branded TaskId in the format `{filePath}/{suiteName}/{taskName}`
|
|
38
|
+
*/
|
|
39
|
+
export function createTaskId(taskId: string): TaskId;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Create a TaskId from file, suite, and task names
|
|
43
|
+
*
|
|
44
|
+
* @param filePath - Path to the benchmark file
|
|
45
|
+
* @param suiteName - Name of the test suite
|
|
46
|
+
* @param taskName - Name of the benchmark task
|
|
47
|
+
* @returns A branded TaskId in the format `{filePath}/{suiteName}/{taskName}`
|
|
48
|
+
*/
|
|
49
|
+
export function createTaskId(
|
|
50
|
+
filePath: string,
|
|
51
|
+
suiteName?: string,
|
|
52
|
+
taskName?: string,
|
|
53
|
+
): TaskId {
|
|
54
|
+
if (suiteName !== undefined && taskName !== undefined) {
|
|
55
|
+
return `${filePath}/${suiteName}/${taskName}` as TaskId;
|
|
56
|
+
}
|
|
57
|
+
return filePath as TaskId;
|
|
58
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package Utilities
|
|
3
|
+
*
|
|
4
|
+
* Utilities for working with package.json files and package structure.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFile } from 'node:fs/promises';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Find the nearest package.json and return its directory
|
|
14
|
+
*
|
|
15
|
+
* @param startDir - Directory to start searching from
|
|
16
|
+
* @returns Path to directory containing package.json
|
|
17
|
+
*/
|
|
18
|
+
export const findPackageRoot = async (startDir: string): Promise<string> => {
|
|
19
|
+
let currentDir = path.resolve(startDir);
|
|
20
|
+
const root = path.parse(currentDir).root;
|
|
21
|
+
|
|
22
|
+
while (currentDir !== root) {
|
|
23
|
+
try {
|
|
24
|
+
const packagePath = path.join(currentDir, 'package.json');
|
|
25
|
+
await readFile(packagePath, 'utf-8');
|
|
26
|
+
return currentDir;
|
|
27
|
+
} catch {
|
|
28
|
+
// package.json not found, go up one directory
|
|
29
|
+
currentDir = path.dirname(currentDir);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// No package.json found, return starting directory
|
|
34
|
+
return startDir;
|
|
35
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type Guard Utilities
|
|
3
|
+
*
|
|
4
|
+
* Reusable type guard functions for runtime type checking and narrowing.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Type guard to check if a value is an object (not null or array)
|
|
9
|
+
*
|
|
10
|
+
* @param value - Value to check
|
|
11
|
+
* @returns True if value is a non-null object
|
|
12
|
+
*/
|
|
13
|
+
const isObject = (value: unknown): value is Record<string, unknown> => {
|
|
14
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Type guard to check if a value is an Error instance
|
|
19
|
+
*
|
|
20
|
+
* @param value - Value to check
|
|
21
|
+
* @returns True if value is an Error
|
|
22
|
+
*/
|
|
23
|
+
export const isError = (value: unknown): value is Error => {
|
|
24
|
+
return value instanceof Error;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Type guard to check if a value has a specific property
|
|
29
|
+
*
|
|
30
|
+
* @param value - Value to check
|
|
31
|
+
* @param property - Property name to check for
|
|
32
|
+
* @returns True if value is an object with the specified property
|
|
33
|
+
*/
|
|
34
|
+
const hasProperty = <K extends string>(
|
|
35
|
+
value: unknown,
|
|
36
|
+
property: K,
|
|
37
|
+
): value is Record<K, unknown> => {
|
|
38
|
+
return isObject(value) && property in value;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Type guard to check if an error has a code property
|
|
43
|
+
*
|
|
44
|
+
* @param error - Error to check
|
|
45
|
+
* @returns True if error has a code property
|
|
46
|
+
*/
|
|
47
|
+
export const hasErrorCode = (
|
|
48
|
+
error: unknown,
|
|
49
|
+
): error is Error & { code: string } => {
|
|
50
|
+
return isError(error) && hasProperty(error, 'code');
|
|
51
|
+
};
|