loggily 0.7.0 → 0.8.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loggily",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Debugs, logs, and spans — one API. Disabled logs skip argument evaluation entirely via optional chaining. ~3KB, zero dependencies.",
5
5
  "keywords": [
6
6
  "browser",
@@ -19,7 +19,7 @@
19
19
  "typescript",
20
20
  "zero-dependency"
21
21
  ],
22
- "homepage": "https://beorn.codes/loggily/",
22
+ "homepage": "https://loggily.dev/",
23
23
  "bugs": {
24
24
  "url": "https://github.com/beorn/loggily/issues"
25
25
  },
@@ -35,6 +35,10 @@
35
35
  "type": "module",
36
36
  "exports": {
37
37
  ".": {
38
+ "browser": {
39
+ "types": "./dist/index.browser.d.mts",
40
+ "import": "./dist/index.browser.mjs"
41
+ },
38
42
  "types": "./dist/index.d.mts",
39
43
  "import": "./dist/index.mjs"
40
44
  },
@@ -49,6 +53,10 @@
49
53
  "./context": {
50
54
  "types": "./dist/context.d.mts",
51
55
  "import": "./dist/context.mjs"
56
+ },
57
+ "./otel": {
58
+ "types": "./dist/otel.d.mts",
59
+ "import": "./dist/otel.mjs"
52
60
  }
53
61
  },
54
62
  "publishConfig": {
@@ -56,20 +64,31 @@
56
64
  },
57
65
  "devDependencies": {
58
66
  "@types/node": "^25.5.0",
67
+ "mitata": "^1.0.34",
59
68
  "tsdown": "^0.21.7",
60
69
  "vitepress": "^1.6.4",
61
70
  "vitepress-enrich": "^0.4.0",
62
71
  "vitepress-plugin-llms": "^1.12.0",
63
72
  "vitest": "^4.1.1"
64
73
  },
74
+ "peerDependencies": {
75
+ "@opentelemetry/api": ">=1.0.0"
76
+ },
77
+ "peerDependenciesMeta": {
78
+ "@opentelemetry/api": {
79
+ "optional": true
80
+ }
81
+ },
65
82
  "tsdown": {
66
83
  "clean": true,
67
84
  "dts": true,
68
85
  "entry": [
69
86
  "src/index.ts",
87
+ "src/index.browser.ts",
70
88
  "src/worker.ts",
71
89
  "src/metrics.ts",
72
- "src/context.ts"
90
+ "src/context.ts",
91
+ "src/otel.ts"
73
92
  ],
74
93
  "format": "esm"
75
94
  },
