@benchkit/format 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 (148) hide show
  1. package/README.md +521 -0
  2. package/dist/build-otlp-result.d.ts +43 -0
  3. package/dist/build-otlp-result.d.ts.map +1 -0
  4. package/dist/build-otlp-result.js +102 -0
  5. package/dist/build-otlp-result.js.map +1 -0
  6. package/dist/build-otlp-result.test.d.ts +2 -0
  7. package/dist/build-otlp-result.test.d.ts.map +1 -0
  8. package/dist/build-otlp-result.test.js +148 -0
  9. package/dist/build-otlp-result.test.js.map +1 -0
  10. package/dist/compare.d.ts +20 -0
  11. package/dist/compare.d.ts.map +1 -0
  12. package/dist/compare.js +92 -0
  13. package/dist/compare.js.map +1 -0
  14. package/dist/compare.test.d.ts +2 -0
  15. package/dist/compare.test.d.ts.map +1 -0
  16. package/dist/compare.test.js +233 -0
  17. package/dist/compare.test.js.map +1 -0
  18. package/dist/format-comparison-markdown.d.ts +3 -0
  19. package/dist/format-comparison-markdown.d.ts.map +1 -0
  20. package/dist/format-comparison-markdown.js +142 -0
  21. package/dist/format-comparison-markdown.js.map +1 -0
  22. package/dist/format-comparison-markdown.test.d.ts +2 -0
  23. package/dist/format-comparison-markdown.test.d.ts.map +1 -0
  24. package/dist/format-comparison-markdown.test.js +173 -0
  25. package/dist/format-comparison-markdown.test.js.map +1 -0
  26. package/dist/index.d.ts +38 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +100 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/infer-direction.d.ts +10 -0
  31. package/dist/infer-direction.d.ts.map +1 -0
  32. package/dist/infer-direction.js +23 -0
  33. package/dist/infer-direction.js.map +1 -0
  34. package/dist/infer-direction.test.d.ts +2 -0
  35. package/dist/infer-direction.test.d.ts.map +1 -0
  36. package/dist/infer-direction.test.js +28 -0
  37. package/dist/infer-direction.test.js.map +1 -0
  38. package/dist/metrics-batch.d.ts +55 -0
  39. package/dist/metrics-batch.d.ts.map +1 -0
  40. package/dist/metrics-batch.js +296 -0
  41. package/dist/metrics-batch.js.map +1 -0
  42. package/dist/metrics-batch.test.d.ts +2 -0
  43. package/dist/metrics-batch.test.d.ts.map +1 -0
  44. package/dist/metrics-batch.test.js +306 -0
  45. package/dist/metrics-batch.test.js.map +1 -0
  46. package/dist/native-builder.d.ts.map +1 -0
  47. package/dist/native-builder.js.map +1 -0
  48. package/dist/native-builder.test.d.ts.map +1 -0
  49. package/dist/native-builder.test.js.map +1 -0
  50. package/dist/otlp-conventions.d.ts +80 -0
  51. package/dist/otlp-conventions.d.ts.map +1 -0
  52. package/dist/otlp-conventions.js +114 -0
  53. package/dist/otlp-conventions.js.map +1 -0
  54. package/dist/otlp-conventions.test.d.ts +2 -0
  55. package/dist/otlp-conventions.test.d.ts.map +1 -0
  56. package/dist/otlp-conventions.test.js +65 -0
  57. package/dist/otlp-conventions.test.js.map +1 -0
  58. package/dist/otlp-projections.d.ts.map +1 -0
  59. package/dist/otlp-projections.js.map +1 -0
  60. package/dist/otlp-projections.test.d.ts.map +1 -0
  61. package/dist/otlp-projections.test.js.map +1 -0
  62. package/dist/otlp-validation.d.ts +40 -0
  63. package/dist/otlp-validation.d.ts.map +1 -0
  64. package/dist/otlp-validation.js +110 -0
  65. package/dist/otlp-validation.js.map +1 -0
  66. package/dist/otlp-validation.test.d.ts +2 -0
  67. package/dist/otlp-validation.test.d.ts.map +1 -0
  68. package/dist/otlp-validation.test.js +160 -0
  69. package/dist/otlp-validation.test.js.map +1 -0
  70. package/dist/parse-benchmark-action.d.ts +11 -0
  71. package/dist/parse-benchmark-action.d.ts.map +1 -0
  72. package/dist/parse-benchmark-action.js +54 -0
  73. package/dist/parse-benchmark-action.js.map +1 -0
  74. package/dist/parse-benchmark-action.test.d.ts +2 -0
  75. package/dist/parse-benchmark-action.test.d.ts.map +1 -0
  76. package/dist/parse-benchmark-action.test.js +66 -0
  77. package/dist/parse-benchmark-action.test.js.map +1 -0
  78. package/dist/parse-go.d.ts +12 -0
  79. package/dist/parse-go.d.ts.map +1 -0
  80. package/dist/parse-go.js +63 -0
  81. package/dist/parse-go.js.map +1 -0
  82. package/dist/parse-go.test.d.ts +2 -0
  83. package/dist/parse-go.test.d.ts.map +1 -0
  84. package/dist/parse-go.test.js +110 -0
  85. package/dist/parse-go.test.js.map +1 -0
  86. package/dist/parse-hyperfine.d.ts +3 -0
  87. package/dist/parse-hyperfine.d.ts.map +1 -0
  88. package/dist/parse-hyperfine.js +59 -0
  89. package/dist/parse-hyperfine.js.map +1 -0
  90. package/dist/parse-hyperfine.test.d.ts +2 -0
  91. package/dist/parse-hyperfine.test.d.ts.map +1 -0
  92. package/dist/parse-hyperfine.test.js +64 -0
  93. package/dist/parse-hyperfine.test.js.map +1 -0
  94. package/dist/parse-otlp.d.ts +45 -0
  95. package/dist/parse-otlp.d.ts.map +1 -0
  96. package/dist/parse-otlp.js +92 -0
  97. package/dist/parse-otlp.js.map +1 -0
  98. package/dist/parse-otlp.test.d.ts +2 -0
  99. package/dist/parse-otlp.test.d.ts.map +1 -0
  100. package/dist/parse-otlp.test.js +133 -0
  101. package/dist/parse-otlp.test.js.map +1 -0
  102. package/dist/parse-pytest-benchmark.d.ts +3 -0
  103. package/dist/parse-pytest-benchmark.d.ts.map +1 -0
  104. package/dist/parse-pytest-benchmark.js +72 -0
  105. package/dist/parse-pytest-benchmark.js.map +1 -0
  106. package/dist/parse-pytest-benchmark.test.d.ts +2 -0
  107. package/dist/parse-pytest-benchmark.test.d.ts.map +1 -0
  108. package/dist/parse-pytest-benchmark.test.js +85 -0
  109. package/dist/parse-pytest-benchmark.test.js.map +1 -0
  110. package/dist/parse-rust.d.ts +9 -0
  111. package/dist/parse-rust.d.ts.map +1 -0
  112. package/dist/parse-rust.js +50 -0
  113. package/dist/parse-rust.js.map +1 -0
  114. package/dist/parse-rust.test.d.ts +2 -0
  115. package/dist/parse-rust.test.d.ts.map +1 -0
  116. package/dist/parse-rust.test.js +62 -0
  117. package/dist/parse-rust.test.js.map +1 -0
  118. package/dist/parse.d.ts +7 -0
  119. package/dist/parse.d.ts.map +1 -0
  120. package/dist/parse.js +87 -0
  121. package/dist/parse.js.map +1 -0
  122. package/dist/parse.test.d.ts +2 -0
  123. package/dist/parse.test.d.ts.map +1 -0
  124. package/dist/parse.test.js +171 -0
  125. package/dist/parse.test.js.map +1 -0
  126. package/dist/parser-utils.d.ts +17 -0
  127. package/dist/parser-utils.d.ts.map +1 -0
  128. package/dist/parser-utils.js +29 -0
  129. package/dist/parser-utils.js.map +1 -0
  130. package/dist/parser-utils.test.d.ts +2 -0
  131. package/dist/parser-utils.test.d.ts.map +1 -0
  132. package/dist/parser-utils.test.js +27 -0
  133. package/dist/parser-utils.test.js.map +1 -0
  134. package/dist/retry.d.ts +6 -0
  135. package/dist/retry.d.ts.map +1 -0
  136. package/dist/retry.js +18 -0
  137. package/dist/retry.js.map +1 -0
  138. package/dist/retry.test.d.ts +2 -0
  139. package/dist/retry.test.d.ts.map +1 -0
  140. package/dist/retry.test.js +29 -0
  141. package/dist/retry.test.js.map +1 -0
  142. package/dist/test-otlp-helpers.d.ts.map +1 -0
  143. package/dist/test-otlp-helpers.js.map +1 -0
  144. package/dist/types.d.ts +58 -0
  145. package/dist/types.d.ts.map +1 -0
  146. package/dist/types.js +3 -0
  147. package/dist/types.js.map +1 -0
  148. package/package.json +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-benchmark-action.test.js","sourceRoot":"","sources":["../src/parse-benchmark-action.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { OtlpMetricsDocument } from "./types.js";
