@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.
Files changed (219) hide show
  1. package/README.md +640 -0
  2. package/dist/ComparisonSummaryTable.test.d.ts +2 -0
  3. package/dist/ComparisonSummaryTable.test.d.ts.map +1 -0
  4. package/dist/ComparisonSummaryTable.test.js +53 -0
  5. package/dist/ComparisonSummaryTable.test.js.map +1 -0
  6. package/dist/Dashboard.d.ts +25 -0
  7. package/dist/Dashboard.d.ts.map +1 -0
  8. package/dist/Dashboard.js +87 -0
  9. package/dist/Dashboard.js.map +1 -0
  10. package/dist/Dashboard.test.d.ts +2 -0
  11. package/dist/Dashboard.test.d.ts.map +1 -0
  12. package/dist/Dashboard.test.js +49 -0
  13. package/dist/Dashboard.test.js.map +1 -0
  14. package/dist/RunDashboard.d.ts +20 -0
  15. package/dist/RunDashboard.d.ts.map +1 -0
  16. package/dist/RunDashboard.js +174 -0
  17. package/dist/RunDashboard.js.map +1 -0
  18. package/dist/RunDashboard.test.d.ts +2 -0
  19. package/dist/RunDashboard.test.d.ts.map +1 -0
  20. package/dist/RunDashboard.test.js +58 -0
  21. package/dist/RunDashboard.test.js.map +1 -0
  22. package/dist/RunDetail.d.ts +26 -0
  23. package/dist/RunDetail.d.ts.map +1 -0
  24. package/dist/RunDetail.js +100 -0
  25. package/dist/RunDetail.js.map +1 -0
  26. package/dist/RunDetail.test.d.ts +2 -0
  27. package/dist/RunDetail.test.d.ts.map +1 -0
  28. package/dist/RunDetail.test.js +168 -0
  29. package/dist/RunDetail.test.js.map +1 -0
  30. package/dist/RunSelector.test.d.ts +2 -0
  31. package/dist/RunSelector.test.d.ts.map +1 -0
  32. package/dist/RunSelector.test.js +45 -0
  33. package/dist/RunSelector.test.js.map +1 -0
  34. package/dist/SampleChart.test.d.ts +2 -0
  35. package/dist/SampleChart.test.d.ts.map +1 -0
  36. package/dist/SampleChart.test.js +48 -0
  37. package/dist/SampleChart.test.js.map +1 -0
  38. package/dist/TagFilter.test.d.ts +2 -0
  39. package/dist/TagFilter.test.d.ts.map +1 -0
  40. package/dist/TagFilter.test.js +106 -0
  41. package/dist/TagFilter.test.js.map +1 -0
  42. package/dist/VerdictBanner.test.d.ts +2 -0
  43. package/dist/VerdictBanner.test.d.ts.map +1 -0
  44. package/dist/VerdictBanner.test.js +56 -0
  45. package/dist/VerdictBanner.test.js.map +1 -0
  46. package/dist/chart-config.d.ts +100 -0
  47. package/dist/chart-config.d.ts.map +1 -0
  48. package/dist/chart-config.js +81 -0
  49. package/dist/chart-config.js.map +1 -0
  50. package/dist/colors.d.ts +11 -0
  51. package/dist/colors.d.ts.map +1 -0
  52. package/dist/colors.js +16 -0
  53. package/dist/colors.js.map +1 -0
  54. package/dist/comparison-transforms.d.ts +22 -0
  55. package/dist/comparison-transforms.d.ts.map +1 -0
  56. package/dist/comparison-transforms.js +20 -0
  57. package/dist/comparison-transforms.js.map +1 -0
  58. package/dist/comparison-transforms.test.d.ts +2 -0
  59. package/dist/comparison-transforms.test.d.ts.map +1 -0
  60. package/dist/comparison-transforms.test.js +75 -0
  61. package/dist/comparison-transforms.test.js.map +1 -0
  62. package/dist/components/ComparisonBar.d.ts +13 -0
  63. package/dist/components/ComparisonBar.d.ts.map +1 -0
  64. package/dist/components/ComparisonBar.js +94 -0
  65. package/dist/components/ComparisonBar.js.map +1 -0
  66. package/dist/components/ComparisonChart.d.ts +31 -0
  67. package/dist/components/ComparisonChart.d.ts.map +1 -0
  68. package/dist/components/ComparisonChart.js +118 -0
  69. package/dist/components/ComparisonChart.js.map +1 -0
  70. package/dist/components/ComparisonSummaryTable.d.ts +29 -0
  71. package/dist/components/ComparisonSummaryTable.d.ts.map +1 -0
  72. package/dist/components/ComparisonSummaryTable.js +41 -0
  73. package/dist/components/ComparisonSummaryTable.js.map +1 -0
  74. package/dist/components/DashboardToolbar.d.ts +21 -0
  75. package/dist/components/DashboardToolbar.d.ts.map +1 -0
  76. package/dist/components/DashboardToolbar.js +14 -0
  77. package/dist/components/DashboardToolbar.js.map +1 -0
  78. package/dist/components/DateRangeFilter.d.ts +19 -0
  79. package/dist/components/DateRangeFilter.d.ts.map +1 -0
  80. package/dist/components/DateRangeFilter.js +44 -0
  81. package/dist/components/DateRangeFilter.js.map +1 -0
  82. package/dist/components/HeroSection.d.ts +12 -0
  83. package/dist/components/HeroSection.d.ts.map +1 -0
  84. package/dist/components/HeroSection.js +6 -0
  85. package/dist/components/HeroSection.js.map +1 -0
  86. package/dist/components/Leaderboard.d.ts +9 -0
  87. package/dist/components/Leaderboard.d.ts.map +1 -0
  88. package/dist/components/Leaderboard.js +41 -0
  89. package/dist/components/Leaderboard.js.map +1 -0
  90. package/dist/components/MetricCard.d.ts +16 -0
  91. package/dist/components/MetricCard.d.ts.map +1 -0
  92. package/dist/components/MetricCard.js +25 -0
  93. package/dist/components/MetricCard.js.map +1 -0
  94. package/dist/components/MetricDetailView.d.ts +15 -0
  95. package/dist/components/MetricDetailView.d.ts.map +1 -0
  96. package/dist/components/MetricDetailView.js +11 -0
  97. package/dist/components/MetricDetailView.js.map +1 -0
  98. package/dist/components/MonitorSection.d.ts +21 -0
  99. package/dist/components/MonitorSection.d.ts.map +1 -0
  100. package/dist/components/MonitorSection.js +38 -0
  101. package/dist/components/MonitorSection.js.map +1 -0
  102. package/dist/components/OverviewGrid.d.ts +17 -0
  103. package/dist/components/OverviewGrid.d.ts.map +1 -0
  104. package/dist/components/OverviewGrid.js +15 -0
  105. package/dist/components/OverviewGrid.js.map +1 -0
  106. package/dist/components/RunSelector.d.ts +20 -0
  107. package/dist/components/RunSelector.d.ts.map +1 -0
  108. package/dist/components/RunSelector.js +53 -0
  109. package/dist/components/RunSelector.js.map +1 -0
  110. package/dist/components/RunTable.d.ts +13 -0
  111. package/dist/components/RunTable.d.ts.map +1 -0
  112. package/dist/components/RunTable.js +24 -0
  113. package/dist/components/RunTable.js.map +1 -0
  114. package/dist/components/SampleChart.d.ts +21 -0
  115. package/dist/components/SampleChart.d.ts.map +1 -0
  116. package/dist/components/SampleChart.js +77 -0
  117. package/dist/components/SampleChart.js.map +1 -0
  118. package/dist/components/TagFilter.d.ts +12 -0
  119. package/dist/components/TagFilter.d.ts.map +1 -0
  120. package/dist/components/TagFilter.js +59 -0
  121. package/dist/components/TagFilter.js.map +1 -0
  122. package/dist/components/TrendChart.d.ts +25 -0
  123. package/dist/components/TrendChart.d.ts.map +1 -0
  124. package/dist/components/TrendChart.js +95 -0
  125. package/dist/components/TrendChart.js.map +1 -0
  126. package/dist/components/VerdictBanner.d.ts +13 -0
  127. package/dist/components/VerdictBanner.d.ts.map +1 -0
  128. package/dist/components/VerdictBanner.js +22 -0
  129. package/dist/components/VerdictBanner.js.map +1 -0
  130. package/dist/dashboard-labels.d.ts +47 -0
  131. package/dist/dashboard-labels.d.ts.map +1 -0
  132. package/dist/dashboard-labels.js +44 -0
  133. package/dist/dashboard-labels.js.map +1 -0
  134. package/dist/dashboard-labels.test.d.ts +2 -0
  135. package/dist/dashboard-labels.test.d.ts.map +1 -0
  136. package/dist/dashboard-labels.test.js +34 -0
  137. package/dist/dashboard-labels.test.js.map +1 -0
  138. package/dist/dataset-transforms.d.ts +41 -0
  139. package/dist/dataset-transforms.d.ts.map +1 -0
  140. package/dist/dataset-transforms.js +132 -0
  141. package/dist/dataset-transforms.js.map +1 -0
  142. package/dist/dataset-transforms.test.d.ts +2 -0
  143. package/dist/dataset-transforms.test.d.ts.map +1 -0
  144. package/dist/dataset-transforms.test.js +208 -0
  145. package/dist/dataset-transforms.test.js.map +1 -0
  146. package/dist/date-range.test.d.ts +2 -0
  147. package/dist/date-range.test.d.ts.map +1 -0
  148. package/dist/date-range.test.js +116 -0
  149. package/dist/date-range.test.js.map +1 -0
  150. package/dist/embed.d.ts +45 -0
  151. package/dist/embed.d.ts.map +1 -0
  152. package/dist/embed.js +170 -0
  153. package/dist/embed.js.map +1 -0
  154. package/dist/embed.test.d.ts +2 -0
  155. package/dist/embed.test.d.ts.map +1 -0
  156. package/dist/embed.test.js +15 -0
  157. package/dist/embed.test.js.map +1 -0
  158. package/dist/fetch.d.ts +27 -0
  159. package/dist/fetch.d.ts.map +1 -0
  160. package/dist/fetch.js +73 -0
  161. package/dist/fetch.js.map +1 -0
  162. package/dist/fetch.test.d.ts +2 -0
  163. package/dist/fetch.test.d.ts.map +1 -0
  164. package/dist/fetch.test.js +75 -0
  165. package/dist/fetch.test.js.map +1 -0
  166. package/dist/format-utils.d.ts +48 -0
  167. package/dist/format-utils.d.ts.map +1 -0
  168. package/dist/format-utils.js +98 -0
  169. package/dist/format-utils.js.map +1 -0
  170. package/dist/format-utils.test.d.ts +2 -0
  171. package/dist/format-utils.test.d.ts.map +1 -0
  172. package/dist/format-utils.test.js +103 -0
  173. package/dist/format-utils.test.js.map +1 -0
  174. package/dist/hooks/useChartLifecycle.d.ts +20 -0
  175. package/dist/hooks/useChartLifecycle.d.ts.map +1 -0
  176. package/dist/hooks/useChartLifecycle.js +46 -0
  177. package/dist/hooks/useChartLifecycle.js.map +1 -0
  178. package/dist/index.d.ts +27 -0
  179. package/dist/index.d.ts.map +1 -0
  180. package/dist/index.js +36 -0
  181. package/dist/index.js.map +1 -0
  182. package/dist/index.test.d.ts +2 -0
  183. package/dist/index.test.d.ts.map +1 -0
  184. package/dist/index.test.js +10 -0
  185. package/dist/index.test.js.map +1 -0
  186. package/dist/labels.d.ts +5 -0
  187. package/dist/labels.d.ts.map +1 -0
  188. package/dist/labels.js +41 -0
  189. package/dist/labels.js.map +1 -0
  190. package/dist/labels.test.d.ts +2 -0
  191. package/dist/labels.test.d.ts.map +1 -0
  192. package/dist/labels.test.js +28 -0
  193. package/dist/labels.test.js.map +1 -0
  194. package/dist/leaderboard.d.ts +29 -0
  195. package/dist/leaderboard.d.ts.map +1 -0
  196. package/dist/leaderboard.js +40 -0
  197. package/dist/leaderboard.js.map +1 -0
  198. package/dist/leaderboard.test.d.ts +2 -0
  199. package/dist/leaderboard.test.d.ts.map +1 -0
  200. package/dist/leaderboard.test.js +105 -0
  201. package/dist/leaderboard.test.js.map +1 -0
  202. package/dist/sample-utils.d.ts +4 -0
  203. package/dist/sample-utils.d.ts.map +1 -0
  204. package/dist/sample-utils.js +12 -0
  205. package/dist/sample-utils.js.map +1 -0
  206. package/dist/style.css +912 -0
  207. package/dist/theme.d.ts +12 -0
  208. package/dist/theme.d.ts.map +1 -0
  209. package/dist/theme.js +17 -0
  210. package/dist/theme.js.map +1 -0
  211. package/dist/utils.d.ts +37 -0
  212. package/dist/utils.d.ts.map +1 -0
  213. package/dist/utils.js +63 -0
  214. package/dist/utils.js.map +1 -0
  215. package/dist/utils.test.d.ts +2 -0
  216. package/dist/utils.test.d.ts.map +1 -0
  217. package/dist/utils.test.js +196 -0
  218. package/dist/utils.test.js.map +1 -0
  219. package/package.json +46 -0
