@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,470 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strongly-typed trace facts using TypeScript template literal types.
|
|
3
|
+
*
|
|
4
|
+
* Instead of `facts: string[]`, we use branded template literal types that
|
|
5
|
+
* ensure facts follow a consistent format and enable autocomplete.
|
|
6
|
+
*
|
|
7
|
+
* Format: `${namespace}:${name}: ${content}`
|
|
8
|
+
*
|
|
9
|
+
* Examples:
|
|
10
|
+
* - `span:fetch-user: started`
|
|
11
|
+
* - `span:fetch-user: ok`
|
|
12
|
+
* - `span:fetch-user: err(NOT_FOUND)`
|
|
13
|
+
* - `log:info: Processing order`
|
|
14
|
+
* - `tag:userId: 123`
|
|
15
|
+
* - `scope:requestId: req-abc`
|
|
16
|
+
* - `ff:darkMode: true`
|
|
17
|
+
*
|
|
18
|
+
* @module testing/facts
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
// =============================================================================
|
|
22
|
+
// FACT NAMESPACES
|
|
23
|
+
// =============================================================================
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* All valid fact namespaces.
|
|
27
|
+
*/
|
|
28
|
+
export type FactNamespace = 'span' | 'log' | 'tag' | 'scope' | 'ff' | 'metric';
|
|
29
|
+
|
|
30
|
+
// =============================================================================
|
|
31
|
+
// SPAN FACTS
|
|
32
|
+
// =============================================================================
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Span lifecycle states.
|
|
36
|
+
*/
|
|
37
|
+
export type SpanState = 'started' | 'ok' | `err(${string})` | `exception(${string})`;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A span fact: `span:${name}: ${state}`
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* type F1 = SpanFact<'fetch-user', 'started'>; // "span:fetch-user: started"
|
|
44
|
+
* type F2 = SpanFact<'fetch-user', 'ok'>; // "span:fetch-user: ok"
|
|
45
|
+
* type F3 = SpanFact<'fetch-user', 'err(NOT_FOUND)'>; // "span:fetch-user: err(NOT_FOUND)"
|
|
46
|
+
*/
|
|
47
|
+
export type SpanFact<Name extends string = string, State extends SpanState = SpanState> = `span:${Name}: ${State}`;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Type guard for span facts.
|
|
51
|
+
*/
|
|
52
|
+
export function isSpanFact(fact: TraceFact): fact is SpanFact {
|
|
53
|
+
return fact.startsWith('span:');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Create a span:started fact.
|
|
58
|
+
*/
|
|
59
|
+
export function spanStarted<N extends string>(name: N): SpanFact<N, 'started'> {
|
|
60
|
+
return `span:${name}: started` as SpanFact<N, 'started'>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Create a span:ok fact.
|
|
65
|
+
*/
|
|
66
|
+
export function spanOk<N extends string>(name: N): SpanFact<N, 'ok'> {
|
|
67
|
+
return `span:${name}: ok` as SpanFact<N, 'ok'>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Create a span:err fact.
|
|
72
|
+
*/
|
|
73
|
+
export function spanErr<N extends string, C extends string>(name: N, code: C): SpanFact<N, `err(${C})`> {
|
|
74
|
+
return `span:${name}: err(${code})` as SpanFact<N, `err(${C})`>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Create a span:exception fact.
|
|
79
|
+
*/
|
|
80
|
+
export function spanException<N extends string, M extends string>(name: N, message: M): SpanFact<N, `exception(${M})`> {
|
|
81
|
+
return `span:${name}: exception(${message})` as SpanFact<N, `exception(${M})`>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// LOG FACTS
|
|
86
|
+
// =============================================================================
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Log levels.
|
|
90
|
+
*/
|
|
91
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* A log fact: `log:${level}: ${message}`
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* type F = LogFact<'info', 'Processing order'>; // "log:info: Processing order"
|
|
98
|
+
*/
|
|
99
|
+
export type LogFact<Level extends LogLevel = LogLevel, Message extends string = string> = `log:${Level}: ${Message}`;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Type guard for log facts.
|
|
103
|
+
*/
|
|
104
|
+
export function isLogFact(fact: TraceFact): fact is LogFact {
|
|
105
|
+
return fact.startsWith('log:');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Create a log fact.
|
|
110
|
+
*/
|
|
111
|
+
export function logFact<L extends LogLevel, M extends string>(level: L, message: M): LogFact<L, M> {
|
|
112
|
+
return `log:${level}: ${message}` as LogFact<L, M>;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Convenience functions
|
|
116
|
+
export const logDebug = <M extends string>(msg: M) => logFact('debug', msg);
|
|
117
|
+
export const logInfo = <M extends string>(msg: M) => logFact('info', msg);
|
|
118
|
+
export const logWarn = <M extends string>(msg: M) => logFact('warn', msg);
|
|
119
|
+
export const logError = <M extends string>(msg: M) => logFact('error', msg);
|
|
120
|
+
|
|
121
|
+
// =============================================================================
|
|
122
|
+
// TAG FACTS
|
|
123
|
+
// =============================================================================
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* A tag fact: `tag:${key}: ${value}`
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* type F = TagFact<'userId', '123'>; // "tag:userId: 123"
|
|
130
|
+
*/
|
|
131
|
+
export type TagFact<Key extends string = string, Value extends string = string> = `tag:${Key}: ${Value}`;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Type guard for tag facts.
|
|
135
|
+
*/
|
|
136
|
+
export function isTagFact(fact: TraceFact): fact is TagFact {
|
|
137
|
+
return fact.startsWith('tag:');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Create a tag fact.
|
|
142
|
+
*/
|
|
143
|
+
export function tagFact<K extends string, V extends string | number | boolean>(key: K, value: V): TagFact<K, `${V}`> {
|
|
144
|
+
return `tag:${key}: ${value}` as TagFact<K, `${V}`>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// =============================================================================
|
|
148
|
+
// SCOPE FACTS
|
|
149
|
+
// =============================================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* A scope fact: `scope:${key}: ${value}`
|
|
153
|
+
*
|
|
154
|
+
* Scope facts represent values propagated through the span tree.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* type F = ScopeFact<'requestId', 'req-abc'>; // "scope:requestId: req-abc"
|
|
158
|
+
*/
|
|
159
|
+
export type ScopeFact<Key extends string = string, Value extends string = string> = `scope:${Key}: ${Value}`;
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Type guard for scope facts.
|
|
163
|
+
*/
|
|
164
|
+
export function isScopeFact(fact: TraceFact): fact is ScopeFact {
|
|
165
|
+
return fact.startsWith('scope:');
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Create a scope fact.
|
|
170
|
+
*/
|
|
171
|
+
export function scopeFact<K extends string, V extends string | number | boolean>(
|
|
172
|
+
key: K,
|
|
173
|
+
value: V,
|
|
174
|
+
): ScopeFact<K, `${V}`> {
|
|
175
|
+
return `scope:${key}: ${value}` as ScopeFact<K, `${V}`>;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// =============================================================================
|
|
179
|
+
// FEATURE FLAG FACTS
|
|
180
|
+
// =============================================================================
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* A feature flag fact: `ff:${flag}: ${value}`
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* type F = FFFact<'darkMode', 'true'>; // "ff:darkMode: true"
|
|
187
|
+
*/
|
|
188
|
+
export type FFFact<Flag extends string = string, Value extends string = string> = `ff:${Flag}: ${Value}`;
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Type guard for feature flag facts.
|
|
192
|
+
*/
|
|
193
|
+
export function isFFFact(fact: TraceFact): fact is FFFact {
|
|
194
|
+
return fact.startsWith('ff:');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Create a feature flag fact.
|
|
199
|
+
*/
|
|
200
|
+
export function ffFact<F extends string, V extends string | number | boolean>(flag: F, value: V): FFFact<F, `${V}`> {
|
|
201
|
+
return `ff:${flag}: ${value}` as FFFact<F, `${V}`>;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// =============================================================================
|
|
205
|
+
// METRIC FACTS
|
|
206
|
+
// =============================================================================
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* A metric fact: `metric:${name}: ${value}`
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* type F = MetricFact<'duration_ms', '42'>; // "metric:duration_ms: 42"
|
|
213
|
+
*/
|
|
214
|
+
export type MetricFact<Name extends string = string, Value extends string = string> = `metric:${Name}: ${Value}`;
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Type guard for metric facts.
|
|
218
|
+
*/
|
|
219
|
+
export function isMetricFact(fact: TraceFact): fact is MetricFact {
|
|
220
|
+
return fact.startsWith('metric:');
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Create a metric fact.
|
|
225
|
+
*/
|
|
226
|
+
export function metricFact<N extends string, V extends number>(name: N, value: V): MetricFact<N, `${V}`> {
|
|
227
|
+
return `metric:${name}: ${value}` as MetricFact<N, `${V}`>;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// =============================================================================
|
|
231
|
+
// UNION TYPE: TraceFact
|
|
232
|
+
// =============================================================================
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Any valid trace fact.
|
|
236
|
+
*
|
|
237
|
+
* This is a union of all fact types, providing type safety while
|
|
238
|
+
* allowing heterogeneous fact arrays.
|
|
239
|
+
*/
|
|
240
|
+
export type TraceFact = SpanFact | LogFact | TagFact | ScopeFact | FFFact | MetricFact;
|
|
241
|
+
|
|
242
|
+
// =============================================================================
|
|
243
|
+
// FACT PARSING
|
|
244
|
+
// =============================================================================
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Parsed fact structure.
|
|
248
|
+
*/
|
|
249
|
+
export interface ParsedFact {
|
|
250
|
+
namespace: FactNamespace;
|
|
251
|
+
name: string;
|
|
252
|
+
content: string;
|
|
253
|
+
raw: TraceFact;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function parseFactNamespace(value: string): FactNamespace {
|
|
257
|
+
switch (value) {
|
|
258
|
+
case 'span':
|
|
259
|
+
case 'log':
|
|
260
|
+
case 'tag':
|
|
261
|
+
case 'scope':
|
|
262
|
+
case 'ff':
|
|
263
|
+
case 'metric':
|
|
264
|
+
return value;
|
|
265
|
+
default:
|
|
266
|
+
throw new Error(`Unknown fact namespace: ${value}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Parse a fact string into its components.
|
|
272
|
+
*/
|
|
273
|
+
export function parseFact(fact: TraceFact): ParsedFact {
|
|
274
|
+
const colonIndex = fact.indexOf(':');
|
|
275
|
+
const secondColonIndex = fact.indexOf(':', colonIndex + 1);
|
|
276
|
+
|
|
277
|
+
const namespace = parseFactNamespace(fact.slice(0, colonIndex));
|
|
278
|
+
const name = fact.slice(colonIndex + 1, secondColonIndex).trim();
|
|
279
|
+
const content = fact.slice(secondColonIndex + 1).trim();
|
|
280
|
+
|
|
281
|
+
return { namespace, name, content, raw: fact };
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// =============================================================================
|
|
285
|
+
// FACT ARRAY TYPE
|
|
286
|
+
// =============================================================================
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* A readonly array of trace facts with helper methods.
|
|
290
|
+
*
|
|
291
|
+
* This is the primary interface for working with collected facts.
|
|
292
|
+
*/
|
|
293
|
+
export interface FactArray extends ReadonlyArray<TraceFact> {
|
|
294
|
+
/**
|
|
295
|
+
* Check if a fact exists (exact match).
|
|
296
|
+
*/
|
|
297
|
+
has(fact: TraceFact): boolean;
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Check if any fact matches a pattern.
|
|
301
|
+
* Pattern supports * wildcards in any segment.
|
|
302
|
+
*
|
|
303
|
+
* @example
|
|
304
|
+
* facts.hasMatch('span:*: ok') // Any span completed ok
|
|
305
|
+
* facts.hasMatch('span:fetch-*: *') // Any fetch span, any state
|
|
306
|
+
* facts.hasMatch('log:error: *') // Any error log
|
|
307
|
+
*/
|
|
308
|
+
hasMatch(pattern: string): boolean;
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Filter to facts of a specific namespace.
|
|
312
|
+
*/
|
|
313
|
+
byNamespace<N extends FactNamespace>(namespace: N): FactArray;
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Get all span facts.
|
|
317
|
+
*/
|
|
318
|
+
spans(): SpanFact[];
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Get all log facts.
|
|
322
|
+
*/
|
|
323
|
+
logs(): LogFact[];
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Get all tag facts.
|
|
327
|
+
*/
|
|
328
|
+
tags(): TagFact[];
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Check if facts appear in order (not necessarily adjacent).
|
|
332
|
+
*/
|
|
333
|
+
hasInOrder(facts: TraceFact[]): boolean;
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Find the index of a fact (or -1 if not found).
|
|
337
|
+
*/
|
|
338
|
+
indexOf(fact: TraceFact): number;
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get facts matching a pattern.
|
|
342
|
+
*/
|
|
343
|
+
match(pattern: string): FactArray;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
class TraceFactArray extends Array<TraceFact> implements FactArray {
|
|
347
|
+
constructor(facts: readonly TraceFact[] | number = []) {
|
|
348
|
+
if (typeof facts === 'number') {
|
|
349
|
+
super(facts);
|
|
350
|
+
} else {
|
|
351
|
+
super();
|
|
352
|
+
this.push(...facts);
|
|
353
|
+
}
|
|
354
|
+
Object.setPrototypeOf(this, TraceFactArray.prototype);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
has(fact: TraceFact): boolean {
|
|
358
|
+
return this.includes(fact);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
hasMatch(pattern: string): boolean {
|
|
362
|
+
const regex = patternToRegex(pattern);
|
|
363
|
+
return this.some((fact) => regex.test(fact));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
byNamespace<N extends FactNamespace>(namespace: N): FactArray {
|
|
367
|
+
return new TraceFactArray(this.filter((fact) => fact.startsWith(`${namespace}:`)));
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
spans(): SpanFact[] {
|
|
371
|
+
return this.filter(isSpanFact);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
logs(): LogFact[] {
|
|
375
|
+
return this.filter(isLogFact);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
tags(): TagFact[] {
|
|
379
|
+
return this.filter(isTagFact);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
hasInOrder(expected: TraceFact[]): boolean {
|
|
383
|
+
let lastIndex = -1;
|
|
384
|
+
for (const fact of expected) {
|
|
385
|
+
const index = this.indexOf(fact);
|
|
386
|
+
if (index === -1 || index <= lastIndex) {
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
lastIndex = index;
|
|
390
|
+
}
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
match(pattern: string): FactArray {
|
|
395
|
+
const regex = patternToRegex(pattern);
|
|
396
|
+
return new TraceFactArray(this.filter((fact) => regex.test(fact)));
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
/**
|
|
401
|
+
* Create a FactArray from raw facts.
|
|
402
|
+
*/
|
|
403
|
+
export function createFactArray(facts: TraceFact[]): FactArray {
|
|
404
|
+
return new TraceFactArray(facts);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// =============================================================================
|
|
408
|
+
// PATTERN MATCHING
|
|
409
|
+
// =============================================================================
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Convert a glob-like pattern to a regex.
|
|
413
|
+
*
|
|
414
|
+
* Supports:
|
|
415
|
+
* - `*` matches any characters except `:`
|
|
416
|
+
* - `**` matches any characters including `:`
|
|
417
|
+
*/
|
|
418
|
+
function patternToRegex(pattern: string): RegExp {
|
|
419
|
+
let result = '';
|
|
420
|
+
let i = 0;
|
|
421
|
+
|
|
422
|
+
while (i < pattern.length) {
|
|
423
|
+
if (pattern[i] === '*') {
|
|
424
|
+
if (pattern[i + 1] === '*') {
|
|
425
|
+
// ** matches anything
|
|
426
|
+
result += '.*';
|
|
427
|
+
i += 2;
|
|
428
|
+
} else {
|
|
429
|
+
// * matches anything except colon
|
|
430
|
+
result += '[^:]*';
|
|
431
|
+
i += 1;
|
|
432
|
+
}
|
|
433
|
+
} else if (/[.+^${}()|[\]\\]/.test(pattern[i])) {
|
|
434
|
+
// Escape regex special chars
|
|
435
|
+
result += `\\${pattern[i]}`;
|
|
436
|
+
i += 1;
|
|
437
|
+
} else {
|
|
438
|
+
result += pattern[i];
|
|
439
|
+
i += 1;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return new RegExp(`^${result}$`);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// =============================================================================
|
|
447
|
+
// SCHEMA-AWARE FACT TYPES (for type inference from LogSchema)
|
|
448
|
+
// =============================================================================
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Extract tag fact types from a schema.
|
|
452
|
+
*
|
|
453
|
+
* Given a LogSchema, this produces a union of valid TagFact types
|
|
454
|
+
* for that schema's fields.
|
|
455
|
+
*
|
|
456
|
+
* @example
|
|
457
|
+
* type Schema = { userId: S.category(), count: S.number() };
|
|
458
|
+
* type Tags = SchemaTagFacts<Schema>;
|
|
459
|
+
* // = TagFact<'userId', string> | TagFact<'count', string>
|
|
460
|
+
*/
|
|
461
|
+
export type SchemaTagFacts<Schema extends Record<string, unknown>> = {
|
|
462
|
+
[K in keyof Schema & string]: TagFact<K, string>;
|
|
463
|
+
}[keyof Schema & string];
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Extract scope fact types from a schema.
|
|
467
|
+
*/
|
|
468
|
+
export type SchemaScopeFacts<Schema extends Record<string, unknown>> = {
|
|
469
|
+
[K in keyof Schema & string]: ScopeFact<K, string>;
|
|
470
|
+
}[keyof Schema & string];
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Testing utilities for LMAO trace-testing.
|
|
3
|
+
*
|
|
4
|
+
* This module provides strongly-typed trace facts and assertion helpers
|
|
5
|
+
* based on Akkartik's "tracing tests" approach:
|
|
6
|
+
* https://akkartik.name/post/tracing-tests
|
|
7
|
+
*
|
|
8
|
+
* Instead of testing return values directly, you:
|
|
9
|
+
* 1. Execute code that emits trace facts
|
|
10
|
+
* 2. Assert on the facts (WHAT happened, not HOW)
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import { TestTracer } from '@smoothbricks/lmao';
|
|
15
|
+
* import {
|
|
16
|
+
* createFactArray,
|
|
17
|
+
* spanStarted,
|
|
18
|
+
* spanOk,
|
|
19
|
+
* tagFact,
|
|
20
|
+
* } from '@smoothbricks/lmao/testing';
|
|
21
|
+
*
|
|
22
|
+
* const tracer = new TestTracer(opContext);
|
|
23
|
+
* await tracer.trace('my-op', myOp);
|
|
24
|
+
*
|
|
25
|
+
* const facts = extractFacts(tracer.rootBuffers[0]);
|
|
26
|
+
*
|
|
27
|
+
* // Assert on WHAT happened
|
|
28
|
+
* expect(facts.has(spanOk('my-op'))).toBe(true);
|
|
29
|
+
* expect(facts.hasInOrder([
|
|
30
|
+
* spanStarted('validate'),
|
|
31
|
+
* spanStarted('execute'),
|
|
32
|
+
* spanOk('execute'),
|
|
33
|
+
* spanOk('validate'),
|
|
34
|
+
* ])).toBe(true);
|
|
35
|
+
* expect(facts.has(tagFact('userId', '123'))).toBe(true);
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @module testing
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
// =============================================================================
|
|
42
|
+
// FACT TYPES AND BUILDERS
|
|
43
|
+
// =============================================================================
|
|
44
|
+
|
|
45
|
+
export {
|
|
46
|
+
createFactArray,
|
|
47
|
+
// FactArray
|
|
48
|
+
type FactArray,
|
|
49
|
+
// Namespaces
|
|
50
|
+
type FactNamespace,
|
|
51
|
+
// Feature flag facts
|
|
52
|
+
type FFFact,
|
|
53
|
+
ffFact,
|
|
54
|
+
isFFFact,
|
|
55
|
+
isLogFact,
|
|
56
|
+
isMetricFact,
|
|
57
|
+
isScopeFact,
|
|
58
|
+
isSpanFact,
|
|
59
|
+
isTagFact,
|
|
60
|
+
// Log facts
|
|
61
|
+
type LogFact,
|
|
62
|
+
type LogLevel,
|
|
63
|
+
logDebug,
|
|
64
|
+
logError,
|
|
65
|
+
logFact,
|
|
66
|
+
logInfo,
|
|
67
|
+
logWarn,
|
|
68
|
+
// Metric facts
|
|
69
|
+
type MetricFact,
|
|
70
|
+
metricFact,
|
|
71
|
+
// Parsing
|
|
72
|
+
type ParsedFact,
|
|
73
|
+
parseFact,
|
|
74
|
+
type SchemaScopeFacts,
|
|
75
|
+
// Schema-aware types
|
|
76
|
+
type SchemaTagFacts,
|
|
77
|
+
// Scope facts
|
|
78
|
+
type ScopeFact,
|
|
79
|
+
// Span facts
|
|
80
|
+
type SpanFact,
|
|
81
|
+
type SpanState,
|
|
82
|
+
scopeFact,
|
|
83
|
+
spanErr,
|
|
84
|
+
spanException,
|
|
85
|
+
spanOk,
|
|
86
|
+
spanStarted,
|
|
87
|
+
// Tag facts
|
|
88
|
+
type TagFact,
|
|
89
|
+
// Union type
|
|
90
|
+
type TraceFact,
|
|
91
|
+
tagFact,
|
|
92
|
+
} from './facts.js';
|
|
93
|
+
|
|
94
|
+
// =============================================================================
|
|
95
|
+
// TRACER RE-EXPORTS
|
|
96
|
+
// =============================================================================
|
|
97
|
+
|
|
98
|
+
export { JsBufferStrategy } from '../JsBufferStrategy.js';
|
|
99
|
+
export type { OpContextBinding, OpContextOf } from '../opContext/types.js';
|
|
100
|
+
export type { TraceRootFactory } from '../traceRoot.js';
|
|
101
|
+
// Universal createTraceRoot — picks Node (hrtime.bigint) or ES (performance.now) at runtime
|
|
102
|
+
export { createTraceRoot } from '../traceRoot.universal.js';
|
|
103
|
+
export { CompositeTracer } from '../tracers/CompositeTracer.js';
|
|
104
|
+
export { NoOpTracer } from '../tracers/NoOpTracer.js';
|
|
105
|
+
export { SQLiteAsyncTracer, SQLiteTracer } from '../tracers/SQLiteTracer.js';
|
|
106
|
+
export { StdioTracer } from '../tracers/StdioTracer.js';
|
|
107
|
+
// Re-export TestTracer for convenience
|
|
108
|
+
export { type StatsSnapshot, TestTracer } from '../tracers/TestTracer.js';
|
|
109
|
+
|
|
110
|
+
// =============================================================================
|
|
111
|
+
// FACT EXTRACTION
|
|
112
|
+
// =============================================================================
|
|
113
|
+
|
|
114
|
+
export { type ExtractFactsOptions, extractFacts } from './extractFacts.js';
|
|
115
|
+
export { replayTraceToStdio } from './stdio-replay.js';
|
|
116
|
+
|
|
117
|
+
// =============================================================================
|
|
118
|
+
// SPAN QUERY API
|
|
119
|
+
// =============================================================================
|
|
120
|
+
|
|
121
|
+
export { type QueryableSpan, querySpan } from './queryable-span.js';
|
|
122
|
+
export { extractFactsFor, findAllSpans, findSpan, spanNames } from './span-query.js';
|
|
123
|
+
|
|
124
|
+
// =============================================================================
|
|
125
|
+
// SQLITE PERSISTENCE
|
|
126
|
+
// =============================================================================
|
|
127
|
+
|
|
128
|
+
export { SQLiteAsyncTraceWriter, SQLiteTraceWriter, type SQLiteWriterConfig } from '../sqlite/index.js';
|
|
129
|
+
export { createD1SQLiteDatabase, type D1LikeDatabase, type D1LikePreparedStatement } from '../sqlite/sqlite-d1.js';
|
|
130
|
+
export type {
|
|
131
|
+
AsyncSQLiteDatabase,
|
|
132
|
+
AsyncSQLiteStatement,
|
|
133
|
+
SyncSQLiteDatabase,
|
|
134
|
+
SyncSQLiteStatement,
|
|
135
|
+
} from '../sqlite/sqlite-db.js';
|
|
136
|
+
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// TEST HARNESS WIRING
|
|
139
|
+
// =============================================================================
|
|
140
|
+
|
|
141
|
+
export { makeBunTestSuiteTracer, type TestTracer as BunHarnessTestTracer } from './bun-harness.js';
|