@loggerjs/node 0.5.6 → 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.
Files changed (77) hide show
  1. package/README.md +18 -26
  2. package/dist/bullmq-integration.cjs +2 -145
  3. package/dist/bullmq-integration.cjs.map +1 -1
  4. package/dist/bullmq-integration.js +1 -144
  5. package/dist/bullmq-integration.js.map +1 -1
  6. package/dist/chunks/node-destination-DvP8jBvm.cjs +254 -0
  7. package/dist/chunks/node-destination-DvP8jBvm.cjs.map +1 -0
  8. package/dist/chunks/node-destination-YnpYbctz.js +243 -0
  9. package/dist/chunks/node-destination-YnpYbctz.js.map +1 -0
  10. package/dist/context.cjs +1 -1
  11. package/dist/context.js +1 -1
  12. package/dist/diagnostics-channel-integration.cjs +1 -1
  13. package/dist/file-transport.cjs +3 -231
  14. package/dist/file-transport.cjs.map +1 -1
  15. package/dist/file-transport.js +3 -231
  16. package/dist/file-transport.js.map +1 -1
  17. package/dist/http-transport.cjs +25 -4
  18. package/dist/http-transport.cjs.map +1 -1
  19. package/dist/http-transport.d.ts +15 -0
  20. package/dist/http-transport.d.ts.map +1 -1
  21. package/dist/http-transport.js +25 -4
  22. package/dist/http-transport.js.map +1 -1
  23. package/dist/index.cjs +54 -2355
  24. package/dist/index.d.ts +211 -19
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +25 -2327
  27. package/dist/internal-types.d.ts +1 -0
  28. package/dist/internal-types.d.ts.map +1 -1
  29. package/dist/logger-diagnostics.cjs +4 -5
  30. package/dist/logger-diagnostics.cjs.map +1 -1
  31. package/dist/logger-diagnostics.d.ts +1 -1
  32. package/dist/logger-diagnostics.d.ts.map +1 -1
  33. package/dist/logger-diagnostics.js +1 -1
  34. package/dist/logger-diagnostics.js.map +1 -1
  35. package/dist/nest-integration.cjs +2 -127
  36. package/dist/nest-integration.cjs.map +1 -1
  37. package/dist/nest-integration.js +1 -126
  38. package/dist/nest-integration.js.map +1 -1
  39. package/dist/node-destination.d.ts.map +1 -1
  40. package/dist/payload-transforms.cjs +2 -2
  41. package/dist/payload-transforms.cjs.map +1 -1
  42. package/dist/payload-transforms.d.ts.map +1 -1
  43. package/dist/payload-transforms.js +1 -1
  44. package/dist/payload-transforms.js.map +1 -1
  45. package/dist/prisma-integration.cjs +2 -125
  46. package/dist/prisma-integration.cjs.map +1 -1
  47. package/dist/prisma-integration.js +1 -124
  48. package/dist/prisma-integration.js.map +1 -1
  49. package/dist/process-integration.cjs +20 -1
  50. package/dist/process-integration.cjs.map +1 -1
  51. package/dist/process-integration.d.ts +7 -0
  52. package/dist/process-integration.d.ts.map +1 -1
  53. package/dist/process-integration.js +20 -1
  54. package/dist/process-integration.js.map +1 -1
  55. package/dist/redis-integration.cjs +2 -125
  56. package/dist/redis-integration.cjs.map +1 -1
  57. package/dist/redis-integration.js +1 -124
  58. package/dist/redis-integration.js.map +1 -1
  59. package/dist/rotating-file-transport.cjs +24 -238
  60. package/dist/rotating-file-transport.cjs.map +1 -1
  61. package/dist/rotating-file-transport.d.ts.map +1 -1
  62. package/dist/rotating-file-transport.js +24 -238
  63. package/dist/rotating-file-transport.js.map +1 -1
  64. package/dist/stdout-transport.cjs +3 -162
  65. package/dist/stdout-transport.cjs.map +1 -1
  66. package/dist/stdout-transport.js +3 -162
  67. package/dist/stdout-transport.js.map +1 -1
  68. package/dist/syslog-transport.cjs +1 -1
  69. package/dist/syslog-transport.js +1 -1
  70. package/dist/worker-transport.cjs +5 -4
  71. package/dist/worker-transport.cjs.map +1 -1
  72. package/dist/worker-transport.d.ts.map +1 -1
  73. package/dist/worker-transport.js +3 -2
  74. package/dist/worker-transport.js.map +1 -1
  75. package/package.json +5 -2
  76. package/dist/index.cjs.map +0 -1
  77. package/dist/index.js.map +0 -1