@@ -1,199 +0,0 @@
1
- //#region src/pipeline.d.ts
2
- type OutputLogLevel = "trace" | "debug" | "info" | "warn" | "error";
3
- type LogLevel = OutputLogLevel | "silent";
4
- type LogFormat = "console" | "json";
5
- type LogEvent = {
6
- kind: "log";
7
- time: number;
8
- namespace: string;
9
- level: OutputLogLevel;
10
- message: string;
11
- props?: Record<string, unknown>;
12
- };
13
- type SpanEvent = {
14
- kind: "span";
15
- time: number;
16
- namespace: string;
17
- name: string;
18
- duration: number;
19
- props?: Record<string, unknown>;
20
- spanId: string;
21
- traceId: string;
22
- parentId: string | null;
23
- };
24
- type Event = LogEvent | SpanEvent;
25
- type Stage = (event: Event) => Event | null | void;
26
- declare const LOG_LEVEL_PRIORITY: Record<LogLevel, number>;
27
- declare function safeStringify(value: unknown): string;
28
- type NsFilter = (namespace: string) => boolean;
29
- interface Pipeline {
30
- dispatch: (event: Event) => void;
31
- level: LogLevel;
32
- dispose: () => void;
33
- }
34
- interface ScopeConfig {
35
- level: LogLevel;
36
- ns: NsFilter | null;
37
- format: LogFormat;
38
- }
39
- declare function buildPipeline(elements: unknown[], parentConfig?: Partial<ScopeConfig>): Pipeline;
40
- declare function defaultPipeline(): Pipeline;
41
- //#endregion
42
- //#region src/core.d.ts
43
- interface SpanRecord {
44
- readonly name: string;
45
- readonly durationMs: number;
46
- }
47
- interface SpanRecorder {
48
- recordSpan(data: SpanRecord): void;
49
- }
50
- /** @internal */
51
- declare let _ambientRecorder: SpanRecorder | null;
52
- declare function _setAmbientRecorder(recorder: SpanRecorder | null): void;
53
- type LazyMessage = string | (() => string);
54
- type LazyProps = Record<string, unknown> | (() => Record<string, unknown>);
55
- interface SpanData {
56
- readonly id: string;
57
- readonly traceId: string;
58
- readonly parentId: string | null;
59
- readonly startTime: number;
60
- readonly endTime: number | null;
61
- readonly duration: number | null;
62
- [key: string]: unknown;
63
- }
64
- interface Logger {
65
- readonly name: string;
66
- readonly props: Readonly<Record<string, unknown>>;
67
- readonly spanData: SpanData | null;
68
- trace(message: LazyMessage, data?: Record<string, unknown>): void;
69
- debug(message: LazyMessage, data?: Record<string, unknown>): void;
70
- info(message: LazyMessage, data?: Record<string, unknown>): void;
71
- warn(message: LazyMessage, data?: Record<string, unknown>): void;
72
- error(message: LazyMessage, data?: Record<string, unknown>): void;
73
- error(error: Error, data?: Record<string, unknown>): void;
74
- error(error: Error, message: string, data?: Record<string, unknown>): void;
75
- logger(namespace?: string, props?: Record<string, unknown>): ConditionalLogger;
76
- span(namespace?: string, props?: LazyProps): SpanLogger;
77
- child(context: Record<string, unknown>): ConditionalLogger;
78
- /** @deprecated Use .logger() instead for namespace-based children */
79
- child(context: string): ConditionalLogger;
80
- end(): void;
81
- }
82
- interface SpanLogger extends Logger, Disposable {
83
- readonly spanData: SpanData & {
84
- [key: string]: unknown;
85
- };
86
- }
87
- interface ConditionalLogger {
88
- readonly name: string;
89
- readonly props: Readonly<Record<string, unknown>>;
90
- readonly spanData: SpanData | null;
91
- trace?: (message: LazyMessage, data?: Record<string, unknown>) => void;
92
- debug?: (message: LazyMessage, data?: Record<string, unknown>) => void;
93
- info?: (message: LazyMessage, data?: Record<string, unknown>) => void;
94
- warn?: (message: LazyMessage, data?: Record<string, unknown>) => void;
95
- error?: {
96
- (message: LazyMessage, data?: Record<string, unknown>): void;
97
- (error: Error, data?: Record<string, unknown>): void;
98
- (error: Error, message: string, data?: Record<string, unknown>): void;
99
- };
100
- logger(namespace?: string, props?: Record<string, unknown>): ConditionalLogger;
101
- span(namespace?: string, props?: LazyProps): SpanLogger;
102
- child(context: Record<string, unknown>): ConditionalLogger;
103
- child(context: string): ConditionalLogger;
104
- end(): void;
105
- }
106
- declare function resetIds(): void;
107
- /** @internal */
108
- declare function _setContextHooks(hooks: {
109
- getContextTags: () => Record<string, string>;
110
- getContextParent: () => {
111
- spanId: string;
112
- traceId: string;
113
- } | null;
114
- enterContext: (spanId: string, traceId: string, parentId: string | null) => void;
115
- exitContext: (spanId: string) => void;
116
- }): void;
117
- /** @internal */
118
- declare function _clearContextHooks(): void;
119
- interface SpanDataFields {
120
- id: string;
121
- traceId: string;
122
- parentId: string | null;
123
- startTime: number;
124
- endTime: number | null;
125
- duration: number | null;
126
- }
127
- declare function createSpanDataProxy(getFields: () => SpanDataFields, attrs: Record<string, unknown>): SpanData;
128
- declare function startCollecting(): void;
129
- declare function stopCollecting(): SpanData[];
130
- declare function getCollectedSpans(): SpanData[];
131
- declare function clearCollectedSpans(): void;
132
- /**
133
- * Create a logger.
134
- *
135
- * @param name - Logger namespace (e.g., 'myapp', 'myapp:db')
136
- * @param config - Optional config array. Objects configure, arrays branch, values write.
137
- *
138
- * @example
139
- * // Zero config (reads LOG_LEVEL, DEBUG, LOG_FORMAT from env)
140
- * const log = createLogger('myapp')
141
- *
142
- * @example
143
- * // Configured pipeline
144
- * const log = createLogger('myapp', [
145
- * { level: 'debug', ns: '-sql' },
146
- * console,
147
- * { file: '/tmp/app.log', level: 'info', format: 'json' },
148
- * ])
149
- */
150
- declare function createLogger(name: string, config?: unknown[]): ConditionalLogger;
151
- type LoggerFactory = (name: string, config?: unknown[]) => ConditionalLogger;
152
- type LoggerPlugin = (factory: LoggerFactory) => LoggerFactory;
153
- /**
154
- * Compose a custom createLogger with plugins.
155
- *
156
- * @example
157
- * import { createLogger as base, compose } from "loggily"
158
- * import withSentry from "@sentry/loggily"
159
- *
160
- * const createLogger = compose(base, withSentry({ dsn: "..." }))
161
- * const log = createLogger("myapp")
162
- */
163
- declare function compose(base: LoggerFactory, ...plugins: LoggerPlugin[]): LoggerFactory;
164
- /** @deprecated Use createLogger config array: createLogger("x", [{ level }, console]) */
165
- declare function setLogLevel(level: LogLevel): void;
166
- /** @deprecated Level is per-logger in v2 */
167
- declare function getLogLevel(): LogLevel;
168
- /** @deprecated Use TRACE=1 env var */
169
- declare function enableSpans(): void;
170
- /** @deprecated */
171
- declare function disableSpans(): void;
172
- /** @deprecated */
173
- declare function spansAreEnabled(): boolean;
174
- /** @deprecated Use TRACE=namespace env var */
175
- declare function setTraceFilter(namespaces: string[] | null): void;
176
- /** @deprecated */
177
- declare function getTraceFilter(): string[] | null;
178
- /** @deprecated Use DEBUG=namespace env var or { ns } in config array */
179
- declare function setDebugFilter(namespaces: string[] | null): void;
180
- /** @deprecated */
181
- declare function getDebugFilter(): string[] | null;
182
- /** @deprecated Use { format } in config array */
183
- declare function setLogFormat(format: LogFormat): void;
184
- /** @deprecated */
185
- declare function getLogFormat(): LogFormat;
186
- /** @deprecated Omit console from config array instead */
187
- declare function setSuppressConsole(value: boolean): void;
188
- type OutputMode = "console" | "stderr" | "writers-only";
189
- /** @deprecated Use config array */
190
- declare function setOutputMode(_mode: OutputMode): void;
191
- /** @deprecated */
192
- declare function getOutputMode(): OutputMode;
193
- /** @deprecated Pass writers in config array instead */
194
- declare function addWriter(writer: (formatted: string, level: string) => void): () => void;
195
- /** @deprecated Spans dispatch through the pipeline automatically */
196
- declare function writeSpan(namespace: string, duration: number, attrs: Record<string, unknown>): void;
197
- //#endregion
198
- export { setDebugFilter as A, Event as B, getCollectedSpans as C, getOutputMode as D, getLogLevel as E, setTraceFilter as F, OutputLogLevel as G, LogEvent as H, spansAreEnabled as I, Stage as J, Pipeline as K, startCollecting as L, setLogLevel as M, setOutputMode as N, getTraceFilter as O, setSuppressConsole as P, stopCollecting as R, enableSpans as S, getLogFormat as T, LogFormat as U, LOG_LEVEL_PRIORITY as V, LogLevel as W, defaultPipeline as X, buildPipeline as Y, safeStringify as Z, clearCollectedSpans as _, LoggerFactory as a, createSpanDataProxy as b, SpanData as c, SpanRecorder as d, _ambientRecorder as f, addWriter as g, _setContextHooks as h, Logger as i, setLogFormat as j, resetIds as k, SpanLogger as l, _setAmbientRecorder as m, LazyMessage as n, LoggerPlugin as o, _clearContextHooks as p, SpanEvent as q, LazyProps as r, OutputMode as s, ConditionalLogger as t, SpanRecord as u, compose as v, getDebugFilter as w, disableSpans as x, createLogger as y, writeSpan as z };
199
- //# sourceMappingURL=core-DAFH-huv.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-DAFH-huv.d.mts","names":[],"sources":["../src/pipeline.ts","../src/core.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"core-Du3sIje6.mjs","names":["_process","pc"],"sources":["../src/colors.ts","../src/file-writer.ts","../src/pipeline.ts","../src/tracing.ts","../src/core.ts"],"sourcesContent":["/**\n * Vendored ANSI color functions — replaces picocolors dependency.\n * Supports NO_COLOR, FORCE_COLOR, and TTY detection.\n */\n\nconst _process = typeof process !== \"undefined\" ? process : undefined\n\nconst enabled =\n _process?.env?.[\"FORCE_COLOR\"] !== undefined && _process?.env?.[\"FORCE_COLOR\"] !== \"0\"\n ? true\n : _process?.env?.[\"NO_COLOR\"] !== undefined\n ? false\n : (_process?.stdout?.isTTY ?? false)\n\nfunction wrap(open: string, close: string): (str: string) => string {\n if (!enabled) return (str) => str\n return (str) => open + str + close\n}\n\nexport const colors = {\n dim: wrap(\"\\x1b[2m\", \"\\x1b[22m\"),\n blue: wrap(\"\\x1b[34m\", \"\\x1b[39m\"),\n yellow: wrap(\"\\x1b[33m\", \"\\x1b[39m\"),\n red: wrap(\"\\x1b[31m\", \"\\x1b[39m\"),\n magenta: wrap(\"\\x1b[35m\", \"\\x1b[39m\"),\n cyan: wrap(\"\\x1b[36m\", \"\\x1b[39m\"),\n}\n","/**\n * File writer for loggily — Node.js/Bun only.\n *\n * Separated from core logger to allow tree-shaking in browser bundles.\n * Uses dynamic import(\"node:fs\") to avoid static dependency on Node APIs.\n */\n\nimport { openSync, writeSync, closeSync } from \"node:fs\"\n\n/** Options for creating an async buffered file writer */\nexport interface FileWriterOptions {\n /** Buffer size threshold in bytes before flushing (default: 4096) */\n bufferSize?: number\n /** Flush interval in milliseconds (default: 100) */\n flushInterval?: number\n}\n\n/** An async buffered file writer with automatic flushing */\nexport interface FileWriter {\n /** Write a line to the buffer (appends newline) */\n write(line: string): void\n /** Flush the buffer immediately */\n flush(): void\n /** Close the writer and flush remaining buffer */\n close(): void\n}\n\n/**\n * Create an async buffered file writer for log output.\n * Buffers writes and flushes on size threshold or interval.\n * Registers a process.on('exit') handler to flush remaining buffer.\n *\n * **Node.js/Bun only** — not available in browser environments.\n *\n * @param filePath - Path to the log file (opened in append mode)\n * @param options - Buffer size and flush interval configuration\n * @returns FileWriter with write, flush, and close methods\n *\n * @example\n * const writer = createFileWriter('/tmp/app.log')\n * const unsubscribe = addWriter((formatted) => writer.write(formatted))\n *\n * // On shutdown:\n * unsubscribe()\n * writer.close()\n */\nexport function createFileWriter(filePath: string, options: FileWriterOptions = {}): FileWriter {\n const bufferSize = options.bufferSize ?? 4096\n const flushInterval = options.flushInterval ?? 100\n\n let buffer = \"\"\n let fd: number | null = null\n let timer: ReturnType<typeof setInterval> | null = null\n let closed = false\n\n // Open file in append mode\n fd = openSync(filePath, \"a\")\n\n /** Flush buffer contents to disk synchronously */\n function flush(): void {\n if (buffer.length === 0 || fd === null) return\n const data = buffer\n writeSync(fd, data)\n buffer = \"\"\n }\n\n // Set up periodic flush\n timer = setInterval(flush, flushInterval)\n // Don't let the timer keep the process alive\n if (timer && typeof timer === \"object\" && \"unref\" in timer) {\n ;(timer as { unref(): void }).unref()\n }\n\n // Flush on process exit to avoid data loss\n const exitHandler = (): void => flush()\n process.on(\"exit\", exitHandler)\n\n return {\n write(line: string): void {\n if (closed) return\n buffer += line + \"\\n\"\n if (buffer.length >= bufferSize) {\n flush()\n }\n },\n\n flush,\n\n close(): void {\n if (closed) return\n closed = true\n if (timer !== null) {\n clearInterval(timer)\n timer = null\n }\n try {\n flush()\n } catch {\n // Swallow flush errors during close — data loss is unavoidable\n // at this point, but we must still release the fd and exit handler.\n } finally {\n if (fd !== null) {\n closeSync(fd)\n fd = null\n }\n process.removeListener(\"exit\", exitHandler)\n }\n },\n }\n}\n","import { colors as pc } from \"./colors.js\"\nimport { createFileWriter } from \"./file-writer.js\"\n\n// ============ Types ============\n\nexport type OutputLogLevel = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\"\nexport type LogLevel = OutputLogLevel | \"silent\"\nexport type LogFormat = \"console\" | \"json\"\n\nexport type LogEvent = {\n kind: \"log\"\n time: number\n namespace: string\n level: OutputLogLevel\n message: string\n props?: Record<string, unknown>\n}\n\nexport type SpanEvent = {\n kind: \"span\"\n time: number\n namespace: string\n name: string\n duration: number\n props?: Record<string, unknown>\n spanId: string\n traceId: string\n parentId: string | null\n}\n\nexport type Event = LogEvent | SpanEvent\nexport type Stage = (event: Event) => Event | null | void\n\n// ============ Level Priority ============\n\nexport const LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n silent: 5,\n}\n\n// ============ Runtime Detection ============\n\nconst _process = typeof process !== \"undefined\" ? process : undefined\n\nfunction getEnv(key: string): string | undefined {\n return _process?.env?.[key]\n}\n\nfunction writeStderr(text: string): void {\n if (_process?.stderr?.write) {\n _process.stderr.write(text + \"\\n\")\n } else {\n console.error(text)\n }\n}\n\n// ============ Formatting ============\n\nexport function safeStringify(value: unknown): string {\n const seen = new WeakSet()\n return JSON.stringify(value, (_key, val) => {\n if (typeof val === \"bigint\") return val.toString()\n if (typeof val === \"symbol\") return val.toString()\n if (val instanceof Error) return { message: val.message, stack: val.stack, name: val.name }\n if (typeof val === \"object\" && val !== null) {\n if (seen.has(val)) return \"[Circular]\"\n seen.add(val)\n }\n return val\n })\n}\n\nfunction formatConsoleEvent(event: Event): string {\n const time = pc.dim(new Date(event.time).toISOString().split(\"T\")[1]?.split(\".\")[0] || \"\")\n const ns = pc.cyan(event.namespace)\n\n if (event.kind === \"span\") {\n const message = `(${event.duration}ms)`\n let output = `${time} ${pc.magenta(\"SPAN\")} ${ns} ${message}`\n if (event.props && Object.keys(event.props).length > 0) {\n output += ` ${pc.dim(safeStringify(event.props))}`\n }\n return output\n }\n\n let levelStr: string\n switch (event.level) {\n case \"trace\":\n levelStr = pc.dim(\"TRACE\")\n break\n case \"debug\":\n levelStr = pc.dim(\"DEBUG\")\n break\n case \"info\":\n levelStr = pc.blue(\"INFO\")\n break\n case \"warn\":\n levelStr = pc.yellow(\"WARN\")\n break\n case \"error\":\n levelStr = pc.red(\"ERROR\")\n break\n }\n\n let output = `${time} ${levelStr} ${ns} ${event.message}`\n if (event.props && Object.keys(event.props).length > 0) {\n output += ` ${pc.dim(safeStringify(event.props))}`\n }\n return output\n}\n\nfunction formatJSONEvent(event: Event): string {\n if (event.kind === \"span\") {\n return safeStringify({\n time: new Date(event.time).toISOString(),\n level: \"span\",\n name: event.namespace,\n msg: `(${event.duration}ms)`,\n duration: event.duration,\n span_id: event.spanId,\n trace_id: event.traceId,\n parent_id: event.parentId,\n ...event.props,\n })\n }\n\n return safeStringify({\n time: new Date(event.time).toISOString(),\n level: event.level,\n name: event.namespace,\n msg: event.message,\n ...event.props,\n })\n}\n\n// ============ Namespace Filter ============\n\nexport type NsFilter = (namespace: string) => boolean\n\nfunction matchesPattern(namespace: string, pattern: string): boolean {\n if (pattern === \"*\") return true\n return namespace === pattern || namespace.startsWith(pattern + \":\")\n}\n\nexport function parseNsFilter(ns: string | string[]): NsFilter {\n const patterns = typeof ns === \"string\" ? ns.split(\",\").map((s) => s.trim()) : ns\n const includes: string[] = []\n const excludes: string[] = []\n\n for (const p of patterns) {\n if (p.startsWith(\"-\")) {\n excludes.push(p.slice(1))\n } else {\n includes.push(p)\n }\n }\n\n return (namespace: string): boolean => {\n for (const exc of excludes) {\n if (matchesPattern(namespace, exc)) return false\n }\n if (includes.length > 0) {\n for (const inc of includes) {\n if (matchesPattern(namespace, inc)) return true\n }\n return false\n }\n return true\n }\n}\n\n// ============ Sinks ============\n\nfunction createConsoleSink(format: LogFormat): (event: Event) => void {\n const formatter = format === \"json\" ? formatJSONEvent : formatConsoleEvent\n return (event: Event) => {\n const text = formatter(event)\n if (event.kind === \"span\") {\n writeStderr(text)\n return\n }\n switch (event.level) {\n case \"trace\":\n case \"debug\":\n console.debug(text)\n break\n case \"info\":\n console.info(text)\n break\n case \"warn\":\n console.warn(text)\n break\n case \"error\":\n console.error(text)\n break\n }\n }\n}\n\nfunction createFileSink(path: string, format: LogFormat): { write: (event: Event) => void; dispose: () => void } {\n const writer = createFileWriter(path)\n const formatter = format === \"json\" ? formatJSONEvent : formatConsoleEvent\n return {\n write: (event: Event) => writer.write(formatter(event)),\n dispose: () => writer.close(),\n }\n}\n\nfunction createWritableSink(writable: { write: (s: string) => unknown }, format: LogFormat): (event: Event) => void {\n const formatter = format === \"json\" ? formatJSONEvent : formatConsoleEvent\n return (event: Event) => writable.write(formatter(event) + \"\\n\")\n}\n\n// ============ Pipeline ============\n\nexport interface Pipeline {\n dispatch: (event: Event) => void\n level: LogLevel\n dispose: () => void\n}\n\ninterface Output {\n levelPriority: number\n nsFilter: NsFilter | null\n write: (event: Event) => void\n dispose?: () => void\n}\n\n// ============ Discrimination ============\n\nconst VALID_CONFIG_KEYS = new Set([\"level\", \"ns\", \"format\"])\nconst SINK_KEYS = new Set([\"file\", \"otel\"])\n\nfunction isPojo(obj: unknown): obj is Record<string, unknown> {\n if (typeof obj !== \"object\" || obj === null) return false\n const proto = Object.getPrototypeOf(obj)\n return proto === Object.prototype || proto === null\n}\n\nfunction isWritable(obj: unknown): obj is { write: (s: string) => unknown } {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"write\" in obj &&\n typeof (obj as Record<string, unknown>).write === \"function\" &&\n !isPojo(obj)\n )\n}\n\nfunction isValidLogLevel(val: unknown): val is LogLevel {\n return typeof val === \"string\" && val in LOG_LEVEL_PRIORITY\n}\n\n// ============ Build Pipeline ============\n\ninterface ScopeConfig {\n level: LogLevel\n ns: NsFilter | null\n format: LogFormat\n}\n\nexport function buildPipeline(elements: unknown[], parentConfig?: Partial<ScopeConfig>): Pipeline {\n const config: ScopeConfig = {\n level: parentConfig?.level ?? readEnvLevel(),\n ns: parentConfig?.ns ?? readEnvNs(),\n format: parentConfig?.format ?? readEnvFormat(),\n }\n\n const stages: Stage[] = []\n const outputs: Output[] = []\n const branches: Pipeline[] = []\n const disposables: (() => void)[] = []\n\n for (const element of elements) {\n if (Array.isArray(element)) {\n const branch = buildPipeline(element, { ...config })\n branches.push(branch)\n disposables.push(() => branch.dispose())\n continue\n }\n\n if (typeof element === \"function\" && element !== (console as unknown)) {\n stages.push(element as Stage)\n continue\n }\n\n if (element === console) {\n outputs.push({\n levelPriority: LOG_LEVEL_PRIORITY[config.level],\n nsFilter: config.ns,\n write: createConsoleSink(config.format),\n })\n continue\n }\n\n if (isWritable(element)) {\n outputs.push({\n levelPriority: LOG_LEVEL_PRIORITY[config.level],\n nsFilter: config.ns,\n write: createWritableSink(element, config.format),\n })\n continue\n }\n\n if (isPojo(element)) {\n const obj = element\n const keys = Object.keys(obj)\n\n const hasSinkKey = keys.some((k) => SINK_KEYS.has(k))\n const hasUnknownKey = keys.some((k) => !VALID_CONFIG_KEYS.has(k) && !SINK_KEYS.has(k))\n\n if (hasUnknownKey) {\n const unknown = keys.find((k) => !VALID_CONFIG_KEYS.has(k) && !SINK_KEYS.has(k))\n throw new Error(\n `loggily: unknown config key \"${unknown}\" in config object. Valid keys: ${[...VALID_CONFIG_KEYS, ...SINK_KEYS].join(\", \")}`,\n )\n }\n\n if (hasSinkKey) {\n if (typeof obj.file === \"string\") {\n const outputLevel = isValidLogLevel(obj.level) ? obj.level : config.level\n const outputNs = obj.ns ? parseNsFilter(obj.ns as string | string[]) : config.ns\n const outputFormat = (obj.format as LogFormat) ?? config.format\n const sink = createFileSink(obj.file, outputFormat)\n disposables.push(sink.dispose)\n outputs.push({\n levelPriority: LOG_LEVEL_PRIORITY[outputLevel],\n nsFilter: outputNs,\n write: sink.write,\n dispose: sink.dispose,\n })\n }\n continue\n }\n\n if (isValidLogLevel(obj.level)) config.level = obj.level\n if (obj.ns !== undefined) config.ns = parseNsFilter(obj.ns as string | string[])\n if (obj.format === \"console\" || obj.format === \"json\") config.format = obj.format\n continue\n }\n\n throw new Error(\n `loggily: unsupported config element of type \"${typeof element}\". ` +\n \"Config arrays accept: objects (config), arrays (branches), functions (stages), console, or writables ({ write }).\",\n )\n }\n\n const dispatch = (event: Event): void => {\n let e: Event = event\n for (const stage of stages) {\n const result = stage(e)\n if (result === null) return\n if (result !== undefined) e = result\n }\n for (const output of outputs) {\n if (e.kind === \"log\" && LOG_LEVEL_PRIORITY[e.level] < output.levelPriority) continue\n if (output.nsFilter && !output.nsFilter(e.namespace)) continue\n output.write(e)\n }\n for (const branch of branches) {\n branch.dispatch(e)\n }\n }\n\n return {\n dispatch,\n level: config.level,\n dispose: () => {\n for (const d of disposables) d()\n },\n }\n}\n\n// ============ Shared Runtime State ============\n\nexport interface RuntimeState {\n suppressConsole: boolean\n writers: Array<(formatted: string, level: string) => void>\n}\n\nexport const runtimeState: RuntimeState = {\n suppressConsole: false,\n writers: [],\n}\n\nexport function defaultPipeline(): Pipeline {\n const rt = runtimeState\n\n const disposables: (() => void)[] = []\n\n let fileSink: ((event: Event) => void) | null = null\n const logFile = getEnv(\"LOG_FILE\")\n if (logFile) {\n const sink = createFileSink(logFile, \"json\")\n fileSink = sink.write\n disposables.push(sink.dispose)\n }\n\n const dispatch = (event: Event): void => {\n // Re-read level dynamically so legacy setters (setLogLevel etc.) work on existing loggers\n const currentLevel = readEnvLevel()\n if (event.kind === \"log\") {\n if (LOG_LEVEL_PRIORITY[event.level] < LOG_LEVEL_PRIORITY[currentLevel]) return\n } else if (event.kind === \"span\") {\n const trace = readEnvTrace()\n if (!trace.enabled) return\n if (trace.filter && !trace.filter(event.namespace)) return\n }\n const currentNs = readEnvNs()\n if (currentNs && !currentNs(event.namespace)) return\n\n const currentFormat = readEnvFormat()\n const useJson = currentFormat === \"json\" || getEnv(\"NODE_ENV\") === \"production\" || getEnv(\"TRACE_FORMAT\") === \"json\"\n const formatter = useJson ? formatJSONEvent : formatConsoleEvent\n\n if (rt.writers.length > 0) {\n const formatted = formatter(event)\n const lvl = event.kind === \"log\" ? event.level : \"span\"\n for (const w of rt.writers) w(formatted, lvl)\n }\n\n if (rt.suppressConsole) {\n fileSink?.(event)\n return\n }\n\n const text = formatter(event)\n if (event.kind === \"span\") {\n writeStderr(text)\n } else {\n switch (event.level) {\n case \"trace\":\n case \"debug\":\n console.debug(text)\n break\n case \"info\":\n console.info(text)\n break\n case \"warn\":\n console.warn(text)\n break\n case \"error\":\n console.error(text)\n break\n }\n }\n fileSink?.(event)\n }\n\n return {\n dispatch,\n get level() {\n return readEnvLevel()\n },\n dispose: () => {\n for (const d of disposables) d()\n },\n }\n}\n\n// ============ Env Var Readers ============\n\nfunction readEnvLevel(): LogLevel {\n const env = getEnv(\"LOG_LEVEL\")?.toLowerCase()\n let level: LogLevel =\n env === \"trace\" || env === \"debug\" || env === \"info\" || env === \"warn\" || env === \"error\" || env === \"silent\"\n ? env\n : \"info\"\n\n const debugEnv = getEnv(\"DEBUG\")\n if (debugEnv && LOG_LEVEL_PRIORITY[level] > LOG_LEVEL_PRIORITY.debug) {\n level = \"debug\"\n }\n\n return level\n}\n\nfunction readEnvNs(): NsFilter | null {\n const debugEnv = getEnv(\"DEBUG\")\n if (!debugEnv) return null\n\n const parts = debugEnv.split(\",\").map((s) => s.trim())\n return parseNsFilter(parts)\n}\n\nfunction readEnvFormat(): LogFormat {\n const envFormat = getEnv(\"LOG_FORMAT\")?.toLowerCase()\n if (envFormat === \"json\") return \"json\"\n if (envFormat === \"console\") return \"console\"\n if (getEnv(\"TRACE_FORMAT\") === \"json\") return \"json\"\n if (getEnv(\"NODE_ENV\") === \"production\") return \"json\"\n return \"console\"\n}\n\nfunction readEnvTrace(): { enabled: boolean; filter: NsFilter | null } {\n const traceEnv = getEnv(\"TRACE\")\n if (!traceEnv) return { enabled: false, filter: null }\n if (traceEnv === \"1\" || traceEnv === \"true\") return { enabled: true, filter: null }\n const prefixes = traceEnv.split(\",\").map((s) => s.trim())\n return {\n enabled: true,\n filter: (namespace: string) => {\n for (const prefix of prefixes) {\n if (matchesPattern(namespace, prefix)) return true\n }\n return false\n },\n }\n}\n","/**\n * Distributed tracing utilities for loggily.\n *\n * Provides W3C-compatible trace/span ID generation, traceparent header formatting,\n * and head-based sampling. All features are opt-in and don't break the existing API.\n */\n\nimport type { SpanData } from \"./core.js\"\n\n// ============ ID Format ============\n\n/** Supported ID formats */\nexport type IdFormat = \"simple\" | \"w3c\"\n\nlet currentIdFormat: IdFormat = \"simple\"\n\n/**\n * Set the ID format for new spans and traces.\n * - \"simple\": sp_1, sp_2, tr_1, tr_2 (default, lightweight)\n * - \"w3c\": 32-char hex trace ID, 16-char hex span ID (W3C Trace Context compatible)\n */\nexport function setIdFormat(format: IdFormat): void {\n currentIdFormat = format\n}\n\n/** Get the current ID format */\nexport function getIdFormat(): IdFormat {\n return currentIdFormat\n}\n\n// Simple format counters (used by core.ts via the generator functions)\nlet simpleSpanCounter = 0\nlet simpleTraceCounter = 0\n\n/** Generate a hex string of the given byte length using crypto.randomUUID */\nfunction randomHex(bytes: number): string {\n // crypto.randomUUID() gives us 32 hex chars (128 bits) after removing dashes\n // For 16 bytes (32 hex chars) we use one UUID, for 8 bytes (16 hex chars) we take a slice\n const uuid = crypto.randomUUID().replace(/-/g, \"\")\n return uuid.slice(0, bytes * 2)\n}\n\n/** Generate a span ID according to the current format */\nexport function generateSpanId(): string {\n if (currentIdFormat === \"w3c\") {\n return randomHex(8) // 16-char hex\n }\n return `sp_${(++simpleSpanCounter).toString(36)}`\n}\n\n/** Generate a trace ID according to the current format */\nexport function generateTraceId(): string {\n if (currentIdFormat === \"w3c\") {\n return randomHex(16) // 32-char hex\n }\n return `tr_${(++simpleTraceCounter).toString(36)}`\n}\n\n/** Reset ID counters (for testing) */\nexport function resetIdCounters(): void {\n simpleSpanCounter = 0\n simpleTraceCounter = 0\n}\n\n// ============ W3C Traceparent ============\n\n/** Options for traceparent header formatting */\nexport interface TraceparentOptions {\n /** Whether this span is sampled. Defaults to true for backwards compatibility. */\n sampled?: boolean\n}\n\n/**\n * Format a W3C traceparent header from span data.\n *\n * Format: `{version}-{trace-id}-{span-id}-{trace-flags}`\n * - version: \"00\" (current W3C spec version)\n * - trace-id: 32 hex chars (128 bits)\n * - span-id: 16 hex chars (64 bits)\n * - trace-flags: \"01\" (sampled) or \"00\" (not sampled)\n *\n * Works with both simple and W3C ID formats. Simple IDs are zero-padded to spec length.\n *\n * @param spanData - Span data with id and traceId\n * @param options - Optional settings (sampled flag). Defaults to sampled=true.\n * @returns W3C traceparent header string\n *\n * @example\n * ```typescript\n * const span = log.span(\"http-request\")\n * const header = traceparent(span.spanData)\n * // → \"00-a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6-1a2b3c4d5e6f7a8b-01\"\n * fetch(url, { headers: { traceparent: header } })\n * ```\n */\nexport function traceparent(spanData: SpanData, options?: TraceparentOptions): string {\n const traceId = padHex(spanData.traceId, 32)\n const spanId = padHex(spanData.id, 16)\n const flags = (options?.sampled ?? true) ? \"01\" : \"00\"\n return `00-${traceId}-${spanId}-${flags}`\n}\n\n/** Pad or hash an ID to the specified hex length */\nfunction padHex(id: string, length: number): string {\n // If it's already the right length and looks like hex, use as-is\n if (id.length === length && /^[0-9a-f]+$/.test(id)) {\n return id\n }\n\n // For simple IDs (sp_1, tr_1), create a deterministic hex representation\n // by encoding the string as hex bytes, zero-padded to the target length\n let hex = \"\"\n for (let i = 0; i < id.length; i++) {\n hex += id.charCodeAt(i).toString(16).padStart(2, \"0\")\n }\n // Pad or truncate to target length\n return hex.padStart(length, \"0\").slice(-length)\n}\n\n// ============ Sampling ============\n\nlet sampleRate = 1.0\n\n/**\n * Set the head-based sampling rate for new traces.\n * Applied at trace creation — all spans within a sampled trace are kept.\n *\n * @param rate - Sampling rate from 0.0 (sample nothing) to 1.0 (sample everything, default)\n */\nexport function setSampleRate(rate: number): void {\n if (rate < 0 || rate > 1) {\n throw new Error(`Sample rate must be between 0.0 and 1.0, got ${rate}`)\n }\n sampleRate = rate\n}\n\n/** Get the current sampling rate */\nexport function getSampleRate(): number {\n return sampleRate\n}\n\n/**\n * Determine whether a new trace should be sampled.\n * Called at trace creation time (head-based sampling).\n */\nexport function shouldSample(): boolean {\n if (sampleRate >= 1.0) return true\n if (sampleRate <= 0.0) return false\n return Math.random() < sampleRate\n}\n","/**\n * loggily v2 — Structured logging with spans\n *\n * One import. Objects configure. Arrays branch. Values write.\n *\n * @example\n * const log = createLogger('myapp')\n * log.info?.('starting')\n *\n * @example\n * const log = createLogger('myapp', [\n * { level: 'debug', ns: '-sql' },\n * console,\n * { file: '/tmp/app.log', level: 'info', format: 'json' },\n * ])\n * log.info?.('server started', { port: 3000 })\n */\n\nimport {\n type Event,\n type LogEvent,\n type SpanEvent,\n type Pipeline,\n type Stage,\n type LogLevel,\n type OutputLogLevel,\n type LogFormat,\n LOG_LEVEL_PRIORITY,\n buildPipeline,\n defaultPipeline,\n runtimeState,\n safeStringify,\n} from \"./pipeline.js\"\n\nexport type { Event, LogEvent, SpanEvent, Stage, LogLevel, OutputLogLevel, LogFormat }\nexport { LOG_LEVEL_PRIORITY, safeStringify }\n\n// ============ Metrics ============\n\nexport interface SpanRecord {\n readonly name: string\n readonly durationMs: number\n}\n\nexport interface SpanRecorder {\n recordSpan(data: SpanRecord): void\n}\n\n/** @internal */\nexport let _ambientRecorder: SpanRecorder | null = null\nexport function _setAmbientRecorder(recorder: SpanRecorder | null): void {\n _ambientRecorder = recorder\n}\n\n// ============ Types ============\n\nexport type LazyMessage = string | (() => string)\nexport type LazyProps = Record<string, unknown> | (() => Record<string, unknown>)\n\nexport interface SpanData {\n readonly id: string\n readonly traceId: string\n readonly parentId: string | null\n readonly startTime: number\n readonly endTime: number | null\n readonly duration: number | null\n [key: string]: unknown\n}\n\nexport interface Logger {\n readonly name: string\n readonly props: Readonly<Record<string, unknown>>\n readonly spanData: SpanData | null\n\n trace(message: LazyMessage, data?: Record<string, unknown>): void\n debug(message: LazyMessage, data?: Record<string, unknown>): void\n info(message: LazyMessage, data?: Record<string, unknown>): void\n warn(message: LazyMessage, data?: Record<string, unknown>): void\n error(message: LazyMessage, data?: Record<string, unknown>): void\n error(error: Error, data?: Record<string, unknown>): void\n error(error: Error, message: string, data?: Record<string, unknown>): void\n\n logger(namespace?: string, props?: Record<string, unknown>): ConditionalLogger\n span(namespace?: string, props?: LazyProps): SpanLogger\n child(context: Record<string, unknown>): ConditionalLogger\n /** @deprecated Use .logger() instead for namespace-based children */\n child(context: string): ConditionalLogger\n end(): void\n}\n\nexport interface SpanLogger extends Logger, Disposable {\n readonly spanData: SpanData & { [key: string]: unknown }\n}\n\n// ============ ConditionalLogger ============\n\nexport interface ConditionalLogger {\n readonly name: string\n readonly props: Readonly<Record<string, unknown>>\n readonly spanData: SpanData | null\n\n trace?: (message: LazyMessage, data?: Record<string, unknown>) => void\n debug?: (message: LazyMessage, data?: Record<string, unknown>) => void\n info?: (message: LazyMessage, data?: Record<string, unknown>) => void\n warn?: (message: LazyMessage, data?: Record<string, unknown>) => void\n error?: {\n (message: LazyMessage, data?: Record<string, unknown>): void\n (error: Error, data?: Record<string, unknown>): void\n (error: Error, message: string, data?: Record<string, unknown>): void\n }\n\n logger(namespace?: string, props?: Record<string, unknown>): ConditionalLogger\n span(namespace?: string, props?: LazyProps): SpanLogger\n child(context: Record<string, unknown>): ConditionalLogger\n child(context: string): ConditionalLogger\n end(): void\n}\n\n// ============ ID Generation ============\n\nimport { generateSpanId, generateTraceId, resetIdCounters, shouldSample } from \"./tracing.js\"\n\nexport function resetIds(): void {\n resetIdCounters()\n}\n\n// ============ Context Propagation Hooks ============\n\nlet _getContextTags: (() => Record<string, string>) | null = null\nlet _getContextParent: (() => { spanId: string; traceId: string } | null) | null = null\nlet _enterContext: ((spanId: string, traceId: string, parentId: string | null) => void) | null = null\nlet _exitContext: ((spanId: string) => void) | null = null\n\n/** @internal */\nexport function _setContextHooks(hooks: {\n getContextTags: () => Record<string, string>\n getContextParent: () => { spanId: string; traceId: string } | null\n enterContext: (spanId: string, traceId: string, parentId: string | null) => void\n exitContext: (spanId: string) => void\n}): void {\n _getContextTags = hooks.getContextTags\n _getContextParent = hooks.getContextParent\n _enterContext = hooks.enterContext\n _exitContext = hooks.exitContext\n}\n\n/** @internal */\nexport function _clearContextHooks(): void {\n _getContextTags = null\n _getContextParent = null\n _enterContext = null\n _exitContext = null\n}\n\n// ============ SpanData Proxy ============\n\ninterface SpanDataFields {\n id: string\n traceId: string\n parentId: string | null\n startTime: number\n endTime: number | null\n duration: number | null\n}\n\nexport function createSpanDataProxy(getFields: () => SpanDataFields, attrs: Record<string, unknown>): SpanData {\n const READONLY_KEYS = new Set([\"id\", \"traceId\", \"parentId\", \"startTime\", \"endTime\", \"duration\"])\n return new Proxy(attrs, {\n get(_target, prop) {\n if (READONLY_KEYS.has(prop as string)) {\n return getFields()[prop as keyof SpanDataFields]\n }\n return attrs[prop as string]\n },\n set(_target, prop, value) {\n if (READONLY_KEYS.has(prop as string)) {\n return false\n }\n attrs[prop as string] = value\n return true\n },\n }) as SpanData\n}\n\n// ============ Span Collection ============\n\nconst collectedSpans: SpanData[] = []\nlet collectSpans = false\n\nexport function startCollecting(): void {\n collectSpans = true\n collectedSpans.length = 0\n}\n\nexport function stopCollecting(): SpanData[] {\n collectSpans = false\n return [...collectedSpans]\n}\n\nexport function getCollectedSpans(): SpanData[] {\n return [...collectedSpans]\n}\n\nexport function clearCollectedSpans(): void {\n collectedSpans.length = 0\n}\n\n// ============ Implementation ============\n\nfunction resolveMessage(msg: LazyMessage): string {\n return typeof msg === \"function\" ? msg() : msg\n}\n\ninterface MutableSpanData {\n id: string\n traceId: string\n parentId: string | null\n startTime: number\n endTime: number | null\n duration: number | null\n attrs: Record<string, unknown>\n}\n\nfunction createLoggerImpl(\n name: string,\n props: Record<string, unknown>,\n pipeline: Pipeline,\n spanMeta: MutableSpanData | null,\n parentSpanId: string | null,\n traceId: string | null,\n traceSampled: boolean = true,\n): Logger {\n const emitLog = (\n level: OutputLogLevel,\n msgOrError: LazyMessage | Error,\n dataOrMsg?: Record<string, unknown> | string,\n extraData?: Record<string, unknown>,\n ): void => {\n let message: string\n let data: Record<string, unknown> | undefined\n\n if (msgOrError instanceof Error) {\n const err = msgOrError\n if (typeof dataOrMsg === \"string\") {\n message = dataOrMsg\n data = {\n ...props,\n ...extraData,\n error_type: err.name,\n error_message: err.message,\n error_stack: err.stack,\n error_code: (err as { code?: string }).code,\n }\n } else {\n message = err.message\n data = {\n ...props,\n ...(dataOrMsg as Record<string, unknown>),\n error_type: err.name,\n error_stack: err.stack,\n error_code: (err as { code?: string }).code,\n }\n }\n } else {\n message = resolveMessage(msgOrError)\n const contextTags = _getContextTags?.()\n data =\n contextTags && Object.keys(contextTags).length > 0\n ? { ...contextTags, ...props, ...(dataOrMsg as Record<string, unknown>) }\n : Object.keys(props).length > 0 || dataOrMsg\n ? { ...props, ...(dataOrMsg as Record<string, unknown>) }\n : undefined\n }\n\n const event: LogEvent = {\n kind: \"log\",\n time: Date.now(),\n namespace: name,\n level,\n message,\n props: data,\n }\n pipeline.dispatch(event)\n }\n\n const logger: Logger = {\n name,\n props: Object.freeze({ ...props }),\n\n get spanData(): SpanData | null {\n if (!spanMeta) return null\n return createSpanDataProxy(\n () => ({\n id: spanMeta.id,\n traceId: spanMeta.traceId,\n parentId: spanMeta.parentId,\n startTime: spanMeta.startTime,\n endTime: spanMeta.endTime,\n duration: spanMeta.endTime !== null ? spanMeta.endTime - spanMeta.startTime : Date.now() - spanMeta.startTime,\n }),\n spanMeta.attrs,\n )\n },\n\n trace: (msg, data) => emitLog(\"trace\", msg, data),\n debug: (msg, data) => emitLog(\"debug\", msg, data),\n info: (msg, data) => emitLog(\"info\", msg, data),\n warn: (msg, data) => emitLog(\"warn\", msg, data),\n error: (\n msgOrError: LazyMessage | Error,\n dataOrMsg?: Record<string, unknown> | string,\n extraData?: Record<string, unknown>,\n ) => emitLog(\"error\", msgOrError, dataOrMsg, extraData),\n\n logger(namespace?: string, childProps?: Record<string, unknown>): ConditionalLogger {\n const childName = namespace ? `${name}:${namespace}` : name\n const mergedProps = { ...props, ...childProps }\n return wrapConditional(\n createLoggerImpl(childName, mergedProps, pipeline, null, parentSpanId, traceId, traceSampled),\n () => pipeline.level,\n )\n },\n\n span(namespace?: string, childProps?: LazyProps): SpanLogger {\n const childName = namespace ? `${name}:${namespace}` : name\n const resolvedChildProps = typeof childProps === \"function\" ? childProps() : childProps\n const mergedProps = { ...props, ...resolvedChildProps }\n const newSpanId = generateSpanId()\n\n let resolvedParentId = parentSpanId\n let resolvedTraceId = traceId\n\n if (!resolvedParentId && _getContextParent) {\n const ctxParent = _getContextParent()\n if (ctxParent) {\n resolvedParentId = ctxParent.spanId\n resolvedTraceId = resolvedTraceId || ctxParent.traceId\n }\n }\n\n const isNewTrace = !resolvedTraceId\n const finalTraceId = resolvedTraceId || generateTraceId()\n const sampled = isNewTrace ? shouldSample() : traceSampled\n\n const newSpanData: MutableSpanData = {\n id: newSpanId,\n traceId: finalTraceId,\n parentId: resolvedParentId,\n startTime: Date.now(),\n endTime: null,\n duration: null,\n attrs: {},\n }\n\n const spanLogger = createLoggerImpl(\n childName,\n mergedProps,\n pipeline,\n newSpanData,\n newSpanId,\n finalTraceId,\n sampled,\n ) as SpanLogger\n\n _enterContext?.(newSpanId, finalTraceId, resolvedParentId)\n\n ;(spanLogger as unknown as { [Symbol.dispose]: () => void })[Symbol.dispose] = () => {\n if (newSpanData.endTime !== null) return\n\n newSpanData.endTime = Date.now()\n newSpanData.duration = newSpanData.endTime - newSpanData.startTime\n\n if (collectSpans) {\n collectedSpans.push(\n createSpanDataProxy(\n () => ({\n id: newSpanData.id,\n traceId: newSpanData.traceId,\n parentId: newSpanData.parentId,\n startTime: newSpanData.startTime,\n endTime: newSpanData.endTime,\n duration: newSpanData.duration,\n }),\n { ...newSpanData.attrs },\n ),\n )\n }\n\n _exitContext?.(newSpanId)\n _ambientRecorder?.recordSpan({ name: childName, durationMs: newSpanData.duration })\n\n if (sampled) {\n const spanEvent: SpanEvent = {\n kind: \"span\",\n time: newSpanData.endTime,\n namespace: childName,\n name: childName,\n duration: newSpanData.duration,\n props: {\n ...mergedProps,\n ...newSpanData.attrs,\n },\n spanId: newSpanData.id,\n traceId: newSpanData.traceId,\n parentId: newSpanData.parentId,\n }\n pipeline.dispatch(spanEvent)\n }\n }\n\n return spanLogger\n },\n\n child(context: string | Record<string, unknown>): ConditionalLogger {\n if (typeof context === \"string\") {\n return this.logger(context)\n }\n return wrapConditional(\n createLoggerImpl(name, { ...props, ...context }, pipeline, null, parentSpanId, traceId, traceSampled),\n () => pipeline.level,\n )\n },\n\n end(): void {\n if (spanMeta?.endTime === null) {\n ;(this as unknown as { [Symbol.dispose]: () => void })[Symbol.dispose]?.()\n }\n },\n }\n\n return logger\n}\n\n// ============ ConditionalLogger Proxy ============\n\nfunction wrapConditional(logger: Logger, getLevel: () => LogLevel): ConditionalLogger {\n return new Proxy(logger as ConditionalLogger, {\n get(target, prop: string) {\n if (prop in LOG_LEVEL_PRIORITY && prop !== \"silent\") {\n if (LOG_LEVEL_PRIORITY[prop as keyof typeof LOG_LEVEL_PRIORITY] < LOG_LEVEL_PRIORITY[getLevel()]) {\n return undefined\n }\n }\n return (target as unknown as Record<string, unknown>)[prop]\n },\n })\n}\n\n// ============ Public API ============\n\n/**\n * Create a logger.\n *\n * @param name - Logger namespace (e.g., 'myapp', 'myapp:db')\n * @param config - Optional config array. Objects configure, arrays branch, values write.\n *\n * @example\n * // Zero config (reads LOG_LEVEL, DEBUG, LOG_FORMAT from env)\n * const log = createLogger('myapp')\n *\n * @example\n * // Configured pipeline\n * const log = createLogger('myapp', [\n * { level: 'debug', ns: '-sql' },\n * console,\n * { file: '/tmp/app.log', level: 'info', format: 'json' },\n * ])\n */\nexport function createLogger(name: string, config?: unknown[]): ConditionalLogger {\n const pipeline = config ? buildPipeline(config) : defaultPipeline()\n const logger = createLoggerImpl(name, {}, pipeline, null, null, null)\n return wrapConditional(logger, () => pipeline.level)\n}\n\n// ============ Compose (Logger Plugin Composition) ============\n\nexport type LoggerFactory = (name: string, config?: unknown[]) => ConditionalLogger\nexport type LoggerPlugin = (factory: LoggerFactory) => LoggerFactory\n\n/**\n * Compose a custom createLogger with plugins.\n *\n * @example\n * import { createLogger as base, compose } from \"loggily\"\n * import withSentry from \"@sentry/loggily\"\n *\n * const createLogger = compose(base, withSentry({ dsn: \"...\" }))\n * const log = createLogger(\"myapp\")\n */\nexport function compose(base: LoggerFactory, ...plugins: LoggerPlugin[]): LoggerFactory {\n return plugins.reduce((factory, plugin) => plugin(factory), base)\n}\n\n// ============ Legacy API ============\n// Level/format/ns/trace map to env vars (read fresh by defaultPipeline).\n// Writers/suppress are runtime state (can't be env vars).\n\n// _process cached for browser safety (same pattern as pipeline.ts)\nconst _process = typeof process !== \"undefined\" ? process : undefined\nconst _env = _process?.env ?? ({} as Record<string, string | undefined>)\n\n/** @deprecated Use createLogger config array: createLogger(\"x\", [{ level }, console]) */\nexport function setLogLevel(level: LogLevel): void {\n _env.LOG_LEVEL = level\n}\n\n/** @deprecated Level is per-logger in v2 */\nexport function getLogLevel(): LogLevel {\n return (_env.LOG_LEVEL as LogLevel) ?? \"info\"\n}\n\n/** @deprecated Use TRACE=1 env var */\nexport function enableSpans(): void {\n _env.TRACE = \"1\"\n}\n\n/** @deprecated */\nexport function disableSpans(): void {\n delete _env.TRACE\n}\n\n/** @deprecated */\nexport function spansAreEnabled(): boolean {\n return !!_env.TRACE\n}\n\n/** @deprecated Use TRACE=namespace env var */\nexport function setTraceFilter(namespaces: string[] | null): void {\n if (!namespaces || namespaces.length === 0) {\n delete _env.TRACE\n } else {\n _env.TRACE = namespaces.join(\",\")\n }\n}\n\n/** @deprecated */\nexport function getTraceFilter(): string[] | null {\n return _env.TRACE ? _env.TRACE.split(\",\") : null\n}\n\n/** @deprecated Use DEBUG=namespace env var or { ns } in config array */\nexport function setDebugFilter(namespaces: string[] | null): void {\n if (!namespaces || namespaces.length === 0) {\n delete _env.DEBUG\n } else {\n _env.DEBUG = namespaces.join(\",\")\n }\n}\n\n/** @deprecated */\nexport function getDebugFilter(): string[] | null {\n return _env.DEBUG ? _env.DEBUG.split(\",\") : null\n}\n\n/** @deprecated Use { format } in config array */\nexport function setLogFormat(format: LogFormat): void {\n _env.LOG_FORMAT = format\n}\n\n/** @deprecated */\nexport function getLogFormat(): LogFormat {\n return (_env.LOG_FORMAT as LogFormat) ?? \"console\"\n}\n\n/** @deprecated Omit console from config array instead */\nexport function setSuppressConsole(value: boolean): void {\n runtimeState.suppressConsole = value\n}\n\nexport type OutputMode = \"console\" | \"stderr\" | \"writers-only\"\n\n/** @deprecated Use config array */\nexport function setOutputMode(_mode: OutputMode): void {}\n\n/** @deprecated */\nexport function getOutputMode(): OutputMode {\n return \"console\"\n}\n\n/** @deprecated Pass writers in config array instead */\nexport function addWriter(writer: (formatted: string, level: string) => void): () => void {\n runtimeState.writers.push(writer)\n return () => {\n const idx = runtimeState.writers.indexOf(writer)\n if (idx !== -1) runtimeState.writers.splice(idx, 1)\n }\n}\n\n/** @deprecated Spans dispatch through the pipeline automatically */\nexport function writeSpan(namespace: string, duration: number, attrs: Record<string, unknown>): void {\n const event: SpanEvent = {\n kind: \"span\",\n time: Date.now(),\n namespace,\n name: namespace,\n duration,\n props: attrs,\n spanId: (attrs.span_id as string) ?? \"\",\n traceId: (attrs.trace_id as string) ?? \"\",\n parentId: (attrs.parent_id as string | null) ?? null,\n }\n defaultPipeline().dispatch(event)\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-Co4jC3mx.d.mts","names":[],"sources":["../src/file-writer.ts","../src/tracing.ts"],"mappings":";;;;;;AAUA;;;;UAAiB,iBAAA;EAQA;EANf,UAAA;;EAEA,aAAA;AAAA;;UAIe,UAAA;EAMf;EAJA,KAAA,CAAM,IAAA;EAID;EAFL,KAAA;EAwB8B;EAtB9B,KAAA;AAAA;;;;;;;;;;ACZF;;;;;AASA;;;;;iBDyBgB,gBAAA,CAAiB,QAAA,UAAkB,OAAA,GAAS,iBAAA,GAAyB,UAAA;;;;KClCzE,QAAA;;;;;;iBASI,WAAA,CAAY,MAAA,EAAQ,QAAA;;iBAKpB,WAAA,CAAA,GAAe,QAAA;;UAyCd,kBAAA;EDrBoE;ECuBnF,OAAA;AAAA;;;;AAzDF;;;;;AASA;;;;;AAKA;;;;;AAyCA;;;;;iBA4BgB,WAAA,CAAY,QAAA,EAAU,QAAA,EAAU,OAAA,GAAU,kBAAA;;;;;;;iBAkC1C,aAAA,CAAc,IAAA;;iBAQd,aAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.d.mts","names":[],"sources":["../src/metrics.ts"],"mappings":";;;UAkCiB,SAAA;EACf,KAAA;EACA,GAAA;EACA,GAAA;EACA,IAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,KAAA;AAAA;AAAA,UA0Be,gBAAA,SAAyB,YAAA;EAIjC;EAFP,KAAA,CAAM,IAAA,WAAe,SAAA;EAIrB;EAFA,GAAA,IAAO,GAAA,SAAY,SAAA;EAId;EAFL,OAAA;EAKc;EAHd,KAAA;AAAA;AAAA,iBAGc,sBAAA,CAAuB,UAAA,YAAoB,gBAAA;;iBAuD3C,SAAA,CAAA,GAAa,GAAA,SAAY,SAAA;;iBAKzB,WAAA,CAAA;;iBAKA,cAAA,CAAA;AALhB;;;;;AAKA;;;;;AAoBA;;;;AAzBA,iBAyBgB,WAAA,CAAY,SAAA,GAAY,YAAA,IAAgB,MAAA,EAAQ,iBAAA,KAAsB,iBAAA"}