@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,550 @@
1
+ /**
2
+ * Result types for type-safe error handling without exceptions.
3
+ *
4
+ * ## Classes
5
+ * - `Ok<V, T>` - Success result with fluent tag API
6
+ * - `Err<E, T>` - Error result with fluent tag API
7
+ *
8
+ * ## Error Factories
9
+ * - `defineCodeError(code)` - Create callable error class with `code` on prototype
10
+ *
11
+ * ## Result Row Writer
12
+ *
13
+ * Span start reserves row 1 for the eventual span-end entry, so fluent result
14
+ * methods can write directly to that fixed row instead of capturing deferred
15
+ * closure chains.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Define error codes as callable classes
20
+ * const NOT_FOUND = defineCodeError('NOT_FOUND')<{ userId: string }>();
21
+ * const VALIDATION_FAILED = defineCodeError('VALIDATION_FAILED')<{ field: string }>();
22
+ *
23
+ * // Use in ops - no 'new' required
24
+ * return ctx.err(NOT_FOUND({ userId }));
25
+ * return ctx.err(VALIDATION_FAILED({ field: 'email' })).message('Invalid email');
26
+ *
27
+ * // instanceof works for type narrowing
28
+ * if (result.isErr(NOT_FOUND)) {
29
+ * console.log(result.error.userId); // typed!
30
+ * }
31
+ * ```
32
+ */
33
+
34
+ import { createResultWriter, type ResultWriter } from './codegen/fixedPositionWriterGenerator.js';
35
+ import type { InferSchema, LogSchema } from './schema/types.js';
36
+ import type { AnySpanBuffer } from './types.js';
37
+
38
+ // =============================================================================
39
+ // TAGGED ERROR INTERFACE
40
+ // =============================================================================
41
+
42
+ /**
43
+ * Interface for tagged errors that can be discriminated with isErr(Tag).
44
+ * Used by Blocked, RetriesExhausted, and user-defined error classes.
45
+ */
46
+ export interface TaggedError<Tag extends string = string> {
47
+ readonly _tag: Tag;
48
+ }
49
+
50
+ /**
51
+ * Constructor type for tagged errors.
52
+ * Used with Result.isErr(Tag) to check error type via instanceof.
53
+ */
54
+ export interface TaggedErrorConstructor<T extends TaggedError = TaggedError> {
55
+ readonly _tag: T['_tag'];
56
+ readonly prototype: T;
57
+ readonly [Symbol.hasInstance]: (value: unknown) => boolean;
58
+ }
59
+
60
+ type OkJson<V> = { ok: true; value: V };
61
+ type ErrJson<E> = { ok: false; error: E };
62
+
63
+ type ErrPredicate<E> = (error: E) => boolean;
64
+ type ErrClassMatcher = abstract new (...args: never[]) => unknown;
65
+ type ErrMatcher<E> = TaggedErrorConstructor<TaggedError> | ErrClassMatcher | ErrPredicate<E>;
66
+
67
+ type BoundResultWriter<T extends LogSchema, R, E> = ResultWriter<T, R, E>;
68
+
69
+ function ensureResultWriter<T extends LogSchema, R, E>(
70
+ writer: BoundResultWriter<T, R, E> | undefined,
71
+ schema: T | undefined,
72
+ buffer: AnySpanBuffer | undefined,
73
+ resultOrError: R | E,
74
+ isError: boolean,
75
+ ): BoundResultWriter<T, R, E> | undefined {
76
+ if (writer) {
77
+ return writer;
78
+ }
79
+
80
+ if (!schema || !buffer) {
81
+ return undefined;
82
+ }
83
+
84
+ return createResultWriter<T, R, E>(schema, buffer, resultOrError, isError);
85
+ }
86
+
87
+ function isErrPredicate<E>(value: ErrMatcher<E>): value is ErrPredicate<E> {
88
+ const prototype = Reflect.get(value, 'prototype');
89
+ return prototype === undefined || prototype === Function.prototype;
90
+ }
91
+
92
+ function isInstanceofMatcher<E>(value: ErrMatcher<E>): value is TaggedErrorConstructor<TaggedError> | ErrClassMatcher {
93
+ return typeof value === 'function' && !isErrPredicate(value);
94
+ }
95
+
96
+ function createCodeErrorValue<Code extends string, Fields extends object>(
97
+ prototype: object,
98
+ fields: Fields,
99
+ ): CodeErrorInstance<Code, Fields> & Fields {
100
+ return Object.assign(Object.create(prototype), fields);
101
+ }
102
+
103
+ // =============================================================================
104
+ // OK CLASS
105
+ // =============================================================================
106
+
107
+ /**
108
+ * Success result with fluent tag application.
109
+ *
110
+ * Created by `ctx.ok(value)`. Tags are captured as closures and applied when
111
+ * span()/trace() completes, ensuring writes go to the correct buffer.
112
+ *
113
+ * @typeParam V - The type of the success value
114
+ * @typeParam T - The log schema for buffer tag application
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * return ctx.ok(user);
119
+ * return ctx.ok(user).with({ userId: user.id }).message('Created');
120
+ * ```
121
+ */
122
+ export class Ok<V, T extends LogSchema = LogSchema> {
123
+ readonly value: V;
124
+
125
+ private readonly _schema: T | undefined;
126
+ private readonly _buffer: AnySpanBuffer | undefined;
127
+ private _writer: BoundResultWriter<T, V, never> | undefined;
128
+
129
+ constructor(value: V, schema?: T, buffer?: AnySpanBuffer) {
130
+ this.value = value;
131
+ this._schema = schema;
132
+ this._buffer = buffer;
133
+ }
134
+
135
+ private _resultWriter(): BoundResultWriter<T, V, never> | undefined {
136
+ this._writer = ensureResultWriter<T, V, never>(this._writer, this._schema, this._buffer, this.value, false);
137
+ return this._writer;
138
+ }
139
+
140
+ /** Discriminant for type narrowing. */
141
+ get success(): true {
142
+ return true;
143
+ }
144
+
145
+ /** Tag discriminant for tagged result interop — matches the { _tag: 'ok' } protocol. */
146
+ get _tag(): 'ok' {
147
+ return 'ok';
148
+ }
149
+
150
+ /** Type guard - always returns true for Ok. */
151
+ isOk(): this is Ok<V, T> {
152
+ return true;
153
+ }
154
+
155
+ /** Type guard - always returns false for Ok. */
156
+ isErr(): false;
157
+ isErr<Tag extends TaggedError>(_Tag: TaggedErrorConstructor<Tag>): false;
158
+ isErr(_predicate?: unknown): false {
159
+ return false;
160
+ }
161
+
162
+ /** Get the value (always present for Ok). */
163
+ get maybeValue(): V {
164
+ return this.value;
165
+ }
166
+
167
+ /** Get the error (always undefined for Ok). */
168
+ get maybeError(): undefined {
169
+ return undefined;
170
+ }
171
+
172
+ /** Transform the success value. */
173
+ map<U>(fn: (value: V) => U): Ok<U, T> {
174
+ return new Ok<U, T>(fn(this.value), this._schema, this._buffer);
175
+ }
176
+
177
+ /** No-op for Ok (error transformation). */
178
+ mapErr<F>(_fn: (error: never) => F): Ok<V, T> {
179
+ return this;
180
+ }
181
+
182
+ /** Transform the success value, potentially returning an error. */
183
+ flatMap<U, F>(fn: (value: V) => Result<U, F, T>): Result<U, F, T> {
184
+ return fn(this.value);
185
+ }
186
+
187
+ /** Get the value (always returns value for Ok). */
188
+ unwrapOr<U>(_defaultValue: U): V {
189
+ return this.value;
190
+ }
191
+
192
+ /** Get the value (always returns value for Ok). */
193
+ unwrapOrElse<U>(_fn: (error: never) => U): V {
194
+ return this.value;
195
+ }
196
+
197
+ /** Pattern match on the result. */
198
+ match<U>(handlers: { ok: (value: V) => U; err: (error: never) => U }): U {
199
+ return handlers.ok(this.value);
200
+ }
201
+
202
+ /**
203
+ * Set multiple attributes on the span-end entry (row 1).
204
+ * Deferred - applied when span()/trace() completes.
205
+ *
206
+ * @example ctx.ok(result).with({ userId: 'u1', operation: 'CREATE' })
207
+ */
208
+ with(attributes: Partial<InferSchema<T>>): this {
209
+ this._resultWriter()?.with(attributes);
210
+ return this;
211
+ }
212
+
213
+ /**
214
+ * Set result message on span-end entry (row 1).
215
+ * Overwrites the default span name in the message column.
216
+ *
217
+ * @example ctx.ok(result).message('User created successfully')
218
+ */
219
+ message(text: string): this {
220
+ this._resultWriter()?.message(text);
221
+ return this;
222
+ }
223
+
224
+ /**
225
+ * Set source code line number on span-end entry (row 1).
226
+ * Typically injected by transformer.
227
+ *
228
+ * @example ctx.ok(result).line(42)
229
+ */
230
+ line(lineNumber: number): this {
231
+ this._resultWriter()?.line(lineNumber);
232
+ return this;
233
+ }
234
+
235
+ [Symbol.for('nodejs.util.inspect.custom')](): OkJson<V> {
236
+ return { ok: true, value: this.value };
237
+ }
238
+
239
+ toJSON(): OkJson<V> {
240
+ return { ok: true, value: this.value };
241
+ }
242
+ }
243
+
244
+ // =============================================================================
245
+ // ERR CLASS
246
+ // =============================================================================
247
+
248
+ /**
249
+ * Error result with fluent tag application.
250
+ *
251
+ * Created by `ctx.err(error)`. The error is stored directly (flat structure).
252
+ * Supports fluent `.with()`, `.message()`, `.line()` for deferred tag application.
253
+ *
254
+ * @typeParam E - The type of the error
255
+ * @typeParam T - The log schema for buffer tag application
256
+ *
257
+ * @example
258
+ * ```typescript
259
+ * const NOT_FOUND = defineCodeError('NOT_FOUND')<{ userId: string }>();
260
+ * return ctx.err(NOT_FOUND({ userId }));
261
+ * return ctx.err(NOT_FOUND({ userId })).message('User not found');
262
+ *
263
+ * // Tagged errors work too
264
+ * return ctx.err(Blocked.service('payment-api'));
265
+ * ```
266
+ */
267
+ export class Err<E, T extends LogSchema = LogSchema> {
268
+ readonly error: E;
269
+
270
+ private readonly _schema: T | undefined;
271
+ private readonly _buffer: AnySpanBuffer | undefined;
272
+ private _writer: BoundResultWriter<T, never, E> | undefined;
273
+
274
+ constructor(error: E, schema?: T, buffer?: AnySpanBuffer) {
275
+ this.error = error;
276
+ this._schema = schema;
277
+ this._buffer = buffer;
278
+ }
279
+
280
+ private _resultWriter(): BoundResultWriter<T, never, E> | undefined {
281
+ this._writer = ensureResultWriter<T, never, E>(this._writer, this._schema, this._buffer, this.error, true);
282
+ return this._writer;
283
+ }
284
+
285
+ /** Discriminant for type narrowing. */
286
+ get success(): false {
287
+ return false;
288
+ }
289
+
290
+ /** Tag discriminant for tagged result interop — matches the { _tag: 'err' } protocol. */
291
+ get _tag(): 'err' {
292
+ return 'err';
293
+ }
294
+
295
+ /** Type guard - always returns false for Err. */
296
+ isOk(): false {
297
+ return false;
298
+ }
299
+
300
+ /**
301
+ * Check if this is an error result, optionally matching a tagged type or predicate.
302
+ *
303
+ * @example
304
+ * ```typescript
305
+ * if (result.isErr()) { ... } // Always true for Err
306
+ * if (result.isErr(Blocked)) { ... } // Check instanceof Blocked
307
+ * if (result.isErr(NOT_FOUND)) { ... } // Check instanceof NOT_FOUND
308
+ * if (result.isErr(e => e.code === 'X')) { ... } // Predicate
309
+ * ```
310
+ */
311
+ isErr(): this is Err<E, T>;
312
+ isErr<Tag extends TaggedError>(Tag: TaggedErrorConstructor<Tag>): this is Err<Tag, T>;
313
+ isErr<C extends abstract new (...args: never[]) => unknown>(Class: C): this is Err<InstanceType<C>, T>;
314
+ isErr(predicate: (error: E) => boolean): boolean;
315
+ isErr<Tag extends TaggedError>(
316
+ tagOrPredicate?: TaggedErrorConstructor<Tag> | ErrClassMatcher | ErrPredicate<E>,
317
+ ): boolean {
318
+ if (tagOrPredicate === undefined) return true;
319
+
320
+ // instanceof check for classes (including TaggedError and CodeError)
321
+ if (isErrPredicate(tagOrPredicate)) {
322
+ return tagOrPredicate(this.error);
323
+ }
324
+
325
+ if (isInstanceofMatcher(tagOrPredicate)) {
326
+ return this.error instanceof tagOrPredicate;
327
+ }
328
+
329
+ return false;
330
+ }
331
+
332
+ /** Get the value (always undefined for Err). */
333
+ get maybeValue(): undefined {
334
+ return undefined;
335
+ }
336
+
337
+ /** Get the error (always present for Err). */
338
+ get maybeError(): E {
339
+ return this.error;
340
+ }
341
+
342
+ /** No-op for Err (value transformation). */
343
+ map<U>(_fn: (value: never) => U): Err<E, T> {
344
+ return this;
345
+ }
346
+
347
+ /** Transform the error. */
348
+ mapErr<F>(fn: (error: E) => F): Err<F, T> {
349
+ return new Err<F, T>(fn(this.error), this._schema, this._buffer);
350
+ }
351
+
352
+ /** No-op for Err (returns self). */
353
+ flatMap<U, F>(_fn: (value: never) => Result<U, F>): Err<E, T> {
354
+ return this;
355
+ }
356
+
357
+ /** Get the default value (error is ignored). */
358
+ unwrapOr<U>(defaultValue: U): U {
359
+ return defaultValue;
360
+ }
361
+
362
+ /** Compute a value from the error. */
363
+ unwrapOrElse<U>(fn: (error: E) => U): U {
364
+ return fn(this.error);
365
+ }
366
+
367
+ /** Pattern match on the result. */
368
+ match<U>(handlers: { ok: (value: never) => U; err: (error: E) => U }): U {
369
+ return handlers.err(this.error);
370
+ }
371
+
372
+ /**
373
+ * Set multiple attributes on the span-end entry (row 1).
374
+ * Deferred - applied when span()/trace() completes.
375
+ *
376
+ * @example ctx.err(error).with({ user_id: 'u1' })
377
+ */
378
+ with(attributes: Partial<InferSchema<T>>): this {
379
+ this._resultWriter()?.with(attributes);
380
+ return this;
381
+ }
382
+
383
+ /**
384
+ * Set result message on span-end entry (row 1).
385
+ * Overwrites the default span name in the message column.
386
+ *
387
+ * @example ctx.err('ERROR', details).message('Operation failed')
388
+ */
389
+ message(text: string): this {
390
+ this._resultWriter()?.message(text);
391
+ return this;
392
+ }
393
+
394
+ /**
395
+ * Set source code line number on span-end entry (row 1).
396
+ * Typically injected by transformer.
397
+ *
398
+ * @example ctx.err('ERROR', details).line(42)
399
+ */
400
+ line(lineNumber: number): this {
401
+ this._resultWriter()?.line(lineNumber);
402
+ return this;
403
+ }
404
+
405
+ [Symbol.for('nodejs.util.inspect.custom')](): ErrJson<E> {
406
+ return { ok: false, error: this.error };
407
+ }
408
+
409
+ toJSON(): ErrJson<E> {
410
+ return { ok: false, error: this.error };
411
+ }
412
+ }
413
+
414
+ // =============================================================================
415
+ // RESULT TYPE
416
+ // =============================================================================
417
+
418
+ /** Union type for Result - either Ok or Err. */
419
+ export type Result<V, E, T extends LogSchema = LogSchema> = Ok<V, T> | Err<E, T>;
420
+
421
+ // =============================================================================
422
+ // CODE ERROR FACTORY
423
+ // =============================================================================
424
+
425
+ /**
426
+ * Code error instance type - has `code` on prototype plus fields as own properties.
427
+ */
428
+ export interface CodeErrorInstance<Code extends string, _Fields extends object> {
429
+ readonly code: Code;
430
+ }
431
+
432
+ /**
433
+ * Callable class type returned by defineCodeError.
434
+ * Can be called without `new`, instanceof works.
435
+ */
436
+ export interface CodeErrorClass<Code extends string, Fields extends object> {
437
+ (fields: Fields): CodeErrorInstance<Code, Fields> & Fields;
438
+ readonly prototype: { readonly code: Code };
439
+ }
440
+
441
+ /**
442
+ * Create a callable error class with `code` on prototype.
443
+ *
444
+ * The returned class can be called without `new` and supports `instanceof`.
445
+ *
446
+ * @param code - The error code string (becomes a literal type)
447
+ * @returns A curried function that takes type parameter for fields
448
+ *
449
+ * @example
450
+ * ```typescript
451
+ * const NOT_FOUND = defineCodeError('NOT_FOUND')<{ userId: string }>();
452
+ * const VALIDATION_FAILED = defineCodeError('VALIDATION_FAILED')<{ field: string }>();
453
+ *
454
+ * // Call without 'new'
455
+ * const err = NOT_FOUND({ userId: 'u1' });
456
+ * err.code; // 'NOT_FOUND' (from prototype)
457
+ * err.userId; // 'u1' (own property)
458
+ *
459
+ * // instanceof works
460
+ * err instanceof NOT_FOUND; // true
461
+ *
462
+ * // Use with ctx.err()
463
+ * return ctx.err(NOT_FOUND({ userId }));
464
+ *
465
+ * // Type narrowing with isErr()
466
+ * if (result.isErr(NOT_FOUND)) {
467
+ * result.error.userId; // typed!
468
+ * }
469
+ * ```
470
+ */
471
+ export function defineCodeError<Code extends string>(code: Code) {
472
+ return <Fields extends object = Record<string, never>>(): CodeErrorClass<Code, Fields> => {
473
+ // Constructor function that works with or without 'new'
474
+ const CodeError: CodeErrorClass<Code, Fields> = function (
475
+ this: (CodeErrorInstance<Code, Fields> & Fields) | undefined,
476
+ fields: Fields,
477
+ ): CodeErrorInstance<Code, Fields> & Fields {
478
+ // Allow calling without 'new'
479
+ if (!(this instanceof CodeError)) {
480
+ return createCodeErrorValue<Code, Fields>(CodeError.prototype, fields);
481
+ }
482
+ // Assign fields as own properties
483
+ Object.assign(this, fields);
484
+ return this;
485
+ };
486
+
487
+ // Put code on prototype so all instances share it
488
+ Object.defineProperty(CodeError.prototype, 'code', {
489
+ value: code,
490
+ writable: false,
491
+ enumerable: true,
492
+ configurable: false,
493
+ });
494
+
495
+ return CodeError;
496
+ };
497
+ }
498
+
499
+ /**
500
+ * Check if an error has a `code` property.
501
+ * Used by writeSpanEnd to extract error_code for logging.
502
+ */
503
+ export function hasErrorCode(error: unknown): error is { code: string } {
504
+ return (
505
+ error !== null &&
506
+ typeof error === 'object' &&
507
+ 'code' in error &&
508
+ typeof (error as { code: unknown }).code === 'string'
509
+ );
510
+ }
511
+
512
+ // =============================================================================
513
+ // RESULT TYPE EXTRACTION UTILITIES
514
+ // =============================================================================
515
+
516
+ /**
517
+ * Extract success type from a Result type.
518
+ * Returns `never` if R is not a Result.
519
+ */
520
+ export type ResultSuccess<R> = R extends Result<infer S, unknown, LogSchema> ? S : never;
521
+
522
+ /**
523
+ * Extract success type from a Promise<Result> type.
524
+ * Returns `never` if R is not a Promise<Result>.
525
+ */
526
+ export type PromiseResultSuccess<R> = R extends Promise<Result<infer S, unknown, LogSchema>> ? S : never;
527
+
528
+ /**
529
+ * Extract success type from either Result or Promise<Result>.
530
+ * Useful for inferring the success type from Op return values.
531
+ */
532
+ export type ExtractSuccess<R> = ResultSuccess<R> | PromiseResultSuccess<R>;
533
+
534
+ /**
535
+ * Extract error type from a Result type.
536
+ * Returns `never` if R is not a Result.
537
+ */
538
+ export type ResultError<R> = R extends Result<unknown, infer E, LogSchema> ? E : never;
539
+
540
+ /**
541
+ * Extract error type from a Promise<Result> type.
542
+ * Returns `never` if R is not a Promise<Result>.
543
+ */
544
+ export type PromiseResultError<R> = R extends Promise<Result<unknown, infer E, LogSchema>> ? E : never;
545
+
546
+ /**
547
+ * Extract error type from either Result or Promise<Result>.
548
+ * Useful for inferring the error type from Op return values.
549
+ */
550
+ export type ExtractError<R> = ResultError<R> | PromiseResultError<R>;
@@ -0,0 +1,153 @@
1
+ /**
2
+ * LogSchema class for logging-specific schema functionality
3
+ *
4
+ * Extends ColumnSchema from arrow-builder with logging-specific features:
5
+ * - Schema extension with reserved name validation
6
+ * - Integration with lmao's logging system
7
+ *
8
+ * The base ColumnSchema provides generic cached field access.
9
+ * LogSchema adds logging-specific extension capabilities.
10
+ */
11
+
12
+ import { ColumnSchema } from '@smoothbricks/arrow-builder';
13
+ import type { SchemaFields } from './types.js';
14
+
15
+ /**
16
+ * Reserved method names that cannot be used as attribute names
17
+ *
18
+ * These names are reserved to prevent conflicts or confusion:
19
+ * - Technically conflicting: Names that would shadow actual methods/properties
20
+ * on TagWriter, SpanLogger, FluentLogEntry, or result objects
21
+ * - Confusing: Names that would create confusing code patterns even though
22
+ * they don't technically conflict (e.g., ctx.tag.tag() or ctx.scope.scope)
23
+ */
24
+ const RESERVED_NAMES = new Set([
25
+ // Technically conflicting - methods on TagWriter/FluentLogEntry/result objects
26
+ 'with', // Used on TagWriter, FluentLogEntry, Ok, Err
27
+ 'message', // Used on Ok, Err
28
+
29
+ // Technically conflicting - log level methods on SpanLogger
30
+ 'info', // ctx.log.info()
31
+ 'debug', // ctx.log.debug()
32
+ 'warn', // ctx.log.warn()
33
+ 'error', // ctx.log.error()
34
+ 'trace', // ctx.log.trace()
35
+
36
+ // Internal SpanLogger methods (prefixed with _ but included for completeness)
37
+ '_nextRow', // Internal row advancement
38
+ '_buffer', // Internal buffer reference
39
+ '_writeIndex', // Internal write position
40
+ '_getNextBuffer', // Internal buffer chaining
41
+ '_setScope', // Internal scope setter
42
+ '_prefillScopedAttributes', // Internal scope prefill
43
+
44
+ // Internal FF logging methods (called by evaluator, not on public type)
45
+ 'ffAccess', // Feature flag access logging
46
+ 'ffUsage', // Feature flag usage logging
47
+
48
+ // Confusing - properties on SpanContext (not technically conflicting)
49
+ 'tag', // ctx.tag is TagWriter; ctx.tag.tag() would be confusing
50
+ 'scope', // ctx.scope is readonly; ctx.scope.scope would be confusing
51
+
52
+ // Confusing - methods on SpanContext (not technically conflicting)
53
+ 'ok', // ctx.ok() is method; ctx.tag.ok() or ctx.ok(result).ok() would be confusing
54
+ 'err', // ctx.err() is method; ctx.tag.err() or ctx.err(code, details).err() would be confusing
55
+ 'span', // ctx.span() is method; ctx.tag.span() would be confusing
56
+ ]);
57
+
58
+ /**
59
+ * LogSchema class - extends ColumnSchema with logging-specific features
60
+ *
61
+ * Provides all the generic schema functionality from ColumnSchema plus
62
+ * logging-specific extension with reserved name validation.
63
+ *
64
+ * @template T - The schema fields type (SchemaFields)
65
+ */
66
+ export class LogSchema<T extends SchemaFields = SchemaFields> extends ColumnSchema<T> {
67
+ /**
68
+ * Assert that user-provided field names don't conflict with reserved names
69
+ * and don't start with underscore (reserved for system properties)
70
+ *
71
+ * @throws Error if any field name is reserved or starts with _
72
+ */
73
+ static assertUserFieldNames(fieldNames: readonly string[]): void {
74
+ for (const name of fieldNames) {
75
+ if (name.startsWith('_')) {
76
+ throw new Error(`Field name '${name}' cannot start with '_' - this prefix is reserved for system properties`);
77
+ }
78
+ if (RESERVED_NAMES.has(name)) {
79
+ throw new Error(
80
+ `Attribute name '${name}' is reserved and cannot be used. ` +
81
+ `Reserved names: ${Array.from(RESERVED_NAMES).join(', ')}`,
82
+ );
83
+ }
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Extend this schema with additional fields
89
+ *
90
+ * Creates a new LogSchema instance with merged fields.
91
+ * Validates that extension fields don't conflict with existing fields
92
+ * and don't use reserved names (logging-specific validation).
93
+ *
94
+ * @param extension - Additional schema fields to add
95
+ * @returns New LogSchema instance with merged fields
96
+ * @throws Error if field names conflict or reserved names are used
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const base = new LogSchema({ requestId: S.category() });
101
+ * const extended = base.extend({ duration: S.number() });
102
+ * // extended.fields = { requestId: ..., duration: ... }
103
+ * ```
104
+ */
105
+ extend<U extends SchemaFields>(extension: U): LogSchema<T & U> {
106
+ // Check for field name conflicts
107
+ const extensionKeys = Object.keys(extension);
108
+ for (const key of extensionKeys) {
109
+ if (this._columnNames.includes(key)) {
110
+ throw new Error(
111
+ `Schema conflict: attribute '${key}' already exists in base schema. ` +
112
+ `Base schema has: ${this._columnNames.join(', ')}`,
113
+ );
114
+ }
115
+ }
116
+
117
+ // Assert extension doesn't use reserved names (logging-specific)
118
+ LogSchema.assertUserFieldNames(extensionKeys);
119
+
120
+ // Perform shallow merge
121
+ // Create merged via explicit property assignment to preserve property order for V8 hidden class stability
122
+ const merged = Object.create(null);
123
+ for (const key of this._columnNames) {
124
+ // Use prototypeless object for stable prototype, prevents hidden class deopt
125
+ merged[key] = this.fields[key];
126
+ }
127
+ for (const key of extensionKeys) {
128
+ merged[key] = extension[key];
129
+ }
130
+
131
+ // Return new LogSchema instance
132
+ return new LogSchema(merged);
133
+ }
134
+
135
+ /**
136
+ * Check if this is a LogSchema instance
137
+ *
138
+ * Used for type guards and instanceof checks
139
+ */
140
+ static isLogSchema(value: unknown): value is LogSchema {
141
+ return value instanceof LogSchema;
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Type guard to check if a value is a LogSchema instance
147
+ *
148
+ * @param value - Value to check
149
+ * @returns True if value is a LogSchema instance
150
+ */
151
+ export function isLogSchema(value: unknown): value is LogSchema {
152
+ return LogSchema.isLogSchema(value);
153
+ }