loggily 0.6.2 → 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.
@@ -0,0 +1,297 @@
1
+ import { a as baseCreateLogger, j as withSpans, s as createLogger, v as pipe } from "./core-B3pox577.mjs";
2
+ //#region src/worker.ts
3
+ /**
4
+ * Worker Thread Logger/Console Forwarding
5
+ *
6
+ * Pipeline-based worker logging: worker loggers use a postMessage transport
7
+ * so events flow through the main thread's pipeline for output.
8
+ *
9
+ * ## Structured Logger (Recommended)
10
+ *
11
+ * @example Worker side:
12
+ * ```typescript
13
+ * import { createWorkerLogger } from "loggily/worker"
14
+ * const log = createWorkerLogger(postMessage, "km:worker:parse")
15
+ *
16
+ * log.info?.("processing", { file: "test.md" })
17
+ * {
18
+ * using span = log.span?.("parse")
19
+ * // ... work ...
20
+ * span.spanData.lines = 100
21
+ * }
22
+ * ```
23
+ *
24
+ * @example Main thread side:
25
+ * ```typescript
26
+ * import { createWorkerLogHandler } from "loggily/worker"
27
+ *
28
+ * const handleLog = createWorkerLogHandler()
29
+ * worker.onmessage = (e) => handleLog(e.data)
30
+ * ```
31
+ *
32
+ * ## Console Forwarding (Simple)
33
+ *
34
+ * @example Worker side:
35
+ * ```typescript
36
+ * import { forwardConsole } from "loggily/worker"
37
+ * forwardConsole(postMessage)
38
+ *
39
+ * console.log("message") // Forwarded to main thread
40
+ * ```
41
+ */
42
+ /** Type guard for LogEvent (structured log from worker) */
43
+ function isWorkerLogEvent(msg) {
44
+ return typeof msg === "object" && msg?.kind === "log";
45
+ }
46
+ /** Type guard for SpanEvent (span from worker) */
47
+ function isWorkerSpanEvent(msg) {
48
+ return typeof msg === "object" && msg?.kind === "span";
49
+ }
50
+ /** Type guard for any pipeline Event (log or span) */
51
+ function isWorkerEvent(msg) {
52
+ return isWorkerLogEvent(msg) || isWorkerSpanEvent(msg);
53
+ }
54
+ /** Type guard for WorkerConsoleMessage */
55
+ function isWorkerConsoleMessage(msg) {
56
+ return typeof msg === "object" && msg?.type === "console" && typeof msg.level === "string" && Array.isArray(msg.args);
57
+ }
58
+ /** Type guard for any worker message (console or pipeline event) */
59
+ function isWorkerMessage(msg) {
60
+ return isWorkerConsoleMessage(msg) || isWorkerEvent(msg);
61
+ }
62
+ /** Store original console methods for restoration */
63
+ let originalConsole = null;
64
+ /**
65
+ * Forward console.* calls from worker to main thread via postMessage.
66
+ *
67
+ * Monkey-patches console methods. postMessage uses structuredClone,
68
+ * which handles most values natively. If cloning fails (functions,
69
+ * symbols), falls back to original console.
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * import { forwardConsole } from "loggily/worker"
74
+ * forwardConsole(postMessage, "km:worker:parse")
75
+ * console.log("processing", { file: "test.md" })
76
+ * ```
77
+ */
78
+ function forwardConsole(postMessage, namespace) {
79
+ if (!originalConsole) originalConsole = { ...console };
80
+ for (const level of [
81
+ "log",
82
+ "debug",
83
+ "info",
84
+ "warn",
85
+ "error",
86
+ "trace"
87
+ ]) console[level] = (...args) => {
88
+ try {
89
+ postMessage({
90
+ type: "console",
91
+ level,
92
+ namespace,
93
+ args: args.map((a) => typeof a === "function" ? `[Function: ${a.name || "anonymous"}]` : typeof a === "symbol" ? a.toString() : a instanceof Error ? {
94
+ name: a.name,
95
+ message: a.message,
96
+ stack: a.stack
97
+ } : a),
98
+ timestamp: Date.now()
99
+ });
100
+ } catch {
101
+ originalConsole?.[level](...args);
102
+ }
103
+ };
104
+ }
105
+ /**
106
+ * Restore original console methods.
107
+ * Call this if you need to disable console forwarding.
108
+ */
109
+ function restoreConsole() {
110
+ if (originalConsole) {
111
+ Object.assign(console, originalConsole);
112
+ originalConsole = null;
113
+ }
114
+ }
115
+ /**
116
+ * Create a pipeline stage that forwards events via postMessage.
117
+ *
118
+ * Events are plain JSON objects that survive structuredClone natively.
119
+ * The stage consumes events (returns null) so nothing is output locally.
120
+ * The main thread uses handleWorkerEvents() or createWorkerLogHandler()
121
+ * to dispatch them through a local logger pipeline.
122
+ */
123
+ function workerTransportStage(postMessage) {
124
+ return (event) => {
125
+ try {
126
+ postMessage(event);
127
+ } catch {
128
+ try {
129
+ postMessage(JSON.parse(JSON.stringify(event)));
130
+ } catch {}
131
+ }
132
+ return null;
133
+ };
134
+ }
135
+ /**
136
+ * Create a logger for use in a worker thread.
137
+ *
138
+ * All log and span events are forwarded to the main thread via postMessage.
139
+ * The main thread should use createWorkerLogHandler() to process these messages.
140
+ *
141
+ * @param postMessage - The worker's postMessage function
142
+ * @param namespace - Logger namespace (e.g., "km:worker:parse")
143
+ * @param props - Optional initial props
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * import { createWorkerLogger } from "loggily/worker"
148
+ *
149
+ * const log = createWorkerLogger(postMessage, "km:worker:parse")
150
+ *
151
+ * log.info?.("starting parse", { file: "test.md" })
152
+ *
153
+ * {
154
+ * using span = log.span?.("process")
155
+ * span.info?.("processing...")
156
+ * span.spanData.count = 100
157
+ * }
158
+ * // Span end event automatically sent to main thread
159
+ * ```
160
+ */
161
+ function createWorkerLogger(postMessage, namespace, props) {
162
+ const config = [{ level: "trace" }, workerTransportStage(postMessage)];
163
+ const logger = pipe(baseCreateLogger, withSpans())(namespace, config);
164
+ return props ? logger.child(props) : logger;
165
+ }
166
+ /**
167
+ * Create a handler that dispatches worker events to a target logger.
168
+ *
169
+ * Use this when you have a specific logger to dispatch through.
170
+ *
171
+ * @param target - Logger or object with dispatch method
172
+ * @returns Handler function to call with worker messages
173
+ */
174
+ function handleWorkerEvents(target) {
175
+ return (msg) => {
176
+ if (typeof msg !== "object" || msg === null) return;
177
+ const event = msg;
178
+ if (event.kind === "log" || event.kind === "span") target.dispatch(msg);
179
+ };
180
+ }
181
+ /**
182
+ * Create a zero-config handler for worker logger messages.
183
+ *
184
+ * Automatically creates loggers per-namespace. For console messages,
185
+ * formats args and dispatches through a logger.
186
+ *
187
+ * @returns Handler function to call with any worker message
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * import { createWorkerLogHandler } from "loggily/worker"
192
+ *
193
+ * const handleLog = createWorkerLogHandler()
194
+ * worker.onmessage = (e) => handleLog(e.data)
195
+ * ```
196
+ */
197
+ function createWorkerLogHandler() {
198
+ const loggers = /* @__PURE__ */ new Map();
199
+ function getLogger(namespace) {
200
+ let logger = loggers.get(namespace);
201
+ if (!logger) {
202
+ logger = createLogger(namespace);
203
+ loggers.set(namespace, logger);
204
+ }
205
+ return logger;
206
+ }
207
+ return (message) => {
208
+ if (isWorkerEvent(message)) getLogger(message.namespace).dispatch(message);
209
+ else if (isWorkerConsoleMessage(message)) {
210
+ const logger = getLogger(message.namespace || "worker");
211
+ const { message: msg, data } = formatConsoleArgs(message.args);
212
+ dispatchToLogger(logger, message.level, msg, data);
213
+ }
214
+ };
215
+ }
216
+ /** Safely stringify a value, handling circular refs and BigInt */
217
+ function safeStringify(value) {
218
+ try {
219
+ return JSON.stringify(value);
220
+ } catch {
221
+ return String(value);
222
+ }
223
+ }
224
+ /** Format console args into a message string and optional data object */
225
+ function formatConsoleArgs(args) {
226
+ const message = args.length === 0 ? "" : args.length === 1 && typeof args[0] === "string" ? args[0] : args.map((a) => typeof a === "string" ? a : safeStringify(a)).join(" ");
227
+ const lastArg = args[args.length - 1];
228
+ return {
229
+ message,
230
+ data: args.length > 1 && typeof lastArg === "object" && lastArg !== null && !Array.isArray(lastArg) ? lastArg : void 0
231
+ };
232
+ }
233
+ /** Dispatch a message to a logger at the given console level */
234
+ function dispatchToLogger(logger, level, message, data) {
235
+ switch (level) {
236
+ case "trace":
237
+ logger.trace?.(message, data);
238
+ break;
239
+ case "debug":
240
+ logger.debug?.(message, data);
241
+ break;
242
+ case "info":
243
+ case "log":
244
+ logger.info?.(message, data);
245
+ break;
246
+ case "warn":
247
+ logger.warn?.(message, data);
248
+ break;
249
+ case "error":
250
+ logger.error?.(message, data);
251
+ break;
252
+ }
253
+ }
254
+ /**
255
+ * Create a handler for worker console messages.
256
+ *
257
+ * Use this on the main thread to receive and output messages from workers.
258
+ *
259
+ * @param options - Handler options
260
+ * @returns Handler function to call with worker messages
261
+ *
262
+ * @example
263
+ * ```typescript
264
+ * import { createWorkerConsoleHandler } from "loggily/worker"
265
+ *
266
+ * const handleConsole = createWorkerConsoleHandler({
267
+ * defaultNamespace: "km:worker:parse"
268
+ * })
269
+ *
270
+ * worker.onmessage = (e) => {
271
+ * if (e.data.type === "console") {
272
+ * handleConsole(e.data)
273
+ * }
274
+ * }
275
+ * ```
276
+ */
277
+ function createWorkerConsoleHandler(options = {}) {
278
+ const loggers = /* @__PURE__ */ new Map();
279
+ function getLogger(namespace) {
280
+ const ns = namespace || options.defaultNamespace || "worker";
281
+ let logger = loggers.get(ns);
282
+ if (!logger) {
283
+ logger = options.logger ? options.logger : createLogger(ns);
284
+ loggers.set(ns, logger);
285
+ }
286
+ return logger;
287
+ }
288
+ return (message) => {
289
+ const logger = getLogger(message.namespace);
290
+ const { message: msg, data } = formatConsoleArgs(message.args);
291
+ dispatchToLogger(logger, message.level, msg, data);
292
+ };
293
+ }
294
+ //#endregion
295
+ export { createWorkerConsoleHandler, createWorkerLogHandler, createWorkerLogger, forwardConsole, handleWorkerEvents, isWorkerConsoleMessage, isWorkerEvent, isWorkerLogEvent, isWorkerMessage, isWorkerSpanEvent, restoreConsole, workerTransportStage };
296
+
297
+ //# sourceMappingURL=worker.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.mjs","names":[],"sources":["../src/worker.ts"],"sourcesContent":["/**\n * Worker Thread Logger/Console Forwarding\n *\n * Pipeline-based worker logging: worker loggers use a postMessage transport\n * so events flow through the main thread's pipeline for output.\n *\n * ## Structured Logger (Recommended)\n *\n * @example Worker side:\n * ```typescript\n * import { createWorkerLogger } from \"loggily/worker\"\n * const log = createWorkerLogger(postMessage, \"km:worker:parse\")\n *\n * log.info?.(\"processing\", { file: \"test.md\" })\n * {\n * using span = log.span?.(\"parse\")\n * // ... work ...\n * span.spanData.lines = 100\n * }\n * ```\n *\n * @example Main thread side:\n * ```typescript\n * import { createWorkerLogHandler } from \"loggily/worker\"\n *\n * const handleLog = createWorkerLogHandler()\n * worker.onmessage = (e) => handleLog(e.data)\n * ```\n *\n * ## Console Forwarding (Simple)\n *\n * @example Worker side:\n * ```typescript\n * import { forwardConsole } from \"loggily/worker\"\n * forwardConsole(postMessage)\n *\n * console.log(\"message\") // Forwarded to main thread\n * ```\n */\n\nimport { createLogger, baseCreateLogger, pipe, withSpans, type ConditionalLogger } from \"./core.js\"\nimport type { Event, LogEvent, SpanEvent, Stage, ConfigElement } from \"./pipeline.js\"\n\n// ============ Console Message Type ============\n\n/** Message sent from worker to main thread for console output */\nexport interface WorkerConsoleMessage {\n type: \"console\"\n level: \"log\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"trace\"\n namespace?: string\n args: unknown[]\n timestamp: number\n}\n\n// ============ Type Guards ============\n\n/** Type guard for LogEvent (structured log from worker) */\nexport function isWorkerLogEvent(msg: unknown): msg is LogEvent {\n return typeof msg === \"object\" && (msg as LogEvent)?.kind === \"log\"\n}\n\n/** Type guard for SpanEvent (span from worker) */\nexport function isWorkerSpanEvent(msg: unknown): msg is SpanEvent {\n return typeof msg === \"object\" && (msg as SpanEvent)?.kind === \"span\"\n}\n\n/** Type guard for any pipeline Event (log or span) */\nexport function isWorkerEvent(msg: unknown): msg is Event {\n return isWorkerLogEvent(msg) || isWorkerSpanEvent(msg)\n}\n\n/** Type guard for WorkerConsoleMessage */\nexport function isWorkerConsoleMessage(msg: unknown): msg is WorkerConsoleMessage {\n return (\n typeof msg === \"object\" &&\n (msg as WorkerConsoleMessage)?.type === \"console\" &&\n typeof (msg as WorkerConsoleMessage).level === \"string\" &&\n Array.isArray((msg as WorkerConsoleMessage).args)\n )\n}\n\n/** Type guard for any worker message (console or pipeline event) */\nexport function isWorkerMessage(msg: unknown): msg is WorkerConsoleMessage | Event {\n return isWorkerConsoleMessage(msg) || isWorkerEvent(msg)\n}\n\n// ============ Worker Side: Console Forwarding ============\n\ntype PostMessageFn = (message: WorkerConsoleMessage) => void\n\n/** Store original console methods for restoration */\nlet originalConsole: typeof console | null = null\n\n/**\n * Forward console.* calls from worker to main thread via postMessage.\n *\n * Monkey-patches console methods. postMessage uses structuredClone,\n * which handles most values natively. If cloning fails (functions,\n * symbols), falls back to original console.\n *\n * @example\n * ```typescript\n * import { forwardConsole } from \"loggily/worker\"\n * forwardConsole(postMessage, \"km:worker:parse\")\n * console.log(\"processing\", { file: \"test.md\" })\n * ```\n */\nexport function forwardConsole(postMessage: PostMessageFn, namespace?: string): void {\n if (!originalConsole) {\n originalConsole = { ...console }\n }\n\n for (const level of [\"log\", \"debug\", \"info\", \"warn\", \"error\", \"trace\"] as const) {\n console[level] = (...args: unknown[]) => {\n try {\n // Sanitize non-cloneable values before postMessage (structuredClone rejects them)\n const safe = args.map((a) =>\n typeof a === \"function\"\n ? `[Function: ${a.name || \"anonymous\"}]`\n : typeof a === \"symbol\"\n ? a.toString()\n : a instanceof Error\n ? { name: a.name, message: a.message, stack: a.stack }\n : a,\n )\n postMessage({ type: \"console\", level, namespace, args: safe, timestamp: Date.now() })\n } catch {\n originalConsole?.[level](...args)\n }\n }\n }\n}\n\n/**\n * Restore original console methods.\n * Call this if you need to disable console forwarding.\n */\nexport function restoreConsole(): void {\n if (originalConsole) {\n Object.assign(console, originalConsole)\n originalConsole = null\n }\n}\n\n// ============ Worker Side: Pipeline Transport ============\n\n/**\n * Create a pipeline stage that forwards events via postMessage.\n *\n * Events are plain JSON objects that survive structuredClone natively.\n * The stage consumes events (returns null) so nothing is output locally.\n * The main thread uses handleWorkerEvents() or createWorkerLogHandler()\n * to dispatch them through a local logger pipeline.\n */\nexport function workerTransportStage(postMessage: (msg: unknown) => void): Stage {\n return (event: Event): null => {\n try {\n postMessage(event)\n } catch {\n // If postMessage fails (non-cloneable), try with JSON round-trip\n try {\n postMessage(JSON.parse(JSON.stringify(event)))\n } catch {\n // Silently drop -- worker can't communicate\n }\n }\n return null // Consume the event (no local output)\n }\n}\n\n/**\n * Create a logger for use in a worker thread.\n *\n * All log and span events are forwarded to the main thread via postMessage.\n * The main thread should use createWorkerLogHandler() to process these messages.\n *\n * @param postMessage - The worker's postMessage function\n * @param namespace - Logger namespace (e.g., \"km:worker:parse\")\n * @param props - Optional initial props\n *\n * @example\n * ```typescript\n * import { createWorkerLogger } from \"loggily/worker\"\n *\n * const log = createWorkerLogger(postMessage, \"km:worker:parse\")\n *\n * log.info?.(\"starting parse\", { file: \"test.md\" })\n *\n * {\n * using span = log.span?.(\"process\")\n * span.info?.(\"processing...\")\n * span.spanData.count = 100\n * }\n * // Span end event automatically sent to main thread\n * ```\n */\nexport function createWorkerLogger(\n postMessage: (msg: unknown) => void,\n namespace: string,\n props?: Record<string, unknown>,\n): ConditionalLogger {\n const transport = workerTransportStage(postMessage)\n const config: ConfigElement[] = [{ level: \"trace\" as const }, transport]\n const factory = pipe(baseCreateLogger, withSpans())\n const logger = factory(namespace, config)\n return props ? logger.child(props) : logger\n}\n\n// ============ Main Thread Side: Event Handling ============\n\n/**\n * Create a handler that dispatches worker events to a target logger.\n *\n * Use this when you have a specific logger to dispatch through.\n *\n * @param target - Logger or object with dispatch method\n * @returns Handler function to call with worker messages\n */\nexport function handleWorkerEvents(\n target: ConditionalLogger | { dispatch(event: Event): void },\n): (msg: unknown) => void {\n return (msg: unknown) => {\n if (typeof msg !== \"object\" || msg === null) return\n const event = msg as Record<string, unknown>\n if (event.kind === \"log\" || event.kind === \"span\") {\n target.dispatch(msg as Event)\n }\n }\n}\n\n/**\n * Create a zero-config handler for worker logger messages.\n *\n * Automatically creates loggers per-namespace. For console messages,\n * formats args and dispatches through a logger.\n *\n * @returns Handler function to call with any worker message\n *\n * @example\n * ```typescript\n * import { createWorkerLogHandler } from \"loggily/worker\"\n *\n * const handleLog = createWorkerLogHandler()\n * worker.onmessage = (e) => handleLog(e.data)\n * ```\n */\nexport function createWorkerLogHandler(): (message: unknown) => void {\n const loggers = new Map<string, ConditionalLogger>()\n\n function getLogger(namespace: string): ConditionalLogger {\n let logger = loggers.get(namespace)\n if (!logger) {\n logger = createLogger(namespace)\n loggers.set(namespace, logger)\n }\n return logger\n }\n\n return (message: unknown) => {\n if (isWorkerEvent(message)) {\n const logger = getLogger(message.namespace)\n logger.dispatch(message)\n } else if (isWorkerConsoleMessage(message)) {\n const logger = getLogger(message.namespace || \"worker\")\n const { message: msg, data } = formatConsoleArgs(message.args)\n dispatchToLogger(logger, message.level, msg, data)\n }\n }\n}\n\n// ============ Main Thread Side: Console Handler ============\n\nexport interface WorkerConsoleHandlerOptions {\n /** Default namespace if message doesn't include one */\n defaultNamespace?: string\n /** Custom logger to use (defaults to creating one with the namespace) */\n logger?: { name: string; dispatch(event: Event): void }\n}\n\n/** Safely stringify a value, handling circular refs and BigInt */\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n}\n\n/** Format console args into a message string and optional data object */\nfunction formatConsoleArgs(args: unknown[]): { message: string; data: Record<string, unknown> | undefined } {\n const message =\n args.length === 0\n ? \"\"\n : args.length === 1 && typeof args[0] === \"string\"\n ? args[0]\n : args.map((a) => (typeof a === \"string\" ? a : safeStringify(a))).join(\" \")\n\n const lastArg = args[args.length - 1]\n const data =\n args.length > 1 && typeof lastArg === \"object\" && lastArg !== null && !Array.isArray(lastArg)\n ? (lastArg as Record<string, unknown>)\n : undefined\n\n return { message, data }\n}\n\n/** Dispatch a message to a logger at the given console level */\nfunction dispatchToLogger(\n logger: ConditionalLogger,\n level: \"log\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"trace\",\n message: string,\n data?: Record<string, unknown>,\n): void {\n switch (level) {\n case \"trace\":\n logger.trace?.(message, data)\n break\n case \"debug\":\n logger.debug?.(message, data)\n break\n case \"info\":\n case \"log\":\n logger.info?.(message, data)\n break\n case \"warn\":\n logger.warn?.(message, data)\n break\n case \"error\":\n logger.error?.(message, data)\n break\n }\n}\n\n/**\n * Create a handler for worker console messages.\n *\n * Use this on the main thread to receive and output messages from workers.\n *\n * @param options - Handler options\n * @returns Handler function to call with worker messages\n *\n * @example\n * ```typescript\n * import { createWorkerConsoleHandler } from \"loggily/worker\"\n *\n * const handleConsole = createWorkerConsoleHandler({\n * defaultNamespace: \"km:worker:parse\"\n * })\n *\n * worker.onmessage = (e) => {\n * if (e.data.type === \"console\") {\n * handleConsole(e.data)\n * }\n * }\n * ```\n */\nexport function createWorkerConsoleHandler(\n options: WorkerConsoleHandlerOptions = {},\n): (message: WorkerConsoleMessage) => void {\n const loggers = new Map<string, ConditionalLogger>()\n\n function getLogger(namespace?: string): ConditionalLogger {\n const ns = namespace || options.defaultNamespace || \"worker\"\n\n let logger = loggers.get(ns)\n if (!logger) {\n logger = options.logger ? (options.logger as ConditionalLogger) : createLogger(ns)\n loggers.set(ns, logger)\n }\n return logger\n }\n\n return (message: WorkerConsoleMessage) => {\n const logger = getLogger(message.namespace)\n const { message: msg, data } = formatConsoleArgs(message.args)\n dispatchToLogger(logger, message.level, msg, data)\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loggily",
3
- "version": "0.6.2",
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
  },
