@lilaquadrat/studio 10.0.0-beta.7 → 10.0.0-beta.9

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/lib/src/logger.js CHANGED
@@ -1,40 +1,124 @@
1
1
  import { createLogger, format, transports } from 'winston';
2
2
  import prettyjson from 'prettyjson';
3
- const { printf, } = format;
4
- let useFormat;
5
- const mainFormat = printf((info) => {
6
- let base = '';
7
- if (!info.stack) {
8
- base = `[${info.timestamp}][${info.level}] ${info.message}`;
9
- if (info.data)
10
- base = `${base}\n\n${prettyjson.render(info.data)}\n`;
3
+ const LOG_FORMAT = process.env.LOG_FORMAT ?? 'json';
4
+ const LOG_LEVEL = process.env.LOG_LEVEL ??
5
+ (process.env.NODE_ENV === 'production' ? 'info' : 'debug');
6
+ const REDACT_KEYS = new Set([
7
+ 'password',
8
+ 'passwd',
9
+ 'secret',
10
+ 'token',
11
+ 'access_token',
12
+ 'refresh_token',
13
+ 'api_key',
14
+ 'apikey',
15
+ 'authorization',
16
+ 'cookie',
17
+ 'set-cookie',
18
+ ]);
19
+ function redactDeep(value) {
20
+ if (!value || typeof value !== 'object')
21
+ return value;
22
+ if (Array.isArray(value))
23
+ return value.map(redactDeep);
24
+ const obj = value;
25
+ const out = {};
26
+ for (const [k, v] of Object.entries(obj)) {
27
+ if (REDACT_KEYS.has(k.toLowerCase()))
28
+ out[k] = '[REDACTED]';
29
+ else
30
+ out[k] = redactDeep(v);
11
31
  }
12
- if (info.stack) {
13
- base = `[${info.timestamp}][ERROR][STACK]`;
14
- base = `${base}\n${info.stack}\n`;
32
+ return out;
33
+ }
34
+ function toPlainObject(value) {
35
+ if (!value || typeof value !== 'object')
36
+ return undefined;
37
+ if (Array.isArray(value))
38
+ return { items: value };
39
+ return value;
40
+ }
41
+ function safePretty(value) {
42
+ try {
43
+ return prettyjson.render(value);
44
+ }
45
+ catch {
46
+ // fallback for circular/unsupported structures
47
+ try {
48
+ return JSON.stringify(value);
49
+ }
50
+ catch {
51
+ return String(value);
52
+ }
15
53
  }
16
- return base;
17
- });
18
- if (process.env.LOG_FORMAT === 'console') {
19
- useFormat = format.combine(format((info) => {
20
- info.level = info.level.toUpperCase();
21
- return info;
22
- })(), format.timestamp({
23
- format: 'HH:mm:ss',
24
- }),
25
- // format.colorize({ all: true, colors: { info: 'white', debug: 'magenta' } }),
26
- format.simple(), format.splat(), format.errors({ stack: true }), mainFormat);
27
54
  }
28
- else {
29
- useFormat = format.combine(format.errors({ stack: true }), format.json());
55
+ const COLORIZE = process.env.LOG_COLORIZE
56
+ ? !['0', 'false', 'no', 'off'].includes(process.env.LOG_COLORIZE.toLowerCase())
57
+ : process.env.NODE_ENV !== 'production' && Boolean(process.stdout.isTTY);
58
+ const uppercaseLevel = format((info) => {
59
+ if (typeof info.level === 'string')
60
+ info.level = info.level.toUpperCase();
61
+ return info;
62
+ });
63
+ const maybeColorize = COLORIZE
64
+ ? format.colorize({ level: true, message: false })
65
+ : format((info) => info)();
66
+ const normalize = format((info) => {
67
+ // Keep winston core fields, move everything else into `meta`
68
+ // NOTE: exclude `service` so defaultMeta doesn't end up printed as meta every time
69
+ const { level, message, timestamp, stack, service, ...rest } = info;
70
+ // If message itself is an Error, normalize it
71
+ if (message instanceof Error) {
72
+ info.message = message.message;
73
+ info.stack = info.stack ?? message.stack;
74
+ }
75
+ const meta = toPlainObject(rest);
76
+ if (meta && Object.keys(meta).length > 0) {
77
+ info.meta = redactDeep(meta);
78
+ }
79
+ if (info.data) {
80
+ info.data = redactDeep(info.data);
81
+ }
82
+ // Ensure message is a string for printf/json loggers
83
+ if (typeof info.message !== 'string') {
84
+ try {
85
+ info.message = JSON.stringify(info.message);
86
+ }
87
+ catch {
88
+ info.message = String(info.message);
89
+ }
90
+ }
91
+ return info;
92
+ });
93
+ const consoleFormat = format.combine(format.timestamp({ format: 'HH:mm:ss' }), format.errors({ stack: true }), format.splat(), normalize(), uppercaseLevel(), maybeColorize, format.printf((info) => {
94
+ const lvl = String(info.level); // already uppercased above (and maybe colorized)
95
+ const header = `[${info.timestamp}][${lvl}] ${info.message}`;
96
+ const blocks = [];
97
+ if (info.data)
98
+ blocks.push(safePretty(info.data));
99
+ if (info.meta)
100
+ blocks.push(safePretty(info.meta));
101
+ if (info.stack)
102
+ blocks.push(String(info.stack));
103
+ return blocks.length ? `${header}\n\n${blocks.join('\n\n')}\n` : header;
104
+ }));
105
+ const jsonFormat = format.combine(format.timestamp(), format.errors({ stack: true }), format.splat(), normalize(), format.json());
106
+ function createConsoleTransport() {
107
+ return new transports.Console({
108
+ stderrLevels: ['error'],
109
+ handleExceptions: true,
110
+ });
30
111
  }
112
+ const consoleTransport = createConsoleTransport();
31
113
  const logger = createLogger({
32
- level: process.env.LOG_LEVEL ?? 'debug',
33
- format: useFormat,
34
- transports: [
35
- new transports.Console(),
36
- ],
37
- defaultMeta: { service: 'studio' },
114
+ level: LOG_LEVEL,
115
+ format: LOG_FORMAT === 'console' ? consoleFormat : jsonFormat,
116
+ defaultMeta: { service: process.env.SERVICE_NAME ?? 'studio' },
117
+ transports: [consoleTransport],
118
+ exceptionHandlers: [createConsoleTransport()],
119
+ rejectionHandlers: [createConsoleTransport()],
120
+ exitOnError: false,
121
+ silent: process.env.NODE_ENV === 'test',
38
122
  });
39
123
  export default logger;
40
124
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,MAAM,EACJ,MAAM,GACP,GAAG,MAAM,CAAC;AAEX,IAAI,SAAS,CAAC;AAEd,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IAEjC,IAAI,IAAI,GAAW,EAAE,CAAC;IAEtB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5D,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,GAAG,IAAI,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAEvE,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAEf,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,iBAAiB,CAAC;QAE3C,IAAI,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;IAEpC,CAAC;IAED,OAAO,IAAI,CAAC;AAEd,CAAC,CAAC,CAAC;AAEH,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;IAEzC,SAAS,GAAG,MAAM,CAAC,OAAO,CACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAEd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IAEd,CAAC,CAAC,EAAE,EACJ,MAAM,CAAC,SAAS,CAAC;QACf,MAAM,EAAE,UAAU;KACnB,CAAC;IACF,+EAA+E;IAC/E,MAAM,CAAC,MAAM,EAAE,EACf,MAAM,CAAC,KAAK,EAAE,EACd,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC9B,UAAU,CACX,CAAC;AAEJ,CAAC;KAAM,CAAC;IAEN,SAAS,GAAG,MAAM,CAAC,OAAO,CACxB,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC9B,MAAM,CAAC,IAAI,EAAE,CACd,CAAC;AAEJ,CAAC;AAED,MAAM,MAAM,GAAG,YAAY,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO;IACvC,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE;QACV,IAAI,UAAU,CAAC,OAAO,EAAE;KACzB;IACD,WAAW,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lilaquadrat/studio",
3
- "version": "10.0.0-beta.7",
3
+ "version": "10.0.0-beta.9",
4
4
  "description": "classes and tools for STUDIO",
5
5
  "type": "module",
6
6
  "license": "MIT",