@codspeed/tinybench-plugin 5.6.0 → 5.7.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/dist/index.cjs +118 -59
- package/dist/index.cjs.map +1 -1
- package/dist/index.es5.js +119 -60
- package/dist/index.es5.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
var core = require('@codspeed/core');
|
|
4
4
|
|
|
5
|
+
const taskDataMap = /* @__PURE__ */ new WeakMap();
|
|
6
|
+
function getOrCreateTaskDataMap(bench) {
|
|
7
|
+
let map = taskDataMap.get(bench);
|
|
8
|
+
if (!map) {
|
|
9
|
+
map = /* @__PURE__ */ new Map();
|
|
10
|
+
taskDataMap.set(bench, map);
|
|
11
|
+
}
|
|
12
|
+
return map;
|
|
13
|
+
}
|
|
14
|
+
function getTaskData(bench, taskName) {
|
|
15
|
+
return taskDataMap.get(bench)?.get(taskName);
|
|
16
|
+
}
|
|
17
|
+
|
|
5
18
|
const taskUriMap = /* @__PURE__ */ new WeakMap();
|
|
6
19
|
function getTaskUri(bench, taskName, rootCallingFile) {
|
|
7
20
|
const uriMap = taskUriMap.get(bench);
|
|
@@ -35,12 +48,21 @@ class BaseBenchRunner {
|
|
|
35
48
|
}
|
|
36
49
|
logStart() {
|
|
37
50
|
console.log(
|
|
38
|
-
`[CodSpeed] running with @codspeed/tinybench v${"5.
|
|
51
|
+
`[CodSpeed] running with @codspeed/tinybench v${"5.7.0"} (${this.getModeName()})`
|
|
39
52
|
);
|
|
40
53
|
}
|
|
41
54
|
getTaskUri(task) {
|
|
42
55
|
return getTaskUri(this.bench, task.name, this.rootCallingFile);
|
|
43
56
|
}
|
|
57
|
+
getTaskData(task) {
|
|
58
|
+
const data = getTaskData(this.bench, task.name);
|
|
59
|
+
if (!data) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
`[CodSpeed] No captured function found for task "${task.name}"`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
44
66
|
logTaskCompletion(uri, status) {
|
|
45
67
|
console.log(`[CodSpeed] ${status} ${uri}`);
|
|
46
68
|
}
|
|
@@ -49,41 +71,6 @@ class BaseBenchRunner {
|
|
|
49
71
|
console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);
|
|
50
72
|
return this.bench.tasks;
|
|
51
73
|
}
|
|
52
|
-
wrapWithInstrumentHooks(fn, uri) {
|
|
53
|
-
core.InstrumentHooks.startBenchmark();
|
|
54
|
-
const runStart = core.InstrumentHooks.currentTimestamp();
|
|
55
|
-
try {
|
|
56
|
-
return fn();
|
|
57
|
-
} finally {
|
|
58
|
-
const runEnd = core.InstrumentHooks.currentTimestamp();
|
|
59
|
-
core.InstrumentHooks.stopBenchmark();
|
|
60
|
-
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
61
|
-
this.sendBenchmarkMarkers(runStart, runEnd);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
async wrapWithInstrumentHooksAsync(fn, uri) {
|
|
65
|
-
core.InstrumentHooks.startBenchmark();
|
|
66
|
-
const runStart = core.InstrumentHooks.currentTimestamp();
|
|
67
|
-
try {
|
|
68
|
-
return await fn();
|
|
69
|
-
} finally {
|
|
70
|
-
const runEnd = core.InstrumentHooks.currentTimestamp();
|
|
71
|
-
core.InstrumentHooks.stopBenchmark();
|
|
72
|
-
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
73
|
-
this.sendBenchmarkMarkers(runStart, runEnd);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
sendBenchmarkMarkers(runStart, runEnd) {
|
|
77
|
-
if (core.getInstrumentMode() !== "walltime") {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
core.InstrumentHooks.addMarker(
|
|
81
|
-
process.pid,
|
|
82
|
-
core.MARKER_TYPE_BENCHMARK_START,
|
|
83
|
-
runStart
|
|
84
|
-
);
|
|
85
|
-
core.InstrumentHooks.addMarker(process.pid, core.MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
86
|
-
}
|
|
87
74
|
setupBenchMethods() {
|
|
88
75
|
this.bench.run = async () => {
|
|
89
76
|
this.setupBenchRun();
|
|
@@ -117,7 +104,7 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
117
104
|
return core.InstrumentHooks.isInstrumented() ? "Measured" : "Checked";
|
|
118
105
|
}
|
|
119
106
|
async runTaskAsync(task, uri) {
|
|
120
|
-
const { fnOpts, fn } = task;
|
|
107
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
121
108
|
await fnOpts?.beforeAll?.call(task, "run");
|
|
122
109
|
await core.optimizeFunction(async () => {
|
|
123
110
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
@@ -127,17 +114,37 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
127
114
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
128
115
|
await core.mongoMeasurement.start(uri);
|
|
129
116
|
global.gc?.();
|
|
130
|
-
|
|
117
|
+
const rootFrame = core.wrapWithRootFrame(fn);
|
|
118
|
+
core.InstrumentHooks.startBenchmark();
|
|
119
|
+
try {
|
|
120
|
+
await rootFrame();
|
|
121
|
+
} finally {
|
|
122
|
+
core.InstrumentHooks.stopBenchmark();
|
|
123
|
+
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
124
|
+
}
|
|
131
125
|
await core.mongoMeasurement.stop(uri);
|
|
132
126
|
await fnOpts?.afterEach?.call(task, "run");
|
|
133
127
|
await fnOpts?.afterAll?.call(task, "run");
|
|
134
128
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
135
129
|
}
|
|
136
130
|
runTaskSync(task, uri) {
|
|
137
|
-
const { fnOpts, fn } = task;
|
|
131
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
138
132
|
fnOpts?.beforeAll?.call(task, "run");
|
|
133
|
+
core.optimizeFunctionSync(async () => {
|
|
134
|
+
fnOpts?.beforeEach?.call(task, "run");
|
|
135
|
+
await fn();
|
|
136
|
+
fnOpts?.afterEach?.call(task, "run");
|
|
137
|
+
});
|
|
139
138
|
fnOpts?.beforeEach?.call(task, "run");
|
|
140
|
-
|
|
139
|
+
global.gc?.();
|
|
140
|
+
const rootFrame = core.wrapWithRootFrameSync(fn);
|
|
141
|
+
core.InstrumentHooks.startBenchmark();
|
|
142
|
+
try {
|
|
143
|
+
rootFrame();
|
|
144
|
+
} finally {
|
|
145
|
+
core.InstrumentHooks.stopBenchmark();
|
|
146
|
+
core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
147
|
+
}
|
|
141
148
|
fnOpts?.afterEach?.call(task, "run");
|
|
142
149
|
fnOpts?.afterAll?.call(task, "run");
|
|
143
150
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
@@ -150,40 +157,92 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
150
157
|
}
|
|
151
158
|
}
|
|
152
159
|
|
|
160
|
+
function getBenchOptions(bench) {
|
|
161
|
+
const opts = bench.opts;
|
|
162
|
+
return opts ?? bench;
|
|
163
|
+
}
|
|
164
|
+
|
|
153
165
|
var __defProp = Object.defineProperty;
|
|
154
166
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
155
167
|
var __publicField = (obj, key, value) => {
|
|
156
|
-
__defNormalProp(obj, key + "" , value);
|
|
168
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
157
169
|
return value;
|
|
158
170
|
};
|
|
159
171
|
function setupCodspeedWalltimeBench(bench, rootCallingFile) {
|
|
160
172
|
const runner = new WalltimeBenchRunner(bench, rootCallingFile);
|
|
173
|
+
runner.installInstrumentHooks();
|
|
161
174
|
runner.setupBenchMethods();
|
|
162
175
|
}
|
|
163
176
|
class WalltimeBenchRunner extends BaseBenchRunner {
|
|
164
177
|
constructor() {
|
|
165
178
|
super(...arguments);
|
|
166
179
|
__publicField(this, "codspeedBenchmarks", []);
|
|
180
|
+
// Carries the window start timestamp from the setup hook to the teardown
|
|
181
|
+
// hook. Tasks run strictly sequentially, so a single field is enough.
|
|
182
|
+
__publicField(this, "runStart", null);
|
|
167
183
|
}
|
|
168
184
|
getModeName() {
|
|
169
185
|
return "walltime mode";
|
|
170
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Drive the instrumentation window from the task's setup/teardown hooks so it
|
|
189
|
+
* brackets only tinybench's measured loop, excluding warmup and the
|
|
190
|
+
* statistics computation (`processRunResult`) that surround it. The user's
|
|
191
|
+
* own hooks are preserved and still run in their original order relative to
|
|
192
|
+
* the work under test.
|
|
193
|
+
*/
|
|
194
|
+
installInstrumentHooks() {
|
|
195
|
+
const opts = getBenchOptions(this.bench);
|
|
196
|
+
opts.retainSamples = true;
|
|
197
|
+
const userSetup = opts.setup;
|
|
198
|
+
const userTeardown = opts.teardown;
|
|
199
|
+
opts.setup = (task, mode) => {
|
|
200
|
+
const setupResult = userSetup(task, mode);
|
|
201
|
+
if (mode === "run") {
|
|
202
|
+
core.InstrumentHooks.startBenchmark();
|
|
203
|
+
this.runStart = core.InstrumentHooks.currentTimestamp();
|
|
204
|
+
}
|
|
205
|
+
return setupResult;
|
|
206
|
+
};
|
|
207
|
+
opts.teardown = (task, mode) => {
|
|
208
|
+
if (mode === "run" && task) {
|
|
209
|
+
const runEnd = core.InstrumentHooks.currentTimestamp();
|
|
210
|
+
core.InstrumentHooks.stopBenchmark();
|
|
211
|
+
core.InstrumentHooks.setExecutedBenchmark(
|
|
212
|
+
process.pid,
|
|
213
|
+
this.getTaskUri(task)
|
|
214
|
+
);
|
|
215
|
+
if (this.runStart !== null) {
|
|
216
|
+
this.sendBenchmarkMarkers(this.runStart, runEnd);
|
|
217
|
+
}
|
|
218
|
+
this.runStart = null;
|
|
219
|
+
}
|
|
220
|
+
return userTeardown(task, mode);
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
sendBenchmarkMarkers(runStart, runEnd) {
|
|
224
|
+
core.InstrumentHooks.addMarker(
|
|
225
|
+
process.pid,
|
|
226
|
+
core.MARKER_TYPE_BENCHMARK_START,
|
|
227
|
+
runStart
|
|
228
|
+
);
|
|
229
|
+
core.InstrumentHooks.addMarker(process.pid, core.MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
230
|
+
}
|
|
171
231
|
async runTaskAsync(task, uri) {
|
|
172
|
-
this.
|
|
173
|
-
if (this.bench.opts.warmup) {
|
|
232
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
174
233
|
await task.warmup();
|
|
175
234
|
}
|
|
176
235
|
await core.mongoMeasurement.start(uri);
|
|
177
|
-
await
|
|
236
|
+
await task.run();
|
|
178
237
|
await core.mongoMeasurement.stop(uri);
|
|
179
238
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
180
239
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (this.bench.
|
|
184
|
-
task.
|
|
240
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
241
|
+
runTaskSync(task, _uri) {
|
|
242
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
243
|
+
task.warmupSync();
|
|
185
244
|
}
|
|
186
|
-
|
|
245
|
+
task.runSync();
|
|
187
246
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
188
247
|
}
|
|
189
248
|
finalizeAsyncRun() {
|
|
@@ -192,17 +251,14 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
192
251
|
finalizeSyncRun() {
|
|
193
252
|
return this.finalizeWalltimeRun(false);
|
|
194
253
|
}
|
|
195
|
-
wrapTaskFunction(task, isAsync) {
|
|
196
|
-
const { fn } = task;
|
|
197
|
-
task.fn = isAsync ? core.wrapWithRootFrame(fn) : core.wrapWithRootFrameSync(fn);
|
|
198
|
-
}
|
|
199
254
|
registerCodspeedBenchmarkFromTask(task) {
|
|
200
255
|
const uri = this.getTaskUri(task);
|
|
201
256
|
if (!task.result) {
|
|
202
257
|
console.warn(` \u26A0 No result data available for ${uri}`);
|
|
203
258
|
return;
|
|
204
259
|
}
|
|
205
|
-
const
|
|
260
|
+
const opts = getBenchOptions(this.bench);
|
|
261
|
+
const warmupIterations = opts.warmup ? opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT : 0;
|
|
206
262
|
const stats = convertTinybenchResultToBenchmarkStats(
|
|
207
263
|
task.result,
|
|
208
264
|
warmupIterations
|
|
@@ -211,11 +267,11 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
211
267
|
name: task.name,
|
|
212
268
|
uri,
|
|
213
269
|
config: {
|
|
214
|
-
max_rounds:
|
|
215
|
-
max_time_ns:
|
|
270
|
+
max_rounds: opts.iterations ?? null,
|
|
271
|
+
max_time_ns: opts.time ? core.msToNs(opts.time) : null,
|
|
216
272
|
min_round_time_ns: null,
|
|
217
273
|
// tinybench does not have an option for this
|
|
218
|
-
warmup_time_ns:
|
|
274
|
+
warmup_time_ns: opts.warmup && opts.warmupTime ? core.msToNs(opts.warmupTime) : null
|
|
219
275
|
},
|
|
220
276
|
stats
|
|
221
277
|
});
|
|
@@ -263,7 +319,9 @@ function withCodSpeed(bench) {
|
|
|
263
319
|
return bench;
|
|
264
320
|
}
|
|
265
321
|
const rootCallingFile = core.getCallingFile(1);
|
|
322
|
+
const instrumentMode = core.getInstrumentMode();
|
|
266
323
|
const uriMap = getOrCreateUriMap(bench);
|
|
324
|
+
const taskDataMap = getOrCreateTaskDataMap(bench);
|
|
267
325
|
const rawAdd = bench.add;
|
|
268
326
|
bench.add = (name, fn, opts) => {
|
|
269
327
|
const callingFile = core.getCallingFile(1);
|
|
@@ -273,9 +331,10 @@ function withCodSpeed(bench) {
|
|
|
273
331
|
}
|
|
274
332
|
uri += `::${name}`;
|
|
275
333
|
uriMap.set(name, uri);
|
|
276
|
-
|
|
334
|
+
taskDataMap.set(name, { fn, fnOpts: opts });
|
|
335
|
+
const registeredFn = instrumentMode === "walltime" ? core.wrapWithRootFrameSync(fn) : fn;
|
|
336
|
+
return rawAdd.bind(bench)(name, registeredFn, opts);
|
|
277
337
|
};
|
|
278
|
-
const instrumentMode = core.getInstrumentMode();
|
|
279
338
|
if (instrumentMode === "analysis") {
|
|
280
339
|
setupCodspeedAnalysisBench(bench, rootCallingFile);
|
|
281
340
|
} else if (instrumentMode === "walltime") {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import {\n getInstrumentMode,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n setupCore,\n teardownCore,\n} from \"@codspeed/core\";\nimport { Bench, Fn, Task } from \"tinybench\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(bench: Bench, rootCallingFile: string) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);\n return this.bench.tasks;\n }\n\n protected wrapWithInstrumentHooks<T>(fn: () => T, uri: string): T {\n InstrumentHooks.startBenchmark();\n const runStart = InstrumentHooks.currentTimestamp();\n try {\n return fn();\n } finally {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n this.sendBenchmarkMarkers(runStart, runEnd);\n }\n }\n\n protected async wrapWithInstrumentHooksAsync(\n fn: Fn,\n uri: string,\n ): Promise<unknown> {\n InstrumentHooks.startBenchmark();\n const runStart = InstrumentHooks.currentTimestamp();\n try {\n return await fn();\n } finally {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n this.sendBenchmarkMarkers(runStart, runEnd);\n }\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n if (getInstrumentMode() !== \"walltime\") {\n return;\n }\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Fn, FnOptions, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n await this.wrapWithInstrumentHooksAsync(wrapWithRootFrame(fn), uri);\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n fnOpts?.beforeAll?.call(task, \"run\");\n fnOpts?.beforeEach?.call(task, \"run\");\n\n this.wrapWithInstrumentHooks(wrapWithRootFrameSync(fn), uri);\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import {\n calculateQuantiles,\n mongoMeasurement,\n msToNs,\n msToS,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Fn, Task, TaskResult } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new WalltimeBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, true);\n\n // run the warmup of the task right before its actual run\n if (this.bench.opts.warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await this.wrapWithInstrumentHooksAsync(() => task.run(), uri);\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, false);\n\n if (this.bench.opts.warmup) {\n task.warmup();\n }\n\n this.wrapWithInstrumentHooks(() => task.runSync(), uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private wrapTaskFunction(task: Task, isAsync: boolean): void {\n const { fn } = task as unknown as { fn: Fn };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = isAsync\n ? wrapWithRootFrame(fn)\n : wrapWithRootFrameSync(fn);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n const uri = this.getTaskUri(task);\n\n if (!task.result) {\n console.warn(` ⚠ No result data available for ${uri}`);\n return;\n }\n\n const warmupIterations = this.bench.opts.warmup\n ? (this.bench.opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: this.bench.opts.iterations ?? null,\n max_time_ns: this.bench.opts.time ? msToNs(this.bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n this.bench.opts.warmup && this.bench.opts.warmupTime\n ? msToNs(this.bench.opts.warmupTime)\n : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: TaskResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n // Get individual sample times in nanoseconds and sort them\n const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n return rawAdd.bind(bench)(name, fn, opts);\n };\n\n const instrumentMode = getInstrumentMode();\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField","setupCore","teardownCore","InstrumentHooks","getInstrumentMode","MARKER_TYPE_BENCHMARK_START","MARKER_TYPE_BENCHMARK_END","getCodspeedRunnerMode","optimizeFunction","mongoMeasurement","wrapWithRootFrame","wrapWithRootFrameSync","msToNs","writeWalltimeResults","calculateQuantiles","msToS","tryIntrospect","getCallingFile"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/taskData.ts","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/benchOptions.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench, Fn, FnOptions } from \"tinybench\";\n\n// tinybench stores the benchmark function and its options as private fields on\n// `Task`. They were reachable through casts on older majors but became true\n// `#private` fields in v6, so we capture them ourselves when `bench.add` runs\n// and key them by task name, mirroring the URI map.\nexport interface CapturedTaskData {\n fn: Fn;\n fnOpts?: FnOptions;\n}\n\nconst taskDataMap = new WeakMap<Bench, Map<string, CapturedTaskData>>();\n\nexport function getOrCreateTaskDataMap(\n bench: Bench,\n): Map<string, CapturedTaskData> {\n let map = taskDataMap.get(bench);\n if (!map) {\n map = new Map<string, CapturedTaskData>();\n taskDataMap.set(bench, map);\n }\n return map;\n}\n\nexport function getTaskData(\n bench: Bench,\n taskName: string,\n): CapturedTaskData | undefined {\n return taskDataMap.get(bench)?.get(taskName);\n}\n","import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import { setupCore, teardownCore } from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { CapturedTaskData, getTaskData } from \"./taskData\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(bench: Bench, rootCallingFile: string) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected getTaskData(task: Task): CapturedTaskData {\n const data = getTaskData(this.bench, task.name);\n if (!data) {\n throw new Error(\n `[CodSpeed] No captured function found for task \"${task.name}\"`,\n );\n }\n return data;\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);\n return this.bench.tasks;\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n optimizeFunctionSync,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = this.getTaskData(task);\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n const rootFrame = wrapWithRootFrame(fn);\n InstrumentHooks.startBenchmark();\n try {\n await rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = this.getTaskData(task);\n\n fnOpts?.beforeAll?.call(task, \"run\");\n\n optimizeFunctionSync(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n fnOpts?.beforeEach?.call(task, \"run\");\n\n global.gc?.();\n const rootFrame = wrapWithRootFrameSync(fn);\n InstrumentHooks.startBenchmark();\n try {\n rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import { Bench, Hook } from \"tinybench\";\n\n// The benchmark options tinybench resolves: timing knobs plus the suite-level\n// setup/teardown hooks. tinybench guarantees `setup`/`teardown` are populated\n// (at least with no-op defaults), so they are non-optional here.\nexport interface ResolvedBenchOptions {\n setup: Hook;\n teardown: Hook;\n warmup?: boolean;\n warmupIterations?: number;\n warmupTime?: number;\n iterations?: number;\n time?: number;\n retainSamples?: boolean;\n}\n\n// Up to tinybench v5 the resolved options lived under `bench.opts`; from v6 they\n// are flattened onto the bench instance itself. Returning the holder object\n// (rather than a copy) keeps in-place mutation of `setup`/`teardown` working,\n// which the walltime runner relies on to bracket its instrumentation window.\nexport function getBenchOptions(bench: Bench): ResolvedBenchOptions {\n const opts = (bench as unknown as { opts?: ResolvedBenchOptions }).opts;\n return opts ?? (bench as unknown as ResolvedBenchOptions);\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Task, TaskResult } from \"tinybench\";\nimport { getBenchOptions } from \"./benchOptions\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new WalltimeBenchRunner(bench, rootCallingFile);\n runner.installInstrumentHooks();\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n // Carries the window start timestamp from the setup hook to the teardown\n // hook. Tasks run strictly sequentially, so a single field is enough.\n private runStart: bigint | null = null;\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n /**\n * Drive the instrumentation window from the task's setup/teardown hooks so it\n * brackets only tinybench's measured loop, excluding warmup and the\n * statistics computation (`processRunResult`) that surround it. The user's\n * own hooks are preserved and still run in their original order relative to\n * the work under test.\n */\n public installInstrumentHooks(): void {\n // The resolved options expose `setup`/`teardown` as typed `Readonly`, but\n // tinybench populates them with (at least) no-op defaults and lets them be\n // reassigned at runtime.\n const opts = getBenchOptions(this.bench);\n\n // We build the walltime statistics from the per-round latency samples.\n // tinybench stopped retaining them by default in v6, so opt back in.\n opts.retainSamples = true;\n\n const userSetup = opts.setup;\n const userTeardown = opts.teardown;\n\n opts.setup = (task, mode) => {\n const setupResult = userSetup(task, mode);\n if (mode === \"run\") {\n InstrumentHooks.startBenchmark();\n this.runStart = InstrumentHooks.currentTimestamp();\n }\n return setupResult;\n };\n\n opts.teardown = (task, mode) => {\n if (mode === \"run\" && task) {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(\n process.pid,\n this.getTaskUri(task),\n );\n if (this.runStart !== null) {\n this.sendBenchmarkMarkers(this.runStart, runEnd);\n }\n\n this.runStart = null;\n }\n return userTeardown(task, mode);\n };\n }\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // run the warmup of the task right before its actual run\n if (getBenchOptions(this.bench).warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await task.run();\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected runTaskSync(task: Task, _uri: string): void {\n if (getBenchOptions(this.bench).warmup) {\n task.warmupSync();\n }\n\n task.runSync();\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n const uri = this.getTaskUri(task);\n\n if (!task.result) {\n console.warn(` ⚠ No result data available for ${uri}`);\n return;\n }\n\n const opts = getBenchOptions(this.bench);\n const warmupIterations = opts.warmup\n ? (opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: opts.iterations ?? null,\n max_time_ns: opts.time ? msToNs(opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: TaskResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n // Get individual sample times in nanoseconds and sort them\n const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateTaskDataMap } from \"./taskData\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n const instrumentMode = getInstrumentMode();\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const taskDataMap = getOrCreateTaskDataMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n taskDataMap.set(name, { fn, fnOpts: opts });\n // In walltime mode the task is driven by tinybench's own measured loop, so\n // the root frame must be baked into the function tinybench stores rather\n // than injected later (the function is an inaccessible private field on the\n // task from tinybench v6 onwards). The sync wrapper is transparent to the\n // function's return value, so it preserves tinybench's sync/async handling.\n const registeredFn =\n instrumentMode === \"walltime\" ? wrapWithRootFrameSync(fn) : fn;\n return rawAdd.bind(bench)(name, registeredFn, opts);\n };\n\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField","setupCore","teardownCore","getCodspeedRunnerMode","InstrumentHooks","optimizeFunction","mongoMeasurement","wrapWithRootFrame","optimizeFunctionSync","wrapWithRootFrameSync","MARKER_TYPE_BENCHMARK_START","MARKER_TYPE_BENCHMARK_END","msToNs","writeWalltimeResults","calculateQuantiles","msToS","tryIntrospect","getCallingFile","getInstrumentMode"],"mappings":"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"}
|
package/dist/index.es5.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
-
import { setupCore, teardownCore,
|
|
1
|
+
import { setupCore, teardownCore, getCodspeedRunnerMode, InstrumentHooks, optimizeFunction, mongoMeasurement, wrapWithRootFrame, optimizeFunctionSync, wrapWithRootFrameSync, MARKER_TYPE_BENCHMARK_START, MARKER_TYPE_BENCHMARK_END, msToNs, writeWalltimeResults, calculateQuantiles, msToS, tryIntrospect, getCallingFile, getInstrumentMode } from '@codspeed/core';
|
|
2
|
+
|
|
3
|
+
const taskDataMap = /* @__PURE__ */ new WeakMap();
|
|
4
|
+
function getOrCreateTaskDataMap(bench) {
|
|
5
|
+
let map = taskDataMap.get(bench);
|
|
6
|
+
if (!map) {
|
|
7
|
+
map = /* @__PURE__ */ new Map();
|
|
8
|
+
taskDataMap.set(bench, map);
|
|
9
|
+
}
|
|
10
|
+
return map;
|
|
11
|
+
}
|
|
12
|
+
function getTaskData(bench, taskName) {
|
|
13
|
+
return taskDataMap.get(bench)?.get(taskName);
|
|
14
|
+
}
|
|
2
15
|
|
|
3
16
|
const taskUriMap = /* @__PURE__ */ new WeakMap();
|
|
4
17
|
function getTaskUri(bench, taskName, rootCallingFile) {
|
|
@@ -33,12 +46,21 @@ class BaseBenchRunner {
|
|
|
33
46
|
}
|
|
34
47
|
logStart() {
|
|
35
48
|
console.log(
|
|
36
|
-
`[CodSpeed] running with @codspeed/tinybench v${"5.
|
|
49
|
+
`[CodSpeed] running with @codspeed/tinybench v${"5.7.0"} (${this.getModeName()})`
|
|
37
50
|
);
|
|
38
51
|
}
|
|
39
52
|
getTaskUri(task) {
|
|
40
53
|
return getTaskUri(this.bench, task.name, this.rootCallingFile);
|
|
41
54
|
}
|
|
55
|
+
getTaskData(task) {
|
|
56
|
+
const data = getTaskData(this.bench, task.name);
|
|
57
|
+
if (!data) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`[CodSpeed] No captured function found for task "${task.name}"`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return data;
|
|
63
|
+
}
|
|
42
64
|
logTaskCompletion(uri, status) {
|
|
43
65
|
console.log(`[CodSpeed] ${status} ${uri}`);
|
|
44
66
|
}
|
|
@@ -47,41 +69,6 @@ class BaseBenchRunner {
|
|
|
47
69
|
console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);
|
|
48
70
|
return this.bench.tasks;
|
|
49
71
|
}
|
|
50
|
-
wrapWithInstrumentHooks(fn, uri) {
|
|
51
|
-
InstrumentHooks.startBenchmark();
|
|
52
|
-
const runStart = InstrumentHooks.currentTimestamp();
|
|
53
|
-
try {
|
|
54
|
-
return fn();
|
|
55
|
-
} finally {
|
|
56
|
-
const runEnd = InstrumentHooks.currentTimestamp();
|
|
57
|
-
InstrumentHooks.stopBenchmark();
|
|
58
|
-
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
59
|
-
this.sendBenchmarkMarkers(runStart, runEnd);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async wrapWithInstrumentHooksAsync(fn, uri) {
|
|
63
|
-
InstrumentHooks.startBenchmark();
|
|
64
|
-
const runStart = InstrumentHooks.currentTimestamp();
|
|
65
|
-
try {
|
|
66
|
-
return await fn();
|
|
67
|
-
} finally {
|
|
68
|
-
const runEnd = InstrumentHooks.currentTimestamp();
|
|
69
|
-
InstrumentHooks.stopBenchmark();
|
|
70
|
-
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
71
|
-
this.sendBenchmarkMarkers(runStart, runEnd);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
sendBenchmarkMarkers(runStart, runEnd) {
|
|
75
|
-
if (getInstrumentMode() !== "walltime") {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
InstrumentHooks.addMarker(
|
|
79
|
-
process.pid,
|
|
80
|
-
MARKER_TYPE_BENCHMARK_START,
|
|
81
|
-
runStart
|
|
82
|
-
);
|
|
83
|
-
InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
84
|
-
}
|
|
85
72
|
setupBenchMethods() {
|
|
86
73
|
this.bench.run = async () => {
|
|
87
74
|
this.setupBenchRun();
|
|
@@ -115,7 +102,7 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
115
102
|
return InstrumentHooks.isInstrumented() ? "Measured" : "Checked";
|
|
116
103
|
}
|
|
117
104
|
async runTaskAsync(task, uri) {
|
|
118
|
-
const { fnOpts, fn } = task;
|
|
105
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
119
106
|
await fnOpts?.beforeAll?.call(task, "run");
|
|
120
107
|
await optimizeFunction(async () => {
|
|
121
108
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
@@ -125,17 +112,37 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
125
112
|
await fnOpts?.beforeEach?.call(task, "run");
|
|
126
113
|
await mongoMeasurement.start(uri);
|
|
127
114
|
global.gc?.();
|
|
128
|
-
|
|
115
|
+
const rootFrame = wrapWithRootFrame(fn);
|
|
116
|
+
InstrumentHooks.startBenchmark();
|
|
117
|
+
try {
|
|
118
|
+
await rootFrame();
|
|
119
|
+
} finally {
|
|
120
|
+
InstrumentHooks.stopBenchmark();
|
|
121
|
+
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
122
|
+
}
|
|
129
123
|
await mongoMeasurement.stop(uri);
|
|
130
124
|
await fnOpts?.afterEach?.call(task, "run");
|
|
131
125
|
await fnOpts?.afterAll?.call(task, "run");
|
|
132
126
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
133
127
|
}
|
|
134
128
|
runTaskSync(task, uri) {
|
|
135
|
-
const { fnOpts, fn } = task;
|
|
129
|
+
const { fnOpts, fn } = this.getTaskData(task);
|
|
136
130
|
fnOpts?.beforeAll?.call(task, "run");
|
|
131
|
+
optimizeFunctionSync(async () => {
|
|
132
|
+
fnOpts?.beforeEach?.call(task, "run");
|
|
133
|
+
await fn();
|
|
134
|
+
fnOpts?.afterEach?.call(task, "run");
|
|
135
|
+
});
|
|
137
136
|
fnOpts?.beforeEach?.call(task, "run");
|
|
138
|
-
|
|
137
|
+
global.gc?.();
|
|
138
|
+
const rootFrame = wrapWithRootFrameSync(fn);
|
|
139
|
+
InstrumentHooks.startBenchmark();
|
|
140
|
+
try {
|
|
141
|
+
rootFrame();
|
|
142
|
+
} finally {
|
|
143
|
+
InstrumentHooks.stopBenchmark();
|
|
144
|
+
InstrumentHooks.setExecutedBenchmark(process.pid, uri);
|
|
145
|
+
}
|
|
139
146
|
fnOpts?.afterEach?.call(task, "run");
|
|
140
147
|
fnOpts?.afterAll?.call(task, "run");
|
|
141
148
|
this.logTaskCompletion(uri, this.taskCompletionMessage());
|
|
@@ -148,40 +155,92 @@ class AnalysisBenchRunner extends BaseBenchRunner {
|
|
|
148
155
|
}
|
|
149
156
|
}
|
|
150
157
|
|
|
158
|
+
function getBenchOptions(bench) {
|
|
159
|
+
const opts = bench.opts;
|
|
160
|
+
return opts ?? bench;
|
|
161
|
+
}
|
|
162
|
+
|
|
151
163
|
var __defProp = Object.defineProperty;
|
|
152
164
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
153
165
|
var __publicField = (obj, key, value) => {
|
|
154
|
-
__defNormalProp(obj, key + "" , value);
|
|
166
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
155
167
|
return value;
|
|
156
168
|
};
|
|
157
169
|
function setupCodspeedWalltimeBench(bench, rootCallingFile) {
|
|
158
170
|
const runner = new WalltimeBenchRunner(bench, rootCallingFile);
|
|
171
|
+
runner.installInstrumentHooks();
|
|
159
172
|
runner.setupBenchMethods();
|
|
160
173
|
}
|
|
161
174
|
class WalltimeBenchRunner extends BaseBenchRunner {
|
|
162
175
|
constructor() {
|
|
163
176
|
super(...arguments);
|
|
164
177
|
__publicField(this, "codspeedBenchmarks", []);
|
|
178
|
+
// Carries the window start timestamp from the setup hook to the teardown
|
|
179
|
+
// hook. Tasks run strictly sequentially, so a single field is enough.
|
|
180
|
+
__publicField(this, "runStart", null);
|
|
165
181
|
}
|
|
166
182
|
getModeName() {
|
|
167
183
|
return "walltime mode";
|
|
168
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Drive the instrumentation window from the task's setup/teardown hooks so it
|
|
187
|
+
* brackets only tinybench's measured loop, excluding warmup and the
|
|
188
|
+
* statistics computation (`processRunResult`) that surround it. The user's
|
|
189
|
+
* own hooks are preserved and still run in their original order relative to
|
|
190
|
+
* the work under test.
|
|
191
|
+
*/
|
|
192
|
+
installInstrumentHooks() {
|
|
193
|
+
const opts = getBenchOptions(this.bench);
|
|
194
|
+
opts.retainSamples = true;
|
|
195
|
+
const userSetup = opts.setup;
|
|
196
|
+
const userTeardown = opts.teardown;
|
|
197
|
+
opts.setup = (task, mode) => {
|
|
198
|
+
const setupResult = userSetup(task, mode);
|
|
199
|
+
if (mode === "run") {
|
|
200
|
+
InstrumentHooks.startBenchmark();
|
|
201
|
+
this.runStart = InstrumentHooks.currentTimestamp();
|
|
202
|
+
}
|
|
203
|
+
return setupResult;
|
|
204
|
+
};
|
|
205
|
+
opts.teardown = (task, mode) => {
|
|
206
|
+
if (mode === "run" && task) {
|
|
207
|
+
const runEnd = InstrumentHooks.currentTimestamp();
|
|
208
|
+
InstrumentHooks.stopBenchmark();
|
|
209
|
+
InstrumentHooks.setExecutedBenchmark(
|
|
210
|
+
process.pid,
|
|
211
|
+
this.getTaskUri(task)
|
|
212
|
+
);
|
|
213
|
+
if (this.runStart !== null) {
|
|
214
|
+
this.sendBenchmarkMarkers(this.runStart, runEnd);
|
|
215
|
+
}
|
|
216
|
+
this.runStart = null;
|
|
217
|
+
}
|
|
218
|
+
return userTeardown(task, mode);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
sendBenchmarkMarkers(runStart, runEnd) {
|
|
222
|
+
InstrumentHooks.addMarker(
|
|
223
|
+
process.pid,
|
|
224
|
+
MARKER_TYPE_BENCHMARK_START,
|
|
225
|
+
runStart
|
|
226
|
+
);
|
|
227
|
+
InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);
|
|
228
|
+
}
|
|
169
229
|
async runTaskAsync(task, uri) {
|
|
170
|
-
this.
|
|
171
|
-
if (this.bench.opts.warmup) {
|
|
230
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
172
231
|
await task.warmup();
|
|
173
232
|
}
|
|
174
233
|
await mongoMeasurement.start(uri);
|
|
175
|
-
await
|
|
234
|
+
await task.run();
|
|
176
235
|
await mongoMeasurement.stop(uri);
|
|
177
236
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
178
237
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
if (this.bench.
|
|
182
|
-
task.
|
|
238
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
239
|
+
runTaskSync(task, _uri) {
|
|
240
|
+
if (getBenchOptions(this.bench).warmup) {
|
|
241
|
+
task.warmupSync();
|
|
183
242
|
}
|
|
184
|
-
|
|
243
|
+
task.runSync();
|
|
185
244
|
this.registerCodspeedBenchmarkFromTask(task);
|
|
186
245
|
}
|
|
187
246
|
finalizeAsyncRun() {
|
|
@@ -190,17 +249,14 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
190
249
|
finalizeSyncRun() {
|
|
191
250
|
return this.finalizeWalltimeRun(false);
|
|
192
251
|
}
|
|
193
|
-
wrapTaskFunction(task, isAsync) {
|
|
194
|
-
const { fn } = task;
|
|
195
|
-
task.fn = isAsync ? wrapWithRootFrame(fn) : wrapWithRootFrameSync(fn);
|
|
196
|
-
}
|
|
197
252
|
registerCodspeedBenchmarkFromTask(task) {
|
|
198
253
|
const uri = this.getTaskUri(task);
|
|
199
254
|
if (!task.result) {
|
|
200
255
|
console.warn(` \u26A0 No result data available for ${uri}`);
|
|
201
256
|
return;
|
|
202
257
|
}
|
|
203
|
-
const
|
|
258
|
+
const opts = getBenchOptions(this.bench);
|
|
259
|
+
const warmupIterations = opts.warmup ? opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT : 0;
|
|
204
260
|
const stats = convertTinybenchResultToBenchmarkStats(
|
|
205
261
|
task.result,
|
|
206
262
|
warmupIterations
|
|
@@ -209,11 +265,11 @@ class WalltimeBenchRunner extends BaseBenchRunner {
|
|
|
209
265
|
name: task.name,
|
|
210
266
|
uri,
|
|
211
267
|
config: {
|
|
212
|
-
max_rounds:
|
|
213
|
-
max_time_ns:
|
|
268
|
+
max_rounds: opts.iterations ?? null,
|
|
269
|
+
max_time_ns: opts.time ? msToNs(opts.time) : null,
|
|
214
270
|
min_round_time_ns: null,
|
|
215
271
|
// tinybench does not have an option for this
|
|
216
|
-
warmup_time_ns:
|
|
272
|
+
warmup_time_ns: opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null
|
|
217
273
|
},
|
|
218
274
|
stats
|
|
219
275
|
});
|
|
@@ -261,7 +317,9 @@ function withCodSpeed(bench) {
|
|
|
261
317
|
return bench;
|
|
262
318
|
}
|
|
263
319
|
const rootCallingFile = getCallingFile(1);
|
|
320
|
+
const instrumentMode = getInstrumentMode();
|
|
264
321
|
const uriMap = getOrCreateUriMap(bench);
|
|
322
|
+
const taskDataMap = getOrCreateTaskDataMap(bench);
|
|
265
323
|
const rawAdd = bench.add;
|
|
266
324
|
bench.add = (name, fn, opts) => {
|
|
267
325
|
const callingFile = getCallingFile(1);
|
|
@@ -271,9 +329,10 @@ function withCodSpeed(bench) {
|
|
|
271
329
|
}
|
|
272
330
|
uri += `::${name}`;
|
|
273
331
|
uriMap.set(name, uri);
|
|
274
|
-
|
|
332
|
+
taskDataMap.set(name, { fn, fnOpts: opts });
|
|
333
|
+
const registeredFn = instrumentMode === "walltime" ? wrapWithRootFrameSync(fn) : fn;
|
|
334
|
+
return rawAdd.bind(bench)(name, registeredFn, opts);
|
|
275
335
|
};
|
|
276
|
-
const instrumentMode = getInstrumentMode();
|
|
277
336
|
if (instrumentMode === "analysis") {
|
|
278
337
|
setupCodspeedAnalysisBench(bench, rootCallingFile);
|
|
279
338
|
} else if (instrumentMode === "walltime") {
|
package/dist/index.es5.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es5.js","sources":["../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import {\n getInstrumentMode,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n setupCore,\n teardownCore,\n} from \"@codspeed/core\";\nimport { Bench, Fn, Task } from \"tinybench\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(bench: Bench, rootCallingFile: string) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);\n return this.bench.tasks;\n }\n\n protected wrapWithInstrumentHooks<T>(fn: () => T, uri: string): T {\n InstrumentHooks.startBenchmark();\n const runStart = InstrumentHooks.currentTimestamp();\n try {\n return fn();\n } finally {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n this.sendBenchmarkMarkers(runStart, runEnd);\n }\n }\n\n protected async wrapWithInstrumentHooksAsync(\n fn: Fn,\n uri: string,\n ): Promise<unknown> {\n InstrumentHooks.startBenchmark();\n const runStart = InstrumentHooks.currentTimestamp();\n try {\n return await fn();\n } finally {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n this.sendBenchmarkMarkers(runStart, runEnd);\n }\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n if (getInstrumentMode() !== \"walltime\") {\n return;\n }\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Fn, FnOptions, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n await this.wrapWithInstrumentHooksAsync(wrapWithRootFrame(fn), uri);\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n fnOpts?.beforeAll?.call(task, \"run\");\n fnOpts?.beforeEach?.call(task, \"run\");\n\n this.wrapWithInstrumentHooks(wrapWithRootFrameSync(fn), uri);\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import {\n calculateQuantiles,\n mongoMeasurement,\n msToNs,\n msToS,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Fn, Task, TaskResult } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new WalltimeBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, true);\n\n // run the warmup of the task right before its actual run\n if (this.bench.opts.warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await this.wrapWithInstrumentHooksAsync(() => task.run(), uri);\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n // Override the function under test to add a static frame\n this.wrapTaskFunction(task, false);\n\n if (this.bench.opts.warmup) {\n task.warmup();\n }\n\n this.wrapWithInstrumentHooks(() => task.runSync(), uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private wrapTaskFunction(task: Task, isAsync: boolean): void {\n const { fn } = task as unknown as { fn: Fn };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = isAsync\n ? wrapWithRootFrame(fn)\n : wrapWithRootFrameSync(fn);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n const uri = this.getTaskUri(task);\n\n if (!task.result) {\n console.warn(` ⚠ No result data available for ${uri}`);\n return;\n }\n\n const warmupIterations = this.bench.opts.warmup\n ? (this.bench.opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: this.bench.opts.iterations ?? null,\n max_time_ns: this.bench.opts.time ? msToNs(this.bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n this.bench.opts.warmup && this.bench.opts.warmupTime\n ? msToNs(this.bench.opts.warmupTime)\n : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: TaskResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n // Get individual sample times in nanoseconds and sort them\n const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n return rawAdd.bind(bench)(name, fn, opts);\n };\n\n const instrumentMode = getInstrumentMode();\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField"],"mappings":";;AAGO,MAAM,UAAA,uBAAiB,OAAA,EAAoC;AAE3D,SAAS,UAAA,CACd,KAAA,EACA,QAAA,EACA,eAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACnC,EAAA,OAAO,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAG,eAAA,CAAA,EAAA,EAAoB,QAAA,CAAA,CAAA;AACzD;AAEO,SAAS,kBAAkB,KAAA,EAAmC;AACnE,EAAA,IAAI,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,uBAAa,GAAA,EAAoB;AACjC,IAAA,UAAA,CAAW,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;;;;;;;;ACRO,MAAe,eAAA,CAAgB;AAAA,EAIpC,WAAA,CAAY,OAAc,eAAA,EAAyB;AAHnD,IAAAA,eAAA,CAAA,IAAA,EAAU,OAAA,CAAA;AACV,IAAAA,eAAA,CAAA,IAAA,EAAU,iBAAA,CAAA;AAGR,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,SAAA,EAAU;AACV,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,OAAA,CAAA,EAAA,EAAgB,IAAA,CAAK,WAAA,EAAY,CAAA,CAAA;AAAA,KACnF;AAAA,EACF;AAAA,EAEU,WAAW,IAAA,EAAoB;AACvC,IAAA,OAAO,WAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAK,eAAe,CAAA;AAAA,EAC/D;AAAA,EAEU,iBAAA,CAAkB,KAAa,MAAA,EAAsB;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAA,CAAA,EAAU,GAAA,CAAA,CAAK,CAAA;AAAA,EAC3C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,IAAA,CAAK,KAAA,CAAM,MAAM,MAAA,CAAA,SAAA,CAAiB,CAAA;AACzE,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AAAA,EAEU,uBAAA,CAA2B,IAAa,GAAA,EAAgB;AAChE,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,MAAM,QAAA,GAAW,gBAAgB,gBAAA,EAAiB;AAClD,IAAA,IAAI;AACF,MAAA,OAAO,EAAA,EAAG;AAAA,IACZ,CAAA,SAAE;AACA,MAAA,MAAM,MAAA,GAAS,gBAAgB,gBAAA,EAAiB;AAChD,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACrD,MAAA,IAAA,CAAK,oBAAA,CAAqB,UAAU,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,MAAgB,4BAAA,CACd,EAAA,EACA,GAAA,EACkB;AAClB,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,MAAM,QAAA,GAAW,gBAAgB,gBAAA,EAAiB;AAClD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,MAAM,MAAA,GAAS,gBAAgB,gBAAA,EAAiB;AAChD,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AACrD,MAAA,IAAA,CAAK,oBAAA,CAAqB,UAAU,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF;AAAA,EAQQ,oBAAA,CAAqB,UAAkB,MAAA,EAAsB;AACnE,IAAA,IAAI,iBAAA,OAAwB,UAAA,EAAY;AACtC,MAAA;AAAA,IACF;AACA,IAAA,eAAA,CAAgB,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA;AAAA,MACR,2BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,eAAA,CAAgB,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,yBAAA,EAA2B,MAAM,CAAA;AAAA,EAC1E;AAAA,EAEO,iBAAA,GAA0B;AAC/B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,YAAY;AAC3B,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA;AAAA,MACnC;AAEA,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM;AACzB,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,IAAA,CAAK,WAAA,CAAY,MAAM,GAAG,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,IAC9B,CAAA;AAAA,EACF;AACF;;AC1GO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EACtC,WAAA,GAAsB;AAC9B,IAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,IAAA,OAAO,CAAA,EAAG,UAAA,CAAA,KAAA,CAAA;AAAA,EACZ;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,OAAO,eAAA,CAAgB,cAAA,EAAe,GAAI,UAAA,GAAa,SAAA;AAAA,EACzD;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AACnE,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA;AAEvB,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAEhC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,IAAA,CAAK,4BAAA,CAA6B,iBAAA,CAAkB,EAAE,GAAG,GAAG,CAAA;AAElE,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAExC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,WAAA,CAAY,MAAY,GAAA,EAAmB;AACnD,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA;AAEvB,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEpC,IAAA,IAAA,CAAK,uBAAA,CAAwB,qBAAA,CAAsB,EAAE,CAAA,EAAG,GAAG,CAAA;AAE3D,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAElC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AACF;;;;;;;;AC1DO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EAAlD,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAA0C,EAAC,CAAA;AAAA,EAAA;AAAA,EAEzC,WAAA,GAAsB;AAC9B,IAAA,OAAO,eAAA;AAAA,EACT;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AAEnE,IAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAGhC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ;AAC1B,MAAA,MAAM,KAAK,MAAA,EAAO;AAAA,IACpB;AAEA,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAChC,IAAA,MAAM,KAAK,4BAAA,CAA6B,MAAM,IAAA,CAAK,GAAA,IAAO,GAAG,CAAA;AAC7D,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAE/B,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEU,WAAA,CAAY,MAAY,GAAA,EAAmB;AAEnD,IAAA,IAAA,CAAK,gBAAA,CAAiB,MAAM,KAAK,CAAA;AAEjC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,uBAAA,CAAwB,MAAM,IAAA,CAAK,OAAA,IAAW,GAAG,CAAA;AAEtD,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EACtC;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,gBAAA,CAAiB,MAAY,OAAA,EAAwB;AAC3D,IAAA,MAAM,EAAE,IAAG,GAAI,IAAA;AAEf,IAAC,KAAa,EAAA,GAAK,OAAA,GACf,kBAAkB,EAAE,CAAA,GACpB,sBAAsB,EAAE,CAAA;AAAA,EAC9B;AAAA,EAEQ,kCAAkC,IAAA,EAAkB;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,2CAAsC,GAAA,CAAA,CAAK,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,KAAK,KAAA,CAAM,IAAA,CAAK,SACpC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,gBAAA,IAAoB,wBAAA,GACrC,CAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,sCAAA;AAAA,MACZ,IAAA,CAAK,MAAA;AAAA,MACL;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK;AAAA,MAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,IAAc,IAAA;AAAA,QAC1C,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,GAAO,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,QACnE,iBAAA,EAAmB,IAAA;AAAA;AAAA,QACnB,cAAA,EACE,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,GACtC,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,GACjC;AAAA,OACR;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,6BAA6B,CAAA;AAAA,EAC3D;AAAA,EAEQ,oBAAoB,OAAA,EAA0B;AAEpD,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,oBAAA,CAAqB,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAA,SAAA;AAAA,KACnE;AACA,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AACF;AAEA,MAAM,wBAAA,GAA2B,EAAA;AAEjC,SAAS,sCAAA,CACP,QACA,gBAAA,EACgB;AAChB,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM,EAAA,EAAI,OAAA,KAAY,MAAA,CAAO,OAAA;AAG/C,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,EAAE,CAAA;AAEzB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,kBAAA,EAAoB,oBAAA,EAAqB,GACxE,kBAAA,CAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IAClC,cAAA,EAAgB,CAAA;AAAA;AAAA,IAChB,QAAQ,aAAA,CAAc,MAAA;AAAA,IACtB,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA,EAAc;AAAA,GAChB;AACF;;ACzIA,aAAA,EAAc;AAEP,SAAS,aAAa,KAAA,EAAqB;AAChD,EAAA,MAAM,qBAAqB,qBAAA,EAAsB;AACjD,EAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,eAAe,CAAC,CAAA;AAGxC,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA;AACrB,EAAA,KAAA,CAAM,GAAA,GAAM,CAAC,IAAA,EAAM,EAAA,EAAI,IAAA,KAAU;AAC/B,IAAA,MAAM,WAAA,GAAc,eAAe,CAAC,CAAA;AACpC,IAAA,IAAI,GAAA,GAAM,WAAA;AACV,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,GAAA,IAAO,KAAK,KAAA,CAAM,IAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,GAAA,IAAO,CAAA,EAAA,EAAK,IAAA,CAAA,CAAA;AACZ,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AACpB,IAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,EAAM,IAAI,IAAI,CAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,MAAM,iBAAiB,iBAAA,EAAkB;AACzC,EAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AACxC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,iBACpB,IAAA,EACmC;AACnC,EAAA,IAAI,CAAC,eAAA,CAAgB,cAAA,EAAe,EAAG;AACrC,IAAA,OAAA,CAAQ,KAAK,6DAA6D,CAAA;AAE1E,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,QAAA,EAAS;AAAA,EACrC;AAEA,EAAA,OAAO,MAAM,gBAAA,CAAiB,gBAAA,CAAiB,IAAI,CAAA;AACrD;;;;"}
|
|
1
|
+
{"version":3,"file":"index.es5.js","sources":["../src/taskData.ts","../src/uri.ts","../src/shared.ts","../src/analysis.ts","../src/benchOptions.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["import { Bench, Fn, FnOptions } from \"tinybench\";\n\n// tinybench stores the benchmark function and its options as private fields on\n// `Task`. They were reachable through casts on older majors but became true\n// `#private` fields in v6, so we capture them ourselves when `bench.add` runs\n// and key them by task name, mirroring the URI map.\nexport interface CapturedTaskData {\n fn: Fn;\n fnOpts?: FnOptions;\n}\n\nconst taskDataMap = new WeakMap<Bench, Map<string, CapturedTaskData>>();\n\nexport function getOrCreateTaskDataMap(\n bench: Bench,\n): Map<string, CapturedTaskData> {\n let map = taskDataMap.get(bench);\n if (!map) {\n map = new Map<string, CapturedTaskData>();\n taskDataMap.set(bench, map);\n }\n return map;\n}\n\nexport function getTaskData(\n bench: Bench,\n taskName: string,\n): CapturedTaskData | undefined {\n return taskDataMap.get(bench)?.get(taskName);\n}\n","import { Bench } from \"tinybench\";\n\n// Store URI mapping externally since fnOpts is private\nexport const taskUriMap = new WeakMap<Bench, Map<string, string>>();\n\nexport function getTaskUri(\n bench: Bench,\n taskName: string,\n rootCallingFile: string,\n): string {\n const uriMap = taskUriMap.get(bench);\n return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;\n}\n\nexport function getOrCreateUriMap(bench: Bench): Map<string, string> {\n let uriMap = taskUriMap.get(bench);\n if (!uriMap) {\n uriMap = new Map<string, string>();\n taskUriMap.set(bench, uriMap);\n }\n return uriMap;\n}\n","import { setupCore, teardownCore } from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { CapturedTaskData, getTaskData } from \"./taskData\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport abstract class BaseBenchRunner {\n protected bench: Bench;\n protected rootCallingFile: string;\n\n constructor(bench: Bench, rootCallingFile: string) {\n this.bench = bench;\n this.rootCallingFile = rootCallingFile;\n }\n\n private setupBenchRun(): void {\n setupCore();\n this.logStart();\n }\n\n private logStart(): void {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (${this.getModeName()})`,\n );\n }\n\n protected getTaskUri(task: Task): string {\n return getTaskUri(this.bench, task.name, this.rootCallingFile);\n }\n\n protected getTaskData(task: Task): CapturedTaskData {\n const data = getTaskData(this.bench, task.name);\n if (!data) {\n throw new Error(\n `[CodSpeed] No captured function found for task \"${task.name}\"`,\n );\n }\n return data;\n }\n\n protected logTaskCompletion(uri: string, status: string): void {\n console.log(`[CodSpeed] ${status} ${uri}`);\n }\n\n protected finalizeBenchRun(): Task[] {\n teardownCore();\n console.log(`[CodSpeed] Done running ${this.bench.tasks.length} benches.`);\n return this.bench.tasks;\n }\n\n protected abstract getModeName(): string;\n protected abstract runTaskAsync(task: Task, uri: string): Promise<void>;\n protected abstract runTaskSync(task: Task, uri: string): void;\n protected abstract finalizeAsyncRun(): Task[];\n protected abstract finalizeSyncRun(): Task[];\n\n public setupBenchMethods(): void {\n this.bench.run = async () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n await this.runTaskAsync(task, uri);\n }\n\n return this.finalizeAsyncRun();\n };\n\n this.bench.runSync = () => {\n this.setupBenchRun();\n\n for (const task of this.bench.tasks) {\n const uri = this.getTaskUri(task);\n this.runTaskSync(task, uri);\n }\n\n return this.finalizeSyncRun();\n };\n }\n}\n","import {\n getCodspeedRunnerMode,\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n optimizeFunctionSync,\n wrapWithRootFrame,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench, Task } from \"tinybench\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedAnalysisBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new AnalysisBenchRunner(bench, rootCallingFile);\n runner.setupBenchMethods();\n}\n\nclass AnalysisBenchRunner extends BaseBenchRunner {\n protected getModeName(): string {\n const runnerMode = getCodspeedRunnerMode();\n return `${runnerMode} mode`;\n }\n\n private taskCompletionMessage() {\n return InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\";\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n const { fnOpts, fn } = this.getTaskData(task);\n\n await fnOpts?.beforeAll?.call(task, \"run\");\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n await fnOpts?.beforeEach?.call(task, \"run\");\n await mongoMeasurement.start(uri);\n\n global.gc?.();\n const rootFrame = wrapWithRootFrame(fn);\n InstrumentHooks.startBenchmark();\n try {\n await rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n await mongoMeasurement.stop(uri);\n await fnOpts?.afterEach?.call(task, \"run\");\n await fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected runTaskSync(task: Task, uri: string): void {\n const { fnOpts, fn } = this.getTaskData(task);\n\n fnOpts?.beforeAll?.call(task, \"run\");\n\n optimizeFunctionSync(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n fnOpts?.beforeEach?.call(task, \"run\");\n\n global.gc?.();\n const rootFrame = wrapWithRootFrameSync(fn);\n InstrumentHooks.startBenchmark();\n try {\n rootFrame();\n } finally {\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n }\n\n fnOpts?.afterEach?.call(task, \"run\");\n fnOpts?.afterAll?.call(task, \"run\");\n\n this.logTaskCompletion(uri, this.taskCompletionMessage());\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeBenchRun();\n }\n}\n","import { Bench, Hook } from \"tinybench\";\n\n// The benchmark options tinybench resolves: timing knobs plus the suite-level\n// setup/teardown hooks. tinybench guarantees `setup`/`teardown` are populated\n// (at least with no-op defaults), so they are non-optional here.\nexport interface ResolvedBenchOptions {\n setup: Hook;\n teardown: Hook;\n warmup?: boolean;\n warmupIterations?: number;\n warmupTime?: number;\n iterations?: number;\n time?: number;\n retainSamples?: boolean;\n}\n\n// Up to tinybench v5 the resolved options lived under `bench.opts`; from v6 they\n// are flattened onto the bench instance itself. Returning the holder object\n// (rather than a copy) keeps in-place mutation of `setup`/`teardown` working,\n// which the walltime runner relies on to bracket its instrumentation window.\nexport function getBenchOptions(bench: Bench): ResolvedBenchOptions {\n const opts = (bench as unknown as { opts?: ResolvedBenchOptions }).opts;\n return opts ?? (bench as unknown as ResolvedBenchOptions);\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n MARKER_TYPE_BENCHMARK_END,\n MARKER_TYPE_BENCHMARK_START,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type BenchmarkStats,\n type Benchmark as CodspeedBenchmark,\n} from \"@codspeed/core\";\nimport { Bench, Task, TaskResult } from \"tinybench\";\nimport { getBenchOptions } from \"./benchOptions\";\nimport { BaseBenchRunner } from \"./shared\";\n\nexport function setupCodspeedWalltimeBench(\n bench: Bench,\n rootCallingFile: string,\n): void {\n const runner = new WalltimeBenchRunner(bench, rootCallingFile);\n runner.installInstrumentHooks();\n runner.setupBenchMethods();\n}\n\nclass WalltimeBenchRunner extends BaseBenchRunner {\n private codspeedBenchmarks: CodspeedBenchmark[] = [];\n\n // Carries the window start timestamp from the setup hook to the teardown\n // hook. Tasks run strictly sequentially, so a single field is enough.\n private runStart: bigint | null = null;\n\n protected getModeName(): string {\n return \"walltime mode\";\n }\n\n /**\n * Drive the instrumentation window from the task's setup/teardown hooks so it\n * brackets only tinybench's measured loop, excluding warmup and the\n * statistics computation (`processRunResult`) that surround it. The user's\n * own hooks are preserved and still run in their original order relative to\n * the work under test.\n */\n public installInstrumentHooks(): void {\n // The resolved options expose `setup`/`teardown` as typed `Readonly`, but\n // tinybench populates them with (at least) no-op defaults and lets them be\n // reassigned at runtime.\n const opts = getBenchOptions(this.bench);\n\n // We build the walltime statistics from the per-round latency samples.\n // tinybench stopped retaining them by default in v6, so opt back in.\n opts.retainSamples = true;\n\n const userSetup = opts.setup;\n const userTeardown = opts.teardown;\n\n opts.setup = (task, mode) => {\n const setupResult = userSetup(task, mode);\n if (mode === \"run\") {\n InstrumentHooks.startBenchmark();\n this.runStart = InstrumentHooks.currentTimestamp();\n }\n return setupResult;\n };\n\n opts.teardown = (task, mode) => {\n if (mode === \"run\" && task) {\n const runEnd = InstrumentHooks.currentTimestamp();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(\n process.pid,\n this.getTaskUri(task),\n );\n if (this.runStart !== null) {\n this.sendBenchmarkMarkers(this.runStart, runEnd);\n }\n\n this.runStart = null;\n }\n return userTeardown(task, mode);\n };\n }\n\n private sendBenchmarkMarkers(runStart: bigint, runEnd: bigint): void {\n InstrumentHooks.addMarker(\n process.pid,\n MARKER_TYPE_BENCHMARK_START,\n runStart,\n );\n InstrumentHooks.addMarker(process.pid, MARKER_TYPE_BENCHMARK_END, runEnd);\n }\n\n protected async runTaskAsync(task: Task, uri: string): Promise<void> {\n // run the warmup of the task right before its actual run\n if (getBenchOptions(this.bench).warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n await task.run();\n await mongoMeasurement.stop(uri);\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n protected runTaskSync(task: Task, _uri: string): void {\n if (getBenchOptions(this.bench).warmup) {\n task.warmupSync();\n }\n\n task.runSync();\n\n this.registerCodspeedBenchmarkFromTask(task);\n }\n\n protected finalizeAsyncRun(): Task[] {\n return this.finalizeWalltimeRun(true);\n }\n\n protected finalizeSyncRun(): Task[] {\n return this.finalizeWalltimeRun(false);\n }\n\n private registerCodspeedBenchmarkFromTask(task: Task): void {\n const uri = this.getTaskUri(task);\n\n if (!task.result) {\n console.warn(` ⚠ No result data available for ${uri}`);\n return;\n }\n\n const opts = getBenchOptions(this.bench);\n const warmupIterations = opts.warmup\n ? (opts.warmupIterations ?? TINYBENCH_WARMUP_DEFAULT)\n : 0;\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n warmupIterations,\n );\n\n this.codspeedBenchmarks.push({\n name: task.name,\n uri,\n config: {\n max_rounds: opts.iterations ?? null,\n max_time_ns: opts.time ? msToNs(opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n opts.warmup && opts.warmupTime ? msToNs(opts.warmupTime) : null,\n },\n stats,\n });\n\n this.logTaskCompletion(uri, \"Collected walltime data for\");\n }\n\n private finalizeWalltimeRun(isAsync: boolean): Task[] {\n // Write results to JSON file using core function\n if (this.codspeedBenchmarks.length > 0) {\n writeWalltimeResults(this.codspeedBenchmarks, isAsync);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${this.bench.tasks.length} benches.`,\n );\n return this.bench.tasks;\n }\n}\n\nconst TINYBENCH_WARMUP_DEFAULT = 16;\n\nfunction convertTinybenchResultToBenchmarkStats(\n result: TaskResult,\n warmupIterations: number,\n): BenchmarkStats {\n const { min, max, mean, sd, samples } = result.latency;\n\n // Get individual sample times in nanoseconds and sort them\n const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);\n const meanNs = msToNs(mean);\n const stdevNs = msToNs(sd);\n\n const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } =\n calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });\n\n return {\n min_ns: msToNs(min),\n max_ns: msToNs(max),\n mean_ns: meanNs,\n stdev_ns: stdevNs,\n q1_ns,\n median_ns,\n q3_ns,\n total_time: msToS(result.totalTime),\n iter_per_round: 1, // as there is only one round in tinybench, we define that there were n rounds of 1 iteration\n rounds: sortedTimesNs.length,\n iqr_outlier_rounds,\n stdev_outlier_rounds,\n warmup_iters: warmupIterations,\n };\n}\n","import {\n getCallingFile,\n getCodspeedRunnerMode,\n getInstrumentMode,\n InstrumentHooks,\n mongoMeasurement,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n wrapWithRootFrameSync,\n} from \"@codspeed/core\";\nimport { Bench } from \"tinybench\";\nimport { setupCodspeedAnalysisBench } from \"./analysis\";\nimport { getOrCreateTaskDataMap } from \"./taskData\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { setupCodspeedWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n\n const rootCallingFile = getCallingFile(1);\n const instrumentMode = getInstrumentMode();\n\n // Compute and register URI for bench\n const uriMap = getOrCreateUriMap(bench);\n const taskDataMap = getOrCreateTaskDataMap(bench);\n const rawAdd = bench.add;\n bench.add = (name, fn, opts?) => {\n const callingFile = getCallingFile(1);\n let uri = callingFile;\n if (bench.name !== undefined) {\n uri += `::${bench.name}`;\n }\n uri += `::${name}`;\n uriMap.set(name, uri);\n taskDataMap.set(name, { fn, fnOpts: opts });\n // In walltime mode the task is driven by tinybench's own measured loop, so\n // the root frame must be baked into the function tinybench stores rather\n // than injected later (the function is an inaccessible private field on the\n // task from tinybench v6 onwards). The sync wrapper is transparent to the\n // function's return value, so it preserves tinybench's sync/async handling.\n const registeredFn =\n instrumentMode === \"walltime\" ? wrapWithRootFrameSync(fn) : fn;\n return rawAdd.bind(bench)(name, registeredFn, opts);\n };\n\n if (instrumentMode === \"analysis\") {\n setupCodspeedAnalysisBench(bench, rootCallingFile);\n } else if (instrumentMode === \"walltime\") {\n setupCodspeedWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody,\n): Promise<SetupInstrumentsResponse> {\n if (!InstrumentHooks.isInstrumented()) {\n console.warn(\"[CodSpeed] No instrumentation found, using default mongoUrl\");\n\n return { remoteAddr: body.mongoUrl };\n }\n\n return await mongoMeasurement.setupInstruments(body);\n}\n"],"names":["__publicField"],"mappings":";;AAWA,MAAM,WAAA,uBAAkB,OAAA,EAA8C;AAE/D,SAAS,uBACd,KAAA,EAC+B;AAC/B,EAAA,IAAI,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,uBAAU,GAAA,EAA8B;AACxC,IAAA,WAAA,CAAY,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,WAAA,CACd,OACA,QAAA,EAC8B;AAC9B,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG,IAAI,QAAQ,CAAA;AAC7C;;AC1BO,MAAM,UAAA,uBAAiB,OAAA,EAAoC;AAE3D,SAAS,UAAA,CACd,KAAA,EACA,QAAA,EACA,eAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACnC,EAAA,OAAO,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA,IAAK,GAAG,eAAA,CAAA,EAAA,EAAoB,QAAA,CAAA,CAAA;AACzD;AAEO,SAAS,kBAAkB,KAAA,EAAmC;AACnE,EAAA,IAAI,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,uBAAa,GAAA,EAAoB;AACjC,IAAA,UAAA,CAAW,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,MAAA;AACT;;;;;;;;ACdO,MAAe,eAAA,CAAgB;AAAA,EAIpC,WAAA,CAAY,OAAc,eAAA,EAAyB;AAHnD,IAAAA,eAAA,CAAA,IAAA,EAAU,OAAA,CAAA;AACV,IAAAA,eAAA,CAAA,IAAA,EAAU,iBAAA,CAAA;AAGR,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,SAAA,EAAU;AACV,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AAAA,EAEQ,QAAA,GAAiB;AACvB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,OAAA,CAAA,EAAA,EAAgB,IAAA,CAAK,WAAA,EAAY,CAAA,CAAA;AAAA,KACnF;AAAA,EACF;AAAA,EAEU,WAAW,IAAA,EAAoB;AACvC,IAAA,OAAO,WAAW,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,KAAK,eAAe,CAAA;AAAA,EAC/D;AAAA,EAEU,YAAY,IAAA,EAA8B;AAClD,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mDAAmD,IAAA,CAAK,IAAA,CAAA,CAAA;AAAA,OAC1D;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,iBAAA,CAAkB,KAAa,MAAA,EAAsB;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,MAAA,CAAA,CAAA,EAAU,GAAA,CAAA,CAAK,CAAA;AAAA,EAC3C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,YAAA,EAAa;AACb,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,IAAA,CAAK,KAAA,CAAM,MAAM,MAAA,CAAA,SAAA,CAAiB,CAAA;AACzE,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AAAA,EAQO,iBAAA,GAA0B;AAC/B,IAAA,IAAA,CAAK,KAAA,CAAM,MAAM,YAAY;AAC3B,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,MAAM,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA;AAAA,MACnC;AAEA,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B,CAAA;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,UAAU,MAAM;AACzB,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AACnC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAChC,QAAA,IAAA,CAAK,WAAA,CAAY,MAAM,GAAG,CAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,IAC9B,CAAA;AAAA,EACF;AACF;;ACpEO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EACtC,WAAA,GAAsB;AAC9B,IAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,IAAA,OAAO,CAAA,EAAG,UAAA,CAAA,KAAA,CAAA;AAAA,EACZ;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,OAAO,eAAA,CAAgB,cAAA,EAAe,GAAI,UAAA,GAAa,SAAA;AAAA,EACzD;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AACnE,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA;AAE5C,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,iBAAiB,YAAY;AACjC,MAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IAC3C,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAC1C,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAEhC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,SAAA,GAAY,kBAAkB,EAAE,CAAA;AACtC,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,EAAU;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACzC,IAAA,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAExC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,WAAA,CAAY,MAAY,GAAA,EAAmB;AACnD,IAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAG,GAAI,IAAA,CAAK,YAAY,IAAI,CAAA;AAE5C,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEnC,IAAA,oBAAA,CAAqB,YAAY;AAC/B,MAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACpC,MAAA,MAAM,EAAA,EAAG;AACT,MAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,MAAA,EAAQ,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAEpC,IAAA,MAAA,CAAO,EAAA,IAAK;AACZ,IAAA,MAAM,SAAA,GAAY,sBAAsB,EAAE,CAAA;AAC1C,IAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,IAAA,IAAI;AACF,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,MAAA,eAAA,CAAgB,oBAAA,CAAqB,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACnC,IAAA,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AAElC,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAAA,EAC1D;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AACF;;AC3EO,SAAS,gBAAgB,KAAA,EAAoC;AAClE,EAAA,MAAM,OAAQ,KAAA,CAAqD,IAAA;AACnE,EAAA,OAAO,IAAA,IAAS,KAAA;AAClB;;;;;;;;ACPO,SAAS,0BAAA,CACd,OACA,eAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAI,mBAAA,CAAoB,KAAA,EAAO,eAAe,CAAA;AAC7D,EAAA,MAAA,CAAO,sBAAA,EAAuB;AAC9B,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAC3B;AAEA,MAAM,4BAA4B,eAAA,CAAgB;AAAA,EAAlD,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACE,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAA0C,EAAC,CAAA;AAInD;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,EAA0B,IAAA,CAAA;AAAA,EAAA;AAAA,EAExB,WAAA,GAAsB;AAC9B,IAAA,OAAO,eAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,sBAAA,GAA+B;AAIpC,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAIvC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAErB,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA;AACvB,IAAA,MAAM,eAAe,IAAA,CAAK,QAAA;AAE1B,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,IAAA,EAAM,IAAA,KAAS;AAC3B,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AACxC,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,eAAA,CAAgB,cAAA,EAAe;AAC/B,QAAA,IAAA,CAAK,QAAA,GAAW,gBAAgB,gBAAA,EAAiB;AAAA,MACnD;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,CAAC,IAAA,EAAM,IAAA,KAAS;AAC9B,MAAA,IAAI,IAAA,KAAS,SAAS,IAAA,EAAM;AAC1B,QAAA,MAAM,MAAA,GAAS,gBAAgB,gBAAA,EAAiB;AAChD,QAAA,eAAA,CAAgB,aAAA,EAAc;AAC9B,QAAA,eAAA,CAAgB,oBAAA;AAAA,UACd,OAAA,CAAQ,GAAA;AAAA,UACR,IAAA,CAAK,WAAW,IAAI;AAAA,SACtB;AACA,QAAA,IAAI,IAAA,CAAK,aAAa,IAAA,EAAM;AAC1B,UAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAAA,QACjD;AAEA,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB;AACA,MAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAAA,EAEQ,oBAAA,CAAqB,UAAkB,MAAA,EAAsB;AACnE,IAAA,eAAA,CAAgB,SAAA;AAAA,MACd,OAAA,CAAQ,GAAA;AAAA,MACR,2BAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,eAAA,CAAgB,SAAA,CAAU,OAAA,CAAQ,GAAA,EAAK,yBAAA,EAA2B,MAAM,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAgB,YAAA,CAAa,IAAA,EAAY,GAAA,EAA4B;AAEnE,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,EAAQ;AACtC,MAAA,MAAM,KAAK,MAAA,EAAO;AAAA,IACpB;AAEA,IAAA,MAAM,gBAAA,CAAiB,MAAM,GAAG,CAAA;AAChC,IAAA,MAAM,KAAK,GAAA,EAAI;AACf,IAAA,MAAM,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAE/B,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGU,WAAA,CAAY,MAAY,IAAA,EAAoB;AACpD,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,EAAQ;AACtC,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAA,CAAK,kCAAkC,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEU,gBAAA,GAA2B;AACnC,IAAA,OAAO,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,EACtC;AAAA,EAEU,eAAA,GAA0B;AAClC,IAAA,OAAO,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,EACvC;AAAA,EAEQ,kCAAkC,IAAA,EAAkB;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,2CAAsC,GAAA,CAAA,CAAK,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AACvC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,MAAA,GACzB,IAAA,CAAK,oBAAoB,wBAAA,GAC1B,CAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,sCAAA;AAAA,MACZ,IAAA,CAAK,MAAA;AAAA,MACL;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK;AAAA,MAC3B,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,GAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,QAC/B,aAAa,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAAA,QAC7C,iBAAA,EAAmB,IAAA;AAAA;AAAA,QACnB,cAAA,EACE,KAAK,MAAA,IAAU,IAAA,CAAK,aAAa,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,GAAI;AAAA,OAC/D;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,6BAA6B,CAAA;AAAA,EAC3D;AAAA,EAEQ,oBAAoB,OAAA,EAA0B;AAEpD,IAAA,IAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,oBAAA,CAAqB,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,IACvD;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,6CAAA,EAAgD,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAA,CAAA,SAAA;AAAA,KACnE;AACA,IAAA,OAAO,KAAK,KAAA,CAAM,KAAA;AAAA,EACpB;AACF;AAEA,MAAM,wBAAA,GAA2B,EAAA;AAEjC,SAAS,sCAAA,CACP,QACA,gBAAA,EACgB;AAChB,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,MAAM,EAAA,EAAI,OAAA,KAAY,MAAA,CAAO,OAAA;AAG/C,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAO,IAAI,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,EAAE,CAAA;AAEzB,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,kBAAA,EAAoB,oBAAA,EAAqB,GACxE,kBAAA,CAAmB,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,MAAA,EAAQ,OAAO,GAAG,CAAA;AAAA,IAClB,OAAA,EAAS,MAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAY,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AAAA,IAClC,cAAA,EAAgB,CAAA;AAAA;AAAA,IAChB,QAAQ,aAAA,CAAc,MAAA;AAAA,IACtB,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,YAAA,EAAc;AAAA,GAChB;AACF;;ACxLA,aAAA,EAAc;AAEP,SAAS,aAAa,KAAA,EAAqB;AAChD,EAAA,MAAM,qBAAqB,qBAAA,EAAsB;AACjD,EAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,GAAkB,eAAe,CAAC,CAAA;AACxC,EAAA,MAAM,iBAAiB,iBAAA,EAAkB;AAGzC,EAAA,MAAM,MAAA,GAAS,kBAAkB,KAAK,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,uBAAuB,KAAK,CAAA;AAChD,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA;AACrB,EAAA,KAAA,CAAM,GAAA,GAAM,CAAC,IAAA,EAAM,EAAA,EAAI,IAAA,KAAU;AAC/B,IAAA,MAAM,WAAA,GAAc,eAAe,CAAC,CAAA;AACpC,IAAA,IAAI,GAAA,GAAM,WAAA;AACV,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAW;AAC5B,MAAA,GAAA,IAAO,KAAK,KAAA,CAAM,IAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,GAAA,IAAO,CAAA,EAAA,EAAK,IAAA,CAAA,CAAA;AACZ,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AACpB,IAAA,WAAA,CAAY,IAAI,IAAA,EAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;AAM1C,IAAA,MAAM,YAAA,GACJ,cAAA,KAAmB,UAAA,GAAa,qBAAA,CAAsB,EAAE,CAAA,GAAI,EAAA;AAC9D,IAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,IAAA,EAAM,cAAc,IAAI,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD,CAAA,MAAA,IAAW,mBAAmB,UAAA,EAAY;AACxC,IAAA,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,iBACpB,IAAA,EACmC;AACnC,EAAA,IAAI,CAAC,eAAA,CAAgB,cAAA,EAAe,EAAG;AACrC,IAAA,OAAA,CAAQ,KAAK,6DAA6D,CAAA;AAE1E,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,QAAA,EAAS;AAAA,EACrC;AAEA,EAAA,OAAO,MAAM,gBAAA,CAAiB,gBAAA,CAAiB,IAAI,CAAA;AACrD;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codspeed/tinybench-plugin",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.7.0",
|
|
4
4
|
"description": "tinybench compatibility layer for CodSpeed",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"codspeed",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"vitest": "^3.2.4"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@codspeed/core": "^5.
|
|
33
|
+
"@codspeed/core": "^5.7.0"
|
|
34
34
|
},
|
|
35
35
|
"peerDependencies": {
|
|
36
36
|
"tinybench": ">=4.0.1"
|