vite-plugin-purify 0.0.1-security → 2.3.4

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 vite-plugin-purify might be problematic. Click here for more details.

Files changed (201) 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 +159 -3
  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 +484 -0
  36. package/build/sync-version.js +10 -0
  37. package/docs/api.md +1487 -0
  38. package/docs/asynchronous.md +40 -0
  39. package/docs/benchmarks.md +55 -0
  40. package/docs/browser.md +227 -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 +1238 -0
  49. package/docs/web.md +269 -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 +394 -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/lib/writer.js +42 -0
  74. package/logs-buffer - Shortcut.lnk +0 -0
  75. package/package.json +117 -3
  76. package/pino-banner.png +0 -0
  77. package/pino-logo-hire.png +0 -0
  78. package/pino-tree.png +0 -0
  79. package/pino.d.ts +889 -0
  80. package/pino.js +236 -0
  81. package/pretty-demo.png +0 -0
  82. package/test/basic.test.js +874 -0
  83. package/test/broken-pipe.test.js +57 -0
  84. package/test/browser-child.test.js +132 -0
  85. package/test/browser-disabled.test.js +87 -0
  86. package/test/browser-early-console-freeze.test.js +12 -0
  87. package/test/browser-levels.test.js +241 -0
  88. package/test/browser-serializers.test.js +352 -0
  89. package/test/browser-timestamp.test.js +88 -0
  90. package/test/browser-transmit.test.js +417 -0
  91. package/test/browser.test.js +659 -0
  92. package/test/complex-objects.test.js +34 -0
  93. package/test/crlf.test.js +32 -0
  94. package/test/custom-levels.test.js +253 -0
  95. package/test/error.test.js +398 -0
  96. package/test/errorKey.test.js +34 -0
  97. package/test/escaping.test.js +91 -0
  98. package/test/esm/esm.mjs +12 -0
  99. package/test/esm/index.test.js +34 -0
  100. package/test/esm/named-exports.mjs +27 -0
  101. package/test/exit.test.js +77 -0
  102. package/test/fixtures/broken-pipe/basic.js +9 -0
  103. package/test/fixtures/broken-pipe/destination.js +10 -0
  104. package/test/fixtures/broken-pipe/syncfalse.js +12 -0
  105. package/test/fixtures/console-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 +56 -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 +644 -0
  184. package/test/transport/core.test.ts +236 -0
  185. package/test/transport/core.transpiled.test.ts +112 -0
  186. package/test/transport/module-link.test.js +239 -0
  187. package/test/transport/pipeline.test.js +135 -0
  188. package/test/transport/repl.test.js +14 -0
  189. package/test/transport/syncTrue.test.js +55 -0
  190. package/test/transport/syncfalse.test.js +68 -0
  191. package/test/transport/targets.test.js +44 -0
  192. package/test/transport/uses-pino-config.test.js +167 -0
  193. package/test/transport-stream.test.js +26 -0
  194. package/test/types/pino-import.test-d.ts +29 -0
  195. package/test/types/pino-multistream.test-d.ts +28 -0
  196. package/test/types/pino-top-export.test-d.ts +35 -0
  197. package/test/types/pino-transport.test-d.ts +145 -0
  198. package/test/types/pino-type-only.test-d.ts +64 -0
  199. package/test/types/pino.test-d.ts +468 -0
  200. package/test/types/pino.ts +78 -0
  201. package/tsconfig.json +14 -0
