@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,133 @@
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_otlp_js_1 = require("./parse-otlp.js");
9
+ function makeDocument() {
10
+ return {
11
+ resourceMetrics: [
12
+ {
13
+ resource: {
14
+ attributes: [
15
+ { key: "benchkit.run_id", value: { stringValue: "run-123" } },
16
+ { key: "benchkit.kind", value: { stringValue: "workflow" } },
17
+ { key: "benchkit.source_format", value: { stringValue: "otlp" } },
18
+ { key: "benchkit.ref", value: { stringValue: "refs/heads/main" } },
19
+ { key: "benchkit.commit", value: { stringValue: "abcdef123456" } },
20
+ { key: "benchkit.workflow", value: { stringValue: "Workflow Benchmark" } },
21
+ { key: "benchkit.job", value: { stringValue: "workflow-bench" } },
22
+ { key: "service.name", value: { stringValue: "mock-ingest" } },
23
+ ],
24
+ },
25
+ scopeMetrics: [
26
+ {
27
+ metrics: [
28
+ {
29
+ name: "events_per_sec",
30
+ unit: "events/sec",
31
+ gauge: {
32
+ dataPoints: [
33
+ {
34
+ attributes: [
35
+ { key: "benchkit.scenario", value: { stringValue: "json-ingest" } },
36
+ { key: "benchkit.series", value: { stringValue: "mock-http-ingest" } },
37
+ { key: "benchkit.metric.direction", value: { stringValue: "bigger_is_better" } },
38
+ { key: "benchkit.metric.role", value: { stringValue: "outcome" } },
39
+ { key: "benchkit.transport", value: { stringValue: "http" } },
40
+ ],
41
+ timeUnixNano: "1711929600000000000",
42
+ asDouble: 13240.5,
43
+ },
44
+ {
45
+ attributes: [
46
+ { key: "benchkit.scenario", value: { stringValue: "json-ingest" } },
47
+ { key: "benchkit.series", value: { stringValue: "mock-http-ingest" } },
48
+ { key: "benchkit.metric.direction", value: { stringValue: "bigger_is_better" } },
49
+ { key: "benchkit.metric.role", value: { stringValue: "outcome" } },
50
+ { key: "benchkit.transport", value: { stringValue: "http" } },
51
+ ],
52
+ timeUnixNano: "1711929660000000000",
53
+ asDouble: 14000,
54
+ },
55
+ ],
56
+ },
57
+ },
58
+ {
59
+ name: "_monitor.cpu_user_pct",
60
+ unit: "%",
61
+ sum: {
62
+ aggregationTemporality: 2,
63
+ dataPoints: [
64
+ {
65
+ attributes: [
66
+ { key: "benchkit.scenario", value: { stringValue: "diagnostic" } },
67
+ { key: "benchkit.series", value: { stringValue: "system" } },
68
+ { key: "benchkit.metric.role", value: { stringValue: "diagnostic" } },
69
+ { key: "benchkit.metric.direction", value: { stringValue: "smaller_is_better" } },
70
+ ],
71
+ startTimeUnixNano: "1711929540000000000",
72
+ timeUnixNano: "1711929600000000000",
73
+ asDouble: 71.2,
74
+ },
75
+ ],
76
+ },
77
+ },
78
+ {
79
+ name: "request_latency_ms",
80
+ unit: "ms",
81
+ histogram: {
82
+ aggregationTemporality: 2,
83
+ dataPoints: [
84
+ {
85
+ attributes: [
86
+ { key: "benchkit.scenario", value: { stringValue: "json-ingest" } },
87
+ { key: "benchkit.series", value: { stringValue: "mock-http-ingest" } },
88
+ { key: "benchkit.metric.direction", value: { stringValue: "smaller_is_better" } },
89
+ ],
90
+ timeUnixNano: "1711929600000000000",
91
+ count: "15",
92
+ sum: 2148,
93
+ },
94
+ ],
95
+ },
96
+ },
97
+ ],
98
+ },
99
+ ],
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ (0, node_test_1.describe)("parseOtlpMetrics", () => {
105
+ (0, node_test_1.it)("parses a valid OTLP metrics document", () => {
106
+ const parsed = (0, parse_otlp_js_1.parseOtlp)(JSON.stringify(makeDocument()));
107
+ strict_1.default.equal(parsed.resourceMetrics.length, 1);
108
+ strict_1.default.equal(parsed.resourceMetrics[0].scopeMetrics?.[0].metrics?.length, 3);
109
+ });
110
+ (0, node_test_1.it)("throws when resourceMetrics is missing", () => {
111
+ strict_1.default.throws(() => (0, parse_otlp_js_1.parseOtlp)("{}"), /resourceMetrics/);
112
+ });
113
+ });
114
+ (0, node_test_1.describe)("OTLP traversal helpers", () => {
115
+ (0, node_test_1.it)("converts attributes to flat string records", () => {
116
+ const record = (0, parse_otlp_js_1.otlpAttributesToRecord)([
117
+ { key: "a", value: { stringValue: "hello" } },
118
+ { key: "b", value: { intValue: "42" } },
119
+ { key: "c", value: { boolValue: true } },
120
+ ]);
121
+ strict_1.default.deepEqual(record, { a: "hello", b: "42", c: "true" });
122
+ });
123
+ (0, node_test_1.it)("reports metric kind and temporality", () => {
124
+ const document = (0, parse_otlp_js_1.parseOtlp)(JSON.stringify(makeDocument()));
125
+ const metrics = document.resourceMetrics[0].scopeMetrics?.[0].metrics ?? [];
126
+ strict_1.default.equal((0, parse_otlp_js_1.getOtlpMetricKind)(metrics[0]), "gauge");
127
+ strict_1.default.equal((0, parse_otlp_js_1.getOtlpMetricKind)(metrics[1]), "sum");
128
+ strict_1.default.equal((0, parse_otlp_js_1.getOtlpMetricKind)(metrics[2]), "histogram");
129
+ strict_1.default.equal((0, parse_otlp_js_1.getOtlpTemporality)(metrics[0]), "unspecified");
130
+ strict_1.default.equal((0, parse_otlp_js_1.getOtlpTemporality)(metrics[1]), "cumulative");
131
+ });
132
+ });
133
+ //# sourceMappingURL=parse-otlp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-otlp.test.js","sourceRoot":"","sources":["../src/parse-otlp.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,mDAKyB;AAEzB,SAAS,YAAY;IACnB,OAAO;QACL,eAAe,EAAE;YACf;gBACE,QAAQ,EAAE;oBACR,UAAU,EAAE;wBACV,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;wBAC7D,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE;wBAC5D,EAAE,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;wBACjE,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAAE;wBAClE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;wBAClE,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,oBAAoB,EAAE,EAAE;wBAC1E,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE;wBACjE,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;qBAC/D;iBACF;gBACD,YAAY,EAAE;oBACZ;wBACE,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,gBAAgB;gCACtB,IAAI,EAAE,YAAY;gCAClB,KAAK,EAAE;oCACL,UAAU,EAAE;wCACV;4CACE,UAAU,EAAE;gDACV,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;gDACnE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE;gDACtE,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE;gDAChF,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;gDAClE,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;6CAC9D;4CACD,YAAY,EAAE,qBAAqB;4CACnC,QAAQ,EAAE,OAAO;yCAClB;wCACD;4CACE,UAAU,EAAE;gDACV,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;gDACnE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE;gDACtE,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE;gDAChF,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;gDAClE,EAAE,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE;6CAC9D;4CACD,YAAY,EAAE,qBAAqB;4CACnC,QAAQ,EAAE,KAAK;yCAChB;qCACF;iCACF;6BACF;4BACD;gCACE,IAAI,EAAE,uBAAuB;gCAC7B,IAAI,EAAE,GAAG;gCACT,GAAG,EAAE;oCACH,sBAAsB,EAAE,CAAC;oCACzB,UAAU,EAAE;wCACV;4CACE,UAAU,EAAE;gDACV,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;gDAClE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE;gDAC5D,EAAE,GAAG,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE;gDACrE,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,EAAE;6CAClF;4CACD,iBAAiB,EAAE,qBAAqB;4CACxC,YAAY,EAAE,qBAAqB;4CACnC,QAAQ,EAAE,IAAI;yCACf;qCACF;iCACF;6BACF;4BACD;gCACE,IAAI,EAAE,oBAAoB;gCAC1B,IAAI,EAAE,IAAI;gCACV,SAAS,EAAE;oCACT,sBAAsB,EAAE,CAAC;oCACzB,UAAU,EAAE;wCACV;4CACE,UAAU,EAAE;gDACV,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,EAAE;gDACnE,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE;gDACtE,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,EAAE;6CAClF;4CACD,YAAY,EAAE,qBAAqB;4CACnC,KAAK,EAAE,IAAI;4CACX,GAAG,EAAE,IAAI;yCACV;qCACF;iCACF;6BACF;yBACF;qBACF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC;AAED,IAAA,oBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,cAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,MAAM,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAChE,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/C,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,yBAAgB,EAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAA,cAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,MAAM,GAAG,IAAA,sCAAsB,EAAC;YACpC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE;YAC7C,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YACvC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;SACzC,CAAC,CAAC;QACH,gBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,IAAA,yBAAgB,EAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC5E,gBAAM,CAAC,KAAK,CAAC,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,gBAAM,CAAC,KAAK,CAAC,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACnD,gBAAM,CAAC,KAAK,CAAC,IAAA,iCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACzD,gBAAM,CAAC,KAAK,CAAC,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC5D,gBAAM,CAAC,KAAK,CAAC,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { OtlpMetricsDocument } from "./types.js";
2
+ export declare function parsePytestBenchmark(input: string): OtlpMetricsDocument;
3
+ //# sourceMappingURL=parse-pytest-benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-pytest-benchmark.d.ts","sourceRoot":"","sources":["../src/parse-pytest-benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAgDtD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CA0EvE"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parsePytestBenchmark = parsePytestBenchmark;
4
+ const build_otlp_result_js_1 = require("./build-otlp-result.js");
5
+ const infer_direction_js_1 = require("./infer-direction.js");
6
+ function parsePytestBenchmark(input) {
7
+ let parsed;
8
+ try {
9
+ parsed = JSON.parse(input);
10
+ }
11
+ catch (err) {
12
+ throw new Error(`[parse-pytest-benchmark] Failed to parse input as JSON: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
13
+ }
14
+ if (!parsed.benchmarks || !Array.isArray(parsed.benchmarks)) {
15
+ throw new Error("[parse-pytest-benchmark] pytest-benchmark format must have a 'benchmarks' array.");
16
+ }
17
+ const benchmarks = parsed.benchmarks.map((entry) => {
18
+ if (typeof entry.name !== "string") {
19
+ throw new Error("[parse-pytest-benchmark] Each pytest-benchmark entry must have a 'name' string.");
20
+ }
21
+ if (!entry.stats || typeof entry.stats !== "object") {
22
+ throw new Error(`[parse-pytest-benchmark] pytest-benchmark entry '${entry.name}' must have a 'stats' object.`);
23
+ }
24
+ const stats = entry.stats;
25
+ const timeDirection = (0, infer_direction_js_1.inferDirection)("s");
26
+ const metrics = {
27
+ mean: {
28
+ value: stats.mean,
29
+ unit: "s",
30
+ direction: timeDirection,
31
+ },
32
+ median: {
33
+ value: stats.median,
34
+ unit: "s",
35
+ direction: timeDirection,
36
+ },
37
+ min: {
38
+ value: stats.min,
39
+ unit: "s",
40
+ direction: timeDirection,
41
+ },
42
+ max: {
43
+ value: stats.max,
44
+ unit: "s",
45
+ direction: timeDirection,
46
+ },
47
+ stddev: {
48
+ value: stats.stddev,
49
+ unit: "s",
50
+ direction: timeDirection,
51
+ },
52
+ ops: {
53
+ value: stats.ops,
54
+ unit: "ops/s",
55
+ direction: (0, infer_direction_js_1.inferDirection)("ops/s"),
56
+ },
57
+ rounds: {
58
+ value: stats.rounds,
59
+ direction: "bigger_is_better",
60
+ },
61
+ };
62
+ return {
63
+ name: entry.name,
64
+ metrics,
65
+ };
66
+ });
67
+ return (0, build_otlp_result_js_1.buildOtlpResult)({
68
+ benchmarks,
69
+ context: { sourceFormat: "pytest-benchmark" },
70
+ });
71
+ }
72
+ //# sourceMappingURL=parse-pytest-benchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-pytest-benchmark.js","sourceRoot":"","sources":["../src/parse-pytest-benchmark.ts"],"names":[],"mappings":";;AAgDA,oDA0EC;AAxHD,iEAAyD;AACzD,6DAAsD;AA6CtD,SAAgB,oBAAoB,CAAC,KAAa;IAChD,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAA0B,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,2DAA2D,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAC7G,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,UAAU,GAA0B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxE,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACrG,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,oDAAoD,KAAK,CAAC,IAAI,+BAA+B,CAC9F,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,aAAa,GAAG,IAAA,mCAAc,EAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAqC;YAChD,IAAI,EAAE;gBACJ,KAAK,EAAE,KAAK,CAAC,IAAI;gBACjB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,IAAI,EAAE,GAAG;gBACT,SAAS,EAAE,aAAa;aACzB;YACD,GAAG,EAAE;gBACH,KAAK,EAAE,KAAK,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,IAAA,mCAAc,EAAC,OAAO,CAAC;aACnC;YACD,MAAM,EAAE;gBACN,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,SAAS,EAAE,kBAAkB;aAC9B;SACF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,IAAA,sCAAe,EAAC;QACrB,UAAU;QACV,OAAO,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-pytest-benchmark.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-pytest-benchmark.test.d.ts","sourceRoot":"","sources":["../src/parse-pytest-benchmark.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
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_pytest_benchmark_js_1 = require("./parse-pytest-benchmark.js");
9
+ const parse_js_1 = require("./parse.js");
10
+ const metrics_batch_js_1 = require("./metrics-batch.js");
11
+ const PYTEST_BENCHMARK_OUTPUT = JSON.stringify({
12
+ benchmarks: [
13
+ {
14
+ name: "test_sort",
15
+ fullname: "tests/test_perf.py::test_sort",
16
+ stats: {
17
+ min: 0.000123,
18
+ max: 0.000156,
19
+ mean: 0.000134,
20
+ stddev: 0.0000089,
21
+ rounds: 1000,
22
+ median: 0.000132,
23
+ ops: 7462.68,
24
+ },
25
+ },
26
+ {
27
+ name: "test_search",
28
+ fullname: "tests/test_perf.py::test_search",
29
+ stats: {
30
+ min: 0.000050,
31
+ max: 0.000080,
32
+ mean: 0.000063,
33
+ stddev: 0.000005,
34
+ rounds: 2000,
35
+ median: 0.000062,
36
+ ops: 15873.02,
37
+ },
38
+ },
39
+ ],
40
+ });
41
+ (0, node_test_1.describe)("parsePytestBenchmark", () => {
42
+ (0, node_test_1.it)("parses pytest-benchmark JSON output", () => {
43
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(PYTEST_BENCHMARK_OUTPUT));
44
+ strict_1.default.equal(batch.scenarios.length, 2);
45
+ const sortBatch = batch.forScenario("test_sort");
46
+ strict_1.default.equal(sortBatch.forMetric("mean").points[0].value, 0.000134);
47
+ strict_1.default.equal(sortBatch.forMetric("mean").points[0].unit, "s");
48
+ strict_1.default.equal(sortBatch.forMetric("mean").points[0].direction, "smaller_is_better");
49
+ strict_1.default.equal(sortBatch.forMetric("median").points[0].value, 0.000132);
50
+ strict_1.default.equal(sortBatch.forMetric("min").points[0].value, 0.000123);
51
+ strict_1.default.equal(sortBatch.forMetric("max").points[0].value, 0.000156);
52
+ strict_1.default.equal(sortBatch.forMetric("stddev").points[0].value, 0.0000089);
53
+ strict_1.default.equal(sortBatch.forMetric("ops").points[0].value, 7462.68);
54
+ strict_1.default.equal(sortBatch.forMetric("ops").points[0].unit, "ops/s");
55
+ strict_1.default.equal(sortBatch.forMetric("ops").points[0].direction, "bigger_is_better");
56
+ strict_1.default.equal(sortBatch.forMetric("rounds").points[0].value, 1000);
57
+ strict_1.default.equal(sortBatch.forMetric("rounds").points[0].direction, "bigger_is_better");
58
+ });
59
+ (0, node_test_1.it)("parses multiple benchmarks", () => {
60
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(PYTEST_BENCHMARK_OUTPUT));
61
+ const searchBatch = batch.forScenario("test_search");
62
+ strict_1.default.equal(searchBatch.forMetric("mean").points[0].value, 0.000063);
63
+ strict_1.default.equal(searchBatch.forMetric("ops").points[0].value, 15873.02);
64
+ strict_1.default.equal(searchBatch.forMetric("rounds").points[0].value, 2000);
65
+ });
66
+ (0, node_test_1.it)("auto-detects pytest-benchmark format", () => {
67
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_js_1.parseBenchmarks)(PYTEST_BENCHMARK_OUTPUT));
68
+ strict_1.default.equal(batch.scenarios.length, 2);
69
+ strict_1.default.ok(batch.scenarios.includes("test_sort"));
70
+ });
71
+ (0, node_test_1.it)("throws on missing benchmarks array", () => {
72
+ strict_1.default.throws(() => (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)('{"foo": "bar"}'), {
73
+ message: /\[parse-pytest-benchmark\].*benchmarks/,
74
+ });
75
+ });
76
+ (0, node_test_1.it)("throws when an entry lacks a stats object", () => {
77
+ strict_1.default.throws(() => (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(JSON.stringify({ benchmarks: [{ name: "bad_bench" }] })), { message: /stats/ });
78
+ });
79
+ (0, node_test_1.it)("throws contextual error on malformed JSON", () => {
80
+ strict_1.default.throws(() => (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)("not-json"), {
81
+ message: /\[parse-pytest-benchmark\] Failed to parse input as JSON/,
82
+ });
83
+ });
84
+ });
85
+ //# sourceMappingURL=parse-pytest-benchmark.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-pytest-benchmark.test.js","sourceRoot":"","sources":["../src/parse-pytest-benchmark.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { OtlpMetricsDocument } from "./types.js";
2
+ /**
3
+ * Parse Rust cargo bench (libtest) output into an OtlpMetricsDocument.
4
+ *
5
+ * Example:
6
+ * test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
7
+ */
8
+ export declare function parseRustBench(input: string): OtlpMetricsDocument;
9
+ //# sourceMappingURL=parse-rust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-rust.d.ts","sourceRoot":"","sources":["../src/parse-rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAKtD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAgDjE"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseRustBench = parseRustBench;
4
+ const build_otlp_result_js_1 = require("./build-otlp-result.js");
5
+ const parser_utils_js_1 = require("./parser-utils.js");
6
+ /**
7
+ * Parse Rust cargo bench (libtest) output into an OtlpMetricsDocument.
8
+ *
9
+ * Example:
10
+ * test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
11
+ */
12
+ function parseRustBench(input) {
13
+ if (typeof input !== "string" || input.trim() === "") {
14
+ throw new Error("[parse-rust] Input must be a non-empty string.");
15
+ }
16
+ try {
17
+ const benchmarks = [];
18
+ const re = /^test\s+(?<name>\S+)\s+\.\.\.\s+bench:\s+(?<value>[\d,]+)\s+(?<unit>\S+)(?:\s+\(\+\/-\s+(?<range>[\d,]+)\))?/;
19
+ for (const line of input.split(/\r?\n/)) {
20
+ const trimmedLine = line.trim();
21
+ const m = trimmedLine.match(re);
22
+ if (!m?.groups)
23
+ continue;
24
+ const { name, value, unit, range: _range } = m.groups;
25
+ const numericValue = parseFloat(value.replace(/,/g, ""));
26
+ if (isNaN(numericValue)) {
27
+ throw new Error(`Invalid numeric value '${value}' for benchmark '${name}'.`);
28
+ }
29
+ const metric = {
30
+ value: numericValue,
31
+ unit,
32
+ direction: "smaller_is_better",
33
+ };
34
+ const metrics = {};
35
+ metrics[(0, parser_utils_js_1.unitToMetricName)(unit)] = metric;
36
+ benchmarks.push({
37
+ name,
38
+ metrics,
39
+ });
40
+ }
41
+ return (0, build_otlp_result_js_1.buildOtlpResult)({
42
+ benchmarks,
43
+ context: { sourceFormat: "rust" },
44
+ });
45
+ }
46
+ catch (err) {
47
+ throw new Error(`[parse-rust] Failed to parse Rust benchmark output: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
48
+ }
49
+ }
50
+ //# sourceMappingURL=parse-rust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-rust.js","sourceRoot":"","sources":["../src/parse-rust.ts"],"names":[],"mappings":";;AAWA,wCAgDC;AAzDD,iEAAyD;AACzD,uDAAqD;AAErD;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAA0B,EAAE,CAAC;QAE7C,MAAM,EAAE,GACN,8GAA8G,CAAC;QAEjH,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,EAAE,MAAM;gBAAE,SAAS;YAEzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;YAEtD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YACzD,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,oBAAoB,IAAI,IAAI,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,MAAM,GAAqB;gBAC/B,KAAK,EAAE,YAAY;gBACnB,IAAI;gBACJ,SAAS,EAAE,mBAAmB;aAC/B,CAAC;YAEF,MAAM,OAAO,GAAqC,EAAE,CAAC;YACrD,OAAO,CAAC,IAAA,kCAAgB,EAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YAEzC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAA,sCAAe,EAAC;YACrB,UAAU;YACV,OAAO,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzG,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse-rust.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-rust.test.d.ts","sourceRoot":"","sources":["../src/parse-rust.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
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_rust_js_1 = require("./parse-rust.js");
9
+ const metrics_batch_js_1 = require("./metrics-batch.js");
10
+ (0, node_test_1.describe)("parseRustBench", () => {
11
+ (0, node_test_1.it)("parses single rust benchmark", () => {
12
+ const input = "test sort::bench_sort ... bench: 320 ns/iter (+/- 42)";
13
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
14
+ strict_1.default.equal(batch.scenarios.length, 1);
15
+ strict_1.default.equal(batch.scenarios[0], "sort::bench_sort");
16
+ const p = batch.forMetric("ns_per_iter").points[0];
17
+ strict_1.default.equal(p.value, 320);
18
+ strict_1.default.equal(p.unit, "ns/iter");
19
+ strict_1.default.equal(p.direction, "smaller_is_better");
20
+ });
21
+ (0, node_test_1.it)("parses multiple rust benchmarks", () => {
22
+ const input = `
23
+ test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
24
+ test sort::bench_stable ... bench: 285 ns/iter (+/- 31)
25
+ `;
26
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
27
+ strict_1.default.equal(batch.scenarios.length, 2);
28
+ strict_1.default.ok(batch.scenarios.includes("sort::bench_sort"));
29
+ strict_1.default.ok(batch.scenarios.includes("sort::bench_stable"));
30
+ });
31
+ (0, node_test_1.it)("handles benchmarks without range", () => {
32
+ const input = "test basic ... bench: 100 ns/iter";
33
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
34
+ strict_1.default.equal(batch.forMetric("ns_per_iter").points[0].value, 100);
35
+ });
36
+ (0, node_test_1.it)("handles numbers with commas", () => {
37
+ const input = "test large ... bench: 1,234,567 ns/iter (+/- 1,234)";
38
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
39
+ strict_1.default.equal(batch.forMetric("ns_per_iter").points[0].value, 1234567);
40
+ });
41
+ (0, node_test_1.it)("skips non-benchmark lines", () => {
42
+ const input = `
43
+ running 2 tests
44
+ test sort::bench_sort ... bench: 320 ns/iter (+/- 42)
45
+ test sort::bench_stable ... bench: 285 ns/iter (+/- 31)
46
+ test result: ok. 0 passed; 0 failed; 0 ignored; 2 measured; 0 filtered out; finished in 0.00s
47
+ `;
48
+ const batch = metrics_batch_js_1.MetricsBatch.fromOtlp((0, parse_rust_js_1.parseRustBench)(input));
49
+ strict_1.default.equal(batch.scenarios.length, 2);
50
+ });
51
+ (0, node_test_1.it)("throws on empty string input", () => {
52
+ strict_1.default.throws(() => (0, parse_rust_js_1.parseRustBench)(""), {
53
+ message: /\[parse-rust\] Input must be a non-empty string/,
54
+ });
55
+ });
56
+ (0, node_test_1.it)("throws on whitespace-only input", () => {
57
+ strict_1.default.throws(() => (0, parse_rust_js_1.parseRustBench)(" \n\t \n "), {
58
+ message: /\[parse-rust\] Input must be a non-empty string/,
59
+ });
60
+ });
61
+ });
62
+ //# sourceMappingURL=parse-rust.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-rust.test.js","sourceRoot":"","sources":["../src/parse-rust.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { OtlpMetricsDocument } from "./types.js";
2
+ export type Format = "go" | "benchmark-action" | "rust" | "hyperfine" | "pytest-benchmark" | "otlp" | "auto";
3
+ /**
4
+ * Detect the input format and parse into an OtlpMetricsDocument.
5
+ */
6
+ export declare function parseBenchmarks(input: string, format?: Format): OtlpMetricsDocument;
7
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQtD,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,kBAAkB,GAAG,MAAM,GAAG,WAAW,GAAG,kBAAkB,GAAG,MAAM,GAAG,MAAM,CAAC;AAE7G;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAe,GAAG,mBAAmB,CAqB3F"}
package/dist/parse.js ADDED
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBenchmarks = parseBenchmarks;
4
+ const parse_go_js_1 = require("./parse-go.js");
5
+ const parse_rust_js_1 = require("./parse-rust.js");
6
+ const parse_benchmark_action_js_1 = require("./parse-benchmark-action.js");
7
+ const parse_hyperfine_js_1 = require("./parse-hyperfine.js");
8
+ const parse_pytest_benchmark_js_1 = require("./parse-pytest-benchmark.js");
9
+ const parse_otlp_js_1 = require("./parse-otlp.js");
10
+ /**
11
+ * Detect the input format and parse into an OtlpMetricsDocument.
12
+ */
13
+ function parseBenchmarks(input, format = "auto") {
14
+ if (format === "auto") {
15
+ format = detectFormat(input);
16
+ }
17
+ switch (format) {
18
+ case "go":
19
+ return (0, parse_go_js_1.parseGoBench)(input);
20
+ case "rust":
21
+ return (0, parse_rust_js_1.parseRustBench)(input);
22
+ case "benchmark-action":
23
+ return (0, parse_benchmark_action_js_1.parseBenchmarkAction)(input);
24
+ case "hyperfine":
25
+ return (0, parse_hyperfine_js_1.parseHyperfine)(input);
26
+ case "pytest-benchmark":
27
+ return (0, parse_pytest_benchmark_js_1.parsePytestBenchmark)(input);
28
+ case "otlp":
29
+ return (0, parse_otlp_js_1.parseOtlp)(input);
30
+ default:
31
+ throw new Error(`[parseBenchmarks] Unknown format: ${format}`);
32
+ }
33
+ }
34
+ /**
35
+ * Auto-detect format from content.
36
+ *
37
+ * - If it parses as JSON with a "benchmarks" key and entries with "stats" → pytest-benchmark
38
+ * - If it parses as JSON with a "resourceMetrics" key → otlp
39
+ * - If it parses as JSON with a "results" key containing objects with "command" → hyperfine
40
+ * - If it parses as a JSON array of objects with "name"/"value"/"unit" → benchmark-action
41
+ * - If it contains lines matching "Benchmark...\s+\d+" → go
42
+ * - Otherwise → error
43
+ */
44
+ function detectFormat(input) {
45
+ const trimmed = input.trim();
46
+ // Try JSON first
47
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
48
+ try {
49
+ const parsed = JSON.parse(trimmed);
50
+ if (parsed.benchmarks && Array.isArray(parsed.benchmarks)) {
51
+ if (parsed.benchmarks.length > 0 &&
52
+ parsed.benchmarks[0].stats &&
53
+ typeof parsed.benchmarks[0].stats === "object") {
54
+ return "pytest-benchmark";
55
+ }
56
+ }
57
+ if (parsed.resourceMetrics && Array.isArray(parsed.resourceMetrics)) {
58
+ return "otlp";
59
+ }
60
+ if (parsed.results &&
61
+ Array.isArray(parsed.results) &&
62
+ parsed.results.length > 0 &&
63
+ typeof parsed.results[0].command === "string") {
64
+ return "hyperfine";
65
+ }
66
+ if (Array.isArray(parsed) &&
67
+ parsed.length > 0 &&
68
+ typeof parsed[0].name === "string" &&
69
+ typeof parsed[0].value === "number") {
70
+ return "benchmark-action";
71
+ }
72
+ }
73
+ catch {
74
+ // Not valid JSON, fall through
75
+ }
76
+ }
77
+ // Check for Go benchmark lines
78
+ if (/^Benchmark\w.*\s+\d+\s+[\d.]+\s+\w+\/\w+/m.test(trimmed)) {
79
+ return "go";
80
+ }
81
+ // Check for Rust benchmark lines
82
+ if (/^test\s+\S+\s+\.\.\.\s+bench:/m.test(trimmed)) {
83
+ return "rust";
84
+ }
85
+ throw new Error("[parseBenchmarks] Could not auto-detect format. Use the 'format' option to specify one of: go, rust, benchmark-action, hyperfine, pytest-benchmark, otlp.");
86
+ }
87
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../src/parse.test.ts"],"names":[],"mappings":""}