@smoothbricks/lmao 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +269 -0
- package/dist/allocator.wasm +0 -0
- package/dist/bun/preload.d.ts +11 -0
- package/dist/bun/preload.d.ts.map +1 -0
- package/dist/bun/preload.js +10 -0
- package/dist/bun/trace-preload.d.ts +8 -0
- package/dist/bun/trace-preload.d.ts.map +1 -0
- package/dist/bun/trace-preload.js +12 -0
- package/dist/es.d.ts +8 -0
- package/dist/es.d.ts.map +1 -0
- package/dist/es.js +9 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/lib/JsBufferStrategy.d.ts +49 -0
- package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
- package/dist/lib/JsBufferStrategy.js +60 -0
- package/dist/lib/archive/chunkCompaction.d.ts +15 -0
- package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
- package/dist/lib/archive/chunkCompaction.js +24 -0
- package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
- package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
- package/dist/lib/archive/chunkEnvelope.js +55 -0
- package/dist/lib/archive/chunkRouting.d.ts +10 -0
- package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
- package/dist/lib/archive/chunkRouting.js +47 -0
- package/dist/lib/archive/chunkStats.d.ts +12 -0
- package/dist/lib/archive/chunkStats.d.ts.map +1 -0
- package/dist/lib/archive/chunkStats.js +10 -0
- package/dist/lib/archive/index.d.ts +5 -0
- package/dist/lib/archive/index.d.ts.map +1 -0
- package/dist/lib/archive/index.js +4 -0
- package/dist/lib/arrow/capacityStats.d.ts +9 -0
- package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
- package/dist/lib/arrow/capacityStats.js +231 -0
- package/dist/lib/arrow/dictionaries.d.ts +27 -0
- package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
- package/dist/lib/arrow/dictionaries.js +135 -0
- package/dist/lib/arrow/flechette.d.ts +40 -0
- package/dist/lib/arrow/flechette.d.ts.map +1 -0
- package/dist/lib/arrow/flechette.js +67 -0
- package/dist/lib/arrow/utils.d.ts +38 -0
- package/dist/lib/arrow/utils.d.ts.map +1 -0
- package/dist/lib/arrow/utils.js +112 -0
- package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
- package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
- package/dist/lib/buffer/Nanoseconds.js +86 -0
- package/dist/lib/bufferStrategy.d.ts +95 -0
- package/dist/lib/bufferStrategy.d.ts.map +1 -0
- package/dist/lib/bufferStrategy.js +1 -0
- package/dist/lib/capacityTuning.d.ts +50 -0
- package/dist/lib/capacityTuning.d.ts.map +1 -0
- package/dist/lib/capacityTuning.js +65 -0
- package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
- package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/evaluatorGenerator.js +199 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
- package/dist/lib/convertToArrow.d.ts +40 -0
- package/dist/lib/convertToArrow.d.ts.map +1 -0
- package/dist/lib/convertToArrow.js +1467 -0
- package/dist/lib/defineOpContext.d.ts +96 -0
- package/dist/lib/defineOpContext.d.ts.map +1 -0
- package/dist/lib/defineOpContext.js +227 -0
- package/dist/lib/errors/Blocked.d.ts +113 -0
- package/dist/lib/errors/Blocked.d.ts.map +1 -0
- package/dist/lib/errors/Blocked.js +68 -0
- package/dist/lib/errors/CodeError.d.ts +101 -0
- package/dist/lib/errors/CodeError.d.ts.map +1 -0
- package/dist/lib/errors/CodeError.js +42 -0
- package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
- package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
- package/dist/lib/errors/RetriesExhausted.js +31 -0
- package/dist/lib/errors/Transient.d.ts +115 -0
- package/dist/lib/errors/Transient.d.ts.map +1 -0
- package/dist/lib/errors/Transient.js +54 -0
- package/dist/lib/errors/index.d.ts +14 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +16 -0
- package/dist/lib/errors/retry-policy.d.ts +60 -0
- package/dist/lib/errors/retry-policy.d.ts.map +1 -0
- package/dist/lib/errors/retry-policy.js +54 -0
- package/dist/lib/flushScheduler.d.ts +162 -0
- package/dist/lib/flushScheduler.d.ts.map +1 -0
- package/dist/lib/flushScheduler.js +388 -0
- package/dist/lib/library.d.ts +149 -0
- package/dist/lib/library.d.ts.map +1 -0
- package/dist/lib/library.js +588 -0
- package/dist/lib/logApi.d.ts +61 -0
- package/dist/lib/logApi.d.ts.map +1 -0
- package/dist/lib/logApi.js +12 -0
- package/dist/lib/logBinding.d.ts +63 -0
- package/dist/lib/logBinding.d.ts.map +1 -0
- package/dist/lib/logBinding.js +1 -0
- package/dist/lib/op.d.ts +105 -0
- package/dist/lib/op.d.ts.map +1 -0
- package/dist/lib/op.js +59 -0
- package/dist/lib/opContext/contextTypes.d.ts +88 -0
- package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
- package/dist/lib/opContext/contextTypes.js +34 -0
- package/dist/lib/opContext/createOpGroup.d.ts +57 -0
- package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
- package/dist/lib/opContext/createOpGroup.js +341 -0
- package/dist/lib/opContext/defineOp.d.ts +83 -0
- package/dist/lib/opContext/defineOp.d.ts.map +1 -0
- package/dist/lib/opContext/defineOp.js +197 -0
- package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
- package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
- package/dist/lib/opContext/featureFlagTypes.js +1 -0
- package/dist/lib/opContext/index.d.ts +13 -0
- package/dist/lib/opContext/index.d.ts.map +1 -0
- package/dist/lib/opContext/index.js +15 -0
- package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
- package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
- package/dist/lib/opContext/opGroupTypes.js +31 -0
- package/dist/lib/opContext/opTypes.d.ts +48 -0
- package/dist/lib/opContext/opTypes.d.ts.map +1 -0
- package/dist/lib/opContext/opTypes.js +7 -0
- package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
- package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
- package/dist/lib/opContext/spanContextTypes.js +1 -0
- package/dist/lib/opContext/types.d.ts +297 -0
- package/dist/lib/opContext/types.d.ts.map +1 -0
- package/dist/lib/opContext/types.js +16 -0
- package/dist/lib/result.d.ts +308 -0
- package/dist/lib/result.d.ts.map +1 -0
- package/dist/lib/result.js +359 -0
- package/dist/lib/schema/LogSchema.d.ts +62 -0
- package/dist/lib/schema/LogSchema.d.ts.map +1 -0
- package/dist/lib/schema/LogSchema.js +134 -0
- package/dist/lib/schema/builder.d.ts +12 -0
- package/dist/lib/schema/builder.d.ts.map +1 -0
- package/dist/lib/schema/builder.js +169 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
- package/dist/lib/schema/defineFeatureFlags.js +29 -0
- package/dist/lib/schema/defineLogSchema.d.ts +87 -0
- package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
- package/dist/lib/schema/defineLogSchema.js +171 -0
- package/dist/lib/schema/evaluator.d.ts +267 -0
- package/dist/lib/schema/evaluator.d.ts.map +1 -0
- package/dist/lib/schema/evaluator.js +169 -0
- package/dist/lib/schema/extend.d.ts +14 -0
- package/dist/lib/schema/extend.d.ts.map +1 -0
- package/dist/lib/schema/extend.js +51 -0
- package/dist/lib/schema/systemSchema.d.ts +112 -0
- package/dist/lib/schema/systemSchema.d.ts.map +1 -0
- package/dist/lib/schema/systemSchema.js +260 -0
- package/dist/lib/schema/typeGuards.d.ts +52 -0
- package/dist/lib/schema/typeGuards.d.ts.map +1 -0
- package/dist/lib/schema/typeGuards.js +127 -0
- package/dist/lib/schema/types.d.ts +156 -0
- package/dist/lib/schema/types.d.ts.map +1 -0
- package/dist/lib/schema/types.js +4 -0
- package/dist/lib/spanBuffer.d.ts +133 -0
- package/dist/lib/spanBuffer.d.ts.map +1 -0
- package/dist/lib/spanBuffer.js +442 -0
- package/dist/lib/spanBufferHelpers.d.ts +53 -0
- package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
- package/dist/lib/spanBufferHelpers.js +65 -0
- package/dist/lib/spanBufferStats.d.ts +38 -0
- package/dist/lib/spanBufferStats.d.ts.map +1 -0
- package/dist/lib/spanBufferStats.js +1 -0
- package/dist/lib/spanContext.d.ts +141 -0
- package/dist/lib/spanContext.d.ts.map +1 -0
- package/dist/lib/spanContext.js +763 -0
- package/dist/lib/sqlite/index.d.ts +14 -0
- package/dist/lib/sqlite/index.d.ts.map +1 -0
- package/dist/lib/sqlite/index.js +12 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
- package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
- package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-common.js +207 -0
- package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
- package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-d1.js +67 -0
- package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
- package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-db.js +1 -0
- package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
- package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-node.js +68 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-writer.js +78 -0
- package/dist/lib/testing/bun-harness.d.ts +150 -0
- package/dist/lib/testing/bun-harness.d.ts.map +1 -0
- package/dist/lib/testing/bun-harness.js +729 -0
- package/dist/lib/testing/extractFacts.d.ts +73 -0
- package/dist/lib/testing/extractFacts.d.ts.map +1 -0
- package/dist/lib/testing/extractFacts.js +237 -0
- package/dist/lib/testing/facts.d.ts +235 -0
- package/dist/lib/testing/facts.d.ts.map +1 -0
- package/dist/lib/testing/facts.js +209 -0
- package/dist/lib/testing/index.d.ts +58 -0
- package/dist/lib/testing/index.d.ts.map +1 -0
- package/dist/lib/testing/index.js +74 -0
- package/dist/lib/testing/queryable-span.d.ts +39 -0
- package/dist/lib/testing/queryable-span.d.ts.map +1 -0
- package/dist/lib/testing/queryable-span.js +58 -0
- package/dist/lib/testing/span-query.d.ts +21 -0
- package/dist/lib/testing/span-query.d.ts.map +1 -0
- package/dist/lib/testing/span-query.js +47 -0
- package/dist/lib/testing/stdio-replay.d.ts +4 -0
- package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
- package/dist/lib/testing/stdio-replay.js +42 -0
- package/dist/lib/testing/trace-query.d.ts +59 -0
- package/dist/lib/testing/trace-query.d.ts.map +1 -0
- package/dist/lib/testing/trace-query.js +462 -0
- package/dist/lib/testing/vitest-harness.d.ts +135 -0
- package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
- package/dist/lib/testing/vitest-harness.js +486 -0
- package/dist/lib/threadId.d.ts +58 -0
- package/dist/lib/threadId.d.ts.map +1 -0
- package/dist/lib/threadId.js +123 -0
- package/dist/lib/traceContext.d.ts +116 -0
- package/dist/lib/traceContext.d.ts.map +1 -0
- package/dist/lib/traceContext.js +37 -0
- package/dist/lib/traceId.d.ts +78 -0
- package/dist/lib/traceId.d.ts.map +1 -0
- package/dist/lib/traceId.js +87 -0
- package/dist/lib/traceRoot.d.ts +133 -0
- package/dist/lib/traceRoot.d.ts.map +1 -0
- package/dist/lib/traceRoot.es.d.ts +75 -0
- package/dist/lib/traceRoot.es.d.ts.map +1 -0
- package/dist/lib/traceRoot.es.js +129 -0
- package/dist/lib/traceRoot.js +19 -0
- package/dist/lib/traceRoot.node.d.ts +77 -0
- package/dist/lib/traceRoot.node.d.ts.map +1 -0
- package/dist/lib/traceRoot.node.js +133 -0
- package/dist/lib/traceRoot.universal.d.ts +3 -0
- package/dist/lib/traceRoot.universal.d.ts.map +1 -0
- package/dist/lib/traceRoot.universal.js +17 -0
- package/dist/lib/tracer.d.ts +296 -0
- package/dist/lib/tracer.d.ts.map +1 -0
- package/dist/lib/tracer.js +346 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
- package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
- package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
- package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
- package/dist/lib/tracers/CompositeTracer.js +57 -0
- package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
- package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
- package/dist/lib/tracers/NoOpTracer.js +41 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
- package/dist/lib/tracers/SQLiteTracer.js +84 -0
- package/dist/lib/tracers/StdioTracer.d.ts +83 -0
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
- package/dist/lib/tracers/StdioTracer.js +270 -0
- package/dist/lib/tracers/TestTracer.d.ts +95 -0
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
- package/dist/lib/tracers/TestTracer.js +87 -0
- package/dist/lib/tracers/index.d.ts +12 -0
- package/dist/lib/tracers/index.d.ts.map +1 -0
- package/dist/lib/tracers/index.js +11 -0
- package/dist/lib/types.d.ts +366 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +1 -0
- package/dist/lib/utf8Cache.d.ts +111 -0
- package/dist/lib/utf8Cache.d.ts.map +1 -0
- package/dist/lib/utf8Cache.js +177 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
- package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
- package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
- package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
- package/dist/lib/wasm/wasmAllocator.js +227 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
- package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
- package/dist/lib/wasm/wasmTraceRoot.js +264 -0
- package/dist/node.d.ts +7 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +8 -0
- package/dist/testing.d.ts +18 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +17 -0
- package/package.json +193 -0
- package/src/bun/preload.ts +11 -0
- package/src/bun/trace-preload.ts +14 -0
- package/src/es.ts +11 -0
- package/src/index.ts +194 -0
- package/src/lib/JsBufferStrategy.ts +102 -0
- package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
- package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
- package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
- package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
- package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
- package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
- package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
- package/src/lib/__tests__/binary-e2e.test.ts +203 -0
- package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
- package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
- package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
- package/src/lib/__tests__/effective-schema.test.ts +439 -0
- package/src/lib/__tests__/flechette.test.ts +42 -0
- package/src/lib/__tests__/flushScheduler.test.ts +537 -0
- package/src/lib/__tests__/integration.test.ts +600 -0
- package/src/lib/__tests__/library.test.ts +934 -0
- package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
- package/src/lib/__tests__/op-context-binding.test.ts +135 -0
- package/src/lib/__tests__/op-metadata.test.ts +198 -0
- package/src/lib/__tests__/op-type-safety.test.ts +71 -0
- package/src/lib/__tests__/package-exports.test.ts +57 -0
- package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
- package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
- package/src/lib/__tests__/scope-attributes.test.ts +348 -0
- package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
- package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
- package/src/lib/__tests__/test-helpers.ts +318 -0
- package/src/lib/__tests__/timestamp.test.ts +259 -0
- package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
- package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
- package/src/lib/__tests__/tracer.test.ts +211 -0
- package/src/lib/__tests__/type-narrowing.test.ts +137 -0
- package/src/lib/archive/chunkCompaction.ts +44 -0
- package/src/lib/archive/chunkEnvelope.ts +79 -0
- package/src/lib/archive/chunkRouting.ts +70 -0
- package/src/lib/archive/chunkStats.ts +25 -0
- package/src/lib/archive/index.ts +4 -0
- package/src/lib/arrow/capacityStats.ts +340 -0
- package/src/lib/arrow/dictionaries.ts +159 -0
- package/src/lib/arrow/flechette.ts +114 -0
- package/src/lib/arrow/utils.ts +126 -0
- package/src/lib/buffer/Nanoseconds.ts +131 -0
- package/src/lib/bufferStrategy.ts +106 -0
- package/src/lib/capacityTuning.ts +102 -0
- package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
- package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
- package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
- package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
- package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
- package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
- package/src/lib/codegen/evaluatorGenerator.ts +309 -0
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
- package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
- package/src/lib/convertToArrow.ts +1805 -0
- package/src/lib/defineOpContext.ts +398 -0
- package/src/lib/errors/Blocked.ts +165 -0
- package/src/lib/errors/CodeError.ts +132 -0
- package/src/lib/errors/RetriesExhausted.ts +78 -0
- package/src/lib/errors/Transient.ts +168 -0
- package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
- package/src/lib/errors/__tests__/Transient.test.ts +129 -0
- package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
- package/src/lib/errors/index.ts +24 -0
- package/src/lib/errors/retry-policy.ts +87 -0
- package/src/lib/flushScheduler.ts +509 -0
- package/src/lib/library.ts +682 -0
- package/src/lib/logApi.ts +70 -0
- package/src/lib/logBinding.ts +67 -0
- package/src/lib/op.ts +103 -0
- package/src/lib/opContext/__tests__/retry.test.ts +764 -0
- package/src/lib/opContext/contextTypes.ts +130 -0
- package/src/lib/opContext/createOpGroup.ts +456 -0
- package/src/lib/opContext/defineOp.ts +281 -0
- package/src/lib/opContext/featureFlagTypes.ts +54 -0
- package/src/lib/opContext/index.ts +16 -0
- package/src/lib/opContext/opGroupTypes.ts +342 -0
- package/src/lib/opContext/opTypes.ts +80 -0
- package/src/lib/opContext/spanContextTypes.ts +398 -0
- package/src/lib/opContext/types.ts +403 -0
- package/src/lib/result.ts +550 -0
- package/src/lib/schema/LogSchema.ts +153 -0
- package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
- package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
- package/src/lib/schema/builder.ts +201 -0
- package/src/lib/schema/defineFeatureFlags.ts +91 -0
- package/src/lib/schema/defineLogSchema.ts +291 -0
- package/src/lib/schema/evaluator.ts +404 -0
- package/src/lib/schema/extend.ts +69 -0
- package/src/lib/schema/systemSchema.ts +339 -0
- package/src/lib/schema/typeGuards.ts +163 -0
- package/src/lib/schema/types.ts +265 -0
- package/src/lib/spanBuffer.ts +571 -0
- package/src/lib/spanBufferHelpers.ts +73 -0
- package/src/lib/spanBufferStats.ts +40 -0
- package/src/lib/spanContext.ts +1566 -0
- package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
- package/src/lib/sqlite/index.ts +26 -0
- package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
- package/src/lib/sqlite/sqlite-common.ts +309 -0
- package/src/lib/sqlite/sqlite-d1.ts +104 -0
- package/src/lib/sqlite/sqlite-db.ts +32 -0
- package/src/lib/sqlite/sqlite-node.ts +83 -0
- package/src/lib/sqlite/sqlite-writer.ts +128 -0
- package/src/lib/testing/TRACE-TESTING.md +100 -0
- package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
- package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
- package/src/lib/testing/__tests__/facts.test.ts +324 -0
- package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
- package/src/lib/testing/bun-harness.ts +990 -0
- package/src/lib/testing/extractFacts.ts +362 -0
- package/src/lib/testing/facts.ts +470 -0
- package/src/lib/testing/index.ts +141 -0
- package/src/lib/testing/queryable-span.ts +108 -0
- package/src/lib/testing/span-query.ts +65 -0
- package/src/lib/testing/stdio-replay.ts +50 -0
- package/src/lib/testing/trace-query.ts +329 -0
- package/src/lib/testing/vitest-harness.ts +691 -0
- package/src/lib/threadId.ts +135 -0
- package/src/lib/traceContext.ts +182 -0
- package/src/lib/traceId.ts +142 -0
- package/src/lib/traceRoot.es.ts +157 -0
- package/src/lib/traceRoot.node.ts +170 -0
- package/src/lib/traceRoot.ts +154 -0
- package/src/lib/traceRoot.universal.ts +22 -0
- package/src/lib/tracer.ts +896 -0
- package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
- package/src/lib/tracers/CompositeTracer.ts +76 -0
- package/src/lib/tracers/NoOpTracer.ts +73 -0
- package/src/lib/tracers/SQLiteTracer.ts +115 -0
- package/src/lib/tracers/StdioTracer.ts +380 -0
- package/src/lib/tracers/TestTracer.ts +146 -0
- package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
- package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
- package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
- package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
- package/src/lib/tracers/index.ts +12 -0
- package/src/lib/types.ts +498 -0
- package/src/lib/utf8Cache.ts +201 -0
- package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
- package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
- package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
- package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
- package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
- package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
- package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
- package/src/lib/wasm/allocator.zig +945 -0
- package/src/lib/wasm/wasmAllocator.ts +469 -0
- package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
- package/src/lib/wasm/wasmTraceRoot.ts +315 -0
- package/src/node.ts +10 -0
- package/src/testing.ts +18 -0
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
import * as __typia_transform__accessExpressionAsString from "typia/lib/internal/_accessExpressionAsString";
|
|
2
|
+
import * as __typia_transform__validateReport from "typia/lib/internal/_validateReport";
|
|
3
|
+
import * as __typia_transform__createStandardSchema from "typia/lib/internal/_createStandardSchema";
|
|
4
|
+
/**
|
|
5
|
+
* TraceQuery - Post-run query API for the SQLite trace database.
|
|
6
|
+
*
|
|
7
|
+
* Queries a single flat `spans` table where each row is a buffer entry.
|
|
8
|
+
* Status and duration are derived from entry_type and timestamps via self-joins.
|
|
9
|
+
* Tree structure uses span_id / parent_span_id (no depth column).
|
|
10
|
+
*
|
|
11
|
+
* Platform-agnostic: accepts a SyncSQLiteDatabase instance from either
|
|
12
|
+
* bun:sqlite or better-sqlite3.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* import { Database } from 'bun:sqlite';
|
|
17
|
+
* import { TraceQuery } from '@smoothbricks/lmao/testing';
|
|
18
|
+
*
|
|
19
|
+
* const query = new TraceQuery(new Database('.trace-results.db'));
|
|
20
|
+
* console.log(query.failures());
|
|
21
|
+
* console.log(query.slowest(undefined, 10));
|
|
22
|
+
* query.close();
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @module trace-query
|
|
26
|
+
*/
|
|
27
|
+
import typia from 'typia';
|
|
28
|
+
let validateTraceRunRow;
|
|
29
|
+
let validateLatestTraceRunRow;
|
|
30
|
+
let validateRootSpanRow;
|
|
31
|
+
let validateTraceQueryResultRow;
|
|
32
|
+
function getValidateTraceRunRow() {
|
|
33
|
+
validateTraceRunRow ??= (() => { const _io0 = (input, _exceptionable = true) => "string" === typeof input.traceId && "string" === typeof input.spanName && "number" === typeof input.startedAt && (3 === Object.keys(input).length || Object.keys(input).every(key => {
|
|
34
|
+
if (["traceId", "spanName", "startedAt"].some(prop => key === prop))
|
|
35
|
+
return true;
|
|
36
|
+
const value = input[key];
|
|
37
|
+
if (undefined === value)
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
})); const _vo0 = (input, _path, _exceptionable = true) => ["string" === typeof input.traceId || _report(_exceptionable, {
|
|
41
|
+
path: _path + ".traceId",
|
|
42
|
+
expected: "string",
|
|
43
|
+
value: input.traceId
|
|
44
|
+
}), "string" === typeof input.spanName || _report(_exceptionable, {
|
|
45
|
+
path: _path + ".spanName",
|
|
46
|
+
expected: "string",
|
|
47
|
+
value: input.spanName
|
|
48
|
+
}), "number" === typeof input.startedAt || _report(_exceptionable, {
|
|
49
|
+
path: _path + ".startedAt",
|
|
50
|
+
expected: "number",
|
|
51
|
+
value: input.startedAt
|
|
52
|
+
}), 3 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).map(key => {
|
|
53
|
+
if (["traceId", "spanName", "startedAt"].some(prop => key === prop))
|
|
54
|
+
return true;
|
|
55
|
+
const value = input[key];
|
|
56
|
+
if (undefined === value)
|
|
57
|
+
return true;
|
|
58
|
+
return _report(_exceptionable, {
|
|
59
|
+
path: _path + __typia_transform__accessExpressionAsString._accessExpressionAsString(key),
|
|
60
|
+
expected: "undefined",
|
|
61
|
+
value: value,
|
|
62
|
+
description: [
|
|
63
|
+
`The property \`${key}\` is not defined in the object type.`,
|
|
64
|
+
"",
|
|
65
|
+
"Please remove the property next time."
|
|
66
|
+
].join("\n")
|
|
67
|
+
});
|
|
68
|
+
}).every(flag => flag))].every(flag => flag); const __is = (input, _exceptionable = true) => "object" === typeof input && null !== input && _io0(input, true); let errors; let _report; return __typia_transform__createStandardSchema._createStandardSchema(input => {
|
|
69
|
+
if (false === __is(input)) {
|
|
70
|
+
errors = [];
|
|
71
|
+
_report = __typia_transform__validateReport._validateReport(errors);
|
|
72
|
+
((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, {
|
|
73
|
+
path: _path + "",
|
|
74
|
+
expected: "TraceRunRow",
|
|
75
|
+
value: input
|
|
76
|
+
})) && _vo0(input, _path + "", true) || _report(true, {
|
|
77
|
+
path: _path + "",
|
|
78
|
+
expected: "TraceRunRow",
|
|
79
|
+
value: input
|
|
80
|
+
}))(input, "$input", true);
|
|
81
|
+
const success = 0 === errors.length;
|
|
82
|
+
return success ? {
|
|
83
|
+
success,
|
|
84
|
+
data: input
|
|
85
|
+
} : {
|
|
86
|
+
success,
|
|
87
|
+
errors,
|
|
88
|
+
data: input
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
success: true,
|
|
93
|
+
data: input
|
|
94
|
+
};
|
|
95
|
+
}); })();
|
|
96
|
+
return validateTraceRunRow;
|
|
97
|
+
}
|
|
98
|
+
function getValidateLatestTraceRunRow() {
|
|
99
|
+
validateLatestTraceRunRow ??= (() => { const _io0 = (input, _exceptionable = true) => "string" === typeof input.traceId && (1 === Object.keys(input).length || Object.keys(input).every(key => {
|
|
100
|
+
if (["traceId"].some(prop => key === prop))
|
|
101
|
+
return true;
|
|
102
|
+
const value = input[key];
|
|
103
|
+
if (undefined === value)
|
|
104
|
+
return true;
|
|
105
|
+
return false;
|
|
106
|
+
})); const _vo0 = (input, _path, _exceptionable = true) => ["string" === typeof input.traceId || _report(_exceptionable, {
|
|
107
|
+
path: _path + ".traceId",
|
|
108
|
+
expected: "string",
|
|
109
|
+
value: input.traceId
|
|
110
|
+
}), 1 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).map(key => {
|
|
111
|
+
if (["traceId"].some(prop => key === prop))
|
|
112
|
+
return true;
|
|
113
|
+
const value = input[key];
|
|
114
|
+
if (undefined === value)
|
|
115
|
+
return true;
|
|
116
|
+
return _report(_exceptionable, {
|
|
117
|
+
path: _path + __typia_transform__accessExpressionAsString._accessExpressionAsString(key),
|
|
118
|
+
expected: "undefined",
|
|
119
|
+
value: value,
|
|
120
|
+
description: [
|
|
121
|
+
`The property \`${key}\` is not defined in the object type.`,
|
|
122
|
+
"",
|
|
123
|
+
"Please remove the property next time."
|
|
124
|
+
].join("\n")
|
|
125
|
+
});
|
|
126
|
+
}).every(flag => flag))].every(flag => flag); const __is = (input, _exceptionable = true) => "object" === typeof input && null !== input && _io0(input, true); let errors; let _report; return __typia_transform__createStandardSchema._createStandardSchema(input => {
|
|
127
|
+
if (false === __is(input)) {
|
|
128
|
+
errors = [];
|
|
129
|
+
_report = __typia_transform__validateReport._validateReport(errors);
|
|
130
|
+
((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, {
|
|
131
|
+
path: _path + "",
|
|
132
|
+
expected: "LatestTraceRunRow",
|
|
133
|
+
value: input
|
|
134
|
+
})) && _vo0(input, _path + "", true) || _report(true, {
|
|
135
|
+
path: _path + "",
|
|
136
|
+
expected: "LatestTraceRunRow",
|
|
137
|
+
value: input
|
|
138
|
+
}))(input, "$input", true);
|
|
139
|
+
const success = 0 === errors.length;
|
|
140
|
+
return success ? {
|
|
141
|
+
success,
|
|
142
|
+
data: input
|
|
143
|
+
} : {
|
|
144
|
+
success,
|
|
145
|
+
errors,
|
|
146
|
+
data: input
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
success: true,
|
|
151
|
+
data: input
|
|
152
|
+
};
|
|
153
|
+
}); })();
|
|
154
|
+
return validateLatestTraceRunRow;
|
|
155
|
+
}
|
|
156
|
+
function getValidateRootSpanRow() {
|
|
157
|
+
validateRootSpanRow ??= (() => { const _io0 = (input, _exceptionable = true) => "number" === typeof input.span_id && (1 === Object.keys(input).length || Object.keys(input).every(key => {
|
|
158
|
+
if (["span_id"].some(prop => key === prop))
|
|
159
|
+
return true;
|
|
160
|
+
const value = input[key];
|
|
161
|
+
if (undefined === value)
|
|
162
|
+
return true;
|
|
163
|
+
return false;
|
|
164
|
+
})); const _vo0 = (input, _path, _exceptionable = true) => ["number" === typeof input.span_id || _report(_exceptionable, {
|
|
165
|
+
path: _path + ".span_id",
|
|
166
|
+
expected: "number",
|
|
167
|
+
value: input.span_id
|
|
168
|
+
}), 1 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).map(key => {
|
|
169
|
+
if (["span_id"].some(prop => key === prop))
|
|
170
|
+
return true;
|
|
171
|
+
const value = input[key];
|
|
172
|
+
if (undefined === value)
|
|
173
|
+
return true;
|
|
174
|
+
return _report(_exceptionable, {
|
|
175
|
+
path: _path + __typia_transform__accessExpressionAsString._accessExpressionAsString(key),
|
|
176
|
+
expected: "undefined",
|
|
177
|
+
value: value,
|
|
178
|
+
description: [
|
|
179
|
+
`The property \`${key}\` is not defined in the object type.`,
|
|
180
|
+
"",
|
|
181
|
+
"Please remove the property next time."
|
|
182
|
+
].join("\n")
|
|
183
|
+
});
|
|
184
|
+
}).every(flag => flag))].every(flag => flag); const __is = (input, _exceptionable = true) => "object" === typeof input && null !== input && _io0(input, true); let errors; let _report; return __typia_transform__createStandardSchema._createStandardSchema(input => {
|
|
185
|
+
if (false === __is(input)) {
|
|
186
|
+
errors = [];
|
|
187
|
+
_report = __typia_transform__validateReport._validateReport(errors);
|
|
188
|
+
((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, {
|
|
189
|
+
path: _path + "",
|
|
190
|
+
expected: "RootSpanRow",
|
|
191
|
+
value: input
|
|
192
|
+
})) && _vo0(input, _path + "", true) || _report(true, {
|
|
193
|
+
path: _path + "",
|
|
194
|
+
expected: "RootSpanRow",
|
|
195
|
+
value: input
|
|
196
|
+
}))(input, "$input", true);
|
|
197
|
+
const success = 0 === errors.length;
|
|
198
|
+
return success ? {
|
|
199
|
+
success,
|
|
200
|
+
data: input
|
|
201
|
+
} : {
|
|
202
|
+
success,
|
|
203
|
+
errors,
|
|
204
|
+
data: input
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
success: true,
|
|
209
|
+
data: input
|
|
210
|
+
};
|
|
211
|
+
}); })();
|
|
212
|
+
return validateRootSpanRow;
|
|
213
|
+
}
|
|
214
|
+
function getValidateTraceQueryResultRow() {
|
|
215
|
+
validateTraceQueryResultRow ??= (() => { const _io0 = (input, _exceptionable = true) => "string" === typeof input.spanName && ("ok" === input.status || "err" === input.status || "exception" === input.status || "running" === input.status) && (null === input.durationNs || "number" === typeof input.durationNs) && (null === input.describe || "string" === typeof input.describe) && "number" === typeof input.parentSpanId && (5 === Object.keys(input).length || Object.keys(input).every(key => {
|
|
216
|
+
if (["spanName", "status", "durationNs", "describe", "parentSpanId"].some(prop => key === prop))
|
|
217
|
+
return true;
|
|
218
|
+
const value = input[key];
|
|
219
|
+
if (undefined === value)
|
|
220
|
+
return true;
|
|
221
|
+
return false;
|
|
222
|
+
})); const _vo0 = (input, _path, _exceptionable = true) => ["string" === typeof input.spanName || _report(_exceptionable, {
|
|
223
|
+
path: _path + ".spanName",
|
|
224
|
+
expected: "string",
|
|
225
|
+
value: input.spanName
|
|
226
|
+
}), "ok" === input.status || "err" === input.status || "exception" === input.status || "running" === input.status || _report(_exceptionable, {
|
|
227
|
+
path: _path + ".status",
|
|
228
|
+
expected: "(\"err\" | \"exception\" | \"ok\" | \"running\")",
|
|
229
|
+
value: input.status
|
|
230
|
+
}), null === input.durationNs || "number" === typeof input.durationNs || _report(_exceptionable, {
|
|
231
|
+
path: _path + ".durationNs",
|
|
232
|
+
expected: "(null | number)",
|
|
233
|
+
value: input.durationNs
|
|
234
|
+
}), null === input.describe || "string" === typeof input.describe || _report(_exceptionable, {
|
|
235
|
+
path: _path + ".describe",
|
|
236
|
+
expected: "(null | string)",
|
|
237
|
+
value: input.describe
|
|
238
|
+
}), "number" === typeof input.parentSpanId || _report(_exceptionable, {
|
|
239
|
+
path: _path + ".parentSpanId",
|
|
240
|
+
expected: "number",
|
|
241
|
+
value: input.parentSpanId
|
|
242
|
+
}), 5 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).map(key => {
|
|
243
|
+
if (["spanName", "status", "durationNs", "describe", "parentSpanId"].some(prop => key === prop))
|
|
244
|
+
return true;
|
|
245
|
+
const value = input[key];
|
|
246
|
+
if (undefined === value)
|
|
247
|
+
return true;
|
|
248
|
+
return _report(_exceptionable, {
|
|
249
|
+
path: _path + __typia_transform__accessExpressionAsString._accessExpressionAsString(key),
|
|
250
|
+
expected: "undefined",
|
|
251
|
+
value: value,
|
|
252
|
+
description: [
|
|
253
|
+
`The property \`${key}\` is not defined in the object type.`,
|
|
254
|
+
"",
|
|
255
|
+
"Please remove the property next time."
|
|
256
|
+
].join("\n")
|
|
257
|
+
});
|
|
258
|
+
}).every(flag => flag))].every(flag => flag); const __is = (input, _exceptionable = true) => "object" === typeof input && null !== input && _io0(input, true); let errors; let _report; return __typia_transform__createStandardSchema._createStandardSchema(input => {
|
|
259
|
+
if (false === __is(input)) {
|
|
260
|
+
errors = [];
|
|
261
|
+
_report = __typia_transform__validateReport._validateReport(errors);
|
|
262
|
+
((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || _report(true, {
|
|
263
|
+
path: _path + "",
|
|
264
|
+
expected: "TraceQueryResultRow",
|
|
265
|
+
value: input
|
|
266
|
+
})) && _vo0(input, _path + "", true) || _report(true, {
|
|
267
|
+
path: _path + "",
|
|
268
|
+
expected: "TraceQueryResultRow",
|
|
269
|
+
value: input
|
|
270
|
+
}))(input, "$input", true);
|
|
271
|
+
const success = 0 === errors.length;
|
|
272
|
+
return success ? {
|
|
273
|
+
success,
|
|
274
|
+
data: input
|
|
275
|
+
} : {
|
|
276
|
+
success,
|
|
277
|
+
errors,
|
|
278
|
+
data: input
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
return {
|
|
282
|
+
success: true,
|
|
283
|
+
data: input
|
|
284
|
+
};
|
|
285
|
+
}); })();
|
|
286
|
+
return validateTraceQueryResultRow;
|
|
287
|
+
}
|
|
288
|
+
function describeSqliteBoundaryError(boundary, errors, rowIndex) {
|
|
289
|
+
const firstError = errors[0];
|
|
290
|
+
const rowDetail = rowIndex === undefined ? '' : ` row ${rowIndex}`;
|
|
291
|
+
if (!firstError) {
|
|
292
|
+
return `${boundary} returned an invalid SQLite${rowDetail} result`;
|
|
293
|
+
}
|
|
294
|
+
return `${boundary} returned an invalid SQLite${rowDetail} result at ${firstError.path}: expected ${firstError.expected}`;
|
|
295
|
+
}
|
|
296
|
+
function parseOptionalSqliteRow(boundary, row, validate) {
|
|
297
|
+
if (row == null) {
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
const validation = validate(row);
|
|
301
|
+
if (!validation.success) {
|
|
302
|
+
throw new Error(describeSqliteBoundaryError(boundary, validation.errors));
|
|
303
|
+
}
|
|
304
|
+
return validation.data;
|
|
305
|
+
}
|
|
306
|
+
function parseSqliteRows(boundary, rows, validate) {
|
|
307
|
+
return rows.map((row, rowIndex) => {
|
|
308
|
+
const validation = validate(row);
|
|
309
|
+
if (!validation.success) {
|
|
310
|
+
throw new Error(describeSqliteBoundaryError(boundary, validation.errors, rowIndex));
|
|
311
|
+
}
|
|
312
|
+
return validation.data;
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
function toTraceQueryResult(row) {
|
|
316
|
+
return {
|
|
317
|
+
spanName: row.spanName,
|
|
318
|
+
status: row.status,
|
|
319
|
+
durationNs: row.durationNs ?? undefined,
|
|
320
|
+
describe: row.describe ?? undefined,
|
|
321
|
+
parentSpanId: row.parentSpanId,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export class TraceQuery {
|
|
325
|
+
db;
|
|
326
|
+
constructor(db) {
|
|
327
|
+
this.db = db;
|
|
328
|
+
}
|
|
329
|
+
/** Get all trace runs (root spans), most recent first */
|
|
330
|
+
runs() {
|
|
331
|
+
return parseSqliteRows('TraceQuery.runs', this.db
|
|
332
|
+
.prepare(`SELECT trace_id AS traceId, message AS spanName, timestamp_ns AS startedAt
|
|
333
|
+
FROM spans
|
|
334
|
+
WHERE parent_span_id = 0 AND row_index = 0
|
|
335
|
+
ORDER BY timestamp_ns DESC`)
|
|
336
|
+
.all(), getValidateTraceRunRow());
|
|
337
|
+
}
|
|
338
|
+
/** Get the most recent trace_id (= run_id) */
|
|
339
|
+
latestRun() {
|
|
340
|
+
return parseOptionalSqliteRow('TraceQuery.latestRun', this.db
|
|
341
|
+
.prepare(`SELECT trace_id AS traceId
|
|
342
|
+
FROM spans
|
|
343
|
+
WHERE parent_span_id = 0 AND row_index = 0
|
|
344
|
+
ORDER BY timestamp_ns DESC LIMIT 1`)
|
|
345
|
+
.get(), getValidateLatestTraceRunRow());
|
|
346
|
+
}
|
|
347
|
+
/** Get all failed tests in a run (defaults to latest run) */
|
|
348
|
+
failures(traceId) {
|
|
349
|
+
const id = traceId ?? this.latestRun()?.traceId;
|
|
350
|
+
if (!id)
|
|
351
|
+
return [];
|
|
352
|
+
// Find the root span_id for this trace
|
|
353
|
+
const root = parseOptionalSqliteRow('TraceQuery.failures root span', this.db.prepare('SELECT span_id FROM spans WHERE trace_id = ? AND parent_span_id = 0 AND row_index = 0').get(id), getValidateRootSpanRow());
|
|
354
|
+
if (!root)
|
|
355
|
+
return [];
|
|
356
|
+
// Self-join: row_index=0 for name, row_index=1 for status/duration
|
|
357
|
+
return parseSqliteRows('TraceQuery.failures rows', this.db
|
|
358
|
+
.prepare(`SELECT
|
|
359
|
+
s0.message AS spanName,
|
|
360
|
+
CASE WHEN s1.entry_type = 2 THEN 'ok'
|
|
361
|
+
WHEN s1.entry_type = 3 THEN 'err'
|
|
362
|
+
WHEN s1.entry_type = 4 THEN 'exception'
|
|
363
|
+
ELSE 'running' END AS status,
|
|
364
|
+
s1.timestamp_ns - s0.timestamp_ns AS durationNs,
|
|
365
|
+
s0.describe,
|
|
366
|
+
s0.parent_span_id AS parentSpanId
|
|
367
|
+
FROM spans s0
|
|
368
|
+
LEFT JOIN spans s1 ON s1.trace_id = s0.trace_id AND s1.span_id = s0.span_id AND s1.row_index = 1
|
|
369
|
+
WHERE s0.trace_id = ? AND s0.parent_span_id = ? AND s0.row_index = 0
|
|
370
|
+
AND s1.entry_type IN (3, 4)
|
|
371
|
+
ORDER BY s0.timestamp_ns ASC`)
|
|
372
|
+
.all(id, root.span_id), getValidateTraceQueryResultRow()).map(toTraceQueryResult);
|
|
373
|
+
}
|
|
374
|
+
/** Get slowest tests in a run (defaults to latest run) */
|
|
375
|
+
slowest(traceId, limit = 20) {
|
|
376
|
+
const id = traceId ?? this.latestRun()?.traceId;
|
|
377
|
+
if (!id)
|
|
378
|
+
return [];
|
|
379
|
+
// Find the root span_id for this trace
|
|
380
|
+
const root = parseOptionalSqliteRow('TraceQuery.slowest root span', this.db.prepare('SELECT span_id FROM spans WHERE trace_id = ? AND parent_span_id = 0 AND row_index = 0').get(id), getValidateRootSpanRow());
|
|
381
|
+
if (!root)
|
|
382
|
+
return [];
|
|
383
|
+
return parseSqliteRows('TraceQuery.slowest rows', this.db
|
|
384
|
+
.prepare(`SELECT
|
|
385
|
+
s0.message AS spanName,
|
|
386
|
+
CASE WHEN s1.entry_type = 2 THEN 'ok'
|
|
387
|
+
WHEN s1.entry_type = 3 THEN 'err'
|
|
388
|
+
WHEN s1.entry_type = 4 THEN 'exception'
|
|
389
|
+
ELSE 'running' END AS status,
|
|
390
|
+
s1.timestamp_ns - s0.timestamp_ns AS durationNs,
|
|
391
|
+
s0.describe,
|
|
392
|
+
s0.parent_span_id AS parentSpanId
|
|
393
|
+
FROM spans s0
|
|
394
|
+
LEFT JOIN spans s1 ON s1.trace_id = s0.trace_id AND s1.span_id = s0.span_id AND s1.row_index = 1
|
|
395
|
+
WHERE s0.trace_id = ? AND s0.parent_span_id = ? AND s0.row_index = 0
|
|
396
|
+
AND s1.entry_type IS NOT NULL
|
|
397
|
+
ORDER BY durationNs DESC
|
|
398
|
+
LIMIT ?`)
|
|
399
|
+
.all(id, root.span_id, limit), getValidateTraceQueryResultRow()).map(toTraceQueryResult);
|
|
400
|
+
}
|
|
401
|
+
/** Find spans by name pattern (SQL LIKE, defaults to latest run) */
|
|
402
|
+
findSpans(pattern, traceId) {
|
|
403
|
+
const id = traceId ?? this.latestRun()?.traceId;
|
|
404
|
+
if (!id)
|
|
405
|
+
return [];
|
|
406
|
+
return parseSqliteRows('TraceQuery.findSpans', this.db
|
|
407
|
+
.prepare(`SELECT
|
|
408
|
+
s0.message AS spanName,
|
|
409
|
+
CASE WHEN s1.entry_type = 2 THEN 'ok'
|
|
410
|
+
WHEN s1.entry_type = 3 THEN 'err'
|
|
411
|
+
WHEN s1.entry_type = 4 THEN 'exception'
|
|
412
|
+
ELSE 'running' END AS status,
|
|
413
|
+
s1.timestamp_ns - s0.timestamp_ns AS durationNs,
|
|
414
|
+
s0.describe,
|
|
415
|
+
s0.parent_span_id AS parentSpanId
|
|
416
|
+
FROM spans s0
|
|
417
|
+
LEFT JOIN spans s1 ON s1.trace_id = s0.trace_id AND s1.span_id = s0.span_id AND s1.row_index = 1
|
|
418
|
+
WHERE s0.trace_id = ? AND s0.row_index = 0 AND s0.message LIKE ?
|
|
419
|
+
ORDER BY s0.timestamp_ns ASC`)
|
|
420
|
+
.all(id, pattern), getValidateTraceQueryResultRow()).map(toTraceQueryResult);
|
|
421
|
+
}
|
|
422
|
+
/** Get full span tree for a specific test (all descendants, defaults to latest run) */
|
|
423
|
+
testTree(testName, traceId) {
|
|
424
|
+
const id = traceId ?? this.latestRun()?.traceId;
|
|
425
|
+
if (!id)
|
|
426
|
+
return [];
|
|
427
|
+
// Recursive CTE on span_id/parent_span_id
|
|
428
|
+
return parseSqliteRows('TraceQuery.testTree', this.db
|
|
429
|
+
.prepare(`WITH RECURSIVE tree AS (
|
|
430
|
+
-- Anchor: find the span by name
|
|
431
|
+
SELECT span_id
|
|
432
|
+
FROM spans
|
|
433
|
+
WHERE trace_id = ? AND row_index = 0 AND message = ?
|
|
434
|
+
LIMIT 1
|
|
435
|
+
|
|
436
|
+
UNION ALL
|
|
437
|
+
|
|
438
|
+
-- Recurse: find children by parent_span_id
|
|
439
|
+
SELECT s.span_id
|
|
440
|
+
FROM spans s
|
|
441
|
+
INNER JOIN tree t ON s.parent_span_id = t.span_id
|
|
442
|
+
WHERE s.trace_id = ? AND s.row_index = 0
|
|
443
|
+
)
|
|
444
|
+
SELECT
|
|
445
|
+
s0.message AS spanName,
|
|
446
|
+
CASE WHEN s1.entry_type = 2 THEN 'ok'
|
|
447
|
+
WHEN s1.entry_type = 3 THEN 'err'
|
|
448
|
+
WHEN s1.entry_type = 4 THEN 'exception'
|
|
449
|
+
ELSE 'running' END AS status,
|
|
450
|
+
s1.timestamp_ns - s0.timestamp_ns AS durationNs,
|
|
451
|
+
s0.describe,
|
|
452
|
+
s0.parent_span_id AS parentSpanId
|
|
453
|
+
FROM tree
|
|
454
|
+
JOIN spans s0 ON s0.trace_id = ? AND s0.span_id = tree.span_id AND s0.row_index = 0
|
|
455
|
+
LEFT JOIN spans s1 ON s1.trace_id = s0.trace_id AND s1.span_id = s0.span_id AND s1.row_index = 1
|
|
456
|
+
ORDER BY s0.timestamp_ns ASC`)
|
|
457
|
+
.all(id, testName, id, id), getValidateTraceQueryResultRow()).map(toTraceQueryResult);
|
|
458
|
+
}
|
|
459
|
+
close() {
|
|
460
|
+
this.db.close();
|
|
461
|
+
}
|
|
462
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vitest integration for LMAO trace-testing.
|
|
3
|
+
*
|
|
4
|
+
* Same architecture as bun-harness: one root trace per test run,
|
|
5
|
+
* each it() creates a child span, describe path written to `describe` schema column.
|
|
6
|
+
*
|
|
7
|
+
* Supports lifecycle tracer outputs (SQLite, stdio, or both via CompositeTracer).
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* // vitest.config.ts
|
|
12
|
+
* export default defineConfig({
|
|
13
|
+
* test: { setupFiles: ['./test-setup.ts'] },
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* // test-setup.ts
|
|
17
|
+
* import { initTraceTestRun } from '@smoothbricks/lmao/testing/vitest';
|
|
18
|
+
* initTraceTestRun(myOpContext, { sqlite: { dbPath: '.trace-results.db' } });
|
|
19
|
+
*
|
|
20
|
+
* // my-test.test.ts
|
|
21
|
+
* import { describe, it, expect, useTestSpan } from '@smoothbricks/lmao/testing/vitest';
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @module testing/vitest
|
|
25
|
+
*/
|
|
26
|
+
import { afterAll as _afterAll, afterEach as _afterEach, beforeAll as _beforeAll, beforeEach as _beforeEach, expect as _expect } from 'vitest';
|
|
27
|
+
import type { SpanContext } from '../opContext/spanContextTypes.js';
|
|
28
|
+
import type { OpContextBinding, OpContextOf } from '../opContext/types.js';
|
|
29
|
+
import type { AsyncSQLiteDatabase, SyncSQLiteDatabase } from '../sqlite/sqlite-db.js';
|
|
30
|
+
import type { SQLiteWriterConfig } from '../sqlite/sqlite-writer.js';
|
|
31
|
+
import { Tracer } from '../tracer.js';
|
|
32
|
+
type TestBody = () => unknown | Promise<unknown>;
|
|
33
|
+
type SpanCtx<B extends OpContextBinding> = SpanContext<OpContextOf<B>>;
|
|
34
|
+
type VitestDescribeCallback = () => void;
|
|
35
|
+
type VitestDescribeBranch = (name: string, fn: VitestDescribeCallback) => unknown;
|
|
36
|
+
type VitestPublicTestCallback = () => void | Promise<void>;
|
|
37
|
+
type VitestPublicTestBranch = (name: string, fn: VitestPublicTestCallback) => unknown;
|
|
38
|
+
type VitestModuleIt = ((name: string, fn: TestBody) => unknown) & {
|
|
39
|
+
skip: (name: string, fn: VitestPublicTestCallback) => unknown;
|
|
40
|
+
only: (name: string, fn: VitestPublicTestCallback) => unknown;
|
|
41
|
+
todo: (name: string, fn: VitestPublicTestCallback) => unknown;
|
|
42
|
+
each: VitestEach;
|
|
43
|
+
skipIf: (condition: boolean) => (name: string, fn: VitestPublicTestCallback) => unknown;
|
|
44
|
+
};
|
|
45
|
+
type VitestEach = (...args: unknown[]) => unknown;
|
|
46
|
+
export type VitestDescribe = VitestDescribeBranch & {
|
|
47
|
+
skip: VitestDescribeBranch;
|
|
48
|
+
only: VitestDescribeBranch;
|
|
49
|
+
todo: VitestDescribeBranch;
|
|
50
|
+
each: VitestEach;
|
|
51
|
+
skipIf: (condition: boolean) => VitestDescribeBranch;
|
|
52
|
+
};
|
|
53
|
+
export type VitestIt = VitestPublicTestBranch & {
|
|
54
|
+
skip: VitestPublicTestBranch;
|
|
55
|
+
only: VitestPublicTestBranch;
|
|
56
|
+
todo: VitestPublicTestBranch;
|
|
57
|
+
each: VitestEach;
|
|
58
|
+
skipIf: (condition: boolean) => VitestPublicTestBranch;
|
|
59
|
+
};
|
|
60
|
+
export interface VitestModuleShape {
|
|
61
|
+
describe: VitestDescribe;
|
|
62
|
+
it: VitestModuleIt;
|
|
63
|
+
test: VitestModuleIt;
|
|
64
|
+
[key: string]: unknown;
|
|
65
|
+
}
|
|
66
|
+
type SpanContextStore<Ctx> = {
|
|
67
|
+
run<R>(ctx: Ctx, fn: () => R): R;
|
|
68
|
+
getStore(): Ctx | undefined;
|
|
69
|
+
};
|
|
70
|
+
type SQLiteRuntimeConfig = SQLiteWriterConfig & ({
|
|
71
|
+
/** Node/bun style synchronous SQLite driver (for example better-sqlite3). */
|
|
72
|
+
createDatabase: (path: string) => SyncSQLiteDatabase;
|
|
73
|
+
createAsyncDatabase?: never;
|
|
74
|
+
} | {
|
|
75
|
+
/** Async SQLite driver (for example Cloudflare D1 adapter). */
|
|
76
|
+
createAsyncDatabase: (path: string) => AsyncSQLiteDatabase | Promise<AsyncSQLiteDatabase>;
|
|
77
|
+
createDatabase?: never;
|
|
78
|
+
});
|
|
79
|
+
type InitTraceTestRunOptions = {
|
|
80
|
+
/**
|
|
81
|
+
* Optional SQLite persistence target.
|
|
82
|
+
*
|
|
83
|
+
* Omit this to run traced tests without DB persistence.
|
|
84
|
+
*/
|
|
85
|
+
sqlite?: SQLiteRuntimeConfig;
|
|
86
|
+
/** Optional verbose stdout tracing; defaults to env flag detection. */
|
|
87
|
+
verbose?: boolean;
|
|
88
|
+
};
|
|
89
|
+
type VitestHarnessConfig<B extends OpContextBinding> = {
|
|
90
|
+
binding: B;
|
|
91
|
+
createSpanContextStore?: () => SpanContextStore<SpanCtx<B>>;
|
|
92
|
+
};
|
|
93
|
+
export type VitestTestTracer<B extends OpContextBinding> = {
|
|
94
|
+
initTraceTestRun(options?: InitTraceTestRunOptions): void;
|
|
95
|
+
useTestSpan(): SpanCtx<B>;
|
|
96
|
+
getTracer(): Tracer<B>;
|
|
97
|
+
createVitestMock<T extends VitestModuleShape>(vitestModule: T): T;
|
|
98
|
+
describe(name: string, fn: () => void): unknown;
|
|
99
|
+
it(name: string, fn: () => void | Promise<void>): void;
|
|
100
|
+
};
|
|
101
|
+
export type VitestTestSuiteTracer<B extends OpContextBinding> = {
|
|
102
|
+
useTestTracer: VitestTestTracer<B>;
|
|
103
|
+
useTestSpan(): SpanCtx<B>;
|
|
104
|
+
setupVitestTestSuiteTracing(): void;
|
|
105
|
+
};
|
|
106
|
+
export declare function installVitestTestTracing<B extends OpContextBinding>(tracer: VitestTestTracer<B>, options?: InitTraceTestRunOptions): void;
|
|
107
|
+
export declare function makeVitestTestSuiteTracer<B extends OpContextBinding>(config: VitestHarnessConfig<B>, options?: InitTraceTestRunOptions): VitestTestSuiteTracer<B>;
|
|
108
|
+
export declare function makeVitestTestTracer<B extends OpContextBinding>(config: VitestHarnessConfig<B>): VitestTestTracer<B>;
|
|
109
|
+
/** Initialize the root tracer for the entire vitest run. Call once in setupFiles. */
|
|
110
|
+
export declare function initTraceTestRun<B extends OpContextBinding>(opContext: B, options?: InitTraceTestRunOptions): void;
|
|
111
|
+
/** Get the current span context from AsyncLocalStorage (inside an it() block) */
|
|
112
|
+
export declare function useTestSpan(): SpanContext<OpContextOf<OpContextBinding>>;
|
|
113
|
+
/** Get the root tracer instance */
|
|
114
|
+
export declare function getTracer(): Tracer<OpContextBinding>;
|
|
115
|
+
/**
|
|
116
|
+
* Create a vitest mock replacement that wraps it()/test()/describe() with trace spans.
|
|
117
|
+
*
|
|
118
|
+
* Call this from a vitest setupFile via vi.mock:
|
|
119
|
+
* ```typescript
|
|
120
|
+
* vi.mock('vitest', async (importOriginal) => {
|
|
121
|
+
* const [mod, { createVitestMock }] = await Promise.all([
|
|
122
|
+
* importOriginal(),
|
|
123
|
+
* import('@smoothbricks/lmao/testing/vitest'),
|
|
124
|
+
* ]);
|
|
125
|
+
* return createVitestMock(mod);
|
|
126
|
+
* });
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* @param vitestModule - The original vitest namespace from importOriginal()
|
|
130
|
+
*/
|
|
131
|
+
export declare function createVitestMock<T extends VitestModuleShape>(vitestModule: T): T;
|
|
132
|
+
export declare const describe: VitestDescribe;
|
|
133
|
+
export declare const it: VitestIt;
|
|
134
|
+
export { _afterAll as afterAll, _afterEach as afterEach, _beforeAll as beforeAll, _beforeEach as beforeEach, _expect as expect, };
|
|
135
|
+
//# sourceMappingURL=vitest-harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-harness.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/vitest-harness.ts"],"names":[],"mappings":"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"}
|