@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.
Files changed (447) hide show
  1. package/README.md +269 -0
  2. package/dist/allocator.wasm +0 -0
  3. package/dist/bun/preload.d.ts +11 -0
  4. package/dist/bun/preload.d.ts.map +1 -0
  5. package/dist/bun/preload.js +10 -0
  6. package/dist/bun/trace-preload.d.ts +8 -0
  7. package/dist/bun/trace-preload.d.ts.map +1 -0
  8. package/dist/bun/trace-preload.js +12 -0
  9. package/dist/es.d.ts +8 -0
  10. package/dist/es.d.ts.map +1 -0
  11. package/dist/es.js +9 -0
  12. package/dist/index.d.ts +41 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +84 -0
  15. package/dist/lib/JsBufferStrategy.d.ts +49 -0
  16. package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
  17. package/dist/lib/JsBufferStrategy.js +60 -0
  18. package/dist/lib/archive/chunkCompaction.d.ts +15 -0
  19. package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
  20. package/dist/lib/archive/chunkCompaction.js +24 -0
  21. package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
  22. package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
  23. package/dist/lib/archive/chunkEnvelope.js +55 -0
  24. package/dist/lib/archive/chunkRouting.d.ts +10 -0
  25. package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
  26. package/dist/lib/archive/chunkRouting.js +47 -0
  27. package/dist/lib/archive/chunkStats.d.ts +12 -0
  28. package/dist/lib/archive/chunkStats.d.ts.map +1 -0
  29. package/dist/lib/archive/chunkStats.js +10 -0
  30. package/dist/lib/archive/index.d.ts +5 -0
  31. package/dist/lib/archive/index.d.ts.map +1 -0
  32. package/dist/lib/archive/index.js +4 -0
  33. package/dist/lib/arrow/capacityStats.d.ts +9 -0
  34. package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
  35. package/dist/lib/arrow/capacityStats.js +231 -0
  36. package/dist/lib/arrow/dictionaries.d.ts +27 -0
  37. package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
  38. package/dist/lib/arrow/dictionaries.js +135 -0
  39. package/dist/lib/arrow/flechette.d.ts +40 -0
  40. package/dist/lib/arrow/flechette.d.ts.map +1 -0
  41. package/dist/lib/arrow/flechette.js +67 -0
  42. package/dist/lib/arrow/utils.d.ts +38 -0
  43. package/dist/lib/arrow/utils.d.ts.map +1 -0
  44. package/dist/lib/arrow/utils.js +112 -0
  45. package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
  46. package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
  47. package/dist/lib/buffer/Nanoseconds.js +86 -0
  48. package/dist/lib/bufferStrategy.d.ts +95 -0
  49. package/dist/lib/bufferStrategy.d.ts.map +1 -0
  50. package/dist/lib/bufferStrategy.js +1 -0
  51. package/dist/lib/capacityTuning.d.ts +50 -0
  52. package/dist/lib/capacityTuning.d.ts.map +1 -0
  53. package/dist/lib/capacityTuning.js +65 -0
  54. package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
  55. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
  56. package/dist/lib/codegen/evaluatorGenerator.js +199 -0
  57. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
  58. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
  59. package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
  60. package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
  61. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
  62. package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
  63. package/dist/lib/convertToArrow.d.ts +40 -0
  64. package/dist/lib/convertToArrow.d.ts.map +1 -0
  65. package/dist/lib/convertToArrow.js +1467 -0
  66. package/dist/lib/defineOpContext.d.ts +96 -0
  67. package/dist/lib/defineOpContext.d.ts.map +1 -0
  68. package/dist/lib/defineOpContext.js +227 -0
  69. package/dist/lib/errors/Blocked.d.ts +113 -0
  70. package/dist/lib/errors/Blocked.d.ts.map +1 -0
  71. package/dist/lib/errors/Blocked.js +68 -0
  72. package/dist/lib/errors/CodeError.d.ts +101 -0
  73. package/dist/lib/errors/CodeError.d.ts.map +1 -0
  74. package/dist/lib/errors/CodeError.js +42 -0
  75. package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
  76. package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
  77. package/dist/lib/errors/RetriesExhausted.js +31 -0
  78. package/dist/lib/errors/Transient.d.ts +115 -0
  79. package/dist/lib/errors/Transient.d.ts.map +1 -0
  80. package/dist/lib/errors/Transient.js +54 -0
  81. package/dist/lib/errors/index.d.ts +14 -0
  82. package/dist/lib/errors/index.d.ts.map +1 -0
  83. package/dist/lib/errors/index.js +16 -0
  84. package/dist/lib/errors/retry-policy.d.ts +60 -0
  85. package/dist/lib/errors/retry-policy.d.ts.map +1 -0
  86. package/dist/lib/errors/retry-policy.js +54 -0
  87. package/dist/lib/flushScheduler.d.ts +162 -0
  88. package/dist/lib/flushScheduler.d.ts.map +1 -0
  89. package/dist/lib/flushScheduler.js +388 -0
  90. package/dist/lib/library.d.ts +149 -0
  91. package/dist/lib/library.d.ts.map +1 -0
  92. package/dist/lib/library.js +588 -0
  93. package/dist/lib/logApi.d.ts +61 -0
  94. package/dist/lib/logApi.d.ts.map +1 -0
  95. package/dist/lib/logApi.js +12 -0
  96. package/dist/lib/logBinding.d.ts +63 -0
  97. package/dist/lib/logBinding.d.ts.map +1 -0
  98. package/dist/lib/logBinding.js +1 -0
  99. package/dist/lib/op.d.ts +105 -0
  100. package/dist/lib/op.d.ts.map +1 -0
  101. package/dist/lib/op.js +59 -0
  102. package/dist/lib/opContext/contextTypes.d.ts +88 -0
  103. package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
  104. package/dist/lib/opContext/contextTypes.js +34 -0
  105. package/dist/lib/opContext/createOpGroup.d.ts +57 -0
  106. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
  107. package/dist/lib/opContext/createOpGroup.js +341 -0
  108. package/dist/lib/opContext/defineOp.d.ts +83 -0
  109. package/dist/lib/opContext/defineOp.d.ts.map +1 -0
  110. package/dist/lib/opContext/defineOp.js +197 -0
  111. package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
  112. package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
  113. package/dist/lib/opContext/featureFlagTypes.js +1 -0
  114. package/dist/lib/opContext/index.d.ts +13 -0
  115. package/dist/lib/opContext/index.d.ts.map +1 -0
  116. package/dist/lib/opContext/index.js +15 -0
  117. package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
  118. package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
  119. package/dist/lib/opContext/opGroupTypes.js +31 -0
  120. package/dist/lib/opContext/opTypes.d.ts +48 -0
  121. package/dist/lib/opContext/opTypes.d.ts.map +1 -0
  122. package/dist/lib/opContext/opTypes.js +7 -0
  123. package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
  124. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
  125. package/dist/lib/opContext/spanContextTypes.js +1 -0
  126. package/dist/lib/opContext/types.d.ts +297 -0
  127. package/dist/lib/opContext/types.d.ts.map +1 -0
  128. package/dist/lib/opContext/types.js +16 -0
  129. package/dist/lib/result.d.ts +308 -0
  130. package/dist/lib/result.d.ts.map +1 -0
  131. package/dist/lib/result.js +359 -0
  132. package/dist/lib/schema/LogSchema.d.ts +62 -0
  133. package/dist/lib/schema/LogSchema.d.ts.map +1 -0
  134. package/dist/lib/schema/LogSchema.js +134 -0
  135. package/dist/lib/schema/builder.d.ts +12 -0
  136. package/dist/lib/schema/builder.d.ts.map +1 -0
  137. package/dist/lib/schema/builder.js +169 -0
  138. package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
  139. package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
  140. package/dist/lib/schema/defineFeatureFlags.js +29 -0
  141. package/dist/lib/schema/defineLogSchema.d.ts +87 -0
  142. package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
  143. package/dist/lib/schema/defineLogSchema.js +171 -0
  144. package/dist/lib/schema/evaluator.d.ts +267 -0
  145. package/dist/lib/schema/evaluator.d.ts.map +1 -0
  146. package/dist/lib/schema/evaluator.js +169 -0
  147. package/dist/lib/schema/extend.d.ts +14 -0
  148. package/dist/lib/schema/extend.d.ts.map +1 -0
  149. package/dist/lib/schema/extend.js +51 -0
  150. package/dist/lib/schema/systemSchema.d.ts +112 -0
  151. package/dist/lib/schema/systemSchema.d.ts.map +1 -0
  152. package/dist/lib/schema/systemSchema.js +260 -0
  153. package/dist/lib/schema/typeGuards.d.ts +52 -0
  154. package/dist/lib/schema/typeGuards.d.ts.map +1 -0
  155. package/dist/lib/schema/typeGuards.js +127 -0
  156. package/dist/lib/schema/types.d.ts +156 -0
  157. package/dist/lib/schema/types.d.ts.map +1 -0
  158. package/dist/lib/schema/types.js +4 -0
  159. package/dist/lib/spanBuffer.d.ts +133 -0
  160. package/dist/lib/spanBuffer.d.ts.map +1 -0
  161. package/dist/lib/spanBuffer.js +442 -0
  162. package/dist/lib/spanBufferHelpers.d.ts +53 -0
  163. package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
  164. package/dist/lib/spanBufferHelpers.js +65 -0
  165. package/dist/lib/spanBufferStats.d.ts +38 -0
  166. package/dist/lib/spanBufferStats.d.ts.map +1 -0
  167. package/dist/lib/spanBufferStats.js +1 -0
  168. package/dist/lib/spanContext.d.ts +141 -0
  169. package/dist/lib/spanContext.d.ts.map +1 -0
  170. package/dist/lib/spanContext.js +763 -0
  171. package/dist/lib/sqlite/index.d.ts +14 -0
  172. package/dist/lib/sqlite/index.d.ts.map +1 -0
  173. package/dist/lib/sqlite/index.js +12 -0
  174. package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
  175. package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
  176. package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
  177. package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
  178. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
  179. package/dist/lib/sqlite/sqlite-common.js +207 -0
  180. package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
  181. package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
  182. package/dist/lib/sqlite/sqlite-d1.js +67 -0
  183. package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
  184. package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
  185. package/dist/lib/sqlite/sqlite-db.js +1 -0
  186. package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
  187. package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
  188. package/dist/lib/sqlite/sqlite-node.js +68 -0
  189. package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
  190. package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
  191. package/dist/lib/sqlite/sqlite-writer.js +78 -0
  192. package/dist/lib/testing/bun-harness.d.ts +150 -0
  193. package/dist/lib/testing/bun-harness.d.ts.map +1 -0
  194. package/dist/lib/testing/bun-harness.js +729 -0
  195. package/dist/lib/testing/extractFacts.d.ts +73 -0
  196. package/dist/lib/testing/extractFacts.d.ts.map +1 -0
  197. package/dist/lib/testing/extractFacts.js +237 -0
  198. package/dist/lib/testing/facts.d.ts +235 -0
  199. package/dist/lib/testing/facts.d.ts.map +1 -0
  200. package/dist/lib/testing/facts.js +209 -0
  201. package/dist/lib/testing/index.d.ts +58 -0
  202. package/dist/lib/testing/index.d.ts.map +1 -0
  203. package/dist/lib/testing/index.js +74 -0
  204. package/dist/lib/testing/queryable-span.d.ts +39 -0
  205. package/dist/lib/testing/queryable-span.d.ts.map +1 -0
  206. package/dist/lib/testing/queryable-span.js +58 -0
  207. package/dist/lib/testing/span-query.d.ts +21 -0
  208. package/dist/lib/testing/span-query.d.ts.map +1 -0
  209. package/dist/lib/testing/span-query.js +47 -0
  210. package/dist/lib/testing/stdio-replay.d.ts +4 -0
  211. package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
  212. package/dist/lib/testing/stdio-replay.js +42 -0
  213. package/dist/lib/testing/trace-query.d.ts +59 -0
  214. package/dist/lib/testing/trace-query.d.ts.map +1 -0
  215. package/dist/lib/testing/trace-query.js +462 -0
  216. package/dist/lib/testing/vitest-harness.d.ts +135 -0
  217. package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
  218. package/dist/lib/testing/vitest-harness.js +486 -0
  219. package/dist/lib/threadId.d.ts +58 -0
  220. package/dist/lib/threadId.d.ts.map +1 -0
  221. package/dist/lib/threadId.js +123 -0
  222. package/dist/lib/traceContext.d.ts +116 -0
  223. package/dist/lib/traceContext.d.ts.map +1 -0
  224. package/dist/lib/traceContext.js +37 -0
  225. package/dist/lib/traceId.d.ts +78 -0
  226. package/dist/lib/traceId.d.ts.map +1 -0
  227. package/dist/lib/traceId.js +87 -0
  228. package/dist/lib/traceRoot.d.ts +133 -0
  229. package/dist/lib/traceRoot.d.ts.map +1 -0
  230. package/dist/lib/traceRoot.es.d.ts +75 -0
  231. package/dist/lib/traceRoot.es.d.ts.map +1 -0
  232. package/dist/lib/traceRoot.es.js +129 -0
  233. package/dist/lib/traceRoot.js +19 -0
  234. package/dist/lib/traceRoot.node.d.ts +77 -0
  235. package/dist/lib/traceRoot.node.d.ts.map +1 -0
  236. package/dist/lib/traceRoot.node.js +133 -0
  237. package/dist/lib/traceRoot.universal.d.ts +3 -0
  238. package/dist/lib/traceRoot.universal.d.ts.map +1 -0
  239. package/dist/lib/traceRoot.universal.js +17 -0
  240. package/dist/lib/tracer.d.ts +296 -0
  241. package/dist/lib/tracer.d.ts.map +1 -0
  242. package/dist/lib/tracer.js +346 -0
  243. package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
  244. package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
  245. package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
  246. package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
  247. package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
  248. package/dist/lib/tracers/CompositeTracer.js +57 -0
  249. package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
  250. package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
  251. package/dist/lib/tracers/NoOpTracer.js +41 -0
  252. package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
  253. package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
  254. package/dist/lib/tracers/SQLiteTracer.js +84 -0
  255. package/dist/lib/tracers/StdioTracer.d.ts +83 -0
  256. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
  257. package/dist/lib/tracers/StdioTracer.js +270 -0
  258. package/dist/lib/tracers/TestTracer.d.ts +95 -0
  259. package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
  260. package/dist/lib/tracers/TestTracer.js +87 -0
  261. package/dist/lib/tracers/index.d.ts +12 -0
  262. package/dist/lib/tracers/index.d.ts.map +1 -0
  263. package/dist/lib/tracers/index.js +11 -0
  264. package/dist/lib/types.d.ts +366 -0
  265. package/dist/lib/types.d.ts.map +1 -0
  266. package/dist/lib/types.js +1 -0
  267. package/dist/lib/utf8Cache.d.ts +111 -0
  268. package/dist/lib/utf8Cache.d.ts.map +1 -0
  269. package/dist/lib/utf8Cache.js +177 -0
  270. package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
  271. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
  272. package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
  273. package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
  274. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
  275. package/dist/lib/wasm/wasmAllocator.js +227 -0
  276. package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
  277. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
  278. package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
  279. package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
  280. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
  281. package/dist/lib/wasm/wasmTraceRoot.js +264 -0
  282. package/dist/node.d.ts +7 -0
  283. package/dist/node.d.ts.map +1 -0
  284. package/dist/node.js +8 -0
  285. package/dist/testing.d.ts +18 -0
  286. package/dist/testing.d.ts.map +1 -0
  287. package/dist/testing.js +17 -0
  288. package/package.json +193 -0
  289. package/src/bun/preload.ts +11 -0
  290. package/src/bun/trace-preload.ts +14 -0
  291. package/src/es.ts +11 -0
  292. package/src/index.ts +194 -0
  293. package/src/lib/JsBufferStrategy.ts +102 -0
  294. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
  295. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
  296. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
  297. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
  298. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
  299. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
  300. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
  301. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
  302. package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
  303. package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
  304. package/src/lib/__tests__/binary-e2e.test.ts +203 -0
  305. package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
  306. package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
  307. package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
  308. package/src/lib/__tests__/effective-schema.test.ts +439 -0
  309. package/src/lib/__tests__/flechette.test.ts +42 -0
  310. package/src/lib/__tests__/flushScheduler.test.ts +537 -0
  311. package/src/lib/__tests__/integration.test.ts +600 -0
  312. package/src/lib/__tests__/library.test.ts +934 -0
  313. package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
  314. package/src/lib/__tests__/op-context-binding.test.ts +135 -0
  315. package/src/lib/__tests__/op-metadata.test.ts +198 -0
  316. package/src/lib/__tests__/op-type-safety.test.ts +71 -0
  317. package/src/lib/__tests__/package-exports.test.ts +57 -0
  318. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
  319. package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
  320. package/src/lib/__tests__/scope-attributes.test.ts +348 -0
  321. package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
  322. package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
  323. package/src/lib/__tests__/test-helpers.ts +318 -0
  324. package/src/lib/__tests__/timestamp.test.ts +259 -0
  325. package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
  326. package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
  327. package/src/lib/__tests__/tracer.test.ts +211 -0
  328. package/src/lib/__tests__/type-narrowing.test.ts +137 -0
  329. package/src/lib/archive/chunkCompaction.ts +44 -0
  330. package/src/lib/archive/chunkEnvelope.ts +79 -0
  331. package/src/lib/archive/chunkRouting.ts +70 -0
  332. package/src/lib/archive/chunkStats.ts +25 -0
  333. package/src/lib/archive/index.ts +4 -0
  334. package/src/lib/arrow/capacityStats.ts +340 -0
  335. package/src/lib/arrow/dictionaries.ts +159 -0
  336. package/src/lib/arrow/flechette.ts +114 -0
  337. package/src/lib/arrow/utils.ts +126 -0
  338. package/src/lib/buffer/Nanoseconds.ts +131 -0
  339. package/src/lib/bufferStrategy.ts +106 -0
  340. package/src/lib/capacityTuning.ts +102 -0
  341. package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
  342. package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
  343. package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
  344. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
  345. package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
  346. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
  347. package/src/lib/codegen/evaluatorGenerator.ts +309 -0
  348. package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
  349. package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
  350. package/src/lib/convertToArrow.ts +1805 -0
  351. package/src/lib/defineOpContext.ts +398 -0
  352. package/src/lib/errors/Blocked.ts +165 -0
  353. package/src/lib/errors/CodeError.ts +132 -0
  354. package/src/lib/errors/RetriesExhausted.ts +78 -0
  355. package/src/lib/errors/Transient.ts +168 -0
  356. package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
  357. package/src/lib/errors/__tests__/Transient.test.ts +129 -0
  358. package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
  359. package/src/lib/errors/index.ts +24 -0
  360. package/src/lib/errors/retry-policy.ts +87 -0
  361. package/src/lib/flushScheduler.ts +509 -0
  362. package/src/lib/library.ts +682 -0
  363. package/src/lib/logApi.ts +70 -0
  364. package/src/lib/logBinding.ts +67 -0
  365. package/src/lib/op.ts +103 -0
  366. package/src/lib/opContext/__tests__/retry.test.ts +764 -0
  367. package/src/lib/opContext/contextTypes.ts +130 -0
  368. package/src/lib/opContext/createOpGroup.ts +456 -0
  369. package/src/lib/opContext/defineOp.ts +281 -0
  370. package/src/lib/opContext/featureFlagTypes.ts +54 -0
  371. package/src/lib/opContext/index.ts +16 -0
  372. package/src/lib/opContext/opGroupTypes.ts +342 -0
  373. package/src/lib/opContext/opTypes.ts +80 -0
  374. package/src/lib/opContext/spanContextTypes.ts +398 -0
  375. package/src/lib/opContext/types.ts +403 -0
  376. package/src/lib/result.ts +550 -0
  377. package/src/lib/schema/LogSchema.ts +153 -0
  378. package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
  379. package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
  380. package/src/lib/schema/builder.ts +201 -0
  381. package/src/lib/schema/defineFeatureFlags.ts +91 -0
  382. package/src/lib/schema/defineLogSchema.ts +291 -0
  383. package/src/lib/schema/evaluator.ts +404 -0
  384. package/src/lib/schema/extend.ts +69 -0
  385. package/src/lib/schema/systemSchema.ts +339 -0
  386. package/src/lib/schema/typeGuards.ts +163 -0
  387. package/src/lib/schema/types.ts +265 -0
  388. package/src/lib/spanBuffer.ts +571 -0
  389. package/src/lib/spanBufferHelpers.ts +73 -0
  390. package/src/lib/spanBufferStats.ts +40 -0
  391. package/src/lib/spanContext.ts +1566 -0
  392. package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
  393. package/src/lib/sqlite/index.ts +26 -0
  394. package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
  395. package/src/lib/sqlite/sqlite-common.ts +309 -0
  396. package/src/lib/sqlite/sqlite-d1.ts +104 -0
  397. package/src/lib/sqlite/sqlite-db.ts +32 -0
  398. package/src/lib/sqlite/sqlite-node.ts +83 -0
  399. package/src/lib/sqlite/sqlite-writer.ts +128 -0
  400. package/src/lib/testing/TRACE-TESTING.md +100 -0
  401. package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
  402. package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
  403. package/src/lib/testing/__tests__/facts.test.ts +324 -0
  404. package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
  405. package/src/lib/testing/bun-harness.ts +990 -0
  406. package/src/lib/testing/extractFacts.ts +362 -0
  407. package/src/lib/testing/facts.ts +470 -0
  408. package/src/lib/testing/index.ts +141 -0
  409. package/src/lib/testing/queryable-span.ts +108 -0
  410. package/src/lib/testing/span-query.ts +65 -0
  411. package/src/lib/testing/stdio-replay.ts +50 -0
  412. package/src/lib/testing/trace-query.ts +329 -0
  413. package/src/lib/testing/vitest-harness.ts +691 -0
  414. package/src/lib/threadId.ts +135 -0
  415. package/src/lib/traceContext.ts +182 -0
  416. package/src/lib/traceId.ts +142 -0
  417. package/src/lib/traceRoot.es.ts +157 -0
  418. package/src/lib/traceRoot.node.ts +170 -0
  419. package/src/lib/traceRoot.ts +154 -0
  420. package/src/lib/traceRoot.universal.ts +22 -0
  421. package/src/lib/tracer.ts +896 -0
  422. package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
  423. package/src/lib/tracers/CompositeTracer.ts +76 -0
  424. package/src/lib/tracers/NoOpTracer.ts +73 -0
  425. package/src/lib/tracers/SQLiteTracer.ts +115 -0
  426. package/src/lib/tracers/StdioTracer.ts +380 -0
  427. package/src/lib/tracers/TestTracer.ts +146 -0
  428. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
  429. package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
  430. package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
  431. package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
  432. package/src/lib/tracers/index.ts +12 -0
  433. package/src/lib/types.ts +498 -0
  434. package/src/lib/utf8Cache.ts +201 -0
  435. package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
  436. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
  437. package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
  438. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
  439. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
  440. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
  441. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
  442. package/src/lib/wasm/allocator.zig +945 -0
  443. package/src/lib/wasm/wasmAllocator.ts +469 -0
  444. package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
  445. package/src/lib/wasm/wasmTraceRoot.ts +315 -0
  446. package/src/node.ts +10 -0
  447. package/src/testing.ts +18 -0
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Unit tests for null bitmap correctness in SpanLogger code generation
3
+ *
4
+ * These tests verify that the generated code sets null bitmap bits correctly
5
+ * for single writes and log entries with scoped attributes.
6
+ *
7
+ * Architecture changes (new design):
8
+ * - SpanLogger handles log entries (rows 2+), NOT tag writes (row 0)
9
+ * - Tag writing is done via ctx.tag which is a separate API (not on SpanLogger)
10
+ * - SpanLogger constructor: (buffer, createNextBuffer)
11
+ * - SpanLogger._writeIndex starts at 1 (rows 0/1 are reserved for span-start/end)
12
+ * - _setScope() stores scope values in buffer._scopeValues (immutable, frozen)
13
+ * - Scope filling happens at Arrow conversion time, NOT during span execution
14
+ * - Direct writes (tag/log) win over scope values on their respective rows
15
+ */
16
+
17
+ import { describe, expect, it } from 'bun:test';
18
+ import { createBuffer, createTestTraceRoot } from '../../__tests__/test-helpers.js';
19
+ import { DEFAULT_METADATA } from '../../opContext/defineOp.js';
20
+ import { S } from '../../schema/builder.js';
21
+ import { defineLogSchema } from '../../schema/defineLogSchema.js';
22
+ import type { LogSchema } from '../../schema/types.js';
23
+ import { createSpanBuffer, SpanBufferTestUtils } from '../../spanBuffer.js';
24
+
25
+ import type { AnySpanBuffer } from '../../types.js';
26
+ import { createSpanLoggerClass } from '../spanLoggerGenerator.js';
27
+
28
+ /**
29
+ * Create a test buffer from a schema
30
+ */
31
+ function createTestBuffer(schema: LogSchema): AnySpanBuffer {
32
+ return createBuffer(schema);
33
+ }
34
+
35
+ /**
36
+ * Create a test buffer with a specific capacity
37
+ */
38
+ function createTestBufferWithCapacity(schema: LogSchema, capacity: number): AnySpanBuffer {
39
+ return createSpanBuffer(schema, createTestTraceRoot('test-trace'), DEFAULT_METADATA, capacity);
40
+ }
41
+
42
+ describe('null bitmap correctness', () => {
43
+ describe('immutable scope semantics', () => {
44
+ it('should store scope values in buffer._scopeValues as frozen object', () => {
45
+ const schema = defineLogSchema({
46
+ requestId: S.category(),
47
+ });
48
+ const buffer = createTestBuffer(schema);
49
+
50
+ const SpanLoggerClass = createSpanLoggerClass(schema);
51
+ const logger = new SpanLoggerClass(buffer);
52
+
53
+ // _setScope should store values in buffer._scopeValues (not fill buffer columns)
54
+ logger._setScope({ requestId: 'req-123' });
55
+
56
+ // Verify scope values are stored in buffer._scopeValues
57
+ expect(buffer._scopeValues).toBeDefined();
58
+ expect(buffer._scopeValues?.requestId).toBe('req-123');
59
+
60
+ // Verify the object is frozen (immutable)
61
+ expect(Object.isFrozen(buffer._scopeValues)).toBe(true);
62
+ });
63
+
64
+ it('should create new frozen object on each _setScope call (merge semantics)', () => {
65
+ const schema = defineLogSchema({
66
+ requestId: S.category(),
67
+ userId: S.category(),
68
+ });
69
+ const buffer = createTestBuffer(schema);
70
+
71
+ const SpanLoggerClass = createSpanLoggerClass(schema);
72
+ const logger = new SpanLoggerClass(buffer);
73
+
74
+ // First setScope call
75
+ logger._setScope({ requestId: 'req-123' });
76
+ const firstScopeValues = buffer._scopeValues;
77
+ expect(firstScopeValues?.requestId).toBe('req-123');
78
+ expect(firstScopeValues?.userId).toBeUndefined();
79
+
80
+ // Second setScope call - should merge with existing values
81
+ logger._setScope({ userId: 'user-456' });
82
+ const secondScopeValues = buffer._scopeValues;
83
+
84
+ // Should be a NEW object (immutable semantics)
85
+ expect(secondScopeValues).not.toBe(firstScopeValues);
86
+
87
+ // Should have merged values
88
+ expect(secondScopeValues?.requestId).toBe('req-123');
89
+ expect(secondScopeValues?.userId).toBe('user-456');
90
+
91
+ // Both should be frozen
92
+ expect(Object.isFrozen(firstScopeValues)).toBe(true);
93
+ expect(Object.isFrozen(secondScopeValues)).toBe(true);
94
+ });
95
+
96
+ it('should clear keys when null is passed (null clears, undefined ignores)', () => {
97
+ const schema = defineLogSchema({
98
+ requestId: S.category(),
99
+ userId: S.category(),
100
+ });
101
+ const buffer = createTestBuffer(schema);
102
+
103
+ const SpanLoggerClass = createSpanLoggerClass(schema);
104
+ const logger = new SpanLoggerClass(buffer);
105
+
106
+ // Set initial values
107
+ logger._setScope({ requestId: 'req-123', userId: 'user-456' });
108
+ expect(buffer._scopeValues?.requestId).toBe('req-123');
109
+ expect(buffer._scopeValues?.userId).toBe('user-456');
110
+
111
+ // Pass null to clear requestId, undefined should be ignored
112
+ logger._setScope({ requestId: null, userId: undefined });
113
+
114
+ // requestId should be cleared (null), userId should remain (undefined ignored)
115
+ expect(buffer._scopeValues?.requestId).toBeUndefined();
116
+ expect(buffer._scopeValues?.userId).toBe('user-456');
117
+ });
118
+
119
+ it('should NOT fill buffer columns during _setScope (deferred to Arrow conversion)', () => {
120
+ const schema = defineLogSchema({
121
+ requestId: S.category(),
122
+ });
123
+ const buffer = createTestBuffer(schema);
124
+
125
+ const SpanLoggerClass = createSpanLoggerClass(schema);
126
+ const logger = new SpanLoggerClass(buffer);
127
+
128
+ // _setScope should NOT fill buffer columns
129
+ logger._setScope({ requestId: 'req-123' });
130
+
131
+ // Check null bitmap - should NOT be allocated (lazy allocation on first write)
132
+ const nulls = SpanBufferTestUtils.getNullBitmap(buffer, 'requestId');
133
+
134
+ // Null bitmap should NOT be allocated since we never directly wrote to requestId
135
+ // Scope filling happens at Arrow conversion time, not during span execution
136
+ expect(nulls).toBeUndefined();
137
+ });
138
+ });
139
+
140
+ describe('log message writes (arbitrary index)', () => {
141
+ it('should NOT set null bitmap during info() - scope filling is deferred to Arrow conversion', () => {
142
+ // Per specs/lmao/01i_span_scope_attributes.md:
143
+ // - Scope values are stored in buffer._scopeValues as a plain object
144
+ // - Scope filling happens at Arrow conversion time, NOT during span execution
145
+ // - This is because scope values are "defaults" that fill null slots
146
+ const schema = defineLogSchema({
147
+ requestId: S.category(),
148
+ });
149
+ const buffer = createTestBuffer(schema);
150
+
151
+ // Set scope value via buffer._scopeValues directly for test setup
152
+ buffer._scopeValues = Object.freeze({ requestId: 'req-123' });
153
+
154
+ const SpanLoggerClass = createSpanLoggerClass(schema);
155
+ const logger = new SpanLoggerClass(buffer);
156
+
157
+ // Set _writeIndex to 4 so nextRow() makes it 5
158
+ logger._writeIndex = 4;
159
+
160
+ // Log a message - this does NOT write scoped attributes during execution
161
+ // Scope values are filled at Arrow conversion time
162
+ logger.info('test message');
163
+
164
+ // Verify that the null bitmap bit is NOT set (scope is deferred)
165
+ const nulls = SpanBufferTestUtils.getNullBitmap(buffer, 'requestId');
166
+ // Null bitmap might not even be allocated since we never directly wrote to requestId
167
+ if (nulls) {
168
+ // If allocated, the bits should be 0 (not written directly)
169
+ expect(nulls[0] & (1 << 5)).toBe(0);
170
+ }
171
+ });
172
+
173
+ it('should NOT set null bitmap at index 9 during info() - scope is deferred', () => {
174
+ // Same as above - scope values are NOT written during span execution
175
+ // They are stored in buffer._scopeValues and filled at Arrow conversion
176
+ const schema = defineLogSchema({
177
+ requestId: S.category(),
178
+ });
179
+ // Need capacity > 9 to test writing at index 9
180
+ const buffer = createTestBufferWithCapacity(schema, 16);
181
+
182
+ // Set scope value via buffer._scopeValues directly for test setup
183
+ buffer._scopeValues = Object.freeze({ requestId: 'req-456' });
184
+
185
+ const SpanLoggerClass = createSpanLoggerClass(schema);
186
+ const logger = new SpanLoggerClass(buffer);
187
+
188
+ // Set _writeIndex to 8 so nextRow() makes it 9
189
+ logger._writeIndex = 8;
190
+
191
+ // Log a message - does NOT write scoped attributes immediately
192
+ logger.info('test message');
193
+
194
+ // Verify scope values are stored correctly
195
+ expect(buffer._scopeValues.requestId).toBe('req-456');
196
+
197
+ // Null bitmap is not set during execution (deferred to Arrow conversion)
198
+ const nulls = SpanBufferTestUtils.getNullBitmap(buffer, 'requestId');
199
+ if (nulls) {
200
+ const byteIndex = 9 >>> 3; // = 1
201
+ const bitOffset = 9 & 7; // = 1
202
+ // Not set - scope filling is deferred
203
+ expect(nulls[byteIndex] & (1 << bitOffset)).toBe(0);
204
+ }
205
+ });
206
+ });
207
+ });
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Unit tests for SpanLogger code generation
3
+ *
4
+ * SpanLogger extends ColumnWriter from arrow-builder and adds:
5
+ * - info(), debug(), warn(), error() methods for log entries
6
+ * - _setScope() for setting scoped attributes
7
+ * - _getNextBuffer() override for SpanBuffer creation on overflow
8
+ *
9
+ * Note: Tag writing (row 0) is handled by TagWriter (not yet implemented).
10
+ * SpanLogger only handles log entries (rows 2+).
11
+ */
12
+
13
+ import { describe, expect, it } from 'bun:test';
14
+ import { createTestLogger } from '../../__tests__/test-helpers.js';
15
+ import { S } from '../../schema/builder.js';
16
+ import { defineLogSchema } from '../../schema/defineLogSchema.js';
17
+ import {
18
+ ENTRY_TYPE_DEBUG,
19
+ ENTRY_TYPE_ERROR,
20
+ ENTRY_TYPE_INFO,
21
+ ENTRY_TYPE_TRACE,
22
+ ENTRY_TYPE_WARN,
23
+ } from '../../schema/systemSchema.js';
24
+ import { createSpanLoggerClass } from '../spanLoggerGenerator.js';
25
+
26
+ describe('createSpanLoggerClass', () => {
27
+ describe('class creation', () => {
28
+ it('should create a SpanLogger class for empty schema', () => {
29
+ const schema = defineLogSchema({});
30
+ const SpanLoggerClass = createSpanLoggerClass(schema);
31
+
32
+ expect(SpanLoggerClass).toBeDefined();
33
+ expect(typeof SpanLoggerClass).toBe('function');
34
+ });
35
+
36
+ it('should cache generated classes for the same schema', () => {
37
+ const schema = defineLogSchema({
38
+ userId: S.category(),
39
+ });
40
+
41
+ const Class1 = createSpanLoggerClass(schema);
42
+ const Class2 = createSpanLoggerClass(schema);
43
+
44
+ expect(Class1).toBe(Class2);
45
+ });
46
+
47
+ it('should create different classes for different schemas', () => {
48
+ const schema1 = defineLogSchema({ userId: S.category() });
49
+ const schema2 = defineLogSchema({ requestId: S.category() });
50
+
51
+ const Class1 = createSpanLoggerClass(schema1);
52
+ const Class2 = createSpanLoggerClass(schema2);
53
+
54
+ expect(Class1).not.toBe(Class2);
55
+ });
56
+ });
57
+
58
+ describe('instance creation', () => {
59
+ it('should create instance with buffer and createNextBuffer', () => {
60
+ const schema = defineLogSchema({ userId: S.category() });
61
+ const { buffer, logger } = createTestLogger(schema);
62
+
63
+ expect(logger).toBeDefined();
64
+ expect(logger._buffer).toBe(buffer);
65
+ expect(buffer._scopeValues).toBeDefined();
66
+ });
67
+
68
+ it('should start with _writeIndex = 1', () => {
69
+ const schema = defineLogSchema({});
70
+ const { logger } = createTestLogger(schema);
71
+
72
+ expect(logger._writeIndex).toBe(1);
73
+ });
74
+ });
75
+
76
+ describe('logging methods', () => {
77
+ it('should increment _writeIndex on info()', () => {
78
+ const schema = defineLogSchema({ userId: S.category() });
79
+ const { logger } = createTestLogger(schema);
80
+
81
+ expect(logger._writeIndex).toBe(1);
82
+ logger.info('Test message');
83
+ expect(logger._writeIndex).toBe(2);
84
+ });
85
+
86
+ it('should write entry type for info()', () => {
87
+ const schema = defineLogSchema({});
88
+ const { buffer, logger } = createTestLogger(schema);
89
+
90
+ logger.info('Test message');
91
+ expect(buffer.entry_type[2]).toBe(ENTRY_TYPE_INFO);
92
+ });
93
+
94
+ it('should write entry type for debug()', () => {
95
+ const schema = defineLogSchema({});
96
+ const { buffer, logger } = createTestLogger(schema);
97
+
98
+ logger.debug('Debug message');
99
+ expect(buffer.entry_type[2]).toBe(ENTRY_TYPE_DEBUG);
100
+ });
101
+
102
+ it('should write entry type for warn()', () => {
103
+ const schema = defineLogSchema({});
104
+ const { buffer, logger } = createTestLogger(schema);
105
+
106
+ logger.warn('Warning message');
107
+ expect(buffer.entry_type[2]).toBe(ENTRY_TYPE_WARN);
108
+ });
109
+
110
+ it('should write entry type for error()', () => {
111
+ const schema = defineLogSchema({});
112
+ const { buffer, logger } = createTestLogger(schema);
113
+
114
+ logger.error('Error message');
115
+ expect(buffer.entry_type[2]).toBe(ENTRY_TYPE_ERROR);
116
+ });
117
+
118
+ it('should write entry type for trace()', () => {
119
+ const schema = defineLogSchema({});
120
+ const { buffer, logger } = createTestLogger(schema);
121
+
122
+ logger.trace('Trace message');
123
+ expect(buffer.entry_type[2]).toBe(ENTRY_TYPE_TRACE);
124
+ });
125
+
126
+ it('should write timestamp for log entries', () => {
127
+ const schema = defineLogSchema({});
128
+ const { buffer, logger } = createTestLogger(schema);
129
+
130
+ logger.info('Test message');
131
+
132
+ expect(buffer.timestamp[2]).not.toBe(0n);
133
+ expect(typeof buffer.timestamp[2]).toBe('bigint');
134
+ });
135
+
136
+ it('should return this for fluent chaining', () => {
137
+ const schema = defineLogSchema({});
138
+ const { logger } = createTestLogger(schema);
139
+
140
+ const result = logger.info('Test message');
141
+
142
+ // FluentLogEntry is same object at runtime (types differ but object identity is same)
143
+ expect(result === (logger as unknown)).toBe(true);
144
+ });
145
+
146
+ it('should support chaining logging methods', () => {
147
+ const schema = defineLogSchema({});
148
+ const { buffer, logger } = createTestLogger(schema);
149
+
150
+ // FluentLogEntry includes logging methods for continued chaining
151
+ logger.info('First').info('Second').warn('Third');
152
+
153
+ expect(logger._writeIndex).toBe(4);
154
+ expect(buffer.entry_type[2]).toBe(ENTRY_TYPE_INFO);
155
+ expect(buffer.entry_type[3]).toBe(ENTRY_TYPE_INFO);
156
+ expect(buffer.entry_type[4]).toBe(ENTRY_TYPE_WARN);
157
+ });
158
+ });
159
+
160
+ describe('scope management', () => {
161
+ it('should update scope values via _setScope to buffer._scopeValues', () => {
162
+ const schema = defineLogSchema({
163
+ userId: S.category(),
164
+ requestId: S.category(),
165
+ });
166
+ const { buffer, logger } = createTestLogger(schema);
167
+
168
+ logger._setScope({ userId: 'user123' });
169
+
170
+ expect(buffer._scopeValues?.userId).toBe('user123');
171
+ expect(buffer._scopeValues?.requestId).toBeUndefined();
172
+ });
173
+
174
+ it('should access scope via logger.scope getter', () => {
175
+ const schema = defineLogSchema({ userId: S.category() });
176
+ const { logger } = createTestLogger(schema);
177
+
178
+ logger._setScope({ userId: 'test123' });
179
+
180
+ expect(logger.scope?.userId).toBe('test123');
181
+ });
182
+ });
183
+
184
+ describe('fluent attribute setters', () => {
185
+ it('should have attribute setter methods from ColumnWriter', () => {
186
+ const schema = defineLogSchema({
187
+ userId: S.category(),
188
+ count: S.number(),
189
+ enabled: S.boolean(),
190
+ });
191
+ const { logger } = createTestLogger(schema);
192
+
193
+ // Log an entry first to advance writeIndex
194
+ logger.info('Test');
195
+
196
+ // Verify methods exist and are callable - types come from ColumnWriter<T>
197
+ expect(typeof logger.userId).toBe('function');
198
+ expect(typeof logger.count).toBe('function');
199
+ expect(typeof logger.enabled).toBe('function');
200
+ });
201
+
202
+ it('should write attribute values at current _writeIndex', () => {
203
+ const schema = defineLogSchema({ userId: S.category() });
204
+ const { buffer, logger } = createTestLogger(schema);
205
+
206
+ // Log an entry and chain attribute
207
+ logger.info('Test').userId('user123');
208
+
209
+ // Value should be at index 2 (after info() incremented from 1 to 2)
210
+ expect(buffer.userId_values[2]).toBe('user123');
211
+ });
212
+
213
+ it('should support fluent chaining with attributes', () => {
214
+ const schema = defineLogSchema({
215
+ userId: S.category(),
216
+ count: S.number(),
217
+ });
218
+ const { buffer, logger } = createTestLogger(schema);
219
+
220
+ logger.info('Test').userId('user123').count(42);
221
+
222
+ expect(buffer.userId_values[2]).toBe('user123');
223
+ expect(buffer.count_values[2]).toBe(42);
224
+ });
225
+
226
+ it('should write multiple log entries with different attributes', () => {
227
+ const schema = defineLogSchema({ userId: S.category() });
228
+ const { buffer, logger } = createTestLogger(schema);
229
+
230
+ logger.info('First').userId('user1');
231
+ logger.info('Second').userId('user2');
232
+
233
+ expect(buffer.userId_values[2]).toBe('user1');
234
+ expect(buffer.userId_values[3]).toBe('user2');
235
+ });
236
+ });
237
+ });