@loggerjs/pretty 0.6.0 → 0.7.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/dist/console-transport.d.ts.map +1 -1
- package/dist/index.cjs +8 -353
- package/dist/index.js +3 -348
- package/dist/transport-console.cjs +4 -154
- package/dist/transport-console.cjs.map +1 -1
- package/dist/transport-console.js +2 -152
- package/dist/transport-console.js.map +1 -1
- package/dist/transport-stream.cjs +2 -152
- package/dist/transport-stream.cjs.map +1 -1
- package/dist/transport-stream.js +2 -152
- package/dist/transport-stream.js.map +1 -1
- package/package.json +5 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-stream.js","names":[],"sources":["../src/formatter.ts","../src/stream-transport.ts"],"sourcesContent":["import { safeJsonStringify, type EnabledLogLevelName, type LogEvent } from \"@loggerjs/core\";\n\nexport type PrettyColorMode = \"auto\" | \"always\" | \"never\";\nexport type PrettyRenderMode = \"compact\" | \"expanded\";\nexport type PrettyTimeFormat = \"iso\" | \"local\" | \"time\" | \"none\" | ((event: LogEvent) => string);\n\nexport interface PrettyLevelStyle {\n label: string;\n ansi: string;\n css: string;\n}\n\nexport type PrettyLevelStyles = Partial<Record<EnabledLogLevelName, Partial<PrettyLevelStyle>>>;\n\nexport interface PrettyFormatterOptions {\n colors?: PrettyColorMode;\n mode?: PrettyRenderMode;\n time?: PrettyTimeFormat;\n includeLogger?: boolean;\n includeType?: boolean;\n includeTags?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeContext?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n maxInlineLength?: number;\n maxObjectDepth?: number;\n maxObjectKeys?: number;\n levelStyles?: PrettyLevelStyles;\n}\n\nexport interface PrettyDetail {\n key: string;\n value: unknown;\n text: string;\n}\n\nexport interface PrettyFormattedEvent {\n text: string;\n ansiText: string;\n browserArgs: unknown[];\n details: PrettyDetail[];\n}\n\nconst ansiReset = \"\\x1b[0m\";\nconst ansiStyles: Record<EnabledLogLevelName, string> = {\n trace: \"\\x1b[90m\",\n debug: \"\\x1b[36m\",\n info: \"\\x1b[34m\",\n warn: \"\\x1b[33m\",\n error: \"\\x1b[31m\",\n fatal: \"\\x1b[35m\",\n};\n\nconst cssStyles: Record<EnabledLogLevelName, string> = {\n trace: \"color:#6b7280;font-weight:600\",\n debug: \"color:#0891b2;font-weight:600\",\n info: \"color:#2563eb;font-weight:600\",\n warn: \"color:#b45309;font-weight:700\",\n error: \"color:#dc2626;font-weight:700\",\n fatal: \"color:#7e22ce;font-weight:800\",\n};\n\nconst labels: Record<EnabledLogLevelName, string> = {\n trace: \"TRACE\",\n debug: \"DEBUG\",\n info: \"INFO \",\n warn: \"WARN \",\n error: \"ERROR\",\n fatal: \"FATAL\",\n};\n\nfunction levelStyle(\n levelName: EnabledLogLevelName,\n overrides: PrettyLevelStyles | undefined,\n): PrettyLevelStyle {\n const override = overrides?.[levelName];\n return {\n label: override?.label ?? labels[levelName],\n ansi: override?.ansi ?? ansiStyles[levelName],\n css: override?.css ?? cssStyles[levelName],\n };\n}\n\nfunction formatTime(event: LogEvent, format: PrettyTimeFormat): string | undefined {\n if (typeof format === \"function\") return format(event);\n if (format === \"none\") return undefined;\n const date = new Date(event.time);\n if (format === \"iso\") return date.toISOString();\n if (format === \"local\") return date.toLocaleString();\n return date.toISOString().slice(11, 23);\n}\n\nfunction scalar(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n return safeJsonStringify(value, { maxDepth: 2, maxArrayLength: 20, maxObjectKeys: 20 });\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n if (maxLength <= 1) return value.slice(0, maxLength);\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n\nfunction tagText(tags: LogEvent[\"tags\"], maxInlineLength: number): string | undefined {\n if (!tags) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries\n .map(([key, value]) => `${key}=${truncate(scalar(value), maxInlineLength)}`)\n .join(\" \");\n}\n\nfunction detailText(\n value: unknown,\n options: Pick<PrettyFormatterOptions, \"maxObjectDepth\" | \"maxObjectKeys\">,\n): string {\n return safeJsonStringify(value, {\n maxDepth: options.maxObjectDepth ?? 4,\n maxArrayLength: 50,\n maxObjectKeys: options.maxObjectKeys ?? 80,\n stable: true,\n });\n}\n\nfunction collectDetails(event: LogEvent, options: PrettyFormatterOptions): PrettyDetail[] {\n const details: PrettyDetail[] = [];\n const push = (key: string, value: unknown) => {\n if (value === undefined) return;\n details.push({ key, value, text: detailText(value, options) });\n };\n\n if (options.includeData ?? true) push(\"data\", event.data);\n if (options.includeError ?? true) push(\"error\", event.error);\n if (options.includeContext ?? false) push(\"context\", event.context);\n if (options.includeTrace ?? false) push(\"trace\", event.trace);\n if (options.includeSource ?? false) push(\"source\", event.source);\n if (options.includeId ?? false) push(\"id\", event.id);\n return details;\n}\n\nfunction baseSegments(event: LogEvent, options: PrettyFormatterOptions): string[] {\n const maxInlineLength = options.maxInlineLength ?? 160;\n const style = levelStyle(event.levelName, options.levelStyles);\n const segments: string[] = [];\n const time = formatTime(event, options.time ?? \"time\");\n if (time) segments.push(`[${time}]`);\n segments.push(style.label);\n if (options.includeLogger ?? true) segments.push(event.logger);\n if ((options.includeType ?? true) && event.type) segments.push(`<${event.type}>`);\n if (options.includeTags ?? true) {\n const tags = tagText(event.tags, maxInlineLength);\n if (tags) segments.push(`[${tags}]`);\n }\n return segments;\n}\n\nfunction plainBaseLine(event: LogEvent, options: PrettyFormatterOptions): string {\n return `${baseSegments(event, options).join(\" \")} ${event.message}`;\n}\n\nfunction compactText(baseLine: string, details: PrettyDetail[], maxInlineLength: number): string {\n if (details.length === 0) return baseLine;\n const suffix = details\n .map((detail) => `${detail.key}=${truncate(detail.text, maxInlineLength)}`)\n .join(\" \");\n return `${baseLine} ${suffix}`;\n}\n\nfunction expandedText(baseLine: string, details: PrettyDetail[]): string {\n if (details.length === 0) return baseLine;\n return [baseLine, ...details.map((detail) => ` ${detail.key}: ${detail.text}`)].join(\"\\n\");\n}\n\nfunction withAnsi(event: LogEvent, text: string, options: PrettyFormatterOptions): string {\n if (options.colors !== \"always\") return text;\n const style = levelStyle(event.levelName, options.levelStyles);\n const label = style.label;\n return text.replace(label, `${style.ansi}${label}${ansiReset}`);\n}\n\nfunction browserArgs(event: LogEvent, options: PrettyFormatterOptions, details: PrettyDetail[]) {\n const style = levelStyle(event.levelName, options.levelStyles);\n const segments = baseSegments(event, options);\n const levelIndex = segments.indexOf(style.label);\n const beforeLevel = segments.slice(0, levelIndex).join(\" \");\n const afterLevel = segments.slice(levelIndex + 1).join(\" \");\n const before = beforeLevel ? `${beforeLevel} ` : \"\";\n const after = afterLevel ? ` ${afterLevel}` : \"\";\n const prefixStyle = \"color:#6b7280\";\n const format = `%c${before}%c${style.label}%c${after} ${event.message}`;\n return [format, prefixStyle, style.css, \"\", ...details.map((detail) => detail.value)];\n}\n\nexport function formatPrettyEvent(\n event: LogEvent,\n options: PrettyFormatterOptions = {},\n): PrettyFormattedEvent {\n const maxInlineLength = options.maxInlineLength ?? 160;\n const details = collectDetails(event, options);\n const baseLine = plainBaseLine(event, options);\n const text =\n (options.mode ?? \"compact\") === \"expanded\"\n ? expandedText(baseLine, details)\n : compactText(baseLine, details, maxInlineLength);\n\n return {\n text,\n ansiText: withAnsi(event, text, options),\n browserArgs: browserArgs(event, options, details),\n details,\n };\n}\n","import {\n toLevelValue,\n type LogEvent,\n type LogRecord,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { formatPrettyEvent, type PrettyFormatterOptions } from \"./formatter\";\n\nexport interface PrettyWritableLike {\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n on?: (event: \"error\", listener: (error: Error) => void) => unknown;\n off?: (event: \"error\", listener: (error: Error) => void) => unknown;\n once?: (event: \"drain\", listener: () => void) => unknown;\n end?: (callback?: (error?: Error | null) => void) => unknown;\n}\n\nexport interface PrettyProcessLike {\n stdout?: PrettyWritableLike;\n stderr?: PrettyWritableLike;\n env?: Record<string, string | undefined>;\n}\n\nexport interface PrettyStreamTransportOptions extends PrettyFormatterOptions {\n name?: string;\n stream?: PrettyWritableLike;\n process?: PrettyProcessLike;\n minLevel?: LoggerLevel;\n newline?: string;\n endOnClose?: boolean;\n}\n\nexport type PrettyStdoutTransportOptions = Omit<PrettyStreamTransportOptions, \"stream\"> & {\n stream?: PrettyWritableLike;\n};\n\ninterface FlushWaiter {\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction currentProcess(): PrettyProcessLike | undefined {\n return (globalThis as unknown as { process?: PrettyProcessLike }).process;\n}\n\nfunction processFor(options: PrettyStreamTransportOptions): PrettyProcessLike | undefined {\n return options.process ?? currentProcess();\n}\n\nfunction shouldUseAnsi(stream: PrettyWritableLike, options: PrettyStreamTransportOptions): boolean {\n if (options.colors === \"always\") return true;\n if (options.colors === \"never\") return false;\n const env = processFor(options)?.env;\n if (env?.NO_COLOR !== undefined) return false;\n if (env?.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") return true;\n return stream.isTTY === true;\n}\n\nfunction streamFromProcess(\n options: PrettyStreamTransportOptions,\n key: \"stdout\" | \"stderr\",\n): PrettyWritableLike {\n const stream = processFor(options)?.[key];\n if (!stream) {\n throw new Error(`pretty ${key} transport requires a writable stream or process.${key}`);\n }\n return stream;\n}\n\nexport function prettyStreamTransport(options: PrettyStreamTransportOptions = {}): Transport {\n const stream = options.stream ?? streamFromProcess(options, \"stdout\");\n const useAnsi = shouldUseAnsi(stream, options);\n const newline = options.newline ?? \"\\n\";\n const waiters: FlushWaiter[] = [];\n let pendingDrains = 0;\n let lastError: Error | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n\n const settleWaitersIfIdle = () => {\n if (pendingDrains > 0 || waiters.length === 0) return;\n const error = lastError;\n lastError = undefined;\n for (const waiter of waiters.splice(0)) {\n if (error) waiter.reject(error);\n else waiter.resolve();\n }\n };\n\n const recordError = (error: unknown, operation: string) => {\n lastError = normalizeError(error);\n lastContext?.reportInternalError(lastError, {\n phase: \"transport\",\n transport: options.name ?? \"pretty-stream\",\n operation,\n });\n settleWaitersIfIdle();\n };\n\n const onError = (error: Error) => recordError(error, \"stream-error\");\n stream.on?.(\"error\", onError);\n\n const waitForDrain = () => {\n if (!stream.once) return;\n pendingDrains += 1;\n stream.once(\"drain\", () => {\n pendingDrains -= 1;\n settleWaitersIfIdle();\n });\n };\n\n const writePayload = (payload: string, context: TransportContext) => {\n if (closed) return;\n lastContext = context;\n try {\n const result = stream.write(payload);\n if (result === false) waitForDrain();\n } catch (error) {\n recordError(error, \"write\");\n }\n };\n\n const writeEvent = (event: LogEvent, context: TransportContext) => {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n const rendered = formatPrettyEvent(event, { ...options, colors: useAnsi ? \"always\" : \"never\" });\n writePayload(`${useAnsi ? rendered.ansiText : rendered.text}${newline}`, context);\n };\n\n const transport: Transport = {\n name: options.name ?? \"pretty-stream\",\n minLevel: options.minLevel,\n write(record: LogRecord, context) {\n writeEvent(context.toEvent(record), context);\n },\n writeBatch(records, context) {\n for (const record of records) writeEvent(context.toEvent(record), context);\n },\n log(event, context) {\n writeEvent(event, context);\n },\n logBatch(events, context) {\n for (const event of events) writeEvent(event, context);\n },\n flush() {\n if (pendingDrains === 0) {\n const error = lastError;\n lastError = undefined;\n if (error) return Promise.reject(error);\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n flushSync() {\n // Stream writes are already issued synchronously. Backpressure is observed\n // by async flush() through drain events.\n },\n close() {\n return Promise.resolve(transport.flush?.()).then(\n () =>\n new Promise<void>((resolve, reject) => {\n closed = true;\n stream.off?.(\"error\", onError);\n if (!options.endOnClose || !stream.end) {\n resolve();\n return;\n }\n stream.end((error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n }),\n );\n },\n };\n\n return transport;\n}\n\nexport function prettyStdoutTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stdout\",\n stream: options.stream ?? streamFromProcess(options, \"stdout\"),\n });\n}\n\nexport function prettyStderrTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stderr\",\n stream: options.stream ?? streamFromProcess(options, \"stderr\"),\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transport-stream.js","names":[],"sources":["../src/stream-transport.ts"],"sourcesContent":["import {\n toLevelValue,\n type LogEvent,\n type LogRecord,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { formatPrettyEvent, type PrettyFormatterOptions } from \"./formatter\";\n\nexport interface PrettyWritableLike {\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n on?: (event: \"error\", listener: (error: Error) => void) => unknown;\n off?: (event: \"error\", listener: (error: Error) => void) => unknown;\n once?: (event: \"drain\", listener: () => void) => unknown;\n end?: (callback?: (error?: Error | null) => void) => unknown;\n}\n\nexport interface PrettyProcessLike {\n stdout?: PrettyWritableLike;\n stderr?: PrettyWritableLike;\n env?: Record<string, string | undefined>;\n}\n\nexport interface PrettyStreamTransportOptions extends PrettyFormatterOptions {\n name?: string;\n stream?: PrettyWritableLike;\n process?: PrettyProcessLike;\n minLevel?: LoggerLevel;\n newline?: string;\n endOnClose?: boolean;\n}\n\nexport type PrettyStdoutTransportOptions = Omit<PrettyStreamTransportOptions, \"stream\"> & {\n stream?: PrettyWritableLike;\n};\n\ninterface FlushWaiter {\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction currentProcess(): PrettyProcessLike | undefined {\n return (globalThis as unknown as { process?: PrettyProcessLike }).process;\n}\n\nfunction processFor(options: PrettyStreamTransportOptions): PrettyProcessLike | undefined {\n return options.process ?? currentProcess();\n}\n\nfunction shouldUseAnsi(stream: PrettyWritableLike, options: PrettyStreamTransportOptions): boolean {\n if (options.colors === \"always\") return true;\n if (options.colors === \"never\") return false;\n const env = processFor(options)?.env;\n if (env?.NO_COLOR !== undefined) return false;\n if (env?.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") return true;\n return stream.isTTY === true;\n}\n\nfunction streamFromProcess(\n options: PrettyStreamTransportOptions,\n key: \"stdout\" | \"stderr\",\n): PrettyWritableLike {\n const stream = processFor(options)?.[key];\n if (!stream) {\n throw new Error(`pretty ${key} transport requires a writable stream or process.${key}`);\n }\n return stream;\n}\n\nexport function prettyStreamTransport(options: PrettyStreamTransportOptions = {}): Transport {\n const stream = options.stream ?? streamFromProcess(options, \"stdout\");\n const useAnsi = shouldUseAnsi(stream, options);\n const newline = options.newline ?? \"\\n\";\n const waiters: FlushWaiter[] = [];\n let pendingDrains = 0;\n let lastError: Error | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n\n const settleWaitersIfIdle = () => {\n if (pendingDrains > 0 || waiters.length === 0) return;\n const error = lastError;\n lastError = undefined;\n for (const waiter of waiters.splice(0)) {\n if (error) waiter.reject(error);\n else waiter.resolve();\n }\n };\n\n const recordError = (error: unknown, operation: string) => {\n lastError = normalizeError(error);\n lastContext?.reportInternalError(lastError, {\n phase: \"transport\",\n transport: options.name ?? \"pretty-stream\",\n operation,\n });\n settleWaitersIfIdle();\n };\n\n const onError = (error: Error) => recordError(error, \"stream-error\");\n stream.on?.(\"error\", onError);\n\n const waitForDrain = () => {\n if (!stream.once) return;\n pendingDrains += 1;\n stream.once(\"drain\", () => {\n pendingDrains -= 1;\n settleWaitersIfIdle();\n });\n };\n\n const writePayload = (payload: string, context: TransportContext) => {\n if (closed) return;\n lastContext = context;\n try {\n const result = stream.write(payload);\n if (result === false) waitForDrain();\n } catch (error) {\n recordError(error, \"write\");\n }\n };\n\n const writeEvent = (event: LogEvent, context: TransportContext) => {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n const rendered = formatPrettyEvent(event, { ...options, colors: useAnsi ? \"always\" : \"never\" });\n writePayload(`${useAnsi ? rendered.ansiText : rendered.text}${newline}`, context);\n };\n\n const transport: Transport = {\n name: options.name ?? \"pretty-stream\",\n minLevel: options.minLevel,\n write(record: LogRecord, context) {\n writeEvent(context.toEvent(record), context);\n },\n writeBatch(records, context) {\n for (const record of records) writeEvent(context.toEvent(record), context);\n },\n log(event, context) {\n writeEvent(event, context);\n },\n logBatch(events, context) {\n for (const event of events) writeEvent(event, context);\n },\n flush() {\n if (pendingDrains === 0) {\n const error = lastError;\n lastError = undefined;\n if (error) return Promise.reject(error);\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n flushSync() {\n // Stream writes are already issued synchronously. Backpressure is observed\n // by async flush() through drain events.\n },\n close() {\n return Promise.resolve(transport.flush?.()).then(\n () =>\n new Promise<void>((resolve, reject) => {\n closed = true;\n stream.off?.(\"error\", onError);\n if (!options.endOnClose || !stream.end) {\n resolve();\n return;\n }\n stream.end((error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n }),\n );\n },\n };\n\n return transport;\n}\n\nexport function prettyStdoutTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stdout\",\n stream: options.stream ?? streamFromProcess(options, \"stdout\"),\n });\n}\n\nexport function prettyStderrTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stderr\",\n stream: options.stream ?? streamFromProcess(options, \"stderr\"),\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loggerjs/pretty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Pretty console and terminal output helpers for loggerjs.",
|
|
5
5
|
"homepage": "https://github.com/jskits/loggerjs/tree/main/packages/pretty#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -49,7 +49,10 @@
|
|
|
49
49
|
"provenance": true
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@loggerjs/core": "0.
|
|
52
|
+
"@loggerjs/core": "^0.7.0"
|
|
53
|
+
},
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=20.19.0"
|
|
53
56
|
},
|
|
54
57
|
"loggerjsSubpathEntries": {
|
|
55
58
|
"formatter": "src/formatter.ts",
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/formatter.ts","../src/console-transport.ts","../src/stream-transport.ts"],"sourcesContent":["import { safeJsonStringify, type EnabledLogLevelName, type LogEvent } from \"@loggerjs/core\";\n\nexport type PrettyColorMode = \"auto\" | \"always\" | \"never\";\nexport type PrettyRenderMode = \"compact\" | \"expanded\";\nexport type PrettyTimeFormat = \"iso\" | \"local\" | \"time\" | \"none\" | ((event: LogEvent) => string);\n\nexport interface PrettyLevelStyle {\n label: string;\n ansi: string;\n css: string;\n}\n\nexport type PrettyLevelStyles = Partial<Record<EnabledLogLevelName, Partial<PrettyLevelStyle>>>;\n\nexport interface PrettyFormatterOptions {\n colors?: PrettyColorMode;\n mode?: PrettyRenderMode;\n time?: PrettyTimeFormat;\n includeLogger?: boolean;\n includeType?: boolean;\n includeTags?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeContext?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n maxInlineLength?: number;\n maxObjectDepth?: number;\n maxObjectKeys?: number;\n levelStyles?: PrettyLevelStyles;\n}\n\nexport interface PrettyDetail {\n key: string;\n value: unknown;\n text: string;\n}\n\nexport interface PrettyFormattedEvent {\n text: string;\n ansiText: string;\n browserArgs: unknown[];\n details: PrettyDetail[];\n}\n\nconst ansiReset = \"\\x1b[0m\";\nconst ansiStyles: Record<EnabledLogLevelName, string> = {\n trace: \"\\x1b[90m\",\n debug: \"\\x1b[36m\",\n info: \"\\x1b[34m\",\n warn: \"\\x1b[33m\",\n error: \"\\x1b[31m\",\n fatal: \"\\x1b[35m\",\n};\n\nconst cssStyles: Record<EnabledLogLevelName, string> = {\n trace: \"color:#6b7280;font-weight:600\",\n debug: \"color:#0891b2;font-weight:600\",\n info: \"color:#2563eb;font-weight:600\",\n warn: \"color:#b45309;font-weight:700\",\n error: \"color:#dc2626;font-weight:700\",\n fatal: \"color:#7e22ce;font-weight:800\",\n};\n\nconst labels: Record<EnabledLogLevelName, string> = {\n trace: \"TRACE\",\n debug: \"DEBUG\",\n info: \"INFO \",\n warn: \"WARN \",\n error: \"ERROR\",\n fatal: \"FATAL\",\n};\n\nfunction levelStyle(\n levelName: EnabledLogLevelName,\n overrides: PrettyLevelStyles | undefined,\n): PrettyLevelStyle {\n const override = overrides?.[levelName];\n return {\n label: override?.label ?? labels[levelName],\n ansi: override?.ansi ?? ansiStyles[levelName],\n css: override?.css ?? cssStyles[levelName],\n };\n}\n\nfunction formatTime(event: LogEvent, format: PrettyTimeFormat): string | undefined {\n if (typeof format === \"function\") return format(event);\n if (format === \"none\") return undefined;\n const date = new Date(event.time);\n if (format === \"iso\") return date.toISOString();\n if (format === \"local\") return date.toLocaleString();\n return date.toISOString().slice(11, 23);\n}\n\nfunction scalar(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n return safeJsonStringify(value, { maxDepth: 2, maxArrayLength: 20, maxObjectKeys: 20 });\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n if (maxLength <= 1) return value.slice(0, maxLength);\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n\nfunction tagText(tags: LogEvent[\"tags\"], maxInlineLength: number): string | undefined {\n if (!tags) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries\n .map(([key, value]) => `${key}=${truncate(scalar(value), maxInlineLength)}`)\n .join(\" \");\n}\n\nfunction detailText(\n value: unknown,\n options: Pick<PrettyFormatterOptions, \"maxObjectDepth\" | \"maxObjectKeys\">,\n): string {\n return safeJsonStringify(value, {\n maxDepth: options.maxObjectDepth ?? 4,\n maxArrayLength: 50,\n maxObjectKeys: options.maxObjectKeys ?? 80,\n stable: true,\n });\n}\n\nfunction collectDetails(event: LogEvent, options: PrettyFormatterOptions): PrettyDetail[] {\n const details: PrettyDetail[] = [];\n const push = (key: string, value: unknown) => {\n if (value === undefined) return;\n details.push({ key, value, text: detailText(value, options) });\n };\n\n if (options.includeData ?? true) push(\"data\", event.data);\n if (options.includeError ?? true) push(\"error\", event.error);\n if (options.includeContext ?? false) push(\"context\", event.context);\n if (options.includeTrace ?? false) push(\"trace\", event.trace);\n if (options.includeSource ?? false) push(\"source\", event.source);\n if (options.includeId ?? false) push(\"id\", event.id);\n return details;\n}\n\nfunction baseSegments(event: LogEvent, options: PrettyFormatterOptions): string[] {\n const maxInlineLength = options.maxInlineLength ?? 160;\n const style = levelStyle(event.levelName, options.levelStyles);\n const segments: string[] = [];\n const time = formatTime(event, options.time ?? \"time\");\n if (time) segments.push(`[${time}]`);\n segments.push(style.label);\n if (options.includeLogger ?? true) segments.push(event.logger);\n if ((options.includeType ?? true) && event.type) segments.push(`<${event.type}>`);\n if (options.includeTags ?? true) {\n const tags = tagText(event.tags, maxInlineLength);\n if (tags) segments.push(`[${tags}]`);\n }\n return segments;\n}\n\nfunction plainBaseLine(event: LogEvent, options: PrettyFormatterOptions): string {\n return `${baseSegments(event, options).join(\" \")} ${event.message}`;\n}\n\nfunction compactText(baseLine: string, details: PrettyDetail[], maxInlineLength: number): string {\n if (details.length === 0) return baseLine;\n const suffix = details\n .map((detail) => `${detail.key}=${truncate(detail.text, maxInlineLength)}`)\n .join(\" \");\n return `${baseLine} ${suffix}`;\n}\n\nfunction expandedText(baseLine: string, details: PrettyDetail[]): string {\n if (details.length === 0) return baseLine;\n return [baseLine, ...details.map((detail) => ` ${detail.key}: ${detail.text}`)].join(\"\\n\");\n}\n\nfunction withAnsi(event: LogEvent, text: string, options: PrettyFormatterOptions): string {\n if (options.colors !== \"always\") return text;\n const style = levelStyle(event.levelName, options.levelStyles);\n const label = style.label;\n return text.replace(label, `${style.ansi}${label}${ansiReset}`);\n}\n\nfunction browserArgs(event: LogEvent, options: PrettyFormatterOptions, details: PrettyDetail[]) {\n const style = levelStyle(event.levelName, options.levelStyles);\n const segments = baseSegments(event, options);\n const levelIndex = segments.indexOf(style.label);\n const beforeLevel = segments.slice(0, levelIndex).join(\" \");\n const afterLevel = segments.slice(levelIndex + 1).join(\" \");\n const before = beforeLevel ? `${beforeLevel} ` : \"\";\n const after = afterLevel ? ` ${afterLevel}` : \"\";\n const prefixStyle = \"color:#6b7280\";\n const format = `%c${before}%c${style.label}%c${after} ${event.message}`;\n return [format, prefixStyle, style.css, \"\", ...details.map((detail) => detail.value)];\n}\n\nexport function formatPrettyEvent(\n event: LogEvent,\n options: PrettyFormatterOptions = {},\n): PrettyFormattedEvent {\n const maxInlineLength = options.maxInlineLength ?? 160;\n const details = collectDetails(event, options);\n const baseLine = plainBaseLine(event, options);\n const text =\n (options.mode ?? \"compact\") === \"expanded\"\n ? expandedText(baseLine, details)\n : compactText(baseLine, details, maxInlineLength);\n\n return {\n text,\n ansiText: withAnsi(event, text, options),\n browserArgs: browserArgs(event, options, details),\n details,\n };\n}\n","import {\n registerUnpatchedDefaults,\n type ConsoleMethod,\n type LogEvent,\n type LogRecord,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { formatPrettyEvent, type PrettyFormatterOptions } from \"./formatter\";\n\nexport interface PrettyConsoleLike {\n debug?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n info?: (...args: unknown[]) => void;\n log?: (...args: unknown[]) => void;\n trace?: (...args: unknown[]) => void;\n warn?: (...args: unknown[]) => void;\n}\n\nexport interface PrettyConsoleTransportOptions extends PrettyFormatterOptions {\n name?: string;\n browserStyles?: boolean | \"auto\";\n includeEvent?: boolean;\n console?: PrettyConsoleLike;\n filter?: (event: LogEvent) => boolean;\n}\n\nfunction methodForEvent(event: LogEvent): ConsoleMethod {\n if (event.levelName === \"trace\") return \"trace\";\n if (event.levelName === \"debug\") return \"debug\";\n if (event.levelName === \"warn\") return \"warn\";\n if (event.levelName === \"error\" || event.levelName === \"fatal\") return \"error\";\n return \"info\";\n}\n\nfunction defaultFilter(event: LogEvent): boolean {\n const integration = event.source?.integration;\n return integration !== \"capture-console\" && integration !== \"integration:capture-console\";\n}\n\nfunction browserStyleSupport(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nfunction shouldUseBrowserStyles(value: boolean | \"auto\" | undefined): boolean {\n if (value === undefined || value === \"auto\") return browserStyleSupport();\n return value;\n}\n\nfunction writerFor(method: ConsoleMethod, target: PrettyConsoleLike | undefined) {\n if (target) {\n const writer =\n target[method] ??\n target.log ??\n target.info ??\n (() => {\n // Intentionally empty: callers can inject a partial console in tests.\n });\n return writer.bind(target);\n }\n\n const registry = registerUnpatchedDefaults();\n const fallback: PrettyConsoleLike =\n typeof console === \"undefined\" ? {} : (console as unknown as PrettyConsoleLike);\n const writer =\n registry.console[method] ??\n fallback[method] ??\n registry.console.log ??\n fallback.log ??\n (() => {\n // No console surface exists in this runtime.\n });\n\n return typeof console === \"undefined\" ? writer : writer.bind(console);\n}\n\nexport function prettyConsoleTransport(options: PrettyConsoleTransportOptions = {}): Transport {\n const filter = options.filter ?? defaultFilter;\n const useBrowserStyles = shouldUseBrowserStyles(options.browserStyles);\n\n const writeEvent = (event: LogEvent) => {\n if (!filter(event)) return;\n const rendered = formatPrettyEvent(event, options);\n const writer = writerFor(methodForEvent(event), options.console);\n const args = useBrowserStyles\n ? rendered.browserArgs\n : [\n options.colors === \"always\" ? rendered.ansiText : rendered.text,\n ...rendered.details.map((detail) => detail.value),\n ];\n if (options.includeEvent) args.push(event);\n writer(...args);\n };\n\n const writeRecord = (record: LogRecord, context: TransportContext) => {\n writeEvent(context.toEvent(record));\n };\n\n return {\n name: options.name ?? \"pretty-console\",\n write(record, context) {\n writeRecord(record, context);\n },\n writeBatch(records, context) {\n for (const record of records) writeRecord(record, context);\n },\n log(event) {\n writeEvent(event);\n },\n logBatch(events) {\n for (const event of events) writeEvent(event);\n },\n };\n}\n","import {\n toLevelValue,\n type LogEvent,\n type LogRecord,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { formatPrettyEvent, type PrettyFormatterOptions } from \"./formatter\";\n\nexport interface PrettyWritableLike {\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n on?: (event: \"error\", listener: (error: Error) => void) => unknown;\n off?: (event: \"error\", listener: (error: Error) => void) => unknown;\n once?: (event: \"drain\", listener: () => void) => unknown;\n end?: (callback?: (error?: Error | null) => void) => unknown;\n}\n\nexport interface PrettyProcessLike {\n stdout?: PrettyWritableLike;\n stderr?: PrettyWritableLike;\n env?: Record<string, string | undefined>;\n}\n\nexport interface PrettyStreamTransportOptions extends PrettyFormatterOptions {\n name?: string;\n stream?: PrettyWritableLike;\n process?: PrettyProcessLike;\n minLevel?: LoggerLevel;\n newline?: string;\n endOnClose?: boolean;\n}\n\nexport type PrettyStdoutTransportOptions = Omit<PrettyStreamTransportOptions, \"stream\"> & {\n stream?: PrettyWritableLike;\n};\n\ninterface FlushWaiter {\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction currentProcess(): PrettyProcessLike | undefined {\n return (globalThis as unknown as { process?: PrettyProcessLike }).process;\n}\n\nfunction processFor(options: PrettyStreamTransportOptions): PrettyProcessLike | undefined {\n return options.process ?? currentProcess();\n}\n\nfunction shouldUseAnsi(stream: PrettyWritableLike, options: PrettyStreamTransportOptions): boolean {\n if (options.colors === \"always\") return true;\n if (options.colors === \"never\") return false;\n const env = processFor(options)?.env;\n if (env?.NO_COLOR !== undefined) return false;\n if (env?.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") return true;\n return stream.isTTY === true;\n}\n\nfunction streamFromProcess(\n options: PrettyStreamTransportOptions,\n key: \"stdout\" | \"stderr\",\n): PrettyWritableLike {\n const stream = processFor(options)?.[key];\n if (!stream) {\n throw new Error(`pretty ${key} transport requires a writable stream or process.${key}`);\n }\n return stream;\n}\n\nexport function prettyStreamTransport(options: PrettyStreamTransportOptions = {}): Transport {\n const stream = options.stream ?? streamFromProcess(options, \"stdout\");\n const useAnsi = shouldUseAnsi(stream, options);\n const newline = options.newline ?? \"\\n\";\n const waiters: FlushWaiter[] = [];\n let pendingDrains = 0;\n let lastError: Error | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n\n const settleWaitersIfIdle = () => {\n if (pendingDrains > 0 || waiters.length === 0) return;\n const error = lastError;\n lastError = undefined;\n for (const waiter of waiters.splice(0)) {\n if (error) waiter.reject(error);\n else waiter.resolve();\n }\n };\n\n const recordError = (error: unknown, operation: string) => {\n lastError = normalizeError(error);\n lastContext?.reportInternalError(lastError, {\n phase: \"transport\",\n transport: options.name ?? \"pretty-stream\",\n operation,\n });\n settleWaitersIfIdle();\n };\n\n const onError = (error: Error) => recordError(error, \"stream-error\");\n stream.on?.(\"error\", onError);\n\n const waitForDrain = () => {\n if (!stream.once) return;\n pendingDrains += 1;\n stream.once(\"drain\", () => {\n pendingDrains -= 1;\n settleWaitersIfIdle();\n });\n };\n\n const writePayload = (payload: string, context: TransportContext) => {\n if (closed) return;\n lastContext = context;\n try {\n const result = stream.write(payload);\n if (result === false) waitForDrain();\n } catch (error) {\n recordError(error, \"write\");\n }\n };\n\n const writeEvent = (event: LogEvent, context: TransportContext) => {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n const rendered = formatPrettyEvent(event, { ...options, colors: useAnsi ? \"always\" : \"never\" });\n writePayload(`${useAnsi ? rendered.ansiText : rendered.text}${newline}`, context);\n };\n\n const transport: Transport = {\n name: options.name ?? \"pretty-stream\",\n minLevel: options.minLevel,\n write(record: LogRecord, context) {\n writeEvent(context.toEvent(record), context);\n },\n writeBatch(records, context) {\n for (const record of records) writeEvent(context.toEvent(record), context);\n },\n log(event, context) {\n writeEvent(event, context);\n },\n logBatch(events, context) {\n for (const event of events) writeEvent(event, context);\n },\n flush() {\n if (pendingDrains === 0) {\n const error = lastError;\n lastError = undefined;\n if (error) return Promise.reject(error);\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n flushSync() {\n // Stream writes are already issued synchronously. Backpressure is observed\n // by async flush() through drain events.\n },\n close() {\n return Promise.resolve(transport.flush?.()).then(\n () =>\n new Promise<void>((resolve, reject) => {\n closed = true;\n stream.off?.(\"error\", onError);\n if (!options.endOnClose || !stream.end) {\n resolve();\n return;\n }\n stream.end((error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n }),\n );\n },\n };\n\n return transport;\n}\n\nexport function prettyStdoutTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stdout\",\n stream: options.stream ?? streamFromProcess(options, \"stdout\"),\n });\n}\n\nexport function prettyStderrTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stderr\",\n stream: options.stream ?? streamFromProcess(options, \"stderr\"),\n });\n}\n"],"mappings":";;;AA8CA,MAAM,YAAY;AAClB,MAAM,aAAkD;CACtD,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;AACT;AAEA,MAAM,YAAiD;CACrD,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;AACT;AAEA,MAAM,SAA8C;CAClD,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACP,OAAO;AACT;AAEA,SAAS,WACP,WACA,WACkB;CAClB,MAAM,WAAW,YAAY;CAC7B,OAAO;EACL,OAAO,UAAU,SAAS,OAAO;EACjC,MAAM,UAAU,QAAQ,WAAW;EACnC,KAAK,UAAU,OAAO,UAAU;CAClC;AACF;AAEA,SAAS,WAAW,OAAiB,QAA8C;CACjF,IAAI,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK;CACrD,IAAI,WAAW,QAAQ,OAAO,KAAA;CAC9B,MAAM,OAAO,IAAI,KAAK,MAAM,IAAI;CAChC,IAAI,WAAW,OAAO,OAAO,KAAK,YAAY;CAC9C,IAAI,WAAW,SAAS,OAAO,KAAK,eAAe;CACnD,OAAO,KAAK,YAAY,CAAC,CAAC,MAAM,IAAI,EAAE;AACxC;AAEA,SAAS,OAAO,OAAwB;CACtC,IAAI,UAAU,MAAM,OAAO;CAC3B,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,OAAO,UAAU,UAC9E,OAAO,OAAO,KAAK;CAErB,QAAA,GAAA,eAAA,kBAAA,CAAyB,OAAO;EAAE,UAAU;EAAG,gBAAgB;EAAI,eAAe;CAAG,CAAC;AACxF;AAEA,SAAS,SAAS,OAAe,WAA2B;CAC1D,IAAI,MAAM,UAAU,WAAW,OAAO;CACtC,IAAI,aAAa,GAAG,OAAO,MAAM,MAAM,GAAG,SAAS;CACnD,OAAO,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,EAAE;AACvD;AAEA,SAAS,QAAQ,MAAwB,iBAA6C;CACpF,IAAI,CAAC,MAAM,OAAO,KAAA;CAClB,MAAM,UAAU,OAAO,QAAQ,IAAI;CACnC,IAAI,QAAQ,WAAW,GAAG,OAAO,KAAA;CACjC,OAAO,QACJ,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,GAAG,SAAS,OAAO,KAAK,GAAG,eAAe,GAAG,CAAC,CAC3E,KAAK,GAAG;AACb;AAEA,SAAS,WACP,OACA,SACQ;CACR,QAAA,GAAA,eAAA,kBAAA,CAAyB,OAAO;EAC9B,UAAU,QAAQ,kBAAkB;EACpC,gBAAgB;EAChB,eAAe,QAAQ,iBAAiB;EACxC,QAAQ;CACV,CAAC;AACH;AAEA,SAAS,eAAe,OAAiB,SAAiD;CACxF,MAAM,UAA0B,CAAC;CACjC,MAAM,QAAQ,KAAa,UAAmB;EAC5C,IAAI,UAAU,KAAA,GAAW;EACzB,QAAQ,KAAK;GAAE;GAAK;GAAO,MAAM,WAAW,OAAO,OAAO;EAAE,CAAC;CAC/D;CAEA,IAAI,QAAQ,eAAe,MAAM,KAAK,QAAQ,MAAM,IAAI;CACxD,IAAI,QAAQ,gBAAgB,MAAM,KAAK,SAAS,MAAM,KAAK;CAC3D,IAAI,QAAQ,kBAAkB,OAAO,KAAK,WAAW,MAAM,OAAO;CAClE,IAAI,QAAQ,gBAAgB,OAAO,KAAK,SAAS,MAAM,KAAK;CAC5D,IAAI,QAAQ,iBAAiB,OAAO,KAAK,UAAU,MAAM,MAAM;CAC/D,IAAI,QAAQ,aAAa,OAAO,KAAK,MAAM,MAAM,EAAE;CACnD,OAAO;AACT;AAEA,SAAS,aAAa,OAAiB,SAA2C;CAChF,MAAM,kBAAkB,QAAQ,mBAAmB;CACnD,MAAM,QAAQ,WAAW,MAAM,WAAW,QAAQ,WAAW;CAC7D,MAAM,WAAqB,CAAC;CAC5B,MAAM,OAAO,WAAW,OAAO,QAAQ,QAAQ,MAAM;CACrD,IAAI,MAAM,SAAS,KAAK,IAAI,KAAK,EAAE;CACnC,SAAS,KAAK,MAAM,KAAK;CACzB,IAAI,QAAQ,iBAAiB,MAAM,SAAS,KAAK,MAAM,MAAM;CAC7D,KAAK,QAAQ,eAAe,SAAS,MAAM,MAAM,SAAS,KAAK,IAAI,MAAM,KAAK,EAAE;CAChF,IAAI,QAAQ,eAAe,MAAM;EAC/B,MAAM,OAAO,QAAQ,MAAM,MAAM,eAAe;EAChD,IAAI,MAAM,SAAS,KAAK,IAAI,KAAK,EAAE;CACrC;CACA,OAAO;AACT;AAEA,SAAS,cAAc,OAAiB,SAAyC;CAC/E,OAAO,GAAG,aAAa,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EAAE,GAAG,MAAM;AAC5D;AAEA,SAAS,YAAY,UAAkB,SAAyB,iBAAiC;CAC/F,IAAI,QAAQ,WAAW,GAAG,OAAO;CAIjC,OAAO,GAAG,SAAS,GAHJ,QACZ,KAAK,WAAW,GAAG,OAAO,IAAI,GAAG,SAAS,OAAO,MAAM,eAAe,GAAG,CAAC,CAC1E,KAAK,GACmB;AAC7B;AAEA,SAAS,aAAa,UAAkB,SAAiC;CACvE,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OAAO,CAAC,UAAU,GAAG,QAAQ,KAAK,WAAW,KAAK,OAAO,IAAI,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;AAC5F;AAEA,SAAS,SAAS,OAAiB,MAAc,SAAyC;CACxF,IAAI,QAAQ,WAAW,UAAU,OAAO;CACxC,MAAM,QAAQ,WAAW,MAAM,WAAW,QAAQ,WAAW;CAC7D,MAAM,QAAQ,MAAM;CACpB,OAAO,KAAK,QAAQ,OAAO,GAAG,MAAM,OAAO,QAAQ,WAAW;AAChE;AAEA,SAAS,YAAY,OAAiB,SAAiC,SAAyB;CAC9F,MAAM,QAAQ,WAAW,MAAM,WAAW,QAAQ,WAAW;CAC7D,MAAM,WAAW,aAAa,OAAO,OAAO;CAC5C,MAAM,aAAa,SAAS,QAAQ,MAAM,KAAK;CAC/C,MAAM,cAAc,SAAS,MAAM,GAAG,UAAU,CAAC,CAAC,KAAK,GAAG;CAC1D,MAAM,aAAa,SAAS,MAAM,aAAa,CAAC,CAAC,CAAC,KAAK,GAAG;CAC1D,MAAM,SAAS,cAAc,GAAG,YAAY,KAAK;CACjD,MAAM,QAAQ,aAAa,IAAI,eAAe;CAG9C,OAAO;EAAC,KADY,OAAO,IAAI,MAAM,MAAM,IAAI,MAAM,GAAG,MAAM;EAC9C;EAAa,MAAM;EAAK;EAAI,GAAG,QAAQ,KAAK,WAAW,OAAO,KAAK;CAAC;AACtF;AAEA,SAAgB,kBACd,OACA,UAAkC,CAAC,GACb;CACtB,MAAM,kBAAkB,QAAQ,mBAAmB;CACnD,MAAM,UAAU,eAAe,OAAO,OAAO;CAC7C,MAAM,WAAW,cAAc,OAAO,OAAO;CAC7C,MAAM,QACH,QAAQ,QAAQ,eAAe,aAC5B,aAAa,UAAU,OAAO,IAC9B,YAAY,UAAU,SAAS,eAAe;CAEpD,OAAO;EACL;EACA,UAAU,SAAS,OAAO,MAAM,OAAO;EACvC,aAAa,YAAY,OAAO,SAAS,OAAO;EAChD;CACF;AACF;;;AChMA,SAAS,eAAe,OAAgC;CACtD,IAAI,MAAM,cAAc,SAAS,OAAO;CACxC,IAAI,MAAM,cAAc,SAAS,OAAO;CACxC,IAAI,MAAM,cAAc,QAAQ,OAAO;CACvC,IAAI,MAAM,cAAc,WAAW,MAAM,cAAc,SAAS,OAAO;CACvE,OAAO;AACT;AAEA,SAAS,cAAc,OAA0B;CAC/C,MAAM,cAAc,MAAM,QAAQ;CAClC,OAAO,gBAAgB,qBAAqB,gBAAgB;AAC9D;AAEA,SAAS,sBAA+B;CACtC,OAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC9D;AAEA,SAAS,uBAAuB,OAA8C;CAC5E,IAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,OAAO,oBAAoB;CACxE,OAAO;AACT;AAEA,SAAS,UAAU,QAAuB,QAAuC;CAC/E,IAAI,QAQF,QANE,OAAO,WACP,OAAO,OACP,OAAO,eACA,CAEP,GAAA,CACY,KAAK,MAAM;CAG3B,MAAM,YAAA,GAAA,eAAA,0BAAA,CAAqC;CAC3C,MAAM,WACJ,OAAO,YAAY,cAAc,CAAC,IAAK;CACzC,MAAM,SACJ,SAAS,QAAQ,WACjB,SAAS,WACT,SAAS,QAAQ,OACjB,SAAS,cACF,CAEP;CAEF,OAAO,OAAO,YAAY,cAAc,SAAS,OAAO,KAAK,OAAO;AACtE;AAEA,SAAgB,uBAAuB,UAAyC,CAAC,GAAc;CAC7F,MAAM,SAAS,QAAQ,UAAU;CACjC,MAAM,mBAAmB,uBAAuB,QAAQ,aAAa;CAErE,MAAM,cAAc,UAAoB;EACtC,IAAI,CAAC,OAAO,KAAK,GAAG;EACpB,MAAM,WAAW,kBAAkB,OAAO,OAAO;EACjD,MAAM,SAAS,UAAU,eAAe,KAAK,GAAG,QAAQ,OAAO;EAC/D,MAAM,OAAO,mBACT,SAAS,cACT,CACE,QAAQ,WAAW,WAAW,SAAS,WAAW,SAAS,MAC3D,GAAG,SAAS,QAAQ,KAAK,WAAW,OAAO,KAAK,CAClD;EACJ,IAAI,QAAQ,cAAc,KAAK,KAAK,KAAK;EACzC,OAAO,GAAG,IAAI;CAChB;CAEA,MAAM,eAAe,QAAmB,YAA8B;EACpE,WAAW,QAAQ,QAAQ,MAAM,CAAC;CACpC;CAEA,OAAO;EACL,MAAM,QAAQ,QAAQ;EACtB,MAAM,QAAQ,SAAS;GACrB,YAAY,QAAQ,OAAO;EAC7B;EACA,WAAW,SAAS,SAAS;GAC3B,KAAK,MAAM,UAAU,SAAS,YAAY,QAAQ,OAAO;EAC3D;EACA,IAAI,OAAO;GACT,WAAW,KAAK;EAClB;EACA,SAAS,QAAQ;GACf,KAAK,MAAM,SAAS,QAAQ,WAAW,KAAK;EAC9C;CACF;AACF;;;ACtEA,SAAS,eAAe,OAAuB;CAC7C,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACjE;AAEA,SAAS,iBAAgD;CACvD,OAAQ,WAA0D;AACpE;AAEA,SAAS,WAAW,SAAsE;CACxF,OAAO,QAAQ,WAAW,eAAe;AAC3C;AAEA,SAAS,cAAc,QAA4B,SAAgD;CACjG,IAAI,QAAQ,WAAW,UAAU,OAAO;CACxC,IAAI,QAAQ,WAAW,SAAS,OAAO;CACvC,MAAM,MAAM,WAAW,OAAO,CAAC,EAAE;CACjC,IAAI,KAAK,aAAa,KAAA,GAAW,OAAO;CACxC,IAAI,KAAK,gBAAgB,KAAA,KAAa,IAAI,gBAAgB,KAAK,OAAO;CACtE,OAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,kBACP,SACA,KACoB;CACpB,MAAM,SAAS,WAAW,OAAO,CAAC,GAAG;CACrC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,UAAU,IAAI,mDAAmD,KAAK;CAExF,OAAO;AACT;AAEA,SAAgB,sBAAsB,UAAwC,CAAC,GAAc;CAC3F,MAAM,SAAS,QAAQ,UAAU,kBAAkB,SAAS,QAAQ;CACpE,MAAM,UAAU,cAAc,QAAQ,OAAO;CAC7C,MAAM,UAAU,QAAQ,WAAW;CACnC,MAAM,UAAyB,CAAC;CAChC,IAAI,gBAAgB;CACpB,IAAI;CACJ,IAAI;CACJ,IAAI,SAAS;CAEb,MAAM,4BAA4B;EAChC,IAAI,gBAAgB,KAAK,QAAQ,WAAW,GAAG;EAC/C,MAAM,QAAQ;EACd,YAAY,KAAA;EACZ,KAAK,MAAM,UAAU,QAAQ,OAAO,CAAC,GACnC,IAAI,OAAO,OAAO,OAAO,KAAK;OACzB,OAAO,QAAQ;CAExB;CAEA,MAAM,eAAe,OAAgB,cAAsB;EACzD,YAAY,eAAe,KAAK;EAChC,aAAa,oBAAoB,WAAW;GAC1C,OAAO;GACP,WAAW,QAAQ,QAAQ;GAC3B;EACF,CAAC;EACD,oBAAoB;CACtB;CAEA,MAAM,WAAW,UAAiB,YAAY,OAAO,cAAc;CACnE,OAAO,KAAK,SAAS,OAAO;CAE5B,MAAM,qBAAqB;EACzB,IAAI,CAAC,OAAO,MAAM;EAClB,iBAAiB;EACjB,OAAO,KAAK,eAAe;GACzB,iBAAiB;GACjB,oBAAoB;EACtB,CAAC;CACH;CAEA,MAAM,gBAAgB,SAAiB,YAA8B;EACnE,IAAI,QAAQ;EACZ,cAAc;EACd,IAAI;GAEF,IADe,OAAO,MAAM,OACnB,MAAM,OAAO,aAAa;EACrC,SAAS,OAAO;GACd,YAAY,OAAO,OAAO;EAC5B;CACF;CAEA,MAAM,cAAc,OAAiB,YAA8B;EACjE,IAAI,QAAQ,aAAa,KAAA,KAAa,MAAM,SAAA,GAAA,eAAA,aAAA,CAAqB,QAAQ,QAAQ,GAAG;EACpF,MAAM,WAAW,kBAAkB,OAAO;GAAE,GAAG;GAAS,QAAQ,UAAU,WAAW;EAAQ,CAAC;EAC9F,aAAa,GAAG,UAAU,SAAS,WAAW,SAAS,OAAO,WAAW,OAAO;CAClF;CAEA,MAAM,YAAuB;EAC3B,MAAM,QAAQ,QAAQ;EACtB,UAAU,QAAQ;EAClB,MAAM,QAAmB,SAAS;GAChC,WAAW,QAAQ,QAAQ,MAAM,GAAG,OAAO;EAC7C;EACA,WAAW,SAAS,SAAS;GAC3B,KAAK,MAAM,UAAU,SAAS,WAAW,QAAQ,QAAQ,MAAM,GAAG,OAAO;EAC3E;EACA,IAAI,OAAO,SAAS;GAClB,WAAW,OAAO,OAAO;EAC3B;EACA,SAAS,QAAQ,SAAS;GACxB,KAAK,MAAM,SAAS,QAAQ,WAAW,OAAO,OAAO;EACvD;EACA,QAAQ;GACN,IAAI,kBAAkB,GAAG;IACvB,MAAM,QAAQ;IACd,YAAY,KAAA;IACZ,IAAI,OAAO,OAAO,QAAQ,OAAO,KAAK;IACtC,OAAO,QAAQ,QAAQ;GACzB;GACA,OAAO,IAAI,SAAe,SAAS,WAAW;IAC5C,QAAQ,KAAK;KAAE;KAAS;IAAO,CAAC;GAClC,CAAC;EACH;EACA,YAAY,CAGZ;EACA,QAAQ;GACN,OAAO,QAAQ,QAAQ,UAAU,QAAQ,CAAC,CAAC,CAAC,WAExC,IAAI,SAAe,SAAS,WAAW;IACrC,SAAS;IACT,OAAO,MAAM,SAAS,OAAO;IAC7B,IAAI,CAAC,QAAQ,cAAc,CAAC,OAAO,KAAK;KACtC,QAAQ;KACR;IACF;IACA,OAAO,KAAK,UAAyB;KACnC,IAAI,OAAO,OAAO,KAAK;UAClB,QAAQ;IACf,CAAC;GACH,CAAC,CACL;EACF;CACF;CAEA,OAAO;AACT;AAEA,SAAgB,sBAAsB,UAAwC,CAAC,GAAc;CAC3F,OAAO,sBAAsB;EAC3B,GAAG;EACH,MAAM,QAAQ,QAAQ;EACtB,QAAQ,QAAQ,UAAU,kBAAkB,SAAS,QAAQ;CAC/D,CAAC;AACH;AAEA,SAAgB,sBAAsB,UAAwC,CAAC,GAAc;CAC3F,OAAO,sBAAsB;EAC3B,GAAG;EACH,MAAM,QAAQ,QAAQ;EACtB,QAAQ,QAAQ,UAAU,kBAAkB,SAAS,QAAQ;CAC/D,CAAC;AACH"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/formatter.ts","../src/console-transport.ts","../src/stream-transport.ts"],"sourcesContent":["import { safeJsonStringify, type EnabledLogLevelName, type LogEvent } from \"@loggerjs/core\";\n\nexport type PrettyColorMode = \"auto\" | \"always\" | \"never\";\nexport type PrettyRenderMode = \"compact\" | \"expanded\";\nexport type PrettyTimeFormat = \"iso\" | \"local\" | \"time\" | \"none\" | ((event: LogEvent) => string);\n\nexport interface PrettyLevelStyle {\n label: string;\n ansi: string;\n css: string;\n}\n\nexport type PrettyLevelStyles = Partial<Record<EnabledLogLevelName, Partial<PrettyLevelStyle>>>;\n\nexport interface PrettyFormatterOptions {\n colors?: PrettyColorMode;\n mode?: PrettyRenderMode;\n time?: PrettyTimeFormat;\n includeLogger?: boolean;\n includeType?: boolean;\n includeTags?: boolean;\n includeData?: boolean;\n includeError?: boolean;\n includeContext?: boolean;\n includeTrace?: boolean;\n includeSource?: boolean;\n includeId?: boolean;\n maxInlineLength?: number;\n maxObjectDepth?: number;\n maxObjectKeys?: number;\n levelStyles?: PrettyLevelStyles;\n}\n\nexport interface PrettyDetail {\n key: string;\n value: unknown;\n text: string;\n}\n\nexport interface PrettyFormattedEvent {\n text: string;\n ansiText: string;\n browserArgs: unknown[];\n details: PrettyDetail[];\n}\n\nconst ansiReset = \"\\x1b[0m\";\nconst ansiStyles: Record<EnabledLogLevelName, string> = {\n trace: \"\\x1b[90m\",\n debug: \"\\x1b[36m\",\n info: \"\\x1b[34m\",\n warn: \"\\x1b[33m\",\n error: \"\\x1b[31m\",\n fatal: \"\\x1b[35m\",\n};\n\nconst cssStyles: Record<EnabledLogLevelName, string> = {\n trace: \"color:#6b7280;font-weight:600\",\n debug: \"color:#0891b2;font-weight:600\",\n info: \"color:#2563eb;font-weight:600\",\n warn: \"color:#b45309;font-weight:700\",\n error: \"color:#dc2626;font-weight:700\",\n fatal: \"color:#7e22ce;font-weight:800\",\n};\n\nconst labels: Record<EnabledLogLevelName, string> = {\n trace: \"TRACE\",\n debug: \"DEBUG\",\n info: \"INFO \",\n warn: \"WARN \",\n error: \"ERROR\",\n fatal: \"FATAL\",\n};\n\nfunction levelStyle(\n levelName: EnabledLogLevelName,\n overrides: PrettyLevelStyles | undefined,\n): PrettyLevelStyle {\n const override = overrides?.[levelName];\n return {\n label: override?.label ?? labels[levelName],\n ansi: override?.ansi ?? ansiStyles[levelName],\n css: override?.css ?? cssStyles[levelName],\n };\n}\n\nfunction formatTime(event: LogEvent, format: PrettyTimeFormat): string | undefined {\n if (typeof format === \"function\") return format(event);\n if (format === \"none\") return undefined;\n const date = new Date(event.time);\n if (format === \"iso\") return date.toISOString();\n if (format === \"local\") return date.toLocaleString();\n return date.toISOString().slice(11, 23);\n}\n\nfunction scalar(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n return safeJsonStringify(value, { maxDepth: 2, maxArrayLength: 20, maxObjectKeys: 20 });\n}\n\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n if (maxLength <= 1) return value.slice(0, maxLength);\n return `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n}\n\nfunction tagText(tags: LogEvent[\"tags\"], maxInlineLength: number): string | undefined {\n if (!tags) return undefined;\n const entries = Object.entries(tags);\n if (entries.length === 0) return undefined;\n return entries\n .map(([key, value]) => `${key}=${truncate(scalar(value), maxInlineLength)}`)\n .join(\" \");\n}\n\nfunction detailText(\n value: unknown,\n options: Pick<PrettyFormatterOptions, \"maxObjectDepth\" | \"maxObjectKeys\">,\n): string {\n return safeJsonStringify(value, {\n maxDepth: options.maxObjectDepth ?? 4,\n maxArrayLength: 50,\n maxObjectKeys: options.maxObjectKeys ?? 80,\n stable: true,\n });\n}\n\nfunction collectDetails(event: LogEvent, options: PrettyFormatterOptions): PrettyDetail[] {\n const details: PrettyDetail[] = [];\n const push = (key: string, value: unknown) => {\n if (value === undefined) return;\n details.push({ key, value, text: detailText(value, options) });\n };\n\n if (options.includeData ?? true) push(\"data\", event.data);\n if (options.includeError ?? true) push(\"error\", event.error);\n if (options.includeContext ?? false) push(\"context\", event.context);\n if (options.includeTrace ?? false) push(\"trace\", event.trace);\n if (options.includeSource ?? false) push(\"source\", event.source);\n if (options.includeId ?? false) push(\"id\", event.id);\n return details;\n}\n\nfunction baseSegments(event: LogEvent, options: PrettyFormatterOptions): string[] {\n const maxInlineLength = options.maxInlineLength ?? 160;\n const style = levelStyle(event.levelName, options.levelStyles);\n const segments: string[] = [];\n const time = formatTime(event, options.time ?? \"time\");\n if (time) segments.push(`[${time}]`);\n segments.push(style.label);\n if (options.includeLogger ?? true) segments.push(event.logger);\n if ((options.includeType ?? true) && event.type) segments.push(`<${event.type}>`);\n if (options.includeTags ?? true) {\n const tags = tagText(event.tags, maxInlineLength);\n if (tags) segments.push(`[${tags}]`);\n }\n return segments;\n}\n\nfunction plainBaseLine(event: LogEvent, options: PrettyFormatterOptions): string {\n return `${baseSegments(event, options).join(\" \")} ${event.message}`;\n}\n\nfunction compactText(baseLine: string, details: PrettyDetail[], maxInlineLength: number): string {\n if (details.length === 0) return baseLine;\n const suffix = details\n .map((detail) => `${detail.key}=${truncate(detail.text, maxInlineLength)}`)\n .join(\" \");\n return `${baseLine} ${suffix}`;\n}\n\nfunction expandedText(baseLine: string, details: PrettyDetail[]): string {\n if (details.length === 0) return baseLine;\n return [baseLine, ...details.map((detail) => ` ${detail.key}: ${detail.text}`)].join(\"\\n\");\n}\n\nfunction withAnsi(event: LogEvent, text: string, options: PrettyFormatterOptions): string {\n if (options.colors !== \"always\") return text;\n const style = levelStyle(event.levelName, options.levelStyles);\n const label = style.label;\n return text.replace(label, `${style.ansi}${label}${ansiReset}`);\n}\n\nfunction browserArgs(event: LogEvent, options: PrettyFormatterOptions, details: PrettyDetail[]) {\n const style = levelStyle(event.levelName, options.levelStyles);\n const segments = baseSegments(event, options);\n const levelIndex = segments.indexOf(style.label);\n const beforeLevel = segments.slice(0, levelIndex).join(\" \");\n const afterLevel = segments.slice(levelIndex + 1).join(\" \");\n const before = beforeLevel ? `${beforeLevel} ` : \"\";\n const after = afterLevel ? ` ${afterLevel}` : \"\";\n const prefixStyle = \"color:#6b7280\";\n const format = `%c${before}%c${style.label}%c${after} ${event.message}`;\n return [format, prefixStyle, style.css, \"\", ...details.map((detail) => detail.value)];\n}\n\nexport function formatPrettyEvent(\n event: LogEvent,\n options: PrettyFormatterOptions = {},\n): PrettyFormattedEvent {\n const maxInlineLength = options.maxInlineLength ?? 160;\n const details = collectDetails(event, options);\n const baseLine = plainBaseLine(event, options);\n const text =\n (options.mode ?? \"compact\") === \"expanded\"\n ? expandedText(baseLine, details)\n : compactText(baseLine, details, maxInlineLength);\n\n return {\n text,\n ansiText: withAnsi(event, text, options),\n browserArgs: browserArgs(event, options, details),\n details,\n };\n}\n","import {\n registerUnpatchedDefaults,\n type ConsoleMethod,\n type LogEvent,\n type LogRecord,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { formatPrettyEvent, type PrettyFormatterOptions } from \"./formatter\";\n\nexport interface PrettyConsoleLike {\n debug?: (...args: unknown[]) => void;\n error?: (...args: unknown[]) => void;\n info?: (...args: unknown[]) => void;\n log?: (...args: unknown[]) => void;\n trace?: (...args: unknown[]) => void;\n warn?: (...args: unknown[]) => void;\n}\n\nexport interface PrettyConsoleTransportOptions extends PrettyFormatterOptions {\n name?: string;\n browserStyles?: boolean | \"auto\";\n includeEvent?: boolean;\n console?: PrettyConsoleLike;\n filter?: (event: LogEvent) => boolean;\n}\n\nfunction methodForEvent(event: LogEvent): ConsoleMethod {\n if (event.levelName === \"trace\") return \"trace\";\n if (event.levelName === \"debug\") return \"debug\";\n if (event.levelName === \"warn\") return \"warn\";\n if (event.levelName === \"error\" || event.levelName === \"fatal\") return \"error\";\n return \"info\";\n}\n\nfunction defaultFilter(event: LogEvent): boolean {\n const integration = event.source?.integration;\n return integration !== \"capture-console\" && integration !== \"integration:capture-console\";\n}\n\nfunction browserStyleSupport(): boolean {\n return typeof window !== \"undefined\" && typeof document !== \"undefined\";\n}\n\nfunction shouldUseBrowserStyles(value: boolean | \"auto\" | undefined): boolean {\n if (value === undefined || value === \"auto\") return browserStyleSupport();\n return value;\n}\n\nfunction writerFor(method: ConsoleMethod, target: PrettyConsoleLike | undefined) {\n if (target) {\n const writer =\n target[method] ??\n target.log ??\n target.info ??\n (() => {\n // Intentionally empty: callers can inject a partial console in tests.\n });\n return writer.bind(target);\n }\n\n const registry = registerUnpatchedDefaults();\n const fallback: PrettyConsoleLike =\n typeof console === \"undefined\" ? {} : (console as unknown as PrettyConsoleLike);\n const writer =\n registry.console[method] ??\n fallback[method] ??\n registry.console.log ??\n fallback.log ??\n (() => {\n // No console surface exists in this runtime.\n });\n\n return typeof console === \"undefined\" ? writer : writer.bind(console);\n}\n\nexport function prettyConsoleTransport(options: PrettyConsoleTransportOptions = {}): Transport {\n const filter = options.filter ?? defaultFilter;\n const useBrowserStyles = shouldUseBrowserStyles(options.browserStyles);\n\n const writeEvent = (event: LogEvent) => {\n if (!filter(event)) return;\n const rendered = formatPrettyEvent(event, options);\n const writer = writerFor(methodForEvent(event), options.console);\n const args = useBrowserStyles\n ? rendered.browserArgs\n : [\n options.colors === \"always\" ? rendered.ansiText : rendered.text,\n ...rendered.details.map((detail) => detail.value),\n ];\n if (options.includeEvent) args.push(event);\n writer(...args);\n };\n\n const writeRecord = (record: LogRecord, context: TransportContext) => {\n writeEvent(context.toEvent(record));\n };\n\n return {\n name: options.name ?? \"pretty-console\",\n write(record, context) {\n writeRecord(record, context);\n },\n writeBatch(records, context) {\n for (const record of records) writeRecord(record, context);\n },\n log(event) {\n writeEvent(event);\n },\n logBatch(events) {\n for (const event of events) writeEvent(event);\n },\n };\n}\n","import {\n toLevelValue,\n type LogEvent,\n type LogRecord,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { formatPrettyEvent, type PrettyFormatterOptions } from \"./formatter\";\n\nexport interface PrettyWritableLike {\n isTTY?: boolean;\n write: (chunk: string) => unknown;\n on?: (event: \"error\", listener: (error: Error) => void) => unknown;\n off?: (event: \"error\", listener: (error: Error) => void) => unknown;\n once?: (event: \"drain\", listener: () => void) => unknown;\n end?: (callback?: (error?: Error | null) => void) => unknown;\n}\n\nexport interface PrettyProcessLike {\n stdout?: PrettyWritableLike;\n stderr?: PrettyWritableLike;\n env?: Record<string, string | undefined>;\n}\n\nexport interface PrettyStreamTransportOptions extends PrettyFormatterOptions {\n name?: string;\n stream?: PrettyWritableLike;\n process?: PrettyProcessLike;\n minLevel?: LoggerLevel;\n newline?: string;\n endOnClose?: boolean;\n}\n\nexport type PrettyStdoutTransportOptions = Omit<PrettyStreamTransportOptions, \"stream\"> & {\n stream?: PrettyWritableLike;\n};\n\ninterface FlushWaiter {\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nfunction normalizeError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction currentProcess(): PrettyProcessLike | undefined {\n return (globalThis as unknown as { process?: PrettyProcessLike }).process;\n}\n\nfunction processFor(options: PrettyStreamTransportOptions): PrettyProcessLike | undefined {\n return options.process ?? currentProcess();\n}\n\nfunction shouldUseAnsi(stream: PrettyWritableLike, options: PrettyStreamTransportOptions): boolean {\n if (options.colors === \"always\") return true;\n if (options.colors === \"never\") return false;\n const env = processFor(options)?.env;\n if (env?.NO_COLOR !== undefined) return false;\n if (env?.FORCE_COLOR !== undefined && env.FORCE_COLOR !== \"0\") return true;\n return stream.isTTY === true;\n}\n\nfunction streamFromProcess(\n options: PrettyStreamTransportOptions,\n key: \"stdout\" | \"stderr\",\n): PrettyWritableLike {\n const stream = processFor(options)?.[key];\n if (!stream) {\n throw new Error(`pretty ${key} transport requires a writable stream or process.${key}`);\n }\n return stream;\n}\n\nexport function prettyStreamTransport(options: PrettyStreamTransportOptions = {}): Transport {\n const stream = options.stream ?? streamFromProcess(options, \"stdout\");\n const useAnsi = shouldUseAnsi(stream, options);\n const newline = options.newline ?? \"\\n\";\n const waiters: FlushWaiter[] = [];\n let pendingDrains = 0;\n let lastError: Error | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n\n const settleWaitersIfIdle = () => {\n if (pendingDrains > 0 || waiters.length === 0) return;\n const error = lastError;\n lastError = undefined;\n for (const waiter of waiters.splice(0)) {\n if (error) waiter.reject(error);\n else waiter.resolve();\n }\n };\n\n const recordError = (error: unknown, operation: string) => {\n lastError = normalizeError(error);\n lastContext?.reportInternalError(lastError, {\n phase: \"transport\",\n transport: options.name ?? \"pretty-stream\",\n operation,\n });\n settleWaitersIfIdle();\n };\n\n const onError = (error: Error) => recordError(error, \"stream-error\");\n stream.on?.(\"error\", onError);\n\n const waitForDrain = () => {\n if (!stream.once) return;\n pendingDrains += 1;\n stream.once(\"drain\", () => {\n pendingDrains -= 1;\n settleWaitersIfIdle();\n });\n };\n\n const writePayload = (payload: string, context: TransportContext) => {\n if (closed) return;\n lastContext = context;\n try {\n const result = stream.write(payload);\n if (result === false) waitForDrain();\n } catch (error) {\n recordError(error, \"write\");\n }\n };\n\n const writeEvent = (event: LogEvent, context: TransportContext) => {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n const rendered = formatPrettyEvent(event, { ...options, colors: useAnsi ? \"always\" : \"never\" });\n writePayload(`${useAnsi ? rendered.ansiText : rendered.text}${newline}`, context);\n };\n\n const transport: Transport = {\n name: options.name ?? \"pretty-stream\",\n minLevel: options.minLevel,\n write(record: LogRecord, context) {\n writeEvent(context.toEvent(record), context);\n },\n writeBatch(records, context) {\n for (const record of records) writeEvent(context.toEvent(record), context);\n },\n log(event, context) {\n writeEvent(event, context);\n },\n logBatch(events, context) {\n for (const event of events) writeEvent(event, context);\n },\n flush() {\n if (pendingDrains === 0) {\n const error = lastError;\n lastError = undefined;\n if (error) return Promise.reject(error);\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n waiters.push({ resolve, reject });\n });\n },\n flushSync() {\n // Stream writes are already issued synchronously. Backpressure is observed\n // by async flush() through drain events.\n },\n close() {\n return Promise.resolve(transport.flush?.()).then(\n () =>\n new Promise<void>((resolve, reject) => {\n closed = true;\n stream.off?.(\"error\", onError);\n if (!options.endOnClose || !stream.end) {\n resolve();\n return;\n }\n stream.end((error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n }),\n );\n },\n };\n\n return transport;\n}\n\nexport function prettyStdoutTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stdout\",\n stream: options.stream ?? streamFromProcess(options, \"stdout\"),\n });\n}\n\nexport function prettyStderrTransport(options: PrettyStdoutTransportOptions = {}): Transport {\n return prettyStreamTransport({\n ...options,\n name: options.name ?? \"pretty-stderr\",\n stream: options.stream ?? streamFromProcess(options, \"stderr\"),\n });\n}\n"],"mappings":"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"}
|