@@ -1,233 +1,6 @@
1
- import { closeSync, createWriteStream, existsSync, mkdirSync, openSync, renameSync, statSync, unlinkSync, writeSync } from "fs";
2
- import { ndjsonCodec, toLevelValue } from "@loggerjs/core";
3
- import { dirname } from "path";
4
- //#region src/node-destination.ts
5
- const encoder = new TextEncoder();
6
- const normalizeError = (error) => error instanceof Error ? error : new Error(String(error));
7
- function byteLength(payload) {
8
- return typeof payload === "string" ? encoder.encode(payload).byteLength : payload.byteLength;
9
- }
10
- function coalescePayloads(payloads) {
11
- if (payloads.every((payload) => typeof payload === "string")) return payloads.join("");
12
- const buffers = payloads.map((payload) => typeof payload === "string" ? Buffer.from(payload) : Buffer.from(payload));
13
- return Buffer.concat(buffers);
14
- }
15
- function isEpipe(error) {
16
- return Boolean(error) && typeof error === "object" && error.code === "EPIPE";
17
- }
18
- function normalizeMinLength(value) {
19
- if (value === void 0 || !Number.isFinite(value) || value <= 0) return 0;
20
- return Math.floor(value);
21
- }
22
- function createNodeStreamDestination(options) {
23
- const minLength = normalizeMinLength(options.minLength);
24
- const ignoreEpipe = options.ignoreEpipe ?? false;
25
- const waiters = [];
26
- const buffer = [];
27
- const pendingPayloads = [];
28
- let bufferedBytes = 0;
29
- let pendingWrites = 0;
30
- let pendingDrains = 0;
31
- let lastError;
32
- let lastContext;
33
- let closed = false;
34
- const reportInternalError = (error, operation) => {
35
- if (ignoreEpipe && isEpipe(error)) return;
36
- lastContext?.reportInternalError(error, {
37
- phase: "transport",
38
- transport: options.name,
39
- operation
40
- });
41
- };
42
- const settleWaitersIfIdle = () => {
43
- if (pendingWrites + pendingDrains > 0) return;
44
- if (waiters.length === 0) return;
45
- const error = lastError;
46
- lastError = void 0;
47
- for (const waiter of waiters.splice(0)) if (error) waiter.reject(error);
48
- else waiter.resolve();
49
- };
50
- const recordError = (error, operation) => {
51
- if (ignoreEpipe && isEpipe(error)) {
52
- closed = true;
53
- return;
54
- }
55
- lastError = normalizeError(error);
56
- reportInternalError(lastError, operation);
57
- };
58
- const onStreamError = (error) => {
59
- recordError(error, "stream-error");
60
- settleWaitersIfIdle();
61
- };
62
- const offError = () => options.stream.off?.("error", onStreamError);
63
- options.stream.on?.("error", onStreamError);
64
- const waitForDrain = () => {
65
- if (!options.stream.once) return;
66
- pendingDrains += 1;
67
- options.stream.once("drain", () => {
68
- pendingDrains -= 1;
69
- settleWaitersIfIdle();
70
- });
71
- };
72
- const removePending = (payload) => {
73
- const index = pendingPayloads.indexOf(payload);
74
- if (index >= 0) pendingPayloads.splice(index, 1);
75
- };
76
- const writeNow = (payload) => {
77
- if (closed) return;
78
- pendingPayloads.push(payload);
79
- pendingWrites += 1;
80
- try {
81
- if (options.stream.write(payload, (error) => {
82
- removePending(payload);
83
- pendingWrites -= 1;
84
- if (error) recordError(error, options.reportOperation ?? "write");
85
- settleWaitersIfIdle();
86
- }) === false) waitForDrain();
87
- } catch (error) {
88
- removePending(payload);
89
- pendingWrites -= 1;
90
- recordError(error, options.reportOperation ?? "write");
91
- settleWaitersIfIdle();
92
- }
93
- };
94
- const flushBuffered = () => {
95
- if (buffer.length === 0) return;
96
- const payload = coalescePayloads(buffer.splice(0));
97
- bufferedBytes = 0;
98
- writeNow(payload);
99
- };
100
- const destination = {
101
- write(payload, context) {
102
- if (closed) return;
103
- lastContext = context;
104
- if (minLength > 0) {
105
- buffer.push(payload);
106
- bufferedBytes += byteLength(payload);
107
- if (bufferedBytes >= minLength) flushBuffered();
108
- return;
109
- }
110
- writeNow(payload);
111
- },
112
- flush() {
113
- flushBuffered();
114
- if (pendingWrites + pendingDrains === 0) {
115
- const error = lastError;
116
- lastError = void 0;
117
- if (error) return Promise.reject(error);
118
- return Promise.resolve();
119
- }
120
- return new Promise((resolve, reject) => {
121
- waiters.push({
122
- resolve,
123
- reject
124
- });
125
- });
126
- },
127
- flushSync() {
128
- if (!options.syncWrite) {
129
- flushBuffered();
130
- return;
131
- }
132
- for (const payload of buffer.splice(0)) options.syncWrite(payload);
133
- bufferedBytes = 0;
134
- for (const payload of pendingPayloads.splice(0)) options.syncWrite(payload);
135
- },
136
- close() {
137
- return destination.flush().then(() => new Promise((resolve, reject) => {
138
- if (!options.stream.end) {
139
- closed = true;
140
- offError();
141
- resolve();
142
- return;
143
- }
144
- options.stream.end((error) => {
145
- closed = true;
146
- offError();
147
- if (error && !(ignoreEpipe && isEpipe(error))) reject(error);
148
- else resolve();
149
- });
150
- }), (error) => {
151
- offError();
152
- return Promise.reject(error);
153
- });
154
- },
155
- closeSync() {
156
- destination.flushSync();
157
- closed = true;
158
- offError();
159
- }
160
- };
161
- return destination;
162
- }
163
- function createNodeFileDestination(options) {
164
- const flags = options.flags ?? (options.append === false ? "w" : "a");
165
- if (options.mkdir) mkdirSync(dirname(options.path), { recursive: true });
166
- let fd;
167
- const getFd = () => {
168
- fd ??= openSync(options.path, flags);
169
- return fd;
170
- };
171
- const syncWrite = (payload) => {
172
- if (typeof payload === "string") writeSync(getFd(), payload);
173
- else writeSync(getFd(), payload);
174
- };
175
- if (options.sync) {
176
- let closed = false;
177
- const releaseSync = () => {
178
- if (fd !== void 0) {
179
- closeSync(fd);
180
- fd = void 0;
181
- }
182
- };
183
- return {
184
- write(payload) {
185
- if (closed) return;
186
- syncWrite(payload);
187
- },
188
- flush() {
189
- return Promise.resolve();
190
- },
191
- flushSync() {},
192
- close() {
193
- releaseSync();
194
- closed = true;
195
- return Promise.resolve();
196
- },
197
- closeSync() {
198
- releaseSync();
199
- closed = true;
200
- },
201
- releaseSync
202
- };
203
- }
204
- const stream = createWriteStream(options.path, { flags });
205
- const destination = createNodeStreamDestination({
206
- name: options.name,
207
- stream,
208
- minLength: options.minLength,
209
- syncWrite
210
- });
211
- const releaseSync = () => {
212
- if (fd !== void 0) {
213
- closeSync(fd);
214
- fd = void 0;
215
- }
216
- };
217
- return {
218
- ...destination,
219
- stream,
220
- close() {
221
- return destination.close().finally(releaseSync);
222
- },
223
- closeSync() {
224
- destination.closeSync();
225
- releaseSync();
226
- },
227
- releaseSync
228
- };
229
- }
230
- //#endregion
1
+ import { t as createNodeFileDestination } from "./chunks/node-destination-YnpYbctz.js";
2
+ import { ndjsonEncoder, toLevelValue } from "@loggerjs/core";
3
+ import { existsSync, renameSync, statSync, unlinkSync } from "fs";
231
4
  //#region src/rotating-file-transport.ts