@@ -0,0 +1,12 @@
1
+ export interface ChartTheme {
2
+ text: string;
3
+ mutedText: string;
4
+ grid: string;
5
+ border: string;
6
+ tooltipBackground: string;
7
+ tooltipBorder: string;
8
+ tooltipTitle: string;
9
+ tooltipBody: string;
10
+ }
11
+ export declare function getChartTheme(node: HTMLElement): ChartTheme;
12
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAY3D"}
package/dist/theme.js ADDED
@@ -0,0 +1,17 @@
1
+ function readCssVar(style, name, fallback) {
2
+ return style.getPropertyValue(name).trim() || fallback;
3
+ }
4
+ export function getChartTheme(node) {
5
+ const style = getComputedStyle(node);
6
+ return {
7
+ text: readCssVar(style, "--bk-text", "#0f172a"),
8
+ mutedText: readCssVar(style, "--bk-text-muted", "#64748b"),
9
+ grid: readCssVar(style, "--bk-chart-grid", "rgba(148, 163, 184, 0.24)"),
10
+ border: readCssVar(style, "--bk-border", "#cbd5e1"),
11
+ tooltipBackground: readCssVar(style, "--bk-tooltip-bg", "#0f172a"),
12
+ tooltipBorder: readCssVar(style, "--bk-tooltip-border", "#1e293b"),
13
+ tooltipTitle: readCssVar(style, "--bk-tooltip-title", "#f8fafc"),
14
+ tooltipBody: readCssVar(style, "--bk-tooltip-body", "#e2e8f0"),
15
+ };
16
+ }
17
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAWA,SAAS,UAAU,CAAC,KAA0B,EAAE,IAAY,EAAE,QAAgB;IAC5E,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC;QAC/C,SAAS,EAAE,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC;QAC1D,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,CAAC;QACvE,MAAM,EAAE,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,CAAC;QACnD,iBAAiB,EAAE,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,SAAS,CAAC;QAClE,aAAa,EAAE,UAAU,CAAC,KAAK,EAAE,qBAAqB,EAAE,SAAS,CAAC;QAClE,YAAY,EAAE,UAAU,CAAC,KAAK,EAAE,oBAAoB,EAAE,SAAS,CAAC;QAChE,WAAW,EAAE,UAAU,CAAC,KAAK,EAAE,mBAAmB,EAAE,SAAS,CAAC;KAC/D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { SeriesFile } from "@octo11y/core";
2
+ /** Describes a detected regression for a single series within a metric. */
3
+ export interface RegressionResult {
4
+ /** Series name (key in SeriesFile.series). */
5
+ seriesName: string;
6
+ /** The latest data-point value. */
7
+ latestValue: number;
8
+ /** Mean of the previous `window` data points. */
9
+ previousMean: number;
10
+ /** Percentage change from previousMean to latestValue (positive = increase). */
11
+ percentChange: number;
12
+ /** Number of preceding points that were averaged (may be less than requested window). */
13
+ window: number;
14
+ }
15
+ /**
16
+ * Detect regressions in a single metric's series file.
17
+ *
18
+ * A regression is defined as:
19
+ * - For `smaller_is_better`: the latest value increased by more than `threshold`%
20
+ * relative to the mean of the previous `window` points.
21
+ * - For `bigger_is_better`: the latest value decreased by more than `threshold`%
22
+ * relative to the mean of the previous `window` points.
23
+ *
24
+ * Returns an empty array when there are not enough data points (< window + 1).
25
+ *
26
+ * @param series The series file for a single metric.
27
+ * @param threshold Percentage change that triggers a regression (default: 10).
28
+ * @param window Number of preceding data points to average (default: 5).
29
+ */
30
+ export declare function detectRegressions(series: SeriesFile, threshold?: number, window?: number): RegressionResult[];
31
+ /**
32
+ * Build a human-readable regression tooltip string.
33
+ *
34
+ * Example: "ns_per_op increased 15.3% vs 5-run average (320 → 368)"
35
+ */
36
+ export declare function regressionTooltip(metric: string, r: RegressionResult, metricLabelFormatter?: (m: string) => string): string;
37
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,2EAA2E;AAC3E,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,aAAa,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,SAAS,SAAK,EACd,MAAM,SAAI,GACT,gBAAgB,EAAE,CAwCpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,gBAAgB,EACnB,oBAAoB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC3C,MAAM,CAOR"}
package/dist/utils.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Detect regressions in a single metric's series file.
3
+ *
4
+ * A regression is defined as:
5
+ * - For `smaller_is_better`: the latest value increased by more than `threshold`%
6
+ * relative to the mean of the previous `window` points.
7
+ * - For `bigger_is_better`: the latest value decreased by more than `threshold`%
8
+ * relative to the mean of the previous `window` points.
9
+ *
10
+ * Returns an empty array when there are not enough data points (< window + 1).
11
+ *
12
+ * @param series The series file for a single metric.
13
+ * @param threshold Percentage change that triggers a regression (default: 10).
14
+ * @param window Number of preceding data points to average (default: 5).
15
+ */
16
+ export function detectRegressions(series, threshold = 10, window = 5) {
17
+ const direction = series.direction ?? "smaller_is_better";
18
+ const results = [];
19
+ for (const [name, entry] of Object.entries(series.series)) {
20
+ const pts = entry.points;
21
+ // Need at least window + 1 points: window for history, 1 for the latest.
22
+ if (pts.length < window + 1)
23
+ continue;
24
+ const latest = pts[pts.length - 1];
25
+ const prevPts = pts.slice(-(window + 1), -1);
26
+ const actualWindow = prevPts.length;
27
+ if (actualWindow === 0)
28
+ continue;
29
+ const sum = prevPts.reduce((acc, p) => acc + p.value, 0);
30
+ const mean = sum / actualWindow;
31
+ // Avoid division by zero.
32
+ if (mean < 1e-10)
33
+ continue;
34
+ const percentChange = ((latest.value - mean) / mean) * 100;
35
+ const isRegression = direction === "smaller_is_better"
36
+ ? percentChange > threshold
37
+ : percentChange < -threshold;
38
+ if (isRegression) {
39
+ results.push({
40
+ seriesName: name,
41
+ latestValue: latest.value,
42
+ previousMean: mean,
43
+ percentChange,
44
+ window: actualWindow,
45
+ });
46
+ }
47
+ }
48
+ return results;
49
+ }
50
+ /**
51
+ * Build a human-readable regression tooltip string.
52
+ *
53
+ * Example: "ns_per_op increased 15.3% vs 5-run average (320 → 368)"
54
+ */
55
+ export function regressionTooltip(metric, r, metricLabelFormatter) {
56
+ const label = metricLabelFormatter ? metricLabelFormatter(metric) : metric;
57
+ const direction = r.percentChange > 0 ? "increased" : "decreased";
58
+ const pct = Math.abs(r.percentChange).toFixed(1);
59
+ const prev = r.previousMean % 1 === 0 ? r.previousMean.toFixed(0) : r.previousMean.toFixed(2);
60
+ const latest = r.latestValue % 1 === 0 ? r.latestValue.toFixed(0) : r.latestValue.toFixed(2);
61
+ return `${label} ${direction} ${pct}% vs ${r.window}-run average (${prev} → ${latest})`;
62
+ }
63
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,196 @@
1
+ import { describe, it } from "node:test";
2
+ import * as assert from "node:assert/strict";
3
+ import { detectRegressions, regressionTooltip } from "./utils.js";
4
+ function makeSeriesFile(values, direction = "smaller_is_better") {
5
+ return {
6
+ metric: "ns_per_op",
7
+ unit: "ns/op",
8
+ direction,
9
+ series: {
10
+ BenchmarkFoo: {
11
+ points: values.map((v, i) => ({
12
+ timestamp: new Date(1_700_000_000_000 + i * 60_000).toISOString(),
13
+ value: v,
14
+ })),
15
+ },
16
+ },
17
+ };
18
+ }
19
+ describe("detectRegressions", () => {
20
+ it("returns empty array when fewer than window+1 points", () => {
21
+ const sf = makeSeriesFile([100, 100, 100, 100, 100]); // 5 points, window=5 → need 6
22
+ assert.deepEqual(detectRegressions(sf), []);
23
+ });
24
+ it("returns empty array with exactly window+1 points but no regression", () => {
25
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 100]); // 6 points, stable
26
+ assert.deepEqual(detectRegressions(sf), []);
27
+ });
28
+ it("detects regression for smaller_is_better when latest value increases above threshold", () => {
29
+ // Mean of previous 5 = 100, latest = 115 → +15%
30
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 115]);
31
+ const results = detectRegressions(sf, 10, 5);
32
+ assert.equal(results.length, 1);
33
+ assert.equal(results[0].seriesName, "BenchmarkFoo");
34
+ assert.equal(results[0].latestValue, 115);
35
+ assert.equal(results[0].previousMean, 100);
36
+ assert.ok(results[0].percentChange > 14 && results[0].percentChange < 16);
37
+ assert.equal(results[0].window, 5);
38
+ });
39
+ it("does not flag regression when change is below threshold", () => {
40
+ // Mean of previous 5 = 100, latest = 105 → +5% (threshold=10)
41
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 105]);
42
+ const results = detectRegressions(sf, 10, 5);
43
+ assert.deepEqual(results, []);
44
+ });
45
+ it("does not flag regression for smaller_is_better when latest value decreases", () => {
46
+ // Mean of previous 5 = 100, latest = 80 → -20%, but decrease is good
47
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 80]);
48
+ const results = detectRegressions(sf, 10, 5);
49
+ assert.deepEqual(results, []);
50
+ });
51
+ it("detects regression for bigger_is_better when latest value decreases below threshold", () => {
52
+ // Mean of previous 5 = 100, latest = 80 → -20%
53
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 80], "bigger_is_better");
54
+ const results = detectRegressions(sf, 10, 5);
55
+ assert.equal(results.length, 1);
56
+ assert.equal(results[0].seriesName, "BenchmarkFoo");
57
+ assert.equal(results[0].latestValue, 80);
58
+ assert.ok(results[0].percentChange < -19 && results[0].percentChange > -21);
59
+ });
60
+ it("does not flag regression for bigger_is_better when latest value increases", () => {
61
+ // Mean of previous 5 = 100, latest = 120 → +20%, but increase is good
62
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 120], "bigger_is_better");
63
+ const results = detectRegressions(sf, 10, 5);
64
+ assert.deepEqual(results, []);
65
+ });
66
+ it("respects custom window size", () => {
67
+ // Window=3: mean of prev 3 = (90+90+90)=90, latest=120 → +33%
68
+ const sf = makeSeriesFile([50, 50, 90, 90, 90, 120]);
69
+ const results = detectRegressions(sf, 10, 3);
70
+ assert.equal(results.length, 1);
71
+ assert.ok(Math.abs(results[0].percentChange - 33.33) < 0.1);
72
+ assert.equal(results[0].window, 3);
73
+ });
74
+ it("respects custom threshold", () => {
75
+ // +15% change; passes at threshold=10, not at threshold=20
76
+ const sf = makeSeriesFile([100, 100, 100, 100, 100, 115]);
77
+ assert.equal(detectRegressions(sf, 10, 5).length, 1);
78
+ assert.equal(detectRegressions(sf, 20, 5).length, 0);
79
+ });
80
+ it("skips series with zero mean to avoid division by zero", () => {
81
+ const sf = {
82
+ metric: "ns_per_op",
83
+ direction: "smaller_is_better",
84
+ series: {
85
+ BenchmarkFoo: {
86
+ points: [
87
+ { timestamp: "2025-01-01T00:00:00Z", value: 0 },
88
+ { timestamp: "2025-01-01T00:01:00Z", value: 0 },
89
+ { timestamp: "2025-01-01T00:02:00Z", value: 0 },
90
+ { timestamp: "2025-01-01T00:03:00Z", value: 0 },
91
+ { timestamp: "2025-01-01T00:04:00Z", value: 0 },
92
+ { timestamp: "2025-01-01T00:05:00Z", value: 100 },
93
+ ],
94
+ },
95
+ },
96
+ };
97
+ const results = detectRegressions(sf);
98
+ assert.deepEqual(results, []);
99
+ });
100
+ it("detects regressions across multiple series independently", () => {
101
+ const sf = {
102
+ metric: "ns_per_op",
103
+ direction: "smaller_is_better",
104
+ series: {
105
+ BenchmarkFoo: {
106
+ points: [100, 100, 100, 100, 100, 120].map((v, i) => ({
107
+ timestamp: new Date(1_700_000_000_000 + i * 60_000).toISOString(),
108
+ value: v,
109
+ })),
110
+ },
111
+ BenchmarkBar: {
112
+ points: [100, 100, 100, 100, 100, 105].map((v, i) => ({
113
+ timestamp: new Date(1_700_000_000_000 + i * 60_000).toISOString(),
114
+ value: v,
115
+ })),
116
+ },
117
+ },
118
+ };
119
+ const results = detectRegressions(sf);
120
+ assert.equal(results.length, 1);
121
+ assert.equal(results[0].seriesName, "BenchmarkFoo");
122
+ });
123
+ it("defaults to smaller_is_better when direction is not set", () => {
124
+ const sf = {
125
+ metric: "ns_per_op",
126
+ series: {
127
+ BenchmarkFoo: {
128
+ points: [100, 100, 100, 100, 100, 120].map((v, i) => ({
129
+ timestamp: new Date(1_700_000_000_000 + i * 60_000).toISOString(),
130
+ value: v,
131
+ })),
132
+ },
133
+ },
134
+ };
135
+ const results = detectRegressions(sf);
136
+ assert.equal(results.length, 1);
137
+ });
138
+ });
139
+ describe("regressionTooltip", () => {
140
+ it("formats increase tooltip for smaller_is_better", () => {
141
+ const r = {
142
+ seriesName: "BenchmarkFoo",
143
+ latestValue: 368,
144
+ previousMean: 320,
145
+ percentChange: 15,
146
+ window: 5,
147
+ };
148
+ const tooltip = regressionTooltip("ns_per_op", r);
149
+ assert.equal(tooltip, "ns_per_op increased 15.0% vs 5-run average (320 → 368)");
150
+ });
151
+ it("formats decrease tooltip for bigger_is_better", () => {
152
+ const r = {
153
+ seriesName: "BenchmarkFoo",
154
+ latestValue: 80,
155
+ previousMean: 100,
156
+ percentChange: -20,
157
+ window: 3,
158
+ };
159
+ const tooltip = regressionTooltip("throughput", r);
160
+ assert.equal(tooltip, "throughput decreased 20.0% vs 3-run average (100 → 80)");
161
+ });
162
+ it("uses metricLabelFormatter when provided", () => {
163
+ const r = {
164
+ seriesName: "BenchmarkFoo",
165
+ latestValue: 368,
166
+ previousMean: 320,
167
+ percentChange: 15,
168
+ window: 5,
169
+ };
170
+ const tooltip = regressionTooltip("ns_per_op", r, (m) => m.replace(/_/g, " "));
171
+ assert.ok(tooltip.startsWith("ns per op"));
172
+ });
173
+ it("formats decimal values correctly", () => {
174
+ const r = {
175
+ seriesName: "BenchmarkFoo",
176
+ latestValue: 1.5,
177
+ previousMean: 1.25,
178
+ percentChange: 20,
179
+ window: 5,
180
+ };
181
+ const tooltip = regressionTooltip("ms_per_op", r);
182
+ assert.equal(tooltip, "ms_per_op increased 20.0% vs 5-run average (1.25 → 1.50)");
183
+ });
184
+ it("formats integer values as whole numbers without decimal places", () => {
185
+ const r = {
186
+ seriesName: "BenchmarkFoo",
187
+ latestValue: 120,
188
+ previousMean: 100,
189
+ percentChange: 20,
190
+ window: 5,
191
+ };
192
+ const tooltip = regressionTooltip("ns_per_op", r);
193
+ assert.equal(tooltip, "ns_per_op increased 20.0% vs 5-run average (100 → 120)");
194
+ });
195
+ });
196
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@benchkit/chart",
3
+ "version": "0.1.0",
4
+ "description": "Preact components for rendering benchkit benchmark dashboards.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ },
13
+ "./embed": {
14
+ "import": "./dist/embed.js",
15
+ "types": "./dist/embed.d.ts"
16
+ },
17
+ "./css": "./dist/style.css"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc && cp src/style.css dist/style.css",
21
+ "lint": "tsc --noEmit",
22
+ "test": "node --test dist/*.test.js"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "license": "MIT",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/strawgate/benchkit.git",
31
+ "directory": "packages/chart"
32
+ },
33
+ "dependencies": {
34
+ "@benchkit/format": "*",
35
+ "@octo11y/core": "*",
36
+ "chart.js": "^4.4.0",
37
+ "chartjs-adapter-date-fns": "^3.0.0",
38
+ "date-fns": "^4.1.0"
39
+ },
40
+ "peerDependencies": {
41
+ "preact": "^10.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "preact": "^10.25.0"
45
+ }
46
+ }