@benchkit/chart 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +640 -0
- package/dist/ComparisonSummaryTable.test.d.ts +2 -0
- package/dist/ComparisonSummaryTable.test.d.ts.map +1 -0
- package/dist/ComparisonSummaryTable.test.js +53 -0
- package/dist/ComparisonSummaryTable.test.js.map +1 -0
- package/dist/Dashboard.d.ts +25 -0
- package/dist/Dashboard.d.ts.map +1 -0
- package/dist/Dashboard.js +87 -0
- package/dist/Dashboard.js.map +1 -0
- package/dist/Dashboard.test.d.ts +2 -0
- package/dist/Dashboard.test.d.ts.map +1 -0
- package/dist/Dashboard.test.js +49 -0
- package/dist/Dashboard.test.js.map +1 -0
- package/dist/RunDashboard.d.ts +20 -0
- package/dist/RunDashboard.d.ts.map +1 -0
- package/dist/RunDashboard.js +174 -0
- package/dist/RunDashboard.js.map +1 -0
- package/dist/RunDashboard.test.d.ts +2 -0
- package/dist/RunDashboard.test.d.ts.map +1 -0
- package/dist/RunDashboard.test.js +58 -0
- package/dist/RunDashboard.test.js.map +1 -0
- package/dist/RunDetail.d.ts +26 -0
- package/dist/RunDetail.d.ts.map +1 -0
- package/dist/RunDetail.js +100 -0
- package/dist/RunDetail.js.map +1 -0
- package/dist/RunDetail.test.d.ts +2 -0
- package/dist/RunDetail.test.d.ts.map +1 -0
- package/dist/RunDetail.test.js +168 -0
- package/dist/RunDetail.test.js.map +1 -0
- package/dist/RunSelector.test.d.ts +2 -0
- package/dist/RunSelector.test.d.ts.map +1 -0
- package/dist/RunSelector.test.js +45 -0
- package/dist/RunSelector.test.js.map +1 -0
- package/dist/SampleChart.test.d.ts +2 -0
- package/dist/SampleChart.test.d.ts.map +1 -0
- package/dist/SampleChart.test.js +48 -0
- package/dist/SampleChart.test.js.map +1 -0
- package/dist/TagFilter.test.d.ts +2 -0
- package/dist/TagFilter.test.d.ts.map +1 -0
- package/dist/TagFilter.test.js +106 -0
- package/dist/TagFilter.test.js.map +1 -0
- package/dist/VerdictBanner.test.d.ts +2 -0
- package/dist/VerdictBanner.test.d.ts.map +1 -0
- package/dist/VerdictBanner.test.js +56 -0
- package/dist/VerdictBanner.test.js.map +1 -0
- package/dist/chart-config.d.ts +100 -0
- package/dist/chart-config.d.ts.map +1 -0
- package/dist/chart-config.js +81 -0
- package/dist/chart-config.js.map +1 -0
- package/dist/colors.d.ts +11 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +16 -0
- package/dist/colors.js.map +1 -0
- package/dist/comparison-transforms.d.ts +22 -0
- package/dist/comparison-transforms.d.ts.map +1 -0
- package/dist/comparison-transforms.js +20 -0
- package/dist/comparison-transforms.js.map +1 -0
- package/dist/comparison-transforms.test.d.ts +2 -0
- package/dist/comparison-transforms.test.d.ts.map +1 -0
- package/dist/comparison-transforms.test.js +75 -0
- package/dist/comparison-transforms.test.js.map +1 -0
- package/dist/components/ComparisonBar.d.ts +13 -0
- package/dist/components/ComparisonBar.d.ts.map +1 -0
- package/dist/components/ComparisonBar.js +94 -0
- package/dist/components/ComparisonBar.js.map +1 -0
- package/dist/components/ComparisonChart.d.ts +31 -0
- package/dist/components/ComparisonChart.d.ts.map +1 -0
- package/dist/components/ComparisonChart.js +118 -0
- package/dist/components/ComparisonChart.js.map +1 -0
- package/dist/components/ComparisonSummaryTable.d.ts +29 -0
- package/dist/components/ComparisonSummaryTable.d.ts.map +1 -0
- package/dist/components/ComparisonSummaryTable.js +41 -0
- package/dist/components/ComparisonSummaryTable.js.map +1 -0
- package/dist/components/DashboardToolbar.d.ts +21 -0
- package/dist/components/DashboardToolbar.d.ts.map +1 -0
- package/dist/components/DashboardToolbar.js +14 -0
- package/dist/components/DashboardToolbar.js.map +1 -0
- package/dist/components/DateRangeFilter.d.ts +19 -0
- package/dist/components/DateRangeFilter.d.ts.map +1 -0
- package/dist/components/DateRangeFilter.js +44 -0
- package/dist/components/DateRangeFilter.js.map +1 -0
- package/dist/components/HeroSection.d.ts +12 -0
- package/dist/components/HeroSection.d.ts.map +1 -0
- package/dist/components/HeroSection.js +6 -0
- package/dist/components/HeroSection.js.map +1 -0
- package/dist/components/Leaderboard.d.ts +9 -0
- package/dist/components/Leaderboard.d.ts.map +1 -0
- package/dist/components/Leaderboard.js +41 -0
- package/dist/components/Leaderboard.js.map +1 -0
- package/dist/components/MetricCard.d.ts +16 -0
- package/dist/components/MetricCard.d.ts.map +1 -0
- package/dist/components/MetricCard.js +25 -0
- package/dist/components/MetricCard.js.map +1 -0
- package/dist/components/MetricDetailView.d.ts +15 -0
- package/dist/components/MetricDetailView.d.ts.map +1 -0
- package/dist/components/MetricDetailView.js +11 -0
- package/dist/components/MetricDetailView.js.map +1 -0
- package/dist/components/MonitorSection.d.ts +21 -0
- package/dist/components/MonitorSection.d.ts.map +1 -0
- package/dist/components/MonitorSection.js +38 -0
- package/dist/components/MonitorSection.js.map +1 -0
- package/dist/components/OverviewGrid.d.ts +17 -0
- package/dist/components/OverviewGrid.d.ts.map +1 -0
- package/dist/components/OverviewGrid.js +15 -0
- package/dist/components/OverviewGrid.js.map +1 -0
- package/dist/components/RunSelector.d.ts +20 -0
- package/dist/components/RunSelector.d.ts.map +1 -0
- package/dist/components/RunSelector.js +53 -0
- package/dist/components/RunSelector.js.map +1 -0
- package/dist/components/RunTable.d.ts +13 -0
- package/dist/components/RunTable.d.ts.map +1 -0
- package/dist/components/RunTable.js +24 -0
- package/dist/components/RunTable.js.map +1 -0
- package/dist/components/SampleChart.d.ts +21 -0
- package/dist/components/SampleChart.d.ts.map +1 -0
- package/dist/components/SampleChart.js +77 -0
- package/dist/components/SampleChart.js.map +1 -0
- package/dist/components/TagFilter.d.ts +12 -0
- package/dist/components/TagFilter.d.ts.map +1 -0
- package/dist/components/TagFilter.js +59 -0
- package/dist/components/TagFilter.js.map +1 -0
- package/dist/components/TrendChart.d.ts +25 -0
- package/dist/components/TrendChart.d.ts.map +1 -0
- package/dist/components/TrendChart.js +95 -0
- package/dist/components/TrendChart.js.map +1 -0
- package/dist/components/VerdictBanner.d.ts +13 -0
- package/dist/components/VerdictBanner.d.ts.map +1 -0
- package/dist/components/VerdictBanner.js +22 -0
- package/dist/components/VerdictBanner.js.map +1 -0
- package/dist/dashboard-labels.d.ts +47 -0
- package/dist/dashboard-labels.d.ts.map +1 -0
- package/dist/dashboard-labels.js +44 -0
- package/dist/dashboard-labels.js.map +1 -0
- package/dist/dashboard-labels.test.d.ts +2 -0
- package/dist/dashboard-labels.test.d.ts.map +1 -0
- package/dist/dashboard-labels.test.js +34 -0
- package/dist/dashboard-labels.test.js.map +1 -0
- package/dist/dataset-transforms.d.ts +41 -0
- package/dist/dataset-transforms.d.ts.map +1 -0
- package/dist/dataset-transforms.js +132 -0
- package/dist/dataset-transforms.js.map +1 -0
- package/dist/dataset-transforms.test.d.ts +2 -0
- package/dist/dataset-transforms.test.d.ts.map +1 -0
- package/dist/dataset-transforms.test.js +208 -0
- package/dist/dataset-transforms.test.js.map +1 -0
- package/dist/date-range.test.d.ts +2 -0
- package/dist/date-range.test.d.ts.map +1 -0
- package/dist/date-range.test.js +116 -0
- package/dist/date-range.test.js.map +1 -0
- package/dist/embed.d.ts +45 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +170 -0
- package/dist/embed.js.map +1 -0
- package/dist/embed.test.d.ts +2 -0
- package/dist/embed.test.d.ts.map +1 -0
- package/dist/embed.test.js +15 -0
- package/dist/embed.test.js.map +1 -0
- package/dist/fetch.d.ts +27 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +73 -0
- package/dist/fetch.js.map +1 -0
- package/dist/fetch.test.d.ts +2 -0
- package/dist/fetch.test.d.ts.map +1 -0
- package/dist/fetch.test.js +75 -0
- package/dist/fetch.test.js.map +1 -0
- package/dist/format-utils.d.ts +48 -0
- package/dist/format-utils.d.ts.map +1 -0
- package/dist/format-utils.js +98 -0
- package/dist/format-utils.js.map +1 -0
- package/dist/format-utils.test.d.ts +2 -0
- package/dist/format-utils.test.d.ts.map +1 -0
- package/dist/format-utils.test.js +103 -0
- package/dist/format-utils.test.js.map +1 -0
- package/dist/hooks/useChartLifecycle.d.ts +20 -0
- package/dist/hooks/useChartLifecycle.d.ts.map +1 -0
- package/dist/hooks/useChartLifecycle.js +46 -0
- package/dist/hooks/useChartLifecycle.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +10 -0
- package/dist/index.test.js.map +1 -0
- package/dist/labels.d.ts +5 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +41 -0
- package/dist/labels.js.map +1 -0
- package/dist/labels.test.d.ts +2 -0
- package/dist/labels.test.d.ts.map +1 -0
- package/dist/labels.test.js +28 -0
- package/dist/labels.test.js.map +1 -0
- package/dist/leaderboard.d.ts +29 -0
- package/dist/leaderboard.d.ts.map +1 -0
- package/dist/leaderboard.js +40 -0
- package/dist/leaderboard.js.map +1 -0
- package/dist/leaderboard.test.d.ts +2 -0
- package/dist/leaderboard.test.d.ts.map +1 -0
- package/dist/leaderboard.test.js +105 -0
- package/dist/leaderboard.test.js.map +1 -0
- package/dist/sample-utils.d.ts +4 -0
- package/dist/sample-utils.d.ts.map +1 -0
- package/dist/sample-utils.js +12 -0
- package/dist/sample-utils.js.map +1 -0
- package/dist/style.css +912 -0
- package/dist/theme.d.ts +12 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +17 -0
- package/dist/theme.js.map +1 -0
- package/dist/utils.d.ts +37 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +63 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +196 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared formatting utilities used across chart components.
|
|
3
|
+
*/
|
|
4
|
+
const compactFormatter = new Intl.NumberFormat("en-US", {
|
|
5
|
+
notation: "compact",
|
|
6
|
+
maximumFractionDigits: 1,
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* Format a numeric value for display.
|
|
10
|
+
*
|
|
11
|
+
* When `compact` is true, large numbers are abbreviated (e.g. 1.2K).
|
|
12
|
+
* Otherwise values ≥ 100 show no decimals, smaller values show up to 2.
|
|
13
|
+
*/
|
|
14
|
+
export function formatValue(value, compact = false) {
|
|
15
|
+
if (compact)
|
|
16
|
+
return compactFormatter.format(value);
|
|
17
|
+
return value.toLocaleString("en-US", {
|
|
18
|
+
maximumFractionDigits: value >= 100 ? 0 : 2,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Format a numeric value with fixed decimal places.
|
|
23
|
+
*
|
|
24
|
+
* Integers get no decimals, values ≥ 100 get 1 decimal, others get 2.
|
|
25
|
+
* Unlike {@link formatValue} this uses `toFixed` so trailing zeros are
|
|
26
|
+
* preserved (useful in tabular data where column alignment matters).
|
|
27
|
+
*/
|
|
28
|
+
export function formatFixedValue(value) {
|
|
29
|
+
if (Number.isInteger(value))
|
|
30
|
+
return value.toFixed(0);
|
|
31
|
+
if (Math.abs(value) >= 100)
|
|
32
|
+
return value.toFixed(1);
|
|
33
|
+
return value.toFixed(2);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format a git ref for human-readable display.
|
|
37
|
+
*
|
|
38
|
+
* Strips common prefixes (`refs/heads/`, `refs/tags/`, `refs/pull/…/merge`)
|
|
39
|
+
* and returns a short label. Returns `"—"` for undefined/empty refs.
|
|
40
|
+
*/
|
|
41
|
+
export function formatRef(ref) {
|
|
42
|
+
if (!ref)
|
|
43
|
+
return "—";
|
|
44
|
+
const prMatch = /^refs\/pull\/(\d+)\/merge$/.exec(ref);
|
|
45
|
+
if (prMatch)
|
|
46
|
+
return `PR #${prMatch[1]}`;
|
|
47
|
+
if (ref.startsWith("refs/heads/"))
|
|
48
|
+
return ref.replace("refs/heads/", "");
|
|
49
|
+
if (ref.startsWith("refs/tags/"))
|
|
50
|
+
return `tag ${ref.replace("refs/tags/", "")}`;
|
|
51
|
+
return ref;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Format a percentage change with sign.
|
|
55
|
+
*
|
|
56
|
+
* Positive values get a `+` prefix, negative values keep their `-`.
|
|
57
|
+
*/
|
|
58
|
+
export function formatPct(pct) {
|
|
59
|
+
const sign = pct > 0 ? "+" : "";
|
|
60
|
+
return `${sign}${pct.toFixed(2)}%`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Format a run timestamp for compact UI display.
|
|
64
|
+
*
|
|
65
|
+
* Returns the original input when it is not a valid date string.
|
|
66
|
+
*/
|
|
67
|
+
export function formatTimestamp(iso) {
|
|
68
|
+
const date = new Date(iso);
|
|
69
|
+
if (Number.isNaN(date.getTime()))
|
|
70
|
+
return iso;
|
|
71
|
+
return date.toLocaleDateString(undefined, {
|
|
72
|
+
month: "short",
|
|
73
|
+
day: "numeric",
|
|
74
|
+
hour: "2-digit",
|
|
75
|
+
minute: "2-digit",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Format a commit SHA as a short display-friendly hash.
|
|
80
|
+
*
|
|
81
|
+
* Returns an en dash when no commit is available.
|
|
82
|
+
*/
|
|
83
|
+
export function shortCommit(commit) {
|
|
84
|
+
return commit ? commit.slice(0, 7) : "–";
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format metric direction semantics for human-readable UI copy.
|
|
88
|
+
*/
|
|
89
|
+
export function formatDirection(direction) {
|
|
90
|
+
if (direction === "smaller_is_better") {
|
|
91
|
+
return "↓ smaller";
|
|
92
|
+
}
|
|
93
|
+
if (direction === "bigger_is_better") {
|
|
94
|
+
return "↑ bigger";
|
|
95
|
+
}
|
|
96
|
+
return direction ? `? ${direction}` : "unknown";
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=format-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../src/format-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-utils.test.d.ts","sourceRoot":"","sources":["../src/format-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { formatDirection, formatFixedValue, formatPct, formatRef, formatTimestamp, formatValue, shortCommit, } from "./format-utils.js";
|
|
4
|
+
describe("format-utils", () => {
|
|
5
|
+
describe("formatValue", () => {
|
|
6
|
+
it("formats large values without decimals", () => {
|
|
7
|
+
assert.equal(formatValue(1234), "1,234");
|
|
8
|
+
});
|
|
9
|
+
it("formats small values with up to 2 decimals", () => {
|
|
10
|
+
const result = formatValue(3.14159);
|
|
11
|
+
assert.ok(result.includes("3.14"), `Expected "3.14" in "${result}"`);
|
|
12
|
+
});
|
|
13
|
+
it("formats values in compact mode", () => {
|
|
14
|
+
const result = formatValue(1500, true);
|
|
15
|
+
assert.ok(result.includes("1.5K") || result.includes("2K"), `Expected compact notation in "${result}"`);
|
|
16
|
+
});
|
|
17
|
+
it("formats zero", () => {
|
|
18
|
+
assert.equal(formatValue(0), "0");
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe("formatFixedValue", () => {
|
|
22
|
+
it("shows integers without decimals", () => {
|
|
23
|
+
assert.equal(formatFixedValue(320), "320");
|
|
24
|
+
});
|
|
25
|
+
it("shows 1 decimal for large floats", () => {
|
|
26
|
+
assert.equal(formatFixedValue(1234.567), "1234.6");
|
|
27
|
+
});
|
|
28
|
+
it("shows 2 decimals for small floats", () => {
|
|
29
|
+
assert.equal(formatFixedValue(3.14159), "3.14");
|
|
30
|
+
});
|
|
31
|
+
it("shows 0 decimals for integer zero", () => {
|
|
32
|
+
assert.equal(formatFixedValue(0), "0");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("formatRef", () => {
|
|
36
|
+
it("formats PR merge refs", () => {
|
|
37
|
+
assert.equal(formatRef("refs/pull/42/merge"), "PR #42");
|
|
38
|
+
});
|
|
39
|
+
it("strips refs/heads/ prefix", () => {
|
|
40
|
+
assert.equal(formatRef("refs/heads/main"), "main");
|
|
41
|
+
});
|
|
42
|
+
it("formats tag refs", () => {
|
|
43
|
+
assert.equal(formatRef("refs/tags/v1.0.0"), "tag v1.0.0");
|
|
44
|
+
});
|
|
45
|
+
it("returns unknown refs as-is", () => {
|
|
46
|
+
assert.equal(formatRef("some/other/ref"), "some/other/ref");
|
|
47
|
+
});
|
|
48
|
+
it("returns em-dash for undefined", () => {
|
|
49
|
+
assert.equal(formatRef(undefined), "—");
|
|
50
|
+
});
|
|
51
|
+
it("returns em-dash for empty string", () => {
|
|
52
|
+
assert.equal(formatRef(""), "—");
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("formatPct", () => {
|
|
56
|
+
it("adds + sign for positive values", () => {
|
|
57
|
+
assert.equal(formatPct(12.345), "+12.35%");
|
|
58
|
+
});
|
|
59
|
+
it("preserves - sign for negative values", () => {
|
|
60
|
+
assert.equal(formatPct(-7.891), "-7.89%");
|
|
61
|
+
});
|
|
62
|
+
it("shows no sign for zero", () => {
|
|
63
|
+
assert.equal(formatPct(0), "0.00%");
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe("formatTimestamp", () => {
|
|
67
|
+
it("returns a formatted string for valid ISO dates", () => {
|
|
68
|
+
const result = formatTimestamp("2026-04-01T10:30:00Z");
|
|
69
|
+
assert.ok(typeof result === "string");
|
|
70
|
+
assert.ok(result.length > 0);
|
|
71
|
+
assert.notEqual(result, "2026-04-01T10:30:00Z");
|
|
72
|
+
});
|
|
73
|
+
it("returns raw input for invalid dates", () => {
|
|
74
|
+
assert.equal(formatTimestamp("not-a-date"), "not-a-date");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe("shortCommit", () => {
|
|
78
|
+
it("truncates to 7 characters", () => {
|
|
79
|
+
assert.equal(shortCommit("abc123def456"), "abc123d");
|
|
80
|
+
});
|
|
81
|
+
it("returns a dash for undefined", () => {
|
|
82
|
+
assert.equal(shortCommit(undefined), "–");
|
|
83
|
+
});
|
|
84
|
+
it("handles short commits", () => {
|
|
85
|
+
assert.equal(shortCommit("abc"), "abc");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe("formatDirection", () => {
|
|
89
|
+
it("formats smaller-is-better directions", () => {
|
|
90
|
+
assert.equal(formatDirection("smaller_is_better"), "↓ smaller");
|
|
91
|
+
});
|
|
92
|
+
it("formats bigger-is-better directions", () => {
|
|
93
|
+
assert.equal(formatDirection("bigger_is_better"), "↑ bigger");
|
|
94
|
+
});
|
|
95
|
+
it("shows a clear fallback for unknown directions", () => {
|
|
96
|
+
assert.equal(formatDirection("sideways_is_better"), "? sideways_is_better");
|
|
97
|
+
});
|
|
98
|
+
it("shows unknown when no direction is provided", () => {
|
|
99
|
+
assert.equal(formatDirection(""), "unknown");
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=format-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-utils.test.js","sourceRoot":"","sources":["../src/format-utils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RefObject } from "preact";
|
|
2
|
+
import { type ChartType, type ChartConfiguration } from "chart.js";
|
|
3
|
+
import { type ChartTheme } from "../theme.js";
|
|
4
|
+
export interface ChartLifecycleResult {
|
|
5
|
+
canvasRef: RefObject<HTMLCanvasElement>;
|
|
6
|
+
wrapperRef: RefObject<HTMLDivElement>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Shared Chart.js lifecycle hook.
|
|
10
|
+
*
|
|
11
|
+
* Manages canvas/wrapper refs, chart creation, updates, and cleanup.
|
|
12
|
+
* The caller provides a builder function that receives the theme and
|
|
13
|
+
* returns `null` (skip render) or a chart configuration.
|
|
14
|
+
*
|
|
15
|
+
* @param builder - Called on each effect run. Return null to destroy the chart,
|
|
16
|
+
* or return { type, data, options } to create/update it.
|
|
17
|
+
* @param deps - Dependency array for the effect (same semantics as useEffect).
|
|
18
|
+
*/
|
|
19
|
+
export declare function useChartLifecycle<T extends ChartType>(builder: (theme: ChartTheme) => ChartConfiguration<T> | null, deps: unknown[]): ChartLifecycleResult;
|
|
20
|
+
//# sourceMappingURL=useChartLifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChartLifecycle.d.ts","sourceRoot":"","sources":["../../src/hooks/useChartLifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACxC,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,SAAS,EACnD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,EAC5D,IAAI,EAAE,OAAO,EAAE,GACd,oBAAoB,CAiCtB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useRef, useEffect } from "preact/hooks";
|
|
2
|
+
import { Chart, } from "chart.js";
|
|
3
|
+
import { getChartTheme } from "../theme.js";
|
|
4
|
+
/**
|
|
5
|
+
* Shared Chart.js lifecycle hook.
|
|
6
|
+
*
|
|
7
|
+
* Manages canvas/wrapper refs, chart creation, updates, and cleanup.
|
|
8
|
+
* The caller provides a builder function that receives the theme and
|
|
9
|
+
* returns `null` (skip render) or a chart configuration.
|
|
10
|
+
*
|
|
11
|
+
* @param builder - Called on each effect run. Return null to destroy the chart,
|
|
12
|
+
* or return { type, data, options } to create/update it.
|
|
13
|
+
* @param deps - Dependency array for the effect (same semantics as useEffect).
|
|
14
|
+
*/
|
|
15
|
+
export function useChartLifecycle(builder, deps) {
|
|
16
|
+
const wrapperRef = useRef(null);
|
|
17
|
+
const canvasRef = useRef(null);
|
|
18
|
+
const chartRef = useRef(null);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!canvasRef.current || !wrapperRef.current)
|
|
21
|
+
return;
|
|
22
|
+
const theme = getChartTheme(wrapperRef.current);
|
|
23
|
+
const config = builder(theme);
|
|
24
|
+
if (!config) {
|
|
25
|
+
chartRef.current?.destroy();
|
|
26
|
+
chartRef.current = null;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (chartRef.current) {
|
|
30
|
+
chartRef.current.data = config.data;
|
|
31
|
+
if (config.options)
|
|
32
|
+
chartRef.current.options = config.options;
|
|
33
|
+
chartRef.current.update();
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
chartRef.current = new Chart(canvasRef.current, config);
|
|
37
|
+
}
|
|
38
|
+
return () => {
|
|
39
|
+
chartRef.current?.destroy();
|
|
40
|
+
chartRef.current = null;
|
|
41
|
+
};
|
|
42
|
+
// eslint-disable-next-line
|
|
43
|
+
}, deps);
|
|
44
|
+
return { canvasRef, wrapperRef };
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=useChartLifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useChartLifecycle.js","sourceRoot":"","sources":["../../src/hooks/useChartLifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EACL,KAAK,GAGN,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAmB,MAAM,aAAa,CAAC;AAO7D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAA4D,EAC5D,IAAe;IAEf,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO;YAAE,OAAO;QAEtD,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAE9B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC5B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACpC,IAAI,MAAM,CAAC,OAAO;gBAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAgB,CAAC;YACvE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,OAAO,GAAG,IAAI,KAAK,CAAI,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YAC5B,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC;QACF,2BAA2B;IAC7B,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export { TrendChart, type TrendChartProps } from "./components/TrendChart.js";
|
|
2
|
+
export { ComparisonChart, type ComparisonChartProps } from "./components/ComparisonChart.js";
|
|
3
|
+
export { SampleChart, type SampleChartProps } from "./components/SampleChart.js";
|
|
4
|
+
export { ComparisonBar, type ComparisonBarProps } from "./components/ComparisonBar.js";
|
|
5
|
+
export { RunTable, type RunTableProps } from "./components/RunTable.js";
|
|
6
|
+
export { MonitorSection, type MonitorSectionProps } from "./components/MonitorSection.js";
|
|
7
|
+
export { TagFilter, type TagFilterProps, extractTags, filterSeriesFile } from "./components/TagFilter.js";
|
|
8
|
+
export { DateRangeFilter, type DateRangeFilterProps, type DateRangePreset, type DateRange, presetToDateRange, filterSeriesFileByDateRange } from "./components/DateRangeFilter.js";
|
|
9
|
+
export { Leaderboard, type LeaderboardProps } from "./components/Leaderboard.js";
|
|
10
|
+
export { VerdictBanner, type VerdictBannerProps } from "./components/VerdictBanner.js";
|
|
11
|
+
export { ComparisonSummaryTable, type ComparisonSummaryTableProps } from "./components/ComparisonSummaryTable.js";
|
|
12
|
+
export { RunSelector, type RunSelectorProps } from "./components/RunSelector.js";
|
|
13
|
+
export { Dashboard, type DashboardProps } from "./Dashboard.js";
|
|
14
|
+
export { RunDashboard, type RunDashboardProps } from "./RunDashboard.js";
|
|
15
|
+
export { RunDetail, type RunDetailProps, type MetricSnapshotCardProps, MetricSnapshotCard } from "./RunDetail.js";
|
|
16
|
+
export { type DashboardLabels, defaultDashboardLabels, resolveLabels } from "./dashboard-labels.js";
|
|
17
|
+
export { formatValue, formatFixedValue, formatRef, formatPct, formatTimestamp, shortCommit, formatDirection, } from "./format-utils.js";
|
|
18
|
+
export { fetchIndex, fetchSeries, fetchRun, fetchPrIndex, fetchRefIndex, fetchMetricSummary, fetchRunDetail, compareRuns, type DataSource } from "./fetch.js";
|
|
19
|
+
export { rankSeries, getWinner, type RankedEntry } from "./leaderboard.js";
|
|
20
|
+
export { useChartLifecycle, type ChartLifecycleResult } from "./hooks/useChartLifecycle.js";
|
|
21
|
+
export { detectRegressions, regressionTooltip, type RegressionResult } from "./utils.js";
|
|
22
|
+
export { defaultMetricLabel, defaultMonitorMetricLabel, isMonitorMetric } from "./labels.js";
|
|
23
|
+
export { samplesToDataPoints, dataPointsToComparisonData } from "./comparison-transforms.js";
|
|
24
|
+
export { extractSampleMetrics } from "./sample-utils.js";
|
|
25
|
+
export { transformSeriesDataset, partitionSeriesMap, applyDateRangeToMap, detectAllRegressions, partitionSnapshots, type DatasetAggregate, type DatasetFilter, type TransformSeriesDatasetOptions, } from "./dataset-transforms.js";
|
|
26
|
+
export { mount, type EmbedOptions, type EmbedMode } from "./embed.js";
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACnL,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,KAAK,2BAA2B,EAAE,MAAM,wCAAwC,CAAC;AAClH,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGlH,OAAO,EAAE,KAAK,eAAe,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGpG,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG9J,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAE5F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,6BAA6B,GACnC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Components
|
|
2
|
+
export { TrendChart } from "./components/TrendChart.js";
|
|
3
|
+
export { ComparisonChart } from "./components/ComparisonChart.js";
|
|
4
|
+
export { SampleChart } from "./components/SampleChart.js";
|
|
5
|
+
export { ComparisonBar } from "./components/ComparisonBar.js";
|
|
6
|
+
export { RunTable } from "./components/RunTable.js";
|
|
7
|
+
export { MonitorSection } from "./components/MonitorSection.js";
|
|
8
|
+
export { TagFilter, extractTags, filterSeriesFile } from "./components/TagFilter.js";
|
|
9
|
+
export { DateRangeFilter, presetToDateRange, filterSeriesFileByDateRange } from "./components/DateRangeFilter.js";
|
|
10
|
+
export { Leaderboard } from "./components/Leaderboard.js";
|
|
11
|
+
export { VerdictBanner } from "./components/VerdictBanner.js";
|
|
12
|
+
export { ComparisonSummaryTable } from "./components/ComparisonSummaryTable.js";
|
|
13
|
+
export { RunSelector } from "./components/RunSelector.js";
|
|
14
|
+
export { Dashboard } from "./Dashboard.js";
|
|
15
|
+
export { RunDashboard } from "./RunDashboard.js";
|
|
16
|
+
export { RunDetail, MetricSnapshotCard } from "./RunDetail.js";
|
|
17
|
+
// Label customization
|
|
18
|
+
export { defaultDashboardLabels, resolveLabels } from "./dashboard-labels.js";
|
|
19
|
+
// Shared formatting utilities
|
|
20
|
+
export { formatValue, formatFixedValue, formatRef, formatPct, formatTimestamp, shortCommit, formatDirection, } from "./format-utils.js";
|
|
21
|
+
// Data fetching
|
|
22
|
+
export { fetchIndex, fetchSeries, fetchRun, fetchPrIndex, fetchRefIndex, fetchMetricSummary, fetchRunDetail, compareRuns } from "./fetch.js";
|
|
23
|
+
// Ranking utilities
|
|
24
|
+
export { rankSeries, getWinner } from "./leaderboard.js";
|
|
25
|
+
// Hooks
|
|
26
|
+
export { useChartLifecycle } from "./hooks/useChartLifecycle.js";
|
|
27
|
+
// Utilities
|
|
28
|
+
export { detectRegressions, regressionTooltip } from "./utils.js";
|
|
29
|
+
export { defaultMetricLabel, defaultMonitorMetricLabel, isMonitorMetric } from "./labels.js";
|
|
30
|
+
export { samplesToDataPoints, dataPointsToComparisonData } from "./comparison-transforms.js";
|
|
31
|
+
export { extractSampleMetrics } from "./sample-utils.js";
|
|
32
|
+
// Dataset-local transform layer
|
|
33
|
+
export { transformSeriesDataset, partitionSeriesMap, applyDateRangeToMap, detectAllRegressions, partitionSnapshots, } from "./dataset-transforms.js";
|
|
34
|
+
// Embed API (also available via @benchkit/chart/embed)
|
|
35
|
+
export { mount } from "./embed.js";
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,UAAU,EAAwB,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAA6B,MAAM,iCAAiC,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,cAAc,EAA4B,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAuB,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAmE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AACnL,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAoC,MAAM,wCAAwC,CAAC;AAClH,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,YAAY,EAA0B,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAqD,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAElH,sBAAsB;AACtB,OAAO,EAAwB,sBAAsB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEpG,8BAA8B;AAC9B,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,eAAe,EACf,WAAW,EACX,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAmB,MAAM,YAAY,CAAC;AAE9J,oBAAoB;AACpB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAC;AAC3E,QAAQ;AACR,OAAO,EAAE,iBAAiB,EAA6B,MAAM,8BAA8B,CAAC;AAC5F,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAyB,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,gCAAgC;AAChC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GAInB,MAAM,yBAAyB,CAAC;AAEjC,uDAAuD;AACvD,OAAO,EAAE,KAAK,EAAqC,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { formatDirection } from "./index.js";
|
|
4
|
+
describe("package root exports", () => {
|
|
5
|
+
it("exports formatDirection", () => {
|
|
6
|
+
assert.equal(formatDirection("smaller_is_better"), "↓ smaller");
|
|
7
|
+
assert.equal(formatDirection("bigger_is_better"), "↑ bigger");
|
|
8
|
+
});
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,mBAAmB,CAAC,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/labels.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function defaultMetricLabel(metric: string): string;
|
|
2
|
+
/** Returns true when the metric name belongs to the monitor action's output. */
|
|
3
|
+
export declare function isMonitorMetric(metric: string): boolean;
|
|
4
|
+
export declare function defaultMonitorMetricLabel(metric: string): string;
|
|
5
|
+
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAoBA,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWhE"}
|
package/dist/labels.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const MONITOR_METRIC_LABELS = {
|
|
2
|
+
cpu_system_ms: "CPU system time (ms)",
|
|
3
|
+
cpu_system_pct: "CPU system %",
|
|
4
|
+
cpu_user_ms: "CPU user time (ms)",
|
|
5
|
+
cpu_user_pct: "CPU user %",
|
|
6
|
+
final_rss_kb: "Final RSS (KB)",
|
|
7
|
+
involuntary_ctx_switches: "Involuntary context switches",
|
|
8
|
+
io_read_bytes: "I/O read bytes",
|
|
9
|
+
io_write_bytes: "I/O write bytes",
|
|
10
|
+
load_avg_1m_max: "Peak load average (1m)",
|
|
11
|
+
mem_available_min_mb: "Lowest available memory (MB)",
|
|
12
|
+
peak_rss_kb: "Peak RSS (KB)",
|
|
13
|
+
voluntary_ctx_switches: "Voluntary context switches",
|
|
14
|
+
wall_clock_ms: "Wall clock time (ms)",
|
|
15
|
+
};
|
|
16
|
+
function titleCase(input) {
|
|
17
|
+
return input.replace(/\b[a-z]/g, (match) => match.toUpperCase());
|
|
18
|
+
}
|
|
19
|
+
export function defaultMetricLabel(metric) {
|
|
20
|
+
if (metric.startsWith("_monitor/")) {
|
|
21
|
+
return defaultMonitorMetricLabel(metric);
|
|
22
|
+
}
|
|
23
|
+
return metric
|
|
24
|
+
.replace(/_per_/g, "/")
|
|
25
|
+
.replace(/_/g, " ");
|
|
26
|
+
}
|
|
27
|
+
/** Returns true when the metric name belongs to the monitor action's output. */
|
|
28
|
+
export function isMonitorMetric(metric) {
|
|
29
|
+
return metric.startsWith("_monitor/");
|
|
30
|
+
}
|
|
31
|
+
export function defaultMonitorMetricLabel(metric) {
|
|
32
|
+
const raw = metric.replace(/^_monitor\//, "");
|
|
33
|
+
if (MONITOR_METRIC_LABELS[raw]) {
|
|
34
|
+
return MONITOR_METRIC_LABELS[raw];
|
|
35
|
+
}
|
|
36
|
+
if (raw.startsWith("process/")) {
|
|
37
|
+
return `Process ${titleCase(raw.replace(/^process\//, "").replace(/_/g, " "))}`;
|
|
38
|
+
}
|
|
39
|
+
return titleCase(raw.replace(/\//g, " ").replace(/_/g, " "));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAAA,MAAM,qBAAqB,GAA2B;IACpD,aAAa,EAAE,sBAAsB;IACrC,cAAc,EAAE,cAAc;IAC9B,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,YAAY;IAC1B,YAAY,EAAE,gBAAgB;IAC9B,wBAAwB,EAAE,8BAA8B;IACxD,aAAa,EAAE,gBAAgB;IAC/B,cAAc,EAAE,iBAAiB;IACjC,eAAe,EAAE,wBAAwB;IACzC,oBAAoB,EAAE,8BAA8B;IACpD,WAAW,EAAE,eAAe;IAC5B,sBAAsB,EAAE,4BAA4B;IACpD,aAAa,EAAE,sBAAsB;CACtC,CAAC;AAEF,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM;SACV,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,WAAW,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;IAClF,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.test.d.ts","sourceRoot":"","sources":["../src/labels.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import * as assert from "node:assert/strict";
|
|
3
|
+
import { defaultMetricLabel, defaultMonitorMetricLabel } from "./labels.js";
|
|
4
|
+
describe("defaultMetricLabel", () => {
|
|
5
|
+
it("formats common benchmark metrics into readable labels", () => {
|
|
6
|
+
assert.equal(defaultMetricLabel("ns_per_op"), "ns/op");
|
|
7
|
+
assert.equal(defaultMetricLabel("bytes_per_op"), "bytes/op");
|
|
8
|
+
assert.equal(defaultMetricLabel("allocs_per_op"), "allocs/op");
|
|
9
|
+
});
|
|
10
|
+
it("falls back to replacing underscores for custom metrics", () => {
|
|
11
|
+
assert.equal(defaultMetricLabel("requests_per_second"), "requests/second");
|
|
12
|
+
assert.equal(defaultMetricLabel("cache_hit_rate"), "cache hit rate");
|
|
13
|
+
});
|
|
14
|
+
it("delegates monitor metrics to the monitor label formatter", () => {
|
|
15
|
+
assert.equal(defaultMetricLabel("_monitor/cpu_user_pct"), "CPU user %");
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
describe("defaultMonitorMetricLabel", () => {
|
|
19
|
+
it("uses friendly labels for known monitor metrics", () => {
|
|
20
|
+
assert.equal(defaultMonitorMetricLabel("_monitor/wall_clock_ms"), "Wall clock time (ms)");
|
|
21
|
+
assert.equal(defaultMonitorMetricLabel("_monitor/mem_available_min_mb"), "Lowest available memory (MB)");
|
|
22
|
+
});
|
|
23
|
+
it("formats unknown monitor metrics into title case", () => {
|
|
24
|
+
assert.equal(defaultMonitorMetricLabel("_monitor/process/background_worker"), "Process Background Worker");
|
|
25
|
+
assert.equal(defaultMonitorMetricLabel("_monitor/custom_probe"), "Custom Probe");
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=labels.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.test.js","sourceRoot":"","sources":["../src/labels.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE5E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,uBAAuB,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,wBAAwB,CAAC,EAAE,sBAAsB,CAAC,CAAC;QAC1F,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,+BAA+B,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,oCAAoC,CAAC,EAAE,2BAA2B,CAAC,CAAC;QAC3G,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,uBAAuB,CAAC,EAAE,cAAc,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SeriesFile, SeriesEntry } from "@octo11y/core";
|
|
2
|
+
/** A single ranked entry in the leaderboard. */
|
|
3
|
+
export interface RankedEntry {
|
|
4
|
+
name: string;
|
|
5
|
+
entry: SeriesEntry;
|
|
6
|
+
latestValue: number;
|
|
7
|
+
previousValue: number | undefined;
|
|
8
|
+
/** latestValue - previousValue, undefined when no previous point exists */
|
|
9
|
+
delta: number | undefined;
|
|
10
|
+
/** 1-based rank */
|
|
11
|
+
rank: number;
|
|
12
|
+
isWinner: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Rank all series in a SeriesFile by latest value, direction-aware.
|
|
16
|
+
*
|
|
17
|
+
* - `smaller_is_better`: rank 1 = lowest value
|
|
18
|
+
* - `bigger_is_better`: rank 1 = highest value
|
|
19
|
+
* - no direction: rank 1 = lowest value (neutral)
|
|
20
|
+
*
|
|
21
|
+
* Series with no data points are excluded from the ranking.
|
|
22
|
+
*/
|
|
23
|
+
export declare function rankSeries(sf: SeriesFile): RankedEntry[];
|
|
24
|
+
/**
|
|
25
|
+
* Return the name of the winning series (rank 1), or undefined when there are
|
|
26
|
+
* no series with data points.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getWinner(sf: SeriesFile): string | undefined;
|
|
29
|
+
//# sourceMappingURL=leaderboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.d.ts","sourceRoot":"","sources":["../src/leaderboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE7D,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,2EAA2E;IAC3E,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,WAAW,EAAE,CAuBxD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAG5D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rank all series in a SeriesFile by latest value, direction-aware.
|
|
3
|
+
*
|
|
4
|
+
* - `smaller_is_better`: rank 1 = lowest value
|
|
5
|
+
* - `bigger_is_better`: rank 1 = highest value
|
|
6
|
+
* - no direction: rank 1 = lowest value (neutral)
|
|
7
|
+
*
|
|
8
|
+
* Series with no data points are excluded from the ranking.
|
|
9
|
+
*/
|
|
10
|
+
export function rankSeries(sf) {
|
|
11
|
+
const entries = [];
|
|
12
|
+
for (const [name, entry] of Object.entries(sf.series)) {
|
|
13
|
+
const pts = entry.points;
|
|
14
|
+
if (pts.length === 0)
|
|
15
|
+
continue;
|
|
16
|
+
const latestValue = pts[pts.length - 1].value;
|
|
17
|
+
const previousValue = pts.length >= 2 ? pts[pts.length - 2].value : undefined;
|
|
18
|
+
entries.push({ name, entry, latestValue, previousValue });
|
|
19
|
+
}
|
|
20
|
+
const descending = sf.direction === "bigger_is_better";
|
|
21
|
+
entries.sort((a, b) => descending ? b.latestValue - a.latestValue : a.latestValue - b.latestValue);
|
|
22
|
+
return entries.map((e, idx) => ({
|
|
23
|
+
name: e.name,
|
|
24
|
+
entry: e.entry,
|
|
25
|
+
latestValue: e.latestValue,
|
|
26
|
+
previousValue: e.previousValue,
|
|
27
|
+
delta: e.previousValue !== undefined ? e.latestValue - e.previousValue : undefined,
|
|
28
|
+
rank: idx + 1,
|
|
29
|
+
isWinner: idx === 0,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Return the name of the winning series (rank 1), or undefined when there are
|
|
34
|
+
* no series with data points.
|
|
35
|
+
*/
|
|
36
|
+
export function getWinner(sf) {
|
|
37
|
+
const ranked = rankSeries(sf);
|
|
38
|
+
return ranked.length > 0 ? ranked[0].name : undefined;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=leaderboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.js","sourceRoot":"","sources":["../src/leaderboard.ts"],"names":[],"mappings":"AAeA;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,EAAc;IACvC,MAAM,OAAO,GAAwG,EAAE,CAAC;IAExH,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC/B,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9C,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,EAAE,CAAC,SAAS,KAAK,kBAAkB,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAEnG,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,aAAa,EAAE,CAAC,CAAC,aAAa;QAC9B,KAAK,EAAE,CAAC,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;QAClF,IAAI,EAAE,GAAG,GAAG,CAAC;QACb,QAAQ,EAAE,GAAG,KAAK,CAAC;KACpB,CAAC,CAAC,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,EAAc;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard.test.d.ts","sourceRoot":"","sources":["../src/leaderboard.test.ts"],"names":[],"mappings":""}
|