autotel-vitest 0.4.43 → 0.4.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +0 -2
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +0 -2
- package/dist/reporter.cjs +0 -2
- package/dist/reporter.d.cts +1 -2
- package/dist/reporter.d.ts +1 -2
- package/dist/reporter.js +0 -2
- package/package.json +4 -4
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/reporter.cjs.map +0 -1
- package/dist/reporter.d.cts.map +0 -1
- package/dist/reporter.d.ts.map +0 -1
- package/dist/reporter.js.map +0 -1
package/dist/index.cjs
CHANGED
package/dist/index.d.cts
CHANGED
|
@@ -20,5 +20,4 @@ import { OtelTraceContext, enrichWithTraceContext, getTraceContext, isTracing, r
|
|
|
20
20
|
*/
|
|
21
21
|
declare const test: import("vitest").TestAPI<Record<string, any> & object>;
|
|
22
22
|
//#endregion
|
|
23
|
-
export { type LogCollector, type LogEntry, type OtelTraceContext, type TestSpan, type TraceCollector, afterAll, afterEach, assertNoErrors, assertTraceCreated, assertTraceDuration, assertTraceFailed, assertTraceSucceeded, beforeAll, beforeEach, createMockLogger, createTraceCollector, describe, enrichWithTraceContext, expect, getTraceContext, getTraceDuration, isTracing, resolveTraceUrl, test, waitForTrace };
|
|
24
|
-
//# sourceMappingURL=index.d.cts.map
|
|
23
|
+
export { type LogCollector, type LogEntry, type OtelTraceContext, type TestSpan, type TraceCollector, afterAll, afterEach, assertNoErrors, assertTraceCreated, assertTraceDuration, assertTraceFailed, assertTraceSucceeded, beforeAll, beforeEach, createMockLogger, createTraceCollector, describe, enrichWithTraceContext, expect, getTraceContext, getTraceDuration, isTracing, resolveTraceUrl, test, waitForTrace };
|
package/dist/index.d.ts
CHANGED
|
@@ -20,5 +20,4 @@ import { LogCollector, LogEntry, TestSpan, TraceCollector, assertNoErrors, asser
|
|
|
20
20
|
*/
|
|
21
21
|
declare const test: import("vitest").TestAPI<Record<string, any> & object>;
|
|
22
22
|
//#endregion
|
|
23
|
-
export { type LogCollector, type LogEntry, type OtelTraceContext, type TestSpan, type TraceCollector, afterAll, afterEach, assertNoErrors, assertTraceCreated, assertTraceDuration, assertTraceFailed, assertTraceSucceeded, beforeAll, beforeEach, createMockLogger, createTraceCollector, describe, enrichWithTraceContext, expect, getTraceContext, getTraceDuration, isTracing, resolveTraceUrl, test, waitForTrace };
|
|
24
|
-
//# sourceMappingURL=index.d.ts.map
|
|
23
|
+
export { type LogCollector, type LogEntry, type OtelTraceContext, type TestSpan, type TraceCollector, afterAll, afterEach, assertNoErrors, assertTraceCreated, assertTraceDuration, assertTraceFailed, assertTraceSucceeded, beforeAll, beforeEach, createMockLogger, createTraceCollector, describe, enrichWithTraceContext, expect, getTraceContext, getTraceDuration, isTracing, resolveTraceUrl, test, waitForTrace };
|
package/dist/index.js
CHANGED
|
@@ -57,5 +57,3 @@ const test = test$1.extend({ _otelTestSpan: [async ({ task }, use) => {
|
|
|
57
57
|
}, { auto: true }] });
|
|
58
58
|
//#endregion
|
|
59
59
|
export { afterAll, afterEach, assertNoErrors, assertTraceCreated, assertTraceDuration, assertTraceFailed, assertTraceSucceeded, beforeAll, beforeEach, createMockLogger, createTraceCollector, describe, enrichWithTraceContext, expect, getTraceContext, getTraceDuration, isTracing, resolveTraceUrl, test, waitForTrace };
|
|
60
|
-
|
|
61
|
-
//# sourceMappingURL=index.js.map
|
package/dist/reporter.cjs
CHANGED
package/dist/reporter.d.cts
CHANGED
|
@@ -14,5 +14,4 @@ declare class OtelReporter implements Reporter {
|
|
|
14
14
|
onTestModuleEnd(testModule: TestModule): void;
|
|
15
15
|
}
|
|
16
16
|
//#endregion
|
|
17
|
-
export { OtelReporter, OtelReporter as default };
|
|
18
|
-
//# sourceMappingURL=reporter.d.cts.map
|
|
17
|
+
export { OtelReporter, OtelReporter as default };
|
package/dist/reporter.d.ts
CHANGED
|
@@ -14,5 +14,4 @@ declare class OtelReporter implements Reporter {
|
|
|
14
14
|
onTestModuleEnd(testModule: TestModule): void;
|
|
15
15
|
}
|
|
16
16
|
//#endregion
|
|
17
|
-
export { OtelReporter, OtelReporter as default };
|
|
18
|
-
//# sourceMappingURL=reporter.d.ts.map
|
|
17
|
+
export { OtelReporter, OtelReporter as default };
|
package/dist/reporter.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autotel-vitest",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.45",
|
|
4
4
|
"description": "Vitest fixture for OpenTelemetry: one span per test so all instrumented code is filterable by test run",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"README.md"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"autotel": "6.1
|
|
27
|
+
"autotel": "6.2.1"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"vitest": ">=4.1.10"
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
}
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@types/node": "^26.1.
|
|
39
|
-
"tsdown": "^0.22.
|
|
38
|
+
"@types/node": "^26.1.2",
|
|
39
|
+
"tsdown": "^0.22.14",
|
|
40
40
|
"typescript": "^6.0.3",
|
|
41
41
|
"vitest": "^4.1.10"
|
|
42
42
|
},
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["TestSpanCollector","SimpleSpanProcessor","otelTrace","otelContext","SpanStatusCode","base"],"sources":["../src/fixture.ts","../src/index.ts"],"sourcesContent":["import {\n getTracer,\n getAutotelTracerProvider,\n context as otelContext,\n otelTrace,\n SpanStatusCode,\n} from 'autotel';\nimport { TestSpanCollector } from 'autotel/test-span-collector';\nimport { SimpleSpanProcessor } from 'autotel/processors';\n\nconst TRACER_NAME = 'vitest-tests';\nconst TRACER_VERSION = '0.1.0';\n\nlet collector: TestSpanCollector | null = null;\n\ninterface TracerProviderWithProcessor {\n addSpanProcessor(processor: unknown): void;\n}\n\nfunction ensureCollector(): TestSpanCollector {\n if (!collector) {\n collector = new TestSpanCollector();\n const provider = getAutotelTracerProvider();\n if ('addSpanProcessor' in provider) {\n (provider as TracerProviderWithProcessor).addSpanProcessor(\n new SimpleSpanProcessor(collector),\n );\n }\n }\n return collector;\n}\n\nexport type OtelFixtureFn = (\n args: {\n task: {\n name: string;\n file?: { name: string };\n suite?: { name: string };\n meta: Record<string, unknown>;\n };\n },\n use: (span: unknown) => Promise<void>,\n) => Promise<void>;\n\nexport const otelTestSpanFixture: [OtelFixtureFn, { auto: true }] = [\n async (\n {\n task,\n }: {\n task: {\n name: string;\n file?: { name: string };\n suite?: { name: string };\n meta: Record<string, unknown>;\n };\n },\n use: (span: unknown) => Promise<void>,\n ) => {\n ensureCollector();\n const tracer = getTracer(TRACER_NAME, TRACER_VERSION);\n const span = tracer.startSpan(`test:${task.name}`, {\n attributes: {\n 'test.name': task.name,\n 'test.file': task.file?.name ?? '',\n 'test.suite': task.suite?.name ?? '',\n },\n });\n const ctx = otelTrace.setSpan(otelContext.active(), span);\n try {\n await otelContext.with(ctx, () => use(span));\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n span.end();\n const traceId = span.spanContext().traceId;\n const rootSpanId = span.spanContext().spanId;\n const spans = collector!.drainTrace(traceId, rootSpanId);\n if (spans.length > 0) {\n (task.meta as Record<string, unknown>).otelSpans = spans;\n }\n }\n },\n { auto: true },\n];\n","/**\n * autotel-vitest\n *\n * Vitest fixture that creates one OTel span per test so all autotel-instrumented\n * code executed during a test automatically creates child spans under it;\n * making every test run filterable in your OTLP backend.\n *\n * @example\n * // vitest.config.ts: globalSetup calls init({ service: 'unit-tests' })\n * // In spec:\n * import { test, expect } from 'autotel-vitest';\n * test('creates user', async () => {\n * await userService.createUser({ email: 'test@example.com' });\n * // All trace()/span() calls become children of the test span\n * });\n */\n\nimport { test as base } from 'vitest';\nimport { otelTestSpanFixture } from './fixture';\n\nexport const test = base.extend({\n _otelTestSpan: otelTestSpanFixture as never,\n});\n\nexport {\n expect,\n describe,\n beforeEach,\n afterEach,\n beforeAll,\n afterAll,\n} from 'vitest';\n\n// Re-export all autotel/testing utilities\nexport {\n createTraceCollector,\n assertTraceCreated,\n assertTraceSucceeded,\n assertTraceFailed,\n assertNoErrors,\n assertTraceDuration,\n waitForTrace,\n getTraceDuration,\n createMockLogger,\n type TraceCollector,\n type TestSpan,\n type LogCollector,\n type LogEntry,\n} from 'autotel/testing';\n\n// Re-export trace context helpers for DX convenience\nexport {\n getTraceContext,\n resolveTraceUrl,\n isTracing,\n enrichWithTraceContext,\n} from 'autotel';\n\nexport type { OtelTraceContext } from 'autotel';\n"],"mappings":";;;;;;;AAUA,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAEvB,IAAI,YAAsC;AAM1C,SAAS,kBAAqC;CAC5C,IAAI,CAAC,WAAW;EACd,YAAY,IAAIA,4BAAAA,kBAAkB;EAClC,MAAM,YAAA,GAAA,QAAA,yBAAA,CAAoC;EAC1C,IAAI,sBAAsB,UACxB,SAA0C,iBACxC,IAAIC,mBAAAA,oBAAoB,SAAS,CACnC;CAEJ;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;ACVA,MAAa,OAAOI,OAAAA,KAAK,OAAO,EAC9B,eAAe,CDwBf,OACE,EACE,QASF,QACG;CACH,gBAAgB;CAEhB,MAAM,QAAA,GAAA,QAAA,UAAA,CADmB,aAAa,cACpB,CAAC,CAAC,UAAU,QAAQ,KAAK,QAAQ,EACjD,YAAY;EACV,aAAa,KAAK;EAClB,aAAa,KAAK,MAAM,QAAQ;EAChC,cAAc,KAAK,OAAO,QAAQ;CACpC,EACF,CAAC;CACD,MAAM,MAAMH,QAAAA,UAAU,QAAQC,QAAAA,QAAY,OAAO,GAAG,IAAI;CACxD,IAAI;EACF,MAAMA,QAAAA,QAAY,KAAK,WAAW,IAAI,IAAI,CAAC;CAC7C,SAAS,OAAO;EACd,KAAK,UAAU,EAAE,MAAMC,QAAAA,eAAe,MAAM,CAAC;EAC7C,KAAK,gBACH,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC1D;EACA,MAAM;CACR,UAAU;EACR,KAAK,IAAI;EACT,MAAM,UAAU,KAAK,YAAY,CAAC,CAAC;EACnC,MAAM,aAAa,KAAK,YAAY,CAAC,CAAC;EACtC,MAAM,QAAQ,UAAW,WAAW,SAAS,UAAU;EACvD,IAAI,MAAM,SAAS,GACjB,KAAM,KAAiC,YAAY;CAEvD;AACF,GACA,EAAE,MAAM,KAAK,CCjEE,EACjB,CAAC"}
|
package/dist/index.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;cAoBa,uBAAI,QAAA"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;cAoBa,uBAAI,QAAA"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["otelContext","base"],"sources":["../src/fixture.ts","../src/index.ts"],"sourcesContent":["import {\n getTracer,\n getAutotelTracerProvider,\n context as otelContext,\n otelTrace,\n SpanStatusCode,\n} from 'autotel';\nimport { TestSpanCollector } from 'autotel/test-span-collector';\nimport { SimpleSpanProcessor } from 'autotel/processors';\n\nconst TRACER_NAME = 'vitest-tests';\nconst TRACER_VERSION = '0.1.0';\n\nlet collector: TestSpanCollector | null = null;\n\ninterface TracerProviderWithProcessor {\n addSpanProcessor(processor: unknown): void;\n}\n\nfunction ensureCollector(): TestSpanCollector {\n if (!collector) {\n collector = new TestSpanCollector();\n const provider = getAutotelTracerProvider();\n if ('addSpanProcessor' in provider) {\n (provider as TracerProviderWithProcessor).addSpanProcessor(\n new SimpleSpanProcessor(collector),\n );\n }\n }\n return collector;\n}\n\nexport type OtelFixtureFn = (\n args: {\n task: {\n name: string;\n file?: { name: string };\n suite?: { name: string };\n meta: Record<string, unknown>;\n };\n },\n use: (span: unknown) => Promise<void>,\n) => Promise<void>;\n\nexport const otelTestSpanFixture: [OtelFixtureFn, { auto: true }] = [\n async (\n {\n task,\n }: {\n task: {\n name: string;\n file?: { name: string };\n suite?: { name: string };\n meta: Record<string, unknown>;\n };\n },\n use: (span: unknown) => Promise<void>,\n ) => {\n ensureCollector();\n const tracer = getTracer(TRACER_NAME, TRACER_VERSION);\n const span = tracer.startSpan(`test:${task.name}`, {\n attributes: {\n 'test.name': task.name,\n 'test.file': task.file?.name ?? '',\n 'test.suite': task.suite?.name ?? '',\n },\n });\n const ctx = otelTrace.setSpan(otelContext.active(), span);\n try {\n await otelContext.with(ctx, () => use(span));\n } catch (error) {\n span.setStatus({ code: SpanStatusCode.ERROR });\n span.recordException(\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n } finally {\n span.end();\n const traceId = span.spanContext().traceId;\n const rootSpanId = span.spanContext().spanId;\n const spans = collector!.drainTrace(traceId, rootSpanId);\n if (spans.length > 0) {\n (task.meta as Record<string, unknown>).otelSpans = spans;\n }\n }\n },\n { auto: true },\n];\n","/**\n * autotel-vitest\n *\n * Vitest fixture that creates one OTel span per test so all autotel-instrumented\n * code executed during a test automatically creates child spans under it;\n * making every test run filterable in your OTLP backend.\n *\n * @example\n * // vitest.config.ts: globalSetup calls init({ service: 'unit-tests' })\n * // In spec:\n * import { test, expect } from 'autotel-vitest';\n * test('creates user', async () => {\n * await userService.createUser({ email: 'test@example.com' });\n * // All trace()/span() calls become children of the test span\n * });\n */\n\nimport { test as base } from 'vitest';\nimport { otelTestSpanFixture } from './fixture';\n\nexport const test = base.extend({\n _otelTestSpan: otelTestSpanFixture as never,\n});\n\nexport {\n expect,\n describe,\n beforeEach,\n afterEach,\n beforeAll,\n afterAll,\n} from 'vitest';\n\n// Re-export all autotel/testing utilities\nexport {\n createTraceCollector,\n assertTraceCreated,\n assertTraceSucceeded,\n assertTraceFailed,\n assertNoErrors,\n assertTraceDuration,\n waitForTrace,\n getTraceDuration,\n createMockLogger,\n type TraceCollector,\n type TestSpan,\n type LogCollector,\n type LogEntry,\n} from 'autotel/testing';\n\n// Re-export trace context helpers for DX convenience\nexport {\n getTraceContext,\n resolveTraceUrl,\n isTracing,\n enrichWithTraceContext,\n} from 'autotel';\n\nexport type { OtelTraceContext } from 'autotel';\n"],"mappings":";;;;;;AAUA,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAEvB,IAAI,YAAsC;AAM1C,SAAS,kBAAqC;CAC5C,IAAI,CAAC,WAAW;EACd,YAAY,IAAI,kBAAkB;EAClC,MAAM,WAAW,yBAAyB;EAC1C,IAAI,sBAAsB,UACxB,SAA0C,iBACxC,IAAI,oBAAoB,SAAS,CACnC;CAEJ;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;ACVA,MAAa,OAAOC,OAAK,OAAO,EAC9B,eAAe,CDwBf,OACE,EACE,QASF,QACG;CACH,gBAAgB;CAEhB,MAAM,OADS,UAAU,aAAa,cACpB,CAAC,CAAC,UAAU,QAAQ,KAAK,QAAQ,EACjD,YAAY;EACV,aAAa,KAAK;EAClB,aAAa,KAAK,MAAM,QAAQ;EAChC,cAAc,KAAK,OAAO,QAAQ;CACpC,EACF,CAAC;CACD,MAAM,MAAM,UAAU,QAAQD,QAAY,OAAO,GAAG,IAAI;CACxD,IAAI;EACF,MAAMA,QAAY,KAAK,WAAW,IAAI,IAAI,CAAC;CAC7C,SAAS,OAAO;EACd,KAAK,UAAU,EAAE,MAAM,eAAe,MAAM,CAAC;EAC7C,KAAK,gBACH,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAC1D;EACA,MAAM;CACR,UAAU;EACR,KAAK,IAAI;EACT,MAAM,UAAU,KAAK,YAAY,CAAC,CAAC;EACnC,MAAM,aAAa,KAAK,YAAY,CAAC,CAAC;EACtC,MAAM,QAAQ,UAAW,WAAW,SAAS,UAAU;EACvD,IAAI,MAAM,SAAS,GACjB,KAAM,KAAiC,YAAY;CAEvD;AACF,GACA,EAAE,MAAM,KAAK,CCjEE,EACjB,CAAC"}
|
package/dist/reporter.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.cjs","names":["SpanStatusCode"],"sources":["../src/reporter.ts"],"sourcesContent":["/**\n * Optional Vitest reporter that creates OTel spans for each test and suite.\n * Runs in the runner process; ensure autotel.init() is called in globalSetup so spans are exported.\n *\n * Use when you want test/suite timing and hierarchy in OTLP from the runner side.\n * For \"test → instrumented code\" in one trace (worker side), use the test fixture.\n *\n * @example\n * // vitest.config.ts\n * import { defineConfig } from 'vitest/config';\n *\n * export default defineConfig({\n * test: {\n * reporters: ['default', 'autotel-vitest/reporter'],\n * globalSetup: './globalSetup.ts', // must call init()\n * },\n * });\n */\n\nimport type { Reporter, TestCase, TestModule, TestSuite } from 'vitest/node';\nimport { getTracer, SpanStatusCode } from 'autotel';\n\nconst TRACER_NAME = 'vitest-reporter';\nconst TRACER_VERSION = '0.1.0';\n\ntype SpanEntry = {\n span: ReturnType<ReturnType<typeof getTracer>['startSpan']>;\n moduleId: string;\n};\n\n/** Convert a vitest TestError-like object to a standard Error for OTel. */\nfunction toError(testError: { message?: string; stack?: string }): Error {\n const err = new Error(testError.message ?? 'Unknown error');\n if (testError.stack) err.stack = testError.stack;\n return err;\n}\n\n/**\n * Vitest Reporter that creates one span per test and one per suite (as parents).\n * Requires autotel.init() in globalSetup so spans are exported.\n */\nclass OtelReporter implements Reporter {\n private testSpans = new Map<string, SpanEntry>();\n private suiteSpans = new Map<string, SpanEntry>();\n\n onTestCaseReady(testCase: TestCase): void {\n const tracer = getTracer(TRACER_NAME, TRACER_VERSION);\n const moduleId = testCase.module.moduleId ?? '';\n const span = tracer.startSpan(`test:${testCase.name}`, {\n attributes: {\n 'test.name': testCase.name,\n 'test.fullName': testCase.fullName,\n 'test.file': moduleId,\n },\n });\n this.testSpans.set(testCase.id, { span, moduleId });\n }\n\n onTestCaseResult(testCase: TestCase): void {\n const entry = this.testSpans.get(testCase.id);\n if (!entry) return;\n\n const result = testCase.result();\n if (result.state === 'failed') {\n entry.span.setStatus({ code: SpanStatusCode.ERROR });\n if (result.errors && result.errors.length > 0) {\n for (const error of result.errors) {\n entry.span.recordException(toError(error));\n }\n }\n }\n entry.span.end();\n this.testSpans.delete(testCase.id);\n }\n\n onTestSuiteReady(testSuite: TestSuite): void {\n const tracer = getTracer(TRACER_NAME, TRACER_VERSION);\n const moduleId = testSuite.module.moduleId ?? '';\n const span = tracer.startSpan(`suite:${testSuite.name}`, {\n attributes: {\n 'suite.name': testSuite.name,\n 'suite.file': moduleId,\n },\n });\n this.suiteSpans.set(testSuite.id, { span, moduleId });\n }\n\n onTestSuiteResult(testSuite: TestSuite): void {\n const entry = this.suiteSpans.get(testSuite.id);\n if (!entry) return;\n\n const state = testSuite.state();\n if (state === 'failed') {\n entry.span.setStatus({ code: SpanStatusCode.ERROR });\n }\n entry.span.end();\n this.suiteSpans.delete(testSuite.id);\n }\n\n onTestModuleEnd(testModule: TestModule): void {\n const moduleId = testModule.moduleId;\n // Clean up any remaining spans for this specific module\n for (const [key, entry] of this.testSpans) {\n if (entry.moduleId === moduleId) {\n entry.span.end();\n this.testSpans.delete(key);\n }\n }\n for (const [key, entry] of this.suiteSpans) {\n if (entry.moduleId === moduleId) {\n entry.span.end();\n this.suiteSpans.delete(key);\n }\n }\n }\n}\n\nexport { OtelReporter };\nexport default OtelReporter;\n"],"mappings":";;;;;;AAsBA,MAAM,cAAc;AACpB,MAAM,iBAAiB;;AAQvB,SAAS,QAAQ,WAAwD;CACvE,MAAM,MAAM,IAAI,MAAM,UAAU,WAAW,eAAe;CAC1D,IAAI,UAAU,OAAO,IAAI,QAAQ,UAAU;CAC3C,OAAO;AACT;;;;;AAMA,IAAM,eAAN,MAAuC;CACrC,4BAAoB,IAAI,IAAuB;CAC/C,6BAAqB,IAAI,IAAuB;CAEhD,gBAAgB,UAA0B;EACxC,MAAM,UAAA,GAAA,QAAA,UAAA,CAAmB,aAAa,cAAc;EACpD,MAAM,WAAW,SAAS,OAAO,YAAY;EAC7C,MAAM,OAAO,OAAO,UAAU,QAAQ,SAAS,QAAQ,EACrD,YAAY;GACV,aAAa,SAAS;GACtB,iBAAiB,SAAS;GAC1B,aAAa;EACf,EACF,CAAC;EACD,KAAK,UAAU,IAAI,SAAS,IAAI;GAAE;GAAM;EAAS,CAAC;CACpD;CAEA,iBAAiB,UAA0B;EACzC,MAAM,QAAQ,KAAK,UAAU,IAAI,SAAS,EAAE;EAC5C,IAAI,CAAC,OAAO;EAEZ,MAAM,SAAS,SAAS,OAAO;EAC/B,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,KAAK,UAAU,EAAE,MAAMA,QAAAA,eAAe,MAAM,CAAC;GACnD,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAC1C,KAAK,MAAM,SAAS,OAAO,QACzB,MAAM,KAAK,gBAAgB,QAAQ,KAAK,CAAC;EAG/C;EACA,MAAM,KAAK,IAAI;EACf,KAAK,UAAU,OAAO,SAAS,EAAE;CACnC;CAEA,iBAAiB,WAA4B;EAC3C,MAAM,UAAA,GAAA,QAAA,UAAA,CAAmB,aAAa,cAAc;EACpD,MAAM,WAAW,UAAU,OAAO,YAAY;EAC9C,MAAM,OAAO,OAAO,UAAU,SAAS,UAAU,QAAQ,EACvD,YAAY;GACV,cAAc,UAAU;GACxB,cAAc;EAChB,EACF,CAAC;EACD,KAAK,WAAW,IAAI,UAAU,IAAI;GAAE;GAAM;EAAS,CAAC;CACtD;CAEA,kBAAkB,WAA4B;EAC5C,MAAM,QAAQ,KAAK,WAAW,IAAI,UAAU,EAAE;EAC9C,IAAI,CAAC,OAAO;EAGZ,IADc,UAAU,MAChB,MAAM,UACZ,MAAM,KAAK,UAAU,EAAE,MAAMA,QAAAA,eAAe,MAAM,CAAC;EAErD,MAAM,KAAK,IAAI;EACf,KAAK,WAAW,OAAO,UAAU,EAAE;CACrC;CAEA,gBAAgB,YAA8B;EAC5C,MAAM,WAAW,WAAW;EAE5B,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,WAC9B,IAAI,MAAM,aAAa,UAAU;GAC/B,MAAM,KAAK,IAAI;GACf,KAAK,UAAU,OAAO,GAAG;EAC3B;EAEF,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,YAC9B,IAAI,MAAM,aAAa,UAAU;GAC/B,MAAM,KAAK,IAAI;GACf,KAAK,WAAW,OAAO,GAAG;EAC5B;CAEJ;AACF"}
|
package/dist/reporter.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.cts","names":[],"sources":["../src/reporter.ts"],"mappings":";;;;;;cAyCM,wBAAwB;UACpB;UACA;EAER,gBAAgB,UAAU;EAa1B,iBAAiB,UAAU;EAiB3B,iBAAiB,WAAW;EAY5B,kBAAkB,WAAW;EAY7B,gBAAgB,YAAY"}
|
package/dist/reporter.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","names":[],"sources":["../src/reporter.ts"],"mappings":";;;;;;cAyCM,wBAAwB;UACpB;UACA;EAER,gBAAgB,UAAU;EAa1B,iBAAiB,UAAU;EAiB3B,iBAAiB,WAAW;EAY5B,kBAAkB,WAAW;EAY7B,gBAAgB,YAAY"}
|
package/dist/reporter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","names":[],"sources":["../src/reporter.ts"],"sourcesContent":["/**\n * Optional Vitest reporter that creates OTel spans for each test and suite.\n * Runs in the runner process; ensure autotel.init() is called in globalSetup so spans are exported.\n *\n * Use when you want test/suite timing and hierarchy in OTLP from the runner side.\n * For \"test → instrumented code\" in one trace (worker side), use the test fixture.\n *\n * @example\n * // vitest.config.ts\n * import { defineConfig } from 'vitest/config';\n *\n * export default defineConfig({\n * test: {\n * reporters: ['default', 'autotel-vitest/reporter'],\n * globalSetup: './globalSetup.ts', // must call init()\n * },\n * });\n */\n\nimport type { Reporter, TestCase, TestModule, TestSuite } from 'vitest/node';\nimport { getTracer, SpanStatusCode } from 'autotel';\n\nconst TRACER_NAME = 'vitest-reporter';\nconst TRACER_VERSION = '0.1.0';\n\ntype SpanEntry = {\n span: ReturnType<ReturnType<typeof getTracer>['startSpan']>;\n moduleId: string;\n};\n\n/** Convert a vitest TestError-like object to a standard Error for OTel. */\nfunction toError(testError: { message?: string; stack?: string }): Error {\n const err = new Error(testError.message ?? 'Unknown error');\n if (testError.stack) err.stack = testError.stack;\n return err;\n}\n\n/**\n * Vitest Reporter that creates one span per test and one per suite (as parents).\n * Requires autotel.init() in globalSetup so spans are exported.\n */\nclass OtelReporter implements Reporter {\n private testSpans = new Map<string, SpanEntry>();\n private suiteSpans = new Map<string, SpanEntry>();\n\n onTestCaseReady(testCase: TestCase): void {\n const tracer = getTracer(TRACER_NAME, TRACER_VERSION);\n const moduleId = testCase.module.moduleId ?? '';\n const span = tracer.startSpan(`test:${testCase.name}`, {\n attributes: {\n 'test.name': testCase.name,\n 'test.fullName': testCase.fullName,\n 'test.file': moduleId,\n },\n });\n this.testSpans.set(testCase.id, { span, moduleId });\n }\n\n onTestCaseResult(testCase: TestCase): void {\n const entry = this.testSpans.get(testCase.id);\n if (!entry) return;\n\n const result = testCase.result();\n if (result.state === 'failed') {\n entry.span.setStatus({ code: SpanStatusCode.ERROR });\n if (result.errors && result.errors.length > 0) {\n for (const error of result.errors) {\n entry.span.recordException(toError(error));\n }\n }\n }\n entry.span.end();\n this.testSpans.delete(testCase.id);\n }\n\n onTestSuiteReady(testSuite: TestSuite): void {\n const tracer = getTracer(TRACER_NAME, TRACER_VERSION);\n const moduleId = testSuite.module.moduleId ?? '';\n const span = tracer.startSpan(`suite:${testSuite.name}`, {\n attributes: {\n 'suite.name': testSuite.name,\n 'suite.file': moduleId,\n },\n });\n this.suiteSpans.set(testSuite.id, { span, moduleId });\n }\n\n onTestSuiteResult(testSuite: TestSuite): void {\n const entry = this.suiteSpans.get(testSuite.id);\n if (!entry) return;\n\n const state = testSuite.state();\n if (state === 'failed') {\n entry.span.setStatus({ code: SpanStatusCode.ERROR });\n }\n entry.span.end();\n this.suiteSpans.delete(testSuite.id);\n }\n\n onTestModuleEnd(testModule: TestModule): void {\n const moduleId = testModule.moduleId;\n // Clean up any remaining spans for this specific module\n for (const [key, entry] of this.testSpans) {\n if (entry.moduleId === moduleId) {\n entry.span.end();\n this.testSpans.delete(key);\n }\n }\n for (const [key, entry] of this.suiteSpans) {\n if (entry.moduleId === moduleId) {\n entry.span.end();\n this.suiteSpans.delete(key);\n }\n }\n }\n}\n\nexport { OtelReporter };\nexport default OtelReporter;\n"],"mappings":";;AAsBA,MAAM,cAAc;AACpB,MAAM,iBAAiB;;AAQvB,SAAS,QAAQ,WAAwD;CACvE,MAAM,MAAM,IAAI,MAAM,UAAU,WAAW,eAAe;CAC1D,IAAI,UAAU,OAAO,IAAI,QAAQ,UAAU;CAC3C,OAAO;AACT;;;;;AAMA,IAAM,eAAN,MAAuC;CACrC,4BAAoB,IAAI,IAAuB;CAC/C,6BAAqB,IAAI,IAAuB;CAEhD,gBAAgB,UAA0B;EACxC,MAAM,SAAS,UAAU,aAAa,cAAc;EACpD,MAAM,WAAW,SAAS,OAAO,YAAY;EAC7C,MAAM,OAAO,OAAO,UAAU,QAAQ,SAAS,QAAQ,EACrD,YAAY;GACV,aAAa,SAAS;GACtB,iBAAiB,SAAS;GAC1B,aAAa;EACf,EACF,CAAC;EACD,KAAK,UAAU,IAAI,SAAS,IAAI;GAAE;GAAM;EAAS,CAAC;CACpD;CAEA,iBAAiB,UAA0B;EACzC,MAAM,QAAQ,KAAK,UAAU,IAAI,SAAS,EAAE;EAC5C,IAAI,CAAC,OAAO;EAEZ,MAAM,SAAS,SAAS,OAAO;EAC/B,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,KAAK,UAAU,EAAE,MAAM,eAAe,MAAM,CAAC;GACnD,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,GAC1C,KAAK,MAAM,SAAS,OAAO,QACzB,MAAM,KAAK,gBAAgB,QAAQ,KAAK,CAAC;EAG/C;EACA,MAAM,KAAK,IAAI;EACf,KAAK,UAAU,OAAO,SAAS,EAAE;CACnC;CAEA,iBAAiB,WAA4B;EAC3C,MAAM,SAAS,UAAU,aAAa,cAAc;EACpD,MAAM,WAAW,UAAU,OAAO,YAAY;EAC9C,MAAM,OAAO,OAAO,UAAU,SAAS,UAAU,QAAQ,EACvD,YAAY;GACV,cAAc,UAAU;GACxB,cAAc;EAChB,EACF,CAAC;EACD,KAAK,WAAW,IAAI,UAAU,IAAI;GAAE;GAAM;EAAS,CAAC;CACtD;CAEA,kBAAkB,WAA4B;EAC5C,MAAM,QAAQ,KAAK,WAAW,IAAI,UAAU,EAAE;EAC9C,IAAI,CAAC,OAAO;EAGZ,IADc,UAAU,MAChB,MAAM,UACZ,MAAM,KAAK,UAAU,EAAE,MAAM,eAAe,MAAM,CAAC;EAErD,MAAM,KAAK,IAAI;EACf,KAAK,WAAW,OAAO,UAAU,EAAE;CACrC;CAEA,gBAAgB,YAA8B;EAC5C,MAAM,WAAW,WAAW;EAE5B,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,WAC9B,IAAI,MAAM,aAAa,UAAU;GAC/B,MAAM,KAAK,IAAI;GACf,KAAK,UAAU,OAAO,GAAG;EAC3B;EAEF,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,YAC9B,IAAI,MAAM,aAAa,UAAU;GAC/B,MAAM,KAAK,IAAI;GACf,KAAK,WAAW,OAAO,GAAG;EAC5B;CAEJ;AACF"}
|