232
5
  const textEncoder = new TextEncoder();
233
6
  function payloadBytes(payload) {
@@ -252,7 +25,7 @@ function fileSize(path) {
252
25
  }
253
26
  }
254
27
  function rotatingFileTransport(options) {
255
- const codec = options.codec ?? ndjsonCodec();
28
+ const codec = options.codec ?? ndjsonEncoder();
256
29
  const maxBytes = normalizePositiveInteger(options.maxBytes, 10 * 1024 * 1024);
257
30
  const maxFiles = normalizeNonNegativeInteger(options.maxFiles, 5);
258
31
  const archivePath = options.archivePath ?? defaultArchivePath;
@@ -265,11 +38,13 @@ function rotatingFileTransport(options) {
265
38
  sync: true
266
39
  });
267
40
  let bytes = fileSize(options.path);
41
+ let rotateAt = maxBytes;
268
42
  const rotate = () => {
269
43
  destination.releaseSync?.();
270
44
  if (maxFiles === 0) {
271
45
  if (existsSync(options.path)) unlinkSync(options.path);
272
46
  bytes = 0;
47
+ rotateAt = maxBytes;
273
48
  return;
274
49
  }
275
50
  const oldest = archivePath(options.path, maxFiles);
@@ -280,24 +55,34 @@ function rotatingFileTransport(options) {
280
55
  }
281
56
  if (existsSync(options.path)) renameSync(options.path, archivePath(options.path, 1));
282
57
  bytes = 0;
58
+ rotateAt = maxBytes;
283
59
  };