2
+ /**
3
+ * Parse Go benchmark text output into an OtlpMetricsDocument.
4
+ *
5
+ * Handles the standard format:
6
+ * BenchmarkName-8 N value unit [value unit ...]
7
+ *
8
+ * Multiple value/unit pairs per line produce multiple metrics per benchmark.
9
+ * The -P suffix is extracted as a "procs" tag.
10
+ */
11
+ export declare function parseGoBench(input: string): OtlpMetricsDocument;
12
+ //# sourceMappingURL=parse-go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-go.d.ts","sourceRoot":"","sources":["../src/parse-go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAMtD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAuD/D"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseGoBench = parseGoBench;
4
+ const build_otlp_result_js_1 = require("./build-otlp-result.js");
5
+ const infer_direction_js_1 = require("./infer-direction.js");
6
+ const parser_utils_js_1 = require("./parser-utils.js");
7
+ /**
8
+ * Parse Go benchmark text output into an OtlpMetricsDocument.
9
+ *
10
+ * Handles the standard format:
11
+ * BenchmarkName-8 N value unit [value unit ...]
12
+ *
13
+ * Multiple value/unit pairs per line produce multiple metrics per benchmark.
14
+ * The -P suffix is extracted as a "procs" tag.
15
+ */
16
+ function parseGoBench(input) {
17
+ if (typeof input !== "string" || input.trim() === "") {
18
+ throw new Error("[parse-go] Input must be a non-empty string.");
19
+ }
20
+ try {
21
+ const benchmarks = [];
22
+ const re = /^(?<name>Benchmark\w[\w/()$%^&*=|,[\]{}"#]*?)(?:-(?<procs>\d+))?\s+(?<iters>\d+)\s+(?<rest>.+)$/;
23
+ for (const line of input.split(/\r?\n/)) {
24
+ const m = line.match(re);
25
+ if (!m?.groups)
26
+ continue;
27
+ const { name, procs, iters: _iters, rest } = m.groups;
28
+ const tags = {};
29
+ if (procs)
30
+ tags.procs = procs;
31
+ const pieces = rest.trim().split(/\s+/);
32
+ const metrics = {};
33
+ // Pieces come in (value, unit) pairs
34
+ for (let i = 0; i + 1 < pieces.length; i += 2) {
35
+ const value = parseFloat(pieces[i]);
36
+ const unit = pieces[i + 1];
37
+ if (isNaN(value))
38
+ continue;
39
+ const metricName = (0, parser_utils_js_1.unitToMetricName)(unit);
40
+ metrics[metricName] = {
41
+ value,
42
+ unit,
43
+ direction: (0, infer_direction_js_1.inferDirection)(unit),
44
+ };
45
+ }
46
+ if (Object.keys(metrics).length > 0) {
47
+ benchmarks.push({
48
+ name,
49
+ tags: Object.keys(tags).length > 0 ? tags : undefined,
50
+ metrics,
51
+ });
52
+ }
53
+ }
54
+ return (0, build_otlp_result_js_1.buildOtlpResult)({
55
+ benchmarks,
56
+ context: { sourceFormat: "go" },
57
+ });
58
+ }
59
+ catch (err) {
60
+ throw new Error(`[parse-go] Failed to parse Go benchmark output: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
61
+ }
62
+ }
63
+ //# sourceMappingURL=parse-go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-go.js","sourceRoot":"","sources":["../src/parse-go.ts"],"names":[],"mappings":";;AAeA,oCAuDC;AApED,iEAAyD;AACzD,6DAAsD;AACtD,uDAAqD;AAErD;;;;;;;;GAQG;AACH,SAAgB,YAAY,CAAC,KAAa;IACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAA0B,EAAE,CAAC;QAE7C,MAAM,EAAE,GACN,iGAAiG,CAAC;QAEpG,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,CAAC,EAAE,MAAM;gBAAE,SAAS;YAEzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;YACtD,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,IAAI,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAE9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,OAAO,GAAyG,EAAE,CAAC;YAEzH,qCAAqC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,IAAI,KAAK,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAE3B,MAAM,UAAU,GAAG,IAAA,kCAAgB,EAAC,IAAI,CAAC,CAAC;gBAC1C,OAAO,CAAC,UAAU,CAAC,GAAG;oBACpB,KAAK;oBACL,IAAI;oBACJ,SAAS,EAAE,IAAA,mCAAc,EAAC,IAAI,CAAC;iBAChC,CAAC;YACJ,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI;oBACJ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;oBACrD,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAA,sCAAe,EAAC;YACrB,UAAU;YACV,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACrG,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-go.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-go.test.d.ts","sourceRoot":"","sources":["../src/parse-go.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const parse_go_js_1 = require("./parse-go.js");
9
+ const metrics_batch_js_1 = require("./metrics-batch.js");
10
+ (0, node_test_1.describe)("parseGoBench", () => {
11
+ (0, node_test_1.it)("parses a single benchmark line", () => {
12
+ const input = `BenchmarkFib20-8 30000 41653 ns/op`;
13
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
14
+ strict_1.default.equal(batch.scenarios.length, 1);
15
+ strict_1.default.equal(batch.scenarios[0], "BenchmarkFib20");
16
+ const p = batch.forScenario("BenchmarkFib20").forMetric("ns_per_op").points[0];
17
+ strict_1.default.equal(p.value, 41653);
18
+ strict_1.default.equal(p.unit, "ns/op");
19
+ strict_1.default.equal(p.direction, "smaller_is_better");
20
+ strict_1.default.equal(p.tags["procs"], "8");
21
+ });
22
+ (0, node_test_1.it)("parses multiple metrics per line", () => {
23
+ const input = `BenchmarkScanner-8 5000 234567 ns/op 4096 B/op 12 allocs/op`;
24
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
25
+ strict_1.default.equal(batch.scenarios.length, 1);
26
+ strict_1.default.equal(batch.metricNames.length, 3);
27
+ strict_1.default.equal(batch.forMetric("ns_per_op").points[0].value, 234567);
28
+ strict_1.default.equal(batch.forMetric("bytes_per_op").points[0].value, 4096);
29
+ strict_1.default.equal(batch.forMetric("allocs_per_op").points[0].value, 12);
30
+ });
31
+ (0, node_test_1.it)("parses multiple benchmark lines", () => {
32
+ const input = [
33
+ "goos: linux",
34
+ "goarch: amd64",
35
+ "pkg: github.com/example/pkg",
36
+ "BenchmarkA-8 10000 12345 ns/op",
37
+ "BenchmarkB-8 20000 6789 ns/op",
38
+ "PASS",
39
+ "ok github.com/example/pkg 2.345s",
40
+ ].join("\n");
41
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
42
+ strict_1.default.equal(batch.scenarios.length, 2);
43
+ strict_1.default.ok(batch.scenarios.includes("BenchmarkA"));
44
+ strict_1.default.ok(batch.scenarios.includes("BenchmarkB"));
45
+ });
46
+ (0, node_test_1.it)("handles benchmarks without procs suffix", () => {
47
+ const input = `BenchmarkSimple 50000 30000 ns/op`;
48
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
49
+ strict_1.default.equal(batch.scenarios.length, 1);
50
+ strict_1.default.equal(batch.scenarios[0], "BenchmarkSimple");
51
+ strict_1.default.equal(batch.points[0].tags["procs"], undefined);
52
+ });
53
+ (0, node_test_1.it)("handles MB/s as bigger_is_better", () => {
54
+ const input = `BenchmarkRead-8 1000 500000 ns/op 200.00 MB/s`;
55
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
56
+ strict_1.default.equal(batch.forMetric("mb_per_s").points[0].direction, "bigger_is_better");
57
+ });
58
+ (0, node_test_1.it)("returns empty batch for non-benchmark input", () => {
59
+ const input = "just some random text\nno benchmarks here";
60
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
61
+ strict_1.default.equal(batch.size, 0);
62
+ });
63
+ (0, node_test_1.it)("throws on empty string input", () => {
64
+ strict_1.default.throws(() => (0, parse_go_js_1.parseGoBench)(""), {
65
+ message: /\[parse-go\] Input must be a non-empty string/,
66
+ });
67
+ });
68
+ (0, node_test_1.it)("throws on whitespace-only input", () => {
69
+ strict_1.default.throws(() => (0, parse_go_js_1.parseGoBench)(" \n\t \n "), {
70
+ message: /\[parse-go\] Input must be a non-empty string/,
71
+ });
72
+ });
73
+ (0, node_test_1.it)("parses sub-benchmark names with slashes", () => {
74
+ const input = `BenchmarkSort/asc-8 10000 100 ns/op`;
75
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
76
+ strict_1.default.equal(batch.scenarios.length, 1);
77
+ strict_1.default.equal(batch.scenarios[0], "BenchmarkSort/asc");
78
+ });
79
+ (0, node_test_1.it)("parses benchmark names with special characters", () => {
80
+ const input = `BenchmarkParse/json(100)-8 5000 200 ns/op`;
81
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
82
+ strict_1.default.equal(batch.scenarios.length, 1);
83
+ strict_1.default.equal(batch.scenarios[0], "BenchmarkParse/json(100)");
84
+ });
85
+ (0, node_test_1.it)("skips lines where benchmark name contains spaces (unsupported)", () => {
86
+ const input = `Benchmark Has Spaces-8 1000 100 ns/op`;
87
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
88
+ strict_1.default.equal(batch.size, 0);
89
+ });
90
+ (0, node_test_1.it)("handles custom metric units via fallback key", () => {
91
+ const input = `BenchmarkEncode-4 2000 512 ns/op 1234 bytes`;
92
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
93
+ strict_1.default.equal(batch.scenarios.length, 1);
94
+ const bytesPoint = batch.forMetric("bytes").points[0];
95
+ strict_1.default.ok(bytesPoint, "custom unit should produce metric keyed by unit name");
96
+ strict_1.default.equal(bytesPoint.value, 1234);
97
+ });
98
+ (0, node_test_1.it)("ignores PASS/FAIL/ok summary lines", () => {
99
+ const input = [
100
+ "PASS",
101
+ "FAIL\tgithub.com/example/pkg",
102
+ "ok \tgithub.com/example/pkg\t1.234s",
103
+ "BenchmarkOk-8 1000 99 ns/op",
104
+ ].join("\n");
105
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_go_js_1.parseGoBench)(input));
106
+ strict_1.default.equal(batch.scenarios.length, 1);
107
+ strict_1.default.equal(batch.scenarios[0], "BenchmarkOk");
108
+ });
109
+ });
110
+ //# sourceMappingURL=parse-go.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-go.test.js","sourceRoot":"","sources":["../src/parse-go.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OtlpMetricsDocument } from "./types.js";
2
+ export declare function parseHyperfine(input: string): OtlpMetricsDocument;
3
+ //# sourceMappingURL=parse-hyperfine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-hyperfine.d.ts","sourceRoot":"","sources":["../src/parse-hyperfine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAkCtD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CA6DjE"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseHyperfine = parseHyperfine;
4
+ const build_otlp_result_js_1 = require("./build-otlp-result.js");
5
+ const infer_direction_js_1 = require("./infer-direction.js");
6
+ function parseHyperfine(input) {
7
+ let parsed;
8
+ try {
9
+ parsed = JSON.parse(input);
10
+ }
11
+ catch (err) {
12
+ throw new Error(`[parse-hyperfine] Failed to parse input as JSON: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
13
+ }
14
+ if (!parsed.results || !Array.isArray(parsed.results)) {
15
+ throw new Error("[parse-hyperfine] Hyperfine format must have a 'results' array.");
16
+ }
17
+ const benchmarks = parsed.results.map((result) => {
18
+ if (typeof result.command !== "string") {
19
+ throw new Error("[parse-hyperfine] Each Hyperfine result must have a 'command' string.");
20
+ }
21
+ const timeDirection = (0, infer_direction_js_1.inferDirection)("s");
22
+ const metrics = {
23
+ mean: {
24
+ value: result.mean,
25
+ unit: "s",
26
+ direction: timeDirection,
27
+ },
28
+ stddev: {
29
+ value: result.stddev,
30
+ unit: "s",
31
+ direction: timeDirection,
32
+ },
33
+ median: {
34
+ value: result.median,
35
+ unit: "s",
36
+ direction: timeDirection,
37
+ },
38
+ min: {
39
+ value: result.min,
40
+ unit: "s",
41
+ direction: timeDirection,
42
+ },
43
+ max: {
44
+ value: result.max,
45
+ unit: "s",
46
+ direction: timeDirection,
47
+ },
48
+ };
49
+ return {
50
+ name: result.command,
51
+ metrics,
52
+ };
53
+ });
54
+ return (0, build_otlp_result_js_1.buildOtlpResult)({
55
+ benchmarks,
56
+ context: { sourceFormat: "hyperfine" },
57
+ });
58
+ }
59
+ //# sourceMappingURL=parse-hyperfine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-hyperfine.js","sourceRoot":"","sources":["../src/parse-hyperfine.ts"],"names":[],"mappings":";;AAkCA,wCA6DC;AA7FD,iEAAyD;AACzD,6DAAsD;AA+BtD,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,oDAAoD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACtG,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,UAAU,GAA2B,MAAM,CAAC,OAA6B,CAAC,GAAG,CACjF,CAAC,MAAM,EAAE,EAAE;QACT,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,aAAa,GAAG,IAAA,mCAAc,EAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAqC;YAChD,IAAI,EAAE;gBACJ,KAAK,EAAE,MAAM,CAAC,IAAI;gBAClB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,MAAM,CAAC,GAAG;gBACjB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,MAAM,CAAC,GAAG;gBACjB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;SACF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,OAAO;YACpB,OAAO;SACR,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,OAAO,IAAA,sCAAe,EAAC;QACrB,UAAU;QACV,OAAO,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE;KACvC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-hyperfine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-hyperfine.test.d.ts","sourceRoot":"","sources":["../src/parse-hyperfine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const parse_hyperfine_js_1 = require("./parse-hyperfine.js");
9
+ const parse_js_1 = require("./parse.js");
10
+ const metrics_batch_js_1 = require("./metrics-batch.js");
11
+ const HYPERFINE_OUTPUT = JSON.stringify({
12
+ results: [
13
+ {
14
+ command: "sort input.txt",
15
+ mean: 0.123,
16
+ stddev: 0.005,
17
+ median: 0.121,
18
+ min: 0.115,
19
+ max: 0.135,
20
+ times: [0.115, 0.121, 0.123, 0.135],
21
+ },
22
+ {
23
+ command: "ls -l",
24
+ mean: 0.01,
25
+ stddev: 0.001,
26
+ median: 0.01,
27
+ min: 0.009,
28
+ max: 0.012,
29
+ times: [0.009, 0.01, 0.01, 0.012],
30
+ },
31
+ ],
32
+ });
33
+ (0, node_test_1.describe)("parseHyperfine", () => {
34
+ (0, node_test_1.it)("parses hyperfine JSON output", () => {
35
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_hyperfine_js_1.parseHyperfine)(HYPERFINE_OUTPUT));
36
+ strict_1.default.equal(batch.scenarios.length, 2);
37
+ const sortBatch = batch.forScenario("sort input.txt");
38
+ strict_1.default.equal(sortBatch.forMetric("mean").points[0].value, 0.123);
39
+ strict_1.default.equal(sortBatch.forMetric("mean").points[0].unit, "s");
40
+ strict_1.default.equal(sortBatch.forMetric("mean").points[0].direction, "smaller_is_better");
41
+ strict_1.default.equal(sortBatch.forMetric("stddev").points[0].value, 0.005);
42
+ strict_1.default.equal(sortBatch.forMetric("median").points[0].value, 0.121);
43
+ strict_1.default.equal(sortBatch.forMetric("min").points[0].value, 0.115);
44
+ strict_1.default.equal(sortBatch.forMetric("max").points[0].value, 0.135);
45
+ const lsBatch = batch.forScenario("ls -l");
46
+ strict_1.default.equal(lsBatch.forMetric("mean").points[0].value, 0.01);
47
+ });
48
+ (0, node_test_1.it)("auto-detects hyperfine format", () => {
49
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_js_1.parseBenchmarks)(HYPERFINE_OUTPUT));
50
+ strict_1.default.equal(batch.scenarios.length, 2);
51
+ strict_1.default.ok(batch.scenarios.includes("sort input.txt"));
52
+ });
53
+ (0, node_test_1.it)("throws on invalid hyperfine JSON", () => {
54
+ strict_1.default.throws(() => (0, parse_hyperfine_js_1.parseHyperfine)('{"foo": "bar"}'), {
55
+ message: /\[parse-hyperfine\].*results/,
56
+ });
57
+ });
58
+ (0, node_test_1.it)("throws contextual error on malformed JSON", () => {
59
+ strict_1.default.throws(() => (0, parse_hyperfine_js_1.parseHyperfine)("not-json"), {
60
+ message: /\[parse-hyperfine\] Failed to parse input as JSON/,
61
+ });
62
+ });
63
+ });
64
+ //# sourceMappingURL=parse-hyperfine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-hyperfine.test.js","sourceRoot":"","sources":["../src/parse-hyperfine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { OtlpAggregationTemporality, OtlpAttribute, OtlpMetric, OtlpMetricsDocument } from "./types.js";
2
+ /**
3
+ * Flatten an OTLP `KeyValue` attribute array into a plain string record.
4
+ *
5
+ * All OTLP value types (string, bool, int, double) are coerced to strings.
6
+ * Attributes with an absent or unrecognised value are stored as empty strings.
7
+ *
8
+ * @param attributes - Optional OTLP attribute array to flatten.
9
+ * @returns A `Record<string, string>` mapping each attribute key to its string value.
10
+ */
11
+ export declare function otlpAttributesToRecord(attributes: OtlpAttribute[] | undefined): Record<string, string>;
12
+ /**
13
+ * Parse and minimally validate an OTLP metrics JSON string.
14
+ *
15
+ * Validates that the top-level object contains a `resourceMetrics` array.
16
+ * Throws if the input is not valid JSON or if `resourceMetrics` is absent/not
17
+ * an array.
18
+ *
19
+ * @param input - Raw OTLP metrics JSON string.
20
+ * @returns The parsed `OtlpMetricsDocument`.
21
+ */
22
+ export declare function parseOtlp(input: string): OtlpMetricsDocument;
23
+ /**
24
+ * Determine the data kind of an OTLP metric.
25
+ *
26
+ * Supported kinds are `"gauge"`, `"sum"`, and `"histogram"`.
27
+ * Throws an `Error` if none of those fields are present on the metric.
28
+ *
29
+ * @param metric - The OTLP metric to inspect.
30
+ * @returns `"gauge"`, `"sum"`, or `"histogram"`.
31
+ */
32
+ export declare function getOtlpMetricKind(metric: OtlpMetric): "gauge" | "sum" | "histogram";
33
+ /**
34
+ * Resolve the aggregation temporality for an OTLP sum or histogram metric.
35
+ *
36
+ * Maps the raw numeric OTLP enum to a human-readable string:
37
+ * - `1` → `"delta"`
38
+ * - `2` → `"cumulative"`
39
+ * - anything else (including absent) → `"unspecified"`
40
+ *
41
+ * @param metric - The OTLP metric to inspect.
42
+ * @returns The `OtlpAggregationTemporality` string value.
43
+ */
44
+ export declare function getOtlpTemporality(metric: OtlpMetric): OtlpAggregationTemporality;
45
+ //# sourceMappingURL=parse-otlp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-otlp.d.ts","sourceRoot":"","sources":["../src/parse-otlp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAE1B,aAAa,EACb,UAAU,EACV,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAWpB;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMtG;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAU5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,KAAK,GAAG,WAAW,CAKnF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,0BAA0B,CAKjF"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.otlpAttributesToRecord = otlpAttributesToRecord;
4
+ exports.parseOtlp = parseOtlp;
5
+ exports.getOtlpMetricKind = getOtlpMetricKind;
6
+ exports.getOtlpTemporality = getOtlpTemporality;
7
+ function anyValueToString(value) {
8
+ if (!value)
9
+ return "";
10
+ if (value.stringValue !== undefined)
11
+ return value.stringValue;
12
+ if (value.boolValue !== undefined)
13
+ return String(value.boolValue);
14
+ if (value.intValue !== undefined)
15
+ return String(value.intValue);
16
+ if (value.doubleValue !== undefined)
17
+ return String(value.doubleValue);
18
+ return "";
19
+ }
20
+ /**
21
+ * Flatten an OTLP `KeyValue` attribute array into a plain string record.
22
+ *
23
+ * All OTLP value types (string, bool, int, double) are coerced to strings.
24
+ * Attributes with an absent or unrecognised value are stored as empty strings.
25
+ *
26
+ * @param attributes - Optional OTLP attribute array to flatten.
27
+ * @returns A `Record<string, string>` mapping each attribute key to its string value.
28
+ */
29
+ function otlpAttributesToRecord(attributes) {
30
+ const record = {};
31
+ for (const attribute of attributes ?? []) {
32
+ record[attribute.key] = anyValueToString(attribute.value);
33
+ }
34
+ return record;
35
+ }
36
+ /**
37
+ * Parse and minimally validate an OTLP metrics JSON string.
38
+ *
39
+ * Validates that the top-level object contains a `resourceMetrics` array.
40
+ * Throws if the input is not valid JSON or if `resourceMetrics` is absent/not
41
+ * an array.
42
+ *
43
+ * @param input - Raw OTLP metrics JSON string.
44
+ * @returns The parsed `OtlpMetricsDocument`.
45
+ */
46
+ function parseOtlp(input) {
47
+ const parsed = JSON.parse(input);
48
+ if (typeof parsed !== "object" ||
49
+ parsed === null ||
50
+ !Array.isArray(parsed.resourceMetrics)) {
51
+ throw new Error("[parse-otlp] OTLP metrics JSON must contain a top-level resourceMetrics array.");
52
+ }
53
+ return parsed;
54
+ }
55
+ /**
56
+ * Determine the data kind of an OTLP metric.
57
+ *
58
+ * Supported kinds are `"gauge"`, `"sum"`, and `"histogram"`.
59
+ * Throws an `Error` if none of those fields are present on the metric.
60
+ *
61
+ * @param metric - The OTLP metric to inspect.
62
+ * @returns `"gauge"`, `"sum"`, or `"histogram"`.
63
+ */
64
+ function getOtlpMetricKind(metric) {
65
+ if (metric.gauge)
66
+ return "gauge";
67
+ if (metric.sum)
68
+ return "sum";
69
+ if (metric.histogram)
70
+ return "histogram";
71
+ throw new Error(`[parse-otlp] Unsupported OTLP metric kind for metric '${metric.name}'.`);
72
+ }
73
+ /**
74
+ * Resolve the aggregation temporality for an OTLP sum or histogram metric.
75
+ *
76
+ * Maps the raw numeric OTLP enum to a human-readable string:
77
+ * - `1` → `"delta"`
78
+ * - `2` → `"cumulative"`
79
+ * - anything else (including absent) → `"unspecified"`
80
+ *
81
+ * @param metric - The OTLP metric to inspect.
82
+ * @returns The `OtlpAggregationTemporality` string value.
83
+ */
84
+ function getOtlpTemporality(metric) {
85
+ const raw = metric.sum?.aggregationTemporality ?? metric.histogram?.aggregationTemporality;
86
+ if (raw === 1)
87
+ return "delta";
88
+ if (raw === 2)
89
+ return "cumulative";
90
+ return "unspecified";
91
+ }
92
+ //# sourceMappingURL=parse-otlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-otlp.js","sourceRoot":"","sources":["../src/parse-otlp.ts"],"names":[],"mappings":";;AA0BA,wDAMC;AAYD,8BAUC;AAWD,8CAKC;AAaD,gDAKC;AAhFD,SAAS,gBAAgB,CAAC,KAA+B;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC;IAC9D,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CAAC,UAAuC;IAC5E,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,UAAU,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1C,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,CAAC,KAAK,CAAC,OAAO,CAAE,MAAkC,CAAC,eAAe,CAAC,EACnE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,MAA6B,CAAC;AACvC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,iBAAiB,CAAC,MAAkB;IAClD,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC;IACjC,IAAI,MAAM,CAAC,GAAG;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,WAAW,CAAC;IACzC,MAAM,IAAI,KAAK,CAAC,yDAAyD,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;AAC5F,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,kBAAkB,CAAC,MAAkB;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,sBAAsB,IAAI,MAAM,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3F,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IACnC,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-otlp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-otlp.test.d.ts","sourceRoot":"","sources":["../src/parse-otlp.test.ts"],"names":[],"mappings":""}