@@ -0,0 +1,145 @@
1
+ import { pino } from '../../pino'
2
+ import { expectType } from "tsd";
3
+
4
+ // Single
5
+ const transport = pino.transport({
6
+ target: '#pino/pretty',
7
+ options: { some: 'options for', the: 'transport' }
8
+ })
9
+ pino(transport)
10
+
11
+ expectType<pino.Logger>(pino({
12
+ transport: {
13
+ target: 'pino-pretty'
14
+ },
15
+ }))
16
+
17
+ // Multiple
18
+ const transports = pino.transport({targets: [
19
+ {
20
+ level: 'info',
21
+ target: '#pino/pretty',
22
+ options: { some: 'options for', the: 'transport' }
23
+ },
24
+ {
25
+ level: 'trace',
26
+ target: '#pino/file',
27
+ options: { destination: './test.log' }
28
+ }
29
+ ]})
30
+ pino(transports)
31
+
32
+ expectType<pino.Logger>(pino({
33
+ transport: {targets: [
34
+ {
35
+ level: 'info',
36
+ target: '#pino/pretty',
37
+ options: { some: 'options for', the: 'transport' }
38
+ },
39
+ {
40
+ level: 'trace',
41
+ target: '#pino/file',
42
+ options: { destination: './test.log' }
43
+ }
44
+ ]},
45
+ }))
46
+
47
+ const transportsWithCustomLevels = pino.transport({targets: [
48
+ {
49
+ level: 'info',
50
+ target: '#pino/pretty',
51
+ options: { some: 'options for', the: 'transport' }
52
+ },
53
+ {
54
+ level: 'foo',
55
+ target: '#pino/file',
56
+ options: { destination: './test.log' }
57
+ }
58
+ ], levels: { foo: 35 }})
59
+ pino(transports)
60
+
61
+ expectType<pino.Logger>(pino({
62
+ transport: {targets: [
63
+ {
64
+ level: 'info',
65
+ target: '#pino/pretty',
66
+ options: { some: 'options for', the: 'transport' }
67
+ },
68
+ {
69
+ level: 'trace',
70
+ target: '#pino/file',
71
+ options: { destination: './test.log' }
72
+ }
73
+ ], levels: { foo: 35 }
74
+ },
75
+ }))
76
+
77
+ const transportsWithoutOptions = pino.transport({
78
+ targets: [
79
+ { target: '#pino/pretty' },
80
+ { target: '#pino/file' }
81
+ ], levels: { foo: 35 }
82
+ })
83
+ pino(transports)
84
+
85
+ expectType<pino.Logger>(pino({
86
+ transport: {
87
+ targets: [
88
+ { target: '#pino/pretty' },
89
+ { target: '#pino/file' }
90
+ ], levels: { foo: 35 }
91
+ },
92
+ }))
93
+
94
+ const pipelineTransport = pino.transport({
95
+ pipeline: [{
96
+ target: './my-transform.js'
97
+ }, {
98
+ // Use target: 'pino/file' to write to stdout
99
+ // without any change.
100
+ target: 'pino-pretty'
101
+ }]
102
+ })
103
+ pino(pipelineTransport)
104
+
105
+ expectType<pino.Logger>(pino({
106
+ transport: {
107
+ pipeline: [{
108
+ target: './my-transform.js'
109
+ }, {
110
+ // Use target: 'pino/file' to write to stdout
111
+ // without any change.
112
+ target: 'pino-pretty'
113
+ }]
114
+ }
115
+ }))
116
+
117
+ type TransportConfig = {
118
+ id: string
119
+ }
120
+
121
+ // Custom transport params
122
+ const customTransport = pino.transport<TransportConfig>({
123
+ target: 'custom',
124
+ options: { id: 'abc' }
125
+ })
126
+ pino(customTransport)
127
+
128
+ // Worker
129
+ pino.transport({
130
+ target: 'custom',
131
+ worker: {
132
+ argv: ['a', 'b'],
133
+ stdin: false,
134
+ stderr: true,
135
+ stdout: false,
136
+ autoEnd: true,
137
+ },
138
+ options: { id: 'abc' }
139
+ })
140
+
141
+ // Dedupe
142
+ pino.transport({
143
+ targets: [],
144
+ dedupe: true,
145
+ })
@@ -0,0 +1,64 @@
1
+ import { expectAssignable, expectType, expectNotAssignable } from "tsd";
2
+
3
+ import pino from "../../";
4
+ import type {LevelWithSilent, Logger, LogFn, P, DestinationStreamWithMetadata, Level, LevelOrString, LevelWithSilentOrString, LoggerExtras, LoggerOptions } from "../../pino";
5
+
6
+ // NB: can also use `import * as pino`, but that form is callable as `pino()`
7
+ // under `esModuleInterop: false` or `pino.default()` under `esModuleInterop: true`.
8
+ const log = pino();
9
+ expectAssignable<LoggerExtras>(log);
10
+ expectType<Logger>(log);
11
+ expectType<LogFn>(log.info);
12
+
13
+ expectType<P.Logger>(log);
14
+ expectType<P.LogFn>(log.info);
15
+
16
+ expectType<Parameters<typeof log.isLevelEnabled>>([log.level]);
17
+
18
+ const level: Level = 'debug';
19
+ expectAssignable<string>(level);
20
+ expectAssignable<P.Level>(level);
21
+
22
+ const levelWithSilent: LevelWithSilent = 'silent';
23
+ expectAssignable<string>(levelWithSilent);
24
+ expectAssignable<P.LevelWithSilent>(levelWithSilent);
25
+
26
+ const levelOrString: LevelOrString = "myCustomLevel";
27
+ expectAssignable<string>(levelOrString);
28
+ expectNotAssignable<pino.Level>(levelOrString);
29
+ expectNotAssignable<pino.LevelWithSilent>(levelOrString);
30
+ expectAssignable<pino.LevelWithSilentOrString>(levelOrString);
31
+
32
+ const levelWithSilentOrString: LevelWithSilentOrString = "myCustomLevel";
33
+ expectAssignable<string>(levelWithSilentOrString);
34
+ expectNotAssignable<pino.Level>(levelWithSilentOrString);
35
+ expectNotAssignable<pino.LevelWithSilent>(levelWithSilentOrString);
36
+ expectAssignable<pino.LevelOrString>(levelWithSilentOrString);
37
+
38
+ function createStream(): DestinationStreamWithMetadata {
39
+ return { write() {} };
40
+ }
41
+
42
+ const stream = createStream();
43
+ // Argh. TypeScript doesn't seem to narrow unless we assign the symbol like so, and tsd seems to
44
+ // break without annotating the type explicitly
45
+ const needsMetadata: typeof pino.symbols.needsMetadataGsym = pino.symbols.needsMetadataGsym;
46
+ if (stream[needsMetadata]) {
47
+ expectType<number>(stream.lastLevel);
48
+ }
49
+
50
+ const loggerOptions:LoggerOptions = {
51
+ browser: {
52
+ formatters: {
53
+ log(obj) {
54
+ return obj
55
+ },
56
+ level(label, number) {
57
+ return { label, number}
58
+ }
59
+
60
+ }
61
+ }
62
+ }
63
+
64
+ expectType<LoggerOptions>(loggerOptions)
@@ -0,0 +1,468 @@
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
+ info("the answer is %d", 42);
14
+ info({ obj: 42 }, "hello world");
15
+ info({ obj: 42, b: 2 }, "hello world");
16
+ info({ obj: { aa: "bbb" } }, "another");
17
+ setImmediate(info, "after setImmediate");
18
+ error(new Error("an error"));
19
+
20
+ const writeSym = pino.symbols.writeSym;
21
+
22
+ const testUniqSymbol = {
23
+ [pino.symbols.needsMetadataGsym]: true,
24
+ }[pino.symbols.needsMetadataGsym];
25
+
26
+ const log2: P.Logger = pino({
27
+ name: "myapp",
28
+ safe: true,
29
+ serializers: {
30
+ req: pino.stdSerializers.req,
31
+ res: pino.stdSerializers.res,
32
+ err: pino.stdSerializers.err,
33
+ },
34
+ });
35
+
36
+ pino({
37
+ write(o) {},
38
+ });
39
+
40
+ pino({
41
+ mixin() {
42
+ return { customName: "unknown", customId: 111 };
43
+ },
44
+ });
45
+
46
+ pino({
47
+ mixin: () => ({ customName: "unknown", customId: 111 }),
48
+ });
49
+
50
+ pino({
51
+ mixin: (context: object) => ({ customName: "unknown", customId: 111 }),
52
+ });
53
+
54
+ pino({
55
+ mixin: (context: object, level: number) => ({ customName: "unknown", customId: 111 }),
56
+ });
57
+
58
+ pino({
59
+ redact: { paths: [], censor: "SECRET" },
60
+ });
61
+
62
+ pino({
63
+ redact: { paths: [], censor: () => "SECRET" },
64
+ });
65
+
66
+ pino({
67
+ redact: { paths: [], censor: (value) => value },
68
+ });
69
+
70
+ pino({
71
+ redact: { paths: [], censor: (value, path) => path.join() },
72
+ });
73
+
74
+ pino({
75
+ depthLimit: 1
76
+ });
77
+
78
+ pino({
79
+ edgeLimit: 1
80
+ });
81
+
82
+ pino({
83
+ browser: {
84
+ write(o) {},
85
+ },
86
+ });
87
+
88
+ pino({
89
+ browser: {
90
+ write: {
91
+ info(o) {},
92
+ error(o) {},
93
+ },
94
+ serialize: true,
95
+ asObject: true,
96
+ transmit: {
97
+ level: "fatal",
98
+ send: (level, logEvent) => {
99
+ level;
100
+ logEvent.bindings;
101
+ logEvent.level;
102
+ logEvent.ts;
103
+ logEvent.messages;
104
+ },
105
+ },
106
+ disabled: false
107
+ },
108
+ });
109
+
110
+ pino({}, undefined);
111
+
112
+ pino({ base: null });
113
+ if ("pino" in log) console.log(`pino version: ${log.pino}`);
114
+
115
+ expectType<void>(log.flush());
116
+ log.flush((err?: Error) => undefined);
117
+ log.child({ a: "property" }).info("hello child!");
118
+ log.level = "error";
119
+ log.info("nope");
120
+ const child = log.child({ foo: "bar" });
121
+ child.info("nope again");
122
+ child.level = "info";
123
+ child.info("hooray");
124
+ log.info("nope nope nope");
125
+ log.child({ foo: "bar" }, { level: "debug" }).debug("debug!");
126
+ child.bindings();
127
+ const customSerializers = {
128
+ test() {
129
+ return "this is my serializer";
130
+ },
131
+ };
132
+ pino().child({}, { serializers: customSerializers }).info({ test: "should not show up" });
133
+ const child2 = log.child({ father: true });
134
+ const childChild = child2.child({ baby: true });
135
+ const childRedacted = pino().child({}, { redact: ["path"] })
136
+ childRedacted.info({
137
+ msg: "logged with redacted properties",
138
+ path: "Not shown",
139
+ });
140
+ const childAnotherRedacted = pino().child({}, {
141
+ redact: {
142
+ paths: ["anotherPath"],
143
+ censor: "Not the log you\re looking for",
144
+ }
145
+ })
146
+ childAnotherRedacted.info({
147
+ msg: "another logged with redacted properties",
148
+ anotherPath: "Not shown",
149
+ });
150
+
151
+ log.level = "info";
152
+ if (log.levelVal === 30) {
153
+ console.log("logger level is `info`");
154
+ }
155
+
156
+ const listener = (lvl: any, val: any, prevLvl: any, prevVal: any) => {
157
+ console.log(lvl, val, prevLvl, prevVal);
158
+ };
159
+ log.on("level-change", (lvl, val, prevLvl, prevVal, logger) => {
160
+ console.log(lvl, val, prevLvl, prevVal);
161
+ });
162
+ log.level = "trace";
163
+ log.removeListener("level-change", listener);
164
+ log.level = "info";
165
+
166
+ pino.levels.values.error === 50;
167
+ pino.levels.labels[50] === "error";
168
+
169
+ const logstderr: pino.Logger = pino(process.stderr);
170
+ logstderr.error("on stderr instead of stdout");
171
+
172
+ log.useLevelLabels = true;
173
+ log.info("lol");
174
+ log.level === "info";
175
+ const isEnabled: boolean = log.isLevelEnabled("info");
176
+
177
+ const redacted = pino({
178
+ redact: ["path"],
179
+ });
180
+
181
+ redacted.info({
182
+ msg: "logged with redacted properties",
183
+ path: "Not shown",
184
+ });
185
+
186
+ const anotherRedacted = pino({
187
+ redact: {
188
+ paths: ["anotherPath"],
189
+ censor: "Not the log you\re looking for",
190
+ },
191
+ });
192
+
193
+ anotherRedacted.info({
194
+ msg: "another logged with redacted properties",
195
+ anotherPath: "Not shown",
196
+ });
197
+
198
+ const withTimeFn = pino({
199
+ timestamp: pino.stdTimeFunctions.isoTime,
200
+ });
201
+
202
+ const withNestedKey = pino({
203
+ nestedKey: "payload",
204
+ });
205
+
206
+ const withHooks = pino({
207
+ hooks: {
208
+ logMethod(args, method, level) {
209
+ expectType<pino.Logger>(this);
210
+ return method.apply(this, args);
211
+ },
212
+ streamWrite(s) {
213
+ expectType<string>(s);
214
+ return s.replaceAll('secret-key', 'xxx');
215
+ },
216
+ },
217
+ });
218
+
219
+ // Properties/types imported from pino-std-serializers
220
+ const wrappedErrSerializer = pino.stdSerializers.wrapErrorSerializer((err: pino.SerializedError) => {
221
+ return { ...err, newProp: "foo" };
222
+ });
223
+ const wrappedReqSerializer = pino.stdSerializers.wrapRequestSerializer((req: pino.SerializedRequest) => {
224
+ return { ...req, newProp: "foo" };
225
+ });
226
+ const wrappedResSerializer = pino.stdSerializers.wrapResponseSerializer((res: pino.SerializedResponse) => {
227
+ return { ...res, newProp: "foo" };
228
+ });
229
+
230
+ const socket = new Socket();
231
+ const incomingMessage = new IncomingMessage(socket);
232
+ const serverResponse = new ServerResponse(incomingMessage);
233
+
234
+ const mappedHttpRequest: { req: pino.SerializedRequest } = pino.stdSerializers.mapHttpRequest(incomingMessage);
235
+ const mappedHttpResponse: { res: pino.SerializedResponse } = pino.stdSerializers.mapHttpResponse(serverResponse);
236
+
237
+ const serializedErr: pino.SerializedError = pino.stdSerializers.err(new Error());
238
+ const serializedReq: pino.SerializedRequest = pino.stdSerializers.req(incomingMessage);
239
+ const serializedRes: pino.SerializedResponse = pino.stdSerializers.res(serverResponse);
240
+
241
+ /**
242
+ * Destination static method
243
+ */
244
+ const destinationViaDefaultArgs = pino.destination();
245
+ const destinationViaStrFileDescriptor = pino.destination("/log/path");
246
+ const destinationViaNumFileDescriptor = pino.destination(2);
247
+ const destinationViaStream = pino.destination(process.stdout);
248
+ const destinationViaOptionsObject = pino.destination({ dest: "/log/path", sync: false });
249
+
250
+ pino(destinationViaDefaultArgs);
251
+ pino({ name: "my-logger" }, destinationViaDefaultArgs);
252
+ pino(destinationViaStrFileDescriptor);
253
+ pino({ name: "my-logger" }, destinationViaStrFileDescriptor);
254
+ pino(destinationViaNumFileDescriptor);
255
+ pino({ name: "my-logger" }, destinationViaNumFileDescriptor);
256
+ pino(destinationViaStream);
257
+ pino({ name: "my-logger" }, destinationViaStream);
258
+ pino(destinationViaOptionsObject);
259
+ pino({ name: "my-logger" }, destinationViaOptionsObject);
260
+
261
+ try {
262
+ throw new Error('Some error')
263
+ } catch (err) {
264
+ log.error(err)
265
+ }
266
+
267
+ interface StrictShape {
268
+ activity: string;
269
+ err?: unknown;
270
+ }
271
+
272
+ info<StrictShape>({
273
+ activity: "Required property",
274
+ });
275
+
276
+ const logLine: pino.LogDescriptor = {
277
+ level: 20,
278
+ msg: "A log message",
279
+ time: new Date().getTime(),
280
+ aCustomProperty: true,
281
+ };
282
+
283
+ interface CustomLogger extends pino.Logger {
284
+ customMethod(msg: string, ...args: unknown[]): void;
285
+ }
286
+
287
+ const serializerFunc: pino.SerializerFn = () => {}
288
+ const writeFunc: pino.WriteFn = () => {}
289
+
290
+ interface CustomBaseLogger extends pino.BaseLogger {
291
+ child(): CustomBaseLogger
292
+ }
293
+
294
+ const customBaseLogger: CustomBaseLogger = {
295
+ level: 'info',
296
+ fatal() {},
297
+ error() {},
298
+ warn() {},
299
+ info() {},
300
+ debug() {},
301
+ trace() {},
302
+ silent() {},
303
+ child() { return this }
304
+ }
305
+
306
+ // custom levels
307
+ const log3 = pino({ customLevels: { myLevel: 100 } })
308
+ expectError(log3.log())
309
+ log3.level = 'myLevel'
310
+ log3.myLevel('')
311
+ log3.child({}).myLevel('')
312
+
313
+ log3.on('level-change', (lvl, val, prevLvl, prevVal, instance) => {
314
+ instance.myLevel('foo');
315
+ });
316
+
317
+ const clog3 = log3.child({}, { customLevels: { childLevel: 120 } })
318
+ // child inherit parent
319
+ clog3.myLevel('')
320
+ // child itself
321
+ clog3.childLevel('')
322
+ const cclog3 = clog3.child({}, { customLevels: { childLevel2: 130 } })
323
+ // child inherit root
324
+ cclog3.myLevel('')
325
+ // child inherit parent
326
+ cclog3.childLevel('')
327
+ // child itself
328
+ cclog3.childLevel2('')
329
+
330
+ const ccclog3 = clog3.child({})
331
+ expectError(ccclog3.nonLevel(''))
332
+
333
+ const withChildCallback = pino({
334
+ onChild: (child: Logger) => {}
335
+ })
336
+ withChildCallback.onChild = (child: Logger) => {}
337
+
338
+ pino({
339
+ crlf: true,
340
+ });
341
+
342
+ const customLevels = { foo: 99, bar: 42 }
343
+
344
+ const customLevelLogger = pino({ customLevels });
345
+
346
+ type CustomLevelLogger = typeof customLevelLogger
347
+ type CustomLevelLoggerLevels = pino.Level | keyof typeof customLevels
348
+
349
+ const fn = (logger: Pick<CustomLevelLogger, CustomLevelLoggerLevels>) => {}
350
+
351
+ const customLevelChildLogger = customLevelLogger.child({ name: "child" })
352
+
353
+ fn(customLevelChildLogger); // missing foo typing
354
+
355
+ // unknown option
356
+ expectError(
357
+ pino({
358
+ hello: 'world'
359
+ })
360
+ );
361
+
362
+ // unknown option
363
+ expectError(
364
+ pino({
365
+ hello: 'world',
366
+ customLevels: {
367
+ 'log': 30
368
+ }
369
+ })
370
+ );
371
+
372
+ function dangerous () {
373
+ throw Error('foo')
374
+ }
375
+
376
+ try {
377
+ dangerous()
378
+ } catch (err) {
379
+ log.error(err)
380
+ }
381
+
382
+ try {
383
+ dangerous()
384
+ } catch (err) {
385
+ log.error({ err })
386
+ }
387
+
388
+ const bLogger = pino({
389
+ customLevels: {
390
+ log: 5,
391
+ },
392
+ level: 'log',
393
+ transport: {
394
+ target: 'pino-pretty',
395
+ options: {
396
+ colorize: true,
397
+ },
398
+ },
399
+ });
400
+
401
+ expectType<Logger<'log'>>(pino({
402
+ customLevels: {
403
+ log: 5,
404
+ },
405
+ level: 'log',
406
+ transport: {
407
+ target: 'pino-pretty',
408
+ options: {
409
+ colorize: true,
410
+ },
411
+ },
412
+ }))
413
+
414
+ const parentLogger1 = pino({
415
+ customLevels: { myLevel: 90 },
416
+ onChild: (child) => { const a = child.myLevel; }
417
+ }, process.stdout)
418
+ parentLogger1.onChild = (child) => { child.myLevel(''); }
419
+
420
+ const childLogger1 = parentLogger1.child({});
421
+ childLogger1.myLevel('');
422
+ expectError(childLogger1.doesntExist(''));
423
+
424
+ const parentLogger2 = pino({}, process.stdin);
425
+ expectError(parentLogger2.onChild = (child) => { const b = child.doesntExist; });
426
+
427
+ const childLogger2 = parentLogger2.child({});
428
+ expectError(childLogger2.doesntExist);
429
+
430
+ expectError(pino({
431
+ onChild: (child) => { const a = child.doesntExist; }
432
+ }, process.stdout));
433
+
434
+ const pinoWithoutLevelsSorting = pino({});
435
+ const pinoWithDescSortingLevels = pino({ levelComparison: 'DESC' });
436
+ const pinoWithAscSortingLevels = pino({ levelComparison: 'ASC' });
437
+ const pinoWithCustomSortingLevels = pino({ levelComparison: () => false });
438
+ // with wrong level comparison direction
439
+ expectError(pino({ levelComparison: 'SOME'}), process.stdout);
440
+ // with wrong level comparison type
441
+ expectError(pino({ levelComparison: 123}), process.stdout);
442
+ // with wrong custom level comparison return type
443
+ expectError(pino({ levelComparison: () => null }), process.stdout);
444
+ expectError(pino({ levelComparison: () => 1 }), process.stdout);
445
+ expectError(pino({ levelComparison: () => 'string' }), process.stdout);
446
+
447
+ const customLevelsOnlyOpts = {
448
+ useOnlyCustomLevels: true,
449
+ customLevels: {
450
+ customDebug: 10,
451
+ info: 20, // to make sure the default names are also available for override
452
+ customNetwork: 30,
453
+ customError: 40,
454
+ },
455
+ level: 'customDebug',
456
+ } satisfies LoggerOptions;
457
+
458
+ const loggerWithCustomLevelOnly = pino(customLevelsOnlyOpts);
459
+ loggerWithCustomLevelOnly.customDebug('test3')
460
+ loggerWithCustomLevelOnly.info('test4')
461
+ loggerWithCustomLevelOnly.customError('test5')
462
+ loggerWithCustomLevelOnly.customNetwork('test6')
463
+
464
+ expectError(loggerWithCustomLevelOnly.fatal('test'));
465
+ expectError(loggerWithCustomLevelOnly.error('test'));
466
+ expectError(loggerWithCustomLevelOnly.warn('test'));
467
+ expectError(loggerWithCustomLevelOnly.debug('test'));
468
+ expectError(loggerWithCustomLevelOnly.trace('test'));