@vielzeug/rune 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,23 +1,6 @@
1
1
  # @vielzeug/rune
2
2
 
3
- > Structured browser/Node logger with levels, namespaces, pluggable transports, lazy bindings, and timing helpers.
4
-
5
- [![npm version](https://img.shields.io/npm/v/@vielzeug/rune)](https://www.npmjs.com/package/@vielzeug/rune) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
-
7
- <details>
8
- <summary>Quick Reference</summary>
9
-
10
- **Package:** `@vielzeug/rune` &nbsp;·&nbsp; **Category:** Logging
11
-
12
- **Key exports:** `createLogger`, `defaultLogger`, `lazy`, `consoleTransport`, `remoteTransport`, `jsonTransport`, `batchTransport`, `sampleTransport`, `redactTransport`, `pipe`, `isLevelEnabled`
13
-
14
- **When to use:** Structured browser/Node logging with log levels, namespaced scopes, lazy bindings, and pluggable transport pipelines.
15
-
16
- **Related:** [@vielzeug/courier](https://vielzeug.dev/courier/) · [@vielzeug/herald](https://vielzeug.dev/herald/) · [@vielzeug/familiar](https://vielzeug.dev/familiar/)
17
-
18
- </details>
19
-
20
- `@vielzeug/rune` is part of Vielzeug and ships as a zero-dependency TypeScript package with ESM+CJS output.
3
+ > Structured scoped logger with remote transport
21
4
 
22
5
  ## Installation
23
6
 
@@ -30,17 +13,14 @@ yarn add @vielzeug/rune
30
13
  ## Quick Start
31
14
 
32
15
  ```ts
33
- import { batchTransport, consoleTransport, createLogger, lazy, remoteTransport } from '@vielzeug/rune';
16
+ import { consoleTransport, createLogger, jsonTransport, lazy } from '@vielzeug/rune';
34
17
 
35
18
  const log = createLogger({
36
19
  logLevel: 'debug',
37
20
  namespace: 'server',
38
21
  transports: [
39
22
  consoleTransport({ timestamp: true }),
40
- remoteTransport({
41
- handler: (_type, data) => console.debug('remote log', data),
42
- level: 'error',
43
- }),
23
+ jsonTransport({ level: 'error' }),
44
24
  ],
45
25
  });
46
26
 
@@ -52,12 +32,6 @@ const requestLog = log.withBindings({
52
32
  requestLog.info('request started');
53
33
  const users = await requestLog.time('load users', () => Promise.resolve(['user-1']));
54
34
  console.log(users);
55
-
56
- const batch = batchTransport({ onFlush: (entries) => console.debug('batch', entries) });
57
- const bufferedLog = createLogger({ transports: [batch.transport] });
58
-
59
- bufferedLog.info('queued for delivery');
60
- await batch.dispose();
61
35
  ```
62
36
 
63
37
  ## Documentation
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types.cjs"),t=require("./console.cjs"),n=require("./errors.cjs"),r=require("./lazy.cjs"),i=require("./logger.cjs"),a=require("./transports.cjs");exports.DEFAULT_THEME=t.DEFAULT_THEME,exports.PRIORITY=e.PRIORITY,exports.RuneConfigError=n.RuneConfigError,exports.RuneError=n.RuneError,exports.batchTransport=a.batchTransport,exports.consoleTransport=t.consoleTransport,exports.createLogger=i.createLogger,exports.defaultLogger=i.defaultLogger,exports.isLevelEnabled=e.isLevelEnabled,exports.jsonTransport=a.jsonTransport,exports.lazy=r.lazy,exports.pipe=a.pipe,exports.redactTransport=a.redactTransport,exports.remoteTransport=a.remoteTransport,exports.resolveTheme=t.resolveTheme,exports.sampleTransport=a.sampleTransport;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types.cjs"),t=require("./console.cjs"),n=require("./errors.cjs"),r=require("./lazy.cjs"),i=require("./logger.cjs"),a=require("./transports.cjs");exports.DEFAULT_THEME=t.DEFAULT_THEME,exports.PRIORITY=e.PRIORITY,exports.RuneConfigError=n.RuneConfigError,exports.RuneError=n.RuneError,exports.batchTransport=a.batchTransport,exports.consoleTransport=t.consoleTransport,exports.createLogger=i.createLogger,exports.isLevelEnabled=e.isLevelEnabled,exports.jsonTransport=a.jsonTransport,exports.lazy=r.lazy,exports.redactTransport=a.redactTransport,exports.remoteTransport=a.remoteTransport,exports.resolveTheme=t.resolveTheme,exports.sampleTransport=a.sampleTransport;
package/dist/index.d.ts CHANGED
@@ -3,8 +3,8 @@ export { consoleTransport, DEFAULT_THEME, resolveTheme } from './console';
3
3
  export { RuneConfigError, RuneError } from './errors';
4
4
  export type { LazyBinding } from './lazy';
5
5
  export { lazy } from './lazy';
6
- export { createLogger, defaultLogger } from './logger';
7
- export { batchTransport, jsonTransport, pipe, redactTransport, remoteTransport, sampleTransport } from './transports';
8
- export type { BatchHandle, BatchTransportOptions, Bindings, JsonTransportOptions, LogEntry, Logger, LogLevel, LogMethod, LogMiddleware, LogType, PipeOptions, RedactTransportOptions, RemoteLogData, RemoteTransportOptions, RuneOptions, SampleTransportOptions, Transport, } from './types';
6
+ export { createLogger } from './logger';
7
+ export { batchTransport, jsonTransport, redactTransport, remoteTransport, sampleTransport } from './transports';
8
+ export type { BatchHandle, BatchTransportOptions, Bindings, JsonTransportOptions, LogEntry, Logger, LogLevel, LogMethod, LogMiddleware, LogType, RedactTransportOptions, RemoteLogData, RemoteTransportOptions, RuneOptions, SampleTransportOptions, Transport, } from './types';
9
9
  export { isLevelEnabled, PRIORITY } from './types';
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACtH,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,EACT,aAAa,EACb,OAAO,EACP,WAAW,EACX,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,WAAW,EACX,sBAAsB,EACtB,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACzG,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChH,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,QAAQ,EACR,oBAAoB,EACpB,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,SAAS,EACT,aAAa,EACb,OAAO,EACP,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,WAAW,EACX,sBAAsB,EACtB,SAAS,GACV,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,6 @@ import { PRIORITY as e, isLevelEnabled as t } from "./types.js";
2
2
  import { DEFAULT_THEME as n, consoleTransport as r, resolveTheme as i } from "./console.js";
3
3
  import { RuneConfigError as a, RuneError as o } from "./errors.js";
4
4
  import { lazy as s } from "./lazy.js";
5
- import { createLogger as c, defaultLogger as l } from "./logger.js";
6
- import { batchTransport as u, jsonTransport as d, pipe as f, redactTransport as p, remoteTransport as m, sampleTransport as h } from "./transports.js";
7
- export { n as DEFAULT_THEME, e as PRIORITY, a as RuneConfigError, o as RuneError, u as batchTransport, r as consoleTransport, c as createLogger, l as defaultLogger, t as isLevelEnabled, d as jsonTransport, s as lazy, f as pipe, p as redactTransport, m as remoteTransport, i as resolveTheme, h as sampleTransport };
5
+ import { createLogger as c } from "./logger.js";
6
+ import { batchTransport as l, jsonTransport as u, redactTransport as d, remoteTransport as f, sampleTransport as p } from "./transports.js";
7
+ export { n as DEFAULT_THEME, e as PRIORITY, a as RuneConfigError, o as RuneError, l as batchTransport, r as consoleTransport, c as createLogger, t as isLevelEnabled, u as jsonTransport, s as lazy, d as redactTransport, f as remoteTransport, i as resolveTheme, p as sampleTransport };
package/dist/logger.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./types.cjs"),t=require("./console.cjs"),n=require("./lazy.cjs");require("./_dev.cjs");const r=require("./_prototype.cjs");function i(e){return{message:e.message,name:e.name,stack:e.stack}}function a(e){let t={};for(let[a,o]of Object.entries(e)){if(r.isUnsafeObjectKey(a))continue;let e=n.isLazy(o)?o.factory():o;t[a]=e instanceof Error?i(e):e}return t}function o(e,t,n){if(typeof e==`string`)return{context:void 0,message:e};if(e instanceof Error){let r=typeof t==`object`&&t?t:{};return{context:{err:i(e),...r},message:n===void 0?t!==void 0&&typeof t!=`object`?String(t):void 0:String(n)}}return typeof e==`object`&&e?{context:e,message:t===void 0?void 0:String(t)}:{context:void 0,message:e===void 0?void 0:String(e)}}function s(e,t){return e?t?`${e}.${t}`:e:t}function c(n={},r){let l=typeof n==`string`?{namespace:n,...r}:n,u=l.logLevel??`debug`,d=l.middleware??[],f=l.namespace??``,p=l.transports??[t.consoleTransport()],m={...l.bindings??{}},h=new AbortController,g=!1,_=t=>e.isLevelEnabled(u,t),v=()=>f?` (namespace: "${f}")`:``,y=e=>{let t=e;if(d.length>0){let n=e;for(let e of d)try{let t=e(n);if(t==null)return;n=t}catch(e){`${v()}${String(e)}`;return}t=n}for(let e of p)try{e(t)}catch(e){`${v()}${String(e)}`}},b=(e,t,n,r)=>{if(g||!_(e))return;let{context:i,message:s}=o(t,n,r),c=i?{...a(m),...a(i)}:a(m);y({data:c,level:e,message:s,namespace:f,timestamp:new Date})},x=(e,t,n=`debug`)=>{let r=performance.now(),a=t=>{let a={duration_ms:Math.round((performance.now()-r)*100)/100};t!==void 0&&(a.err=i(t instanceof Error?t:Error(String(t)))),b(n,a,e)};try{let e=t();return e instanceof Promise?e.then(e=>(a(),e),e=>(a(e),Promise.reject(e))):(a(),e)}catch(e){throw a(e),e}},S=(e,n,r,i)=>{if(g||u===`off`||i!==void 0&&!_(i))return r();t.renderGroup(e,n,f,t.DEFAULT_THEME);try{let e=r();return e instanceof Promise?e.finally(()=>console.groupEnd()):(console.groupEnd(),e)}catch(e){throw console.groupEnd(),e}},C=(e={})=>c({bindings:{...m,...e.bindings??{}},logLevel:e.logLevel??u,middleware:e.middleware??d,namespace:e.namespace===void 0?f:s(f,e.namespace),transports:e.transports??p}),w={get bindings(){return{...m}},child:C,debug:(e,t,n)=>b(`debug`,e,t,n),get disposalSignal(){return h.signal},dispose:()=>{g||(g=!0,h.abort())},get disposed(){return g},enabled:t=>e.isLevelEnabled(u,t),error:(e,t,n)=>b(`error`,e,t,n),fatal:(e,t,n)=>b(`fatal`,e,t,n),group:(e,t,n)=>S(!1,e,t,n),groupCollapsed:(e,t,n)=>S(!0,e,t,n),info:(e,t,n)=>b(`info`,e,t,n),get logLevel(){return u},get middleware(){return[...d]},get namespace(){return f},[Symbol.dispose](){w.dispose()},time:x,get transports(){return[...p]},use:e=>C({middleware:[...d,e]}),warn:(e,t,n)=>b(`warn`,e,t,n),withBindings:e=>C({bindings:e})};return w}var l=c();exports.createLogger=c,exports.defaultLogger=l;
1
+ const e=require("./types.cjs"),t=require("./console.cjs"),n=require("./lazy.cjs");require("./_dev.cjs");const r=require("./_prototype.cjs");function i(e){return{message:e.message,name:e.name,stack:e.stack}}function a(e){let t={};for(let[a,o]of Object.entries(e)){if(r.isUnsafeObjectKey(a))continue;let e=n.isLazy(o)?o.factory():o;t[a]=e instanceof Error?i(e):e}return t}function o(e,t,n){if(typeof e==`string`)return{context:typeof t==`object`&&t?t:void 0,message:e};if(e instanceof Error){let r=typeof t==`object`&&t?t:{},a=n===void 0?typeof t==`string`?t:void 0:String(n);return{context:{err:i(e),...r},message:a}}return typeof e==`object`&&e?{context:e,message:t===void 0?void 0:String(t)}:{context:void 0,message:e===void 0?void 0:String(e)}}function s(e,t){return e?t?`${e}.${t}`:e:t}function c(n={},r){let l=typeof n==`string`?{namespace:n,...r}:n,u=l.logLevel??`debug`,d=[...l.middleware??[]],f=l.namespace??``,p=[...l.transports??[t.consoleTransport()]],m={...l.bindings??{}},h=new AbortController,g=!1,_=t=>e.isLevelEnabled(u,t),v=()=>f?` (namespace: "${f}")`:``,y=e=>{let t=e;for(let e of d)try{let n=e(t);if(n==null)return;t=n}catch(e){`${v()}${String(e)}`;return}for(let e of p)try{e(t)}catch(e){`${v()}${String(e)}`}},b=(e,t,n,r)=>{if(g||!_(e))return;let{context:i,message:s}=o(t,n,r),c=i?{...a(m),...a(i)}:a(m);y({data:c,level:e,message:s,namespace:f,timestamp:new Date})},x=(e,t,n=`debug`)=>{let r=performance.now(),a=t=>{let a={duration_ms:Math.round((performance.now()-r)*100)/100};t!==void 0&&(a.err=i(t instanceof Error?t:Error(String(t)))),b(n,a,e)};try{let e=t();return e instanceof Promise?e.then(e=>(a(),e),e=>(a(e),Promise.reject(e))):(a(),e)}catch(e){throw a(e),e}},S=(e,n,r,i)=>{if(g||u===`off`||i!==void 0&&!_(i))return r();t.renderGroup(e,n,f,t.DEFAULT_THEME);try{let e=r();return e instanceof Promise?e.finally(()=>console.groupEnd()):(console.groupEnd(),e)}catch(e){throw console.groupEnd(),e}},C=(e={})=>c({bindings:{...m,...e.bindings??{}},logLevel:e.logLevel??u,middleware:e.middleware??d,namespace:e.namespace===void 0?f:s(f,e.namespace),transports:e.transports??p}),w={get bindings(){return{...m}},child:C,debug:(e,t,n)=>b(`debug`,e,t,n),get disposalSignal(){return h.signal},dispose:()=>{g||(g=!0,h.abort())},get disposed(){return g},enabled:t=>e.isLevelEnabled(u,t),error:(e,t,n)=>b(`error`,e,t,n),fatal:(e,t,n)=>b(`fatal`,e,t,n),group:(e,t,n)=>S(!1,e,t,n),groupCollapsed:(e,t,n)=>S(!0,e,t,n),info:(e,t,n)=>b(`info`,e,t,n),get logLevel(){return u},get middleware(){return[...d]},get namespace(){return f},[Symbol.dispose](){w.dispose()},time:x,get transports(){return[...p]},use:e=>C({middleware:[...d,e]}),warn:(e,t,n)=>b(`warn`,e,t,n),withBindings:e=>C({bindings:e})};return w}exports.createLogger=c;
2
2
  //# sourceMappingURL=logger.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.cjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { isUnsafeObjectKey } from './_prototype';\nimport { consoleTransport, DEFAULT_THEME, renderGroup } from './console';\nimport { isLazy } from './lazy';\nimport type { Bindings, LogEntry, Logger, LogLevel, LogMiddleware, LogType, RuneOptions, Transport } from './types';\nimport { isLevelEnabled } from './types';\n\n/* --- Arg parsing (simplified) --- */\n\nfunction serializeError(err: Error): { message: string; name: string; stack?: string } {\n return { message: err.message, name: err.name, stack: err.stack };\n}\n\n/**\n * Resolve lazy bindings and serialize Errors in a single pass.\n * Always allocates a fresh object — the result is never an alias of the input.\n */\nfunction prepareBindings(bindings: Bindings): Bindings {\n const out: Bindings = {};\n\n for (const [k, v] of Object.entries(bindings)) {\n // Guard against a `__proto__`/`constructor`/`prototype` field name hijacking out's own\n // prototype via the bracket-assignment accessor — see _prototype.ts.\n if (isUnsafeObjectKey(k)) continue;\n\n const resolved = isLazy(v) ? v.factory() : v;\n\n out[k] = resolved instanceof Error ? serializeError(resolved) : resolved;\n }\n\n return out;\n}\n\ntype ParsedArgs = { context: Bindings | undefined; message: string | undefined };\n\nfunction parseArgs(msgOrCtx: unknown, second: unknown, third?: unknown): ParsedArgs {\n if (typeof msgOrCtx === 'string') {\n return { context: undefined, message: msgOrCtx };\n }\n\n if (msgOrCtx instanceof Error) {\n const ctx: Bindings = second !== null && typeof second === 'object' ? (second as Bindings) : {};\n\n return {\n context: { err: serializeError(msgOrCtx), ...ctx },\n message:\n third !== undefined\n ? String(third)\n : second !== undefined && typeof second !== 'object'\n ? String(second)\n : undefined,\n };\n }\n\n if (typeof msgOrCtx === 'object' && msgOrCtx !== null) {\n return {\n context: msgOrCtx as Bindings,\n message: second !== undefined ? String(second) : undefined,\n };\n }\n\n return { context: undefined, message: msgOrCtx !== undefined ? String(msgOrCtx) : undefined };\n}\n\n/* --- Namespace joining --- */\n\n/**\n * Joins parent and child namespaces with '.' as separator.\n * Examples:\n * joinNamespace('api', 'auth') → 'api.auth'\n * joinNamespace('', 'api') → 'api'\n * joinNamespace('api', '') → 'api'\n */\nfunction joinNamespace(parent: string, child: string): string {\n if (!parent) return child;\n\n if (!child) return parent;\n\n return `${parent}.${child}`;\n}\n\n/* --- createLogger --- */\n\n/**\n * Creates an isolated logger instance.\n *\n * Accepts two call signatures:\n * - `createLogger()` / `createLogger(options)` — configure via `RuneOptions`\n * - `createLogger('namespace', options?)` — namespace shorthand + optional options\n *\n * Each instance has its own immutable config (logLevel, transports, middleware).\n * To change the log level at runtime, create a new logger or child.\n */\nexport function createLogger(namespace: string, options?: Omit<RuneOptions, 'namespace'>): Logger;\nexport function createLogger(options?: RuneOptions): Logger;\nexport function createLogger(initial: RuneOptions | string = {}, extra?: Omit<RuneOptions, 'namespace'>): Logger {\n const initialOpts: RuneOptions = typeof initial === 'string' ? { namespace: initial, ...extra } : initial;\n\n const logLevel: LogLevel = initialOpts.logLevel ?? 'debug';\n const middleware: LogMiddleware[] = initialOpts.middleware ?? [];\n const namespace: string = initialOpts.namespace ?? '';\n const transports = initialOpts.transports ?? [consoleTransport()];\n const ownBindings: Bindings = { ...(initialOpts.bindings ?? {}) };\n\n const disposeController = new AbortController();\n let isDisposed = false;\n\n const passes = (type: LogType): boolean => isLevelEnabled(logLevel, type);\n const namespaceSuffix = (): string => (namespace ? ` (namespace: \"${namespace}\")` : '');\n\n const dispatch = (entry: LogEntry): void => {\n let current: LogEntry = entry;\n\n if (middleware.length > 0) {\n let c: LogEntry = entry;\n\n for (const mw of middleware) {\n try {\n const next = mw(c);\n\n if (next == null) return;\n\n c = next;\n } catch (err) {\n warn(`middleware threw and dropped this entry${namespaceSuffix()}: ${String(err)}`);\n\n return;\n }\n }\n\n current = c;\n }\n\n for (const t of transports) {\n try {\n t(current);\n } catch (err) {\n warn(`Transport threw an unhandled error${namespaceSuffix()}: ${String(err)}`);\n }\n }\n };\n\n const emit = (type: LogType, msgOrCtx: unknown, second?: unknown, third?: unknown): void => {\n if (isDisposed) return;\n\n if (!passes(type)) return;\n\n const { context, message } = parseArgs(msgOrCtx, second, third);\n // prepareBindings() always allocates a fresh object, so `data` is never an alias of `ownBindings`.\n const data: Bindings = context\n ? { ...prepareBindings(ownBindings), ...prepareBindings(context) }\n : prepareBindings(ownBindings);\n\n dispatch({\n data,\n level: type,\n message,\n namespace,\n timestamp: new Date(),\n });\n };\n\n const timeImpl = <T>(label: string, fn: () => T, level: LogType = 'debug'): T => {\n const start = performance.now();\n\n const done = (thrownErr?: unknown): void => {\n const duration_ms = Math.round((performance.now() - start) * 100) / 100;\n const ctx: Bindings = { duration_ms };\n\n if (thrownErr !== undefined)\n ctx.err = serializeError(thrownErr instanceof Error ? thrownErr : new Error(String(thrownErr)));\n\n emit(level, ctx, label);\n };\n\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result.then(\n (v) => {\n done();\n\n return v;\n },\n (err: unknown) => {\n done(err);\n\n return Promise.reject(err) as never;\n },\n ) as T;\n }\n\n done();\n\n return result;\n } catch (err) {\n done(err);\n throw err;\n }\n };\n\n const wrapGroup = <T>(collapsed: boolean, label: string, fn: () => T, level?: LogType): T => {\n if (isDisposed || logLevel === 'off') return fn();\n\n if (level !== undefined && !passes(level)) {\n return fn();\n }\n\n renderGroup(collapsed, label, namespace, DEFAULT_THEME);\n\n try {\n const result = fn();\n\n if (result instanceof Promise) return result.finally(() => console.groupEnd()) as T;\n\n console.groupEnd();\n\n return result;\n } catch (err) {\n console.groupEnd();\n throw err;\n }\n };\n\n const childLogger = (overrides: RuneOptions = {}): Logger =>\n createLogger({\n bindings: { ...ownBindings, ...(overrides.bindings ?? {}) },\n logLevel: overrides.logLevel ?? logLevel,\n middleware: overrides.middleware ?? middleware,\n namespace: overrides.namespace !== undefined ? joinNamespace(namespace, overrides.namespace) : namespace,\n transports: overrides.transports ?? transports,\n });\n\n const logger: Logger = {\n get bindings(): Readonly<Bindings> {\n return { ...ownBindings };\n },\n\n child: childLogger,\n\n debug: (m: unknown, s?: unknown, t?: unknown) => emit('debug', m, s, t),\n\n get disposalSignal(): AbortSignal {\n return disposeController.signal;\n },\n\n dispose: (): void => {\n if (isDisposed) return;\n\n isDisposed = true;\n disposeController.abort();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n enabled: (type: LogLevel): boolean => isLevelEnabled(logLevel, type),\n\n error: (m: unknown, s?: unknown, t?: unknown) => emit('error', m, s, t),\n\n fatal: (m: unknown, s?: unknown, t?: unknown) => emit('fatal', m, s, t),\n\n group: (label, fn, level) => wrapGroup(false, label, fn, level),\n\n groupCollapsed: (label, fn, level) => wrapGroup(true, label, fn, level),\n\n info: (m: unknown, s?: unknown, t?: unknown) => emit('info', m, s, t),\n\n get logLevel(): LogLevel {\n return logLevel;\n },\n\n get middleware(): readonly LogMiddleware[] {\n return [...middleware];\n },\n\n get namespace(): string {\n return namespace;\n },\n\n [Symbol.dispose](): void {\n logger.dispose();\n },\n\n time: timeImpl,\n\n get transports(): readonly Transport[] {\n return [...transports];\n },\n\n use: (mw: LogMiddleware): Logger => childLogger({ middleware: [...middleware, mw] }),\n\n warn: (m: unknown, s?: unknown, t?: unknown) => emit('warn', m, s, t),\n\n withBindings: (bindings: Bindings): Logger => childLogger({ bindings }),\n };\n\n return logger;\n}\n\nexport const defaultLogger = createLogger();\n"],"mappings":"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"}
1
+ {"version":3,"file":"logger.cjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { isUnsafeObjectKey } from './_prototype';\nimport { consoleTransport, DEFAULT_THEME, renderGroup } from './console';\nimport { isLazy } from './lazy';\nimport type { Bindings, LogEntry, Logger, LogLevel, LogMiddleware, LogType, RuneOptions, Transport } from './types';\nimport { isLevelEnabled } from './types';\n\n/* --- Arg parsing (simplified) --- */\n\nfunction serializeError(err: Error): { message: string; name: string; stack?: string } {\n return { message: err.message, name: err.name, stack: err.stack };\n}\n\n/**\n * Resolve lazy bindings and serialize Errors in a single pass.\n * Always allocates a fresh object — the result is never an alias of the input.\n */\nfunction prepareBindings(bindings: Bindings): Bindings {\n const out: Bindings = {};\n\n for (const [k, v] of Object.entries(bindings)) {\n // Guard against a `__proto__`/`constructor`/`prototype` field name hijacking out's own\n // prototype via the bracket-assignment accessor — see _prototype.ts.\n if (isUnsafeObjectKey(k)) continue;\n\n const resolved = isLazy(v) ? v.factory() : v;\n\n out[k] = resolved instanceof Error ? serializeError(resolved) : resolved;\n }\n\n return out;\n}\n\ntype ParsedArgs = { context: Bindings | undefined; message: string | undefined };\n\nfunction parseArgs(first: unknown, second?: unknown, third?: unknown): ParsedArgs {\n if (typeof first === 'string') {\n return {\n context: second !== null && typeof second === 'object' ? (second as Bindings) : undefined,\n message: first,\n };\n }\n\n if (first instanceof Error) {\n const context = second !== null && typeof second === 'object' ? (second as Bindings) : {};\n const message = third !== undefined ? String(third) : typeof second === 'string' ? second : undefined;\n\n return { context: { err: serializeError(first), ...context }, message };\n }\n\n if (first !== null && typeof first === 'object') {\n return { context: first as Bindings, message: second !== undefined ? String(second) : undefined };\n }\n\n return { context: undefined, message: first === undefined ? undefined : String(first) };\n}\n\n/* --- Namespace joining --- */\n\n/**\n * Joins parent and child namespaces with '.' as separator.\n * Examples:\n * joinNamespace('api', 'auth') → 'api.auth'\n * joinNamespace('', 'api') → 'api'\n * joinNamespace('api', '') → 'api'\n */\nfunction joinNamespace(parent: string, child: string): string {\n if (!parent) return child;\n\n if (!child) return parent;\n\n return `${parent}.${child}`;\n}\n\n/* --- createLogger --- */\n\n/**\n * Creates an isolated logger instance.\n *\n * Accepts two call signatures:\n * - `createLogger()` / `createLogger(options)` — configure via `RuneOptions`\n * - `createLogger('namespace', options?)` — namespace shorthand + optional options\n *\n * Each instance has its own immutable config (logLevel, transports, middleware).\n * To change the log level at runtime, create a new logger or child.\n */\nexport function createLogger(namespace: string, options?: Omit<RuneOptions, 'namespace'>): Logger;\nexport function createLogger(options?: RuneOptions): Logger;\nexport function createLogger(initial: RuneOptions | string = {}, extra?: Omit<RuneOptions, 'namespace'>): Logger {\n const initialOpts: RuneOptions = typeof initial === 'string' ? { namespace: initial, ...extra } : initial;\n\n const logLevel: LogLevel = initialOpts.logLevel ?? 'debug';\n const middleware: LogMiddleware[] = [...(initialOpts.middleware ?? [])];\n const namespace: string = initialOpts.namespace ?? '';\n const transports = [...(initialOpts.transports ?? [consoleTransport()])];\n const ownBindings: Bindings = { ...(initialOpts.bindings ?? {}) };\n\n const disposeController = new AbortController();\n let isDisposed = false;\n\n const passes = (type: LogType): boolean => isLevelEnabled(logLevel, type);\n const namespaceSuffix = (): string => (namespace ? ` (namespace: \"${namespace}\")` : '');\n\n const dispatch = (entry: LogEntry): void => {\n let current = entry;\n\n for (const transform of middleware) {\n try {\n const next = transform(current);\n\n if (next === null || next === undefined) return;\n\n current = next;\n } catch (err) {\n warn(`Middleware threw and dropped this entry${namespaceSuffix()}: ${String(err)}`);\n return;\n }\n }\n\n for (const transport of transports) {\n try {\n transport(current);\n } catch (err) {\n warn(`Transport threw an unhandled error${namespaceSuffix()}: ${String(err)}`);\n }\n }\n };\n\n const emit = (type: LogType, first: unknown, second?: unknown, third?: unknown): void => {\n if (isDisposed) return;\n\n if (!passes(type)) return;\n\n const { context, message } = parseArgs(first, second, third);\n // prepareBindings() always allocates a fresh object, so `data` is never an alias of `ownBindings`.\n const data: Bindings = context\n ? { ...prepareBindings(ownBindings), ...prepareBindings(context) }\n : prepareBindings(ownBindings);\n\n dispatch({\n data,\n level: type,\n message,\n namespace,\n timestamp: new Date(),\n });\n };\n\n const timeImpl = <T>(label: string, fn: () => T, level: LogType = 'debug'): T => {\n const start = performance.now();\n\n const done = (thrownErr?: unknown): void => {\n const duration_ms = Math.round((performance.now() - start) * 100) / 100;\n const ctx: Bindings = { duration_ms };\n\n if (thrownErr !== undefined)\n ctx.err = serializeError(thrownErr instanceof Error ? thrownErr : new Error(String(thrownErr)));\n\n emit(level, ctx, label);\n };\n\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result.then(\n (v) => {\n done();\n\n return v;\n },\n (err: unknown) => {\n done(err);\n\n return Promise.reject(err) as never;\n },\n ) as T;\n }\n\n done();\n\n return result;\n } catch (err) {\n done(err);\n throw err;\n }\n };\n\n const wrapGroup = <T>(collapsed: boolean, label: string, fn: () => T, level?: LogType): T => {\n if (isDisposed || logLevel === 'off') return fn();\n\n if (level !== undefined && !passes(level)) {\n return fn();\n }\n\n renderGroup(collapsed, label, namespace, DEFAULT_THEME);\n\n try {\n const result = fn();\n\n if (result instanceof Promise) return result.finally(() => console.groupEnd()) as T;\n\n console.groupEnd();\n\n return result;\n } catch (err) {\n console.groupEnd();\n throw err;\n }\n };\n\n const childLogger = (overrides: RuneOptions = {}): Logger =>\n createLogger({\n bindings: { ...ownBindings, ...(overrides.bindings ?? {}) },\n logLevel: overrides.logLevel ?? logLevel,\n middleware: overrides.middleware ?? middleware,\n namespace: overrides.namespace !== undefined ? joinNamespace(namespace, overrides.namespace) : namespace,\n transports: overrides.transports ?? transports,\n });\n\n const logger: Logger = {\n get bindings(): Readonly<Bindings> {\n return { ...ownBindings };\n },\n\n child: childLogger,\n\n debug: (first: unknown, second?: unknown, third?: unknown) => emit('debug', first, second, third),\n\n get disposalSignal(): AbortSignal {\n return disposeController.signal;\n },\n\n dispose: (): void => {\n if (isDisposed) return;\n\n isDisposed = true;\n disposeController.abort();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n enabled: (type: LogLevel): boolean => isLevelEnabled(logLevel, type),\n\n error: (first: unknown, second?: unknown, third?: unknown) => emit('error', first, second, third),\n\n fatal: (first: unknown, second?: unknown, third?: unknown) => emit('fatal', first, second, third),\n\n group: (label, fn, level) => wrapGroup(false, label, fn, level),\n\n groupCollapsed: (label, fn, level) => wrapGroup(true, label, fn, level),\n\n info: (first: unknown, second?: unknown, third?: unknown) => emit('info', first, second, third),\n\n get logLevel(): LogLevel {\n return logLevel;\n },\n\n get middleware(): readonly LogMiddleware[] {\n return [...middleware];\n },\n\n get namespace(): string {\n return namespace;\n },\n\n [Symbol.dispose](): void {\n logger.dispose();\n },\n\n time: timeImpl,\n\n get transports(): readonly Transport[] {\n return [...transports];\n },\n\n use: (transform: LogMiddleware): Logger => childLogger({ middleware: [...middleware, transform] }),\n\n warn: (first: unknown, second?: unknown, third?: unknown) => emit('warn', first, second, third),\n\n withBindings: (bindings: Bindings): Logger => childLogger({ bindings }),\n };\n\n return logger;\n}\n"],"mappings":"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"}
package/dist/logger.d.ts CHANGED
@@ -11,5 +11,4 @@ import type { Logger, RuneOptions } from './types';
11
11
  */
12
12
  export declare function createLogger(namespace: string, options?: Omit<RuneOptions, 'namespace'>): Logger;
13
13
  export declare function createLogger(options?: RuneOptions): Logger;
14
- export declare const defaultLogger: Logger;
15
14
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsB,MAAM,EAAoC,WAAW,EAAa,MAAM,SAAS,CAAC;AA+EpH;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC;AAClG,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;AAgN5D,eAAO,MAAM,aAAa,QAAiB,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAsB,MAAM,EAAoC,WAAW,EAAa,MAAM,SAAS,CAAC;AAwEpH;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,CAAC;AAClG,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC"}
package/dist/logger.js CHANGED
@@ -22,17 +22,17 @@ function s(e) {
22
22
  }
23
23
  function c(e, t, n) {
24
24
  if (typeof e == "string") return {
25
- context: void 0,
25
+ context: typeof t == "object" && t ? t : void 0,
26
26
  message: e
27
27
  };
28
28
  if (e instanceof Error) {
29
- let r = typeof t == "object" && t ? t : {};
29
+ let r = typeof t == "object" && t ? t : {}, i = n === void 0 ? typeof t == "string" ? t : void 0 : String(n);
30
30
  return {
31
31
  context: {
32
32
  err: o(e),
33
33
  ...r
34
34
  },
35
- message: n === void 0 ? t !== void 0 && typeof t != "object" ? String(t) : void 0 : String(n)
35
+ message: i
36
36
  };
37
37
  }
38
38
  return typeof e == "object" && e ? {
@@ -50,19 +50,15 @@ function u(i = {}, a) {
50
50
  let d = typeof i == "string" ? {
51
51
  namespace: i,
52
52
  ...a
53
- } : i, f = d.logLevel ?? "debug", p = d.middleware ?? [], m = d.namespace ?? "", h = d.transports ?? [n()], g = { ...d.bindings ?? {} }, _ = new AbortController(), v = !1, y = (t) => e(f, t), b = () => m ? ` (namespace: "${m}")` : "", x = (e) => {
53
+ } : i, f = d.logLevel ?? "debug", p = [...d.middleware ?? []], m = d.namespace ?? "", h = [...d.transports ?? [n()]], g = { ...d.bindings ?? {} }, _ = new AbortController(), v = !1, y = (t) => e(f, t), b = () => m ? ` (namespace: "${m}")` : "", x = (e) => {
54
54
  let t = e;
55
- if (p.length > 0) {
56
- let n = e;
57
- for (let e of p) try {
58
- let t = e(n);
59
- if (t == null) return;
60
- n = t;
61
- } catch (e) {
62
- `${b()}${String(e)}`;
63
- return;
64
- }
55
+ for (let e of p) try {
56
+ let n = e(t);
57
+ if (n == null) return;
65
58
  t = n;
59
+ } catch (e) {
60
+ `${b()}${String(e)}`;
61
+ return;
66
62
  }
67
63
  for (let e of h) try {
68
64
  e(t);
@@ -154,8 +150,7 @@ function u(i = {}, a) {
154
150
  };
155
151
  return E;
156
152
  }
157
- var d = u();
158
153
  //#endregion
159
- export { u as createLogger, d as defaultLogger };
154
+ export { u as createLogger };
160
155
 
161
156
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { isUnsafeObjectKey } from './_prototype';\nimport { consoleTransport, DEFAULT_THEME, renderGroup } from './console';\nimport { isLazy } from './lazy';\nimport type { Bindings, LogEntry, Logger, LogLevel, LogMiddleware, LogType, RuneOptions, Transport } from './types';\nimport { isLevelEnabled } from './types';\n\n/* --- Arg parsing (simplified) --- */\n\nfunction serializeError(err: Error): { message: string; name: string; stack?: string } {\n return { message: err.message, name: err.name, stack: err.stack };\n}\n\n/**\n * Resolve lazy bindings and serialize Errors in a single pass.\n * Always allocates a fresh object — the result is never an alias of the input.\n */\nfunction prepareBindings(bindings: Bindings): Bindings {\n const out: Bindings = {};\n\n for (const [k, v] of Object.entries(bindings)) {\n // Guard against a `__proto__`/`constructor`/`prototype` field name hijacking out's own\n // prototype via the bracket-assignment accessor — see _prototype.ts.\n if (isUnsafeObjectKey(k)) continue;\n\n const resolved = isLazy(v) ? v.factory() : v;\n\n out[k] = resolved instanceof Error ? serializeError(resolved) : resolved;\n }\n\n return out;\n}\n\ntype ParsedArgs = { context: Bindings | undefined; message: string | undefined };\n\nfunction parseArgs(msgOrCtx: unknown, second: unknown, third?: unknown): ParsedArgs {\n if (typeof msgOrCtx === 'string') {\n return { context: undefined, message: msgOrCtx };\n }\n\n if (msgOrCtx instanceof Error) {\n const ctx: Bindings = second !== null && typeof second === 'object' ? (second as Bindings) : {};\n\n return {\n context: { err: serializeError(msgOrCtx), ...ctx },\n message:\n third !== undefined\n ? String(third)\n : second !== undefined && typeof second !== 'object'\n ? String(second)\n : undefined,\n };\n }\n\n if (typeof msgOrCtx === 'object' && msgOrCtx !== null) {\n return {\n context: msgOrCtx as Bindings,\n message: second !== undefined ? String(second) : undefined,\n };\n }\n\n return { context: undefined, message: msgOrCtx !== undefined ? String(msgOrCtx) : undefined };\n}\n\n/* --- Namespace joining --- */\n\n/**\n * Joins parent and child namespaces with '.' as separator.\n * Examples:\n * joinNamespace('api', 'auth') → 'api.auth'\n * joinNamespace('', 'api') → 'api'\n * joinNamespace('api', '') → 'api'\n */\nfunction joinNamespace(parent: string, child: string): string {\n if (!parent) return child;\n\n if (!child) return parent;\n\n return `${parent}.${child}`;\n}\n\n/* --- createLogger --- */\n\n/**\n * Creates an isolated logger instance.\n *\n * Accepts two call signatures:\n * - `createLogger()` / `createLogger(options)` — configure via `RuneOptions`\n * - `createLogger('namespace', options?)` — namespace shorthand + optional options\n *\n * Each instance has its own immutable config (logLevel, transports, middleware).\n * To change the log level at runtime, create a new logger or child.\n */\nexport function createLogger(namespace: string, options?: Omit<RuneOptions, 'namespace'>): Logger;\nexport function createLogger(options?: RuneOptions): Logger;\nexport function createLogger(initial: RuneOptions | string = {}, extra?: Omit<RuneOptions, 'namespace'>): Logger {\n const initialOpts: RuneOptions = typeof initial === 'string' ? { namespace: initial, ...extra } : initial;\n\n const logLevel: LogLevel = initialOpts.logLevel ?? 'debug';\n const middleware: LogMiddleware[] = initialOpts.middleware ?? [];\n const namespace: string = initialOpts.namespace ?? '';\n const transports = initialOpts.transports ?? [consoleTransport()];\n const ownBindings: Bindings = { ...(initialOpts.bindings ?? {}) };\n\n const disposeController = new AbortController();\n let isDisposed = false;\n\n const passes = (type: LogType): boolean => isLevelEnabled(logLevel, type);\n const namespaceSuffix = (): string => (namespace ? ` (namespace: \"${namespace}\")` : '');\n\n const dispatch = (entry: LogEntry): void => {\n let current: LogEntry = entry;\n\n if (middleware.length > 0) {\n let c: LogEntry = entry;\n\n for (const mw of middleware) {\n try {\n const next = mw(c);\n\n if (next == null) return;\n\n c = next;\n } catch (err) {\n warn(`middleware threw and dropped this entry${namespaceSuffix()}: ${String(err)}`);\n\n return;\n }\n }\n\n current = c;\n }\n\n for (const t of transports) {\n try {\n t(current);\n } catch (err) {\n warn(`Transport threw an unhandled error${namespaceSuffix()}: ${String(err)}`);\n }\n }\n };\n\n const emit = (type: LogType, msgOrCtx: unknown, second?: unknown, third?: unknown): void => {\n if (isDisposed) return;\n\n if (!passes(type)) return;\n\n const { context, message } = parseArgs(msgOrCtx, second, third);\n // prepareBindings() always allocates a fresh object, so `data` is never an alias of `ownBindings`.\n const data: Bindings = context\n ? { ...prepareBindings(ownBindings), ...prepareBindings(context) }\n : prepareBindings(ownBindings);\n\n dispatch({\n data,\n level: type,\n message,\n namespace,\n timestamp: new Date(),\n });\n };\n\n const timeImpl = <T>(label: string, fn: () => T, level: LogType = 'debug'): T => {\n const start = performance.now();\n\n const done = (thrownErr?: unknown): void => {\n const duration_ms = Math.round((performance.now() - start) * 100) / 100;\n const ctx: Bindings = { duration_ms };\n\n if (thrownErr !== undefined)\n ctx.err = serializeError(thrownErr instanceof Error ? thrownErr : new Error(String(thrownErr)));\n\n emit(level, ctx, label);\n };\n\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result.then(\n (v) => {\n done();\n\n return v;\n },\n (err: unknown) => {\n done(err);\n\n return Promise.reject(err) as never;\n },\n ) as T;\n }\n\n done();\n\n return result;\n } catch (err) {\n done(err);\n throw err;\n }\n };\n\n const wrapGroup = <T>(collapsed: boolean, label: string, fn: () => T, level?: LogType): T => {\n if (isDisposed || logLevel === 'off') return fn();\n\n if (level !== undefined && !passes(level)) {\n return fn();\n }\n\n renderGroup(collapsed, label, namespace, DEFAULT_THEME);\n\n try {\n const result = fn();\n\n if (result instanceof Promise) return result.finally(() => console.groupEnd()) as T;\n\n console.groupEnd();\n\n return result;\n } catch (err) {\n console.groupEnd();\n throw err;\n }\n };\n\n const childLogger = (overrides: RuneOptions = {}): Logger =>\n createLogger({\n bindings: { ...ownBindings, ...(overrides.bindings ?? {}) },\n logLevel: overrides.logLevel ?? logLevel,\n middleware: overrides.middleware ?? middleware,\n namespace: overrides.namespace !== undefined ? joinNamespace(namespace, overrides.namespace) : namespace,\n transports: overrides.transports ?? transports,\n });\n\n const logger: Logger = {\n get bindings(): Readonly<Bindings> {\n return { ...ownBindings };\n },\n\n child: childLogger,\n\n debug: (m: unknown, s?: unknown, t?: unknown) => emit('debug', m, s, t),\n\n get disposalSignal(): AbortSignal {\n return disposeController.signal;\n },\n\n dispose: (): void => {\n if (isDisposed) return;\n\n isDisposed = true;\n disposeController.abort();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n enabled: (type: LogLevel): boolean => isLevelEnabled(logLevel, type),\n\n error: (m: unknown, s?: unknown, t?: unknown) => emit('error', m, s, t),\n\n fatal: (m: unknown, s?: unknown, t?: unknown) => emit('fatal', m, s, t),\n\n group: (label, fn, level) => wrapGroup(false, label, fn, level),\n\n groupCollapsed: (label, fn, level) => wrapGroup(true, label, fn, level),\n\n info: (m: unknown, s?: unknown, t?: unknown) => emit('info', m, s, t),\n\n get logLevel(): LogLevel {\n return logLevel;\n },\n\n get middleware(): readonly LogMiddleware[] {\n return [...middleware];\n },\n\n get namespace(): string {\n return namespace;\n },\n\n [Symbol.dispose](): void {\n logger.dispose();\n },\n\n time: timeImpl,\n\n get transports(): readonly Transport[] {\n return [...transports];\n },\n\n use: (mw: LogMiddleware): Logger => childLogger({ middleware: [...middleware, mw] }),\n\n warn: (m: unknown, s?: unknown, t?: unknown) => emit('warn', m, s, t),\n\n withBindings: (bindings: Bindings): Logger => childLogger({ bindings }),\n };\n\n return logger;\n}\n\nexport const defaultLogger = createLogger();\n"],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","names":[],"sources":["../src/logger.ts"],"sourcesContent":["import { warn } from './_dev';\nimport { isUnsafeObjectKey } from './_prototype';\nimport { consoleTransport, DEFAULT_THEME, renderGroup } from './console';\nimport { isLazy } from './lazy';\nimport type { Bindings, LogEntry, Logger, LogLevel, LogMiddleware, LogType, RuneOptions, Transport } from './types';\nimport { isLevelEnabled } from './types';\n\n/* --- Arg parsing (simplified) --- */\n\nfunction serializeError(err: Error): { message: string; name: string; stack?: string } {\n return { message: err.message, name: err.name, stack: err.stack };\n}\n\n/**\n * Resolve lazy bindings and serialize Errors in a single pass.\n * Always allocates a fresh object — the result is never an alias of the input.\n */\nfunction prepareBindings(bindings: Bindings): Bindings {\n const out: Bindings = {};\n\n for (const [k, v] of Object.entries(bindings)) {\n // Guard against a `__proto__`/`constructor`/`prototype` field name hijacking out's own\n // prototype via the bracket-assignment accessor — see _prototype.ts.\n if (isUnsafeObjectKey(k)) continue;\n\n const resolved = isLazy(v) ? v.factory() : v;\n\n out[k] = resolved instanceof Error ? serializeError(resolved) : resolved;\n }\n\n return out;\n}\n\ntype ParsedArgs = { context: Bindings | undefined; message: string | undefined };\n\nfunction parseArgs(first: unknown, second?: unknown, third?: unknown): ParsedArgs {\n if (typeof first === 'string') {\n return {\n context: second !== null && typeof second === 'object' ? (second as Bindings) : undefined,\n message: first,\n };\n }\n\n if (first instanceof Error) {\n const context = second !== null && typeof second === 'object' ? (second as Bindings) : {};\n const message = third !== undefined ? String(third) : typeof second === 'string' ? second : undefined;\n\n return { context: { err: serializeError(first), ...context }, message };\n }\n\n if (first !== null && typeof first === 'object') {\n return { context: first as Bindings, message: second !== undefined ? String(second) : undefined };\n }\n\n return { context: undefined, message: first === undefined ? undefined : String(first) };\n}\n\n/* --- Namespace joining --- */\n\n/**\n * Joins parent and child namespaces with '.' as separator.\n * Examples:\n * joinNamespace('api', 'auth') → 'api.auth'\n * joinNamespace('', 'api') → 'api'\n * joinNamespace('api', '') → 'api'\n */\nfunction joinNamespace(parent: string, child: string): string {\n if (!parent) return child;\n\n if (!child) return parent;\n\n return `${parent}.${child}`;\n}\n\n/* --- createLogger --- */\n\n/**\n * Creates an isolated logger instance.\n *\n * Accepts two call signatures:\n * - `createLogger()` / `createLogger(options)` — configure via `RuneOptions`\n * - `createLogger('namespace', options?)` — namespace shorthand + optional options\n *\n * Each instance has its own immutable config (logLevel, transports, middleware).\n * To change the log level at runtime, create a new logger or child.\n */\nexport function createLogger(namespace: string, options?: Omit<RuneOptions, 'namespace'>): Logger;\nexport function createLogger(options?: RuneOptions): Logger;\nexport function createLogger(initial: RuneOptions | string = {}, extra?: Omit<RuneOptions, 'namespace'>): Logger {\n const initialOpts: RuneOptions = typeof initial === 'string' ? { namespace: initial, ...extra } : initial;\n\n const logLevel: LogLevel = initialOpts.logLevel ?? 'debug';\n const middleware: LogMiddleware[] = [...(initialOpts.middleware ?? [])];\n const namespace: string = initialOpts.namespace ?? '';\n const transports = [...(initialOpts.transports ?? [consoleTransport()])];\n const ownBindings: Bindings = { ...(initialOpts.bindings ?? {}) };\n\n const disposeController = new AbortController();\n let isDisposed = false;\n\n const passes = (type: LogType): boolean => isLevelEnabled(logLevel, type);\n const namespaceSuffix = (): string => (namespace ? ` (namespace: \"${namespace}\")` : '');\n\n const dispatch = (entry: LogEntry): void => {\n let current = entry;\n\n for (const transform of middleware) {\n try {\n const next = transform(current);\n\n if (next === null || next === undefined) return;\n\n current = next;\n } catch (err) {\n warn(`Middleware threw and dropped this entry${namespaceSuffix()}: ${String(err)}`);\n return;\n }\n }\n\n for (const transport of transports) {\n try {\n transport(current);\n } catch (err) {\n warn(`Transport threw an unhandled error${namespaceSuffix()}: ${String(err)}`);\n }\n }\n };\n\n const emit = (type: LogType, first: unknown, second?: unknown, third?: unknown): void => {\n if (isDisposed) return;\n\n if (!passes(type)) return;\n\n const { context, message } = parseArgs(first, second, third);\n // prepareBindings() always allocates a fresh object, so `data` is never an alias of `ownBindings`.\n const data: Bindings = context\n ? { ...prepareBindings(ownBindings), ...prepareBindings(context) }\n : prepareBindings(ownBindings);\n\n dispatch({\n data,\n level: type,\n message,\n namespace,\n timestamp: new Date(),\n });\n };\n\n const timeImpl = <T>(label: string, fn: () => T, level: LogType = 'debug'): T => {\n const start = performance.now();\n\n const done = (thrownErr?: unknown): void => {\n const duration_ms = Math.round((performance.now() - start) * 100) / 100;\n const ctx: Bindings = { duration_ms };\n\n if (thrownErr !== undefined)\n ctx.err = serializeError(thrownErr instanceof Error ? thrownErr : new Error(String(thrownErr)));\n\n emit(level, ctx, label);\n };\n\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result.then(\n (v) => {\n done();\n\n return v;\n },\n (err: unknown) => {\n done(err);\n\n return Promise.reject(err) as never;\n },\n ) as T;\n }\n\n done();\n\n return result;\n } catch (err) {\n done(err);\n throw err;\n }\n };\n\n const wrapGroup = <T>(collapsed: boolean, label: string, fn: () => T, level?: LogType): T => {\n if (isDisposed || logLevel === 'off') return fn();\n\n if (level !== undefined && !passes(level)) {\n return fn();\n }\n\n renderGroup(collapsed, label, namespace, DEFAULT_THEME);\n\n try {\n const result = fn();\n\n if (result instanceof Promise) return result.finally(() => console.groupEnd()) as T;\n\n console.groupEnd();\n\n return result;\n } catch (err) {\n console.groupEnd();\n throw err;\n }\n };\n\n const childLogger = (overrides: RuneOptions = {}): Logger =>\n createLogger({\n bindings: { ...ownBindings, ...(overrides.bindings ?? {}) },\n logLevel: overrides.logLevel ?? logLevel,\n middleware: overrides.middleware ?? middleware,\n namespace: overrides.namespace !== undefined ? joinNamespace(namespace, overrides.namespace) : namespace,\n transports: overrides.transports ?? transports,\n });\n\n const logger: Logger = {\n get bindings(): Readonly<Bindings> {\n return { ...ownBindings };\n },\n\n child: childLogger,\n\n debug: (first: unknown, second?: unknown, third?: unknown) => emit('debug', first, second, third),\n\n get disposalSignal(): AbortSignal {\n return disposeController.signal;\n },\n\n dispose: (): void => {\n if (isDisposed) return;\n\n isDisposed = true;\n disposeController.abort();\n },\n\n get disposed(): boolean {\n return isDisposed;\n },\n\n enabled: (type: LogLevel): boolean => isLevelEnabled(logLevel, type),\n\n error: (first: unknown, second?: unknown, third?: unknown) => emit('error', first, second, third),\n\n fatal: (first: unknown, second?: unknown, third?: unknown) => emit('fatal', first, second, third),\n\n group: (label, fn, level) => wrapGroup(false, label, fn, level),\n\n groupCollapsed: (label, fn, level) => wrapGroup(true, label, fn, level),\n\n info: (first: unknown, second?: unknown, third?: unknown) => emit('info', first, second, third),\n\n get logLevel(): LogLevel {\n return logLevel;\n },\n\n get middleware(): readonly LogMiddleware[] {\n return [...middleware];\n },\n\n get namespace(): string {\n return namespace;\n },\n\n [Symbol.dispose](): void {\n logger.dispose();\n },\n\n time: timeImpl,\n\n get transports(): readonly Transport[] {\n return [...transports];\n },\n\n use: (transform: LogMiddleware): Logger => childLogger({ middleware: [...middleware, transform] }),\n\n warn: (first: unknown, second?: unknown, third?: unknown) => emit('warn', first, second, third),\n\n withBindings: (bindings: Bindings): Logger => childLogger({ bindings }),\n };\n\n return logger;\n}\n"],"mappings":"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"}
package/dist/rune.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e={debug:0,error:3,fatal:4,info:1,off:5,warn:2};function t(t,n){return n!==`off`&&e[t]<=e[n]}function n(e,t,n){let r=Object.keys(e).length>0,i=n&&r?n(e):r?e:void 0;return i!==void 0&&t!==void 0?[t,i]:i===void 0?t===void 0?[]:[t]:[i]}var r={debug:{badge:`🅳`,bg:`#616161`,border:`#424242`,color:`#e0e0e0`},error:{badge:`🅴`,bg:`#d32f2f`,border:`#c62828`,color:`#fff`},fatal:{badge:`🅵`,bg:`#4a148c`,border:`#38006b`,color:`#fff`},group:{badge:`🅶`,bg:`#546e7a`,border:`#455a64`,color:`#fff`},info:{badge:`🅸`,bg:`#1976d2`,border:`#1565c0`,color:`#fff`},ns:{badge:``,bg:`#424242`,border:`#212121`,color:`#fff`},warn:{badge:`🆆`,bg:`#ffb300`,border:`#ffa000`,color:`#212121`}},i=`border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;`,a={debug:`log`,error:`error`,fatal:`error`,info:`info`,warn:`warn`};function o(e){if(!e)return r;let t={...r};for(let n of Object.keys(e)){let i=e[n];i&&(t[n]={...r[n],...i})}return t}function s(e){return[parseInt(e.slice(1,3),16),parseInt(e.slice(3,5),16),parseInt(e.slice(5,7),16)]}function c(e,t){let[n,r,i]=s(e);return`\x1b[38;2;${n};${r};${i}m${t}\x1b[0m`}function l(e){return`\x1b[90m${e}\x1b[0m`}function u(){return typeof window<`u`?!1:globalThis.process?.stdout?.isTTY===!0}function d(e,t=``){return`background: ${e.bg}; color: ${e.color}; border: 1px solid ${e.border}; border-radius: 4px; padding: 0 1px${t}`}function f(e){return e.replace(/%/g,`%%`)}function p(e,t,n,r,i){let a=e[t],o=f(a.badge),s=[i?c(a.bg,o):o];if(n){let e=f(n);s.push(i?l(`[${e}]`):`[${e}]`)}return r&&s.push(i?l(r):r),`${s.join(` | `)} |`}function m(e,t,n,r){let a=`%c${f(e[t].badge)}%c`,o=[d(e[t]),``];return n&&(a+=` %c${f(n)}%c`,o.push(d(e.ns,`; ${i}`),``)),r&&(a+=` %c${r}%c`,o.push(`color: gray`,``)),{fmt:a,parts:o}}function h(e={}){let r=e.level??`debug`,i=e.timestamp??!0,s=e.format??`raw`,c=typeof window>`u`,l=e.ansi??(c?u():!1),d=o(e.theme),f=s===`json`?e=>JSON.stringify(e):e.inspectFn;return e=>{if(!t(r,e.level))return;let o=i?e.timestamp.toISOString().slice(11,23):``,s=n(e.data,e.message,f),u=console[a[e.level]];if(c)u(p(d,e.level,e.namespace,o,l),...s);else{let{fmt:t,parts:n}=m(d,e.level,e.namespace,o);u(t,...n,...s)}}}function g(e,t,n,r){let a=e?console.groupCollapsed:console.group;if(typeof window>`u`){let e=[r.group.badge,f(t)];n&&e.push(`[${f(n)}]`),a(e.join(` | `));return}let o=`${r.group.badge} %c${f(t)}%c`,s=[d(r.group,`; margin-right: 6px; padding: 1px 3px 0`),``];n&&(o+=` %c${f(n)}%c`,s.push(d(r.ns,`; ${i}; margin-right: 6px`),``)),a(o,...s)}var _=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},v=class extends _{},y=Symbol(`rune.lazy`);function b(e){return typeof e==`object`&&!!e&&e[y]===!0}function x(e){return{factory:e,[y]:!0}}var S=new Set([`__proto__`,`constructor`,`prototype`]);function C(e){return S.has(e)}function w(e){return{message:e.message,name:e.name,stack:e.stack}}function T(e){let t={};for(let[n,r]of Object.entries(e)){if(C(n))continue;let e=b(r)?r.factory():r;t[n]=e instanceof Error?w(e):e}return t}function E(e,t,n){if(typeof e==`string`)return{context:void 0,message:e};if(e instanceof Error){let r=typeof t==`object`&&t?t:{};return{context:{err:w(e),...r},message:n===void 0?t!==void 0&&typeof t!=`object`?String(t):void 0:String(n)}}return typeof e==`object`&&e?{context:e,message:t===void 0?void 0:String(t)}:{context:void 0,message:e===void 0?void 0:String(e)}}function D(e,t){return e?t?`${e}.${t}`:e:t}function O(e={},n){let i=typeof e==`string`?{namespace:e,...n}:e,a=i.logLevel??`debug`,o=i.middleware??[],s=i.namespace??``,c=i.transports??[h()],l={...i.bindings??{}},u=new AbortController,d=!1,f=e=>t(a,e),p=()=>s?` (namespace: "${s}")`:``,m=e=>{let t=e;if(o.length>0){let n=e;for(let e of o)try{let t=e(n);if(t==null)return;n=t}catch(e){`${p()}${String(e)}`;return}t=n}for(let e of c)try{e(t)}catch(e){`${p()}${String(e)}`}},_=(e,t,n,r)=>{if(d||!f(e))return;let{context:i,message:a}=E(t,n,r),o=i?{...T(l),...T(i)}:T(l);m({data:o,level:e,message:a,namespace:s,timestamp:new Date})},v=(e,t,n=`debug`)=>{let r=performance.now(),i=t=>{let i={duration_ms:Math.round((performance.now()-r)*100)/100};t!==void 0&&(i.err=w(t instanceof Error?t:Error(String(t)))),_(n,i,e)};try{let e=t();return e instanceof Promise?e.then(e=>(i(),e),e=>(i(e),Promise.reject(e))):(i(),e)}catch(e){throw i(e),e}},y=(e,t,n,i)=>{if(d||a===`off`||i!==void 0&&!f(i))return n();g(e,t,s,r);try{let e=n();return e instanceof Promise?e.finally(()=>console.groupEnd()):(console.groupEnd(),e)}catch(e){throw console.groupEnd(),e}},b=(e={})=>O({bindings:{...l,...e.bindings??{}},logLevel:e.logLevel??a,middleware:e.middleware??o,namespace:e.namespace===void 0?s:D(s,e.namespace),transports:e.transports??c}),x={get bindings(){return{...l}},child:b,debug:(e,t,n)=>_(`debug`,e,t,n),get disposalSignal(){return u.signal},dispose:()=>{d||(d=!0,u.abort())},get disposed(){return d},enabled:e=>t(a,e),error:(e,t,n)=>_(`error`,e,t,n),fatal:(e,t,n)=>_(`fatal`,e,t,n),group:(e,t,n)=>y(!1,e,t,n),groupCollapsed:(e,t,n)=>y(!0,e,t,n),info:(e,t,n)=>_(`info`,e,t,n),get logLevel(){return a},get middleware(){return[...o]},get namespace(){return s},[Symbol.dispose](){x.dispose()},time:v,get transports(){return[...c]},use:e=>b({middleware:[...o,e]}),warn:(e,t,n)=>_(`warn`,e,t,n),withBindings:e=>b({bindings:e})};return x}var k=O();function A(){return typeof window>`u`&&globalThis.process?.env?.NODE_ENV===`production`?`production`:`development`}function j(e){let{handler:n}=e,r=e.level??`debug`,i=e.env??A(),a=e.onError??(e=>(`${String(e)}`,void 0));return e=>{if(!t(r,e.level))return;let o={data:Object.keys(e.data).length>0?e.data:void 0,env:i,level:e.level,message:e.message,namespace:e.namespace||void 0,timestamp:e.timestamp.toISOString()};Promise.resolve().then(()=>n(e.level,o)).catch(e=>a(e,o))}}function M(){let e=new WeakSet;return(t,n)=>{if(typeof n==`object`&&n){if(e.has(n))return`[Circular]`;e.add(n)}return n}}function N(e={}){let n=e.level??`debug`,r=e.fields??{},i=r.level??`level`,a=r.time??`time`,o=r.ns??`ns`,s=r.msg??`msg`,c=e.safe??!1,l=e.output??(e=>{globalThis.process?.stdout?.write(`${e}\n`)});return e=>{if(!t(n,e.level))return;let r={...e.data,[i]:e.level,[a]:e.timestamp.toISOString(),...e.namespace&&{[o]:e.namespace},...e.message!==void 0&&{[s]:e.message}};l(JSON.stringify(r,c?M():void 0))}}function P(e,t){if(!Number.isFinite(e))throw new v(`${t} must be a finite number`)}function F(e,t){if(P(e,t),!Number.isInteger(e)||e<0)throw new v(`${t} must be a non-negative integer`)}function I(e,t){if(P(e,t),!Number.isInteger(e)||e<=0)throw new v(`${t} must be a positive integer`)}function L(e){let n=e.level??`debug`,r=e.maxSize??50,i=e.maxBuffer,a=e.interval??5e3;if(P(a,`batchTransport interval`),a<=0)throw new v(`batchTransport interval must be greater than zero`);I(r,`batchTransport maxSize`),i!==void 0&&F(i,`batchTransport maxBuffer`);let o=[],s,c,l=!1,u=Promise.resolve(),d,f=async t=>{try{await e.onFlush(t)}catch(n){try{e.onFlushError?.(t,n)}catch(e){`${String(e)}`}throw n}},p=e=>{let t=u.then(()=>f(e));return u=t.catch(()=>void 0),t},m=()=>{if(o.length===0)return u;let e=o;return o=[],p(e)},h=()=>{m().catch(e=>{c??={error:e}})},g=e=>{l||t(n,e.level)&&(s||=setInterval(h,a),o.push(e),i!==void 0&&o.length>i&&(o=o.slice(o.length-i)),o.length>=r&&h())},_={dispose(){return d||(l=!0,s&&=(clearInterval(s),void 0),d=m().then(()=>{if(c)throw c.error}),d)},get disposed(){return l},flush:m,[Symbol.asyncDispose](){return _.dispose()},transport:g};return _}function R(e){let{rate:n,transport:r}=e,i=e.level??`debug`;if(P(n,`sampleTransport rate`),n<0||n>1)throw new v(`sampleTransport rate must be between zero and one`);return e=>{t(i,e.level)&&Math.random()<n&&r(e)}}function z(e){let{keys:t,maxDepth:n=20,replacement:r=`[REDACTED]`,transport:i}=e;F(n,`redactTransport maxDepth`);for(let e of t)e.includes(`.`)&&`${e}`;let a=new Set(t);function o(e,t=0){return t>n?(`${n}${n}`,e):Array.isArray(e)?e.map(e=>o(e,t+1)):typeof e==`object`&&e?s(e,t+1):e}function s(e,t=0){let n={};for(let[i,s]of Object.entries(e))C(i)||(n[i]=a.has(i)?r:o(s,t));return n}return e=>{i({...e,data:s(e.data)})}}function B(e,...t){let n,r;return typeof e==`function`?(n={},r=[e,...t]):(n=e,r=t),e=>{for(let t of r)try{t(e)}catch(t){n.onError?.(t,e)}}}exports.DEFAULT_THEME=r,exports.PRIORITY=e,exports.RuneConfigError=v,exports.RuneError=_,exports.batchTransport=L,exports.consoleTransport=h,exports.createLogger=O,exports.defaultLogger=k,exports.isLevelEnabled=t,exports.jsonTransport=N,exports.lazy=x,exports.pipe=B,exports.redactTransport=z,exports.remoteTransport=j,exports.resolveTheme=o,exports.sampleTransport=R;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e={debug:0,error:3,fatal:4,info:1,off:5,warn:2};function t(t,n){return n!==`off`&&e[t]<=e[n]}function n(e,t,n){let r=Object.keys(e).length>0,i=n&&r?n(e):r?e:void 0;return i!==void 0&&t!==void 0?[t,i]:i===void 0?t===void 0?[]:[t]:[i]}var r={debug:{badge:`🅳`,bg:`#616161`,border:`#424242`,color:`#e0e0e0`},error:{badge:`🅴`,bg:`#d32f2f`,border:`#c62828`,color:`#fff`},fatal:{badge:`🅵`,bg:`#4a148c`,border:`#38006b`,color:`#fff`},group:{badge:`🅶`,bg:`#546e7a`,border:`#455a64`,color:`#fff`},info:{badge:`🅸`,bg:`#1976d2`,border:`#1565c0`,color:`#fff`},ns:{badge:``,bg:`#424242`,border:`#212121`,color:`#fff`},warn:{badge:`🆆`,bg:`#ffb300`,border:`#ffa000`,color:`#212121`}},i=`border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;`,a={debug:`log`,error:`error`,fatal:`error`,info:`info`,warn:`warn`};function o(e){if(!e)return r;let t={...r};for(let n of Object.keys(e)){let i=e[n];i&&(t[n]={...r[n],...i})}return t}function s(e){return[parseInt(e.slice(1,3),16),parseInt(e.slice(3,5),16),parseInt(e.slice(5,7),16)]}function c(e,t){let[n,r,i]=s(e);return`\x1b[38;2;${n};${r};${i}m${t}\x1b[0m`}function l(e){return`\x1b[90m${e}\x1b[0m`}function u(){return typeof window<`u`?!1:globalThis.process?.stdout?.isTTY===!0}function d(e,t=``){return`background: ${e.bg}; color: ${e.color}; border: 1px solid ${e.border}; border-radius: 4px; padding: 0 1px${t}`}function f(e){return e.replace(/%/g,`%%`)}function p(e,t,n,r,i){let a=e[t],o=f(a.badge),s=[i?c(a.bg,o):o];if(n){let e=f(n);s.push(i?l(`[${e}]`):`[${e}]`)}return r&&s.push(i?l(r):r),`${s.join(` | `)} |`}function m(e,t,n,r){let a=`%c${f(e[t].badge)}%c`,o=[d(e[t]),``];return n&&(a+=` %c${f(n)}%c`,o.push(d(e.ns,`; ${i}`),``)),r&&(a+=` %c${r}%c`,o.push(`color: gray`,``)),{fmt:a,parts:o}}function h(e={}){let r=e.level??`debug`,i=e.timestamp??!0,s=e.format??`raw`,c=typeof window>`u`,l=e.ansi??(c?u():!1),d=o(e.theme),f=s===`json`?e=>JSON.stringify(e):e.inspectFn;return e=>{if(!t(r,e.level))return;let o=i?e.timestamp.toISOString().slice(11,23):``,s=n(e.data,e.message,f),u=console[a[e.level]];if(c)u(p(d,e.level,e.namespace,o,l),...s);else{let{fmt:t,parts:n}=m(d,e.level,e.namespace,o);u(t,...n,...s)}}}function g(e,t,n,r){let a=e?console.groupCollapsed:console.group;if(typeof window>`u`){let e=[r.group.badge,f(t)];n&&e.push(`[${f(n)}]`),a(e.join(` | `));return}let o=`${r.group.badge} %c${f(t)}%c`,s=[d(r.group,`; margin-right: 6px; padding: 1px 3px 0`),``];n&&(o+=` %c${f(n)}%c`,s.push(d(r.ns,`; ${i}; margin-right: 6px`),``)),a(o,...s)}var _=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},v=class extends _{},y=Symbol(`rune.lazy`);function b(e){return typeof e==`object`&&!!e&&e[y]===!0}function x(e){return{factory:e,[y]:!0}}var S=new Set([`__proto__`,`constructor`,`prototype`]);function C(e){return S.has(e)}function w(e){return{message:e.message,name:e.name,stack:e.stack}}function T(e){let t={};for(let[n,r]of Object.entries(e)){if(C(n))continue;let e=b(r)?r.factory():r;t[n]=e instanceof Error?w(e):e}return t}function E(e,t,n){if(typeof e==`string`)return{context:typeof t==`object`&&t?t:void 0,message:e};if(e instanceof Error){let r=typeof t==`object`&&t?t:{},i=n===void 0?typeof t==`string`?t:void 0:String(n);return{context:{err:w(e),...r},message:i}}return typeof e==`object`&&e?{context:e,message:t===void 0?void 0:String(t)}:{context:void 0,message:e===void 0?void 0:String(e)}}function D(e,t){return e?t?`${e}.${t}`:e:t}function O(e={},n){let i=typeof e==`string`?{namespace:e,...n}:e,a=i.logLevel??`debug`,o=[...i.middleware??[]],s=i.namespace??``,c=[...i.transports??[h()]],l={...i.bindings??{}},u=new AbortController,d=!1,f=e=>t(a,e),p=()=>s?` (namespace: "${s}")`:``,m=e=>{let t=e;for(let e of o)try{let n=e(t);if(n==null)return;t=n}catch(e){`${p()}${String(e)}`;return}for(let e of c)try{e(t)}catch(e){`${p()}${String(e)}`}},_=(e,t,n,r)=>{if(d||!f(e))return;let{context:i,message:a}=E(t,n,r),o=i?{...T(l),...T(i)}:T(l);m({data:o,level:e,message:a,namespace:s,timestamp:new Date})},v=(e,t,n=`debug`)=>{let r=performance.now(),i=t=>{let i={duration_ms:Math.round((performance.now()-r)*100)/100};t!==void 0&&(i.err=w(t instanceof Error?t:Error(String(t)))),_(n,i,e)};try{let e=t();return e instanceof Promise?e.then(e=>(i(),e),e=>(i(e),Promise.reject(e))):(i(),e)}catch(e){throw i(e),e}},y=(e,t,n,i)=>{if(d||a===`off`||i!==void 0&&!f(i))return n();g(e,t,s,r);try{let e=n();return e instanceof Promise?e.finally(()=>console.groupEnd()):(console.groupEnd(),e)}catch(e){throw console.groupEnd(),e}},b=(e={})=>O({bindings:{...l,...e.bindings??{}},logLevel:e.logLevel??a,middleware:e.middleware??o,namespace:e.namespace===void 0?s:D(s,e.namespace),transports:e.transports??c}),x={get bindings(){return{...l}},child:b,debug:(e,t,n)=>_(`debug`,e,t,n),get disposalSignal(){return u.signal},dispose:()=>{d||(d=!0,u.abort())},get disposed(){return d},enabled:e=>t(a,e),error:(e,t,n)=>_(`error`,e,t,n),fatal:(e,t,n)=>_(`fatal`,e,t,n),group:(e,t,n)=>y(!1,e,t,n),groupCollapsed:(e,t,n)=>y(!0,e,t,n),info:(e,t,n)=>_(`info`,e,t,n),get logLevel(){return a},get middleware(){return[...o]},get namespace(){return s},[Symbol.dispose](){x.dispose()},time:v,get transports(){return[...c]},use:e=>b({middleware:[...o,e]}),warn:(e,t,n)=>_(`warn`,e,t,n),withBindings:e=>b({bindings:e})};return x}function k(){return typeof window<`u`?`development`:globalThis.process?.env?.NODE_ENV===`production`?`production`:`development`}function A(e){let{handler:n}=e,r=e.level??`debug`,i=e.env??k(),a=e.onError??(e=>(`${String(e)}`,void 0));return e=>{if(!t(r,e.level))return;let o={data:Object.keys(e.data).length>0?e.data:void 0,env:i,level:e.level,message:e.message,namespace:e.namespace||void 0,timestamp:e.timestamp.toISOString()};Promise.resolve().then(()=>n(e.level,o)).catch(e=>{try{a(e,o)}catch(e){`${String(e)}`}})}}function j(){let e=new WeakSet;return(t,n)=>{if(typeof n==`object`&&n){if(e.has(n))return`[Circular]`;e.add(n)}return n}}function M(e={}){let n=e.level??`debug`,r=e.fields??{},i=r.level??`level`,a=r.time??`time`,o=r.ns??`ns`,s=r.msg??`msg`,c=e.safe??!1,l=e.output??(e=>{globalThis.process?.stdout?.write(`${e}\n`)});return e=>{if(!t(n,e.level))return;let r={...e.data,[i]:e.level,[a]:e.timestamp.toISOString(),...e.namespace&&{[o]:e.namespace},...e.message!==void 0&&{[s]:e.message}};l(JSON.stringify(r,c?j():void 0))}}function N(e,t){if(!Number.isFinite(e))throw new v(`${t} must be a finite number`)}function P(e,t){if(N(e,t),!Number.isInteger(e)||e<0)throw new v(`${t} must be a non-negative integer`)}function F(e,t){if(N(e,t),!Number.isInteger(e)||e<=0)throw new v(`${t} must be a positive integer`)}function I(e){let n=e.level??`debug`,r=e.maxSize??50,i=e.maxBuffer,a=e.interval??5e3;if(N(a,`batchTransport interval`),a<=0)throw new v(`batchTransport interval must be greater than zero`);F(r,`batchTransport maxSize`),i!==void 0&&P(i,`batchTransport maxBuffer`);let o=[],s,c,l=!1,u=Promise.resolve(),d,f=async t=>{try{await e.onFlush(t)}catch(n){try{e.onFlushError?.(t,n)}catch(e){`${String(e)}`}throw n}},p=e=>{let t=u.then(()=>f(e));return u=t.catch(()=>void 0),t},m=()=>{if(o.length===0)return u;let e=o;return o=[],p(e)},h=()=>{m().catch(e=>{c??={error:e}})},g=e=>{!l&&t(n,e.level)&&(s||=setInterval(h,a),o.push(e),i!==void 0&&o.length>i&&(o=o.slice(o.length-i)),o.length>=r&&h())},_={dispose(){return d||(l=!0,s&&clearInterval(s),s=void 0,d=m().then(()=>{if(c)throw c.error}),d)},get disposed(){return l},flush:m,[Symbol.asyncDispose](){return _.dispose()},transport:g};return _}function L(e){let{rate:n,transport:r}=e,i=e.level??`debug`;if(N(n,`sampleTransport rate`),n<0||n>1)throw new v(`sampleTransport rate must be between zero and one`);return e=>{t(i,e.level)&&Math.random()<n&&r(e)}}function R(e){let{keys:t,maxDepth:n=20,replacement:r=`[REDACTED]`,transport:i}=e;P(n,`redactTransport maxDepth`);for(let e of t)e.includes(`.`)&&`${e}`;let a=new Set(t),o=!1,s=(e,t)=>{if(typeof e!=`object`||!e)return e;if(t>n)return o||=(`${n}`,!0),r;if(Array.isArray(e))return e.map(e=>s(e,t+1));let i={};for(let[n,o]of Object.entries(e))C(n)||(i[n]=a.has(n)?r:s(o,t+1));return i};return e=>i({...e,data:s(e.data,0)})}exports.DEFAULT_THEME=r,exports.PRIORITY=e,exports.RuneConfigError=v,exports.RuneError=_,exports.batchTransport=I,exports.consoleTransport=h,exports.createLogger=O,exports.isLevelEnabled=t,exports.jsonTransport=M,exports.lazy=x,exports.redactTransport=R,exports.remoteTransport=A,exports.resolveTheme=o,exports.sampleTransport=L;
2
2
  //# sourceMappingURL=rune.cjs.map