284
- const writePayload = (payload) => {
60
+ const writePayload = (payload, context) => {
285
61
  const size = payloadBytes(payload);
286
- if (bytes > 0 && bytes + size > maxBytes) rotate();
62
+ if (bytes > 0 && bytes + size > rotateAt) try {
63
+ rotate();
64
+ } catch (error) {
65
+ rotateAt = bytes + size + maxBytes;
66
+ context?.reportInternalError(error, {
67
+ phase: "transport",
68
+ transport: transport.name,
69
+ operation: "rotate"
70
+ });
71
+ }
287
72
  destination.write(payload);
288
73
  bytes += size;
289
74
  };
290
- return {
75
+ const transport = {
291
76
  name: options.name ?? "rotating-file",
292
77
  minLevel: options.minLevel,
293
- log(event) {
78
+ log(event, context) {
294
79
  if (options.minLevel !== void 0 && event.level < toLevelValue(options.minLevel)) return;
295
- writePayload(codec.encode(event));
80
+ writePayload(codec.encode(event), context);
296
81
  },
297
- logBatch(events) {
82
+ logBatch(events, context) {
298
83
  for (const event of events) {
299
84
  if (options.minLevel !== void 0 && event.level < toLevelValue(options.minLevel)) continue;
300
- writePayload(codec.encode(event));
85
+ writePayload(codec.encode(event), context);
301
86
  }
302
87
  },
303
88
  flush() {
@@ -310,6 +95,7 @@ function rotatingFileTransport(options) {
310
95
  rotate,
311
96
  currentBytes: () => bytes
312
97
  };
98
+ return transport;
313
99
  }
314
100
  //#endregion
315
101
  export { rotatingFileTransport };
@@ -1 +1 @@
1
- {"version":3,"file":"rotating-file-transport.js","names":[],"sources":["../src/node-destination.ts","../src/rotating-file-transport.ts"],"sourcesContent":["import { closeSync, createWriteStream, mkdirSync, openSync, writeSync, type WriteStream } from \"fs\";\nimport { dirname } from \"path\";\nimport type { TransportContext } from \"@loggerjs/core\";\nimport type { WritableLike } from \"./internal-types\";\n\nexport interface NodeDestination {\n stream?: WriteStream;\n write: (payload: string | Uint8Array, context?: TransportContext) => void;\n flush: () => Promise<void>;\n flushSync: () => void;\n close: () => Promise<void>;\n closeSync: () => void;\n releaseSync?: () => void;\n}\n\nexport interface NodeStreamDestinationOptions {\n name: string;\n stream: WritableLike;\n minLength?: number;\n ignoreEpipe?: boolean;\n reportOperation?: string;\n syncWrite?: (payload: string | Uint8Array) => void;\n}\n\nexport interface NodeFileDestinationOptions {\n name: string;\n path: string;\n flags?: string;\n append?: boolean;\n mkdir?: boolean;\n sync?: boolean;\n minLength?: number;\n}\n\ninterface FlushWaiter {\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nconst encoder = new TextEncoder();\n\nconst normalizeError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error));\n\nfunction byteLength(payload: string | Uint8Array): number {\n return typeof payload === \"string\" ? encoder.encode(payload).byteLength : payload.byteLength;\n}\n\nfunction coalescePayloads(payloads: Array<string | Uint8Array>): string | Uint8Array {\n if (payloads.every((payload) => typeof payload === \"string\")) {\n return payloads.join(\"\");\n }\n const buffers = payloads.map((payload) =>\n typeof payload === \"string\" ? Buffer.from(payload) : Buffer.from(payload),\n );\n return Buffer.concat(buffers);\n}\n\nfunction isEpipe(error: unknown): boolean {\n return (\n Boolean(error) && typeof error === \"object\" && (error as { code?: unknown }).code === \"EPIPE\"\n );\n}\n\nfunction normalizeMinLength(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return 0;\n return Math.floor(value);\n}\n\nexport function createNodeStreamDestination(\n options: NodeStreamDestinationOptions,\n): NodeDestination {\n const minLength = normalizeMinLength(options.minLength);\n const ignoreEpipe = options.ignoreEpipe ?? false;\n const waiters: FlushWaiter[] = [];\n const buffer: Array<string | Uint8Array> = [];\n const pendingPayloads: Array<string | Uint8Array> = [];\n let bufferedBytes = 0;\n let pendingWrites = 0;\n let pendingDrains = 0;\n let lastError: Error | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n\n const reportInternalError = (error: unknown, operation: string) => {\n if (ignoreEpipe && isEpipe(error)) return;\n lastContext?.reportInternalError(error, {\n phase: \"transport\",\n transport: options.name,\n operation,\n });\n };\n\n const settleWaitersIfIdle = () => {\n if (pendingWrites + pendingDrains > 0) return;\n if (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 if (ignoreEpipe && isEpipe(error)) {\n closed = true;\n return;\n }\n lastError = normalizeError(error);\n reportInternalError(lastError, operation);\n };\n\n const onStreamError = (error: Error) => {\n recordError(error, \"stream-error\");\n settleWaitersIfIdle();\n };\n const offError = () => options.stream.off?.(\"error\", onStreamError);\n options.stream.on?.(\"error\", onStreamError);\n\n const waitForDrain = () => {\n if (!options.stream.once) return;\n pendingDrains += 1;\n options.stream.once(\"drain\", () => {\n pendingDrains -= 1;\n settleWaitersIfIdle();\n });\n };\n\n const removePending = (payload: string | Uint8Array) => {\n const index = pendingPayloads.indexOf(payload);\n if (index >= 0) pendingPayloads.splice(index, 1);\n };\n\n const writeNow = (payload: string | Uint8Array) => {\n if (closed) return;\n pendingPayloads.push(payload);\n pendingWrites += 1;\n try {\n const result = options.stream.write(payload, (error?: Error | null) => {\n removePending(payload);\n pendingWrites -= 1;\n if (error) recordError(error, options.reportOperation ?? \"write\");\n settleWaitersIfIdle();\n });\n if (result === false) waitForDrain();\n } catch (error) {\n removePending(payload);\n pendingWrites -= 1;\n recordError(error, options.reportOperation ?? \"write\");\n settleWaitersIfIdle();\n }\n };\n\n const flushBuffered = () => {\n if (buffer.length === 0) return;\n const payload = coalescePayloads(buffer.splice(0));\n bufferedBytes = 0;\n writeNow(payload);\n };\n\n const destination: NodeDestination = {\n write(payload, context) {\n if (closed) return;\n lastContext = context;\n if (minLength > 0) {\n buffer.push(payload);\n bufferedBytes += byteLength(payload);\n if (bufferedBytes >= minLength) flushBuffered();\n return;\n }\n writeNow(payload);\n },\n flush() {\n flushBuffered();\n if (pendingWrites + 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 if (!options.syncWrite) {\n flushBuffered();\n return;\n }\n for (const payload of buffer.splice(0)) options.syncWrite(payload);\n bufferedBytes = 0;\n for (const payload of pendingPayloads.splice(0)) options.syncWrite(payload);\n },\n close() {\n return destination.flush().then(\n () =>\n new Promise<void>((resolve, reject) => {\n if (!options.stream.end) {\n closed = true;\n offError();\n resolve();\n return;\n }\n options.stream.end((error?: Error | null) => {\n closed = true;\n offError();\n if (error && !(ignoreEpipe && isEpipe(error))) reject(error);\n else resolve();\n });\n }),\n (error: unknown) => {\n offError();\n return Promise.reject(error);\n },\n );\n },\n closeSync() {\n destination.flushSync();\n closed = true;\n offError();\n },\n };\n return destination;\n}\n\nexport function createNodeFileDestination(options: NodeFileDestinationOptions): NodeDestination {\n const flags = options.flags ?? (options.append === false ? \"w\" : \"a\");\n if (options.mkdir) mkdirSync(dirname(options.path), { recursive: true });\n\n let fd: number | undefined;\n const getFd = () => {\n fd ??= openSync(options.path, flags);\n return fd;\n };\n const syncWrite = (payload: string | Uint8Array) => {\n if (typeof payload === \"string\") writeSync(getFd(), payload);\n else writeSync(getFd(), payload);\n };\n\n if (options.sync) {\n let closed = false;\n const releaseSync = () => {\n if (fd !== undefined) {\n closeSync(fd);\n fd = undefined;\n }\n };\n return {\n write(payload) {\n if (closed) return;\n syncWrite(payload);\n },\n flush() {\n return Promise.resolve();\n },\n flushSync() {},\n close() {\n releaseSync();\n closed = true;\n return Promise.resolve();\n },\n closeSync() {\n releaseSync();\n closed = true;\n },\n releaseSync,\n };\n }\n\n const stream = createWriteStream(options.path, { flags });\n const destination = createNodeStreamDestination({\n name: options.name,\n stream,\n minLength: options.minLength,\n syncWrite,\n });\n const releaseSync = () => {\n if (fd !== undefined) {\n closeSync(fd);\n fd = undefined;\n }\n };\n return {\n ...destination,\n stream,\n close() {\n return destination.close().finally(releaseSync);\n },\n closeSync() {\n destination.closeSync();\n releaseSync();\n },\n releaseSync,\n };\n}\n","import { existsSync, renameSync, statSync, unlinkSync } from \"fs\";\nimport {\n ndjsonCodec,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n} from \"@loggerjs/core\";\nimport { createNodeFileDestination } from \"./node-destination\";\n\nexport interface RotatingFileTransportOptions {\n path: string;\n name?: string;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n flags?: string;\n append?: boolean;\n mkdir?: boolean;\n maxBytes?: number;\n maxFiles?: number;\n archivePath?: (path: string, index: number) => string;\n}\n\nexport interface RotatingFileTransport extends Transport {\n rotate: () => void;\n flushSync: () => void;\n currentBytes: () => number;\n}\n\nconst textEncoder = new TextEncoder();\n\nfunction payloadBytes(payload: string | Uint8Array): number {\n return typeof payload === \"string\" ? textEncoder.encode(payload).byteLength : payload.byteLength;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return fallback;\n return Math.floor(value);\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value < 0) return fallback;\n return Math.floor(value);\n}\n\nfunction defaultArchivePath(path: string, index: number): string {\n return `${path}.${index}`;\n}\n\nfunction fileSize(path: string): number {\n try {\n return statSync(path).size;\n } catch {\n return 0;\n }\n}\n\nexport function rotatingFileTransport(\n options: RotatingFileTransportOptions,\n): RotatingFileTransport {\n const codec = options.codec ?? ndjsonCodec();\n const maxBytes = normalizePositiveInteger(options.maxBytes, 10 * 1024 * 1024);\n const maxFiles = normalizeNonNegativeInteger(options.maxFiles, 5);\n const archivePath = options.archivePath ?? defaultArchivePath;\n const destination = createNodeFileDestination({\n name: options.name ?? \"rotating-file\",\n path: options.path,\n flags: options.flags,\n append: options.append,\n mkdir: options.mkdir,\n sync: true,\n });\n let bytes = fileSize(options.path);\n\n const rotate = () => {\n destination.releaseSync?.();\n\n if (maxFiles === 0) {\n if (existsSync(options.path)) unlinkSync(options.path);\n bytes = 0;\n return;\n }\n\n const oldest = archivePath(options.path, maxFiles);\n if (existsSync(oldest)) unlinkSync(oldest);\n\n for (let index = maxFiles - 1; index >= 1; index -= 1) {\n const source = archivePath(options.path, index);\n if (existsSync(source)) renameSync(source, archivePath(options.path, index + 1));\n }\n\n if (existsSync(options.path)) renameSync(options.path, archivePath(options.path, 1));\n bytes = 0;\n };\n\n const writePayload = (payload: string | Uint8Array) => {\n const size = payloadBytes(payload);\n if (bytes > 0 && bytes + size > maxBytes) rotate();\n destination.write(payload);\n bytes += size;\n };\n\n const transport: RotatingFileTransport = {\n name: options.name ?? \"rotating-file\",\n minLevel: options.minLevel,\n log(event: LogEvent) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n writePayload(codec.encode(event));\n },\n logBatch(events: LogEvent[]) {\n for (const event of events) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel))\n continue;\n writePayload(codec.encode(event));\n }\n },\n flush() {\n return destination.flush();\n },\n flushSync: destination.flushSync,\n close() {\n return destination.close();\n },\n rotate,\n currentBytes: () => bytes,\n };\n\n return transport;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"rotating-file-transport.js","names":[],"sources":["../src/rotating-file-transport.ts"],"sourcesContent":["import { existsSync, renameSync, statSync, unlinkSync } from \"fs\";\nimport {\n ndjsonEncoder,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n type TransportContext,\n} from \"@loggerjs/core\";\nimport { createNodeFileDestination } from \"./node-destination\";\n\nexport interface RotatingFileTransportOptions {\n path: string;\n name?: string;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n flags?: string;\n append?: boolean;\n mkdir?: boolean;\n maxBytes?: number;\n maxFiles?: number;\n archivePath?: (path: string, index: number) => string;\n}\n\nexport interface RotatingFileTransport extends Transport {\n rotate: () => void;\n flushSync: () => void;\n currentBytes: () => number;\n}\n\nconst textEncoder = new TextEncoder();\n\nfunction payloadBytes(payload: string | Uint8Array): number {\n return typeof payload === \"string\" ? textEncoder.encode(payload).byteLength : payload.byteLength;\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return fallback;\n return Math.floor(value);\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (value === undefined || !Number.isFinite(value) || value < 0) return fallback;\n return Math.floor(value);\n}\n\nfunction defaultArchivePath(path: string, index: number): string {\n return `${path}.${index}`;\n}\n\nfunction fileSize(path: string): number {\n try {\n return statSync(path).size;\n } catch {\n return 0;\n }\n}\n\nexport function rotatingFileTransport(\n options: RotatingFileTransportOptions,\n): RotatingFileTransport {\n const codec = options.codec ?? ndjsonEncoder();\n const maxBytes = normalizePositiveInteger(options.maxBytes, 10 * 1024 * 1024);\n const maxFiles = normalizeNonNegativeInteger(options.maxFiles, 5);\n const archivePath = options.archivePath ?? defaultArchivePath;\n const destination = createNodeFileDestination({\n name: options.name ?? \"rotating-file\",\n path: options.path,\n flags: options.flags,\n append: options.append,\n mkdir: options.mkdir,\n sync: true,\n });\n let bytes = fileSize(options.path);\n let rotateAt = maxBytes;\n\n const rotate = () => {\n destination.releaseSync?.();\n\n if (maxFiles === 0) {\n if (existsSync(options.path)) unlinkSync(options.path);\n bytes = 0;\n rotateAt = maxBytes;\n return;\n }\n\n const oldest = archivePath(options.path, maxFiles);\n if (existsSync(oldest)) unlinkSync(oldest);\n\n for (let index = maxFiles - 1; index >= 1; index -= 1) {\n const source = archivePath(options.path, index);\n if (existsSync(source)) renameSync(source, archivePath(options.path, index + 1));\n }\n\n if (existsSync(options.path)) renameSync(options.path, archivePath(options.path, 1));\n bytes = 0;\n rotateAt = maxBytes;\n };\n\n const writePayload = (payload: string | Uint8Array, context: TransportContext | undefined) => {\n const size = payloadBytes(payload);\n if (bytes > 0 && bytes + size > rotateAt) {\n try {\n rotate();\n } catch (error) {\n // Renames fail while another process holds the file open (EBUSY or\n // EPERM on Windows) or the archive location is unwritable. Keep\n // appending to the current file and retry after another maxBytes\n // instead of dropping this and every later event.\n rotateAt = bytes + size + maxBytes;\n context?.reportInternalError(error, {\n phase: \"transport\",\n transport: transport.name,\n operation: \"rotate\",\n });\n }\n }\n destination.write(payload);\n bytes += size;\n };\n\n const transport: RotatingFileTransport = {\n name: options.name ?? \"rotating-file\",\n minLevel: options.minLevel,\n log(event: LogEvent, context?: TransportContext) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n writePayload(codec.encode(event), context);\n },\n logBatch(events: LogEvent[], context?: TransportContext) {\n for (const event of events) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel))\n continue;\n writePayload(codec.encode(event), context);\n }\n },\n flush() {\n return destination.flush();\n },\n flushSync: destination.flushSync,\n close() {\n return destination.close();\n },\n rotate,\n currentBytes: () => bytes,\n };\n\n return transport;\n}\n"],"mappings":"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"}
@@ -1,171 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_node_destination = require("./chunks/node-destination-DvP8jBvm.cjs");
2
3
  let _loggerjs_core = require("@loggerjs/core");
3
- //#region src/node-destination.ts
4
- const encoder = new TextEncoder();
5
- const normalizeError = (error) => error instanceof Error ? error : new Error(String(error));
6
- function byteLength(payload) {
7
- return typeof payload === "string" ? encoder.encode(payload).byteLength : payload.byteLength;
8
- }
9
- function coalescePayloads(payloads) {
10
- if (payloads.every((payload) => typeof payload === "string")) return payloads.join("");
11
- const buffers = payloads.map((payload) => typeof payload === "string" ? Buffer.from(payload) : Buffer.from(payload));
12
- return Buffer.concat(buffers);
13
- }
14
- function isEpipe(error) {
15
- return Boolean(error) && typeof error === "object" && error.code === "EPIPE";
16
- }
17
- function normalizeMinLength(value) {
18
- if (value === void 0 || !Number.isFinite(value) || value <= 0) return 0;
19
- return Math.floor(value);
20
- }
21
- function createNodeStreamDestination(options) {
22
- const minLength = normalizeMinLength(options.minLength);
23
- const ignoreEpipe = options.ignoreEpipe ?? false;
24
- const waiters = [];
25
- const buffer = [];
26
- const pendingPayloads = [];
27
- let bufferedBytes = 0;
28
- let pendingWrites = 0;
29
- let pendingDrains = 0;
30
- let lastError;
31
- let lastContext;
32
- let closed = false;
33
- const reportInternalError = (error, operation) => {
34
- if (ignoreEpipe && isEpipe(error)) return;
35
- lastContext?.reportInternalError(error, {
36
- phase: "transport",
37
- transport: options.name,
38
- operation
39
- });
40
- };
41
- const settleWaitersIfIdle = () => {
42
- if (pendingWrites + pendingDrains > 0) return;
43
- if (waiters.length === 0) return;
44
- const error = lastError;
45
- lastError = void 0;
46
- for (const waiter of waiters.splice(0)) if (error) waiter.reject(error);
47
- else waiter.resolve();
48
- };
49
- const recordError = (error, operation) => {
50
- if (ignoreEpipe && isEpipe(error)) {
51
- closed = true;
52
- return;
53
- }
54
- lastError = normalizeError(error);
55
- reportInternalError(lastError, operation);
56
- };
57
- const onStreamError = (error) => {
58
- recordError(error, "stream-error");
59
- settleWaitersIfIdle();
60
- };
61
- const offError = () => options.stream.off?.("error", onStreamError);
62
- options.stream.on?.("error", onStreamError);
63
- const waitForDrain = () => {
64
- if (!options.stream.once) return;
65
- pendingDrains += 1;
66
- options.stream.once("drain", () => {
67
- pendingDrains -= 1;
68
- settleWaitersIfIdle();
69
- });
70
- };
71
- const removePending = (payload) => {
72
- const index = pendingPayloads.indexOf(payload);
73
- if (index >= 0) pendingPayloads.splice(index, 1);
74
- };
75
- const writeNow = (payload) => {
76
- if (closed) return;
77
- pendingPayloads.push(payload);
78
- pendingWrites += 1;
79
- try {
80
- if (options.stream.write(payload, (error) => {
81
- removePending(payload);
82
- pendingWrites -= 1;
83
- if (error) recordError(error, options.reportOperation ?? "write");
84
- settleWaitersIfIdle();
85
- }) === false) waitForDrain();
86
- } catch (error) {
87
- removePending(payload);
88
- pendingWrites -= 1;
89
- recordError(error, options.reportOperation ?? "write");
90
- settleWaitersIfIdle();
91
- }
92
- };
93
- const flushBuffered = () => {
94
- if (buffer.length === 0) return;
95
- const payload = coalescePayloads(buffer.splice(0));
96
- bufferedBytes = 0;
97
- writeNow(payload);
98
- };
99
- const destination = {
100
- write(payload, context) {
101
- if (closed) return;
102
- lastContext = context;
103
- if (minLength > 0) {
104
- buffer.push(payload);
105
- bufferedBytes += byteLength(payload);
106
- if (bufferedBytes >= minLength) flushBuffered();
107
- return;
108
- }
109
- writeNow(payload);
110
- },
111
- flush() {
112
- flushBuffered();
113
- if (pendingWrites + pendingDrains === 0) {
114
- const error = lastError;
115
- lastError = void 0;
116
- if (error) return Promise.reject(error);
117
- return Promise.resolve();
118
- }
119
- return new Promise((resolve, reject) => {
120
- waiters.push({
121
- resolve,
122
- reject
123
- });
124
- });
125
- },
126
- flushSync() {
127
- if (!options.syncWrite) {
128
- flushBuffered();
129
- return;
130
- }
131
- for (const payload of buffer.splice(0)) options.syncWrite(payload);
132
- bufferedBytes = 0;
133
- for (const payload of pendingPayloads.splice(0)) options.syncWrite(payload);
134
- },
135
- close() {
136
- return destination.flush().then(() => new Promise((resolve, reject) => {
137
- if (!options.stream.end) {
138
- closed = true;
139
- offError();
140
- resolve();
141
- return;
142
- }
143
- options.stream.end((error) => {
144
- closed = true;
145
- offError();
146
- if (error && !(ignoreEpipe && isEpipe(error))) reject(error);
147
- else resolve();
148
- });
149
- }), (error) => {
150
- offError();
151
- return Promise.reject(error);
152
- });
153
- },
154
- closeSync() {
155
- destination.flushSync();
156
- closed = true;
157
- offError();
158
- }
159
- };
160
- return destination;
161
- }
162
- //#endregion
163
4
  //#region src/stdout-transport.ts
164
5
  function stdoutTransport(options = {}) {
165
- const codec = options.codec ?? (0, _loggerjs_core.ndjsonCodec)();
6
+ const codec = options.codec ?? (0, _loggerjs_core.ndjsonEncoder)();
166
7
  const stream = options.stream ?? process.stdout;
167
8
  const transportName = options.name ?? "stdout";
168
- const destination = createNodeStreamDestination({
9
+ const destination = require_node_destination.createNodeStreamDestination({
169
10
  name: transportName,
170
11
  stream,
171
12
  minLength: options.minLength,
@@ -1 +1 @@
1
- {"version":3,"file":"stdout-transport.cjs","names":[],"sources":["../src/node-destination.ts","../src/stdout-transport.ts"],"sourcesContent":["import { closeSync, createWriteStream, mkdirSync, openSync, writeSync, type WriteStream } from \"fs\";\nimport { dirname } from \"path\";\nimport type { TransportContext } from \"@loggerjs/core\";\nimport type { WritableLike } from \"./internal-types\";\n\nexport interface NodeDestination {\n stream?: WriteStream;\n write: (payload: string | Uint8Array, context?: TransportContext) => void;\n flush: () => Promise<void>;\n flushSync: () => void;\n close: () => Promise<void>;\n closeSync: () => void;\n releaseSync?: () => void;\n}\n\nexport interface NodeStreamDestinationOptions {\n name: string;\n stream: WritableLike;\n minLength?: number;\n ignoreEpipe?: boolean;\n reportOperation?: string;\n syncWrite?: (payload: string | Uint8Array) => void;\n}\n\nexport interface NodeFileDestinationOptions {\n name: string;\n path: string;\n flags?: string;\n append?: boolean;\n mkdir?: boolean;\n sync?: boolean;\n minLength?: number;\n}\n\ninterface FlushWaiter {\n resolve: () => void;\n reject: (error: Error) => void;\n}\n\nconst encoder = new TextEncoder();\n\nconst normalizeError = (error: unknown): Error =>\n error instanceof Error ? error : new Error(String(error));\n\nfunction byteLength(payload: string | Uint8Array): number {\n return typeof payload === \"string\" ? encoder.encode(payload).byteLength : payload.byteLength;\n}\n\nfunction coalescePayloads(payloads: Array<string | Uint8Array>): string | Uint8Array {\n if (payloads.every((payload) => typeof payload === \"string\")) {\n return payloads.join(\"\");\n }\n const buffers = payloads.map((payload) =>\n typeof payload === \"string\" ? Buffer.from(payload) : Buffer.from(payload),\n );\n return Buffer.concat(buffers);\n}\n\nfunction isEpipe(error: unknown): boolean {\n return (\n Boolean(error) && typeof error === \"object\" && (error as { code?: unknown }).code === \"EPIPE\"\n );\n}\n\nfunction normalizeMinLength(value: number | undefined): number {\n if (value === undefined || !Number.isFinite(value) || value <= 0) return 0;\n return Math.floor(value);\n}\n\nexport function createNodeStreamDestination(\n options: NodeStreamDestinationOptions,\n): NodeDestination {\n const minLength = normalizeMinLength(options.minLength);\n const ignoreEpipe = options.ignoreEpipe ?? false;\n const waiters: FlushWaiter[] = [];\n const buffer: Array<string | Uint8Array> = [];\n const pendingPayloads: Array<string | Uint8Array> = [];\n let bufferedBytes = 0;\n let pendingWrites = 0;\n let pendingDrains = 0;\n let lastError: Error | undefined;\n let lastContext: TransportContext | undefined;\n let closed = false;\n\n const reportInternalError = (error: unknown, operation: string) => {\n if (ignoreEpipe && isEpipe(error)) return;\n lastContext?.reportInternalError(error, {\n phase: \"transport\",\n transport: options.name,\n operation,\n });\n };\n\n const settleWaitersIfIdle = () => {\n if (pendingWrites + pendingDrains > 0) return;\n if (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 if (ignoreEpipe && isEpipe(error)) {\n closed = true;\n return;\n }\n lastError = normalizeError(error);\n reportInternalError(lastError, operation);\n };\n\n const onStreamError = (error: Error) => {\n recordError(error, \"stream-error\");\n settleWaitersIfIdle();\n };\n const offError = () => options.stream.off?.(\"error\", onStreamError);\n options.stream.on?.(\"error\", onStreamError);\n\n const waitForDrain = () => {\n if (!options.stream.once) return;\n pendingDrains += 1;\n options.stream.once(\"drain\", () => {\n pendingDrains -= 1;\n settleWaitersIfIdle();\n });\n };\n\n const removePending = (payload: string | Uint8Array) => {\n const index = pendingPayloads.indexOf(payload);\n if (index >= 0) pendingPayloads.splice(index, 1);\n };\n\n const writeNow = (payload: string | Uint8Array) => {\n if (closed) return;\n pendingPayloads.push(payload);\n pendingWrites += 1;\n try {\n const result = options.stream.write(payload, (error?: Error | null) => {\n removePending(payload);\n pendingWrites -= 1;\n if (error) recordError(error, options.reportOperation ?? \"write\");\n settleWaitersIfIdle();\n });\n if (result === false) waitForDrain();\n } catch (error) {\n removePending(payload);\n pendingWrites -= 1;\n recordError(error, options.reportOperation ?? \"write\");\n settleWaitersIfIdle();\n }\n };\n\n const flushBuffered = () => {\n if (buffer.length === 0) return;\n const payload = coalescePayloads(buffer.splice(0));\n bufferedBytes = 0;\n writeNow(payload);\n };\n\n const destination: NodeDestination = {\n write(payload, context) {\n if (closed) return;\n lastContext = context;\n if (minLength > 0) {\n buffer.push(payload);\n bufferedBytes += byteLength(payload);\n if (bufferedBytes >= minLength) flushBuffered();\n return;\n }\n writeNow(payload);\n },\n flush() {\n flushBuffered();\n if (pendingWrites + 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 if (!options.syncWrite) {\n flushBuffered();\n return;\n }\n for (const payload of buffer.splice(0)) options.syncWrite(payload);\n bufferedBytes = 0;\n for (const payload of pendingPayloads.splice(0)) options.syncWrite(payload);\n },\n close() {\n return destination.flush().then(\n () =>\n new Promise<void>((resolve, reject) => {\n if (!options.stream.end) {\n closed = true;\n offError();\n resolve();\n return;\n }\n options.stream.end((error?: Error | null) => {\n closed = true;\n offError();\n if (error && !(ignoreEpipe && isEpipe(error))) reject(error);\n else resolve();\n });\n }),\n (error: unknown) => {\n offError();\n return Promise.reject(error);\n },\n );\n },\n closeSync() {\n destination.flushSync();\n closed = true;\n offError();\n },\n };\n return destination;\n}\n\nexport function createNodeFileDestination(options: NodeFileDestinationOptions): NodeDestination {\n const flags = options.flags ?? (options.append === false ? \"w\" : \"a\");\n if (options.mkdir) mkdirSync(dirname(options.path), { recursive: true });\n\n let fd: number | undefined;\n const getFd = () => {\n fd ??= openSync(options.path, flags);\n return fd;\n };\n const syncWrite = (payload: string | Uint8Array) => {\n if (typeof payload === \"string\") writeSync(getFd(), payload);\n else writeSync(getFd(), payload);\n };\n\n if (options.sync) {\n let closed = false;\n const releaseSync = () => {\n if (fd !== undefined) {\n closeSync(fd);\n fd = undefined;\n }\n };\n return {\n write(payload) {\n if (closed) return;\n syncWrite(payload);\n },\n flush() {\n return Promise.resolve();\n },\n flushSync() {},\n close() {\n releaseSync();\n closed = true;\n return Promise.resolve();\n },\n closeSync() {\n releaseSync();\n closed = true;\n },\n releaseSync,\n };\n }\n\n const stream = createWriteStream(options.path, { flags });\n const destination = createNodeStreamDestination({\n name: options.name,\n stream,\n minLength: options.minLength,\n syncWrite,\n });\n const releaseSync = () => {\n if (fd !== undefined) {\n closeSync(fd);\n fd = undefined;\n }\n };\n return {\n ...destination,\n stream,\n close() {\n return destination.close().finally(releaseSync);\n },\n closeSync() {\n destination.closeSync();\n releaseSync();\n },\n releaseSync,\n };\n}\n","import {\n ndjsonCodec,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n} from \"@loggerjs/core\";\nimport type { WritableLike } from \"./internal-types\";\nimport { createNodeStreamDestination } from \"./node-destination\";\n\nexport interface StdoutTransportOptions {\n name?: string;\n stream?: WritableLike;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n minLength?: number;\n ignoreEpipe?: boolean;\n}\n\nexport function stdoutTransport(options: StdoutTransportOptions = {}): Transport {\n const codec = options.codec ?? ndjsonCodec();\n const stream = options.stream ?? process.stdout;\n const transportName = options.name ?? \"stdout\";\n const destination = createNodeStreamDestination({\n name: transportName,\n stream,\n minLength: options.minLength,\n ignoreEpipe: options.ignoreEpipe ?? true,\n });\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n log(event: LogEvent, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n destination.write(codec.encode(event), context);\n },\n flush: destination.flush,\n flushSync: destination.flushSync,\n close: destination.close,\n };\n}\n\nexport function stderrTransport(options: Omit<StdoutTransportOptions, \"stream\"> = {}): Transport {\n return stdoutTransport({ ...options, name: options.name ?? \"stderr\", stream: process.stderr });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stdout-transport.cjs","names":["createNodeStreamDestination"],"sources":["../src/stdout-transport.ts"],"sourcesContent":["import {\n ndjsonEncoder,\n toLevelValue,\n type Codec,\n type LogEvent,\n type LoggerLevel,\n type Transport,\n} from \"@loggerjs/core\";\nimport type { WritableLike } from \"./internal-types\";\nimport { createNodeStreamDestination } from \"./node-destination\";\n\nexport interface StdoutTransportOptions {\n name?: string;\n stream?: WritableLike;\n codec?: Codec<string | Uint8Array>;\n minLevel?: LoggerLevel;\n minLength?: number;\n ignoreEpipe?: boolean;\n}\n\nexport function stdoutTransport(options: StdoutTransportOptions = {}): Transport {\n const codec = options.codec ?? ndjsonEncoder();\n const stream = options.stream ?? process.stdout;\n const transportName = options.name ?? \"stdout\";\n const destination = createNodeStreamDestination({\n name: transportName,\n stream,\n minLength: options.minLength,\n ignoreEpipe: options.ignoreEpipe ?? true,\n });\n\n return {\n name: transportName,\n minLevel: options.minLevel,\n log(event: LogEvent, context) {\n if (options.minLevel !== undefined && event.level < toLevelValue(options.minLevel)) return;\n destination.write(codec.encode(event), context);\n },\n flush: destination.flush,\n flushSync: destination.flushSync,\n close: destination.close,\n };\n}\n\nexport function stderrTransport(options: Omit<StdoutTransportOptions, \"stream\"> = {}): Transport {\n return stdoutTransport({ ...options, name: options.name ?? \"stderr\", stream: process.stderr });\n}\n"],"mappings":";;;;AAoBA,SAAgB,gBAAgB,UAAkC,CAAC,GAAc;CAC/E,MAAM,QAAQ,QAAQ,UAAA,GAAA,eAAA,cAAA,CAAuB;CAC7C,MAAM,SAAS,QAAQ,UAAU,QAAQ;CACzC,MAAM,gBAAgB,QAAQ,QAAQ;CACtC,MAAM,cAAcA,yBAAAA,4BAA4B;EAC9C,MAAM;EACN;EACA,WAAW,QAAQ;EACnB,aAAa,QAAQ,eAAe;CACtC,CAAC;CAED,OAAO;EACL,MAAM;EACN,UAAU,QAAQ;EAClB,IAAI,OAAiB,SAAS;GAC5B,IAAI,QAAQ,aAAa,KAAA,KAAa,MAAM,SAAA,GAAA,eAAA,aAAA,CAAqB,QAAQ,QAAQ,GAAG;GACpF,YAAY,MAAM,MAAM,OAAO,KAAK,GAAG,OAAO;EAChD;EACA,OAAO,YAAY;EACnB,WAAW,YAAY;EACvB,OAAO,YAAY;CACrB;AACF;AAEA,SAAgB,gBAAgB,UAAkD,CAAC,GAAc;CAC/F,OAAO,gBAAgB;EAAE,GAAG;EAAS,MAAM,QAAQ,QAAQ;EAAU,QAAQ,QAAQ;CAAO,CAAC;AAC/F"}