@vielzeug/rune 2.2.0 → 26.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +3 -29
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +1 -5
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/_prototype.cjs +1 -1
  7. package/dist/_prototype.cjs.map +1 -1
  8. package/dist/_prototype.js +1 -12
  9. package/dist/_prototype.js.map +1 -1
  10. package/dist/console.cjs +1 -1
  11. package/dist/console.cjs.map +1 -1
  12. package/dist/console.js +1 -131
  13. package/dist/console.js.map +1 -1
  14. package/dist/errors.cjs +1 -1
  15. package/dist/errors.cjs.map +1 -1
  16. package/dist/errors.js +1 -9
  17. package/dist/errors.js.map +1 -1
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.d.ts +3 -3
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -7
  22. package/dist/lazy.cjs +1 -1
  23. package/dist/lazy.cjs.map +1 -1
  24. package/dist/lazy.js +1 -14
  25. package/dist/lazy.js.map +1 -1
  26. package/dist/logger.cjs +1 -1
  27. package/dist/logger.cjs.map +1 -1
  28. package/dist/logger.d.ts +0 -1
  29. package/dist/logger.d.ts.map +1 -1
  30. package/dist/logger.js +1 -160
  31. package/dist/logger.js.map +1 -1
  32. package/dist/rune.cjs +1 -1
  33. package/dist/rune.cjs.map +1 -1
  34. package/dist/rune.iife.js +1 -1
  35. package/dist/rune.iife.js.map +1 -1
  36. package/dist/rune.js +1 -1
  37. package/dist/rune.js.map +1 -1
  38. package/dist/transports.cjs +1 -1
  39. package/dist/transports.cjs.map +1 -1
  40. package/dist/transports.d.ts +4 -72
  41. package/dist/transports.d.ts.map +1 -1
  42. package/dist/transports.js +1 -143
  43. package/dist/transports.js.map +1 -1
  44. package/dist/types.cjs +1 -1
  45. package/dist/types.cjs.map +1 -1
  46. package/dist/types.d.ts +28 -83
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/types.js +1 -15
  49. package/dist/types.js.map +1 -1
  50. package/package.json +7 -7
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/_dev.cjs CHANGED
@@ -1,2 +1,2 @@
1
- function e(e){}exports.warn=e;
1
+ function warn(e){}exports.warn=warn;
2
2
  //# sourceMappingURL=_dev.cjs.map
package/dist/_dev.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __RUNE_PROD__?: boolean }).__RUNE_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/rune] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgB,EAAK,EAAmB,CAExC"}
1
+ {"version":3,"file":"_dev.cjs","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __RUNE_PROD__?: boolean }).__RUNE_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/rune] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgB,KAAK,EAAmB,CAExC"}
package/dist/_dev.js CHANGED
@@ -1,6 +1,2 @@
1
- //#region src/_dev.ts
2
- function e(e) {}
3
- //#endregion
4
- export { e as warn };
5
-
1
+ function warn(e){}export{warn};
6
2
  //# sourceMappingURL=_dev.js.map
package/dist/_dev.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __RUNE_PROD__?: boolean }).__RUNE_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/rune] ${msg}`);\n}\n"],"mappings":";AAGA,SAAgB,EAAK,GAAmB,CAExC"}
1
+ {"version":3,"file":"_dev.js","names":[],"sources":["../src/_dev.ts"],"sourcesContent":["const isDev = !(globalThis as { __RUNE_PROD__?: boolean }).__RUNE_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/rune] ${msg}`);\n}\n"],"mappings":"AAGA,SAAgB,KAAK,EAAmB,CAExC"}
@@ -1,2 +1,2 @@
1
- var e=new Set([`__proto__`,`constructor`,`prototype`]);function t(t){return e.has(t)}exports.isUnsafeObjectKey=t;
1
+ var e=new Set([`__proto__`,`constructor`,`prototype`]);function isUnsafeObjectKey(t){return e.has(t)}exports.isUnsafeObjectKey=isUnsafeObjectKey;
2
2
  //# sourceMappingURL=_prototype.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_prototype.cjs","names":[],"sources":["../src/_prototype.ts"],"sourcesContent":["/**\n * Property names that must never be used as a bracket-assignment key on a plain object literal —\n * `obj[key] = value` for `key === '__proto__'` invokes `Object.prototype`'s `__proto__` accessor\n * and reassigns `obj`'s own prototype instead of setting an own property. `constructor` and\n * `prototype` are excluded defensively for the same class of risk.\n *\n * Used when rebuilding a caller-supplied `Bindings` object key-by-key (`logger.ts`'s\n * `serializeErrors()`, `transports.ts`'s `redactObject()`) — bindings/context ultimately come\n * from application code, but nothing prevents an app from passing through attacker-controlled\n * data (e.g. `log.info(JSON.parse(untrustedInput))`).\n *\n * @internal\n */\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** @internal */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n"],"mappings":"AAaA,IAAM,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgB,EAAkB,EAAsB,CACtD,OAAO,EAAmB,IAAI,CAAG,CACnC"}
1
+ {"version":3,"file":"_prototype.cjs","names":[],"sources":["../src/_prototype.ts"],"sourcesContent":["/**\n * Property names that must never be used as a bracket-assignment key on a plain object literal —\n * `obj[key] = value` for `key === '__proto__'` invokes `Object.prototype`'s `__proto__` accessor\n * and reassigns `obj`'s own prototype instead of setting an own property. `constructor` and\n * `prototype` are excluded defensively for the same class of risk.\n *\n * Used when rebuilding a caller-supplied `Bindings` object key-by-key (`logger.ts`'s\n * `serializeErrors()`, `transports.ts`'s `redactObject()`) — bindings/context ultimately come\n * from application code, but nothing prevents an app from passing through attacker-controlled\n * data (e.g. `log.info(JSON.parse(untrustedInput))`).\n *\n * @internal\n */\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** @internal */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n"],"mappings":"AAaA,IAAM,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgB,kBAAkB,EAAsB,CACtD,OAAO,EAAmB,IAAI,CAAG,CACnC"}
@@ -1,13 +1,2 @@
1
- //#region src/_prototype.ts
2
- var e = /* @__PURE__ */ new Set([
3
- "__proto__",
4
- "constructor",
5
- "prototype"
6
- ]);
7
- function t(t) {
8
- return e.has(t);
9
- }
10
- //#endregion
11
- export { t as isUnsafeObjectKey };
12
-
1
+ var e=new Set([`__proto__`,`constructor`,`prototype`]);function isUnsafeObjectKey(t){return e.has(t)}export{isUnsafeObjectKey};
13
2
  //# sourceMappingURL=_prototype.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_prototype.js","names":[],"sources":["../src/_prototype.ts"],"sourcesContent":["/**\n * Property names that must never be used as a bracket-assignment key on a plain object literal —\n * `obj[key] = value` for `key === '__proto__'` invokes `Object.prototype`'s `__proto__` accessor\n * and reassigns `obj`'s own prototype instead of setting an own property. `constructor` and\n * `prototype` are excluded defensively for the same class of risk.\n *\n * Used when rebuilding a caller-supplied `Bindings` object key-by-key (`logger.ts`'s\n * `serializeErrors()`, `transports.ts`'s `redactObject()`) — bindings/context ultimately come\n * from application code, but nothing prevents an app from passing through attacker-controlled\n * data (e.g. `log.info(JSON.parse(untrustedInput))`).\n *\n * @internal\n */\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** @internal */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n"],"mappings":";AAaA,IAAM,oBAAqB,IAAI,IAAI;CAAC;CAAa;CAAe;AAAW,CAAC;AAG5E,SAAgB,EAAkB,GAAsB;CACtD,OAAO,EAAmB,IAAI,CAAG;AACnC"}
