@codspeed/tinybench-plugin 4.0.1 → 5.0.0-alpha.1

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 ADDED
@@ -0,0 +1,334 @@
1
+ 'use strict';
2
+
3
+ var core = require('@codspeed/core');
4
+ var path = require('path');
5
+ var url = require('url');
6
+
7
+ function get(belowFn) {
8
+ const oldLimit = Error.stackTraceLimit;
9
+ Error.stackTraceLimit = Infinity;
10
+
11
+ const dummyObject = {};
12
+
13
+ const v8Handler = Error.prepareStackTrace;
14
+ Error.prepareStackTrace = function(dummyObject, v8StackTrace) {
15
+ return v8StackTrace;
16
+ };
17
+ Error.captureStackTrace(dummyObject, belowFn || get);
18
+
19
+ const v8StackTrace = dummyObject.stack;
20
+ Error.prepareStackTrace = v8Handler;
21
+ Error.stackTraceLimit = oldLimit;
22
+
23
+ return v8StackTrace;
24
+ }
25
+
26
+ function CallSite(properties) {
27
+ for (const property in properties) {
28
+ this[property] = properties[property];
29
+ }
30
+ }
31
+
32
+ const strProperties = [
33
+ 'this',
34
+ 'typeName',
35
+ 'functionName',
36
+ 'methodName',
37
+ 'fileName',
38
+ 'lineNumber',
39
+ 'columnNumber',
40
+ 'function',
41
+ 'evalOrigin'
42
+ ];
43
+
44
+ const boolProperties = [
45
+ 'topLevel',
46
+ 'eval',
47
+ 'native',
48
+ 'constructor'
49
+ ];
50
+
51
+ strProperties.forEach(function (property) {
52
+ CallSite.prototype[property] = null;
53
+ CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {
54
+ return this[property];
55
+ };
56
+ });
57
+
58
+ boolProperties.forEach(function (property) {
59
+ CallSite.prototype[property] = false;
60
+ CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {
61
+ return this[property];
62
+ };
63
+ });
64
+
65
+ const taskUriMap = /* @__PURE__ */ new WeakMap();
66
+ function getTaskUri(bench, taskName, rootCallingFile) {
67
+ const uriMap = taskUriMap.get(bench);
68
+ return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;
69
+ }
70
+ function getOrCreateUriMap(bench) {
71
+ let uriMap = taskUriMap.get(bench);
72
+ if (!uriMap) {
73
+ uriMap = /* @__PURE__ */ new Map();
74
+ taskUriMap.set(bench, uriMap);
75
+ }
76
+ return uriMap;
77
+ }
78
+
79
+ function runInstrumentedBench(bench, rootCallingFile) {
80
+ bench.run = async () => {
81
+ console.log(
82
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (instrumented mode)`
83
+ );
84
+ for (const task of bench.tasks) {
85
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
86
+ const { fnOpts, fn } = task;
87
+ await fnOpts?.beforeAll?.call(task, "run");
88
+ await core.optimizeFunction(async () => {
89
+ await fnOpts?.beforeEach?.call(task, "run");
90
+ await fn();
91
+ await fnOpts?.afterEach?.call(task, "run");
92
+ });
93
+ await fnOpts?.beforeEach?.call(task, "run");
94
+ await core.mongoMeasurement.start(uri);
95
+ global.gc?.();
96
+ await async function __codspeed_root_frame__() {
97
+ core.InstrumentHooks.startBenchmark();
98
+ await fn();
99
+ core.InstrumentHooks.stopBenchmark();
100
+ core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
101
+ }();
102
+ await core.mongoMeasurement.stop(uri);
103
+ await fnOpts?.afterEach?.call(task, "run");
104
+ await fnOpts?.afterAll?.call(task, "run");
105
+ console.log(
106
+ ` \u2714 ${core.InstrumentHooks.isInstrumented() ? "Measured" : "Checked"} ${uri}`
107
+ );
108
+ }
109
+ core.teardownCore();
110
+ console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);
111
+ return bench.tasks;
112
+ };
113
+ bench.runSync = () => {
114
+ console.log(
115
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (instrumented mode)`
116
+ );
117
+ for (const task of bench.tasks) {
118
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
119
+ const { fnOpts, fn } = task;
120
+ fnOpts?.beforeAll?.call(task, "run");
121
+ core.optimizeFunction(async () => {
122
+ fnOpts?.beforeEach?.call(task, "run");
123
+ fn();
124
+ fnOpts?.afterEach?.call(task, "run");
125
+ });
126
+ fnOpts?.beforeEach?.call(task, "run");
127
+ global.gc?.();
128
+ (function __codspeed_root_frame__() {
129
+ core.InstrumentHooks.startBenchmark();
130
+ fn();
131
+ core.InstrumentHooks.stopBenchmark();
132
+ core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
133
+ })();
134
+ core.mongoMeasurement.stop(uri);
135
+ fnOpts?.afterEach?.call(task, "run");
136
+ fnOpts?.afterAll?.call(task, "run");
137
+ console.log(
138
+ ` \u2714 ${core.InstrumentHooks.isInstrumented() ? "Measured" : "Checked"} ${uri}`
139
+ );
140
+ }
141
+ core.teardownCore();
142
+ console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);
143
+ return bench.tasks;
144
+ };
145
+ }
146
+
147
+ function runWalltimeBench(bench, rootCallingFile) {
148
+ bench.run = async () => {
149
+ console.log(
150
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (walltime mode)`
151
+ );
152
+ const originalRun = bench.run;
153
+ const benchProto = Object.getPrototypeOf(bench);
154
+ const prototypeRun = benchProto.run;
155
+ bench.run = prototypeRun;
156
+ const benchmarks = [];
157
+ for (const task of bench.tasks) {
158
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
159
+ const { fn } = task;
160
+ async function __codspeed_root_frame__() {
161
+ await fn();
162
+ }
163
+ task.fn = __codspeed_root_frame__;
164
+ if (bench.opts.warmup) {
165
+ await task.warmup();
166
+ }
167
+ await core.mongoMeasurement.start(uri);
168
+ core.InstrumentHooks.startBenchmark();
169
+ await task.run();
170
+ core.InstrumentHooks.stopBenchmark();
171
+ await core.mongoMeasurement.stop(uri);
172
+ if (task.result) {
173
+ const stats = convertTinybenchResultToBenchmarkStats(
174
+ task.result,
175
+ bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0
176
+ );
177
+ const benchmark = {
178
+ name: task.name,
179
+ uri,
180
+ config: {
181
+ max_rounds: bench.opts.iterations ?? null,
182
+ max_time_ns: bench.opts.time ? core.msToNs(bench.opts.time) : null,
183
+ min_round_time_ns: null,
184
+ // tinybench does not have an option for this
185
+ warmup_time_ns: bench.opts.warmup && bench.opts.warmupTime ? core.msToNs(bench.opts.warmupTime) : null
186
+ },
187
+ stats
188
+ };
189
+ benchmarks.push(benchmark);
190
+ console.log(` \u2714 Collected walltime data for ${uri}`);
191
+ core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
192
+ } else {
193
+ console.warn(` \u26A0 No result data available for ${uri}`);
194
+ }
195
+ }
196
+ if (benchmarks.length > 0) {
197
+ core.writeWalltimeResults(benchmarks, true);
198
+ }
199
+ console.log(
200
+ `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`
201
+ );
202
+ bench.run = originalRun;
203
+ return bench.tasks;
204
+ };
205
+ bench.runSync = () => {
206
+ console.log(
207
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (walltime mode)`
208
+ );
209
+ const originalRun = bench.run;
210
+ const benchProto = Object.getPrototypeOf(bench);
211
+ const prototypeRun = benchProto.run;
212
+ bench.run = prototypeRun;
213
+ const benchmarks = [];
214
+ for (const task of bench.tasks) {
215
+ let __codspeed_root_frame__2 = function() {
216
+ fn();
217
+ };
218
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
219
+ if (bench.opts.warmup) {
220
+ task.warmup();
221
+ }
222
+ const { fn } = task;
223
+ task.fn = __codspeed_root_frame__2;
224
+ core.InstrumentHooks.startBenchmark();
225
+ task.runSync();
226
+ core.InstrumentHooks.stopBenchmark();
227
+ if (task.result) {
228
+ const stats = convertTinybenchResultToBenchmarkStats(
229
+ task.result,
230
+ bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0
231
+ );
232
+ const benchmark = {
233
+ name: task.name,
234
+ uri,
235
+ config: {
236
+ max_rounds: bench.opts.iterations ?? null,
237
+ max_time_ns: bench.opts.time ? core.msToNs(bench.opts.time) : null,
238
+ min_round_time_ns: null,
239
+ // tinybench does not have an option for this
240
+ warmup_time_ns: bench.opts.warmup && bench.opts.warmupTime ? core.msToNs(bench.opts.warmupTime) : null
241
+ },
242
+ stats
243
+ };
244
+ benchmarks.push(benchmark);
245
+ console.log(` \u2714 Collected walltime data for ${uri}`);
246
+ core.InstrumentHooks.setExecutedBenchmark(process.pid, uri);
247
+ } else {
248
+ console.warn(` \u26A0 No result data available for ${uri}`);
249
+ }
250
+ }
251
+ if (benchmarks.length > 0) {
252
+ core.writeWalltimeResults(benchmarks);
253
+ }
254
+ console.log(
255
+ `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`
256
+ );
257
+ bench.run = originalRun;
258
+ return bench.tasks;
259
+ };
260
+ }
261
+ function convertTinybenchResultToBenchmarkStats(result, warmupIterations) {
262
+ const { min, max, mean, sd, samples } = result.latency;
263
+ const sortedTimesNs = samples.map(core.msToNs).sort((a, b) => a - b);
264
+ const meanNs = core.msToNs(mean);
265
+ const stdevNs = core.msToNs(sd);
266
+ const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } = core.calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });
267
+ return {
268
+ min_ns: core.msToNs(min),
269
+ max_ns: core.msToNs(max),
270
+ mean_ns: meanNs,
271
+ stdev_ns: stdevNs,
272
+ q1_ns,
273
+ median_ns,
274
+ q3_ns,
275
+ total_time: core.msToS(result.totalTime),
276
+ iter_per_round: 1,
277
+ // as there is only one round in tinybench, we define that there were n rounds of 1 iteration
278
+ rounds: sortedTimesNs.length,
279
+ iqr_outlier_rounds,
280
+ stdev_outlier_rounds,
281
+ warmup_iters: warmupIterations
282
+ };
283
+ }
284
+
285
+ core.tryIntrospect();
286
+ function withCodSpeed(bench) {
287
+ const codspeedRunnerMode = core.getCodspeedRunnerMode();
288
+ if (codspeedRunnerMode === "disabled") {
289
+ return bench;
290
+ }
291
+ core.setupCore();
292
+ const rootCallingFile = getCallingFile();
293
+ const uriMap = getOrCreateUriMap(bench);
294
+ const rawAdd = bench.add;
295
+ bench.add = (name, fn, opts) => {
296
+ const callingFile = getCallingFile();
297
+ let uri = callingFile;
298
+ if (bench.name !== void 0) {
299
+ uri += `::${bench.name}`;
300
+ }
301
+ uri += `::${name}`;
302
+ uriMap.set(name, uri);
303
+ return rawAdd.bind(bench)(name, fn, opts);
304
+ };
305
+ if (codspeedRunnerMode === "instrumented") {
306
+ runInstrumentedBench(bench, rootCallingFile);
307
+ } else if (codspeedRunnerMode === "walltime") {
308
+ runWalltimeBench(bench, rootCallingFile);
309
+ }
310
+ return bench;
311
+ }
312
+ function getCallingFile() {
313
+ const stack = get();
314
+ let callingFile = stack[2].getFileName();
315
+ const gitDir = core.getGitDir(callingFile);
316
+ if (gitDir === void 0) {
317
+ throw new Error("Could not find a git repository");
318
+ }
319
+ if (callingFile.startsWith("file://")) {
320
+ callingFile = url.fileURLToPath(callingFile);
321
+ }
322
+ return path.relative(gitDir, callingFile);
323
+ }
324
+ async function setupInstruments(body) {
325
+ if (!core.InstrumentHooks.isInstrumented()) {
326
+ console.warn("[CodSpeed] No instrumentation found, using default mongoUrl");
327
+ return { remoteAddr: body.mongoUrl };
328
+ }
329
+ return await core.mongoMeasurement.setupInstruments(body);
330
+ }
331
+
332
+ exports.setupInstruments = setupInstruments;
333
+ exports.withCodSpeed = withCodSpeed;
334
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../node_modules/.pnpm/stack-trace@1.0.0-pre2/node_modules/stack-trace/index.js","../src/uri.ts","../src/instrumented.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\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 {\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n teardownCore,\n} from \"@codspeed/core\";\nimport { Bench, Fn, FnOptions } from \"tinybench\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport function runInstrumentedBench(\n bench: Bench,\n rootCallingFile: string\n): void {\n bench.run = async () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (instrumented mode)`\n );\n\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // Access private fields\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n // Call beforeAll hook if it exists\n await fnOpts?.beforeAll?.call(task, \"run\");\n\n // run optimizations\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n\n // run instrumented benchmark\n await fnOpts?.beforeEach?.call(task, \"run\");\n\n await mongoMeasurement.start(uri);\n global.gc?.();\n await (async function __codspeed_root_frame__() {\n InstrumentHooks.startBenchmark();\n await fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n })();\n await mongoMeasurement.stop(uri);\n\n await fnOpts?.afterEach?.call(task, \"run\");\n\n await fnOpts?.afterAll?.call(task, \"run\");\n\n // print results\n console.log(\n ` ✔ ${\n InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\"\n } ${uri}`\n );\n }\n\n teardownCore();\n console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);\n return bench.tasks;\n };\n\n bench.runSync = () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (instrumented mode)`\n );\n\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // Access private fields\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n // Call beforeAll hook if it exists\n fnOpts?.beforeAll?.call(task, \"run\");\n\n // run optimizations\n optimizeFunction(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n // run instrumented benchmark\n fnOpts?.beforeEach?.call(task, \"run\");\n\n // await mongoMeasurement.start(uri);\n global.gc?.();\n (function __codspeed_root_frame__() {\n InstrumentHooks.startBenchmark();\n fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n })();\n mongoMeasurement.stop(uri);\n\n fnOpts?.afterEach?.call(task, \"run\");\n\n fnOpts?.afterAll?.call(task, \"run\");\n\n // print results\n console.log(\n ` ✔ ${\n InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\"\n } ${uri}`\n );\n }\n\n teardownCore();\n console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);\n return bench.tasks;\n };\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type Benchmark,\n type BenchmarkStats,\n} from \"@codspeed/core\";\nimport { Bench, Fn, TaskResult } from \"tinybench\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport function runWalltimeBench(bench: Bench, rootCallingFile: string): void {\n bench.run = async () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (walltime mode)`\n );\n\n // Store the original run method before we override it\n const originalRun = bench.run;\n\n // Temporarily restore the original run to get actual benchmark results\n const benchProto = Object.getPrototypeOf(bench);\n const prototypeRun = benchProto.run;\n bench.run = prototypeRun;\n\n const benchmarks: Benchmark[] = [];\n\n // Collect and report walltime data\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // Override the function under test to add a static frame\n const { fn } = task as unknown as { fn: Fn };\n // eslint-disable-next-line no-inner-declarations\n async function __codspeed_root_frame__() {\n await fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n\n // run the warmup of the task right before its actual run\n if (bench.opts.warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n InstrumentHooks.startBenchmark();\n await task.run();\n InstrumentHooks.stopBenchmark();\n await mongoMeasurement.stop(uri);\n\n if (task.result) {\n // Convert tinybench result to BenchmarkStats format\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0\n );\n\n const benchmark: Benchmark = {\n name: task.name,\n uri,\n config: {\n max_rounds: bench.opts.iterations ?? null,\n max_time_ns: bench.opts.time ? msToNs(bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n bench.opts.warmup && bench.opts.warmupTime\n ? msToNs(bench.opts.warmupTime)\n : null,\n },\n stats,\n };\n\n benchmarks.push(benchmark);\n console.log(` ✔ Collected walltime data for ${uri}`);\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n } else {\n console.warn(` ⚠ No result data available for ${uri}`);\n }\n }\n\n // Write results to JSON file using core function\n if (benchmarks.length > 0) {\n writeWalltimeResults(benchmarks, true);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`\n );\n // Restore our custom run method\n bench.run = originalRun;\n\n return bench.tasks;\n };\n\n bench.runSync = () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (walltime mode)`\n );\n\n // Store the original run method before we override it\n const originalRun = bench.run;\n\n // Temporarily restore the original run to get actual benchmark results\n const benchProto = Object.getPrototypeOf(bench);\n const prototypeRun = benchProto.run;\n bench.run = prototypeRun;\n\n const benchmarks: Benchmark[] = [];\n\n // Collect and report walltime data\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // run the warmup of the task right before its actual run\n if (bench.opts.warmup) {\n task.warmup();\n }\n\n // Override the function under test to add a static frame\n const { fn } = task as unknown as { fn: Fn };\n // eslint-disable-next-line no-inner-declarations\n function __codspeed_root_frame__() {\n fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n\n InstrumentHooks.startBenchmark();\n task.runSync();\n InstrumentHooks.stopBenchmark();\n\n if (task.result) {\n // Convert tinybench result to BenchmarkStats format\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0\n );\n\n const benchmark: Benchmark = {\n name: task.name,\n uri,\n config: {\n max_rounds: bench.opts.iterations ?? null,\n max_time_ns: bench.opts.time ? msToNs(bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n bench.opts.warmup && bench.opts.warmupTime\n ? msToNs(bench.opts.warmupTime)\n : null,\n },\n stats,\n };\n\n benchmarks.push(benchmark);\n console.log(` ✔ Collected walltime data for ${uri}`);\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n } else {\n console.warn(` ⚠ No result data available for ${uri}`);\n }\n }\n\n // Write results to JSON file using core function\n if (benchmarks.length > 0) {\n writeWalltimeResults(benchmarks);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`\n );\n // Restore our custom run method\n bench.run = originalRun;\n\n return bench.tasks;\n };\n}\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 getCodspeedRunnerMode,\n getGitDir,\n InstrumentHooks,\n mongoMeasurement,\n setupCore,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport path from \"path\";\nimport { get as getStackTrace } from \"stack-trace\";\nimport { Bench } from \"tinybench\";\nimport { fileURLToPath } from \"url\";\nimport { runInstrumentedBench } from \"./instrumented\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { runWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n setupCore();\n\n const rootCallingFile = getCallingFile();\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();\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 if (codspeedRunnerMode === \"instrumented\") {\n runInstrumentedBench(bench, rootCallingFile);\n } else if (codspeedRunnerMode === \"walltime\") {\n runWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\nfunction getCallingFile(): string {\n const stack = getStackTrace();\n let callingFile = stack[2].getFileName(); // [here, withCodSpeed, actual caller]\n const gitDir = getGitDir(callingFile);\n if (gitDir === undefined) {\n throw new Error(\"Could not find a git repository\");\n }\n if (callingFile.startsWith(\"file://\")) {\n callingFile = fileURLToPath(callingFile);\n }\n return path.relative(gitDir, callingFile);\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":["optimizeFunction","mongoMeasurement","InstrumentHooks","teardownCore","msToNs","writeWalltimeResults","__codspeed_root_frame__","calculateQuantiles","msToS","tryIntrospect","getCodspeedRunnerMode","setupCore","getStackTrace","getGitDir","fileURLToPath"],"mappings":"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","x_google_ignoreList":[0]}
package/dist/index.es5.js CHANGED
@@ -1,4 +1,4 @@
1
- import { tryIntrospect, Measurement, setupCore, optimizeFunction, mongoMeasurement, teardownCore, getGitDir } from '@codspeed/core';
1
+ import { optimizeFunction, mongoMeasurement, InstrumentHooks, teardownCore, msToNs, writeWalltimeResults, calculateQuantiles, msToS, tryIntrospect, getCodspeedRunnerMode, setupCore, getGitDir } from '@codspeed/core';
2
2
  import path from 'path';
