modestbench 0.7.0 → 0.9.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.
Files changed (184) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +37 -4
  3. package/dist/adapters/types.d.cts +1 -1
  4. package/dist/adapters/types.d.cts.map +1 -1
  5. package/dist/adapters/types.d.ts +1 -1
  6. package/dist/adapters/types.d.ts.map +1 -1
  7. package/dist/cli/commands/run.cjs +93 -49
  8. package/dist/cli/commands/run.cjs.map +1 -1
  9. package/dist/cli/commands/run.d.cts +1 -0
  10. package/dist/cli/commands/run.d.cts.map +1 -1
  11. package/dist/cli/commands/run.d.ts +1 -0
  12. package/dist/cli/commands/run.d.ts.map +1 -1
  13. package/dist/cli/commands/run.js +95 -51
  14. package/dist/cli/commands/run.js.map +1 -1
  15. package/dist/cli/index.cjs +7 -1
  16. package/dist/cli/index.cjs.map +1 -1
  17. package/dist/cli/index.d.cts.map +1 -1
  18. package/dist/cli/index.d.ts.map +1 -1
  19. package/dist/cli/index.js +7 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/{core → config}/benchmark-schema.cjs +1 -1
  22. package/dist/config/benchmark-schema.cjs.map +1 -0
  23. package/dist/config/benchmark-schema.d.cts +913 -0
  24. package/dist/config/benchmark-schema.d.cts.map +1 -0
  25. package/dist/config/benchmark-schema.d.ts +913 -0
  26. package/dist/config/benchmark-schema.d.ts.map +1 -0
  27. package/dist/{core → config}/benchmark-schema.js +1 -1
  28. package/dist/config/benchmark-schema.js.map +1 -0
  29. package/dist/config/schema.cjs +188 -105
  30. package/dist/config/schema.cjs.map +1 -1
  31. package/dist/config/schema.d.cts +208 -80
  32. package/dist/config/schema.d.cts.map +1 -1
  33. package/dist/config/schema.d.ts +208 -80
  34. package/dist/config/schema.d.ts.map +1 -1
  35. package/dist/config/schema.js +187 -104
  36. package/dist/config/schema.js.map +1 -1
  37. package/dist/constants.cjs +2 -0
  38. package/dist/constants.cjs.map +1 -1
  39. package/dist/constants.d.cts +2 -0
  40. package/dist/constants.d.cts.map +1 -1
  41. package/dist/constants.d.ts +2 -0
  42. package/dist/constants.d.ts.map +1 -1
  43. package/dist/constants.js +2 -0
  44. package/dist/constants.js.map +1 -1
  45. package/dist/core/engine.cjs +50 -45
  46. package/dist/core/engine.cjs.map +1 -1
  47. package/dist/core/engine.d.cts.map +1 -1
  48. package/dist/core/engine.d.ts.map +1 -1
  49. package/dist/core/engine.js +50 -45
  50. package/dist/core/engine.js.map +1 -1
  51. package/dist/core/output-path-resolver.cjs +15 -1
  52. package/dist/core/output-path-resolver.cjs.map +1 -1
  53. package/dist/core/output-path-resolver.d.cts +8 -0
  54. package/dist/core/output-path-resolver.d.cts.map +1 -1
  55. package/dist/core/output-path-resolver.d.ts +8 -0
  56. package/dist/core/output-path-resolver.d.ts.map +1 -1
  57. package/dist/core/output-path-resolver.js +13 -0
  58. package/dist/core/output-path-resolver.js.map +1 -1
  59. package/dist/errors/index.cjs +3 -1
  60. package/dist/errors/index.cjs.map +1 -1
  61. package/dist/errors/index.d.cts +1 -1
  62. package/dist/errors/index.d.cts.map +1 -1
  63. package/dist/errors/index.d.ts +1 -1
  64. package/dist/errors/index.d.ts.map +1 -1
  65. package/dist/errors/index.js +1 -1
  66. package/dist/errors/index.js.map +1 -1
  67. package/dist/errors/reporter.cjs +45 -1
  68. package/dist/errors/reporter.cjs.map +1 -1
  69. package/dist/errors/reporter.d.cts +32 -0
  70. package/dist/errors/reporter.d.cts.map +1 -1
  71. package/dist/errors/reporter.d.ts +32 -0
  72. package/dist/errors/reporter.d.ts.map +1 -1
  73. package/dist/errors/reporter.js +42 -0
  74. package/dist/errors/reporter.js.map +1 -1
  75. package/dist/index.cjs +16 -1
  76. package/dist/index.cjs.map +1 -1
  77. package/dist/index.d.cts +3 -1
  78. package/dist/index.d.cts.map +1 -1
  79. package/dist/index.d.ts +3 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +5 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/reporters/json.cjs +1 -1
  84. package/dist/reporters/json.cjs.map +1 -1
  85. package/dist/reporters/json.js +1 -1
  86. package/dist/reporters/json.js.map +1 -1
  87. package/dist/schema/modestbench-config.schema.json +94 -87
  88. package/dist/services/budget-evaluator.cjs +8 -6
  89. package/dist/services/budget-evaluator.cjs.map +1 -1
  90. package/dist/services/budget-evaluator.d.cts +2 -2
  91. package/dist/services/budget-evaluator.d.cts.map +1 -1
  92. package/dist/services/budget-evaluator.d.ts +2 -2
  93. package/dist/services/budget-evaluator.d.ts.map +1 -1
  94. package/dist/services/budget-evaluator.js +8 -6
  95. package/dist/services/budget-evaluator.js.map +1 -1
  96. package/dist/services/budget-resolver.cjs +214 -0
  97. package/dist/services/budget-resolver.cjs.map +1 -0
  98. package/dist/services/budget-resolver.d.cts +98 -0
  99. package/dist/services/budget-resolver.d.cts.map +1 -0
  100. package/dist/services/budget-resolver.d.ts +98 -0
  101. package/dist/services/budget-resolver.d.ts.map +1 -0
  102. package/dist/services/budget-resolver.js +203 -0
  103. package/dist/services/budget-resolver.js.map +1 -0
  104. package/dist/services/file-loader.cjs +1 -1
  105. package/dist/services/file-loader.cjs.map +1 -1
  106. package/dist/services/file-loader.js +1 -1
  107. package/dist/services/file-loader.js.map +1 -1
  108. package/dist/services/reporter-loader.cjs +281 -0
  109. package/dist/services/reporter-loader.cjs.map +1 -0
  110. package/dist/services/reporter-loader.d.cts +67 -0
  111. package/dist/services/reporter-loader.d.cts.map +1 -0
  112. package/dist/services/reporter-loader.d.ts +67 -0
  113. package/dist/services/reporter-loader.d.ts.map +1 -0
  114. package/dist/services/reporter-loader.js +241 -0
  115. package/dist/services/reporter-loader.js.map +1 -0
  116. package/dist/types/budgets.d.cts +31 -0
  117. package/dist/types/budgets.d.cts.map +1 -1
  118. package/dist/types/budgets.d.ts +31 -0
  119. package/dist/types/budgets.d.ts.map +1 -1
  120. package/dist/types/core.cjs.map +1 -1
  121. package/dist/types/core.d.cts +28 -75
  122. package/dist/types/core.d.cts.map +1 -1
  123. package/dist/types/core.d.ts +28 -75
  124. package/dist/types/core.d.ts.map +1 -1
  125. package/dist/types/core.js.map +1 -1
  126. package/dist/types/index.cjs.map +1 -1
  127. package/dist/types/index.d.cts +1 -0
  128. package/dist/types/index.d.cts.map +1 -1
  129. package/dist/types/index.d.ts +1 -0
  130. package/dist/types/index.d.ts.map +1 -1
  131. package/dist/types/index.js.map +1 -1
  132. package/dist/types/plugin.cjs +9 -0
  133. package/dist/types/plugin.cjs.map +1 -0
  134. package/dist/types/plugin.d.cts +179 -0
  135. package/dist/types/plugin.d.cts.map +1 -0
  136. package/dist/types/plugin.d.ts +179 -0
  137. package/dist/types/plugin.d.ts.map +1 -0
  138. package/dist/types/plugin.js +8 -0
  139. package/dist/types/plugin.js.map +1 -0
  140. package/dist/utils/package.cjs +66 -5
  141. package/dist/utils/package.cjs.map +1 -1
  142. package/dist/utils/package.d.cts +6 -0
  143. package/dist/utils/package.d.cts.map +1 -1
  144. package/dist/utils/package.d.ts +6 -0
  145. package/dist/utils/package.d.ts.map +1 -1
  146. package/dist/utils/package.js +31 -1
  147. package/dist/utils/package.js.map +1 -1
  148. package/dist/utils/reporter-utils.cjs +90 -0
  149. package/dist/utils/reporter-utils.cjs.map +1 -0
  150. package/dist/utils/reporter-utils.d.cts +42 -0
  151. package/dist/utils/reporter-utils.d.cts.map +1 -0
  152. package/dist/utils/reporter-utils.d.ts +42 -0
  153. package/dist/utils/reporter-utils.d.ts.map +1 -0
  154. package/dist/utils/reporter-utils.js +83 -0
  155. package/dist/utils/reporter-utils.js.map +1 -0
  156. package/package.json +20 -9
  157. package/src/adapters/types.ts +1 -1
  158. package/src/cli/commands/run.ts +140 -69
  159. package/src/cli/index.ts +8 -1
  160. package/src/{core → config}/benchmark-schema.ts +1 -1
  161. package/src/config/schema.ts +379 -302
  162. package/src/constants.ts +2 -0
  163. package/src/core/engine.ts +74 -69
  164. package/src/core/output-path-resolver.ts +14 -0
  165. package/src/errors/index.ts +2 -0
  166. package/src/errors/reporter.ts +55 -0
  167. package/src/index.ts +19 -1
  168. package/src/reporters/json.ts +1 -1
  169. package/src/services/budget-evaluator.ts +13 -9
  170. package/src/services/budget-resolver.ts +254 -0
  171. package/src/services/file-loader.ts +1 -1
  172. package/src/services/reporter-loader.ts +323 -0
  173. package/src/types/budgets.ts +38 -0
  174. package/src/types/core.ts +64 -99
  175. package/src/types/index.ts +3 -0
  176. package/src/types/plugin.ts +197 -0
  177. package/src/utils/package.ts +32 -1
  178. package/src/utils/reporter-utils.ts +85 -0
  179. package/dist/core/benchmark-schema.cjs.map +0 -1
  180. package/dist/core/benchmark-schema.d.cts +0 -139
  181. package/dist/core/benchmark-schema.d.cts.map +0 -1
  182. package/dist/core/benchmark-schema.d.ts +0 -139
  183. package/dist/core/benchmark-schema.d.ts.map +0 -1
  184. package/dist/core/benchmark-schema.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"budget-evaluator.d.ts","sourceRoot":"","sources":["../../src/services/budget-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EAEN,aAAa,EAEb,MAAM,EACN,UAAU,EACX,0BAAyB;AAE1B;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB;;OAEG;IACH,WAAW,CACT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAC9C,aAAa;IAqChB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuFrB"}
