@geekmidas/logger 10.0.0-alpha.9 → 10.0.0-alpha.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/console.cjs +24 -25
- package/dist/console.cjs.map +1 -1
- package/dist/console.d.cts +4 -7
- package/dist/console.d.cts.map +1 -1
- package/dist/console.d.mts +4 -7
- package/dist/console.d.mts.map +1 -1
- package/dist/console.mjs +23 -25
- package/dist/console.mjs.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -3
- package/dist/otel.cjs +113 -0
- package/dist/otel.cjs.map +1 -0
- package/dist/otel.d.cts +31 -0
- package/dist/otel.d.cts.map +1 -0
- package/dist/otel.d.mts +31 -0
- package/dist/otel.d.mts.map +1 -0
- package/dist/otel.mjs +110 -0
- package/dist/otel.mjs.map +1 -0
- package/dist/pino.cjs +67 -39
- package/dist/pino.cjs.map +1 -1
- package/dist/pino.d.cts +9 -12
- package/dist/pino.d.cts.map +1 -1
- package/dist/pino.d.mts +9 -12
- package/dist/pino.d.mts.map +1 -1
- package/dist/pino.mjs +66 -16
- package/dist/pino.mjs.map +1 -1
- package/dist/redact-paths.cjs +116 -2
- package/dist/redact-paths.cjs.map +1 -0
- package/dist/redact-paths.d.cts +31 -2
- package/dist/redact-paths.d.cts.map +1 -0
- package/dist/redact-paths.d.mts +31 -2
- package/dist/redact-paths.d.mts.map +1 -0
- package/dist/redact-paths.mjs +113 -2
- package/dist/redact-paths.mjs.map +1 -0
- package/dist/types.cjs +32 -2
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +175 -2
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +175 -2
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +31 -2
- package/dist/types.mjs.map +1 -0
- package/package.json +22 -3
- package/dist/redact-paths-CsK0_uz-.d.cts +0 -19
- package/dist/redact-paths-CsK0_uz-.d.cts.map +0 -1
- package/dist/redact-paths-D07eTMlH.d.mts +0 -19
- package/dist/redact-paths-D07eTMlH.d.mts.map +0 -1
- package/dist/redact-paths-D0m0DIuQ.cjs +0 -73
- package/dist/redact-paths-D0m0DIuQ.cjs.map +0 -1
- package/dist/redact-paths-DQoIXhkS.mjs +0 -67
- package/dist/redact-paths-DQoIXhkS.mjs.map +0 -1
- package/dist/types-BDdpcrpy.d.mts +0 -166
- package/dist/types-BDdpcrpy.d.mts.map +0 -1
- package/dist/types-Dk_k2-f_.d.cts +0 -166
- package/dist/types-Dk_k2-f_.d.cts.map +0 -1
- package/dist/types-ag_0Cvbg.cjs +0 -38
- package/dist/types-ag_0Cvbg.cjs.map +0 -1
- package/dist/types-yQ6XOihF.mjs +0 -32
- package/dist/types-yQ6XOihF.mjs.map +0 -1
package/dist/redact-paths.cjs
CHANGED
|
@@ -1,3 +1,117 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/redact-paths.ts
|
|
3
|
+
/**
|
|
4
|
+
* Default sensitive field paths for redaction.
|
|
5
|
+
*
|
|
6
|
+
* These paths are automatically used when `redact: true` is set,
|
|
7
|
+
* and merged with custom paths unless `resolution: 'override'` is specified.
|
|
8
|
+
*
|
|
9
|
+
* Includes:
|
|
10
|
+
* - Authentication: password, token, apiKey, authorization, credentials
|
|
11
|
+
* - Headers: authorization, cookie, x-api-key, x-auth-token
|
|
12
|
+
* - Personal data: ssn, creditCard, cvv, pin
|
|
13
|
+
* - Secrets: secret, connectionString, databaseUrl
|
|
14
|
+
* - Wildcards: *.password, *.secret, *.token (catches nested fields)
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_REDACT_PATHS = [
|
|
17
|
+
"password",
|
|
18
|
+
"pass",
|
|
19
|
+
"passwd",
|
|
20
|
+
"secret",
|
|
21
|
+
"token",
|
|
22
|
+
"accessToken",
|
|
23
|
+
"refreshToken",
|
|
24
|
+
"idToken",
|
|
25
|
+
"apiKey",
|
|
26
|
+
"api_key",
|
|
27
|
+
"apikey",
|
|
28
|
+
"auth",
|
|
29
|
+
"authorization",
|
|
30
|
+
"credential",
|
|
31
|
+
"credentials",
|
|
32
|
+
"*.password",
|
|
33
|
+
"*.secret",
|
|
34
|
+
"*.token",
|
|
35
|
+
"*.apiKey",
|
|
36
|
+
"*.api_key",
|
|
37
|
+
"*.authorization",
|
|
38
|
+
"*.accessToken",
|
|
39
|
+
"*.refreshToken",
|
|
40
|
+
"headers.authorization",
|
|
41
|
+
"headers.Authorization",
|
|
42
|
+
"headers[\"authorization\"]",
|
|
43
|
+
"headers[\"Authorization\"]",
|
|
44
|
+
"headers.cookie",
|
|
45
|
+
"headers.Cookie",
|
|
46
|
+
"headers[\"x-api-key\"]",
|
|
47
|
+
"headers[\"X-Api-Key\"]",
|
|
48
|
+
"headers[\"x-auth-token\"]",
|
|
49
|
+
"headers[\"X-Auth-Token\"]",
|
|
50
|
+
"ssn",
|
|
51
|
+
"socialSecurityNumber",
|
|
52
|
+
"social_security_number",
|
|
53
|
+
"creditCard",
|
|
54
|
+
"credit_card",
|
|
55
|
+
"cardNumber",
|
|
56
|
+
"card_number",
|
|
57
|
+
"cvv",
|
|
58
|
+
"cvc",
|
|
59
|
+
"pin",
|
|
60
|
+
"connectionString",
|
|
61
|
+
"connection_string",
|
|
62
|
+
"databaseUrl",
|
|
63
|
+
"database_url"
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* `scheme://user:password@` — the userinfo of a URL that carries a secret.
|
|
67
|
+
* A user with no password (`ssh://git@host`) names nobody's secret and is left
|
|
68
|
+
* alone.
|
|
69
|
+
*/
|
|
70
|
+
const URL_CREDENTIALS = /\b([a-z][a-z0-9+.-]*:\/\/)[^\s/?#@:]*:[^\s/?#@]*@/gi;
|
|
71
|
+
/**
|
|
72
|
+
* Replace the credentials of every URL in `text` with `REDACTED`, so
|
|
73
|
+
* `s3://KEY:SECRET@uploads` is logged as `s3://REDACTED@uploads`.
|
|
74
|
+
*
|
|
75
|
+
* Path redaction cannot catch these: a URL turns up under any field name —
|
|
76
|
+
* `url`, `origin`, `endpoint` — or inside a message, and blanking every such
|
|
77
|
+
* field would hide the half of it that is useful.
|
|
78
|
+
*/
|
|
79
|
+
function redactUrlCredentials(text) {
|
|
80
|
+
return text.replace(URL_CREDENTIALS, "$1REDACTED@");
|
|
81
|
+
}
|
|
82
|
+
/** Deep enough for a log object; past it, values are logged as they are. */
|
|
83
|
+
const MAX_DEPTH = 6;
|
|
84
|
+
/**
|
|
85
|
+
* A copy of `value` with {@link redactUrlCredentials} applied to every string
|
|
86
|
+
* in it. Objects and arrays without such a string are returned as they were.
|
|
87
|
+
*/
|
|
88
|
+
function redactUrlCredentialsIn(value, depth = 0) {
|
|
89
|
+
if (typeof value === "string") return redactUrlCredentials(value);
|
|
90
|
+
if (depth >= MAX_DEPTH || value === null || typeof value !== "object") return value;
|
|
91
|
+
if (Array.isArray(value)) {
|
|
92
|
+
let changed = false;
|
|
93
|
+
const next = value.map((item) => {
|
|
94
|
+
const redacted = redactUrlCredentialsIn(item, depth + 1);
|
|
95
|
+
if (redacted !== item) changed = true;
|
|
96
|
+
return redacted;
|
|
97
|
+
});
|
|
98
|
+
return changed ? next : value;
|
|
99
|
+
}
|
|
100
|
+
const proto = Object.getPrototypeOf(value);
|
|
101
|
+
if (proto !== Object.prototype && proto !== null) return value;
|
|
102
|
+
let next;
|
|
103
|
+
for (const [key, item] of Object.entries(value)) {
|
|
104
|
+
const redacted = redactUrlCredentialsIn(item, depth + 1);
|
|
105
|
+
if (redacted !== item) {
|
|
106
|
+
next ??= { ...value };
|
|
107
|
+
next[key] = redacted;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return next ?? value;
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
113
|
+
exports.DEFAULT_REDACT_PATHS = DEFAULT_REDACT_PATHS;
|
|
114
|
+
exports.redactUrlCredentials = redactUrlCredentials;
|
|
115
|
+
exports.redactUrlCredentialsIn = redactUrlCredentialsIn;
|
|
2
116
|
|
|
3
|
-
|
|
117
|
+
//# sourceMappingURL=redact-paths.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact-paths.cjs","names":[],"sources":["../src/redact-paths.ts"],"sourcesContent":["/**\n * Default sensitive field paths for redaction.\n *\n * These paths are automatically used when `redact: true` is set,\n * and merged with custom paths unless `resolution: 'override'` is specified.\n *\n * Includes:\n * - Authentication: password, token, apiKey, authorization, credentials\n * - Headers: authorization, cookie, x-api-key, x-auth-token\n * - Personal data: ssn, creditCard, cvv, pin\n * - Secrets: secret, connectionString, databaseUrl\n * - Wildcards: *.password, *.secret, *.token (catches nested fields)\n */\nexport const DEFAULT_REDACT_PATHS: string[] = [\n\t// Authentication & authorization\n\t'password',\n\t'pass',\n\t'passwd',\n\t'secret',\n\t'token',\n\t'accessToken',\n\t'refreshToken',\n\t'idToken',\n\t'apiKey',\n\t'api_key',\n\t'apikey',\n\t'auth',\n\t'authorization',\n\t'credential',\n\t'credentials',\n\n\t// Common nested patterns (headers, body, etc.)\n\t'*.password',\n\t'*.secret',\n\t'*.token',\n\t'*.apiKey',\n\t'*.api_key',\n\t'*.authorization',\n\t'*.accessToken',\n\t'*.refreshToken',\n\n\t// HTTP headers (case variations)\n\t'headers.authorization',\n\t'headers.Authorization',\n\t'headers[\"authorization\"]',\n\t'headers[\"Authorization\"]',\n\t'headers.cookie',\n\t'headers.Cookie',\n\t'headers[\"x-api-key\"]',\n\t'headers[\"X-Api-Key\"]',\n\t'headers[\"x-auth-token\"]',\n\t'headers[\"X-Auth-Token\"]',\n\n\t// Common sensitive data fields\n\t'ssn',\n\t'socialSecurityNumber',\n\t'social_security_number',\n\t'creditCard',\n\t'credit_card',\n\t'cardNumber',\n\t'card_number',\n\t'cvv',\n\t'cvc',\n\t'pin',\n\n\t// Database & connection strings\n\t'connectionString',\n\t'connection_string',\n\t'databaseUrl',\n\t'database_url',\n];\n\n/**\n * `scheme://user:password@` — the userinfo of a URL that carries a secret.\n * A user with no password (`ssh://git@host`) names nobody's secret and is left\n * alone.\n */\nconst URL_CREDENTIALS = /\\b([a-z][a-z0-9+.-]*:\\/\\/)[^\\s/?#@:]*:[^\\s/?#@]*@/gi;\n\n/**\n * Replace the credentials of every URL in `text` with `REDACTED`, so\n * `s3://KEY:SECRET@uploads` is logged as `s3://REDACTED@uploads`.\n *\n * Path redaction cannot catch these: a URL turns up under any field name —\n * `url`, `origin`, `endpoint` — or inside a message, and blanking every such\n * field would hide the half of it that is useful.\n */\nexport function redactUrlCredentials(text: string): string {\n\treturn text.replace(URL_CREDENTIALS, '$1REDACTED@');\n}\n\n/** Deep enough for a log object; past it, values are logged as they are. */\nconst MAX_DEPTH = 6;\n\n/**\n * A copy of `value` with {@link redactUrlCredentials} applied to every string\n * in it. Objects and arrays without such a string are returned as they were.\n */\nexport function redactUrlCredentialsIn<T>(value: T, depth = 0): T {\n\tif (typeof value === 'string') {\n\t\treturn redactUrlCredentials(value) as T;\n\t}\n\tif (depth >= MAX_DEPTH || value === null || typeof value !== 'object') {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\tlet changed = false;\n\t\tconst next = value.map((item) => {\n\t\t\tconst redacted = redactUrlCredentialsIn(item, depth + 1);\n\t\t\tif (redacted !== item) changed = true;\n\t\t\treturn redacted;\n\t\t});\n\t\treturn (changed ? next : value) as T;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return value;\n\n\tlet next: Record<string, unknown> | undefined;\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst redacted = redactUrlCredentialsIn(item, depth + 1);\n\t\tif (redacted !== item) {\n\t\t\tnext ??= { ...(value as Record<string, unknown>) };\n\t\t\tnext[key] = redacted;\n\t\t}\n\t}\n\treturn (next ?? value) as T;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,MAAa,uBAAiC;CAE7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;AACD;;;;;;AAOA,MAAM,kBAAkB;;;;;;;;;AAUxB,SAAgB,qBAAqB,MAAsB;CAC1D,OAAO,KAAK,QAAQ,iBAAiB,aAAa;AACnD;;AAGA,MAAM,YAAY;;;;;AAMlB,SAAgB,uBAA0B,OAAU,QAAQ,GAAM;CACjE,IAAI,OAAO,UAAU,UACpB,OAAO,qBAAqB,KAAK;CAElC,IAAI,SAAS,aAAa,UAAU,QAAQ,OAAO,UAAU,UAC5D,OAAO;CAER,IAAI,MAAM,QAAQ,KAAK,GAAG;EACzB,IAAI,UAAU;EACd,MAAM,OAAO,MAAM,KAAK,SAAS;GAChC,MAAM,WAAW,uBAAuB,MAAM,QAAQ,CAAC;GACvD,IAAI,aAAa,MAAM,UAAU;GACjC,OAAO;EACR,CAAC;EACD,OAAQ,UAAU,OAAO;CAC1B;CACA,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,UAAU,OAAO,aAAa,UAAU,MAAM,OAAO;CAEzD,IAAI;CACJ,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAAG;EAChD,MAAM,WAAW,uBAAuB,MAAM,QAAQ,CAAC;EACvD,IAAI,aAAa,MAAM;GACtB,SAAS,EAAE,GAAI,MAAkC;GACjD,KAAK,OAAO;EACb;CACD;CACA,OAAQ,QAAQ;AACjB"}
|
package/dist/redact-paths.d.cts
CHANGED
|
@@ -1,2 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/redact-paths.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Default sensitive field paths for redaction.
|
|
4
|
+
*
|
|
5
|
+
* These paths are automatically used when `redact: true` is set,
|
|
6
|
+
* and merged with custom paths unless `resolution: 'override'` is specified.
|
|
7
|
+
*
|
|
8
|
+
* Includes:
|
|
9
|
+
* - Authentication: password, token, apiKey, authorization, credentials
|
|
10
|
+
* - Headers: authorization, cookie, x-api-key, x-auth-token
|
|
11
|
+
* - Personal data: ssn, creditCard, cvv, pin
|
|
12
|
+
* - Secrets: secret, connectionString, databaseUrl
|
|
13
|
+
* - Wildcards: *.password, *.secret, *.token (catches nested fields)
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_REDACT_PATHS: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Replace the credentials of every URL in `text` with `REDACTED`, so
|
|
18
|
+
* `s3://KEY:SECRET@uploads` is logged as `s3://REDACTED@uploads`.
|
|
19
|
+
*
|
|
20
|
+
* Path redaction cannot catch these: a URL turns up under any field name —
|
|
21
|
+
* `url`, `origin`, `endpoint` — or inside a message, and blanking every such
|
|
22
|
+
* field would hide the half of it that is useful.
|
|
23
|
+
*/
|
|
24
|
+
export declare function redactUrlCredentials(text: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* A copy of `value` with {@link redactUrlCredentials} applied to every string
|
|
27
|
+
* in it. Objects and arrays without such a string are returned as they were.
|
|
28
|
+
*/
|
|
29
|
+
export declare function redactUrlCredentialsIn<T>(value: T, depth?: number): T;
|
|
30
|
+
//#endregion
|
|
31
|
+
//# sourceMappingURL=redact-paths.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact-paths.d.cts","names":[],"sources":["../src/redact-paths.ts"],"mappings":";;;;;;;;;;;;;;qBAaa;;;;;;;;;wBA0EG,qBAAqB;;;;;wBAWrB,uBAAuB,GAAG,OAAO,GAAG,iBAAY"}
|
package/dist/redact-paths.d.mts
CHANGED
|
@@ -1,2 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/redact-paths.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Default sensitive field paths for redaction.
|
|
4
|
+
*
|
|
5
|
+
* These paths are automatically used when `redact: true` is set,
|
|
6
|
+
* and merged with custom paths unless `resolution: 'override'` is specified.
|
|
7
|
+
*
|
|
8
|
+
* Includes:
|
|
9
|
+
* - Authentication: password, token, apiKey, authorization, credentials
|
|
10
|
+
* - Headers: authorization, cookie, x-api-key, x-auth-token
|
|
11
|
+
* - Personal data: ssn, creditCard, cvv, pin
|
|
12
|
+
* - Secrets: secret, connectionString, databaseUrl
|
|
13
|
+
* - Wildcards: *.password, *.secret, *.token (catches nested fields)
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_REDACT_PATHS: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Replace the credentials of every URL in `text` with `REDACTED`, so
|
|
18
|
+
* `s3://KEY:SECRET@uploads` is logged as `s3://REDACTED@uploads`.
|
|
19
|
+
*
|
|
20
|
+
* Path redaction cannot catch these: a URL turns up under any field name —
|
|
21
|
+
* `url`, `origin`, `endpoint` — or inside a message, and blanking every such
|
|
22
|
+
* field would hide the half of it that is useful.
|
|
23
|
+
*/
|
|
24
|
+
export declare function redactUrlCredentials(text: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* A copy of `value` with {@link redactUrlCredentials} applied to every string
|
|
27
|
+
* in it. Objects and arrays without such a string are returned as they were.
|
|
28
|
+
*/
|
|
29
|
+
export declare function redactUrlCredentialsIn<T>(value: T, depth?: number): T;
|
|
30
|
+
//#endregion
|
|
31
|
+
//# sourceMappingURL=redact-paths.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact-paths.d.mts","names":[],"sources":["../src/redact-paths.ts"],"mappings":";;;;;;;;;;;;;;qBAaa;;;;;;;;;wBA0EG,qBAAqB;;;;;wBAWrB,uBAAuB,GAAG,OAAO,GAAG,iBAAY"}
|
package/dist/redact-paths.mjs
CHANGED
|
@@ -1,3 +1,114 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/redact-paths.ts
|
|
2
|
+
/**
|
|
3
|
+
* Default sensitive field paths for redaction.
|
|
4
|
+
*
|
|
5
|
+
* These paths are automatically used when `redact: true` is set,
|
|
6
|
+
* and merged with custom paths unless `resolution: 'override'` is specified.
|
|
7
|
+
*
|
|
8
|
+
* Includes:
|
|
9
|
+
* - Authentication: password, token, apiKey, authorization, credentials
|
|
10
|
+
* - Headers: authorization, cookie, x-api-key, x-auth-token
|
|
11
|
+
* - Personal data: ssn, creditCard, cvv, pin
|
|
12
|
+
* - Secrets: secret, connectionString, databaseUrl
|
|
13
|
+
* - Wildcards: *.password, *.secret, *.token (catches nested fields)
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_REDACT_PATHS = [
|
|
16
|
+
"password",
|
|
17
|
+
"pass",
|
|
18
|
+
"passwd",
|
|
19
|
+
"secret",
|
|
20
|
+
"token",
|
|
21
|
+
"accessToken",
|
|
22
|
+
"refreshToken",
|
|
23
|
+
"idToken",
|
|
24
|
+
"apiKey",
|
|
25
|
+
"api_key",
|
|
26
|
+
"apikey",
|
|
27
|
+
"auth",
|
|
28
|
+
"authorization",
|
|
29
|
+
"credential",
|
|
30
|
+
"credentials",
|
|
31
|
+
"*.password",
|
|
32
|
+
"*.secret",
|
|
33
|
+
"*.token",
|
|
34
|
+
"*.apiKey",
|
|
35
|
+
"*.api_key",
|
|
36
|
+
"*.authorization",
|
|
37
|
+
"*.accessToken",
|
|
38
|
+
"*.refreshToken",
|
|
39
|
+
"headers.authorization",
|
|
40
|
+
"headers.Authorization",
|
|
41
|
+
"headers[\"authorization\"]",
|
|
42
|
+
"headers[\"Authorization\"]",
|
|
43
|
+
"headers.cookie",
|
|
44
|
+
"headers.Cookie",
|
|
45
|
+
"headers[\"x-api-key\"]",
|
|
46
|
+
"headers[\"X-Api-Key\"]",
|
|
47
|
+
"headers[\"x-auth-token\"]",
|
|
48
|
+
"headers[\"X-Auth-Token\"]",
|
|
49
|
+
"ssn",
|
|
50
|
+
"socialSecurityNumber",
|
|
51
|
+
"social_security_number",
|
|
52
|
+
"creditCard",
|
|
53
|
+
"credit_card",
|
|
54
|
+
"cardNumber",
|
|
55
|
+
"card_number",
|
|
56
|
+
"cvv",
|
|
57
|
+
"cvc",
|
|
58
|
+
"pin",
|
|
59
|
+
"connectionString",
|
|
60
|
+
"connection_string",
|
|
61
|
+
"databaseUrl",
|
|
62
|
+
"database_url"
|
|
63
|
+
];
|
|
64
|
+
/**
|
|
65
|
+
* `scheme://user:password@` — the userinfo of a URL that carries a secret.
|
|
66
|
+
* A user with no password (`ssh://git@host`) names nobody's secret and is left
|
|
67
|
+
* alone.
|
|
68
|
+
*/
|
|
69
|
+
const URL_CREDENTIALS = /\b([a-z][a-z0-9+.-]*:\/\/)[^\s/?#@:]*:[^\s/?#@]*@/gi;
|
|
70
|
+
/**
|
|
71
|
+
* Replace the credentials of every URL in `text` with `REDACTED`, so
|
|
72
|
+
* `s3://KEY:SECRET@uploads` is logged as `s3://REDACTED@uploads`.
|
|
73
|
+
*
|
|
74
|
+
* Path redaction cannot catch these: a URL turns up under any field name —
|
|
75
|
+
* `url`, `origin`, `endpoint` — or inside a message, and blanking every such
|
|
76
|
+
* field would hide the half of it that is useful.
|
|
77
|
+
*/
|
|
78
|
+
function redactUrlCredentials(text) {
|
|
79
|
+
return text.replace(URL_CREDENTIALS, "$1REDACTED@");
|
|
80
|
+
}
|
|
81
|
+
/** Deep enough for a log object; past it, values are logged as they are. */
|
|
82
|
+
const MAX_DEPTH = 6;
|
|
83
|
+
/**
|
|
84
|
+
* A copy of `value` with {@link redactUrlCredentials} applied to every string
|
|
85
|
+
* in it. Objects and arrays without such a string are returned as they were.
|
|
86
|
+
*/
|
|
87
|
+
function redactUrlCredentialsIn(value, depth = 0) {
|
|
88
|
+
if (typeof value === "string") return redactUrlCredentials(value);
|
|
89
|
+
if (depth >= MAX_DEPTH || value === null || typeof value !== "object") return value;
|
|
90
|
+
if (Array.isArray(value)) {
|
|
91
|
+
let changed = false;
|
|
92
|
+
const next = value.map((item) => {
|
|
93
|
+
const redacted = redactUrlCredentialsIn(item, depth + 1);
|
|
94
|
+
if (redacted !== item) changed = true;
|
|
95
|
+
return redacted;
|
|
96
|
+
});
|
|
97
|
+
return changed ? next : value;
|
|
98
|
+
}
|
|
99
|
+
const proto = Object.getPrototypeOf(value);
|
|
100
|
+
if (proto !== Object.prototype && proto !== null) return value;
|
|
101
|
+
let next;
|
|
102
|
+
for (const [key, item] of Object.entries(value)) {
|
|
103
|
+
const redacted = redactUrlCredentialsIn(item, depth + 1);
|
|
104
|
+
if (redacted !== item) {
|
|
105
|
+
next ??= { ...value };
|
|
106
|
+
next[key] = redacted;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return next ?? value;
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
export { DEFAULT_REDACT_PATHS, redactUrlCredentials, redactUrlCredentialsIn };
|
|
2
113
|
|
|
3
|
-
|
|
114
|
+
//# sourceMappingURL=redact-paths.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact-paths.mjs","names":[],"sources":["../src/redact-paths.ts"],"sourcesContent":["/**\n * Default sensitive field paths for redaction.\n *\n * These paths are automatically used when `redact: true` is set,\n * and merged with custom paths unless `resolution: 'override'` is specified.\n *\n * Includes:\n * - Authentication: password, token, apiKey, authorization, credentials\n * - Headers: authorization, cookie, x-api-key, x-auth-token\n * - Personal data: ssn, creditCard, cvv, pin\n * - Secrets: secret, connectionString, databaseUrl\n * - Wildcards: *.password, *.secret, *.token (catches nested fields)\n */\nexport const DEFAULT_REDACT_PATHS: string[] = [\n\t// Authentication & authorization\n\t'password',\n\t'pass',\n\t'passwd',\n\t'secret',\n\t'token',\n\t'accessToken',\n\t'refreshToken',\n\t'idToken',\n\t'apiKey',\n\t'api_key',\n\t'apikey',\n\t'auth',\n\t'authorization',\n\t'credential',\n\t'credentials',\n\n\t// Common nested patterns (headers, body, etc.)\n\t'*.password',\n\t'*.secret',\n\t'*.token',\n\t'*.apiKey',\n\t'*.api_key',\n\t'*.authorization',\n\t'*.accessToken',\n\t'*.refreshToken',\n\n\t// HTTP headers (case variations)\n\t'headers.authorization',\n\t'headers.Authorization',\n\t'headers[\"authorization\"]',\n\t'headers[\"Authorization\"]',\n\t'headers.cookie',\n\t'headers.Cookie',\n\t'headers[\"x-api-key\"]',\n\t'headers[\"X-Api-Key\"]',\n\t'headers[\"x-auth-token\"]',\n\t'headers[\"X-Auth-Token\"]',\n\n\t// Common sensitive data fields\n\t'ssn',\n\t'socialSecurityNumber',\n\t'social_security_number',\n\t'creditCard',\n\t'credit_card',\n\t'cardNumber',\n\t'card_number',\n\t'cvv',\n\t'cvc',\n\t'pin',\n\n\t// Database & connection strings\n\t'connectionString',\n\t'connection_string',\n\t'databaseUrl',\n\t'database_url',\n];\n\n/**\n * `scheme://user:password@` — the userinfo of a URL that carries a secret.\n * A user with no password (`ssh://git@host`) names nobody's secret and is left\n * alone.\n */\nconst URL_CREDENTIALS = /\\b([a-z][a-z0-9+.-]*:\\/\\/)[^\\s/?#@:]*:[^\\s/?#@]*@/gi;\n\n/**\n * Replace the credentials of every URL in `text` with `REDACTED`, so\n * `s3://KEY:SECRET@uploads` is logged as `s3://REDACTED@uploads`.\n *\n * Path redaction cannot catch these: a URL turns up under any field name —\n * `url`, `origin`, `endpoint` — or inside a message, and blanking every such\n * field would hide the half of it that is useful.\n */\nexport function redactUrlCredentials(text: string): string {\n\treturn text.replace(URL_CREDENTIALS, '$1REDACTED@');\n}\n\n/** Deep enough for a log object; past it, values are logged as they are. */\nconst MAX_DEPTH = 6;\n\n/**\n * A copy of `value` with {@link redactUrlCredentials} applied to every string\n * in it. Objects and arrays without such a string are returned as they were.\n */\nexport function redactUrlCredentialsIn<T>(value: T, depth = 0): T {\n\tif (typeof value === 'string') {\n\t\treturn redactUrlCredentials(value) as T;\n\t}\n\tif (depth >= MAX_DEPTH || value === null || typeof value !== 'object') {\n\t\treturn value;\n\t}\n\tif (Array.isArray(value)) {\n\t\tlet changed = false;\n\t\tconst next = value.map((item) => {\n\t\t\tconst redacted = redactUrlCredentialsIn(item, depth + 1);\n\t\t\tif (redacted !== item) changed = true;\n\t\t\treturn redacted;\n\t\t});\n\t\treturn (changed ? next : value) as T;\n\t}\n\tconst proto = Object.getPrototypeOf(value);\n\tif (proto !== Object.prototype && proto !== null) return value;\n\n\tlet next: Record<string, unknown> | undefined;\n\tfor (const [key, item] of Object.entries(value)) {\n\t\tconst redacted = redactUrlCredentialsIn(item, depth + 1);\n\t\tif (redacted !== item) {\n\t\t\tnext ??= { ...(value as Record<string, unknown>) };\n\t\t\tnext[key] = redacted;\n\t\t}\n\t}\n\treturn (next ?? value) as T;\n}\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAa,uBAAiC;CAE7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;AACD;;;;;;AAOA,MAAM,kBAAkB;;;;;;;;;AAUxB,SAAgB,qBAAqB,MAAsB;CAC1D,OAAO,KAAK,QAAQ,iBAAiB,aAAa;AACnD;;AAGA,MAAM,YAAY;;;;;AAMlB,SAAgB,uBAA0B,OAAU,QAAQ,GAAM;CACjE,IAAI,OAAO,UAAU,UACpB,OAAO,qBAAqB,KAAK;CAElC,IAAI,SAAS,aAAa,UAAU,QAAQ,OAAO,UAAU,UAC5D,OAAO;CAER,IAAI,MAAM,QAAQ,KAAK,GAAG;EACzB,IAAI,UAAU;EACd,MAAM,OAAO,MAAM,KAAK,SAAS;GAChC,MAAM,WAAW,uBAAuB,MAAM,QAAQ,CAAC;GACvD,IAAI,aAAa,MAAM,UAAU;GACjC,OAAO;EACR,CAAC;EACD,OAAQ,UAAU,OAAO;CAC1B;CACA,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,UAAU,OAAO,aAAa,UAAU,MAAM,OAAO;CAEzD,IAAI;CACJ,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,KAAK,GAAG;EAChD,MAAM,WAAW,uBAAuB,MAAM,QAAQ,CAAC;EACvD,IAAI,aAAa,MAAM;GACtB,SAAS,EAAE,GAAI,MAAkC;GACjD,KAAK,OAAO;EACb;CACD;CACA,OAAQ,QAAQ;AACjB"}
|
package/dist/types.cjs
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/types.ts
|
|
3
|
+
/**
|
|
4
|
+
* Console-based logger implementation that outputs to standard console methods.
|
|
5
|
+
* Supports structured logging with automatic timestamp injection and context inheritance.
|
|
6
|
+
*
|
|
7
|
+
* @implements {Logger}
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const logger = new ConsoleLogger({ app: 'myApp', version: '1.0.0' });
|
|
12
|
+
* logger.info({ userId: 123 }, 'User action performed');
|
|
13
|
+
* // Output: { app: 'myApp', version: '1.0.0', userId: 123, ts: 1234567890 } User action performed
|
|
14
|
+
*
|
|
15
|
+
* const childLogger = logger.child({ module: 'auth' });
|
|
16
|
+
* childLogger.debug({ action: 'validate' }, 'Validating token');
|
|
17
|
+
* // Output: { app: 'myApp', version: '1.0.0', module: 'auth', action: 'validate', ts: 1234567891 } Validating token
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
let LogLevel = /* @__PURE__ */ function(LogLevel) {
|
|
21
|
+
LogLevel["Trace"] = "trace";
|
|
22
|
+
LogLevel["Debug"] = "debug";
|
|
23
|
+
LogLevel["Info"] = "info";
|
|
24
|
+
LogLevel["Warn"] = "warn";
|
|
25
|
+
LogLevel["Error"] = "error";
|
|
26
|
+
LogLevel["Fatal"] = "fatal";
|
|
27
|
+
LogLevel["Silent"] = "silent";
|
|
28
|
+
return LogLevel;
|
|
29
|
+
}({});
|
|
30
|
+
//#endregion
|
|
31
|
+
exports.LogLevel = LogLevel;
|
|
2
32
|
|
|
3
|
-
|
|
33
|
+
//# sourceMappingURL=types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.cjs","names":[],"sources":["../src/types.ts"],"sourcesContent":["/**\n * Logging function type that supports both structured and simple logging.\n * Can be called with an object for structured logging or just a message string.\n *\n * @example\n * ```typescript\n * // Structured logging with context object\n * logger.info({ userId: 123, action: 'login' }, 'User logged in');\n *\n * // Simple string logging\n * logger.info('Application started');\n * ```\n */\nexport type LogFn = {\n\t/** Structured logging with context object, optional message, and additional arguments */\n\t<T extends object>(obj: T, msg?: string, ...args: any[]): void;\n\t/** Simple string logging */\n\t(msg: string): void;\n};\n\n/**\n * Standard logger interface with multiple log levels and child logger support.\n * Follows common logging patterns with structured logging capabilities.\n *\n * @interface Logger\n */\nexport interface Logger {\n\t/** Debug level logging - verbose information for debugging */\n\tdebug: LogFn;\n\t/** Info level logging - general informational messages */\n\tinfo: LogFn;\n\t/** Warning level logging - potentially harmful situations */\n\twarn: LogFn;\n\t/** Error level logging - error events that might still allow the application to continue */\n\terror: LogFn;\n\t/** Fatal level logging - severe errors that will likely cause the application to abort */\n\tfatal: LogFn;\n\t/** Trace level logging - most detailed information */\n\ttrace: LogFn;\n\t/**\n\t * Creates a child logger with additional context.\n\t * Child loggers inherit parent context and add their own.\n\t *\n\t * @param obj - Additional context to include in all child logger calls\n\t * @returns A new Logger instance with merged context\n\t */\n\tchild: (obj: object) => Logger;\n}\n\n/**\n * Console-based logger implementation that outputs to standard console methods.\n * Supports structured logging with automatic timestamp injection and context inheritance.\n *\n * @implements {Logger}\n *\n * @example\n * ```typescript\n * const logger = new ConsoleLogger({ app: 'myApp', version: '1.0.0' });\n * logger.info({ userId: 123 }, 'User action performed');\n * // Output: { app: 'myApp', version: '1.0.0', userId: 123, ts: 1234567890 } User action performed\n *\n * const childLogger = logger.child({ module: 'auth' });\n * childLogger.debug({ action: 'validate' }, 'Validating token');\n * // Output: { app: 'myApp', version: '1.0.0', module: 'auth', action: 'validate', ts: 1234567891 } Validating token\n * ```\n */\nexport enum LogLevel {\n\tTrace = 'trace',\n\tDebug = 'debug',\n\tInfo = 'info',\n\tWarn = 'warn',\n\tError = 'error',\n\tFatal = 'fatal',\n\tSilent = 'silent',\n}\n\n/**\n * Redaction configuration for masking sensitive data in logs.\n * Uses pino's fast-redact library under the hood.\n *\n * By default, custom paths are merged with the default sensitive paths.\n * Use `resolution: 'override'` to use only your custom paths.\n *\n * @example\n * ```typescript\n * // Simple path array (merges with defaults)\n * redact: ['user.ssn', 'custom.field']\n *\n * // Override defaults completely\n * redact: {\n * paths: ['only.these.paths'],\n * resolution: 'override',\n * }\n *\n * // With custom censor\n * redact: {\n * paths: ['extra.secret'],\n * censor: '***',\n * }\n *\n * // Remove fields entirely\n * redact: {\n * paths: ['temporary.data'],\n * remove: true,\n * }\n * ```\n */\nexport type RedactOptions =\n\t| string[]\n\t| {\n\t\t\t/** Paths to redact using dot notation or bracket notation for special chars */\n\t\t\tpaths: string[];\n\t\t\t/** Custom replacement text (default: '[REDACTED]') */\n\t\t\tcensor?: string | ((value: unknown, path: string[]) => unknown);\n\t\t\t/** Remove the field entirely instead of replacing (default: false) */\n\t\t\tremove?: boolean;\n\t\t\t/**\n\t\t\t * How to combine custom paths with default sensitive paths.\n\t\t\t * - 'merge': Custom paths are added to default paths (default)\n\t\t\t * - 'override': Only custom paths are used, defaults are ignored\n\t\t\t */\n\t\t\tresolution?: 'merge' | 'override';\n\t };\n\nexport type CreateLoggerOptions = {\n\t/** Enable pretty printing with colors (disabled in production) */\n\tpretty?: boolean;\n\t/** Minimum log level to output */\n\tlevel?: LogLevel;\n\t/**\n\t * Redaction configuration for masking sensitive data.\n\t *\n\t * - `true` or `undefined` (the default): Uses default sensitive paths\n\t * (password, token, secret, etc.)\n\t * - `false`: No redaction applied — the explicit opt-out\n\t * - `string[]`: Custom paths merged with defaults\n\t * - `object`: Advanced config with paths, censor, remove, and resolution options\n\t *\n\t * By default, custom paths are **merged** with the default sensitive paths.\n\t * Use `resolution: 'override'` to disable defaults and use only your paths.\n\t *\n\t * @example\n\t * ```typescript\n\t * // Use defaults only (the same as leaving `redact` out)\n\t * createLogger({ redact: true });\n\t *\n\t * // Opt out\n\t * createLogger({ redact: false });\n\t *\n\t * // Add custom paths (merged with defaults)\n\t * createLogger({ redact: ['user.ssn', 'custom.field'] });\n\t *\n\t * // Override defaults completely\n\t * createLogger({\n\t * redact: {\n\t * paths: ['only.these.paths'],\n\t * resolution: 'override',\n\t * }\n\t * });\n\t *\n\t * // Merge with custom censor\n\t * createLogger({\n\t * redact: {\n\t * paths: ['extra.secret'],\n\t * censor: '***',\n\t * }\n\t * });\n\t * ```\n\t */\n\tredact?: boolean | RedactOptions;\n\t/**\n\t * Where log lines are written (pino logger only). Defaults to stdout.\n\t * Ignored when `pretty` is on, since the pretty transport owns its output.\n\t */\n\tdestination?: { write(line: string): unknown };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAkEA,IAAY,WAAL,yBAAA,UAAA;CACN,SAAA,WAAA;CACA,SAAA,WAAA;CACA,SAAA,UAAA;CACA,SAAA,UAAA;CACA,SAAA,WAAA;CACA,SAAA,WAAA;CACA,SAAA,YAAA;;AACD,EAAA,CAAA,CAAA"}
|
package/dist/types.d.cts
CHANGED
|
@@ -1,2 +1,175 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
//#region src/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Logging function type that supports both structured and simple logging.
|
|
4
|
+
* Can be called with an object for structured logging or just a message string.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Structured logging with context object
|
|
9
|
+
* logger.info({ userId: 123, action: 'login' }, 'User logged in');
|
|
10
|
+
*
|
|
11
|
+
* // Simple string logging
|
|
12
|
+
* logger.info('Application started');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export type LogFn = {
|
|
16
|
+
/** Structured logging with context object, optional message, and additional arguments */
|
|
17
|
+
<T extends object>(obj: T, msg?: string, ...args: any[]): void;
|
|
18
|
+
/** Simple string logging */
|
|
19
|
+
(msg: string): void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Standard logger interface with multiple log levels and child logger support.
|
|
23
|
+
* Follows common logging patterns with structured logging capabilities.
|
|
24
|
+
*
|
|
25
|
+
* @interface Logger
|
|
26
|
+
*/
|
|
27
|
+
export interface Logger {
|
|
28
|
+
/** Debug level logging - verbose information for debugging */
|
|
29
|
+
debug: LogFn;
|
|
30
|
+
/** Info level logging - general informational messages */
|
|
31
|
+
info: LogFn;
|
|
32
|
+
/** Warning level logging - potentially harmful situations */
|
|
33
|
+
warn: LogFn;
|
|
34
|
+
/** Error level logging - error events that might still allow the application to continue */
|
|
35
|
+
error: LogFn;
|
|
36
|
+
/** Fatal level logging - severe errors that will likely cause the application to abort */
|
|
37
|
+
fatal: LogFn;
|
|
38
|
+
/** Trace level logging - most detailed information */
|
|
39
|
+
trace: LogFn;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a child logger with additional context.
|
|
42
|
+
* Child loggers inherit parent context and add their own.
|
|
43
|
+
*
|
|
44
|
+
* @param obj - Additional context to include in all child logger calls
|
|
45
|
+
* @returns A new Logger instance with merged context
|
|
46
|
+
*/
|
|
47
|
+
child: (obj: object) => Logger;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Console-based logger implementation that outputs to standard console methods.
|
|
51
|
+
* Supports structured logging with automatic timestamp injection and context inheritance.
|
|
52
|
+
*
|
|
53
|
+
* @implements {Logger}
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const logger = new ConsoleLogger({ app: 'myApp', version: '1.0.0' });
|
|
58
|
+
* logger.info({ userId: 123 }, 'User action performed');
|
|
59
|
+
* // Output: { app: 'myApp', version: '1.0.0', userId: 123, ts: 1234567890 } User action performed
|
|
60
|
+
*
|
|
61
|
+
* const childLogger = logger.child({ module: 'auth' });
|
|
62
|
+
* childLogger.debug({ action: 'validate' }, 'Validating token');
|
|
63
|
+
* // Output: { app: 'myApp', version: '1.0.0', module: 'auth', action: 'validate', ts: 1234567891 } Validating token
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare enum LogLevel {
|
|
67
|
+
Trace = "trace",
|
|
68
|
+
Debug = "debug",
|
|
69
|
+
Info = "info",
|
|
70
|
+
Warn = "warn",
|
|
71
|
+
Error = "error",
|
|
72
|
+
Fatal = "fatal",
|
|
73
|
+
Silent = "silent"
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Redaction configuration for masking sensitive data in logs.
|
|
77
|
+
* Uses pino's fast-redact library under the hood.
|
|
78
|
+
*
|
|
79
|
+
* By default, custom paths are merged with the default sensitive paths.
|
|
80
|
+
* Use `resolution: 'override'` to use only your custom paths.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* // Simple path array (merges with defaults)
|
|
85
|
+
* redact: ['user.ssn', 'custom.field']
|
|
86
|
+
*
|
|
87
|
+
* // Override defaults completely
|
|
88
|
+
* redact: {
|
|
89
|
+
* paths: ['only.these.paths'],
|
|
90
|
+
* resolution: 'override',
|
|
91
|
+
* }
|
|
92
|
+
*
|
|
93
|
+
* // With custom censor
|
|
94
|
+
* redact: {
|
|
95
|
+
* paths: ['extra.secret'],
|
|
96
|
+
* censor: '***',
|
|
97
|
+
* }
|
|
98
|
+
*
|
|
99
|
+
* // Remove fields entirely
|
|
100
|
+
* redact: {
|
|
101
|
+
* paths: ['temporary.data'],
|
|
102
|
+
* remove: true,
|
|
103
|
+
* }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export type RedactOptions = string[] | {
|
|
107
|
+
/** Paths to redact using dot notation or bracket notation for special chars */
|
|
108
|
+
paths: string[];
|
|
109
|
+
/** Custom replacement text (default: '[REDACTED]') */
|
|
110
|
+
censor?: string | ((value: unknown, path: string[]) => unknown);
|
|
111
|
+
/** Remove the field entirely instead of replacing (default: false) */
|
|
112
|
+
remove?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* How to combine custom paths with default sensitive paths.
|
|
115
|
+
* - 'merge': Custom paths are added to default paths (default)
|
|
116
|
+
* - 'override': Only custom paths are used, defaults are ignored
|
|
117
|
+
*/
|
|
118
|
+
resolution?: 'merge' | 'override';
|
|
119
|
+
};
|
|
120
|
+
export type CreateLoggerOptions = {
|
|
121
|
+
/** Enable pretty printing with colors (disabled in production) */
|
|
122
|
+
pretty?: boolean;
|
|
123
|
+
/** Minimum log level to output */
|
|
124
|
+
level?: LogLevel;
|
|
125
|
+
/**
|
|
126
|
+
* Redaction configuration for masking sensitive data.
|
|
127
|
+
*
|
|
128
|
+
* - `true` or `undefined` (the default): Uses default sensitive paths
|
|
129
|
+
* (password, token, secret, etc.)
|
|
130
|
+
* - `false`: No redaction applied — the explicit opt-out
|
|
131
|
+
* - `string[]`: Custom paths merged with defaults
|
|
132
|
+
* - `object`: Advanced config with paths, censor, remove, and resolution options
|
|
133
|
+
*
|
|
134
|
+
* By default, custom paths are **merged** with the default sensitive paths.
|
|
135
|
+
* Use `resolution: 'override'` to disable defaults and use only your paths.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* // Use defaults only (the same as leaving `redact` out)
|
|
140
|
+
* createLogger({ redact: true });
|
|
141
|
+
*
|
|
142
|
+
* // Opt out
|
|
143
|
+
* createLogger({ redact: false });
|
|
144
|
+
*
|
|
145
|
+
* // Add custom paths (merged with defaults)
|
|
146
|
+
* createLogger({ redact: ['user.ssn', 'custom.field'] });
|
|
147
|
+
*
|
|
148
|
+
* // Override defaults completely
|
|
149
|
+
* createLogger({
|
|
150
|
+
* redact: {
|
|
151
|
+
* paths: ['only.these.paths'],
|
|
152
|
+
* resolution: 'override',
|
|
153
|
+
* }
|
|
154
|
+
* });
|
|
155
|
+
*
|
|
156
|
+
* // Merge with custom censor
|
|
157
|
+
* createLogger({
|
|
158
|
+
* redact: {
|
|
159
|
+
* paths: ['extra.secret'],
|
|
160
|
+
* censor: '***',
|
|
161
|
+
* }
|
|
162
|
+
* });
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
redact?: boolean | RedactOptions;
|
|
166
|
+
/**
|
|
167
|
+
* Where log lines are written (pino logger only). Defaults to stdout.
|
|
168
|
+
* Ignored when `pretty` is on, since the pretty transport owns its output.
|
|
169
|
+
*/
|
|
170
|
+
destination?: {
|
|
171
|
+
write(line: string): unknown;
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
//#endregion
|
|
175
|
+
//# sourceMappingURL=types.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../src/types.ts"],"mappings":";;;;;;;;;;;;;;YAaY;;GAEV,kBAAkB,KAAK,GAAG,iBAAiB;;GAE3C;;;;;;;;iBASe;;EAEhB,OAAO;;EAEP,MAAM;;EAEN,MAAM;;EAEN,OAAO;;EAEP,OAAO;;EAEP,OAAO;;;;;;;;EAQP,QAAQ,gBAAgB;;;;;;;;;;;;;;;;;;;oBAoBb;EACX;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAkCW;;EAIT;;EAEA,oBAAoB,gBAAgB;;EAEpC;;;;;;EAMA;;YAGS;;EAEX;;EAEA,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCR,mBAAmB;;;;;EAKnB;IAAgB,MAAM"}
|