3
3
  import { fileURLToPath } from 'url';
4
4
 
@@ -60,57 +60,251 @@ boolProperties.forEach(function (property) {
60
60
  };
61
61
  });
62
62
 
63
- tryIntrospect();
64
- function isCodSpeedBenchOptions(options) {
65
- return "uri" in options;
63
+ const taskUriMap = /* @__PURE__ */ new WeakMap();
64
+ function getTaskUri(bench, taskName, rootCallingFile) {
65
+ const uriMap = taskUriMap.get(bench);
66
+ return uriMap?.get(taskName) || `${rootCallingFile}::${taskName}`;
66
67
  }
67
- function withCodSpeed(bench) {
68
- if (!Measurement.isInstrumented()) {
69
- const rawRun = bench.run;
70
- bench.run = async () => {
71
- console.warn(
72
- `[CodSpeed] ${bench.tasks.length} benches detected but no instrumentation found, falling back to tinybench`
73
- );
74
- return await rawRun.bind(bench)();
75
- };
76
- return bench;
68
+ function getOrCreateUriMap(bench) {
69
+ let uriMap = taskUriMap.get(bench);
70
+ if (!uriMap) {
71
+ uriMap = /* @__PURE__ */ new Map();
72
+ taskUriMap.set(bench, uriMap);
77
73
  }
78
- const rawAdd = bench.add;
79
- bench.add = (name, fn, opts) => {
80
- const callingFile = getCallingFile();
81
- const uri = `${callingFile}::${name}`;
82
- const options = Object.assign({}, opts ?? {}, { uri });
83
- return rawAdd.bind(bench)(name, fn, options);
84
- };
85
- const rootCallingFile = getCallingFile();
74
+ return uriMap;
75
+ }
76
+
77
+ function runInstrumentedBench(bench, rootCallingFile) {
86
78
  bench.run = async () => {
87
- console.log(`[CodSpeed] running with @codspeed/tinybench v${"4.0.1"}`);
88
- setupCore();
79
+ console.log(
80
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (instrumented mode)`
81
+ );
89
82
  for (const task of bench.tasks) {
90
- const uri = isCodSpeedBenchOptions(task.opts) ? task.opts.uri : `${rootCallingFile}::${task.name}`;
91
- await task.opts.beforeAll?.call(task);
83
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
84
+ const { fnOpts, fn } = task;
85
+ await fnOpts?.beforeAll?.call(task, "run");
92
86
  await optimizeFunction(async () => {
93
- await task.opts.beforeEach?.call(task);
94
- await task.fn();
95
- await task.opts.afterEach?.call(task);
87
+ await fnOpts?.beforeEach?.call(task, "run");
88
+ await fn();
89
+ await fnOpts?.afterEach?.call(task, "run");
96
90
  });
97
- await task.opts.beforeEach?.call(task);
91
+ await fnOpts?.beforeEach?.call(task, "run");
98
92
  await mongoMeasurement.start(uri);
99
93
  global.gc?.();
100
94
  await async function __codspeed_root_frame__() {
101
- Measurement.startInstrumentation();
102
- await task.fn();
103
- Measurement.stopInstrumentation(uri);
95
+ InstrumentHooks.startBenchmark();
96
+ await fn();
97
+ InstrumentHooks.stopBenchmark();
98
+ InstrumentHooks.setExecutedBenchmark(process.pid, uri);
104
99
  }();
105
100
  await mongoMeasurement.stop(uri);
106
- await task.opts.afterEach?.call(task);
107
- await task.opts.afterAll?.call(task);
108
- console.log(` \u2714 Measured ${uri}`);
101
+ await fnOpts?.afterEach?.call(task, "run");
102
+ await fnOpts?.afterAll?.call(task, "run");
103
+ console.log(
104
+ ` \u2714 ${InstrumentHooks.isInstrumented() ? "Measured" : "Checked"} ${uri}`
105
+ );
106
+ }
107
+ teardownCore();
108
+ console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);
109
+ return bench.tasks;
110
+ };
111
+ bench.runSync = () => {
112
+ console.log(
113
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (instrumented mode)`
114
+ );
115
+ for (const task of bench.tasks) {
116
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
117
+ const { fnOpts, fn } = task;
118
+ fnOpts?.beforeAll?.call(task, "run");
119
+ optimizeFunction(async () => {
120
+ fnOpts?.beforeEach?.call(task, "run");
121
+ fn();
122
+ fnOpts?.afterEach?.call(task, "run");
123
+ });
124
+ fnOpts?.beforeEach?.call(task, "run");
125
+ global.gc?.();
126
+ (function __codspeed_root_frame__() {
127
+ InstrumentHooks.startBenchmark();
128
+ fn();
129
+ InstrumentHooks.stopBenchmark();
130
+ InstrumentHooks.setExecutedBenchmark(process.pid, uri);
131
+ })();
132
+ mongoMeasurement.stop(uri);
133
+ fnOpts?.afterEach?.call(task, "run");
134
+ fnOpts?.afterAll?.call(task, "run");
135
+ console.log(
136
+ ` \u2714 ${InstrumentHooks.isInstrumented() ? "Measured" : "Checked"} ${uri}`
137
+ );
109
138
  }
110
139
  teardownCore();
111
140
  console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);
112
141
  return bench.tasks;
113
142
  };
143
+ }
144
+
145
+ function runWalltimeBench(bench, rootCallingFile) {
146
+ bench.run = async () => {
147
+ console.log(
148
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (walltime mode)`
149
+ );
150
+ const originalRun = bench.run;
151
+ const benchProto = Object.getPrototypeOf(bench);
152
+ const prototypeRun = benchProto.run;
153
+ bench.run = prototypeRun;
154
+ const benchmarks = [];
155
+ for (const task of bench.tasks) {
156
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
157
+ const { fn } = task;
158
+ async function __codspeed_root_frame__() {
159
+ await fn();
160
+ }
161
+ task.fn = __codspeed_root_frame__;
162
+ if (bench.opts.warmup) {
163
+ await task.warmup();
164
+ }
165
+ await mongoMeasurement.start(uri);
166
+ InstrumentHooks.startBenchmark();
167
+ await task.run();
168
+ InstrumentHooks.stopBenchmark();
169
+ await mongoMeasurement.stop(uri);
170
+ if (task.result) {
171
+ const stats = convertTinybenchResultToBenchmarkStats(
172
+ task.result,
173
+ bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0
174
+ );
175
+ const benchmark = {
176
+ name: task.name,
177
+ uri,
178
+ config: {
179
+ max_rounds: bench.opts.iterations ?? null,
180
+ max_time_ns: bench.opts.time ? msToNs(bench.opts.time) : null,
181
+ min_round_time_ns: null,
182
+ // tinybench does not have an option for this
183
+ warmup_time_ns: bench.opts.warmup && bench.opts.warmupTime ? msToNs(bench.opts.warmupTime) : null
184
+ },
185
+ stats
186
+ };
187
+ benchmarks.push(benchmark);
188
+ console.log(` \u2714 Collected walltime data for ${uri}`);
189
+ InstrumentHooks.setExecutedBenchmark(process.pid, uri);
190
+ } else {
191
+ console.warn(` \u26A0 No result data available for ${uri}`);
192
+ }
193
+ }
194
+ if (benchmarks.length > 0) {
195
+ writeWalltimeResults(benchmarks, true);
196
+ }
197
+ console.log(
198
+ `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`
199
+ );
200
+ bench.run = originalRun;
201
+ return bench.tasks;
202
+ };
203
+ bench.runSync = () => {
204
+ console.log(
205
+ `[CodSpeed] running with @codspeed/tinybench v${"5.0.0-alpha.1"} (walltime mode)`
206
+ );
207
+ const originalRun = bench.run;
208
+ const benchProto = Object.getPrototypeOf(bench);
209
+ const prototypeRun = benchProto.run;
210
+ bench.run = prototypeRun;
211
+ const benchmarks = [];
212
+ for (const task of bench.tasks) {
213
+ let __codspeed_root_frame__2 = function() {
214
+ fn();
215
+ };
216
+ const uri = getTaskUri(bench, task.name, rootCallingFile);
217
+ if (bench.opts.warmup) {
218
+ task.warmup();
219
+ }
220
+ const { fn } = task;
221
+ task.fn = __codspeed_root_frame__2;
222
+ InstrumentHooks.startBenchmark();
223
+ task.runSync();
224
+ InstrumentHooks.stopBenchmark();
225
+ if (task.result) {
226
+ const stats = convertTinybenchResultToBenchmarkStats(
227
+ task.result,
228
+ bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0
229
+ );
230
+ const benchmark = {
231
+ name: task.name,
232
+ uri,
233
+ config: {
234
+ max_rounds: bench.opts.iterations ?? null,
235
+ max_time_ns: bench.opts.time ? msToNs(bench.opts.time) : null,
236
+ min_round_time_ns: null,
237
+ // tinybench does not have an option for this
238
+ warmup_time_ns: bench.opts.warmup && bench.opts.warmupTime ? msToNs(bench.opts.warmupTime) : null
239
+ },
240
+ stats
241
+ };
242
+ benchmarks.push(benchmark);
243
+ console.log(` \u2714 Collected walltime data for ${uri}`);
244
+ InstrumentHooks.setExecutedBenchmark(process.pid, uri);
245
+ } else {
246
+ console.warn(` \u26A0 No result data available for ${uri}`);
247
+ }
248
+ }
249
+ if (benchmarks.length > 0) {
250
+ writeWalltimeResults(benchmarks);
251
+ }
252
+ console.log(
253
+ `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`
254
+ );
255
+ bench.run = originalRun;
256
+ return bench.tasks;
257
+ };
258
+ }
259
+ function convertTinybenchResultToBenchmarkStats(result, warmupIterations) {
260
+ const { min, max, mean, sd, samples } = result.latency;
261
+ const sortedTimesNs = samples.map(msToNs).sort((a, b) => a - b);
262
+ const meanNs = msToNs(mean);
263
+ const stdevNs = msToNs(sd);
264
+ const { q1_ns, q3_ns, median_ns, iqr_outlier_rounds, stdev_outlier_rounds } = calculateQuantiles({ meanNs, stdevNs, sortedTimesNs });
265
+ return {
266
+ min_ns: msToNs(min),
267
+ max_ns: msToNs(max),
268
+ mean_ns: meanNs,
269
+ stdev_ns: stdevNs,
270
+ q1_ns,
271
+ median_ns,
272
+ q3_ns,
273
+ total_time: msToS(result.totalTime),
274
+ iter_per_round: 1,
275
+ // as there is only one round in tinybench, we define that there were n rounds of 1 iteration
276
+ rounds: sortedTimesNs.length,
277
+ iqr_outlier_rounds,
278
+ stdev_outlier_rounds,
279
+ warmup_iters: warmupIterations
280
+ };
281
+ }
282
+
283
+ tryIntrospect();
284
+ function withCodSpeed(bench) {
285
+ const codspeedRunnerMode = getCodspeedRunnerMode();
286
+ if (codspeedRunnerMode === "disabled") {
287
+ return bench;
288
+ }
289
+ setupCore();
290
+ const rootCallingFile = getCallingFile();
291
+ const uriMap = getOrCreateUriMap(bench);
292
+ const rawAdd = bench.add;
293
+ bench.add = (name, fn, opts) => {
294
+ const callingFile = getCallingFile();
295
+ let uri = callingFile;
296
+ if (bench.name !== void 0) {
297
+ uri += `::${bench.name}`;
298
+ }
299
+ uri += `::${name}`;
300
+ uriMap.set(name, uri);
301
+ return rawAdd.bind(bench)(name, fn, opts);
302
+ };
303
+ if (codspeedRunnerMode === "instrumented") {
304
+ runInstrumentedBench(bench, rootCallingFile);
305
+ } else if (codspeedRunnerMode === "walltime") {
306
+ runWalltimeBench(bench, rootCallingFile);
307
+ }
114
308
  return bench;
115
309
  }
116
310
  function getCallingFile() {
@@ -126,7 +320,7 @@ function getCallingFile() {
126
320
  return path.relative(gitDir, callingFile);
127
321
  }
128
322
  async function setupInstruments(body) {
129
- if (!Measurement.isInstrumented()) {
323
+ if (!InstrumentHooks.isInstrumented()) {
130
324
  console.warn("[CodSpeed] No instrumentation found, using default mongoUrl");
131
325
  return { remoteAddr: body.mongoUrl };
132
326
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.es5.js","sources":["../../../node_modules/.pnpm/stack-trace@1.0.0-pre2/node_modules/stack-trace/index.js","../src/index.ts"],"sourcesContent":["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\n","import {\n getGitDir,\n Measurement,\n mongoMeasurement,\n optimizeFunction,\n setupCore,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n teardownCore,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport path from \"path\";\nimport { get as getStackTrace } from \"stack-trace\";\nimport { Bench, Task } from \"tinybench\";\nimport { fileURLToPath } from \"url\";\n\ndeclare const __VERSION__: string;\n\ntryIntrospect();\n\ntype CodSpeedBenchOptions = Task[\"opts\"] & {\n uri: string;\n};\n\nfunction isCodSpeedBenchOptions(\n options: Task[\"opts\"]\n): options is CodSpeedBenchOptions {\n return \"uri\" in options;\n}\n\nexport function withCodSpeed(bench: Bench): Bench {\n if (!Measurement.isInstrumented()) {\n const rawRun = bench.run;\n bench.run = async () => {\n console.warn(\n `[CodSpeed] ${bench.tasks.length} benches detected but no instrumentation found, falling back to tinybench`\n );\n return await rawRun.bind(bench)();\n };\n return bench;\n }\n\n const rawAdd = bench.add;\n bench.add = (name, fn, opts: CodSpeedBenchOptions) => {\n const callingFile = getCallingFile();\n const uri = `${callingFile}::${name}`;\n const options = Object.assign({}, opts ?? {}, { uri });\n return rawAdd.bind(bench)(name, fn, options);\n };\n const rootCallingFile = getCallingFile();\n\n bench.run = async () => {\n console.log(`[CodSpeed] running with @codspeed/tinybench v${__VERSION__}`);\n setupCore();\n for (const task of bench.tasks) {\n const uri = isCodSpeedBenchOptions(task.opts)\n ? task.opts.uri\n : `${rootCallingFile}::${task.name}`;\n\n await task.opts.beforeAll?.call(task);\n\n // run optimizations\n await optimizeFunction(async () => {\n await task.opts.beforeEach?.call(task);\n await task.fn();\n await task.opts.afterEach?.call(task);\n });\n\n // run instrumented benchmark\n await task.opts.beforeEach?.call(task);\n\n await mongoMeasurement.start(uri);\n global.gc?.();\n await (async function __codspeed_root_frame__() {\n Measurement.startInstrumentation();\n await task.fn();\n Measurement.stopInstrumentation(uri);\n })();\n await mongoMeasurement.stop(uri);\n\n await task.opts.afterEach?.call(task);\n\n await task.opts.afterAll?.call(task);\n\n // print results\n console.log(` ✔ Measured ${uri}`);\n }\n teardownCore();\n console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);\n return bench.tasks;\n };\n return bench;\n}\n\nfunction getCallingFile(): string {\n const stack = getStackTrace();\n let callingFile = stack[2].getFileName(); // [here, withCodSpeed, actual caller]\n const gitDir = getGitDir(callingFile);\n if (gitDir === undefined) {\n throw new Error(\"Could not find a git repository\");\n }\n if (callingFile.startsWith(\"file://\")) {\n callingFile = fileURLToPath(callingFile);\n }\n return path.relative(gitDir, callingFile);\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody\n): Promise<SetupInstrumentsResponse> {\n if (!Measurement.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":["getStackTrace"],"mappings":"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","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.es5.js","sources":["../../../node_modules/.pnpm/stack-trace@1.0.0-pre2/node_modules/stack-trace/index.js","../src/uri.ts","../src/instrumented.ts","../src/walltime.ts","../src/index.ts"],"sourcesContent":["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\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 {\n InstrumentHooks,\n mongoMeasurement,\n optimizeFunction,\n teardownCore,\n} from \"@codspeed/core\";\nimport { Bench, Fn, FnOptions } from \"tinybench\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport function runInstrumentedBench(\n bench: Bench,\n rootCallingFile: string\n): void {\n bench.run = async () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (instrumented mode)`\n );\n\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // Access private fields\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n // Call beforeAll hook if it exists\n await fnOpts?.beforeAll?.call(task, \"run\");\n\n // run optimizations\n await optimizeFunction(async () => {\n await fnOpts?.beforeEach?.call(task, \"run\");\n await fn();\n await fnOpts?.afterEach?.call(task, \"run\");\n });\n\n // run instrumented benchmark\n await fnOpts?.beforeEach?.call(task, \"run\");\n\n await mongoMeasurement.start(uri);\n global.gc?.();\n await (async function __codspeed_root_frame__() {\n InstrumentHooks.startBenchmark();\n await fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n })();\n await mongoMeasurement.stop(uri);\n\n await fnOpts?.afterEach?.call(task, \"run\");\n\n await fnOpts?.afterAll?.call(task, \"run\");\n\n // print results\n console.log(\n ` ✔ ${\n InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\"\n } ${uri}`\n );\n }\n\n teardownCore();\n console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);\n return bench.tasks;\n };\n\n bench.runSync = () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (instrumented mode)`\n );\n\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // Access private fields\n const { fnOpts, fn } = task as unknown as { fnOpts?: FnOptions; fn: Fn };\n\n // Call beforeAll hook if it exists\n fnOpts?.beforeAll?.call(task, \"run\");\n\n // run optimizations\n optimizeFunction(async () => {\n fnOpts?.beforeEach?.call(task, \"run\");\n fn();\n fnOpts?.afterEach?.call(task, \"run\");\n });\n\n // run instrumented benchmark\n fnOpts?.beforeEach?.call(task, \"run\");\n\n // await mongoMeasurement.start(uri);\n global.gc?.();\n (function __codspeed_root_frame__() {\n InstrumentHooks.startBenchmark();\n fn();\n InstrumentHooks.stopBenchmark();\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n })();\n mongoMeasurement.stop(uri);\n\n fnOpts?.afterEach?.call(task, \"run\");\n\n fnOpts?.afterAll?.call(task, \"run\");\n\n // print results\n console.log(\n ` ✔ ${\n InstrumentHooks.isInstrumented() ? \"Measured\" : \"Checked\"\n } ${uri}`\n );\n }\n\n teardownCore();\n console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);\n return bench.tasks;\n };\n}\n","import {\n calculateQuantiles,\n InstrumentHooks,\n mongoMeasurement,\n msToNs,\n msToS,\n writeWalltimeResults,\n type Benchmark,\n type BenchmarkStats,\n} from \"@codspeed/core\";\nimport { Bench, Fn, TaskResult } from \"tinybench\";\nimport { getTaskUri } from \"./uri\";\n\ndeclare const __VERSION__: string;\n\nexport function runWalltimeBench(bench: Bench, rootCallingFile: string): void {\n bench.run = async () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (walltime mode)`\n );\n\n // Store the original run method before we override it\n const originalRun = bench.run;\n\n // Temporarily restore the original run to get actual benchmark results\n const benchProto = Object.getPrototypeOf(bench);\n const prototypeRun = benchProto.run;\n bench.run = prototypeRun;\n\n const benchmarks: Benchmark[] = [];\n\n // Collect and report walltime data\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // Override the function under test to add a static frame\n const { fn } = task as unknown as { fn: Fn };\n // eslint-disable-next-line no-inner-declarations\n async function __codspeed_root_frame__() {\n await fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n\n // run the warmup of the task right before its actual run\n if (bench.opts.warmup) {\n await task.warmup();\n }\n\n await mongoMeasurement.start(uri);\n InstrumentHooks.startBenchmark();\n await task.run();\n InstrumentHooks.stopBenchmark();\n await mongoMeasurement.stop(uri);\n\n if (task.result) {\n // Convert tinybench result to BenchmarkStats format\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0\n );\n\n const benchmark: Benchmark = {\n name: task.name,\n uri,\n config: {\n max_rounds: bench.opts.iterations ?? null,\n max_time_ns: bench.opts.time ? msToNs(bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n bench.opts.warmup && bench.opts.warmupTime\n ? msToNs(bench.opts.warmupTime)\n : null,\n },\n stats,\n };\n\n benchmarks.push(benchmark);\n console.log(` ✔ Collected walltime data for ${uri}`);\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n } else {\n console.warn(` ⚠ No result data available for ${uri}`);\n }\n }\n\n // Write results to JSON file using core function\n if (benchmarks.length > 0) {\n writeWalltimeResults(benchmarks, true);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`\n );\n // Restore our custom run method\n bench.run = originalRun;\n\n return bench.tasks;\n };\n\n bench.runSync = () => {\n console.log(\n `[CodSpeed] running with @codspeed/tinybench v${__VERSION__} (walltime mode)`\n );\n\n // Store the original run method before we override it\n const originalRun = bench.run;\n\n // Temporarily restore the original run to get actual benchmark results\n const benchProto = Object.getPrototypeOf(bench);\n const prototypeRun = benchProto.run;\n bench.run = prototypeRun;\n\n const benchmarks: Benchmark[] = [];\n\n // Collect and report walltime data\n for (const task of bench.tasks) {\n const uri = getTaskUri(bench, task.name, rootCallingFile);\n\n // run the warmup of the task right before its actual run\n if (bench.opts.warmup) {\n task.warmup();\n }\n\n // Override the function under test to add a static frame\n const { fn } = task as unknown as { fn: Fn };\n // eslint-disable-next-line no-inner-declarations\n function __codspeed_root_frame__() {\n fn();\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (task as any).fn = __codspeed_root_frame__;\n\n InstrumentHooks.startBenchmark();\n task.runSync();\n InstrumentHooks.stopBenchmark();\n\n if (task.result) {\n // Convert tinybench result to BenchmarkStats format\n const stats = convertTinybenchResultToBenchmarkStats(\n task.result,\n bench.opts.warmup ? bench.opts.warmupIterations ?? 0 : 0\n );\n\n const benchmark: Benchmark = {\n name: task.name,\n uri,\n config: {\n max_rounds: bench.opts.iterations ?? null,\n max_time_ns: bench.opts.time ? msToNs(bench.opts.time) : null,\n min_round_time_ns: null, // tinybench does not have an option for this\n warmup_time_ns:\n bench.opts.warmup && bench.opts.warmupTime\n ? msToNs(bench.opts.warmupTime)\n : null,\n },\n stats,\n };\n\n benchmarks.push(benchmark);\n console.log(` ✔ Collected walltime data for ${uri}`);\n InstrumentHooks.setExecutedBenchmark(process.pid, uri);\n } else {\n console.warn(` ⚠ No result data available for ${uri}`);\n }\n }\n\n // Write results to JSON file using core function\n if (benchmarks.length > 0) {\n writeWalltimeResults(benchmarks);\n }\n\n console.log(\n `[CodSpeed] Done collecting walltime data for ${bench.tasks.length} benches.`\n );\n // Restore our custom run method\n bench.run = originalRun;\n\n return bench.tasks;\n };\n}\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 getCodspeedRunnerMode,\n getGitDir,\n InstrumentHooks,\n mongoMeasurement,\n setupCore,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport path from \"path\";\nimport { get as getStackTrace } from \"stack-trace\";\nimport { Bench } from \"tinybench\";\nimport { fileURLToPath } from \"url\";\nimport { runInstrumentedBench } from \"./instrumented\";\nimport { getOrCreateUriMap } from \"./uri\";\nimport { runWalltimeBench } from \"./walltime\";\n\ntryIntrospect();\n\nexport function withCodSpeed(bench: Bench): Bench {\n const codspeedRunnerMode = getCodspeedRunnerMode();\n if (codspeedRunnerMode === \"disabled\") {\n return bench;\n }\n setupCore();\n\n const rootCallingFile = getCallingFile();\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();\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 if (codspeedRunnerMode === \"instrumented\") {\n runInstrumentedBench(bench, rootCallingFile);\n } else if (codspeedRunnerMode === \"walltime\") {\n runWalltimeBench(bench, rootCallingFile);\n }\n\n return bench;\n}\n\nfunction getCallingFile(): string {\n const stack = getStackTrace();\n let callingFile = stack[2].getFileName(); // [here, withCodSpeed, actual caller]\n const gitDir = getGitDir(callingFile);\n if (gitDir === undefined) {\n throw new Error(\"Could not find a git repository\");\n }\n if (callingFile.startsWith(\"file://\")) {\n callingFile = fileURLToPath(callingFile);\n }\n return path.relative(gitDir, callingFile);\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":["__codspeed_root_frame__","getStackTrace"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codspeed/tinybench-plugin",
3
- "version": "4.0.1",
3
+ "version": "5.0.0-alpha.1",
4
4
  "description": "tinybench compatibility layer for CodSpeed",
5
5
  "keywords": [
6
6
  "codspeed",
@@ -8,9 +8,15 @@
8
8
  "tinybench",
9
9
  "performance"
10
10
  ],
11
- "main": "dist/index.cjs.js",
11
+ "main": "dist/index.cjs",
12
12
  "module": "dist/index.es5.js",
13
13
  "types": "dist/index.d.ts",
14
+ "type": "module",
15
+ "exports": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.es5.js",
18
+ "require": "./dist/index.cjs"
19
+ },
14
20
  "files": [
15
21
  "dist"
16
22
  ],
@@ -20,14 +26,15 @@
20
26
  "license": "Apache-2.0",
21
27
  "devDependencies": {
22
28
  "@types/stack-trace": "^0.0.30",
23
- "jest-mock-extended": "^3.0.4",
24
- "tinybench": "^2.5.0"
29
+ "esbuild-register": "^3.4.2",
30
+ "tinybench": "^4.0.1",
31
+ "vitest": "^3.2.4"
25
32
  },
26
33
  "dependencies": {
27
- "@codspeed/core": "^4.0.1",
34
+ "@codspeed/core": "^5.0.0-alpha.1",
28
35
  "stack-trace": "1.0.0-pre2"
29
36
  },
30
37
  "peerDependencies": {
31
- "tinybench": "^2.3.0"
38
+ "tinybench": "^4.0.1"
32
39
  }
33
40
  }
package/dist/index.cjs.js DELETED
@@ -1,140 +0,0 @@
1
- 'use strict';
2
-
3
- var core = require('@codspeed/core');
4
- var path = require('path');
5
- var url = require('url');
6
-
7
- function get(belowFn) {
8
- const oldLimit = Error.stackTraceLimit;
9
- Error.stackTraceLimit = Infinity;
10
-
11
- const dummyObject = {};
12
-
13
- const v8Handler = Error.prepareStackTrace;
14
- Error.prepareStackTrace = function(dummyObject, v8StackTrace) {
15
- return v8StackTrace;
16
- };
17
- Error.captureStackTrace(dummyObject, belowFn || get);
18
-
19
- const v8StackTrace = dummyObject.stack;
20
- Error.prepareStackTrace = v8Handler;
21
- Error.stackTraceLimit = oldLimit;
22
-
23
- return v8StackTrace;
24
- }
25
-
26
- function CallSite(properties) {
27
- for (const property in properties) {
28
- this[property] = properties[property];
29
- }
30
- }
31
-
32
- const strProperties = [
33
- 'this',
34
- 'typeName',
35
- 'functionName',
36
- 'methodName',
37
- 'fileName',
38
- 'lineNumber',
39
- 'columnNumber',
40
- 'function',
41
- 'evalOrigin'
42
- ];
43
-
44
- const boolProperties = [
45
- 'topLevel',
46
- 'eval',
47
- 'native',
48
- 'constructor'
49
- ];
50
-
51
- strProperties.forEach(function (property) {
52
- CallSite.prototype[property] = null;
53
- CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {
54
- return this[property];
55
- };
56
- });
57
-
58
- boolProperties.forEach(function (property) {
59
- CallSite.prototype[property] = false;
60
- CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {
61
- return this[property];
62
- };
63
- });
64
-
65
- core.tryIntrospect();
66
- function isCodSpeedBenchOptions(options) {
67
- return "uri" in options;
68
- }
69
- function withCodSpeed(bench) {
70
- if (!core.Measurement.isInstrumented()) {
71
- const rawRun = bench.run;
72
- bench.run = async () => {
73
- console.warn(
74
- `[CodSpeed] ${bench.tasks.length} benches detected but no instrumentation found, falling back to tinybench`
75
- );
76
- return await rawRun.bind(bench)();
77
- };
78
- return bench;
79
- }
80
- const rawAdd = bench.add;
81
- bench.add = (name, fn, opts) => {
82
- const callingFile = getCallingFile();
83
- const uri = `${callingFile}::${name}`;
84
- const options = Object.assign({}, opts ?? {}, { uri });
85
- return rawAdd.bind(bench)(name, fn, options);
86
- };
87
- const rootCallingFile = getCallingFile();
88
- bench.run = async () => {
89
- console.log(`[CodSpeed] running with @codspeed/tinybench v${"4.0.1"}`);
90
- core.setupCore();
91
- for (const task of bench.tasks) {
92
- const uri = isCodSpeedBenchOptions(task.opts) ? task.opts.uri : `${rootCallingFile}::${task.name}`;
93
- await task.opts.beforeAll?.call(task);
94
- await core.optimizeFunction(async () => {
95
- await task.opts.beforeEach?.call(task);
96
- await task.fn();
97
- await task.opts.afterEach?.call(task);
98
- });
99
- await task.opts.beforeEach?.call(task);
100
- await core.mongoMeasurement.start(uri);
101
- global.gc?.();
102
- await async function __codspeed_root_frame__() {
103
- core.Measurement.startInstrumentation();
104
- await task.fn();
105
- core.Measurement.stopInstrumentation(uri);
106
- }();
107
- await core.mongoMeasurement.stop(uri);
108
- await task.opts.afterEach?.call(task);
109
- await task.opts.afterAll?.call(task);
110
- console.log(` \u2714 Measured ${uri}`);
111
- }
112
- core.teardownCore();
113
- console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);
114
- return bench.tasks;
115
- };
116
- return bench;
117
- }
118
- function getCallingFile() {
119
- const stack = get();
120
- let callingFile = stack[2].getFileName();
121
- const gitDir = core.getGitDir(callingFile);
122
- if (gitDir === void 0) {
123
- throw new Error("Could not find a git repository");
124
- }
125
- if (callingFile.startsWith("file://")) {
126
- callingFile = url.fileURLToPath(callingFile);
127
- }
128
- return path.relative(gitDir, callingFile);
129
- }
130
- async function setupInstruments(body) {
131
- if (!core.Measurement.isInstrumented()) {
132
- console.warn("[CodSpeed] No instrumentation found, using default mongoUrl");
133
- return { remoteAddr: body.mongoUrl };
134
- }
135
- return await core.mongoMeasurement.setupInstruments(body);
136
- }
137
-
138
- exports.setupInstruments = setupInstruments;
139
- exports.withCodSpeed = withCodSpeed;
140
- //# sourceMappingURL=index.cjs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../node_modules/.pnpm/stack-trace@1.0.0-pre2/node_modules/stack-trace/index.js","../src/index.ts"],"sourcesContent":["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\n","import {\n getGitDir,\n Measurement,\n mongoMeasurement,\n optimizeFunction,\n setupCore,\n SetupInstrumentsRequestBody,\n SetupInstrumentsResponse,\n teardownCore,\n tryIntrospect,\n} from \"@codspeed/core\";\nimport path from \"path\";\nimport { get as getStackTrace } from \"stack-trace\";\nimport { Bench, Task } from \"tinybench\";\nimport { fileURLToPath } from \"url\";\n\ndeclare const __VERSION__: string;\n\ntryIntrospect();\n\ntype CodSpeedBenchOptions = Task[\"opts\"] & {\n uri: string;\n};\n\nfunction isCodSpeedBenchOptions(\n options: Task[\"opts\"]\n): options is CodSpeedBenchOptions {\n return \"uri\" in options;\n}\n\nexport function withCodSpeed(bench: Bench): Bench {\n if (!Measurement.isInstrumented()) {\n const rawRun = bench.run;\n bench.run = async () => {\n console.warn(\n `[CodSpeed] ${bench.tasks.length} benches detected but no instrumentation found, falling back to tinybench`\n );\n return await rawRun.bind(bench)();\n };\n return bench;\n }\n\n const rawAdd = bench.add;\n bench.add = (name, fn, opts: CodSpeedBenchOptions) => {\n const callingFile = getCallingFile();\n const uri = `${callingFile}::${name}`;\n const options = Object.assign({}, opts ?? {}, { uri });\n return rawAdd.bind(bench)(name, fn, options);\n };\n const rootCallingFile = getCallingFile();\n\n bench.run = async () => {\n console.log(`[CodSpeed] running with @codspeed/tinybench v${__VERSION__}`);\n setupCore();\n for (const task of bench.tasks) {\n const uri = isCodSpeedBenchOptions(task.opts)\n ? task.opts.uri\n : `${rootCallingFile}::${task.name}`;\n\n await task.opts.beforeAll?.call(task);\n\n // run optimizations\n await optimizeFunction(async () => {\n await task.opts.beforeEach?.call(task);\n await task.fn();\n await task.opts.afterEach?.call(task);\n });\n\n // run instrumented benchmark\n await task.opts.beforeEach?.call(task);\n\n await mongoMeasurement.start(uri);\n global.gc?.();\n await (async function __codspeed_root_frame__() {\n Measurement.startInstrumentation();\n await task.fn();\n Measurement.stopInstrumentation(uri);\n })();\n await mongoMeasurement.stop(uri);\n\n await task.opts.afterEach?.call(task);\n\n await task.opts.afterAll?.call(task);\n\n // print results\n console.log(` ✔ Measured ${uri}`);\n }\n teardownCore();\n console.log(`[CodSpeed] Done running ${bench.tasks.length} benches.`);\n return bench.tasks;\n };\n return bench;\n}\n\nfunction getCallingFile(): string {\n const stack = getStackTrace();\n let callingFile = stack[2].getFileName(); // [here, withCodSpeed, actual caller]\n const gitDir = getGitDir(callingFile);\n if (gitDir === undefined) {\n throw new Error(\"Could not find a git repository\");\n }\n if (callingFile.startsWith(\"file://\")) {\n callingFile = fileURLToPath(callingFile);\n }\n return path.relative(gitDir, callingFile);\n}\n\n/**\n * Dynamically setup the CodSpeed instruments.\n */\nexport async function setupInstruments(\n body: SetupInstrumentsRequestBody\n): Promise<SetupInstrumentsResponse> {\n if (!Measurement.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":["tryIntrospect","Measurement","setupCore","optimizeFunction","mongoMeasurement","teardownCore","getStackTrace","getGitDir","fileURLToPath"],"mappings":"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","x_google_ignoreList":[0]}