@10up/block-renderer-benchmark 0.1.4
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/analysis/comparison.d.ts +29 -0
- package/dist/analysis/comparison.d.ts.map +1 -0
- package/dist/analysis/comparison.js +94 -0
- package/dist/analysis/comparison.js.map +1 -0
- package/dist/analysis/index.d.ts +6 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +6 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/regression.d.ts +34 -0
- package/dist/analysis/regression.d.ts.map +1 -0
- package/dist/analysis/regression.js +63 -0
- package/dist/analysis/regression.js.map +1 -0
- package/dist/cli/commands/compare.d.ts +9 -0
- package/dist/cli/commands/compare.d.ts.map +1 -0
- package/dist/cli/commands/compare.js +142 -0
- package/dist/cli/commands/compare.js.map +1 -0
- package/dist/cli/commands/report.d.ts +9 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +158 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/run.d.ts +9 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +107 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +165 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/reporters/console-reporter.d.ts +47 -0
- package/dist/reporters/console-reporter.d.ts.map +1 -0
- package/dist/reporters/console-reporter.js +191 -0
- package/dist/reporters/console-reporter.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +6 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/markdown-reporter.d.ts +32 -0
- package/dist/reporters/markdown-reporter.d.ts.map +1 -0
- package/dist/reporters/markdown-reporter.js +133 -0
- package/dist/reporters/markdown-reporter.js.map +1 -0
- package/dist/runner/benchmark-runner.d.ts +37 -0
- package/dist/runner/benchmark-runner.d.ts.map +1 -0
- package/dist/runner/benchmark-runner.js +133 -0
- package/dist/runner/benchmark-runner.js.map +1 -0
- package/dist/runner/index.d.ts +6 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +6 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/timing.d.ts +43 -0
- package/dist/runner/timing.d.ts.map +1 -0
- package/dist/runner/timing.js +115 -0
- package/dist/runner/timing.js.map +1 -0
- package/dist/runner/vitest-reporter.d.ts +38 -0
- package/dist/runner/vitest-reporter.d.ts.map +1 -0
- package/dist/runner/vitest-reporter.js +134 -0
- package/dist/runner/vitest-reporter.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/json-storage.d.ts +59 -0
- package/dist/storage/json-storage.d.ts.map +1 -0
- package/dist/storage/json-storage.js +142 -0
- package/dist/storage/json-storage.js.map +1 -0
- package/dist/storage/sqlite-storage.d.ts +72 -0
- package/dist/storage/sqlite-storage.d.ts.map +1 -0
- package/dist/storage/sqlite-storage.js +305 -0
- package/dist/storage/sqlite-storage.js.map +1 -0
- package/dist/types.d.ts +253 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest benchmark reporter
|
|
3
|
+
*
|
|
4
|
+
* Custom reporter that collects benchmark results from Vitest
|
|
5
|
+
* and stores them using the benchmark storage system.
|
|
6
|
+
*/
|
|
7
|
+
import { JsonStorage } from '../storage/json-storage.js';
|
|
8
|
+
import { SqliteStorage } from '../storage/sqlite-storage.js';
|
|
9
|
+
import { ConsoleReporter } from '../reporters/console-reporter.js';
|
|
10
|
+
import { getEnvironmentInfo, getGitInfo, generateRunId } from './benchmark-runner.js';
|
|
11
|
+
/**
|
|
12
|
+
* Vitest benchmark reporter
|
|
13
|
+
*/
|
|
14
|
+
export class VitestBenchmarkReporter {
|
|
15
|
+
options;
|
|
16
|
+
measurements = [];
|
|
17
|
+
startTime = '';
|
|
18
|
+
runId = '';
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.options = {
|
|
21
|
+
outputToConsole: true,
|
|
22
|
+
...options,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
onInit() {
|
|
26
|
+
this.startTime = new Date().toISOString();
|
|
27
|
+
this.runId = generateRunId();
|
|
28
|
+
this.measurements = [];
|
|
29
|
+
}
|
|
30
|
+
onFinished(files, errors) {
|
|
31
|
+
if (errors && errors.length > 0) {
|
|
32
|
+
console.error('Benchmark errors:', errors);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (!files || files.length === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Extract measurements from all benchmark files
|
|
39
|
+
for (const file of files) {
|
|
40
|
+
if (file.tasks) {
|
|
41
|
+
for (const task of file.tasks) {
|
|
42
|
+
this.extractFromTask(task);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (this.measurements.length === 0) {
|
|
47
|
+
console.log('No benchmark results found.');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Create run object
|
|
51
|
+
const run = {
|
|
52
|
+
id: this.runId,
|
|
53
|
+
startTime: this.startTime,
|
|
54
|
+
endTime: new Date().toISOString(),
|
|
55
|
+
duration: Date.now() - new Date(this.startTime).getTime(),
|
|
56
|
+
measurements: this.measurements,
|
|
57
|
+
environment: getEnvironmentInfo(),
|
|
58
|
+
git: getGitInfo(),
|
|
59
|
+
};
|
|
60
|
+
// Output to console if enabled
|
|
61
|
+
if (this.options.outputToConsole) {
|
|
62
|
+
const consoleReporter = new ConsoleReporter();
|
|
63
|
+
consoleReporter.reportRun(run);
|
|
64
|
+
}
|
|
65
|
+
// Save to SQLite if path provided
|
|
66
|
+
if (this.options.dbPath) {
|
|
67
|
+
try {
|
|
68
|
+
const sqliteStorage = new SqliteStorage(this.options.dbPath);
|
|
69
|
+
sqliteStorage.saveRun(run);
|
|
70
|
+
sqliteStorage.close();
|
|
71
|
+
console.log(`\nResults saved to database: ${this.options.dbPath}`);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('Failed to save to SQLite:', error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Update baseline if requested
|
|
78
|
+
if (this.options.updateBaseline && this.options.baselinePath) {
|
|
79
|
+
try {
|
|
80
|
+
const jsonStorage = new JsonStorage(this.options.baselinePath);
|
|
81
|
+
jsonStorage.updateFromRun(run);
|
|
82
|
+
console.log(`\nBaseline updated: ${this.options.baselinePath}`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error('Failed to update baseline:', error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
extractFromTask(task) {
|
|
90
|
+
// Check if this task has benchmark results
|
|
91
|
+
if (task.result?.benchmark) {
|
|
92
|
+
const benchmark = task.result.benchmark;
|
|
93
|
+
const name = task.name || 'unknown';
|
|
94
|
+
const [packageName, functionName] = name.includes('/')
|
|
95
|
+
? name.split('/', 2)
|
|
96
|
+
: ['unknown', name];
|
|
97
|
+
const samples = benchmark.samples ?? [];
|
|
98
|
+
const sortedSamples = [...samples].sort((a, b) => a - b);
|
|
99
|
+
const median = sortedSamples[Math.floor(sortedSamples.length / 2)] ?? benchmark.mean ?? 0;
|
|
100
|
+
const p95 = sortedSamples[Math.floor(sortedSamples.length * 0.95)] ?? benchmark.p99 ?? 0;
|
|
101
|
+
this.measurements.push({
|
|
102
|
+
runId: this.runId,
|
|
103
|
+
name,
|
|
104
|
+
package: packageName,
|
|
105
|
+
function: functionName,
|
|
106
|
+
timing: {
|
|
107
|
+
mean: benchmark.mean ?? 0,
|
|
108
|
+
median,
|
|
109
|
+
min: benchmark.min ?? 0,
|
|
110
|
+
max: benchmark.max ?? 0,
|
|
111
|
+
stdDev: benchmark.sd ?? 0,
|
|
112
|
+
p95,
|
|
113
|
+
p99: benchmark.p99 ?? 0,
|
|
114
|
+
},
|
|
115
|
+
iterations: samples.length || 0,
|
|
116
|
+
timestamp: new Date().toISOString(),
|
|
117
|
+
opsPerSecond: benchmark.hz,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Recurse into child tasks
|
|
121
|
+
if (task.tasks && Array.isArray(task.tasks)) {
|
|
122
|
+
for (const childTask of task.tasks) {
|
|
123
|
+
this.extractFromTask(childTask);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Create a Vitest benchmark reporter with the given options
|
|
130
|
+
*/
|
|
131
|
+
export function createBenchmarkReporter(options) {
|
|
132
|
+
return new VitestBenchmarkReporter(options);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=vitest-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-reporter.js","sourceRoot":"","sources":["../../src/runner/vitest-reporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON file storage for benchmark baselines
|
|
3
|
+
*
|
|
4
|
+
* Stores baseline measurements in a JSON file that can be committed to git
|
|
5
|
+
* for version control and easy diffing.
|
|
6
|
+
*/
|
|
7
|
+
import type { BaselineFile, BaselineEntry, BenchmarkMeasurement, BenchmarkRun } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* JSON storage for benchmark baselines
|
|
10
|
+
*/
|
|
11
|
+
export declare class JsonStorage {
|
|
12
|
+
private filePath;
|
|
13
|
+
constructor(filePath: string);
|
|
14
|
+
/**
|
|
15
|
+
* Load the baseline file
|
|
16
|
+
*/
|
|
17
|
+
load(): BaselineFile | null;
|
|
18
|
+
/**
|
|
19
|
+
* Save the baseline file
|
|
20
|
+
*/
|
|
21
|
+
save(baseline: BaselineFile): void;
|
|
22
|
+
/**
|
|
23
|
+
* Get a specific baseline entry
|
|
24
|
+
*/
|
|
25
|
+
getBaseline(name: string): BaselineEntry | null;
|
|
26
|
+
/**
|
|
27
|
+
* Update baselines from a benchmark run
|
|
28
|
+
*/
|
|
29
|
+
updateFromRun(run: BenchmarkRun): void;
|
|
30
|
+
/**
|
|
31
|
+
* Update baselines from individual measurements
|
|
32
|
+
*/
|
|
33
|
+
updateFromMeasurements(measurements: BenchmarkMeasurement[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get all baseline entries
|
|
36
|
+
*/
|
|
37
|
+
getAllBaselines(): Record<string, BaselineEntry>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if the baseline file exists
|
|
40
|
+
*/
|
|
41
|
+
exists(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get the file path
|
|
44
|
+
*/
|
|
45
|
+
getPath(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Create an empty baseline file
|
|
48
|
+
*/
|
|
49
|
+
initialize(): void;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Default baseline file path relative to project root
|
|
53
|
+
*/
|
|
54
|
+
export declare const DEFAULT_BASELINE_PATH = "benchmarks/baselines/baseline.json";
|
|
55
|
+
/**
|
|
56
|
+
* Create a JSON storage instance with the default path
|
|
57
|
+
*/
|
|
58
|
+
export declare function createJsonStorage(rootDir: string): JsonStorage;
|
|
59
|
+
//# sourceMappingURL=json-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-storage.d.ts","sourceRoot":"","sources":["../../src/storage/json-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKnG;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACH,IAAI,IAAI,YAAY,GAAG,IAAI;IAa3B;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAQlC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAK/C;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAwBtC;;OAEG;IACH,sBAAsB,CAAC,YAAY,EAAE,oBAAoB,EAAE,GAAG,IAAI;IAwBlE;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAKhD;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,UAAU,IAAI,IAAI;CAWnB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,uCAAuC,CAAC;AAE1E;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAE9D"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON file storage for benchmark baselines
|
|
3
|
+
*
|
|
4
|
+
* Stores baseline measurements in a JSON file that can be committed to git
|
|
5
|
+
* for version control and easy diffing.
|
|
6
|
+
*/
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import { getGitInfo } from '../runner/benchmark-runner.js';
|
|
10
|
+
const CURRENT_VERSION = 1;
|
|
11
|
+
/**
|
|
12
|
+
* JSON storage for benchmark baselines
|
|
13
|
+
*/
|
|
14
|
+
export class JsonStorage {
|
|
15
|
+
filePath;
|
|
16
|
+
constructor(filePath) {
|
|
17
|
+
this.filePath = filePath;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Load the baseline file
|
|
21
|
+
*/
|
|
22
|
+
load() {
|
|
23
|
+
try {
|
|
24
|
+
if (!fs.existsSync(this.filePath)) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const content = fs.readFileSync(this.filePath, 'utf-8');
|
|
28
|
+
return JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error(`Failed to load baseline file: ${error}`);
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Save the baseline file
|
|
37
|
+
*/
|
|
38
|
+
save(baseline) {
|
|
39
|
+
const dir = path.dirname(this.filePath);
|
|
40
|
+
if (!fs.existsSync(dir)) {
|
|
41
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
42
|
+
}
|
|
43
|
+
fs.writeFileSync(this.filePath, JSON.stringify(baseline, null, 2));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get a specific baseline entry
|
|
47
|
+
*/
|
|
48
|
+
getBaseline(name) {
|
|
49
|
+
const file = this.load();
|
|
50
|
+
return file?.baselines[name] ?? null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Update baselines from a benchmark run
|
|
54
|
+
*/
|
|
55
|
+
updateFromRun(run) {
|
|
56
|
+
const existing = this.load();
|
|
57
|
+
const gitInfo = getGitInfo();
|
|
58
|
+
const baseline = {
|
|
59
|
+
version: CURRENT_VERSION,
|
|
60
|
+
generated: new Date().toISOString(),
|
|
61
|
+
commit: gitInfo?.commitHash,
|
|
62
|
+
branch: gitInfo?.branch,
|
|
63
|
+
baselines: existing?.baselines ?? {},
|
|
64
|
+
};
|
|
65
|
+
for (const measurement of run.measurements) {
|
|
66
|
+
baseline.baselines[measurement.name] = {
|
|
67
|
+
mean: measurement.timing.mean,
|
|
68
|
+
median: measurement.timing.median,
|
|
69
|
+
p95: measurement.timing.p95,
|
|
70
|
+
iterations: measurement.iterations,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
this.save(baseline);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Update baselines from individual measurements
|
|
77
|
+
*/
|
|
78
|
+
updateFromMeasurements(measurements) {
|
|
79
|
+
const existing = this.load();
|
|
80
|
+
const gitInfo = getGitInfo();
|
|
81
|
+
const baseline = {
|
|
82
|
+
version: CURRENT_VERSION,
|
|
83
|
+
generated: new Date().toISOString(),
|
|
84
|
+
commit: gitInfo?.commitHash,
|
|
85
|
+
branch: gitInfo?.branch,
|
|
86
|
+
baselines: existing?.baselines ?? {},
|
|
87
|
+
};
|
|
88
|
+
for (const measurement of measurements) {
|
|
89
|
+
baseline.baselines[measurement.name] = {
|
|
90
|
+
mean: measurement.timing.mean,
|
|
91
|
+
median: measurement.timing.median,
|
|
92
|
+
p95: measurement.timing.p95,
|
|
93
|
+
iterations: measurement.iterations,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
this.save(baseline);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get all baseline entries
|
|
100
|
+
*/
|
|
101
|
+
getAllBaselines() {
|
|
102
|
+
const file = this.load();
|
|
103
|
+
return file?.baselines ?? {};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Check if the baseline file exists
|
|
107
|
+
*/
|
|
108
|
+
exists() {
|
|
109
|
+
return fs.existsSync(this.filePath);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the file path
|
|
113
|
+
*/
|
|
114
|
+
getPath() {
|
|
115
|
+
return this.filePath;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create an empty baseline file
|
|
119
|
+
*/
|
|
120
|
+
initialize() {
|
|
121
|
+
const gitInfo = getGitInfo();
|
|
122
|
+
const baseline = {
|
|
123
|
+
version: CURRENT_VERSION,
|
|
124
|
+
generated: new Date().toISOString(),
|
|
125
|
+
commit: gitInfo?.commitHash,
|
|
126
|
+
branch: gitInfo?.branch,
|
|
127
|
+
baselines: {},
|
|
128
|
+
};
|
|
129
|
+
this.save(baseline);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Default baseline file path relative to project root
|
|
134
|
+
*/
|
|
135
|
+
export const DEFAULT_BASELINE_PATH = 'benchmarks/baselines/baseline.json';
|
|
136
|
+
/**
|
|
137
|
+
* Create a JSON storage instance with the default path
|
|
138
|
+
*/
|
|
139
|
+
export function createJsonStorage(rootDir) {
|
|
140
|
+
return new JsonStorage(path.join(rootDir, DEFAULT_BASELINE_PATH));
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=json-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-storage.js","sourceRoot":"","sources":["../../src/storage/json-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite storage for historical benchmark data
|
|
3
|
+
*
|
|
4
|
+
* Stores all benchmark runs and measurements for trend analysis
|
|
5
|
+
* and historical comparisons.
|
|
6
|
+
*/
|
|
7
|
+
import type { BenchmarkRun, BenchmarkMeasurement } from '../types.js';
|
|
8
|
+
/**
|
|
9
|
+
* SQLite storage for benchmark data
|
|
10
|
+
*/
|
|
11
|
+
export declare class SqliteStorage {
|
|
12
|
+
private db;
|
|
13
|
+
private dbPath;
|
|
14
|
+
constructor(dbPath: string);
|
|
15
|
+
/**
|
|
16
|
+
* Initialize the database schema
|
|
17
|
+
*/
|
|
18
|
+
private initSchema;
|
|
19
|
+
/**
|
|
20
|
+
* Save a benchmark run
|
|
21
|
+
*/
|
|
22
|
+
saveRun(run: BenchmarkRun): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get the latest run
|
|
25
|
+
*/
|
|
26
|
+
getLatestRun(): BenchmarkRun | null;
|
|
27
|
+
/**
|
|
28
|
+
* Get a run by ID
|
|
29
|
+
*/
|
|
30
|
+
getRun(id: string): BenchmarkRun | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get a run by commit hash
|
|
33
|
+
*/
|
|
34
|
+
getRunByCommit(commitHash: string): BenchmarkRun | null;
|
|
35
|
+
/**
|
|
36
|
+
* Get recent runs
|
|
37
|
+
*/
|
|
38
|
+
getRecentRuns(limit?: number): BenchmarkRun[];
|
|
39
|
+
/**
|
|
40
|
+
* Get measurement history for a specific benchmark
|
|
41
|
+
*/
|
|
42
|
+
getMeasurementHistory(name: string, limit?: number): BenchmarkMeasurement[];
|
|
43
|
+
/**
|
|
44
|
+
* Get all measurements for a run
|
|
45
|
+
*/
|
|
46
|
+
private getMeasurementsForRun;
|
|
47
|
+
/**
|
|
48
|
+
* Load a run with its measurements
|
|
49
|
+
*/
|
|
50
|
+
private loadRunWithMeasurements;
|
|
51
|
+
/**
|
|
52
|
+
* Convert a measurement row to a BenchmarkMeasurement
|
|
53
|
+
*/
|
|
54
|
+
private rowToMeasurement;
|
|
55
|
+
/**
|
|
56
|
+
* Close the database connection
|
|
57
|
+
*/
|
|
58
|
+
close(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Get the database file path
|
|
61
|
+
*/
|
|
62
|
+
getPath(): string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Default database path relative to project root
|
|
66
|
+
*/
|
|
67
|
+
export declare const DEFAULT_DB_PATH = "benchmarks/.benchmark.db";
|
|
68
|
+
/**
|
|
69
|
+
* Create a SQLite storage instance with the default path
|
|
70
|
+
*/
|
|
71
|
+
export declare function createSqliteStorage(rootDir: string): SqliteStorage;
|
|
72
|
+
//# sourceMappingURL=sqlite-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-storage.d.ts","sourceRoot":"","sources":["../../src/storage/sqlite-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EAGrB,MAAM,aAAa,CAAC;AAoDrB;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAoB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAc1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI;IAsEhC;;OAEG;IACH,YAAY,IAAI,YAAY,GAAG,IAAI;IAWnC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IASvC;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAYvD;;OAEG;IACH,aAAa,CAAC,KAAK,GAAE,MAAW,GAAG,YAAY,EAAE;IAUjD;;OAEG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,oBAAoB,EAAE;IAa/E;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA8B/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,IAAI,MAAM;CAGlB;AA2CD;;GAEG;AACH,eAAO,MAAM,eAAe,6BAA6B,CAAC;AAE1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAElE"}
|