@@ -29,33 +29,69 @@
29
29
  "type": "git",
30
30
  "url": "https://github.com/beorn/loggily.git"
31
31
  },
32
- "type": "module",
33
32
  "files": [
34
33
  "dist"
35
34
  ],
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"
44
+ },
45
+ "./worker": {
46
+ "types": "./dist/worker.d.mts",
47
+ "import": "./dist/worker.mjs"
48
+ },
49
+ "./metrics": {
50
+ "types": "./dist/metrics.d.mts",
51
+ "import": "./dist/metrics.mjs"
52
+ },
53
+ "./context": {
54
+ "types": "./dist/context.d.mts",
55
+ "import": "./dist/context.mjs"
56
+ },
57
+ "./otel": {
58
+ "types": "./dist/otel.d.mts",
59
+ "import": "./dist/otel.mjs"
40
60
  }
41
61
  },
42
62
  "publishConfig": {
43
63
  "access": "public"
44
64
  },
45
- "tsdown": {
46
- "entry": "src/index.ts",
47
- "format": "esm",
48
- "dts": true,
49
- "clean": true
50
- },
51
65
  "devDependencies": {
52
66
  "@types/node": "^25.5.0",
67
+ "mitata": "^1.0.34",
53
68
  "tsdown": "^0.21.7",
54
69
  "vitepress": "^1.6.4",
55
70
  "vitepress-enrich": "^0.4.0",
56
71
  "vitepress-plugin-llms": "^1.12.0",
57
72
  "vitest": "^4.1.1"
58
73
  },
74
+ "peerDependencies": {
75
+ "@opentelemetry/api": ">=1.0.0"
76
+ },
77
+ "peerDependenciesMeta": {
78
+ "@opentelemetry/api": {
79
+ "optional": true
80
+ }
81
+ },
82
+ "tsdown": {
83
+ "clean": true,
84
+ "dts": true,
85
+ "entry": [
86
+ "src/index.ts",
87
+ "src/index.browser.ts",
88
+ "src/worker.ts",
89
+ "src/metrics.ts",
90
+ "src/context.ts",
91
+ "src/otel.ts"
92
+ ],
93
+ "format": "esm"
94
+ },
59
95
  "engines": {
60
96
  "bun": ">=1.0",
61
97
  "node": ">=23.6.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core.ts","../src/file-writer.ts","../src/tracing.ts"],"mappings":"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"}