1
+ {"version":3,"file":"_prototype.js","names":[],"sources":["../src/_prototype.ts"],"sourcesContent":["/**\n * Property names that must never be used as a bracket-assignment key on a plain object literal —\n * `obj[key] = value` for `key === '__proto__'` invokes `Object.prototype`'s `__proto__` accessor\n * and reassigns `obj`'s own prototype instead of setting an own property. `constructor` and\n * `prototype` are excluded defensively for the same class of risk.\n *\n * Used when rebuilding a caller-supplied `Bindings` object key-by-key (`logger.ts`'s\n * `serializeErrors()`, `transports.ts`'s `redactObject()`) — bindings/context ultimately come\n * from application code, but nothing prevents an app from passing through attacker-controlled\n * data (e.g. `log.info(JSON.parse(untrustedInput))`).\n *\n * @internal\n */\nconst UNSAFE_OBJECT_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** @internal */\nexport function isUnsafeObjectKey(key: string): boolean {\n return UNSAFE_OBJECT_KEYS.has(key);\n}\n"],"mappings":"AAaA,IAAM,EAAqB,IAAI,IAAI,CAAC,YAAa,cAAe,WAAW,CAAC,EAG5E,SAAgB,kBAAkB,EAAsB,CACtD,OAAO,EAAmB,IAAI,CAAG,CACnC"}
package/dist/console.cjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=require("./types.cjs");function t(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 n={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`}},r=`border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;`,i={debug:`log`,error:`error`,fatal:`error`,info:`info`,warn:`warn`};function a(e){if(!e)return n;let t={...n};for(let r of Object.keys(e)){let i=e[r];i&&(t[r]={...n[r],...i})}return t}function o(e){return[parseInt(e.slice(1,3),16),parseInt(e.slice(3,5),16),parseInt(e.slice(5,7),16)]}function s(e,t){let[n,r,i]=o(e);return`\x1b[38;2;${n};${r};${i}m${t}\x1b[0m`}function c(e){return`\x1b[90m${e}\x1b[0m`}function l(){return typeof window<`u`?!1:globalThis.process?.stdout?.isTTY===!0}function u(e,t=``){return`background: ${e.bg}; color: ${e.color}; border: 1px solid ${e.border}; border-radius: 4px; padding: 0 1px${t}`}function d(e){return e.replace(/%/g,`%%`)}function f(e,t,n,r,i){let a=e[t],o=d(a.badge),l=[i?s(a.bg,o):o];if(n){let e=d(n);l.push(i?c(`[${e}]`):`[${e}]`)}return r&&l.push(i?c(r):r),`${l.join(` | `)} |`}function p(e,t,n,i){let a=`%c${d(e[t].badge)}%c`,o=[u(e[t]),``];return n&&(a+=` %c${d(n)}%c`,o.push(u(e.ns,`; ${r}`),``)),i&&(a+=` %c${i}%c`,o.push(`color: gray`,``)),{fmt:a,parts:o}}function m(n={}){let r=n.level??`debug`,o=n.timestamp??!0,s=n.format??`raw`,c=typeof window>`u`,u=n.ansi??(c?l():!1),d=a(n.theme),m=s===`json`?e=>JSON.stringify(e):n.inspectFn;return n=>{if(!e.isLevelEnabled(r,n.level))return;let a=o?n.timestamp.toISOString().slice(11,23):``,s=t(n.data,n.message,m),l=console[i[n.level]];if(c)l(f(d,n.level,n.namespace,a,u),...s);else{let{fmt:e,parts:t}=p(d,n.level,n.namespace,a);l(e,...t,...s)}}}function h(e,t,n,i){let a=e?console.groupCollapsed:console.group;if(typeof window>`u`){let e=[i.group.badge,d(t)];n&&e.push(`[${d(n)}]`),a(e.join(` | `));return}let o=`${i.group.badge} %c${d(t)}%c`,s=[u(i.group,`; margin-right: 6px; padding: 1px 3px 0`),``];n&&(o+=` %c${d(n)}%c`,s.push(u(i.ns,`; ${r}; margin-right: 6px`),``)),a(o,...s)}exports.DEFAULT_THEME=n,exports.consoleTransport=m,exports.renderGroup=h,exports.resolveTheme=a;
1
+ const e=require("./types.cjs");function buildPayload(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 t={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`}},n=`border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;`,r={debug:`log`,error:`error`,fatal:`error`,info:`info`,warn:`warn`};function resolveTheme(e){if(!e)return t;let n={...t};for(let r of Object.keys(e)){let i=e[r];i&&(n[r]={...t[r],...i})}return n}function hexToRgb(e){return[parseInt(e.slice(1,3),16),parseInt(e.slice(3,5),16),parseInt(e.slice(5,7),16)]}function ansiColor(e,t){let[n,r,i]=hexToRgb(e);return`\x1b[38;2;${n};${r};${i}m${t}\x1b[0m`}function ansiMuted(e){return`\x1b[90m${e}\x1b[0m`}function supportsAnsi(){return typeof window<`u`?!1:globalThis.process?.stdout?.isTTY===!0}function badgeStyle(e,t=``){return`background: ${e.bg}; color: ${e.color}; border: 1px solid ${e.border}; border-radius: 4px; padding: 0 1px${t}`}function escapeConsoleFormat(e){return e.replace(/%/g,`%%`)}function buildNodePrefix(e,t,n,r,i){let a=e[t],o=escapeConsoleFormat(a.badge),s=[i?ansiColor(a.bg,o):o];if(n){let e=escapeConsoleFormat(n);s.push(i?ansiMuted(`[${e}]`):`[${e}]`)}return r&&s.push(i?ansiMuted(r):r),`${s.join(` | `)} |`}function buildBrowserPrefix(e,t,r,i){let a=`%c${escapeConsoleFormat(e[t].badge)}%c`,o=[badgeStyle(e[t]),``];return r&&(a+=` %c${escapeConsoleFormat(r)}%c`,o.push(badgeStyle(e.ns,`; ${n}`),``)),i&&(a+=` %c${i}%c`,o.push(`color: gray`,``)),{fmt:a,parts:o}}function consoleTransport(t={}){let n=t.level??`debug`,i=t.timestamp??!0,a=t.format??`raw`,o=typeof window>`u`,s=t.ansi??(o?supportsAnsi():!1),c=resolveTheme(t.theme),l=a===`json`?e=>JSON.stringify(e):t.inspectFn;return t=>{if(!e.isLevelEnabled(n,t.level))return;let a=i?t.timestamp.toISOString().slice(11,23):``,u=buildPayload(t.data,t.message,l),d=console[r[t.level]];if(o)d(buildNodePrefix(c,t.level,t.namespace,a,s),...u);else{let{fmt:e,parts:n}=buildBrowserPrefix(c,t.level,t.namespace,a);d(e,...n,...u)}}}function renderGroup(e,t,r,i){let a=e?console.groupCollapsed:console.group;if(typeof window>`u`){let e=[i.group.badge,escapeConsoleFormat(t)];r&&e.push(`[${escapeConsoleFormat(r)}]`),a(e.join(` | `));return}let o=`${i.group.badge} %c${escapeConsoleFormat(t)}%c`,s=[badgeStyle(i.group,`; margin-right: 6px; padding: 1px 3px 0`),``];r&&(o+=` %c${escapeConsoleFormat(r)}%c`,s.push(badgeStyle(i.ns,`; ${n}; margin-right: 6px`),``)),a(o,...s)}exports.DEFAULT_THEME=t,exports.consoleTransport=consoleTransport,exports.renderGroup=renderGroup,exports.resolveTheme=resolveTheme;
2
2
  //# sourceMappingURL=console.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"console.cjs","names":[],"sources":["../src/console.ts"],"sourcesContent":["import type { Bindings, LogEntry, LogLevel, LogType, Transport } from './types';\n\nimport { isLevelEnabled } from './types';\n\n/* ─── Console theme types ─── */\n\n/**\n * Per-level style definition for the console transport.\n * All fields are optional when providing a level override — unspecified fields fall back to the default theme.\n */\nexport type ConsoleThemeEntry = {\n badge: string;\n bg: string;\n border: string;\n color: string;\n};\n\n/**\n * Partial theme overrides merged on top of the default theme.\n * Each level entry is also partial — only specify the fields you want to change.\n *\n * @example\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n */\nexport type ConsoleTheme = Partial<Record<LogType | 'group' | 'ns', Partial<ConsoleThemeEntry>>>;\n\n/**\n * Fully-resolved console theme where every level and every field is populated.\n */\nexport type ResolvedTheme = Record<LogType | 'group' | 'ns', ConsoleThemeEntry>;\n\n/* ─── ConsoleTransportOptions ─── */\n\nexport type ConsoleTransportOptions = {\n /**\n * Enable ANSI 24-bit color output in Node.js.\n * Default: true when process.stdout.isTTY is true, false otherwise.\n */\n ansi?: boolean;\n /**\n * Object serialization format for Node.js output.\n * - 'json' — JSON.stringify (machine-readable, fails on circular refs)\n * - 'raw' — pass the object directly to the console method (default)\n * Default: 'raw'.\n */\n format?: 'json' | 'raw';\n /**\n * Custom object inspector function. When provided, the `data` object is\n * passed through this function before being written to the console.\n */\n inspectFn?: (value: unknown) => string;\n /** Minimum level to output. Default: 'debug'. */\n level?: LogLevel;\n /** Partial theme overrides merged on top of the default theme. */\n theme?: ConsoleTheme;\n /** Whether to include timestamp in console output. Default: true. */\n timestamp?: boolean;\n};\n\n/* ─── Payload builder ─── */\n\nfunction buildPayload(\n data: Readonly<Bindings>,\n message: string | undefined,\n inspectFn: ((v: unknown) => string) | undefined,\n): unknown[] {\n const hasData = Object.keys(data).length > 0;\n const formatted: unknown = inspectFn && hasData ? inspectFn(data) : hasData ? data : undefined;\n\n if (formatted !== undefined && message !== undefined) return [message, formatted];\n\n if (formatted !== undefined) return [formatted];\n\n if (message !== undefined) return [message];\n\n return [];\n}\n\n/* ─── Console theme ─── */\n\nexport const DEFAULT_THEME: ResolvedTheme = {\n debug: { badge: '🅳', bg: '#616161', border: '#424242', color: '#e0e0e0' },\n error: { badge: '🅴', bg: '#d32f2f', border: '#c62828', color: '#fff' },\n fatal: { badge: '🅵', bg: '#4a148c', border: '#38006b', color: '#fff' },\n group: { badge: '🅶', bg: '#546e7a', border: '#455a64', color: '#fff' },\n info: { badge: '🅸', bg: '#1976d2', border: '#1565c0', color: '#fff' },\n ns: { badge: '', bg: '#424242', border: '#212121', color: '#fff' },\n warn: { badge: '🆆', bg: '#ffb300', border: '#ffa000', color: '#212121' },\n};\n\nconst NS_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;';\n\nconst LOG_METHOD: Record<LogType, 'error' | 'info' | 'log' | 'warn'> = {\n debug: 'log',\n error: 'error',\n fatal: 'error',\n info: 'info',\n warn: 'warn',\n};\n\n/** Deep-merges per-level overrides onto the default theme. Only specified fields within each level entry are replaced. */\nexport function resolveTheme(override: ConsoleTheme | undefined): ResolvedTheme {\n if (!override) return DEFAULT_THEME;\n\n const result: ResolvedTheme = { ...DEFAULT_THEME };\n\n for (const key of Object.keys(override) as Array<LogType | 'group' | 'ns'>) {\n const entry = override[key];\n\n if (entry) result[key] = { ...DEFAULT_THEME[key], ...entry };\n }\n\n return result;\n}\n\n/* ─── ANSI helpers (Node) ─── */\n\nfunction hexToRgb(hex: string): [number, number, number] {\n return [parseInt(hex.slice(1, 3), 16), parseInt(hex.slice(3, 5), 16), parseInt(hex.slice(5, 7), 16)];\n}\n\nfunction ansiColor(hex: string, text: string): string {\n const [r, g, b] = hexToRgb(hex);\n\n return `\\x1b[38;2;${r};${g};${b}m${text}\\x1b[0m`;\n}\n\nfunction ansiMuted(text: string): string {\n return `\\x1b[90m${text}\\x1b[0m`;\n}\n\nfunction supportsAnsi(): boolean {\n if (typeof window !== 'undefined') return false;\n\n return (\n (globalThis as Record<string, unknown> & { process?: { stdout?: { isTTY?: boolean } } }).process?.stdout?.isTTY ===\n true\n );\n}\n\nfunction badgeStyle(entry: ConsoleThemeEntry, extra = ''): string {\n return `background: ${entry.bg}; color: ${entry.color}; border: 1px solid ${entry.border}; border-radius: 4px; padding: 0 1px${extra}`;\n}\n\nfunction escapeConsoleFormat(s: string): string {\n return s.replace(/%/g, '%%');\n}\n\n/**\n * Builds the Node console prefix string, passed as the first argument to `console.log()`/etc.\n * alongside the payload. `namespace` is escaped because Node's `console.*` methods run the first\n * string argument through `util.format` — an unescaped `%s`/`%d`/`%o`/etc. in a caller-controlled\n * namespace would consume and hide the actual payload arguments that follow (log forging).\n */\nfunction buildNodePrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n useAnsi: boolean,\n): string {\n const t = theme[type];\n const safeBadge = escapeConsoleFormat(t.badge);\n const badgeText = useAnsi ? ansiColor(t.bg, safeBadge) : safeBadge;\n const meta = [badgeText];\n\n if (namespace) {\n const safeNamespace = escapeConsoleFormat(namespace);\n\n meta.push(useAnsi ? ansiMuted(`[${safeNamespace}]`) : `[${safeNamespace}]`);\n }\n\n if (timestamp) meta.push(useAnsi ? ansiMuted(timestamp) : timestamp);\n\n return `${meta.join(' | ')} |`;\n}\n\nfunction buildBrowserPrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n): { fmt: string; parts: string[] } {\n let fmt = `%c${escapeConsoleFormat(theme[type].badge)}%c`;\n const parts: string[] = [badgeStyle(theme[type]), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}`), '');\n }\n\n if (timestamp) {\n fmt += ` %c${timestamp}%c`;\n parts.push('color: gray', '');\n }\n\n return { fmt, parts };\n}\n\n/* ─── consoleTransport ─── */\n\n/**\n * Formats and writes log entries to the browser or Node.js console.\n * Uses CSS-styled badges in browsers and plain text in Node.\n * Accepts an optional partial `theme` to override colors and badges per level.\n *\n * @example\n * consoleTransport()\n * consoleTransport({ level: 'warn', timestamp: false })\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n * consoleTransport({ inspectFn: (v) => require('util').inspect(v, { colors: true, depth: 4 }) })\n */\nexport function consoleTransport(options: ConsoleTransportOptions = {}): Transport {\n const level = options.level ?? 'debug';\n const showTimestamp = options.timestamp ?? true;\n const format = options.format ?? 'raw';\n const isNode = typeof window === 'undefined';\n const useAnsi = options.ansi ?? (isNode ? supportsAnsi() : false);\n const resolved = resolveTheme(options.theme);\n const inspectFn: ((v: unknown) => string) | undefined =\n format === 'json' ? (v) => JSON.stringify(v) : options.inspectFn;\n\n return (entry: LogEntry): void => {\n if (!isLevelEnabled(level, entry.level)) return;\n\n const timestamp = showTimestamp ? entry.timestamp.toISOString().slice(11, 23) : '';\n const payload = buildPayload(entry.data, entry.message, inspectFn);\n const method = console[LOG_METHOD[entry.level]] as (...args: unknown[]) => void;\n\n if (isNode) {\n method(buildNodePrefix(resolved, entry.level, entry.namespace, timestamp, useAnsi), ...payload);\n } else {\n const { fmt, parts } = buildBrowserPrefix(resolved, entry.level, entry.namespace, timestamp);\n\n method(fmt, ...parts, ...payload);\n }\n };\n}\n\n/* ─── Group rendering (used by logger.ts wrapGroup) ─── */\n\nexport function renderGroup(collapsed: boolean, label: string, namespace: string, theme: ResolvedTheme): void {\n const fn = collapsed ? console.groupCollapsed : console.group;\n const isNode = typeof window === 'undefined';\n\n if (isNode) {\n const meta = [theme.group.badge, escapeConsoleFormat(label)];\n\n if (namespace) meta.push(`[${escapeConsoleFormat(namespace)}]`);\n\n fn(meta.join(' | '));\n\n return;\n }\n\n let fmt = `${theme.group.badge} %c${escapeConsoleFormat(label)}%c`;\n const parts: string[] = [badgeStyle(theme.group, '; margin-right: 6px; padding: 1px 3px 0'), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}; margin-right: 6px`), '');\n }\n\n fn(fmt, ...parts);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"console.cjs","names":[],"sources":["../src/console.ts"],"sourcesContent":["import type { Bindings, LogEntry, LogLevel, LogType, Transport } from './types';\n\nimport { isLevelEnabled } from './types';\n\n/* ─── Console theme types ─── */\n\n/**\n * Per-level style definition for the console transport.\n * All fields are optional when providing a level override — unspecified fields fall back to the default theme.\n */\nexport type ConsoleThemeEntry = {\n badge: string;\n bg: string;\n border: string;\n color: string;\n};\n\n/**\n * Partial theme overrides merged on top of the default theme.\n * Each level entry is also partial — only specify the fields you want to change.\n *\n * @example\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n */\nexport type ConsoleTheme = Partial<Record<LogType | 'group' | 'ns', Partial<ConsoleThemeEntry>>>;\n\n/**\n * Fully-resolved console theme where every level and every field is populated.\n */\nexport type ResolvedTheme = Record<LogType | 'group' | 'ns', ConsoleThemeEntry>;\n\n/* ─── ConsoleTransportOptions ─── */\n\nexport type ConsoleTransportOptions = {\n /**\n * Enable ANSI 24-bit color output in Node.js.\n * Default: true when process.stdout.isTTY is true, false otherwise.\n */\n ansi?: boolean;\n /**\n * Object serialization format for Node.js output.\n * - 'json' — JSON.stringify (machine-readable, fails on circular refs)\n * - 'raw' — pass the object directly to the console method (default)\n * Default: 'raw'.\n */\n format?: 'json' | 'raw';\n /**\n * Custom object inspector function. When provided, the `data` object is\n * passed through this function before being written to the console.\n */\n inspectFn?: (value: unknown) => string;\n /** Minimum level to output. Default: 'debug'. */\n level?: LogLevel;\n /** Partial theme overrides merged on top of the default theme. */\n theme?: ConsoleTheme;\n /** Whether to include timestamp in console output. Default: true. */\n timestamp?: boolean;\n};\n\n/* ─── Payload builder ─── */\n\nfunction buildPayload(\n data: Readonly<Bindings>,\n message: string | undefined,\n inspectFn: ((v: unknown) => string) | undefined,\n): unknown[] {\n const hasData = Object.keys(data).length > 0;\n const formatted: unknown = inspectFn && hasData ? inspectFn(data) : hasData ? data : undefined;\n\n if (formatted !== undefined && message !== undefined) return [message, formatted];\n\n if (formatted !== undefined) return [formatted];\n\n if (message !== undefined) return [message];\n\n return [];\n}\n\n/* ─── Console theme ─── */\n\nexport const DEFAULT_THEME: ResolvedTheme = {\n debug: { badge: '🅳', bg: '#616161', border: '#424242', color: '#e0e0e0' },\n error: { badge: '🅴', bg: '#d32f2f', border: '#c62828', color: '#fff' },\n fatal: { badge: '🅵', bg: '#4a148c', border: '#38006b', color: '#fff' },\n group: { badge: '🅶', bg: '#546e7a', border: '#455a64', color: '#fff' },\n info: { badge: '🅸', bg: '#1976d2', border: '#1565c0', color: '#fff' },\n ns: { badge: '', bg: '#424242', border: '#212121', color: '#fff' },\n warn: { badge: '🆆', bg: '#ffb300', border: '#ffa000', color: '#212121' },\n};\n\nconst NS_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;';\n\nconst LOG_METHOD: Record<LogType, 'error' | 'info' | 'log' | 'warn'> = {\n debug: 'log',\n error: 'error',\n fatal: 'error',\n info: 'info',\n warn: 'warn',\n};\n\n/** Deep-merges per-level overrides onto the default theme. Only specified fields within each level entry are replaced. */\nexport function resolveTheme(override: ConsoleTheme | undefined): ResolvedTheme {\n if (!override) return DEFAULT_THEME;\n\n const result: ResolvedTheme = { ...DEFAULT_THEME };\n\n for (const key of Object.keys(override) as Array<LogType | 'group' | 'ns'>) {\n const entry = override[key];\n\n if (entry) result[key] = { ...DEFAULT_THEME[key], ...entry };\n }\n\n return result;\n}\n\n/* ─── ANSI helpers (Node) ─── */\n\nfunction hexToRgb(hex: string): [number, number, number] {\n return [parseInt(hex.slice(1, 3), 16), parseInt(hex.slice(3, 5), 16), parseInt(hex.slice(5, 7), 16)];\n}\n\nfunction ansiColor(hex: string, text: string): string {\n const [r, g, b] = hexToRgb(hex);\n\n return `\\x1b[38;2;${r};${g};${b}m${text}\\x1b[0m`;\n}\n\nfunction ansiMuted(text: string): string {\n return `\\x1b[90m${text}\\x1b[0m`;\n}\n\nfunction supportsAnsi(): boolean {\n if (typeof window !== 'undefined') return false;\n\n return (\n (globalThis as Record<string, unknown> & { process?: { stdout?: { isTTY?: boolean } } }).process?.stdout?.isTTY ===\n true\n );\n}\n\nfunction badgeStyle(entry: ConsoleThemeEntry, extra = ''): string {\n return `background: ${entry.bg}; color: ${entry.color}; border: 1px solid ${entry.border}; border-radius: 4px; padding: 0 1px${extra}`;\n}\n\nfunction escapeConsoleFormat(s: string): string {\n return s.replace(/%/g, '%%');\n}\n\n/**\n * Builds the Node console prefix string, passed as the first argument to `console.log()`/etc.\n * alongside the payload. `namespace` is escaped because Node's `console.*` methods run the first\n * string argument through `util.format` — an unescaped `%s`/`%d`/`%o`/etc. in a caller-controlled\n * namespace would consume and hide the actual payload arguments that follow (log forging).\n */\nfunction buildNodePrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n useAnsi: boolean,\n): string {\n const t = theme[type];\n const safeBadge = escapeConsoleFormat(t.badge);\n const badgeText = useAnsi ? ansiColor(t.bg, safeBadge) : safeBadge;\n const meta = [badgeText];\n\n if (namespace) {\n const safeNamespace = escapeConsoleFormat(namespace);\n\n meta.push(useAnsi ? ansiMuted(`[${safeNamespace}]`) : `[${safeNamespace}]`);\n }\n\n if (timestamp) meta.push(useAnsi ? ansiMuted(timestamp) : timestamp);\n\n return `${meta.join(' | ')} |`;\n}\n\nfunction buildBrowserPrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n): { fmt: string; parts: string[] } {\n let fmt = `%c${escapeConsoleFormat(theme[type].badge)}%c`;\n const parts: string[] = [badgeStyle(theme[type]), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}`), '');\n }\n\n if (timestamp) {\n fmt += ` %c${timestamp}%c`;\n parts.push('color: gray', '');\n }\n\n return { fmt, parts };\n}\n\n/* ─── consoleTransport ─── */\n\n/**\n * Formats and writes log entries to the browser or Node.js console.\n * Uses CSS-styled badges in browsers and plain text in Node.\n * Accepts an optional partial `theme` to override colors and badges per level.\n *\n * @example\n * consoleTransport()\n * consoleTransport({ level: 'warn', timestamp: false })\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n * consoleTransport({ inspectFn: (v) => require('util').inspect(v, { colors: true, depth: 4 }) })\n */\nexport function consoleTransport(options: ConsoleTransportOptions = {}): Transport {\n const level = options.level ?? 'debug';\n const showTimestamp = options.timestamp ?? true;\n const format = options.format ?? 'raw';\n const isNode = typeof window === 'undefined';\n const useAnsi = options.ansi ?? (isNode ? supportsAnsi() : false);\n const resolved = resolveTheme(options.theme);\n const inspectFn: ((v: unknown) => string) | undefined =\n format === 'json' ? (v) => JSON.stringify(v) : options.inspectFn;\n\n return (entry: LogEntry): void => {\n if (!isLevelEnabled(level, entry.level)) return;\n\n const timestamp = showTimestamp ? entry.timestamp.toISOString().slice(11, 23) : '';\n const payload = buildPayload(entry.data, entry.message, inspectFn);\n const method = console[LOG_METHOD[entry.level]] as (...args: unknown[]) => void;\n\n if (isNode) {\n method(buildNodePrefix(resolved, entry.level, entry.namespace, timestamp, useAnsi), ...payload);\n } else {\n const { fmt, parts } = buildBrowserPrefix(resolved, entry.level, entry.namespace, timestamp);\n\n method(fmt, ...parts, ...payload);\n }\n };\n}\n\n/* ─── Group rendering (used by logger.ts wrapGroup) ─── */\n\nexport function renderGroup(collapsed: boolean, label: string, namespace: string, theme: ResolvedTheme): void {\n const fn = collapsed ? console.groupCollapsed : console.group;\n const isNode = typeof window === 'undefined';\n\n if (isNode) {\n const meta = [theme.group.badge, escapeConsoleFormat(label)];\n\n if (namespace) meta.push(`[${escapeConsoleFormat(namespace)}]`);\n\n fn(meta.join(' | '));\n\n return;\n }\n\n let fmt = `${theme.group.badge} %c${escapeConsoleFormat(label)}%c`;\n const parts: string[] = [badgeStyle(theme.group, '; margin-right: 6px; padding: 1px 3px 0'), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}; margin-right: 6px`), '');\n }\n\n fn(fmt, ...parts);\n}\n"],"mappings":"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"}
package/dist/console.js CHANGED
@@ -1,132 +1,2 @@
1
- import { isLevelEnabled as e } from "./types.js";
2
- //#region src/console.ts
3
- function t(e, t, n) {
4
- let r = Object.keys(e).length > 0, i = n && r ? n(e) : r ? e : void 0;
5
- return i !== void 0 && t !== void 0 ? [t, i] : i === void 0 ? t === void 0 ? [] : [t] : [i];
6
- }
7
- var n = {
8
- debug: {
9
- badge: "🅳",
10
- bg: "#616161",
11
- border: "#424242",
12
- color: "#e0e0e0"
13
- },
14
- error: {
15
- badge: "🅴",
16
- bg: "#d32f2f",
17
- border: "#c62828",
18
- color: "#fff"
19
- },
20
- fatal: {
21
- badge: "🅵",
22
- bg: "#4a148c",
23
- border: "#38006b",
24
- color: "#fff"
25
- },
26
- group: {
27
- badge: "🅶",
28
- bg: "#546e7a",
29
- border: "#455a64",
30
- color: "#fff"
31
- },
32
- info: {
33
- badge: "🅸",
34
- bg: "#1976d2",
35
- border: "#1565c0",
36
- color: "#fff"
37
- },
38
- ns: {
39
- badge: "",
40
- bg: "#424242",
41
- border: "#212121",
42
- color: "#fff"
43
- },
44
- warn: {
45
- badge: "🆆",
46
- bg: "#ffb300",
47
- border: "#ffa000",
48
- color: "#212121"
49
- }
50
- }, r = "border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;", i = {
51
- debug: "log",
52
- error: "error",
53
- fatal: "error",
54
- info: "info",
55
- warn: "warn"
56
- };
57
- function a(e) {
58
- if (!e) return n;
59
- let t = { ...n };
60
- for (let r of Object.keys(e)) {
61
- let i = e[r];
62
- i && (t[r] = {
63
- ...n[r],
64
- ...i
65
- });
66
- }
67
- return t;
68
- }
69
- function o(e) {
70
- return [
71
- parseInt(e.slice(1, 3), 16),
72
- parseInt(e.slice(3, 5), 16),
73
- parseInt(e.slice(5, 7), 16)
74
- ];
75
- }
76
- function s(e, t) {
77
- let [n, r, i] = o(e);
78
- return `\x1b[38;2;${n};${r};${i}m${t}\x1b[0m`;
79
- }
80
- function c(e) {
81
- return `\x1b[90m${e}\x1b[0m`;
82
- }
83
- function l() {
84
- return typeof window < "u" ? !1 : globalThis.process?.stdout?.isTTY === !0;
85
- }
86
- function u(e, t = "") {
87
- return `background: ${e.bg}; color: ${e.color}; border: 1px solid ${e.border}; border-radius: 4px; padding: 0 1px${t}`;
88
- }
89
- function d(e) {
90
- return e.replace(/%/g, "%%");
91
- }
92
- function f(e, t, n, r, i) {
93
- let a = e[t], o = d(a.badge), l = [i ? s(a.bg, o) : o];
94
- if (n) {
95
- let e = d(n);
96
- l.push(i ? c(`[${e}]`) : `[${e}]`);
97
- }
98
- return r && l.push(i ? c(r) : r), `${l.join(" | ")} |`;
99
- }
100
- function p(e, t, n, i) {
101
- let a = `%c${d(e[t].badge)}%c`, o = [u(e[t]), ""];
102
- return n && (a += ` %c${d(n)}%c`, o.push(u(e.ns, `; ${r}`), "")), i && (a += ` %c${i}%c`, o.push("color: gray", "")), {
103
- fmt: a,
104
- parts: o
105
- };
106
- }
107
- function m(n = {}) {
108
- let r = n.level ?? "debug", o = n.timestamp ?? !0, s = n.format ?? "raw", c = typeof window > "u", u = n.ansi ?? (c ? l() : !1), d = a(n.theme), m = s === "json" ? (e) => JSON.stringify(e) : n.inspectFn;
109
- return (n) => {
110
- if (!e(r, n.level)) return;
111
- let a = o ? n.timestamp.toISOString().slice(11, 23) : "", s = t(n.data, n.message, m), l = console[i[n.level]];
112
- if (c) l(f(d, n.level, n.namespace, a, u), ...s);
113
- else {
114
- let { fmt: e, parts: t } = p(d, n.level, n.namespace, a);
115
- l(e, ...t, ...s);
116
- }
117
- };
118
- }
119
- function h(e, t, n, i) {
120
- let a = e ? console.groupCollapsed : console.group;
121
- if (typeof window > "u") {
122
- let e = [i.group.badge, d(t)];
123
- n && e.push(`[${d(n)}]`), a(e.join(" | "));
124
- return;
125
- }
126
- let o = `${i.group.badge} %c${d(t)}%c`, s = [u(i.group, "; margin-right: 6px; padding: 1px 3px 0"), ""];
127
- n && (o += ` %c${d(n)}%c`, s.push(u(i.ns, `; ${r}; margin-right: 6px`), "")), a(o, ...s);
128
- }
129
- //#endregion
130
- export { n as DEFAULT_THEME, m as consoleTransport, h as renderGroup, a as resolveTheme };
131
-
1
+ import{isLevelEnabled as e}from"./types.js";function buildPayload(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 t={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`}},n=`border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;`,r={debug:`log`,error:`error`,fatal:`error`,info:`info`,warn:`warn`};function resolveTheme(e){if(!e)return t;let n={...t};for(let r of Object.keys(e)){let i=e[r];i&&(n[r]={...t[r],...i})}return n}function hexToRgb(e){return[parseInt(e.slice(1,3),16),parseInt(e.slice(3,5),16),parseInt(e.slice(5,7),16)]}function ansiColor(e,t){let[n,r,i]=hexToRgb(e);return`\x1b[38;2;${n};${r};${i}m${t}\x1b[0m`}function ansiMuted(e){return`\x1b[90m${e}\x1b[0m`}function supportsAnsi(){return typeof window<`u`?!1:globalThis.process?.stdout?.isTTY===!0}function badgeStyle(e,t=``){return`background: ${e.bg}; color: ${e.color}; border: 1px solid ${e.border}; border-radius: 4px; padding: 0 1px${t}`}function escapeConsoleFormat(e){return e.replace(/%/g,`%%`)}function buildNodePrefix(e,t,n,r,i){let a=e[t],o=escapeConsoleFormat(a.badge),s=[i?ansiColor(a.bg,o):o];if(n){let e=escapeConsoleFormat(n);s.push(i?ansiMuted(`[${e}]`):`[${e}]`)}return r&&s.push(i?ansiMuted(r):r),`${s.join(` | `)} |`}function buildBrowserPrefix(e,t,r,i){let a=`%c${escapeConsoleFormat(e[t].badge)}%c`,o=[badgeStyle(e[t]),``];return r&&(a+=` %c${escapeConsoleFormat(r)}%c`,o.push(badgeStyle(e.ns,`; ${n}`),``)),i&&(a+=` %c${i}%c`,o.push(`color: gray`,``)),{fmt:a,parts:o}}function consoleTransport(t={}){let n=t.level??`debug`,i=t.timestamp??!0,a=t.format??`raw`,o=typeof window>`u`,s=t.ansi??(o?supportsAnsi():!1),c=resolveTheme(t.theme),l=a===`json`?e=>JSON.stringify(e):t.inspectFn;return t=>{if(!e(n,t.level))return;let a=i?t.timestamp.toISOString().slice(11,23):``,u=buildPayload(t.data,t.message,l),d=console[r[t.level]];if(o)d(buildNodePrefix(c,t.level,t.namespace,a,s),...u);else{let{fmt:e,parts:n}=buildBrowserPrefix(c,t.level,t.namespace,a);d(e,...n,...u)}}}function renderGroup(e,t,r,i){let a=e?console.groupCollapsed:console.group;if(typeof window>`u`){let e=[i.group.badge,escapeConsoleFormat(t)];r&&e.push(`[${escapeConsoleFormat(r)}]`),a(e.join(` | `));return}let o=`${i.group.badge} %c${escapeConsoleFormat(t)}%c`,s=[badgeStyle(i.group,`; margin-right: 6px; padding: 1px 3px 0`),``];r&&(o+=` %c${escapeConsoleFormat(r)}%c`,s.push(badgeStyle(i.ns,`; ${n}; margin-right: 6px`),``)),a(o,...s)}export{t as DEFAULT_THEME,consoleTransport,renderGroup,resolveTheme};
132
2
  //# sourceMappingURL=console.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"console.js","names":[],"sources":["../src/console.ts"],"sourcesContent":["import type { Bindings, LogEntry, LogLevel, LogType, Transport } from './types';\n\nimport { isLevelEnabled } from './types';\n\n/* ─── Console theme types ─── */\n\n/**\n * Per-level style definition for the console transport.\n * All fields are optional when providing a level override — unspecified fields fall back to the default theme.\n */\nexport type ConsoleThemeEntry = {\n badge: string;\n bg: string;\n border: string;\n color: string;\n};\n\n/**\n * Partial theme overrides merged on top of the default theme.\n * Each level entry is also partial — only specify the fields you want to change.\n *\n * @example\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n */\nexport type ConsoleTheme = Partial<Record<LogType | 'group' | 'ns', Partial<ConsoleThemeEntry>>>;\n\n/**\n * Fully-resolved console theme where every level and every field is populated.\n */\nexport type ResolvedTheme = Record<LogType | 'group' | 'ns', ConsoleThemeEntry>;\n\n/* ─── ConsoleTransportOptions ─── */\n\nexport type ConsoleTransportOptions = {\n /**\n * Enable ANSI 24-bit color output in Node.js.\n * Default: true when process.stdout.isTTY is true, false otherwise.\n */\n ansi?: boolean;\n /**\n * Object serialization format for Node.js output.\n * - 'json' — JSON.stringify (machine-readable, fails on circular refs)\n * - 'raw' — pass the object directly to the console method (default)\n * Default: 'raw'.\n */\n format?: 'json' | 'raw';\n /**\n * Custom object inspector function. When provided, the `data` object is\n * passed through this function before being written to the console.\n */\n inspectFn?: (value: unknown) => string;\n /** Minimum level to output. Default: 'debug'. */\n level?: LogLevel;\n /** Partial theme overrides merged on top of the default theme. */\n theme?: ConsoleTheme;\n /** Whether to include timestamp in console output. Default: true. */\n timestamp?: boolean;\n};\n\n/* ─── Payload builder ─── */\n\nfunction buildPayload(\n data: Readonly<Bindings>,\n message: string | undefined,\n inspectFn: ((v: unknown) => string) | undefined,\n): unknown[] {\n const hasData = Object.keys(data).length > 0;\n const formatted: unknown = inspectFn && hasData ? inspectFn(data) : hasData ? data : undefined;\n\n if (formatted !== undefined && message !== undefined) return [message, formatted];\n\n if (formatted !== undefined) return [formatted];\n\n if (message !== undefined) return [message];\n\n return [];\n}\n\n/* ─── Console theme ─── */\n\nexport const DEFAULT_THEME: ResolvedTheme = {\n debug: { badge: '🅳', bg: '#616161', border: '#424242', color: '#e0e0e0' },\n error: { badge: '🅴', bg: '#d32f2f', border: '#c62828', color: '#fff' },\n fatal: { badge: '🅵', bg: '#4a148c', border: '#38006b', color: '#fff' },\n group: { badge: '🅶', bg: '#546e7a', border: '#455a64', color: '#fff' },\n info: { badge: '🅸', bg: '#1976d2', border: '#1565c0', color: '#fff' },\n ns: { badge: '', bg: '#424242', border: '#212121', color: '#fff' },\n warn: { badge: '🆆', bg: '#ffb300', border: '#ffa000', color: '#212121' },\n};\n\nconst NS_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;';\n\nconst LOG_METHOD: Record<LogType, 'error' | 'info' | 'log' | 'warn'> = {\n debug: 'log',\n error: 'error',\n fatal: 'error',\n info: 'info',\n warn: 'warn',\n};\n\n/** Deep-merges per-level overrides onto the default theme. Only specified fields within each level entry are replaced. */\nexport function resolveTheme(override: ConsoleTheme | undefined): ResolvedTheme {\n if (!override) return DEFAULT_THEME;\n\n const result: ResolvedTheme = { ...DEFAULT_THEME };\n\n for (const key of Object.keys(override) as Array<LogType | 'group' | 'ns'>) {\n const entry = override[key];\n\n if (entry) result[key] = { ...DEFAULT_THEME[key], ...entry };\n }\n\n return result;\n}\n\n/* ─── ANSI helpers (Node) ─── */\n\nfunction hexToRgb(hex: string): [number, number, number] {\n return [parseInt(hex.slice(1, 3), 16), parseInt(hex.slice(3, 5), 16), parseInt(hex.slice(5, 7), 16)];\n}\n\nfunction ansiColor(hex: string, text: string): string {\n const [r, g, b] = hexToRgb(hex);\n\n return `\\x1b[38;2;${r};${g};${b}m${text}\\x1b[0m`;\n}\n\nfunction ansiMuted(text: string): string {\n return `\\x1b[90m${text}\\x1b[0m`;\n}\n\nfunction supportsAnsi(): boolean {\n if (typeof window !== 'undefined') return false;\n\n return (\n (globalThis as Record<string, unknown> & { process?: { stdout?: { isTTY?: boolean } } }).process?.stdout?.isTTY ===\n true\n );\n}\n\nfunction badgeStyle(entry: ConsoleThemeEntry, extra = ''): string {\n return `background: ${entry.bg}; color: ${entry.color}; border: 1px solid ${entry.border}; border-radius: 4px; padding: 0 1px${extra}`;\n}\n\nfunction escapeConsoleFormat(s: string): string {\n return s.replace(/%/g, '%%');\n}\n\n/**\n * Builds the Node console prefix string, passed as the first argument to `console.log()`/etc.\n * alongside the payload. `namespace` is escaped because Node's `console.*` methods run the first\n * string argument through `util.format` — an unescaped `%s`/`%d`/`%o`/etc. in a caller-controlled\n * namespace would consume and hide the actual payload arguments that follow (log forging).\n */\nfunction buildNodePrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n useAnsi: boolean,\n): string {\n const t = theme[type];\n const safeBadge = escapeConsoleFormat(t.badge);\n const badgeText = useAnsi ? ansiColor(t.bg, safeBadge) : safeBadge;\n const meta = [badgeText];\n\n if (namespace) {\n const safeNamespace = escapeConsoleFormat(namespace);\n\n meta.push(useAnsi ? ansiMuted(`[${safeNamespace}]`) : `[${safeNamespace}]`);\n }\n\n if (timestamp) meta.push(useAnsi ? ansiMuted(timestamp) : timestamp);\n\n return `${meta.join(' | ')} |`;\n}\n\nfunction buildBrowserPrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n): { fmt: string; parts: string[] } {\n let fmt = `%c${escapeConsoleFormat(theme[type].badge)}%c`;\n const parts: string[] = [badgeStyle(theme[type]), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}`), '');\n }\n\n if (timestamp) {\n fmt += ` %c${timestamp}%c`;\n parts.push('color: gray', '');\n }\n\n return { fmt, parts };\n}\n\n/* ─── consoleTransport ─── */\n\n/**\n * Formats and writes log entries to the browser or Node.js console.\n * Uses CSS-styled badges in browsers and plain text in Node.\n * Accepts an optional partial `theme` to override colors and badges per level.\n *\n * @example\n * consoleTransport()\n * consoleTransport({ level: 'warn', timestamp: false })\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n * consoleTransport({ inspectFn: (v) => require('util').inspect(v, { colors: true, depth: 4 }) })\n */\nexport function consoleTransport(options: ConsoleTransportOptions = {}): Transport {\n const level = options.level ?? 'debug';\n const showTimestamp = options.timestamp ?? true;\n const format = options.format ?? 'raw';\n const isNode = typeof window === 'undefined';\n const useAnsi = options.ansi ?? (isNode ? supportsAnsi() : false);\n const resolved = resolveTheme(options.theme);\n const inspectFn: ((v: unknown) => string) | undefined =\n format === 'json' ? (v) => JSON.stringify(v) : options.inspectFn;\n\n return (entry: LogEntry): void => {\n if (!isLevelEnabled(level, entry.level)) return;\n\n const timestamp = showTimestamp ? entry.timestamp.toISOString().slice(11, 23) : '';\n const payload = buildPayload(entry.data, entry.message, inspectFn);\n const method = console[LOG_METHOD[entry.level]] as (...args: unknown[]) => void;\n\n if (isNode) {\n method(buildNodePrefix(resolved, entry.level, entry.namespace, timestamp, useAnsi), ...payload);\n } else {\n const { fmt, parts } = buildBrowserPrefix(resolved, entry.level, entry.namespace, timestamp);\n\n method(fmt, ...parts, ...payload);\n }\n };\n}\n\n/* ─── Group rendering (used by logger.ts wrapGroup) ─── */\n\nexport function renderGroup(collapsed: boolean, label: string, namespace: string, theme: ResolvedTheme): void {\n const fn = collapsed ? console.groupCollapsed : console.group;\n const isNode = typeof window === 'undefined';\n\n if (isNode) {\n const meta = [theme.group.badge, escapeConsoleFormat(label)];\n\n if (namespace) meta.push(`[${escapeConsoleFormat(namespace)}]`);\n\n fn(meta.join(' | '));\n\n return;\n }\n\n let fmt = `${theme.group.badge} %c${escapeConsoleFormat(label)}%c`;\n const parts: string[] = [badgeStyle(theme.group, '; margin-right: 6px; padding: 1px 3px 0'), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}; margin-right: 6px`), '');\n }\n\n fn(fmt, ...parts);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"console.js","names":[],"sources":["../src/console.ts"],"sourcesContent":["import type { Bindings, LogEntry, LogLevel, LogType, Transport } from './types';\n\nimport { isLevelEnabled } from './types';\n\n/* ─── Console theme types ─── */\n\n/**\n * Per-level style definition for the console transport.\n * All fields are optional when providing a level override — unspecified fields fall back to the default theme.\n */\nexport type ConsoleThemeEntry = {\n badge: string;\n bg: string;\n border: string;\n color: string;\n};\n\n/**\n * Partial theme overrides merged on top of the default theme.\n * Each level entry is also partial — only specify the fields you want to change.\n *\n * @example\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n */\nexport type ConsoleTheme = Partial<Record<LogType | 'group' | 'ns', Partial<ConsoleThemeEntry>>>;\n\n/**\n * Fully-resolved console theme where every level and every field is populated.\n */\nexport type ResolvedTheme = Record<LogType | 'group' | 'ns', ConsoleThemeEntry>;\n\n/* ─── ConsoleTransportOptions ─── */\n\nexport type ConsoleTransportOptions = {\n /**\n * Enable ANSI 24-bit color output in Node.js.\n * Default: true when process.stdout.isTTY is true, false otherwise.\n */\n ansi?: boolean;\n /**\n * Object serialization format for Node.js output.\n * - 'json' — JSON.stringify (machine-readable, fails on circular refs)\n * - 'raw' — pass the object directly to the console method (default)\n * Default: 'raw'.\n */\n format?: 'json' | 'raw';\n /**\n * Custom object inspector function. When provided, the `data` object is\n * passed through this function before being written to the console.\n */\n inspectFn?: (value: unknown) => string;\n /** Minimum level to output. Default: 'debug'. */\n level?: LogLevel;\n /** Partial theme overrides merged on top of the default theme. */\n theme?: ConsoleTheme;\n /** Whether to include timestamp in console output. Default: true. */\n timestamp?: boolean;\n};\n\n/* ─── Payload builder ─── */\n\nfunction buildPayload(\n data: Readonly<Bindings>,\n message: string | undefined,\n inspectFn: ((v: unknown) => string) | undefined,\n): unknown[] {\n const hasData = Object.keys(data).length > 0;\n const formatted: unknown = inspectFn && hasData ? inspectFn(data) : hasData ? data : undefined;\n\n if (formatted !== undefined && message !== undefined) return [message, formatted];\n\n if (formatted !== undefined) return [formatted];\n\n if (message !== undefined) return [message];\n\n return [];\n}\n\n/* ─── Console theme ─── */\n\nexport const DEFAULT_THEME: ResolvedTheme = {\n debug: { badge: '🅳', bg: '#616161', border: '#424242', color: '#e0e0e0' },\n error: { badge: '🅴', bg: '#d32f2f', border: '#c62828', color: '#fff' },\n fatal: { badge: '🅵', bg: '#4a148c', border: '#38006b', color: '#fff' },\n group: { badge: '🅶', bg: '#546e7a', border: '#455a64', color: '#fff' },\n info: { badge: '🅸', bg: '#1976d2', border: '#1565c0', color: '#fff' },\n ns: { badge: '', bg: '#424242', border: '#212121', color: '#fff' },\n warn: { badge: '🆆', bg: '#ffb300', border: '#ffa000', color: '#212121' },\n};\n\nconst NS_STYLE = 'border-radius: 8px; font: italic small-caps bold 12px; font-weight: lighter; padding: 0 4px;';\n\nconst LOG_METHOD: Record<LogType, 'error' | 'info' | 'log' | 'warn'> = {\n debug: 'log',\n error: 'error',\n fatal: 'error',\n info: 'info',\n warn: 'warn',\n};\n\n/** Deep-merges per-level overrides onto the default theme. Only specified fields within each level entry are replaced. */\nexport function resolveTheme(override: ConsoleTheme | undefined): ResolvedTheme {\n if (!override) return DEFAULT_THEME;\n\n const result: ResolvedTheme = { ...DEFAULT_THEME };\n\n for (const key of Object.keys(override) as Array<LogType | 'group' | 'ns'>) {\n const entry = override[key];\n\n if (entry) result[key] = { ...DEFAULT_THEME[key], ...entry };\n }\n\n return result;\n}\n\n/* ─── ANSI helpers (Node) ─── */\n\nfunction hexToRgb(hex: string): [number, number, number] {\n return [parseInt(hex.slice(1, 3), 16), parseInt(hex.slice(3, 5), 16), parseInt(hex.slice(5, 7), 16)];\n}\n\nfunction ansiColor(hex: string, text: string): string {\n const [r, g, b] = hexToRgb(hex);\n\n return `\\x1b[38;2;${r};${g};${b}m${text}\\x1b[0m`;\n}\n\nfunction ansiMuted(text: string): string {\n return `\\x1b[90m${text}\\x1b[0m`;\n}\n\nfunction supportsAnsi(): boolean {\n if (typeof window !== 'undefined') return false;\n\n return (\n (globalThis as Record<string, unknown> & { process?: { stdout?: { isTTY?: boolean } } }).process?.stdout?.isTTY ===\n true\n );\n}\n\nfunction badgeStyle(entry: ConsoleThemeEntry, extra = ''): string {\n return `background: ${entry.bg}; color: ${entry.color}; border: 1px solid ${entry.border}; border-radius: 4px; padding: 0 1px${extra}`;\n}\n\nfunction escapeConsoleFormat(s: string): string {\n return s.replace(/%/g, '%%');\n}\n\n/**\n * Builds the Node console prefix string, passed as the first argument to `console.log()`/etc.\n * alongside the payload. `namespace` is escaped because Node's `console.*` methods run the first\n * string argument through `util.format` — an unescaped `%s`/`%d`/`%o`/etc. in a caller-controlled\n * namespace would consume and hide the actual payload arguments that follow (log forging).\n */\nfunction buildNodePrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n useAnsi: boolean,\n): string {\n const t = theme[type];\n const safeBadge = escapeConsoleFormat(t.badge);\n const badgeText = useAnsi ? ansiColor(t.bg, safeBadge) : safeBadge;\n const meta = [badgeText];\n\n if (namespace) {\n const safeNamespace = escapeConsoleFormat(namespace);\n\n meta.push(useAnsi ? ansiMuted(`[${safeNamespace}]`) : `[${safeNamespace}]`);\n }\n\n if (timestamp) meta.push(useAnsi ? ansiMuted(timestamp) : timestamp);\n\n return `${meta.join(' | ')} |`;\n}\n\nfunction buildBrowserPrefix(\n theme: ResolvedTheme,\n type: LogType,\n namespace: string,\n timestamp: string,\n): { fmt: string; parts: string[] } {\n let fmt = `%c${escapeConsoleFormat(theme[type].badge)}%c`;\n const parts: string[] = [badgeStyle(theme[type]), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}`), '');\n }\n\n if (timestamp) {\n fmt += ` %c${timestamp}%c`;\n parts.push('color: gray', '');\n }\n\n return { fmt, parts };\n}\n\n/* ─── consoleTransport ─── */\n\n/**\n * Formats and writes log entries to the browser or Node.js console.\n * Uses CSS-styled badges in browsers and plain text in Node.\n * Accepts an optional partial `theme` to override colors and badges per level.\n *\n * @example\n * consoleTransport()\n * consoleTransport({ level: 'warn', timestamp: false })\n * consoleTransport({ theme: { error: { badge: '✖' } } })\n * consoleTransport({ inspectFn: (v) => require('util').inspect(v, { colors: true, depth: 4 }) })\n */\nexport function consoleTransport(options: ConsoleTransportOptions = {}): Transport {\n const level = options.level ?? 'debug';\n const showTimestamp = options.timestamp ?? true;\n const format = options.format ?? 'raw';\n const isNode = typeof window === 'undefined';\n const useAnsi = options.ansi ?? (isNode ? supportsAnsi() : false);\n const resolved = resolveTheme(options.theme);\n const inspectFn: ((v: unknown) => string) | undefined =\n format === 'json' ? (v) => JSON.stringify(v) : options.inspectFn;\n\n return (entry: LogEntry): void => {\n if (!isLevelEnabled(level, entry.level)) return;\n\n const timestamp = showTimestamp ? entry.timestamp.toISOString().slice(11, 23) : '';\n const payload = buildPayload(entry.data, entry.message, inspectFn);\n const method = console[LOG_METHOD[entry.level]] as (...args: unknown[]) => void;\n\n if (isNode) {\n method(buildNodePrefix(resolved, entry.level, entry.namespace, timestamp, useAnsi), ...payload);\n } else {\n const { fmt, parts } = buildBrowserPrefix(resolved, entry.level, entry.namespace, timestamp);\n\n method(fmt, ...parts, ...payload);\n }\n };\n}\n\n/* ─── Group rendering (used by logger.ts wrapGroup) ─── */\n\nexport function renderGroup(collapsed: boolean, label: string, namespace: string, theme: ResolvedTheme): void {\n const fn = collapsed ? console.groupCollapsed : console.group;\n const isNode = typeof window === 'undefined';\n\n if (isNode) {\n const meta = [theme.group.badge, escapeConsoleFormat(label)];\n\n if (namespace) meta.push(`[${escapeConsoleFormat(namespace)}]`);\n\n fn(meta.join(' | '));\n\n return;\n }\n\n let fmt = `${theme.group.badge} %c${escapeConsoleFormat(label)}%c`;\n const parts: string[] = [badgeStyle(theme.group, '; margin-right: 6px; padding: 1px 3px 0'), ''];\n\n if (namespace) {\n fmt += ` %c${escapeConsoleFormat(namespace)}%c`;\n parts.push(badgeStyle(theme.ns, `; ${NS_STYLE}; margin-right: 6px`), '');\n }\n\n fn(fmt, ...parts);\n}\n"],"mappings":"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"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},t=class extends e{};exports.RuneConfigError=t,exports.RuneError=e;
1
+ var RuneError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},RuneConfigError=class extends RuneError{};exports.RuneConfigError=RuneConfigError,exports.RuneError=RuneError;
2
2
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RuneError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RuneConfigError extends RuneError {}\n"],"mappings":"AAAA,IAAa,EAAb,cAA+B,KAAM,CACnC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,EAAb,cAAqC,CAAU,CAAC"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RuneError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RuneConfigError extends RuneError {}\n"],"mappings":"AAAA,IAAa,UAAb,cAA+B,KAAM,CACnC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,gBAAb,cAAqC,SAAU,CAAC"}
package/dist/errors.js CHANGED
@@ -1,10 +1,2 @@
1
- //#region src/errors.ts
2
- var e = class extends Error {
3
- constructor(e, t) {
4
- super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
5
- }
6
- }, t = class extends e {};
7
- //#endregion
8
- export { t as RuneConfigError, e as RuneError };
9
-
1
+ var RuneError=class extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}},RuneConfigError=class extends RuneError{};export{RuneConfigError,RuneError};
10
2
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RuneError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RuneConfigError extends RuneError {}\n"],"mappings":";AAAA,IAAa,IAAb,cAA+B,MAAM;CACnC,YAAY,GAAiB,GAAqB;EAGhD,AAFA,MAAM,GAAS,CAAI,GACnB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;AACF,GAEa,IAAb,cAAqC,EAAU,CAAC"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RuneError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RuneConfigError extends RuneError {}\n"],"mappings":"AAAA,IAAa,UAAb,cAA+B,KAAM,CACnC,YAAY,EAAiB,EAAqB,CAChD,MAAM,EAAS,CAAI,EACnB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CACF,EAEa,gBAAb,cAAqC,SAAU,CAAC"}
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
@@ -1,7 +1 @@
1
- import { PRIORITY as e, isLevelEnabled as t } from "./types.js";
2
- import { DEFAULT_THEME as n, consoleTransport as r, resolveTheme as i } from "./console.js";
3
- import { RuneConfigError as a, RuneError as o } from "./errors.js";
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 };
1
+ import{PRIORITY as e,isLevelEnabled as t}from"./types.js";import{DEFAULT_THEME as n,consoleTransport as r,resolveTheme as i}from"./console.js";import{RuneConfigError as a,RuneError as o}from"./errors.js";import{lazy as s}from"./lazy.js";import{createLogger as c}from"./logger.js";import{batchTransport as l,jsonTransport as u,redactTransport as d,remoteTransport as f,sampleTransport as p}from"./transports.js";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/lazy.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=Symbol(`rune.lazy`);function t(t){return typeof t==`object`&&!!t&&t[e]===!0}function n(t){return{factory:t,[e]:!0}}exports.isLazy=t,exports.lazy=n;
1
+ var e=Symbol(`rune.lazy`);function isLazy(t){return typeof t==`object`&&!!t&&t[e]===!0}function lazy(t){return{factory:t,[e]:!0}}exports.isLazy=isLazy,exports.lazy=lazy;
2
2
  //# sourceMappingURL=lazy.cjs.map
package/dist/lazy.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.cjs","names":[],"sources":["../src/lazy.ts"],"sourcesContent":["const LAZY_BRAND = Symbol('rune.lazy');\n\n/** A deferred binding value — evaluated only when an entry is actually emitted. Create via `lazy(fn)`. */\nexport type LazyBinding = { readonly factory: () => unknown; readonly [LAZY_BRAND]: true };\n\n/** @internal */\nexport function isLazy(v: unknown): v is LazyBinding {\n return typeof v === 'object' && v !== null && (v as Record<symbol, unknown>)[LAZY_BRAND] === true;\n}\n\n/**\n * Defer evaluation of an expensive binding value until after the log level check passes.\n * The factory function is only called when an entry is actually emitted.\n *\n * @example\n * const reqLog = log.withBindings({ diagnostics: lazy(() => buildExpensiveDiagnostics()) });\n * reqLog.debug('trace'); // diagnostics() only called when logLevel allows debug\n */\nexport function lazy(fn: () => unknown): LazyBinding {\n return { factory: fn, [LAZY_BRAND]: true } as LazyBinding;\n}\n"],"mappings":"AAAA,IAAM,EAAa,OAAO,WAAW,EAMrC,SAAgB,EAAO,EAA8B,CACnD,OAAO,OAAO,GAAM,YAAY,GAAe,EAA8B,KAAgB,EAC/F,CAUA,SAAgB,EAAK,EAAgC,CACnD,MAAO,CAAE,QAAS,GAAK,GAAa,EAAK,CAC3C"}
1
+ {"version":3,"file":"lazy.cjs","names":[],"sources":["../src/lazy.ts"],"sourcesContent":["const LAZY_BRAND = Symbol('rune.lazy');\n\n/** A deferred binding value — evaluated only when an entry is actually emitted. Create via `lazy(fn)`. */\nexport type LazyBinding = { readonly factory: () => unknown; readonly [LAZY_BRAND]: true };\n\n/** @internal */\nexport function isLazy(v: unknown): v is LazyBinding {\n return typeof v === 'object' && v !== null && (v as Record<symbol, unknown>)[LAZY_BRAND] === true;\n}\n\n/**\n * Defer evaluation of an expensive binding value until after the log level check passes.\n * The factory function is only called when an entry is actually emitted.\n *\n * @example\n * const reqLog = log.withBindings({ diagnostics: lazy(() => buildExpensiveDiagnostics()) });\n * reqLog.debug('trace'); // diagnostics() only called when logLevel allows debug\n */\nexport function lazy(fn: () => unknown): LazyBinding {\n return { factory: fn, [LAZY_BRAND]: true } as LazyBinding;\n}\n"],"mappings":"AAAA,IAAM,EAAa,OAAO,WAAW,EAMrC,SAAgB,OAAO,EAA8B,CACnD,OAAO,OAAO,GAAM,YAAY,GAAe,EAA8B,KAAgB,EAC/F,CAUA,SAAgB,KAAK,EAAgC,CACnD,MAAO,CAAE,QAAS,GAAK,GAAa,EAAK,CAC3C"}
package/dist/lazy.js CHANGED
@@ -1,15 +1,2 @@
1
- //#region src/lazy.ts
2
- var e = Symbol("rune.lazy");
3
- function t(t) {
4
- return typeof t == "object" && !!t && t[e] === !0;
5
- }
6
- function n(t) {
7
- return {
8
- factory: t,
9
- [e]: !0
10
- };
11
- }
12
- //#endregion
13
- export { t as isLazy, n as lazy };
14
-
1
+ var e=Symbol(`rune.lazy`);function isLazy(t){return typeof t==`object`&&!!t&&t[e]===!0}function lazy(t){return{factory:t,[e]:!0}}export{isLazy,lazy};
15
2
  //# sourceMappingURL=lazy.js.map
package/dist/lazy.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","names":[],"sources":["../src/lazy.ts"],"sourcesContent":["const LAZY_BRAND = Symbol('rune.lazy');\n\n/** A deferred binding value — evaluated only when an entry is actually emitted. Create via `lazy(fn)`. */\nexport type LazyBinding = { readonly factory: () => unknown; readonly [LAZY_BRAND]: true };\n\n/** @internal */\nexport function isLazy(v: unknown): v is LazyBinding {\n return typeof v === 'object' && v !== null && (v as Record<symbol, unknown>)[LAZY_BRAND] === true;\n}\n\n/**\n * Defer evaluation of an expensive binding value until after the log level check passes.\n * The factory function is only called when an entry is actually emitted.\n *\n * @example\n * const reqLog = log.withBindings({ diagnostics: lazy(() => buildExpensiveDiagnostics()) });\n * reqLog.debug('trace'); // diagnostics() only called when logLevel allows debug\n */\nexport function lazy(fn: () => unknown): LazyBinding {\n return { factory: fn, [LAZY_BRAND]: true } as LazyBinding;\n}\n"],"mappings":";AAAA,IAAM,IAAa,OAAO,WAAW;AAMrC,SAAgB,EAAO,GAA8B;CACnD,OAAO,OAAO,KAAM,cAAY,KAAe,EAA8B,OAAgB;AAC/F;AAUA,SAAgB,EAAK,GAAgC;CACnD,OAAO;EAAE,SAAS;GAAK,IAAa;CAAK;AAC3C"}
1
+ {"version":3,"file":"lazy.js","names":[],"sources":["../src/lazy.ts"],"sourcesContent":["const LAZY_BRAND = Symbol('rune.lazy');\n\n/** A deferred binding value — evaluated only when an entry is actually emitted. Create via `lazy(fn)`. */\nexport type LazyBinding = { readonly factory: () => unknown; readonly [LAZY_BRAND]: true };\n\n/** @internal */\nexport function isLazy(v: unknown): v is LazyBinding {\n return typeof v === 'object' && v !== null && (v as Record<symbol, unknown>)[LAZY_BRAND] === true;\n}\n\n/**\n * Defer evaluation of an expensive binding value until after the log level check passes.\n * The factory function is only called when an entry is actually emitted.\n *\n * @example\n * const reqLog = log.withBindings({ diagnostics: lazy(() => buildExpensiveDiagnostics()) });\n * reqLog.debug('trace'); // diagnostics() only called when logLevel allows debug\n */\nexport function lazy(fn: () => unknown): LazyBinding {\n return { factory: fn, [LAZY_BRAND]: true } as LazyBinding;\n}\n"],"mappings":"AAAA,IAAM,EAAa,OAAO,WAAW,EAMrC,SAAgB,OAAO,EAA8B,CACnD,OAAO,OAAO,GAAM,YAAY,GAAe,EAA8B,KAAgB,EAC/F,CAUA,SAAgB,KAAK,EAAgC,CACnD,MAAO,CAAE,QAAS,GAAK,GAAa,EAAK,CAC3C"}
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 serializeError(e){return{message:e.message,name:e.name,stack:e.stack}}function prepareBindings(e){let t={};for(let[i,a]of Object.entries(e)){if(r.isUnsafeObjectKey(i))continue;let e=n.isLazy(a)?a.factory():a;t[i]=e instanceof Error?serializeError(e):e}return t}function parseArgs(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:serializeError(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 joinNamespace(e,t){return e?t?`${e}.${t}`:e:t}function createLogger(n={},r){let i=typeof n==`string`?{namespace:n,...r}:n,a=i.logLevel??`debug`,o=[...i.middleware??[]],s=i.namespace??``,c=[...i.transports??[t.consoleTransport()]],l={...i.bindings??{}},u=new AbortController,d=!1,passes=t=>e.isLevelEnabled(a,t),namespaceSuffix=()=>s?` (namespace: "${s}")`:``,dispatch=e=>{let t=e;for(let e of o)try{let n=e(t);if(n==null)return;t=n}catch(e){`${namespaceSuffix()}${String(e)}`;return}for(let e of c)try{e(t)}catch(e){`${namespaceSuffix()}${String(e)}`}},emit=(e,t,n,r)=>{if(d||!passes(e))return;let{context:i,message:a}=parseArgs(t,n,r),o=i?{...prepareBindings(l),...prepareBindings(i)}:prepareBindings(l);dispatch({data:o,level:e,message:a,namespace:s,timestamp:new Date})},timeImpl=(e,t,n=`debug`)=>{let r=performance.now(),done=t=>{let i={duration_ms:Math.round((performance.now()-r)*100)/100};t!==void 0&&(i.err=serializeError(t instanceof Error?t:Error(String(t)))),emit(n,i,e)};try{let e=t();return e instanceof Promise?e.then(e=>(done(),e),e=>(done(e),Promise.reject(e))):(done(),e)}catch(e){throw done(e),e}},wrapGroup=(e,n,r,i)=>{if(d||a===`off`||i!==void 0&&!passes(i))return r();t.renderGroup(e,n,s,t.DEFAULT_THEME);try{let e=r();return e instanceof Promise?e.finally(()=>console.groupEnd()):(console.groupEnd(),e)}catch(e){throw console.groupEnd(),e}},childLogger=(e={})=>createLogger({bindings:{...l,...e.bindings??{}},logLevel:e.logLevel??a,middleware:e.middleware??o,namespace:e.namespace===void 0?s:joinNamespace(s,e.namespace),transports:e.transports??c}),f={get bindings(){return{...l}},child:childLogger,debug:(e,t,n)=>emit(`debug`,e,t,n),get disposalSignal(){return u.signal},dispose:()=>{d||(d=!0,u.abort())},get disposed(){return d},enabled:t=>e.isLevelEnabled(a,t),error:(e,t,n)=>emit(`error`,e,t,n),fatal:(e,t,n)=>emit(`fatal`,e,t,n),group:(e,t,n)=>wrapGroup(!1,e,t,n),groupCollapsed:(e,t,n)=>wrapGroup(!0,e,t,n),info:(e,t,n)=>emit(`info`,e,t,n),get logLevel(){return a},get middleware(){return[...o]},get namespace(){return s},[Symbol.dispose](){f.dispose()},time:timeImpl,get transports(){return[...c]},use:e=>childLogger({middleware:[...o,e]}),warn:(e,t,n)=>emit(`warn`,e,t,n),withBindings:e=>childLogger({bindings:e})};return f}exports.createLogger=createLogger;
2
2
  //# sourceMappingURL=logger.cjs.map