1
+ {"version":3,"file":"budget-evaluator.d.ts","sourceRoot":"","sources":["../../src/services/budget-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAGnB,aAAa,EAEb,eAAe,EACf,MAAM,EACN,UAAU,EACX,0BAAyB;AAI1B;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB;;OAEG;IACH,WAAW,CACT,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAC9C,aAAa;IAsChB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuFrB"}
@@ -1,4 +1,4 @@
1
- import type { BaselineSummaryData, Budget, BudgetSummary, TaskId, TaskResult } from "../types/core.js";
1
+ import type { BaselineSummaryData, BudgetSummary, ResolvedBudgets, TaskId, TaskResult } from "../types/core.js";
2
2
  /**
3
3
  * Service for evaluating performance budgets
4
4
  *
@@ -20,7 +20,7 @@ export declare class BudgetEvaluator {
20
20
  /**
21
21
  * Evaluate budgets for an entire benchmark run
22
22
  */
23
- evaluateRun(budgets: Record<string, Budget>, taskResults: Map<TaskId, TaskResult>, baselineData?: Map<TaskId, BaselineSummaryData>): BudgetSummary;
23
+ evaluateRun(budgets: ResolvedBudgets, taskResults: Map<TaskId, TaskResult>, baselineData?: Map<TaskId, BaselineSummaryData>): BudgetSummary;
24
24
  /**
25
25
  * Evaluate budgets for a single task
26
26
  */
@@ -1 +1 @@
1
- {"version":3,"file":"budget-evaluator.d.ts","sourceRoot":"","sources":["../../src/services/budget-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,MAAM,EAEN,aAAa,EAEb,MAAM,EACN,UAAU,EACX,yBAAyB;AAE1B;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB;;OAEG;IACH,WAAW,CACT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAC9C,aAAa;IAqChB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuFrB"}
1
+ {"version":3,"file":"budget-evaluator.d.ts","sourceRoot":"","sources":["../../src/services/budget-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAGnB,aAAa,EAEb,eAAe,EACf,MAAM,EACN,UAAU,EACX,yBAAyB;AAI1B;;;;GAIG;AACH,qBAAa,eAAe;IAC1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAM3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAYzB;;OAEG;IACH,WAAW,CACT,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EACpC,YAAY,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAC9C,aAAa;IAsChB;;OAEG;IACH,OAAO,CAAC,YAAY;CAuFrB"}
@@ -1,3 +1,4 @@
1
+ import { resolveBudget } from "./budget-resolver.js";
1
2
  /**
2
3
  * Service for evaluating performance budgets
3
4
  *
@@ -40,14 +41,15 @@ export class BudgetEvaluator {
40
41
  */
41
42
  evaluateRun(budgets, taskResults, baselineData) {
42
43
  const results = [];
43
- for (const [taskId, budget] of Object.entries(budgets)) {
44
- const taskResult = taskResults.get(taskId);
45
- // Skip if no result for this task
46
- if (!taskResult) {
44
+ for (const [taskId, taskResult] of taskResults) {
45
+ const budget = resolveBudget(taskId, budgets);
46
+ // Skip if no budget matches this task
47
+ if (!budget) {
47
48
  continue;
48
49
  }
49
- // Skip relative budgets if no baseline data
50
- if (budget.relative && !baselineData) {
50
+ // Skip if budget has ONLY relative thresholds and no baseline data
51
+ // (absolute budgets can still be evaluated without baseline)
52
+ if (budget.relative && !budget.absolute && !baselineData) {
51
53
  continue;
52
54
  }
53
55
  const budgetResult = this.evaluateTask(taskId, budget, taskResult, baselineData?.get(taskId));
@@ -1 +1 @@
1
- {"version":3,"file":"budget-evaluator.js","sourceRoot":"","sources":["../../src/services/budget-evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"budget-evaluator.js","sourceRoot":"","sources":["../../src/services/budget-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * Budget resolution service for matching budgets to tasks
4
+ *
5
+ * This module provides pattern-based budget resolution using:
6
+ *
7
+ * - Minimatch glob patterns for file matching
8
+ * - Simple `*` wildcards for suite/task matching
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.createBudgetPattern = exports.resolveBudget = exports.mergeBudgets = exports.parseTaskId = exports.calculateSpecificity = exports.matchesSuiteOrTask = exports.matchesFile = exports.isGlobPattern = void 0;
14
+ const minimatch_1 = require("minimatch");
15
+ /**
16
+ * Check if a glob pattern contains wildcards
17
+ *
18
+ * @param pattern - The pattern to check
19
+ * @returns True if the pattern contains glob metacharacters
20
+ */
21
+ const isGlobPattern = (pattern) => {
22
+ return /[*?[\]]/.test(pattern);
23
+ };
24
+ exports.isGlobPattern = isGlobPattern;
25
+ /**
26
+ * Check if a file path matches a glob pattern
27
+ *
28
+ * @param pattern - Minimatch glob pattern
29
+ * @param filePath - File path to match against
30
+ * @returns True if the pattern matches the file path
31
+ */
32
+ const matchesFile = (pattern, filePath) => {
33
+ // Exact match fast path
34
+ if (pattern === filePath) {
35
+ return true;
36
+ }
37
+ return (0, minimatch_1.minimatch)(filePath, pattern, { matchBase: true });
38
+ };
39
+ exports.matchesFile = matchesFile;
40
+ /**
41
+ * Check if a suite or task name matches a pattern
42
+ *
43
+ * @param pattern - Either an exact name or `*` for wildcard
44
+ * @param value - The value to match against
45
+ * @returns True if the pattern matches the value
46
+ */
47
+ const matchesSuiteOrTask = (pattern, value) => {
48
+ return pattern === '*' || pattern === value;
49
+ };
50
+ exports.matchesSuiteOrTask = matchesSuiteOrTask;
51
+ /**
52
+ * Calculate specificity score for a budget pattern
53
+ *
54
+ * Higher scores indicate more specific patterns. Scoring:
55
+ *
56
+ * - File: +2 for exact match, +1 for glob with specific parts, +0 for `**\/*`
57
+ * - Suite: +1 for exact match, +0 for `*`
58
+ * - Task: +1 for exact match, +0 for `*`
59
+ *
60
+ * @param pattern - The budget pattern to score
61
+ * @returns Specificity score (0-4)
62
+ */
63
+ const calculateSpecificity = (pattern) => {
64
+ let score = 0;
65
+ // File specificity
66
+ if (!(0, exports.isGlobPattern)(pattern.filePattern)) {
67
+ // Exact file match
68
+ score += 2;
69
+ }
70
+ else if (pattern.filePattern !== '**/*' && pattern.filePattern !== '*') {
71
+ // Glob with some specificity (e.g., "**/api/**/*.bench.js")
72
+ score += 1;
73
+ }
74
+ // else: fully generic glob like "**/*" gets +0
75
+ // Suite specificity
76
+ if (pattern.suitePattern !== '*') {
77
+ score += 1;
78
+ }
79
+ // Task specificity
80
+ if (pattern.taskPattern !== '*') {
81
+ score += 1;
82
+ }
83
+ return score;
84
+ };
85
+ exports.calculateSpecificity = calculateSpecificity;
86
+ /**
87
+ * Parse a TaskId into its components
88
+ *
89
+ * TaskIds have the format: `{filePath}/{suiteName}/{taskName}` The file path
90
+ * can contain slashes, so we parse from the end.
91
+ *
92
+ * @param taskId - The TaskId to parse
93
+ * @returns Object with file, suite, and task components
94
+ */
95
+ const parseTaskId = (taskId) => {
96
+ const str = taskId;
97
+ const lastSlash = str.lastIndexOf('/');
98
+ const secondLastSlash = str.lastIndexOf('/', lastSlash - 1);
99
+ return {
100
+ file: str.substring(0, secondLastSlash),
101
+ suite: str.substring(secondLastSlash + 1, lastSlash),
102
+ task: str.substring(lastSlash + 1),
103
+ };
104
+ };
105
+ exports.parseTaskId = parseTaskId;
106
+ /**
107
+ * Deep merge two budget objects
108
+ *
109
+ * More specific (second) budget values override less specific (first) values.
110
+ * Merges at the absolute/relative level.
111
+ *
112
+ * @param base - Base budget (less specific)
113
+ * @param override - Override budget (more specific)
114
+ * @returns Merged budget
115
+ */
116
+ const mergeBudgets = (base, override) => {
117
+ return {
118
+ ...(base.absolute || override.absolute
119
+ ? {
120
+ absolute: {
121
+ ...base.absolute,
122
+ ...override.absolute,
123
+ },
124
+ }
125
+ : {}),
126
+ ...(base.relative || override.relative
127
+ ? {
128
+ relative: {
129
+ ...base.relative,
130
+ ...override.relative,
131
+ },
132
+ }
133
+ : {}),
134
+ };
135
+ };
136
+ exports.mergeBudgets = mergeBudgets;
137
+ /**
138
+ * Resolve the appropriate budget for a task
139
+ *
140
+ * Resolution order:
141
+ *
142
+ * 1. Check exact match in `exact` map (highest priority)
143
+ * 2. Find all matching patterns
144
+ * 3. Sort by specificity (ascending)
145
+ * 4. Merge matched budgets (more specific overrides less specific)
146
+ *
147
+ * @param taskId - The task identifier to resolve a budget for
148
+ * @param budgets - The resolved budgets structure
149
+ * @returns The resolved budget, or undefined if no budget matches
150
+ */
151
+ const resolveBudget = (taskId, budgets) => {
152
+ // Fast path: exact match
153
+ const exactMatch = budgets.exact[taskId];
154
+ if (exactMatch) {
155
+ // Still need to check patterns and merge if there are less-specific matches
156
+ const parsed = (0, exports.parseTaskId)(taskId);
157
+ const matchingPatterns = budgets.patterns.filter((p) => (0, exports.matchesFile)(p.filePattern, parsed.file) &&
158
+ (0, exports.matchesSuiteOrTask)(p.suitePattern, parsed.suite) &&
159
+ (0, exports.matchesSuiteOrTask)(p.taskPattern, parsed.task));
160
+ if (matchingPatterns.length === 0) {
161
+ return exactMatch;
162
+ }
163
+ // Sort by specificity ascending (least specific first, so more specific can override)
164
+ const sorted = [...matchingPatterns].sort((a, b) => a.specificity - b.specificity);
165
+ // Merge all patterns, then apply exact match last
166
+ let merged = sorted[0].budget;
167
+ for (let i = 1; i < sorted.length; i++) {
168
+ merged = (0, exports.mergeBudgets)(merged, sorted[i].budget);
169
+ }
170
+ // Exact match has highest priority
171
+ return (0, exports.mergeBudgets)(merged, exactMatch);
172
+ }
173
+ // Find all matching patterns
174
+ const parsed = (0, exports.parseTaskId)(taskId);
175
+ const matchingPatterns = budgets.patterns.filter((p) => (0, exports.matchesFile)(p.filePattern, parsed.file) &&
176
+ (0, exports.matchesSuiteOrTask)(p.suitePattern, parsed.suite) &&
177
+ (0, exports.matchesSuiteOrTask)(p.taskPattern, parsed.task));
178
+ if (matchingPatterns.length === 0) {
179
+ return undefined;
180
+ }
181
+ // Sort by specificity ascending (least specific first)
182
+ const sorted = [...matchingPatterns].sort((a, b) => a.specificity - b.specificity);
183
+ // Merge all matches (more specific overrides less specific)
184
+ let merged = sorted[0].budget;
185
+ for (let i = 1; i < sorted.length; i++) {
186
+ merged = (0, exports.mergeBudgets)(merged, sorted[i].budget);
187
+ }
188
+ return merged;
189
+ };
190
+ exports.resolveBudget = resolveBudget;
191
+ /**
192
+ * Create a BudgetPattern from its components
193
+ *
194
+ * @param filePattern - Glob pattern for file matching
195
+ * @param suitePattern - Suite name or `*` for wildcard
196
+ * @param taskPattern - Task name or `*` for wildcard
197
+ * @param budget - The budget to apply
198
+ * @returns A BudgetPattern with computed specificity
199
+ */
200
+ const createBudgetPattern = (filePattern, suitePattern, taskPattern, budget) => {
201
+ return {
202
+ budget,
203
+ filePattern,
204
+ specificity: (0, exports.calculateSpecificity)({
205
+ filePattern,
206
+ suitePattern,
207
+ taskPattern,
208
+ }),
209
+ suitePattern,
210
+ taskPattern,
211
+ };
212
+ };
213
+ exports.createBudgetPattern = createBudgetPattern;
214
+ //# sourceMappingURL=budget-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-resolver.js","sourceRoot":"","sources":["../../src/services/budget-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Budget resolution service for matching budgets to tasks
3
+ *
4
+ * This module provides pattern-based budget resolution using:
5
+ *
6
+ * - Minimatch glob patterns for file matching
7
+ * - Simple `*` wildcards for suite/task matching
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import type { Budget, BudgetPattern, ResolvedBudgets, TaskId } from "../types/core.cjs";
12
+ /**
13
+ * Check if a glob pattern contains wildcards
14
+ *
15
+ * @param pattern - The pattern to check
16
+ * @returns True if the pattern contains glob metacharacters
17
+ */
18
+ export declare const isGlobPattern: (pattern: string) => boolean;
19
+ /**
20
+ * Check if a file path matches a glob pattern
21
+ *
22
+ * @param pattern - Minimatch glob pattern
23
+ * @param filePath - File path to match against
24
+ * @returns True if the pattern matches the file path
25
+ */
26
+ export declare const matchesFile: (pattern: string, filePath: string) => boolean;
27
+ /**
28
+ * Check if a suite or task name matches a pattern
29
+ *
30
+ * @param pattern - Either an exact name or `*` for wildcard
31
+ * @param value - The value to match against
32
+ * @returns True if the pattern matches the value
33
+ */
34
+ export declare const matchesSuiteOrTask: (pattern: string, value: string) => boolean;
35
+ /**
36
+ * Calculate specificity score for a budget pattern
37
+ *
38
+ * Higher scores indicate more specific patterns. Scoring:
39
+ *
40
+ * - File: +2 for exact match, +1 for glob with specific parts, +0 for `**\/*`
41
+ * - Suite: +1 for exact match, +0 for `*`
42
+ * - Task: +1 for exact match, +0 for `*`
43
+ *
44
+ * @param pattern - The budget pattern to score
45
+ * @returns Specificity score (0-4)
46
+ */
47
+ export declare const calculateSpecificity: (pattern: Pick<BudgetPattern, "filePattern" | "suitePattern" | "taskPattern">) => number;
48
+ /**
49
+ * Parse a TaskId into its components
50
+ *
51
+ * TaskIds have the format: `{filePath}/{suiteName}/{taskName}` The file path
52
+ * can contain slashes, so we parse from the end.
53
+ *
54
+ * @param taskId - The TaskId to parse
55
+ * @returns Object with file, suite, and task components
56
+ */
57
+ export declare const parseTaskId: (taskId: TaskId) => {
58
+ file: string;
59
+ suite: string;
60
+ task: string;
61
+ };
62
+ /**
63
+ * Deep merge two budget objects
64
+ *
65
+ * More specific (second) budget values override less specific (first) values.
66
+ * Merges at the absolute/relative level.
67
+ *
68
+ * @param base - Base budget (less specific)
69
+ * @param override - Override budget (more specific)
70
+ * @returns Merged budget
71
+ */
72
+ export declare const mergeBudgets: (base: Budget, override: Budget) => Budget;
73
+ /**
74
+ * Resolve the appropriate budget for a task
75
+ *
76
+ * Resolution order:
77
+ *
78
+ * 1. Check exact match in `exact` map (highest priority)
79
+ * 2. Find all matching patterns
80
+ * 3. Sort by specificity (ascending)
81
+ * 4. Merge matched budgets (more specific overrides less specific)
82
+ *
83
+ * @param taskId - The task identifier to resolve a budget for
84
+ * @param budgets - The resolved budgets structure
85
+ * @returns The resolved budget, or undefined if no budget matches
86
+ */
87
+ export declare const resolveBudget: (taskId: TaskId, budgets: ResolvedBudgets) => Budget | undefined;
88
+ /**
89
+ * Create a BudgetPattern from its components
90
+ *
91
+ * @param filePattern - Glob pattern for file matching
92
+ * @param suitePattern - Suite name or `*` for wildcard
93
+ * @param taskPattern - Task name or `*` for wildcard
94
+ * @param budget - The budget to apply
95
+ * @returns A BudgetPattern with computed specificity
96
+ */
97
+ export declare const createBudgetPattern: (filePattern: string, suitePattern: string, taskPattern: string, budget: Budget) => BudgetPattern;
98
+ //# sourceMappingURL=budget-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-resolver.d.ts","sourceRoot":"","sources":["../../src/services/budget-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,eAAe,EACf,MAAM,EACP,0BAAyB;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,OAE/C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,OAO/D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,OAEnE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,CAAC,KAC3E,MAwBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,KACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAU7C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MAmB7D,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,MAAM,EACd,SAAS,eAAe,KACvB,MAAM,GAAG,SAyDX,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,aAAa,MAAM,EACnB,QAAQ,MAAM,KACb,aAYF,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Budget resolution service for matching budgets to tasks
3
+ *
4
+ * This module provides pattern-based budget resolution using:
5
+ *
6
+ * - Minimatch glob patterns for file matching
7
+ * - Simple `*` wildcards for suite/task matching
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import type { Budget, BudgetPattern, ResolvedBudgets, TaskId } from "../types/core.js";
12
+ /**
13
+ * Check if a glob pattern contains wildcards
14
+ *
15
+ * @param pattern - The pattern to check
16
+ * @returns True if the pattern contains glob metacharacters
17
+ */
18
+ export declare const isGlobPattern: (pattern: string) => boolean;
19
+ /**
20
+ * Check if a file path matches a glob pattern
21
+ *
22
+ * @param pattern - Minimatch glob pattern
23
+ * @param filePath - File path to match against
24
+ * @returns True if the pattern matches the file path
25
+ */
26
+ export declare const matchesFile: (pattern: string, filePath: string) => boolean;
27
+ /**
28
+ * Check if a suite or task name matches a pattern
29
+ *
30
+ * @param pattern - Either an exact name or `*` for wildcard
31
+ * @param value - The value to match against
32
+ * @returns True if the pattern matches the value
33
+ */
34
+ export declare const matchesSuiteOrTask: (pattern: string, value: string) => boolean;
35
+ /**
36
+ * Calculate specificity score for a budget pattern
37
+ *
38
+ * Higher scores indicate more specific patterns. Scoring:
39
+ *
40
+ * - File: +2 for exact match, +1 for glob with specific parts, +0 for `**\/*`
41
+ * - Suite: +1 for exact match, +0 for `*`
42
+ * - Task: +1 for exact match, +0 for `*`
43
+ *
44
+ * @param pattern - The budget pattern to score
45
+ * @returns Specificity score (0-4)
46
+ */
47
+ export declare const calculateSpecificity: (pattern: Pick<BudgetPattern, "filePattern" | "suitePattern" | "taskPattern">) => number;
48
+ /**
49
+ * Parse a TaskId into its components
50
+ *
51
+ * TaskIds have the format: `{filePath}/{suiteName}/{taskName}` The file path
52
+ * can contain slashes, so we parse from the end.
53
+ *
54
+ * @param taskId - The TaskId to parse
55
+ * @returns Object with file, suite, and task components
56
+ */
57
+ export declare const parseTaskId: (taskId: TaskId) => {
58
+ file: string;
59
+ suite: string;
60
+ task: string;
61
+ };
62
+ /**
63
+ * Deep merge two budget objects
64
+ *
65
+ * More specific (second) budget values override less specific (first) values.
66
+ * Merges at the absolute/relative level.
67
+ *
68
+ * @param base - Base budget (less specific)
69
+ * @param override - Override budget (more specific)
70
+ * @returns Merged budget
71
+ */
72
+ export declare const mergeBudgets: (base: Budget, override: Budget) => Budget;
73
+ /**
74
+ * Resolve the appropriate budget for a task
75
+ *
76
+ * Resolution order:
77
+ *
78
+ * 1. Check exact match in `exact` map (highest priority)
79
+ * 2. Find all matching patterns
80
+ * 3. Sort by specificity (ascending)
81
+ * 4. Merge matched budgets (more specific overrides less specific)
82
+ *
83
+ * @param taskId - The task identifier to resolve a budget for
84
+ * @param budgets - The resolved budgets structure
85
+ * @returns The resolved budget, or undefined if no budget matches
86
+ */
87
+ export declare const resolveBudget: (taskId: TaskId, budgets: ResolvedBudgets) => Budget | undefined;
88
+ /**
89
+ * Create a BudgetPattern from its components
90
+ *
91
+ * @param filePattern - Glob pattern for file matching
92
+ * @param suitePattern - Suite name or `*` for wildcard
93
+ * @param taskPattern - Task name or `*` for wildcard
94
+ * @param budget - The budget to apply
95
+ * @returns A BudgetPattern with computed specificity
96
+ */
97
+ export declare const createBudgetPattern: (filePattern: string, suitePattern: string, taskPattern: string, budget: Budget) => BudgetPattern;
98
+ //# sourceMappingURL=budget-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget-resolver.d.ts","sourceRoot":"","sources":["../../src/services/budget-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,MAAM,EACN,aAAa,EACb,eAAe,EACf,MAAM,EACP,yBAAyB;AAE1B;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,KAAG,OAE/C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS,MAAM,EAAE,UAAU,MAAM,KAAG,OAO/D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,OAEnE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa,CAAC,KAC3E,MAwBF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GACtB,QAAQ,MAAM,KACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAU7C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,UAAU,MAAM,KAAG,MAmB7D,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,MAAM,EACd,SAAS,eAAe,KACvB,MAAM,GAAG,SAyDX,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,aAAa,MAAM,EACnB,QAAQ,MAAM,KACb,aAYF,CAAC"}