pino-sdk 9.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.

Potentially problematic release.


This version of pino-sdk might be problematic. Click here for more details.

Files changed (202) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +8 -0
  3. package/.github/dependabot.yml +13 -0
  4. package/.github/workflows/bench.yml +61 -0
  5. package/.github/workflows/ci.yml +88 -0
  6. package/.github/workflows/lock-threads.yml +30 -0
  7. package/.github/workflows/target-main.yml +23 -0
  8. package/.nojekyll +0 -0
  9. package/.prettierignore +1 -0
  10. package/.taprc.yaml +8 -0
  11. package/CNAME +1 -0
  12. package/CONTRIBUTING.md +30 -0
  13. package/LICENSE +21 -0
  14. package/README.md +161 -0
  15. package/SECURITY.md +68 -0
  16. package/benchmarks/basic.bench.js +95 -0
  17. package/benchmarks/child-child.bench.js +52 -0
  18. package/benchmarks/child-creation.bench.js +73 -0
  19. package/benchmarks/child.bench.js +62 -0
  20. package/benchmarks/deep-object.bench.js +88 -0
  21. package/benchmarks/formatters.bench.js +50 -0
  22. package/benchmarks/internal/custom-levels.js +67 -0
  23. package/benchmarks/internal/just-pino-heavy.bench.js +76 -0
  24. package/benchmarks/internal/just-pino.bench.js +182 -0
  25. package/benchmarks/internal/parent-vs-child.bench.js +75 -0
  26. package/benchmarks/internal/redact.bench.js +86 -0
  27. package/benchmarks/long-string.bench.js +81 -0
  28. package/benchmarks/multi-arg.bench.js +193 -0
  29. package/benchmarks/multistream.js +98 -0
  30. package/benchmarks/object.bench.js +82 -0
  31. package/benchmarks/utils/generate-benchmark-doc.js +36 -0
  32. package/benchmarks/utils/runbench.js +138 -0
  33. package/benchmarks/utils/wrap-log-level.js +55 -0
  34. package/bin.js +6 -0
  35. package/browser.js +505 -0
  36. package/build/sync-version.js +10 -0
  37. package/docs/api.md +1490 -0
  38. package/docs/asynchronous.md +40 -0
  39. package/docs/benchmarks.md +55 -0
  40. package/docs/browser.md +242 -0
  41. package/docs/bundling.md +40 -0
  42. package/docs/child-loggers.md +95 -0
  43. package/docs/ecosystem.md +84 -0
  44. package/docs/help.md +345 -0
  45. package/docs/lts.md +64 -0
  46. package/docs/pretty.md +35 -0
  47. package/docs/redaction.md +135 -0
  48. package/docs/transports.md +1263 -0
  49. package/docs/web.md +309 -0
  50. package/docsify/sidebar.md +26 -0
  51. package/examples/basic.js +43 -0
  52. package/examples/transport.js +68 -0
  53. package/favicon-16x16.png +0 -0
  54. package/favicon-32x32.png +0 -0
  55. package/favicon.ico +0 -0
  56. package/file.js +12 -0
  57. package/inc-version.sh +42 -0
  58. package/index.html +55 -0
  59. package/lib/caller.js +30 -0
  60. package/lib/constants.js +28 -0
  61. package/lib/deprecations.js +8 -0
  62. package/lib/levels.js +241 -0
  63. package/lib/meta.js +3 -0
  64. package/lib/multistream.js +188 -0
  65. package/lib/proto.js +234 -0
  66. package/lib/redaction.js +118 -0
  67. package/lib/symbols.js +74 -0
  68. package/lib/time.js +11 -0
  69. package/lib/tools.js +390 -0
  70. package/lib/transport-stream.js +56 -0
  71. package/lib/transport.js +167 -0
  72. package/lib/worker.js +194 -0
  73. package/package.json +119 -0
  74. package/pino-banner.png +0 -0
  75. package/pino-logo-hire.png +0 -0
  76. package/pino-tree.png +0 -0
  77. package/pino2.d.ts +913 -0
  78. package/pino2.js +234 -0
  79. package/pretty-demo.png +0 -0
  80. package/test/basic.test.js +874 -0
  81. package/test/broken-pipe.test.js +57 -0
  82. package/test/browser-child.test.js +132 -0
  83. package/test/browser-disabled.test.js +87 -0
  84. package/test/browser-early-console-freeze.test.js +12 -0
  85. package/test/browser-is-level-enabled.test.js +104 -0
  86. package/test/browser-levels.test.js +241 -0
  87. package/test/browser-serializers.test.js +352 -0
  88. package/test/browser-timestamp.test.js +88 -0
  89. package/test/browser-transmit.test.js +417 -0
  90. package/test/browser.test.js +679 -0
  91. package/test/complex-objects.test.js +34 -0
  92. package/test/crlf.test.js +32 -0
  93. package/test/custom-levels.test.js +253 -0
  94. package/test/error.test.js +398 -0
  95. package/test/errorKey.test.js +34 -0
  96. package/test/escaping.test.js +91 -0
  97. package/test/esm/esm.mjs +12 -0
  98. package/test/esm/index.test.js +34 -0
  99. package/test/esm/named-exports.mjs +27 -0
  100. package/test/exit.test.js +77 -0
  101. package/test/fixtures/broken-pipe/basic.js +9 -0
  102. package/test/fixtures/broken-pipe/destination.js +10 -0
  103. package/test/fixtures/broken-pipe/syncfalse.js +12 -0
  104. package/test/fixtures/console-transport.js +13 -0
  105. package/test/fixtures/crashing-transport.js +13 -0
  106. package/test/fixtures/default-exit.js +8 -0
  107. package/test/fixtures/destination-exit.js +8 -0
  108. package/test/fixtures/eval/index.js +13 -0
  109. package/test/fixtures/eval/node_modules/14-files.js +3 -0
  110. package/test/fixtures/eval/node_modules/2-files.js +3 -0
  111. package/test/fixtures/eval/node_modules/file1.js +5 -0
  112. package/test/fixtures/eval/node_modules/file10.js +5 -0
  113. package/test/fixtures/eval/node_modules/file11.js +5 -0
  114. package/test/fixtures/eval/node_modules/file12.js +5 -0
  115. package/test/fixtures/eval/node_modules/file13.js +5 -0
  116. package/test/fixtures/eval/node_modules/file14.js +11 -0
  117. package/test/fixtures/eval/node_modules/file2.js +5 -0
  118. package/test/fixtures/eval/node_modules/file3.js +5 -0
  119. package/test/fixtures/eval/node_modules/file4.js +5 -0
  120. package/test/fixtures/eval/node_modules/file5.js +5 -0
  121. package/test/fixtures/eval/node_modules/file6.js +5 -0
  122. package/test/fixtures/eval/node_modules/file7.js +5 -0
  123. package/test/fixtures/eval/node_modules/file8.js +5 -0
  124. package/test/fixtures/eval/node_modules/file9.js +5 -0
  125. package/test/fixtures/noop-transport.js +10 -0
  126. package/test/fixtures/pretty/null-prototype.js +8 -0
  127. package/test/fixtures/stdout-hack-protection.js +11 -0
  128. package/test/fixtures/syncfalse-child.js +6 -0
  129. package/test/fixtures/syncfalse-exit.js +9 -0
  130. package/test/fixtures/syncfalse-flush-exit.js +10 -0
  131. package/test/fixtures/syncfalse.js +6 -0
  132. package/test/fixtures/syntax-error-esm.mjs +2 -0
  133. package/test/fixtures/to-file-transport-with-transform.js +20 -0
  134. package/test/fixtures/to-file-transport.js +13 -0
  135. package/test/fixtures/to-file-transport.mjs +8 -0
  136. package/test/fixtures/transport/index.js +12 -0
  137. package/test/fixtures/transport/package.json +5 -0
  138. package/test/fixtures/transport-exit-immediately-with-async-dest.js +16 -0
  139. package/test/fixtures/transport-exit-immediately.js +11 -0
  140. package/test/fixtures/transport-exit-on-ready.js +12 -0
  141. package/test/fixtures/transport-main.js +9 -0
  142. package/test/fixtures/transport-many-lines.js +29 -0
  143. package/test/fixtures/transport-string-stdout.js +9 -0
  144. package/test/fixtures/transport-transform.js +21 -0
  145. package/test/fixtures/transport-uses-pino-config.js +33 -0
  146. package/test/fixtures/transport-with-on-exit.js +12 -0
  147. package/test/fixtures/transport-worker-data.js +19 -0
  148. package/test/fixtures/transport-worker.js +15 -0
  149. package/test/fixtures/transport-wrong-export-type.js +3 -0
  150. package/test/fixtures/ts/to-file-transport-with-transform.ts +18 -0
  151. package/test/fixtures/ts/to-file-transport.ts +11 -0
  152. package/test/fixtures/ts/transpile.cjs +36 -0
  153. package/test/fixtures/ts/transport-exit-immediately-with-async-dest.ts +15 -0
  154. package/test/fixtures/ts/transport-exit-immediately.ts +10 -0
  155. package/test/fixtures/ts/transport-exit-on-ready.ts +11 -0
  156. package/test/fixtures/ts/transport-main.ts +8 -0
  157. package/test/fixtures/ts/transport-string-stdout.ts +8 -0
  158. package/test/fixtures/ts/transport-worker.ts +14 -0
  159. package/test/formatters.test.js +355 -0
  160. package/test/helper.d.ts +4 -0
  161. package/test/helper.js +128 -0
  162. package/test/hooks.test.js +118 -0
  163. package/test/http.test.js +242 -0
  164. package/test/internals/version.test.js +15 -0
  165. package/test/is-level-enabled.test.js +185 -0
  166. package/test/jest/basic.spec.js +10 -0
  167. package/test/levels.test.js +772 -0
  168. package/test/metadata.test.js +106 -0
  169. package/test/mixin-merge-strategy.test.js +55 -0
  170. package/test/mixin.test.js +218 -0
  171. package/test/multistream.test.js +673 -0
  172. package/test/pkg/index.js +46 -0
  173. package/test/pkg/pkg.config.json +17 -0
  174. package/test/pkg/pkg.test.js +58 -0
  175. package/test/redact.test.js +847 -0
  176. package/test/serializers.test.js +253 -0
  177. package/test/stdout-protection.test.js +39 -0
  178. package/test/syncfalse.test.js +188 -0
  179. package/test/timestamp.test.js +121 -0
  180. package/test/transport/big.test.js +43 -0
  181. package/test/transport/bundlers-support.test.js +97 -0
  182. package/test/transport/caller.test.js +23 -0
  183. package/test/transport/core.test.js +643 -0
  184. package/test/transport/core.test.ts +236 -0
  185. package/test/transport/core.transpiled.test.ts +112 -0
  186. package/test/transport/crash.test.js +34 -0
  187. package/test/transport/module-link.test.js +239 -0
  188. package/test/transport/pipeline.test.js +135 -0
  189. package/test/transport/repl.test.js +14 -0
  190. package/test/transport/syncTrue.test.js +55 -0
  191. package/test/transport/syncfalse.test.js +68 -0
  192. package/test/transport/targets.test.js +44 -0
  193. package/test/transport/uses-pino-config.test.js +167 -0
  194. package/test/transport-stream.test.js +26 -0
  195. package/test/types/pino-import.test-d.ts +29 -0
  196. package/test/types/pino-multistream.test-d.ts +28 -0
  197. package/test/types/pino-top-export.test-d.ts +35 -0
  198. package/test/types/pino-transport.test-d.ts +145 -0
  199. package/test/types/pino-type-only.test-d.ts +64 -0
  200. package/test/types/pino.test-d.ts +527 -0
  201. package/test/types/pino.ts +78 -0
  202. package/tsconfig.json +14 -0
