@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,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard for span facts.
|
|
3
|
+
*/
|
|
4
|
+
export function isSpanFact(fact) {
|
|
5
|
+
return fact.startsWith('span:');
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Create a span:started fact.
|
|
9
|
+
*/
|
|
10
|
+
export function spanStarted(name) {
|
|
11
|
+
return `span:${name}: started`;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create a span:ok fact.
|
|
15
|
+
*/
|
|
16
|
+
export function spanOk(name) {
|
|
17
|
+
return `span:${name}: ok`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a span:err fact.
|
|
21
|
+
*/
|
|
22
|
+
export function spanErr(name, code) {
|
|
23
|
+
return `span:${name}: err(${code})`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a span:exception fact.
|
|
27
|
+
*/
|
|
28
|
+
export function spanException(name, message) {
|
|
29
|
+
return `span:${name}: exception(${message})`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Type guard for log facts.
|
|
33
|
+
*/
|
|
34
|
+
export function isLogFact(fact) {
|
|
35
|
+
return fact.startsWith('log:');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a log fact.
|
|
39
|
+
*/
|
|
40
|
+
export function logFact(level, message) {
|
|
41
|
+
return `log:${level}: ${message}`;
|
|
42
|
+
}
|
|
43
|
+
// Convenience functions
|
|
44
|
+
export const logDebug = (msg) => logFact('debug', msg);
|
|
45
|
+
export const logInfo = (msg) => logFact('info', msg);
|
|
46
|
+
export const logWarn = (msg) => logFact('warn', msg);
|
|
47
|
+
export const logError = (msg) => logFact('error', msg);
|
|
48
|
+
/**
|
|
49
|
+
* Type guard for tag facts.
|
|
50
|
+
*/
|
|
51
|
+
export function isTagFact(fact) {
|
|
52
|
+
return fact.startsWith('tag:');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a tag fact.
|
|
56
|
+
*/
|
|
57
|
+
export function tagFact(key, value) {
|
|
58
|
+
return `tag:${key}: ${value}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Type guard for scope facts.
|
|
62
|
+
*/
|
|
63
|
+
export function isScopeFact(fact) {
|
|
64
|
+
return fact.startsWith('scope:');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Create a scope fact.
|
|
68
|
+
*/
|
|
69
|
+
export function scopeFact(key, value) {
|
|
70
|
+
return `scope:${key}: ${value}`;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Type guard for feature flag facts.
|
|
74
|
+
*/
|
|
75
|
+
export function isFFFact(fact) {
|
|
76
|
+
return fact.startsWith('ff:');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a feature flag fact.
|
|
80
|
+
*/
|
|
81
|
+
export function ffFact(flag, value) {
|
|
82
|
+
return `ff:${flag}: ${value}`;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Type guard for metric facts.
|
|
86
|
+
*/
|
|
87
|
+
export function isMetricFact(fact) {
|
|
88
|
+
return fact.startsWith('metric:');
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create a metric fact.
|
|
92
|
+
*/
|
|
93
|
+
export function metricFact(name, value) {
|
|
94
|
+
return `metric:${name}: ${value}`;
|
|
95
|
+
}
|
|
96
|
+
function parseFactNamespace(value) {
|
|
97
|
+
switch (value) {
|
|
98
|
+
case 'span':
|
|
99
|
+
case 'log':
|
|
100
|
+
case 'tag':
|
|
101
|
+
case 'scope':
|
|
102
|
+
case 'ff':
|
|
103
|
+
case 'metric':
|
|
104
|
+
return value;
|
|
105
|
+
default:
|
|
106
|
+
throw new Error(`Unknown fact namespace: ${value}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse a fact string into its components.
|
|
111
|
+
*/
|
|
112
|
+
export function parseFact(fact) {
|
|
113
|
+
const colonIndex = fact.indexOf(':');
|
|
114
|
+
const secondColonIndex = fact.indexOf(':', colonIndex + 1);
|
|
115
|
+
const namespace = parseFactNamespace(fact.slice(0, colonIndex));
|
|
116
|
+
const name = fact.slice(colonIndex + 1, secondColonIndex).trim();
|
|
117
|
+
const content = fact.slice(secondColonIndex + 1).trim();
|
|
118
|
+
return { namespace, name, content, raw: fact };
|
|
119
|
+
}
|
|
120
|
+
class TraceFactArray extends Array {
|
|
121
|
+
constructor(facts = []) {
|
|
122
|
+
if (typeof facts === 'number') {
|
|
123
|
+
super(facts);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
super();
|
|
127
|
+
this.push(...facts);
|
|
128
|
+
}
|
|
129
|
+
Object.setPrototypeOf(this, TraceFactArray.prototype);
|
|
130
|
+
}
|
|
131
|
+
has(fact) {
|
|
132
|
+
return this.includes(fact);
|
|
133
|
+
}
|
|
134
|
+
hasMatch(pattern) {
|
|
135
|
+
const regex = patternToRegex(pattern);
|
|
136
|
+
return this.some((fact) => regex.test(fact));
|
|
137
|
+
}
|
|
138
|
+
byNamespace(namespace) {
|
|
139
|
+
return new TraceFactArray(this.filter((fact) => fact.startsWith(`${namespace}:`)));
|
|
140
|
+
}
|
|
141
|
+
spans() {
|
|
142
|
+
return this.filter(isSpanFact);
|
|
143
|
+
}
|
|
144
|
+
logs() {
|
|
145
|
+
return this.filter(isLogFact);
|
|
146
|
+
}
|
|
147
|
+
tags() {
|
|
148
|
+
return this.filter(isTagFact);
|
|
149
|
+
}
|
|
150
|
+
hasInOrder(expected) {
|
|
151
|
+
let lastIndex = -1;
|
|
152
|
+
for (const fact of expected) {
|
|
153
|
+
const index = this.indexOf(fact);
|
|
154
|
+
if (index === -1 || index <= lastIndex) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
lastIndex = index;
|
|
158
|
+
}
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
match(pattern) {
|
|
162
|
+
const regex = patternToRegex(pattern);
|
|
163
|
+
return new TraceFactArray(this.filter((fact) => regex.test(fact)));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Create a FactArray from raw facts.
|
|
168
|
+
*/
|
|
169
|
+
export function createFactArray(facts) {
|
|
170
|
+
return new TraceFactArray(facts);
|
|
171
|
+
}
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// PATTERN MATCHING
|
|
174
|
+
// =============================================================================
|
|
175
|
+
/**
|
|
176
|
+
* Convert a glob-like pattern to a regex.
|
|
177
|
+
*
|
|
178
|
+
* Supports:
|
|
179
|
+
* - `*` matches any characters except `:`
|
|
180
|
+
* - `**` matches any characters including `:`
|
|
181
|
+
*/
|
|
182
|
+
function patternToRegex(pattern) {
|
|
183
|
+
let result = '';
|
|
184
|
+
let i = 0;
|
|
185
|
+
while (i < pattern.length) {
|
|
186
|
+
if (pattern[i] === '*') {
|
|
187
|
+
if (pattern[i + 1] === '*') {
|
|
188
|
+
// ** matches anything
|
|
189
|
+
result += '.*';
|
|
190
|
+
i += 2;
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// * matches anything except colon
|
|
194
|
+
result += '[^:]*';
|
|
195
|
+
i += 1;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (/[.+^${}()|[\]\\]/.test(pattern[i])) {
|
|
199
|
+
// Escape regex special chars
|
|
200
|
+
result += `\\${pattern[i]}`;
|
|
201
|
+
i += 1;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
result += pattern[i];
|
|
205
|
+
i += 1;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return new RegExp(`^${result}$`);
|
|
209
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
export { createFactArray, type FactArray, type FactNamespace, type FFFact, ffFact, isFFFact, isLogFact, isMetricFact, isScopeFact, isSpanFact, isTagFact, type LogFact, type LogLevel, logDebug, logError, logFact, logInfo, logWarn, type MetricFact, metricFact, type ParsedFact, parseFact, type SchemaScopeFacts, type SchemaTagFacts, type ScopeFact, type SpanFact, type SpanState, scopeFact, spanErr, spanException, spanOk, spanStarted, type TagFact, type TraceFact, tagFact, } from './facts.js';
|
|
41
|
+
export { JsBufferStrategy } from '../JsBufferStrategy.js';
|
|
42
|
+
export type { OpContextBinding, OpContextOf } from '../opContext/types.js';
|
|
43
|
+
export type { TraceRootFactory } from '../traceRoot.js';
|
|
44
|
+
export { createTraceRoot } from '../traceRoot.universal.js';
|
|
45
|
+
export { CompositeTracer } from '../tracers/CompositeTracer.js';
|
|
46
|
+
export { NoOpTracer } from '../tracers/NoOpTracer.js';
|
|
47
|
+
export { SQLiteAsyncTracer, SQLiteTracer } from '../tracers/SQLiteTracer.js';
|
|
48
|
+
export { StdioTracer } from '../tracers/StdioTracer.js';
|
|
49
|
+
export { type StatsSnapshot, TestTracer } from '../tracers/TestTracer.js';
|
|
50
|
+
export { type ExtractFactsOptions, extractFacts } from './extractFacts.js';
|
|
51
|
+
export { replayTraceToStdio } from './stdio-replay.js';
|
|
52
|
+
export { type QueryableSpan, querySpan } from './queryable-span.js';
|
|
53
|
+
export { extractFactsFor, findAllSpans, findSpan, spanNames } from './span-query.js';
|
|
54
|
+
export { SQLiteAsyncTraceWriter, SQLiteTraceWriter, type SQLiteWriterConfig } from '../sqlite/index.js';
|
|
55
|
+
export { createD1SQLiteDatabase, type D1LikeDatabase, type D1LikePreparedStatement } from '../sqlite/sqlite-d1.js';
|
|
56
|
+
export type { AsyncSQLiteDatabase, AsyncSQLiteStatement, SyncSQLiteDatabase, SyncSQLiteStatement, } from '../sqlite/sqlite-db.js';
|
|
57
|
+
export { makeBunTestSuiteTracer, type TestTracer as BunHarnessTestTracer } from './bun-harness.js';
|
|
58
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAMH,OAAO,EACL,eAAe,EAEf,KAAK,SAAS,EAEd,KAAK,aAAa,EAElB,KAAK,MAAM,EACX,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EAET,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,OAAO,EACP,OAAO,EAEP,KAAK,UAAU,EACf,UAAU,EAEV,KAAK,UAAU,EACf,SAAS,EACT,KAAK,gBAAgB,EAErB,KAAK,cAAc,EAEnB,KAAK,SAAS,EAEd,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,SAAS,EACT,OAAO,EACP,aAAa,EACb,MAAM,EACN,WAAW,EAEX,KAAK,OAAO,EAEZ,KAAK,SAAS,EACd,OAAO,GACR,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,OAAO,EAAE,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM1E,OAAO,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAMvD,OAAO,EAAE,KAAK,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAMrF,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAE,sBAAsB,EAAE,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACnH,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAAE,sBAAsB,EAAE,KAAK,UAAU,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
// FACT TYPES AND BUILDERS
|
|
42
|
+
// =============================================================================
|
|
43
|
+
export { createFactArray, ffFact, isFFFact, isLogFact, isMetricFact, isScopeFact, isSpanFact, isTagFact, logDebug, logError, logFact, logInfo, logWarn, metricFact, parseFact, scopeFact, spanErr, spanException, spanOk, spanStarted, tagFact, } from './facts.js';
|
|
44
|
+
// =============================================================================
|
|
45
|
+
// TRACER RE-EXPORTS
|
|
46
|
+
// =============================================================================
|
|
47
|
+
export { JsBufferStrategy } from '../JsBufferStrategy.js';
|
|
48
|
+
// Universal createTraceRoot — picks Node (hrtime.bigint) or ES (performance.now) at runtime
|
|
49
|
+
export { createTraceRoot } from '../traceRoot.universal.js';
|
|
50
|
+
export { CompositeTracer } from '../tracers/CompositeTracer.js';
|
|
51
|
+
export { NoOpTracer } from '../tracers/NoOpTracer.js';
|
|
52
|
+
export { SQLiteAsyncTracer, SQLiteTracer } from '../tracers/SQLiteTracer.js';
|
|
53
|
+
export { StdioTracer } from '../tracers/StdioTracer.js';
|
|
54
|
+
// Re-export TestTracer for convenience
|
|
55
|
+
export { TestTracer } from '../tracers/TestTracer.js';
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// FACT EXTRACTION
|
|
58
|
+
// =============================================================================
|
|
59
|
+
export { extractFacts } from './extractFacts.js';
|
|
60
|
+
export { replayTraceToStdio } from './stdio-replay.js';
|
|
61
|
+
// =============================================================================
|
|
62
|
+
// SPAN QUERY API
|
|
63
|
+
// =============================================================================
|
|
64
|
+
export { querySpan } from './queryable-span.js';
|
|
65
|
+
export { extractFactsFor, findAllSpans, findSpan, spanNames } from './span-query.js';
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// SQLITE PERSISTENCE
|
|
68
|
+
// =============================================================================
|
|
69
|
+
export { SQLiteAsyncTraceWriter, SQLiteTraceWriter } from '../sqlite/index.js';
|
|
70
|
+
export { createD1SQLiteDatabase } from '../sqlite/sqlite-d1.js';
|
|
71
|
+
// =============================================================================
|
|
72
|
+
// TEST HARNESS WIRING
|
|
73
|
+
// =============================================================================
|
|
74
|
+
export { makeBunTestSuiteTracer } from './bun-harness.js';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryableSpan - Ergonomic wrapper around SpanBuffer for test assertions.
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean API for navigating the span tree and extracting facts
|
|
5
|
+
* without needing to know SpanBuffer internals.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const q = querySpan(tracer.rootBuffers[0]);
|
|
10
|
+
* expect(q.name).toBe('my-op');
|
|
11
|
+
* expect(q.find('validate')?.facts().has(spanOk('validate'))).toBe(true);
|
|
12
|
+
* expect(q.names()).toContain('save');
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @module queryable-span
|
|
16
|
+
*/
|
|
17
|
+
import type { LogSchema } from '../schema/LogSchema.js';
|
|
18
|
+
import type { SpanBuffer } from '../types.js';
|
|
19
|
+
import { type ExtractFactsOptions } from './extractFacts.js';
|
|
20
|
+
import type { FactArray } from './facts.js';
|
|
21
|
+
export interface QueryableSpan<T extends LogSchema = LogSchema> {
|
|
22
|
+
/** Span name (from message_values[0]) */
|
|
23
|
+
readonly name: string;
|
|
24
|
+
/** Extract all facts from this span and its children */
|
|
25
|
+
facts(options?: ExtractFactsOptions): FactArray;
|
|
26
|
+
/** Find first child span by name (depth-first) */
|
|
27
|
+
find(name: string): QueryableSpan<T> | undefined;
|
|
28
|
+
/** Find all spans matching name (depth-first) */
|
|
29
|
+
findAll(name: string): QueryableSpan<T>[];
|
|
30
|
+
/** Direct child spans */
|
|
31
|
+
readonly children: QueryableSpan<T>[];
|
|
32
|
+
/** All descendant span names (flat list, depth-first) */
|
|
33
|
+
names(): string[];
|
|
34
|
+
/** Raw SpanBuffer for advanced use */
|
|
35
|
+
readonly buffer: SpanBuffer<T>;
|
|
36
|
+
}
|
|
37
|
+
/** Wrap a SpanBuffer as a QueryableSpan for ergonomic test assertions */
|
|
38
|
+
export declare function querySpan<T extends LogSchema>(buffer: SpanBuffer<T>): QueryableSpan<T>;
|
|
39
|
+
//# sourceMappingURL=queryable-span.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryable-span.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/queryable-span.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAgB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,yCAAyC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,wDAAwD;IACxD,KAAK,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAEhD,kDAAkD;IAClD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAEjD,iDAAiD;IACjD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1C,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtC,yDAAyD;IACzD,KAAK,IAAI,MAAM,EAAE,CAAC;IAElB,sCAAsC;IACtC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAChC;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAEtF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { extractFacts } from './extractFacts.js';
|
|
2
|
+
/** Wrap a SpanBuffer as a QueryableSpan for ergonomic test assertions */
|
|
3
|
+
export function querySpan(buffer) {
|
|
4
|
+
return new QueryableSpanImpl(buffer);
|
|
5
|
+
}
|
|
6
|
+
class QueryableSpanImpl {
|
|
7
|
+
buffer;
|
|
8
|
+
constructor(buffer) {
|
|
9
|
+
this.buffer = buffer;
|
|
10
|
+
}
|
|
11
|
+
get name() {
|
|
12
|
+
return this.buffer.message_values[0];
|
|
13
|
+
}
|
|
14
|
+
facts(options) {
|
|
15
|
+
return extractFacts(this.buffer, options);
|
|
16
|
+
}
|
|
17
|
+
find(name) {
|
|
18
|
+
return findInChildren(this.buffer._children, name);
|
|
19
|
+
}
|
|
20
|
+
findAll(name) {
|
|
21
|
+
const results = [];
|
|
22
|
+
collectAll(this.buffer._children, name, results);
|
|
23
|
+
return results;
|
|
24
|
+
}
|
|
25
|
+
get children() {
|
|
26
|
+
return this.buffer._children.map((child) => new QueryableSpanImpl(child));
|
|
27
|
+
}
|
|
28
|
+
names() {
|
|
29
|
+
const result = [];
|
|
30
|
+
collectNames(this.buffer._children, result);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function findInChildren(children, name) {
|
|
35
|
+
for (const child of children) {
|
|
36
|
+
if (child.message_values[0] === name) {
|
|
37
|
+
return new QueryableSpanImpl(child);
|
|
38
|
+
}
|
|
39
|
+
const found = findInChildren(child._children, name);
|
|
40
|
+
if (found)
|
|
41
|
+
return found;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
function collectAll(children, name, results) {
|
|
46
|
+
for (const child of children) {
|
|
47
|
+
if (child.message_values[0] === name) {
|
|
48
|
+
results.push(new QueryableSpanImpl(child));
|
|
49
|
+
}
|
|
50
|
+
collectAll(child._children, name, results);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function collectNames(children, result) {
|
|
54
|
+
for (const child of children) {
|
|
55
|
+
result.push(child.message_values[0]);
|
|
56
|
+
collectNames(child._children, result);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone span query functions — tree-shakable alternative to QueryableSpan.
|
|
3
|
+
*
|
|
4
|
+
* These functions operate directly on SpanBuffer instances without wrapping.
|
|
5
|
+
* Prefer these when you only need one or two operations and want minimal overhead.
|
|
6
|
+
*
|
|
7
|
+
* @module span-query
|
|
8
|
+
*/
|
|
9
|
+
import type { LogSchema } from '../schema/LogSchema.js';
|
|
10
|
+
import type { SpanBuffer } from '../types.js';
|
|
11
|
+
import { type ExtractFactsOptions } from './extractFacts.js';
|
|
12
|
+
import type { FactArray } from './facts.js';
|
|
13
|
+
/** Find first descendant span by name (depth-first) */
|
|
14
|
+
export declare function findSpan<T extends LogSchema>(root: SpanBuffer<T>, name: string): SpanBuffer<T> | undefined;
|
|
15
|
+
/** Find all descendant spans matching name (depth-first) */
|
|
16
|
+
export declare function findAllSpans<T extends LogSchema>(root: SpanBuffer<T>, name: string): SpanBuffer<T>[];
|
|
17
|
+
/** Extract facts for a specific named span within a root buffer tree */
|
|
18
|
+
export declare function extractFactsFor<T extends LogSchema>(root: SpanBuffer<T>, spanName: string, options?: ExtractFactsOptions): FactArray | undefined;
|
|
19
|
+
/** Collect all descendant span names (flat list, depth-first) */
|
|
20
|
+
export declare function spanNames<T extends LogSchema>(root: SpanBuffer<T>): string[];
|
|
21
|
+
//# sourceMappingURL=span-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span-query.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/span-query.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,KAAK,mBAAmB,EAAgB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,uDAAuD;AACvD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAQ1G;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAIpG;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,CAAC,SAAS,SAAS,EACjD,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,SAAS,GAAG,SAAS,CAIvB;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAI5E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { extractFacts } from './extractFacts.js';
|
|
2
|
+
/** Find first descendant span by name (depth-first) */
|
|
3
|
+
export function findSpan(root, name) {
|
|
4
|
+
for (const child of root._children) {
|
|
5
|
+
const typed = child;
|
|
6
|
+
if (typed.message_values[0] === name)
|
|
7
|
+
return typed;
|
|
8
|
+
const found = findSpan(typed, name);
|
|
9
|
+
if (found)
|
|
10
|
+
return found;
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
/** Find all descendant spans matching name (depth-first) */
|
|
15
|
+
export function findAllSpans(root, name) {
|
|
16
|
+
const results = [];
|
|
17
|
+
collectSpans(root, name, results);
|
|
18
|
+
return results;
|
|
19
|
+
}
|
|
20
|
+
/** Extract facts for a specific named span within a root buffer tree */
|
|
21
|
+
export function extractFactsFor(root, spanName, options) {
|
|
22
|
+
const span = findSpan(root, spanName);
|
|
23
|
+
if (!span)
|
|
24
|
+
return undefined;
|
|
25
|
+
return extractFacts(span, options);
|
|
26
|
+
}
|
|
27
|
+
/** Collect all descendant span names (flat list, depth-first) */
|
|
28
|
+
export function spanNames(root) {
|
|
29
|
+
const result = [];
|
|
30
|
+
collectNames(root._children, result);
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
function collectSpans(root, name, results) {
|
|
34
|
+
for (const child of root._children) {
|
|
35
|
+
const typed = child;
|
|
36
|
+
if (typed.message_values[0] === name)
|
|
37
|
+
results.push(typed);
|
|
38
|
+
collectSpans(typed, name, results);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function collectNames(children, result) {
|
|
42
|
+
for (const child of children) {
|
|
43
|
+
const typed = child;
|
|
44
|
+
result.push(typed.message_values[0]);
|
|
45
|
+
collectNames(typed._children, result);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio-replay.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/stdio-replay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuBjD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,aAAa,GAAG,IAAI,CAsB7F"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { JsBufferStrategy } from '../JsBufferStrategy.js';
|
|
2
|
+
import { createTraceRoot } from '../traceRoot.universal.js';
|
|
3
|
+
import { StdioTracer } from '../tracers/StdioTracer.js';
|
|
4
|
+
function isStdioWritable(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'write') === 'function';
|
|
6
|
+
}
|
|
7
|
+
function makeConsoleWriteStream(write) {
|
|
8
|
+
return {
|
|
9
|
+
write(chunk) {
|
|
10
|
+
write(chunk.replace(/\n$/, ''));
|
|
11
|
+
return true;
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function replayChildSpan(tracer, buffer) {
|
|
16
|
+
tracer.onSpanStart(buffer);
|
|
17
|
+
for (const child of buffer._children) {
|
|
18
|
+
replayChildSpan(tracer, child);
|
|
19
|
+
}
|
|
20
|
+
tracer.onSpanEnd(buffer);
|
|
21
|
+
}
|
|
22
|
+
export function replayTraceToStdio(binding, rootBuffer) {
|
|
23
|
+
const processRef = globalThis.process;
|
|
24
|
+
const out = isStdioWritable(processRef?.stdout)
|
|
25
|
+
? processRef.stdout
|
|
26
|
+
: makeConsoleWriteStream((line) => console.log(line));
|
|
27
|
+
const err = isStdioWritable(processRef?.stderr)
|
|
28
|
+
? processRef.stderr
|
|
29
|
+
: makeConsoleWriteStream((line) => console.error(line));
|
|
30
|
+
const tracer = new StdioTracer(binding, {
|
|
31
|
+
bufferStrategy: new JsBufferStrategy(),
|
|
32
|
+
createTraceRoot,
|
|
33
|
+
out,
|
|
34
|
+
err,
|
|
35
|
+
colorEnabled: processRef?.stdout !== undefined,
|
|
36
|
+
});
|
|
37
|
+
tracer.onTraceStart(rootBuffer);
|
|
38
|
+
for (const child of rootBuffer._children) {
|
|
39
|
+
replayChildSpan(tracer, child);
|
|
40
|
+
}
|
|
41
|
+
tracer.onTraceEnd(rootBuffer);
|
|
42
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TraceQuery - Post-run query API for the SQLite trace database.
|
|
3
|
+
*
|
|
4
|
+
* Queries a single flat `spans` table where each row is a buffer entry.
|
|
5
|
+
* Status and duration are derived from entry_type and timestamps via self-joins.
|
|
6
|
+
* Tree structure uses span_id / parent_span_id (no depth column).
|
|
7
|
+
*
|
|
8
|
+
* Platform-agnostic: accepts a SyncSQLiteDatabase instance from either
|
|
9
|
+
* bun:sqlite or better-sqlite3.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { Database } from 'bun:sqlite';
|
|
14
|
+
* import { TraceQuery } from '@smoothbricks/lmao/testing';
|
|
15
|
+
*
|
|
16
|
+
* const query = new TraceQuery(new Database('.trace-results.db'));
|
|
17
|
+
* console.log(query.failures());
|
|
18
|
+
* console.log(query.slowest(undefined, 10));
|
|
19
|
+
* query.close();
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @module trace-query
|
|
23
|
+
*/
|
|
24
|
+
import type { SyncSQLiteDatabase } from '../sqlite/sqlite-db.js';
|
|
25
|
+
export interface TraceQueryResult {
|
|
26
|
+
spanName: string;
|
|
27
|
+
status: 'ok' | 'err' | 'exception' | 'running';
|
|
28
|
+
errorCode?: string;
|
|
29
|
+
durationNs?: number;
|
|
30
|
+
describe?: string;
|
|
31
|
+
parentSpanId?: number;
|
|
32
|
+
}
|
|
33
|
+
type TraceRun = {
|
|
34
|
+
traceId: string;
|
|
35
|
+
spanName: string;
|
|
36
|
+
startedAt: number;
|
|
37
|
+
};
|
|
38
|
+
type LatestTraceRun = {
|
|
39
|
+
traceId: string;
|
|
40
|
+
};
|
|
41
|
+
export declare class TraceQuery {
|
|
42
|
+
private db;
|
|
43
|
+
constructor(db: SyncSQLiteDatabase);
|
|
44
|
+
/** Get all trace runs (root spans), most recent first */
|
|
45
|
+
runs(): TraceRun[];
|
|
46
|
+
/** Get the most recent trace_id (= run_id) */
|
|
47
|
+
latestRun(): LatestTraceRun | undefined;
|
|
48
|
+
/** Get all failed tests in a run (defaults to latest run) */
|
|
49
|
+
failures(traceId?: string): TraceQueryResult[];
|
|
50
|
+
/** Get slowest tests in a run (defaults to latest run) */
|
|
51
|
+
slowest(traceId?: string, limit?: number): TraceQueryResult[];
|
|
52
|
+
/** Find spans by name pattern (SQL LIKE, defaults to latest run) */
|
|
53
|
+
findSpans(pattern: string, traceId?: string): TraceQueryResult[];
|
|
54
|
+
/** Get full span tree for a specific test (all descendants, defaults to latest run) */
|
|
55
|
+
testTree(testName: string, traceId?: string): TraceQueryResult[];
|
|
56
|
+
close(): void;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=trace-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-query.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/trace-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,KAAK,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AACzE,KAAK,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAyG1C,qBAAa,UAAU;IACT,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,kBAAkB;IAE1C,yDAAyD;IACzD,IAAI,IAAI,QAAQ,EAAE;IAelB,8CAA8C;IAC9C,SAAS,IAAI,cAAc,GAAG,SAAS;IAevC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAqC9C,0DAA0D;IAC1D,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,gBAAgB,EAAE;IAqCzD,oEAAoE;IACpE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IA2BhE,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE;IA2ChE,KAAK,IAAI,IAAI;CAGd"}
|