@@ -0,0 +1,527 @@
1
+ import { IncomingMessage, ServerResponse } from "http";
2
+ import { Socket } from "net";
3
+ import { expectError, expectType } from 'tsd';
4
+ import P, { LoggerOptions, pino } from "../../";
5
+ import Logger = P.Logger;
6
+
7
+ const log = pino();
8
+ const info = log.info;
9
+ const error = log.error;
10
+
11
+ info("hello world");
12
+ error("this is at error level");
13
+
14
+ // primative types
15
+ info('simple string');
16
+ info(true)
17
+ info(42);
18
+ info(3.14);
19
+ info(null);
20
+ info(undefined);
21
+
22
+ // object types
23
+ info({ a: 1, b: '2' });
24
+ info(new Error());
25
+ info(new Date());
26
+ info([])
27
+ info(new Map());
28
+ info(new Set());
29
+
30
+ // placeholder messages
31
+ info('Hello %s', 'world');
32
+ info('The answer is %d', 42);
33
+ info('The object is %o', { a: 1, b: '2' });
34
+ info('The json is %j', { a: 1, b: '2' });
35
+ info('The object is %O', { a: 1, b: '2' });
36
+ info('The answer is %d and the question is %s with %o', 42, 'unknown', { correct: 'order' });
37
+ info('Missing placeholder is fine %s');
38
+ declare const errorOrString: string | Error;
39
+ info(errorOrString)
40
+
41
+ // placeholder messages type errors
42
+ expectError(info('Hello %s', 123));
43
+ expectError(info('Hello %s', false));
44
+ expectError(info('The answer is %d', 'not a number'));
45
+ expectError(info('The object is %o', 'not an object'));
46
+ expectError(info('The object is %j', 'not a JSON'));
47
+ expectError(info('The object is %O', 'not an object'));
48
+ expectError(info('The answer is %d and the question is %s with %o', 42, { incorrect: 'order' }, 'unknown'));
49
+ expectError(info('Extra message %s', 'after placeholder', 'not allowed'));
50
+
51
+ // object types with messages
52
+ info({ obj: 42 }, "hello world");
53
+ info({ obj: 42, b: 2 }, "hello world");
54
+ info({ obj: { aa: "bbb" } }, "another");
55
+ info({ a: 1, b: '2' }, 'hello world with %s', 'extra data');
56
+
57
+ // Extra message after placeholder
58
+ expectError(info({ a: 1, b: '2' }, 'hello world with %d', 2, 'extra' ));
59
+
60
+ // metadata with messages type errors
61
+ expectError(info({ a: 1, b: '2' }, 'hello world with %s', 123));
62
+
63
+ // metadata after message
64
+ expectError(info('message', { a: 1, b: '2' }));
65
+
66
+ // multiple strings without placeholder
67
+ expectError(info('string1', 'string2'));
68
+ expectError(info('string1', 'string2', 'string3'));
69
+
70
+ setImmediate(info, "after setImmediate");
71
+ error(new Error("an error"));
72
+
73
+ const writeSym = pino.symbols.writeSym;
74
+
75
+ const testUniqSymbol = {
76
+ [pino.symbols.needsMetadataGsym]: true,
77
+ }[pino.symbols.needsMetadataGsym];
78
+
79
+ const log2: P.Logger = pino({
80
+ name: "myapp",
81
+ safe: true,
82
+ serializers: {
83
+ req: pino.stdSerializers.req,
84
+ res: pino.stdSerializers.res,
85
+ err: pino.stdSerializers.err,
86
+ },
87
+ });
88
+
89
+ pino({
90
+ write(o) {},
91
+ });
92
+
93
+ pino({
94
+ mixin() {
95
+ return { customName: "unknown", customId: 111 };
96
+ },
97
+ });
98
+
99
+ pino({
100
+ mixin: () => ({ customName: "unknown", customId: 111 }),
101
+ });
102
+
103
+ pino({
104
+ mixin: (context: object) => ({ customName: "unknown", customId: 111 }),
105
+ });
106
+
107
+ pino({
108
+ mixin: (context: object, level: number) => ({ customName: "unknown", customId: 111 }),
109
+ });
110
+
111
+ pino({
112
+ redact: { paths: [], censor: "SECRET" },
113
+ });
114
+
115
+ pino({
116
+ redact: { paths: [], censor: () => "SECRET" },
117
+ });
118
+
119
+ pino({
120
+ redact: { paths: [], censor: (value) => value },
121
+ });
122
+
123
+ pino({
124
+ redact: { paths: [], censor: (value, path) => path.join() },
125
+ });
126
+
127
+ pino({
128
+ depthLimit: 1
129
+ });
130
+
131
+ pino({
132
+ edgeLimit: 1
133
+ });
134
+
135
+ pino({
136
+ browser: {
137
+ write(o) {},
138
+ },
139
+ });
140
+
141
+ pino({
142
+ browser: {
143
+ write: {
144
+ info(o) {},
145
+ error(o) {},
146
+ },
147
+ serialize: true,
148
+ asObject: true,
149
+ transmit: {
150
+ level: "fatal",
151
+ send: (level, logEvent) => {
152
+ level;
153
+ logEvent.bindings;
154
+ logEvent.level;
155
+ logEvent.ts;
156
+ logEvent.messages;
157
+ },
158
+ },
159
+ disabled: false
160
+ },
161
+ });
162
+
163
+ pino({
164
+ browser: {
165
+ asObjectBindingsOnly: true,
166
+ }
167
+ });
168
+
169
+ pino({}, undefined);
170
+
171
+ pino({ base: null });
172
+ if ("pino" in log) console.log(`pino version: ${log.pino}`);
173
+
174
+ expectType<void>(log.flush());
175
+ log.flush((err?: Error) => undefined);
176
+ log.child({ a: "property" }).info("hello child!");
177
+ log.level = "error";
178
+ log.info("nope");
179
+ const child = log.child({ foo: "bar" });
180
+ child.info("nope again");
181
+ child.level = "info";
182
+ child.info("hooray");
183
+ log.info("nope nope nope");
184
+ log.child({ foo: "bar" }, { level: "debug" }).debug("debug!");
185
+ child.bindings();
186
+ const customSerializers = {
187
+ test() {
188
+ return "this is my serializer";
189
+ },
190
+ };
191
+ pino().child({}, { serializers: customSerializers }).info({ test: "should not show up" });
192
+ const child2 = log.child({ father: true });
193
+ const childChild = child2.child({ baby: true });
194
+ const childRedacted = pino().child({}, { redact: ["path"] })
195
+ childRedacted.info({
196
+ msg: "logged with redacted properties",
197
+ path: "Not shown",
198
+ });
199
+ const childAnotherRedacted = pino().child({}, {
200
+ redact: {
201
+ paths: ["anotherPath"],
202
+ censor: "Not the log you\re looking for",
203
+ }
204
+ })
205
+ childAnotherRedacted.info({
206
+ msg: "another logged with redacted properties",
207
+ anotherPath: "Not shown",
208
+ });
209
+
210
+ log.level = "info";
211
+ if (log.levelVal === 30) {
212
+ console.log("logger level is `info`");
213
+ }
214
+
215
+ const listener = (lvl: any, val: any, prevLvl: any, prevVal: any) => {
216
+ console.log(lvl, val, prevLvl, prevVal);
217
+ };
218
+ log.on("level-change", (lvl, val, prevLvl, prevVal, logger) => {
219
+ console.log(lvl, val, prevLvl, prevVal);
220
+ });
221
+ log.level = "trace";
222
+ log.removeListener("level-change", listener);
223
+ log.level = "info";
224
+
225
+ pino.levels.values.error === 50;
226
+ pino.levels.labels[50] === "error";
227
+
228
+ const logstderr: pino.Logger = pino(process.stderr);
229
+ logstderr.error("on stderr instead of stdout");
230
+
231
+ log.useLevelLabels = true;
232
+ log.info("lol");
233
+ log.level === "info";
234
+ const isEnabled: boolean = log.isLevelEnabled("info");
235
+
236
+ const redacted = pino({
237
+ redact: ["path"],
238
+ });
239
+
240
+ redacted.info({
241
+ msg: "logged with redacted properties",
242
+ path: "Not shown",
243
+ });
244
+
245
+ const anotherRedacted = pino({
246
+ redact: {
247
+ paths: ["anotherPath"],
248
+ censor: "Not the log you\re looking for",
249
+ },
250
+ });
251
+
252
+ anotherRedacted.info({
253
+ msg: "another logged with redacted properties",
254
+ anotherPath: "Not shown",
255
+ });
256
+
257
+ const withTimeFn = pino({
258
+ timestamp: pino.stdTimeFunctions.isoTime,
259
+ });
260
+
261
+ const withNestedKey = pino({
262
+ nestedKey: "payload",
263
+ });
264
+
265
+ const withHooks = pino({
266
+ hooks: {
267
+ logMethod(args, method, level) {
268
+ expectType<pino.Logger>(this);
269
+ return method.apply(this, args);
270
+ },
271
+ streamWrite(s) {
272
+ expectType<string>(s);
273
+ return s.replaceAll('secret-key', 'xxx');
274
+ },
275
+ },
276
+ });
277
+
278
+ // Properties/types imported from pino-std-serializers
279
+ const wrappedErrSerializer = pino.stdSerializers.wrapErrorSerializer((err: pino.SerializedError) => {
280
+ return { ...err, newProp: "foo" };
281
+ });
282
+ const wrappedReqSerializer = pino.stdSerializers.wrapRequestSerializer((req: pino.SerializedRequest) => {
283
+ return { ...req, newProp: "foo" };
284
+ });
285
+ const wrappedResSerializer = pino.stdSerializers.wrapResponseSerializer((res: pino.SerializedResponse) => {
286
+ return { ...res, newProp: "foo" };
287
+ });
288
+
289
+ const socket = new Socket();
290
+ const incomingMessage = new IncomingMessage(socket);
291
+ const serverResponse = new ServerResponse(incomingMessage);
292
+
293
+ const mappedHttpRequest: { req: pino.SerializedRequest } = pino.stdSerializers.mapHttpRequest(incomingMessage);
294
+ const mappedHttpResponse: { res: pino.SerializedResponse } = pino.stdSerializers.mapHttpResponse(serverResponse);
295
+
296
+ const serializedErr: pino.SerializedError = pino.stdSerializers.err(new Error());
297
+ const serializedReq: pino.SerializedRequest = pino.stdSerializers.req(incomingMessage);
298
+ const serializedRes: pino.SerializedResponse = pino.stdSerializers.res(serverResponse);
299
+
300
+ /**
301
+ * Destination static method
302
+ */
303
+ const destinationViaDefaultArgs = pino.destination();
304
+ const destinationViaStrFileDescriptor = pino.destination("/log/path");
305
+ const destinationViaNumFileDescriptor = pino.destination(2);
306
+ const destinationViaStream = pino.destination(process.stdout);
307
+ const destinationViaOptionsObject = pino.destination({ dest: "/log/path", sync: false });
308
+
309
+ pino(destinationViaDefaultArgs);
310
+ pino({ name: "my-logger" }, destinationViaDefaultArgs);
311
+ pino(destinationViaStrFileDescriptor);
312
+ pino({ name: "my-logger" }, destinationViaStrFileDescriptor);
313
+ pino(destinationViaNumFileDescriptor);
314
+ pino({ name: "my-logger" }, destinationViaNumFileDescriptor);
315
+ pino(destinationViaStream);
316
+ pino({ name: "my-logger" }, destinationViaStream);
317
+ pino(destinationViaOptionsObject);
318
+ pino({ name: "my-logger" }, destinationViaOptionsObject);
319
+
320
+ try {
321
+ throw new Error('Some error')
322
+ } catch (err) {
323
+ log.error(err)
324
+ }
325
+
326
+ interface StrictShape {
327
+ activity: string;
328
+ err?: unknown;
329
+ }
330
+
331
+ info<StrictShape>({
332
+ activity: "Required property",
333
+ });
334
+
335
+ const logLine: pino.LogDescriptor = {
336
+ level: 20,
337
+ msg: "A log message",
338
+ time: new Date().getTime(),
339
+ aCustomProperty: true,
340
+ };
341
+
342
+ interface CustomLogger extends pino.Logger {
343
+ customMethod(msg: string, ...args: unknown[]): void;
344
+ }
345
+
346
+ const serializerFunc: pino.SerializerFn = () => {}
347
+ const writeFunc: pino.WriteFn = () => {}
348
+
349
+ interface CustomBaseLogger extends pino.BaseLogger {
350
+ child(): CustomBaseLogger
351
+ }
352
+
353
+ const customBaseLogger: CustomBaseLogger = {
354
+ level: 'info',
355
+ fatal() {},
356
+ error() {},
357
+ warn() {},
358
+ info() {},
359
+ debug() {},
360
+ trace() {},
361
+ silent() {},
362
+ child() { return this }
363
+ }
364
+
365
+ // custom levels
366
+ const log3 = pino({ customLevels: { myLevel: 100 } })
367
+ expectError(log3.log())
368
+ log3.level = 'myLevel'
369
+ log3.myLevel('')
370
+ log3.child({}).myLevel('')
371
+
372
+ log3.on('level-change', (lvl, val, prevLvl, prevVal, instance) => {
373
+ instance.myLevel('foo');
374
+ });
375
+
376
+ const clog3 = log3.child({}, { customLevels: { childLevel: 120 } })
377
+ // child inherit parent
378
+ clog3.myLevel('')
379
+ // child itself
380
+ clog3.childLevel('')
381
+ const cclog3 = clog3.child({}, { customLevels: { childLevel2: 130 } })
382
+ // child inherit root
383
+ cclog3.myLevel('')
384
+ // child inherit parent
385
+ cclog3.childLevel('')
386
+ // child itself
387
+ cclog3.childLevel2('')
388
+
389
+ const ccclog3 = clog3.child({})
390
+ expectError(ccclog3.nonLevel(''))
391
+
392
+ const withChildCallback = pino({
393
+ onChild: (child: Logger) => {}
394
+ })
395
+ withChildCallback.onChild = (child: Logger) => {}
396
+
397
+ pino({
398
+ crlf: true,
399
+ });
400
+
401
+ const customLevels = { foo: 99, bar: 42 }
402
+
403
+ const customLevelLogger = pino({ customLevels });
404
+
405
+ type CustomLevelLogger = typeof customLevelLogger
406
+ type CustomLevelLoggerLevels = pino.Level | keyof typeof customLevels
407
+
408
+ const fn = (logger: Pick<CustomLevelLogger, CustomLevelLoggerLevels>) => {}
409
+
410
+ const customLevelChildLogger = customLevelLogger.child({ name: "child" })
411
+
412
+ fn(customLevelChildLogger); // missing foo typing
413
+
414
+ // unknown option
415
+ expectError(
416
+ pino({
417
+ hello: 'world'
418
+ })
419
+ );
420
+
421
+ // unknown option
422
+ expectError(
423
+ pino({
424
+ hello: 'world',
425
+ customLevels: {
426
+ 'log': 30
427
+ }
428
+ })
429
+ );
430
+
431
+ function dangerous () {
432
+ throw Error('foo')
433
+ }
434
+
435
+ try {
436
+ dangerous()
437
+ } catch (err) {
438
+ log.error(err)
439
+ }
440
+
441
+ try {
442
+ dangerous()
443
+ } catch (err) {
444
+ log.error({ err })
445
+ }
446
+
447
+ const bLogger = pino({
448
+ customLevels: {
449
+ log: 5,
450
+ },
451
+ level: 'log',
452
+ transport: {
453
+ target: 'pino-pretty',
454
+ options: {
455
+ colorize: true,
456
+ },
457
+ },
458
+ });
459
+
460
+ expectType<Logger<'log'>>(pino({
461
+ customLevels: {
462
+ log: 5,
463
+ },
464
+ level: 'log',
465
+ transport: {
466
+ target: 'pino-pretty',
467
+ options: {
468
+ colorize: true,
469
+ },
470
+ },
471
+ }))
472
+
473
+ const parentLogger1 = pino({
474
+ customLevels: { myLevel: 90 },
475
+ onChild: (child) => { const a = child.myLevel; }
476
+ }, process.stdout)
477
+ parentLogger1.onChild = (child) => { child.myLevel(''); }
478
+
479
+ const childLogger1 = parentLogger1.child({});
480
+ childLogger1.myLevel('');
481
+ expectError(childLogger1.doesntExist(''));
482
+
483
+ const parentLogger2 = pino({}, process.stdin);
484
+ expectError(parentLogger2.onChild = (child) => { const b = child.doesntExist; });
485
+
486
+ const childLogger2 = parentLogger2.child({});
487
+ expectError(childLogger2.doesntExist);
488
+
489
+ expectError(pino({
490
+ onChild: (child) => { const a = child.doesntExist; }
491
+ }, process.stdout));
492
+
493
+ const pinoWithoutLevelsSorting = pino({});
494
+ const pinoWithDescSortingLevels = pino({ levelComparison: 'DESC' });
495
+ const pinoWithAscSortingLevels = pino({ levelComparison: 'ASC' });
496
+ const pinoWithCustomSortingLevels = pino({ levelComparison: () => false });
497
+ // with wrong level comparison direction
498
+ expectError(pino({ levelComparison: 'SOME'}), process.stdout);
499
+ // with wrong level comparison type
500
+ expectError(pino({ levelComparison: 123}), process.stdout);
501
+ // with wrong custom level comparison return type
502
+ expectError(pino({ levelComparison: () => null }), process.stdout);
503
+ expectError(pino({ levelComparison: () => 1 }), process.stdout);
504
+ expectError(pino({ levelComparison: () => 'string' }), process.stdout);
505
+
506
+ const customLevelsOnlyOpts = {
507
+ useOnlyCustomLevels: true,
508
+ customLevels: {
509
+ customDebug: 10,
510
+ info: 20, // to make sure the default names are also available for override
511
+ customNetwork: 30,
512
+ customError: 40,
513
+ },
514
+ level: 'customDebug',
515
+ } satisfies LoggerOptions;
516
+
517
+ const loggerWithCustomLevelOnly = pino(customLevelsOnlyOpts);
518
+ loggerWithCustomLevelOnly.customDebug('test3')
519
+ loggerWithCustomLevelOnly.info('test4')
520
+ loggerWithCustomLevelOnly.customError('test5')
521
+ loggerWithCustomLevelOnly.customNetwork('test6')
522
+
523
+ expectError(loggerWithCustomLevelOnly.fatal('test'));
524
+ expectError(loggerWithCustomLevelOnly.error('test'));
525
+ expectError(loggerWithCustomLevelOnly.warn('test'));
526
+ expectError(loggerWithCustomLevelOnly.debug('test'));
527
+ expectError(loggerWithCustomLevelOnly.trace('test'));
@@ -0,0 +1,78 @@
1
+ import { join } from 'node:path'
2
+ import { tmpdir } from 'node:os'
3
+ import pinoPretty from 'pino-pretty'
4
+ import { LoggerOptions, StreamEntry, pino } from '../../pino2'
5
+
6
+ const destination = join(
7
+ tmpdir(),
8
+ '_' + Math.random().toString(36).substr(2, 9)
9
+ )
10
+
11
+ // Single
12
+ const transport = pino.transport({
13
+ target: 'pino-pretty',
14
+ options: { some: 'options for', the: 'transport' }
15
+ })
16
+ const logger = pino(transport)
17
+ logger.setBindings({ some: 'bindings' })
18
+ logger.info('test2')
19
+ logger.flush()
20
+
21
+ const transport2 = pino.transport({
22
+ target: 'pino-pretty',
23
+ })
24
+ const logger2 = pino(transport2)
25
+ logger2.info('test2')
26
+
27
+
28
+ // Multiple
29
+
30
+ const transports = pino.transport({targets: [
31
+ {
32
+ level: 'info',
33
+ target: 'pino-pretty',
34
+ options: { some: 'options for', the: 'transport' }
35
+ },
36
+ {
37
+ level: 'trace',
38
+ target: 'pino/file',
39
+ options: { destination }
40
+ }
41
+ ]})
42
+ const loggerMulti = pino(transports)
43
+ loggerMulti.info('test2')
44
+
45
+ // custom levels
46
+
47
+ const customLevels = {
48
+ customDebug : 1,
49
+ info : 2,
50
+ customNetwork : 3,
51
+ customError : 4,
52
+ };
53
+
54
+ type CustomLevels = keyof typeof customLevels;
55
+
56
+ const pinoOpts = {
57
+ useOnlyCustomLevels: true,
58
+ customLevels: customLevels,
59
+ level: 'customDebug',
60
+ } satisfies LoggerOptions;
61
+
62
+ const multistreamOpts = {
63
+ dedupe: true,
64
+ levels: customLevels
65
+ };
66
+
67
+ const streams: StreamEntry<CustomLevels>[] = [
68
+ { level : 'customDebug', stream : pinoPretty() },
69
+ { level : 'info', stream : pinoPretty() },
70
+ { level : 'customNetwork', stream : pinoPretty() },
71
+ { level : 'customError', stream : pinoPretty() },
72
+ ];
73
+
74
+ const loggerCustomLevel = pino(pinoOpts, pino.multistream(streams, multistreamOpts));
75
+ loggerCustomLevel.customDebug('test3')
76
+ loggerCustomLevel.info('test4')
77
+ loggerCustomLevel.customError('test5')
78
+ loggerCustomLevel.customNetwork('test6')
package/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es6",
4
+ "lib": [ "es2015", "dom" ],
5
+ "module": "commonjs",
6
+ "noEmit": true,
7
+ "strict": true,
8
+ "esModuleInterop": true
9
+ },
10
+ "exclude": [
11
+ "./test/types/*.test-d.ts",
12
+ "./*.d.ts"
13
+ ]
14
+ }