@lichens-innovation/ts-common 1.15.5 → 1.16.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.
package/dist/logger.cjs CHANGED
@@ -1,9 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var fs = require('fs');
4
+ var path = require('path');
3
5
  var pino = require('pino');
4
6
 
5
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
8
 
9
+ var path__default = /*#__PURE__*/_interopDefault(path);
7
10
  var pino__default = /*#__PURE__*/_interopDefault(pino);
8
11
 
9
12
  // src/logger/logger.utils.ts
@@ -87,39 +90,77 @@ var browserOptions = {
87
90
  }
88
91
  }
89
92
  };
93
+ var createPrettyTransport = () => {
94
+ try {
95
+ return pino__default.default.transport({ target: "pino-pretty", options: { colorize: true } });
96
+ } catch (e) {
97
+ console.warn("pino-pretty not installed, using default pino output", e);
98
+ return pino__default.default.destination(1);
99
+ }
100
+ };
101
+ var createNodePinoLogger = () => pino__default.default(baseOptions, createPrettyTransport());
90
102
  var createPinoLogger = () => {
91
103
  if (isRuntimeEnvNodeJs()) {
92
- try {
93
- const transport = pino__default.default.transport({ target: "pino-pretty", options: { colorize: true } });
94
- return pino__default.default(baseOptions, transport);
95
- } catch (e) {
96
- console.warn("pino-pretty not installed, using default pino output", e);
97
- return pino__default.default(baseOptions);
98
- }
104
+ return createNodePinoLogger();
99
105
  }
100
106
  return pino__default.default(browserOptions);
101
107
  };
102
- var pinoLogger = createPinoLogger();
103
- var setLoggerMinimumLevel = (level) => {
104
- pinoLogger.level = level;
108
+ var createFileDestination = (logFile) => {
109
+ fs.mkdirSync(path__default.default.dirname(logFile), { recursive: true });
110
+ return pino__default.default.destination({ dest: logFile, append: true, mkdir: true });
105
111
  };
106
- var consoleMethodToPinoMethod = (level) => (message, payload) => {
107
- if (isNullish(payload)) {
108
- pinoLogger[level](message);
109
- } else {
110
- pinoLogger[level](payload, message);
112
+ var createNodePinoWithOptions = ({ logFile, console: useConsole = true }) => {
113
+ const streams = [];
114
+ if (!isNullish(logFile)) {
115
+ streams.push({ stream: createFileDestination(logFile) });
116
+ }
117
+ if (useConsole) {
118
+ streams.push({ stream: createPrettyTransport() });
119
+ }
120
+ if (streams.length === 0) {
121
+ return pino__default.default(baseOptions);
122
+ }
123
+ if (streams.length === 1) {
124
+ return pino__default.default(baseOptions, streams[0].stream);
111
125
  }
126
+ return pino__default.default(baseOptions, pino__default.default.multistream(streams));
112
127
  };
113
- var logger = {
114
- trace: consoleMethodToPinoMethod("trace"),
115
- debug: consoleMethodToPinoMethod("debug"),
116
- info: consoleMethodToPinoMethod("info"),
117
- warn: consoleMethodToPinoMethod("warn"),
118
- error: consoleMethodToPinoMethod("error"),
119
- fatal: consoleMethodToPinoMethod("fatal"),
120
- log: consoleMethodToPinoMethod("info")
128
+ var buildLoggerApi = (pinoInstance) => {
129
+ const consoleMethodToPinoMethod = (level) => (message, payload) => {
130
+ if (isNullish(payload)) {
131
+ pinoInstance[level](message);
132
+ } else {
133
+ pinoInstance[level](payload, message);
134
+ }
135
+ };
136
+ return {
137
+ trace: consoleMethodToPinoMethod("trace"),
138
+ debug: consoleMethodToPinoMethod("debug"),
139
+ info: consoleMethodToPinoMethod("info"),
140
+ warn: consoleMethodToPinoMethod("warn"),
141
+ error: consoleMethodToPinoMethod("error"),
142
+ fatal: consoleMethodToPinoMethod("fatal"),
143
+ log: consoleMethodToPinoMethod("info")
144
+ };
145
+ };
146
+ var createLogger = (options) => {
147
+ if (!isRuntimeEnvNodeJs()) {
148
+ return buildLoggerApi(pino__default.default(browserOptions));
149
+ }
150
+ const hasFile = !isNullish(options?.logFile);
151
+ const useConsole = options?.console ?? true;
152
+ if (!hasFile && useConsole) {
153
+ return buildLoggerApi(createNodePinoLogger());
154
+ }
155
+ return buildLoggerApi(createNodePinoWithOptions({ logFile: options?.logFile, console: useConsole }));
156
+ };
157
+ var pinoLogger = createPinoLogger();
158
+ var setLoggerMinimumLevel = (level) => {
159
+ pinoLogger.level = level;
121
160
  };
161
+ var logger = buildLoggerApi(pinoLogger);
122
162
 
163
+ exports.createLogger = createLogger;
123
164
  exports.logger = logger;
124
165
  exports.setLoggerMinimumLevel = setLoggerMinimumLevel;
125
166
  //# sourceMappingURL=logger.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/runtime-env.utils.ts","../src/logger/logger.utils.ts"],"names":["pino"],"mappings":"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","file":"logger.cjs","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","import pino from \"pino\";\nimport { isRuntimeEnvNodeJs } from \"../utils/runtime-env.utils\";\nimport { isNullish } from \"../utils/types.utils\";\n\nconst LEVEL_LABELS: Record<number, string> = {\n 10: \"trace\",\n 20: \"debug\",\n 30: \"info\",\n 40: \"warn\",\n 50: \"error\",\n 60: \"fatal\",\n};\n\nconst LEVEL_COLORS: Record<string, string> = {\n trace: \"color: #94a3b8\",\n debug: \"color: #22d3ee\",\n info: \"color: #4ade80\",\n warn: \"color: #fbbf24\",\n error: \"color: #f87171\",\n fatal: \"color: #dc2626; font-weight: bold\",\n};\n\nconst MESSAGE_KEY = \"msg\";\n\ntype LogObject = Record<string, unknown> & { level?: number; time?: string; [MESSAGE_KEY]?: string };\n\nconst getLevelLabel = (levelNum: number): string => LEVEL_LABELS[levelNum] ?? \"info\";\n\nconst getLevelColor = (label: string): string => LEVEL_COLORS[label] ?? LEVEL_COLORS.info;\n\nconst getLogTimestamp = ({ time }: LogObject): string => (typeof time === \"string\" ? time : new Date().toISOString());\n\ntype ConsoleMethod = \"log\" | \"warn\" | \"error\";\nconst getConsoleMethod = (levelNum: number): ConsoleMethod => {\n if (levelNum >= 50) return \"error\";\n if (levelNum >= 40) return \"warn\";\n return \"log\";\n};\n\nconst getRestPayload = (obj: LogObject): Record<string, unknown> =>\n Object.keys(obj)\n .filter((k) => k !== \"level\" && k !== \"time\" && k !== MESSAGE_KEY)\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = obj[k];\n return acc;\n }, {});\n\ntype BuildMainArgsParams = {\n timestamp: string;\n label: string;\n color: string;\n msg: unknown;\n extraArgs: unknown[];\n rest: Record<string, unknown>;\n};\n\nconst buildMainArgs = ({ timestamp, label, color, msg, extraArgs, rest }: BuildMainArgsParams): unknown[] => {\n const prefix = `[${timestamp}]`;\n const levelPart = ` ${label.toUpperCase()} `;\n const hasRest = Object.keys(rest).length > 0;\n const mainArgs: unknown[] = [`${prefix}%c${levelPart}%c`, color, \"color: inherit\"];\n\n if (!isNullish(msg)) mainArgs.push(msg);\n if (extraArgs.length > 0) mainArgs.push(...extraArgs);\n if (hasRest) mainArgs.push(rest);\n\n return mainArgs;\n};\n\nconst baseOptions: pino.LoggerOptions = {\n timestamp: pino.stdTimeFunctions.isoTime,\n messageKey: MESSAGE_KEY,\n};\n\nconst browserOptions: pino.LoggerOptions = {\n ...baseOptions,\n browser: {\n write: (logObj: object, ...args: unknown[]) => {\n const obj = logObj as LogObject;\n const levelNum = obj.level ?? 30;\n const label = getLevelLabel(levelNum);\n const color = getLevelColor(label);\n const timestamp = getLogTimestamp(obj);\n const msg = obj[MESSAGE_KEY];\n const rest = getRestPayload(obj);\n const consoleMethod = getConsoleMethod(levelNum);\n const mainArgs = buildMainArgs({\n timestamp,\n label,\n color,\n msg,\n extraArgs: args,\n rest,\n });\n (console[consoleMethod] as (...a: unknown[]) => void)(...mainArgs);\n },\n },\n};\n\nconst createPinoLogger = (): pino.Logger => {\n if (isRuntimeEnvNodeJs()) {\n try {\n const transport = pino.transport({ target: \"pino-pretty\", options: { colorize: true } });\n return pino(baseOptions, transport);\n } catch (e: unknown) {\n console.warn(\"pino-pretty not installed, using default pino output\", e);\n return pino(baseOptions);\n }\n }\n\n return pino(browserOptions);\n};\n\nconst pinoLogger = createPinoLogger();\n\nexport type Level = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nexport const setLoggerMinimumLevel = (level: Level) => {\n pinoLogger.level = level;\n};\n\nconst consoleMethodToPinoMethod = (level: Level) => (message: string, payload?: Record<string, unknown>) => {\n if (isNullish(payload)) {\n pinoLogger[level](message);\n } else {\n pinoLogger[level](payload, message);\n }\n};\n\nexport const logger = {\n trace: consoleMethodToPinoMethod(\"trace\"),\n debug: consoleMethodToPinoMethod(\"debug\"),\n info: consoleMethodToPinoMethod(\"info\"),\n warn: consoleMethodToPinoMethod(\"warn\"),\n error: consoleMethodToPinoMethod(\"error\"),\n fatal: consoleMethodToPinoMethod(\"fatal\"),\n log: consoleMethodToPinoMethod(\"info\"),\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/runtime-env.utils.ts","../src/logger/logger.utils.ts"],"names":["pino","mkdirSync","path"],"mappings":"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","file":"logger.cjs","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","import { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pino from \"pino\";\nimport { isRuntimeEnvNodeJs } from \"../utils/runtime-env.utils\";\nimport { isNullish } from \"../utils/types.utils\";\n\nconst LEVEL_LABELS: Record<number, string> = {\n 10: \"trace\",\n 20: \"debug\",\n 30: \"info\",\n 40: \"warn\",\n 50: \"error\",\n 60: \"fatal\",\n};\n\nconst LEVEL_COLORS: Record<string, string> = {\n trace: \"color: #94a3b8\",\n debug: \"color: #22d3ee\",\n info: \"color: #4ade80\",\n warn: \"color: #fbbf24\",\n error: \"color: #f87171\",\n fatal: \"color: #dc2626; font-weight: bold\",\n};\n\nconst MESSAGE_KEY = \"msg\";\n\ntype LogObject = Record<string, unknown> & { level?: number; time?: string; [MESSAGE_KEY]?: string };\n\nconst getLevelLabel = (levelNum: number): string => LEVEL_LABELS[levelNum] ?? \"info\";\n\nconst getLevelColor = (label: string): string => LEVEL_COLORS[label] ?? LEVEL_COLORS.info;\n\nconst getLogTimestamp = ({ time }: LogObject): string => (typeof time === \"string\" ? time : new Date().toISOString());\n\ntype ConsoleMethod = \"log\" | \"warn\" | \"error\";\nconst getConsoleMethod = (levelNum: number): ConsoleMethod => {\n if (levelNum >= 50) return \"error\";\n if (levelNum >= 40) return \"warn\";\n return \"log\";\n};\n\nconst getRestPayload = (obj: LogObject): Record<string, unknown> =>\n Object.keys(obj)\n .filter((k) => k !== \"level\" && k !== \"time\" && k !== MESSAGE_KEY)\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = obj[k];\n return acc;\n }, {});\n\ntype BuildMainArgsParams = {\n timestamp: string;\n label: string;\n color: string;\n msg: unknown;\n extraArgs: unknown[];\n rest: Record<string, unknown>;\n};\n\nconst buildMainArgs = ({ timestamp, label, color, msg, extraArgs, rest }: BuildMainArgsParams): unknown[] => {\n const prefix = `[${timestamp}]`;\n const levelPart = ` ${label.toUpperCase()} `;\n const hasRest = Object.keys(rest).length > 0;\n const mainArgs: unknown[] = [`${prefix}%c${levelPart}%c`, color, \"color: inherit\"];\n\n if (!isNullish(msg)) mainArgs.push(msg);\n if (extraArgs.length > 0) mainArgs.push(...extraArgs);\n if (hasRest) mainArgs.push(rest);\n\n return mainArgs;\n};\n\nconst baseOptions: pino.LoggerOptions = {\n timestamp: pino.stdTimeFunctions.isoTime,\n messageKey: MESSAGE_KEY,\n};\n\nconst browserOptions: pino.LoggerOptions = {\n ...baseOptions,\n browser: {\n write: (logObj: object, ...args: unknown[]) => {\n const obj = logObj as LogObject;\n const levelNum = obj.level ?? 30;\n const label = getLevelLabel(levelNum);\n const color = getLevelColor(label);\n const timestamp = getLogTimestamp(obj);\n const msg = obj[MESSAGE_KEY];\n const rest = getRestPayload(obj);\n const consoleMethod = getConsoleMethod(levelNum);\n const mainArgs = buildMainArgs({\n timestamp,\n label,\n color,\n msg,\n extraArgs: args,\n rest,\n });\n (console[consoleMethod] as (...a: unknown[]) => void)(...mainArgs);\n },\n },\n};\n\nconst createPrettyTransport = (): pino.DestinationStream => {\n try {\n return pino.transport({ target: \"pino-pretty\", options: { colorize: true } });\n } catch (e: unknown) {\n console.warn(\"pino-pretty not installed, using default pino output\", e);\n return pino.destination(1);\n }\n};\n\nconst createNodePinoLogger = (): pino.Logger => pino(baseOptions, createPrettyTransport());\n\nconst createPinoLogger = (): pino.Logger => {\n if (isRuntimeEnvNodeJs()) {\n return createNodePinoLogger();\n }\n\n return pino(browserOptions);\n};\n\nexport type CreateLoggerOptions = {\n logFile?: string;\n console?: boolean;\n};\n\nconst createFileDestination = (logFile: string): pino.DestinationStream => {\n mkdirSync(path.dirname(logFile), { recursive: true });\n return pino.destination({ dest: logFile, append: true, mkdir: true });\n};\n\nconst createNodePinoWithOptions = ({ logFile, console: useConsole = true }: CreateLoggerOptions): pino.Logger => {\n const streams: pino.StreamEntry[] = [];\n\n if (!isNullish(logFile)) {\n streams.push({ stream: createFileDestination(logFile) });\n }\n\n if (useConsole) {\n streams.push({ stream: createPrettyTransport() });\n }\n\n if (streams.length === 0) {\n return pino(baseOptions);\n }\n\n if (streams.length === 1) {\n return pino(baseOptions, streams[0]!.stream);\n }\n\n return pino(baseOptions, pino.multistream(streams));\n};\n\nexport type Logger = {\n trace: (message: string, payload?: Record<string, unknown>) => void;\n debug: (message: string, payload?: Record<string, unknown>) => void;\n info: (message: string, payload?: Record<string, unknown>) => void;\n warn: (message: string, payload?: Record<string, unknown>) => void;\n error: (message: string, payload?: Record<string, unknown>) => void;\n fatal: (message: string, payload?: Record<string, unknown>) => void;\n log: (message: string, payload?: Record<string, unknown>) => void;\n};\n\nconst buildLoggerApi = (pinoInstance: pino.Logger): Logger => {\n const consoleMethodToPinoMethod =\n (level: Level) =>\n (message: string, payload?: Record<string, unknown>): void => {\n if (isNullish(payload)) {\n pinoInstance[level](message);\n } else {\n pinoInstance[level](payload, message);\n }\n };\n\n return {\n trace: consoleMethodToPinoMethod(\"trace\"),\n debug: consoleMethodToPinoMethod(\"debug\"),\n info: consoleMethodToPinoMethod(\"info\"),\n warn: consoleMethodToPinoMethod(\"warn\"),\n error: consoleMethodToPinoMethod(\"error\"),\n fatal: consoleMethodToPinoMethod(\"fatal\"),\n log: consoleMethodToPinoMethod(\"info\"),\n };\n};\n\nexport const createLogger = (options?: CreateLoggerOptions): Logger => {\n if (!isRuntimeEnvNodeJs()) {\n return buildLoggerApi(pino(browserOptions));\n }\n\n const hasFile = !isNullish(options?.logFile);\n const useConsole = options?.console ?? true;\n\n if (!hasFile && useConsole) {\n return buildLoggerApi(createNodePinoLogger());\n }\n\n return buildLoggerApi(createNodePinoWithOptions({ logFile: options?.logFile, console: useConsole }));\n};\n\nconst pinoLogger = createPinoLogger();\n\nexport type Level = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nexport const setLoggerMinimumLevel = (level: Level) => {\n pinoLogger.level = level;\n};\n\nexport const logger = buildLoggerApi(pinoLogger);\n"]}
package/dist/logger.d.cts CHANGED
@@ -1,6 +1,8 @@
1
- type Level = "trace" | "debug" | "info" | "warn" | "error" | "fatal";
2
- declare const setLoggerMinimumLevel: (level: Level) => void;
3
- declare const logger: {
1
+ type CreateLoggerOptions = {
2
+ logFile?: string;
3
+ console?: boolean;
4
+ };
5
+ type Logger = {
4
6
  trace: (message: string, payload?: Record<string, unknown>) => void;
5
7
  debug: (message: string, payload?: Record<string, unknown>) => void;
6
8
  info: (message: string, payload?: Record<string, unknown>) => void;
@@ -9,5 +11,9 @@ declare const logger: {
9
11
  fatal: (message: string, payload?: Record<string, unknown>) => void;
10
12
  log: (message: string, payload?: Record<string, unknown>) => void;
11
13
  };
14
+ declare const createLogger: (options?: CreateLoggerOptions) => Logger;
15
+ type Level = "trace" | "debug" | "info" | "warn" | "error" | "fatal";
16
+ declare const setLoggerMinimumLevel: (level: Level) => void;
17
+ declare const logger: Logger;
12
18
 
13
- export { type Level, logger, setLoggerMinimumLevel };
19
+ export { type CreateLoggerOptions, type Level, type Logger, createLogger, logger, setLoggerMinimumLevel };
package/dist/logger.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- type Level = "trace" | "debug" | "info" | "warn" | "error" | "fatal";
2
- declare const setLoggerMinimumLevel: (level: Level) => void;
3
- declare const logger: {
1
+ type CreateLoggerOptions = {
2
+ logFile?: string;
3
+ console?: boolean;
4
+ };
5
+ type Logger = {
4
6
  trace: (message: string, payload?: Record<string, unknown>) => void;
5
7
  debug: (message: string, payload?: Record<string, unknown>) => void;
6
8
  info: (message: string, payload?: Record<string, unknown>) => void;
@@ -9,5 +11,9 @@ declare const logger: {
9
11
  fatal: (message: string, payload?: Record<string, unknown>) => void;
10
12
  log: (message: string, payload?: Record<string, unknown>) => void;
11
13
  };
14
+ declare const createLogger: (options?: CreateLoggerOptions) => Logger;
15
+ type Level = "trace" | "debug" | "info" | "warn" | "error" | "fatal";
16
+ declare const setLoggerMinimumLevel: (level: Level) => void;
17
+ declare const logger: Logger;
12
18
 
13
- export { type Level, logger, setLoggerMinimumLevel };
19
+ export { type CreateLoggerOptions, type Level, type Logger, createLogger, logger, setLoggerMinimumLevel };
package/dist/logger.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { mkdirSync } from 'fs';
2
+ import path from 'path';
1
3
  import pino from 'pino';
2
4
 
3
5
  // src/logger/logger.utils.ts
@@ -81,39 +83,76 @@ var browserOptions = {
81
83
  }
82
84
  }
83
85
  };
86
+ var createPrettyTransport = () => {
87
+ try {
88
+ return pino.transport({ target: "pino-pretty", options: { colorize: true } });
89
+ } catch (e) {
90
+ console.warn("pino-pretty not installed, using default pino output", e);
91
+ return pino.destination(1);
92
+ }
93
+ };
94
+ var createNodePinoLogger = () => pino(baseOptions, createPrettyTransport());
84
95
  var createPinoLogger = () => {
85
96
  if (isRuntimeEnvNodeJs()) {
86
- try {
87
- const transport = pino.transport({ target: "pino-pretty", options: { colorize: true } });
88
- return pino(baseOptions, transport);
89
- } catch (e) {
90
- console.warn("pino-pretty not installed, using default pino output", e);
91
- return pino(baseOptions);
92
- }
97
+ return createNodePinoLogger();
93
98
  }
94
99
  return pino(browserOptions);
95
100
  };
96
- var pinoLogger = createPinoLogger();
97
- var setLoggerMinimumLevel = (level) => {
98
- pinoLogger.level = level;
101
+ var createFileDestination = (logFile) => {
102
+ mkdirSync(path.dirname(logFile), { recursive: true });
103
+ return pino.destination({ dest: logFile, append: true, mkdir: true });
99
104
  };
100
- var consoleMethodToPinoMethod = (level) => (message, payload) => {
101
- if (isNullish(payload)) {
102
- pinoLogger[level](message);
103
- } else {
104
- pinoLogger[level](payload, message);
105
+ var createNodePinoWithOptions = ({ logFile, console: useConsole = true }) => {
106
+ const streams = [];
107
+ if (!isNullish(logFile)) {
108
+ streams.push({ stream: createFileDestination(logFile) });
109
+ }
110
+ if (useConsole) {
111
+ streams.push({ stream: createPrettyTransport() });
112
+ }
113
+ if (streams.length === 0) {
114
+ return pino(baseOptions);
115
+ }
116
+ if (streams.length === 1) {
117
+ return pino(baseOptions, streams[0].stream);
105
118
  }
119
+ return pino(baseOptions, pino.multistream(streams));
106
120
  };
107
- var logger = {
108
- trace: consoleMethodToPinoMethod("trace"),
109
- debug: consoleMethodToPinoMethod("debug"),
110
- info: consoleMethodToPinoMethod("info"),
111
- warn: consoleMethodToPinoMethod("warn"),
112
- error: consoleMethodToPinoMethod("error"),
113
- fatal: consoleMethodToPinoMethod("fatal"),
114
- log: consoleMethodToPinoMethod("info")
121
+ var buildLoggerApi = (pinoInstance) => {
122
+ const consoleMethodToPinoMethod = (level) => (message, payload) => {
123
+ if (isNullish(payload)) {
124
+ pinoInstance[level](message);
125
+ } else {
126
+ pinoInstance[level](payload, message);
127
+ }
128
+ };
129
+ return {
130
+ trace: consoleMethodToPinoMethod("trace"),
131
+ debug: consoleMethodToPinoMethod("debug"),
132
+ info: consoleMethodToPinoMethod("info"),
133
+ warn: consoleMethodToPinoMethod("warn"),
134
+ error: consoleMethodToPinoMethod("error"),
135
+ fatal: consoleMethodToPinoMethod("fatal"),
136
+ log: consoleMethodToPinoMethod("info")
137
+ };
138
+ };
139
+ var createLogger = (options) => {
140
+ if (!isRuntimeEnvNodeJs()) {
141
+ return buildLoggerApi(pino(browserOptions));
142
+ }
143
+ const hasFile = !isNullish(options?.logFile);
144
+ const useConsole = options?.console ?? true;
145
+ if (!hasFile && useConsole) {
146
+ return buildLoggerApi(createNodePinoLogger());
147
+ }
148
+ return buildLoggerApi(createNodePinoWithOptions({ logFile: options?.logFile, console: useConsole }));
149
+ };
150
+ var pinoLogger = createPinoLogger();
151
+ var setLoggerMinimumLevel = (level) => {
152
+ pinoLogger.level = level;
115
153
  };
154
+ var logger = buildLoggerApi(pinoLogger);
116
155
 
117
- export { logger, setLoggerMinimumLevel };
156
+ export { createLogger, logger, setLoggerMinimumLevel };
118
157
  //# sourceMappingURL=logger.js.map
119
158
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/runtime-env.utils.ts","../src/logger/logger.utils.ts"],"names":[],"mappings":";;;;;AAEO,IAAM,SAAA,GAAY,CAAC,KAAA,KAA8C,KAAA,KAAU,QAAQ,KAAA,KAAU,MAAA;;;ACI7F,IAAM,qBAAqB,MAAe;AAC/C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,KAAA;AAC3C,EAAA,IAAI,SAAA,CAAU,OAAA,EAAS,QAAA,EAAU,IAAI,GAAG,OAAO,KAAA;AAE/C,EAAA,OAAO,IAAA;AACT,CAAA;;;ACRA,IAAM,YAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,gBAAA;AAAA,EACP,KAAA,EAAO,gBAAA;AAAA,EACP,IAAA,EAAM,gBAAA;AAAA,EACN,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,gBAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAM,WAAA,GAAc,KAAA;AAIpB,IAAM,aAAA,GAAgB,CAAC,QAAA,KAA6B,YAAA,CAAa,QAAQ,CAAA,IAAK,MAAA;AAE9E,IAAM,gBAAgB,CAAC,KAAA,KAA0B,YAAA,CAAa,KAAK,KAAK,YAAA,CAAa,IAAA;AAErF,IAAM,eAAA,GAAkB,CAAC,EAAE,IAAA,EAAK,KAA0B,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAGnH,IAAM,gBAAA,GAAmB,CAAC,QAAA,KAAoC;AAC5D,EAAA,IAAI,QAAA,IAAY,IAAI,OAAO,OAAA;AAC3B,EAAA,IAAI,QAAA,IAAY,IAAI,OAAO,MAAA;AAC3B,EAAA,OAAO,KAAA;AACT,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,GAAA,KACtB,MAAA,CAAO,KAAK,GAAG,CAAA,CACZ,OAAO,CAAC,CAAA,KAAM,MAAM,OAAA,IAAW,CAAA,KAAM,UAAU,CAAA,KAAM,WAAW,EAChE,MAAA,CAAgC,CAAC,KAAK,CAAA,KAAM;AAC3C,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA;AACd,EAAA,OAAO,GAAA;AACT,CAAA,EAAG,EAAE,CAAA;AAWT,IAAM,aAAA,GAAgB,CAAC,EAAE,SAAA,EAAW,OAAO,KAAA,EAAO,GAAA,EAAK,SAAA,EAAW,IAAA,EAAK,KAAsC;AAC3G,EAAA,MAAM,MAAA,GAAS,IAAI,SAAS,CAAA,CAAA,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,EAAE,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAsB,CAAC,CAAA,EAAG,MAAM,KAAK,SAAS,CAAA,EAAA,CAAA,EAAM,OAAO,gBAAgB,CAAA;AAEjF,EAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG,QAAA,CAAS,KAAK,GAAG,CAAA;AACtC,EAAA,IAAI,UAAU,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,GAAG,SAAS,CAAA;AACpD,EAAA,IAAI,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAE/B,EAAA,OAAO,QAAA;AACT,CAAA;AAEA,IAAM,WAAA,GAAkC;AAAA,EACtC,SAAA,EAAW,KAAK,gBAAA,CAAiB,OAAA;AAAA,EACjC,UAAA,EAAY;AACd,CAAA;AAEA,IAAM,cAAA,GAAqC;AAAA,EACzC,GAAG,WAAA;AAAA,EACH,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,CAAC,MAAA,EAAA,GAAmB,IAAA,KAAoB;AAC7C,MAAA,MAAM,GAAA,GAAM,MAAA;AACZ,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,IAAS,EAAA;AAC9B,MAAA,MAAM,KAAA,GAAQ,cAAc,QAAQ,CAAA;AACpC,MAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,MAAA,MAAM,SAAA,GAAY,gBAAgB,GAAG,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,IAAI,WAAW,CAAA;AAC3B,MAAA,MAAM,IAAA,GAAO,eAAe,GAAG,CAAA;AAC/B,MAAA,MAAM,aAAA,GAAgB,iBAAiB,QAAQ,CAAA;AAC/C,MAAA,MAAM,WAAW,aAAA,CAAc;AAAA,QAC7B,SAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAA,EAAW,IAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAC,OAAA,CAAQ,aAAa,CAAA,CAAgC,GAAG,QAAQ,CAAA;AAAA,IACnE;AAAA;AAEJ,CAAA;AAEA,IAAM,mBAAmB,MAAmB;AAC1C,EAAA,IAAI,oBAAmB,EAAG;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,EAAE,QAAA,EAAU,IAAA,EAAK,EAAG,CAAA;AACvF,MAAA,OAAO,IAAA,CAAK,aAAa,SAAS,CAAA;AAAA,IACpC,SAAS,CAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK,wDAAwD,CAAC,CAAA;AACtE,MAAA,OAAO,KAAK,WAAW,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,KAAK,cAAc,CAAA;AAC5B,CAAA;AAEA,IAAM,aAAa,gBAAA,EAAiB;AAI7B,IAAM,qBAAA,GAAwB,CAAC,KAAA,KAAiB;AACrD,EAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AACrB;AAEA,IAAM,yBAAA,GAA4B,CAAC,KAAA,KAAiB,CAAC,SAAiB,OAAA,KAAsC;AAC1G,EAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,IAAA,UAAA,CAAW,KAAK,EAAE,OAAO,CAAA;AAAA,EAC3B,CAAA,MAAO;AACL,IAAA,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EACpC;AACF,CAAA;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,KAAA,EAAO,0BAA0B,OAAO,CAAA;AAAA,EACxC,KAAA,EAAO,0BAA0B,OAAO,CAAA;AAAA,EACxC,IAAA,EAAM,0BAA0B,MAAM,CAAA;AAAA,EACtC,IAAA,EAAM,0BAA0B,MAAM,CAAA;AAAA,EACtC,KAAA,EAAO,0BAA0B,OAAO,CAAA;AAAA,EACxC,KAAA,EAAO,0BAA0B,OAAO,CAAA;AAAA,EACxC,GAAA,EAAK,0BAA0B,MAAM;AACvC","file":"logger.js","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","import pino from \"pino\";\nimport { isRuntimeEnvNodeJs } from \"../utils/runtime-env.utils\";\nimport { isNullish } from \"../utils/types.utils\";\n\nconst LEVEL_LABELS: Record<number, string> = {\n 10: \"trace\",\n 20: \"debug\",\n 30: \"info\",\n 40: \"warn\",\n 50: \"error\",\n 60: \"fatal\",\n};\n\nconst LEVEL_COLORS: Record<string, string> = {\n trace: \"color: #94a3b8\",\n debug: \"color: #22d3ee\",\n info: \"color: #4ade80\",\n warn: \"color: #fbbf24\",\n error: \"color: #f87171\",\n fatal: \"color: #dc2626; font-weight: bold\",\n};\n\nconst MESSAGE_KEY = \"msg\";\n\ntype LogObject = Record<string, unknown> & { level?: number; time?: string; [MESSAGE_KEY]?: string };\n\nconst getLevelLabel = (levelNum: number): string => LEVEL_LABELS[levelNum] ?? \"info\";\n\nconst getLevelColor = (label: string): string => LEVEL_COLORS[label] ?? LEVEL_COLORS.info;\n\nconst getLogTimestamp = ({ time }: LogObject): string => (typeof time === \"string\" ? time : new Date().toISOString());\n\ntype ConsoleMethod = \"log\" | \"warn\" | \"error\";\nconst getConsoleMethod = (levelNum: number): ConsoleMethod => {\n if (levelNum >= 50) return \"error\";\n if (levelNum >= 40) return \"warn\";\n return \"log\";\n};\n\nconst getRestPayload = (obj: LogObject): Record<string, unknown> =>\n Object.keys(obj)\n .filter((k) => k !== \"level\" && k !== \"time\" && k !== MESSAGE_KEY)\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = obj[k];\n return acc;\n }, {});\n\ntype BuildMainArgsParams = {\n timestamp: string;\n label: string;\n color: string;\n msg: unknown;\n extraArgs: unknown[];\n rest: Record<string, unknown>;\n};\n\nconst buildMainArgs = ({ timestamp, label, color, msg, extraArgs, rest }: BuildMainArgsParams): unknown[] => {\n const prefix = `[${timestamp}]`;\n const levelPart = ` ${label.toUpperCase()} `;\n const hasRest = Object.keys(rest).length > 0;\n const mainArgs: unknown[] = [`${prefix}%c${levelPart}%c`, color, \"color: inherit\"];\n\n if (!isNullish(msg)) mainArgs.push(msg);\n if (extraArgs.length > 0) mainArgs.push(...extraArgs);\n if (hasRest) mainArgs.push(rest);\n\n return mainArgs;\n};\n\nconst baseOptions: pino.LoggerOptions = {\n timestamp: pino.stdTimeFunctions.isoTime,\n messageKey: MESSAGE_KEY,\n};\n\nconst browserOptions: pino.LoggerOptions = {\n ...baseOptions,\n browser: {\n write: (logObj: object, ...args: unknown[]) => {\n const obj = logObj as LogObject;\n const levelNum = obj.level ?? 30;\n const label = getLevelLabel(levelNum);\n const color = getLevelColor(label);\n const timestamp = getLogTimestamp(obj);\n const msg = obj[MESSAGE_KEY];\n const rest = getRestPayload(obj);\n const consoleMethod = getConsoleMethod(levelNum);\n const mainArgs = buildMainArgs({\n timestamp,\n label,\n color,\n msg,\n extraArgs: args,\n rest,\n });\n (console[consoleMethod] as (...a: unknown[]) => void)(...mainArgs);\n },\n },\n};\n\nconst createPinoLogger = (): pino.Logger => {\n if (isRuntimeEnvNodeJs()) {\n try {\n const transport = pino.transport({ target: \"pino-pretty\", options: { colorize: true } });\n return pino(baseOptions, transport);\n } catch (e: unknown) {\n console.warn(\"pino-pretty not installed, using default pino output\", e);\n return pino(baseOptions);\n }\n }\n\n return pino(browserOptions);\n};\n\nconst pinoLogger = createPinoLogger();\n\nexport type Level = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nexport const setLoggerMinimumLevel = (level: Level) => {\n pinoLogger.level = level;\n};\n\nconst consoleMethodToPinoMethod = (level: Level) => (message: string, payload?: Record<string, unknown>) => {\n if (isNullish(payload)) {\n pinoLogger[level](message);\n } else {\n pinoLogger[level](payload, message);\n }\n};\n\nexport const logger = {\n trace: consoleMethodToPinoMethod(\"trace\"),\n debug: consoleMethodToPinoMethod(\"debug\"),\n info: consoleMethodToPinoMethod(\"info\"),\n warn: consoleMethodToPinoMethod(\"warn\"),\n error: consoleMethodToPinoMethod(\"error\"),\n fatal: consoleMethodToPinoMethod(\"fatal\"),\n log: consoleMethodToPinoMethod(\"info\"),\n};\n"]}
1
+ {"version":3,"sources":["../src/utils/types.utils.ts","../src/utils/runtime-env.utils.ts","../src/logger/logger.utils.ts"],"names":[],"mappings":"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","file":"logger.js","sourcesContent":["export const NO_OP: () => void = () => {};\n\nexport const isNullish = (value: unknown): value is null | undefined => value === null || value === undefined;\n\nexport const isNumber = (value?: unknown | null): value is number => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'number') {\n return false;\n }\n\n if (isNaN(value)) {\n return false;\n }\n\n return true;\n};\n\nexport const isString = (value?: unknown | null): value is string => {\n if (isNullish(value)) {\n return false;\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n return true;\n};\n","import { isNullish } from \"./types.utils\";\n\n/**\n * Returns true when running in Node.js.\n * Checks for process.versions.node to avoid false positives in Web Workers.\n */\nexport const isRuntimeEnvNodeJs = (): boolean => {\n if (typeof window !== \"undefined\") return false;\n if (typeof process === \"undefined\") return false;\n if (isNullish(process?.versions?.node)) return false;\n\n return true;\n};\n","import { mkdirSync } from \"node:fs\";\nimport path from \"node:path\";\nimport pino from \"pino\";\nimport { isRuntimeEnvNodeJs } from \"../utils/runtime-env.utils\";\nimport { isNullish } from \"../utils/types.utils\";\n\nconst LEVEL_LABELS: Record<number, string> = {\n 10: \"trace\",\n 20: \"debug\",\n 30: \"info\",\n 40: \"warn\",\n 50: \"error\",\n 60: \"fatal\",\n};\n\nconst LEVEL_COLORS: Record<string, string> = {\n trace: \"color: #94a3b8\",\n debug: \"color: #22d3ee\",\n info: \"color: #4ade80\",\n warn: \"color: #fbbf24\",\n error: \"color: #f87171\",\n fatal: \"color: #dc2626; font-weight: bold\",\n};\n\nconst MESSAGE_KEY = \"msg\";\n\ntype LogObject = Record<string, unknown> & { level?: number; time?: string; [MESSAGE_KEY]?: string };\n\nconst getLevelLabel = (levelNum: number): string => LEVEL_LABELS[levelNum] ?? \"info\";\n\nconst getLevelColor = (label: string): string => LEVEL_COLORS[label] ?? LEVEL_COLORS.info;\n\nconst getLogTimestamp = ({ time }: LogObject): string => (typeof time === \"string\" ? time : new Date().toISOString());\n\ntype ConsoleMethod = \"log\" | \"warn\" | \"error\";\nconst getConsoleMethod = (levelNum: number): ConsoleMethod => {\n if (levelNum >= 50) return \"error\";\n if (levelNum >= 40) return \"warn\";\n return \"log\";\n};\n\nconst getRestPayload = (obj: LogObject): Record<string, unknown> =>\n Object.keys(obj)\n .filter((k) => k !== \"level\" && k !== \"time\" && k !== MESSAGE_KEY)\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = obj[k];\n return acc;\n }, {});\n\ntype BuildMainArgsParams = {\n timestamp: string;\n label: string;\n color: string;\n msg: unknown;\n extraArgs: unknown[];\n rest: Record<string, unknown>;\n};\n\nconst buildMainArgs = ({ timestamp, label, color, msg, extraArgs, rest }: BuildMainArgsParams): unknown[] => {\n const prefix = `[${timestamp}]`;\n const levelPart = ` ${label.toUpperCase()} `;\n const hasRest = Object.keys(rest).length > 0;\n const mainArgs: unknown[] = [`${prefix}%c${levelPart}%c`, color, \"color: inherit\"];\n\n if (!isNullish(msg)) mainArgs.push(msg);\n if (extraArgs.length > 0) mainArgs.push(...extraArgs);\n if (hasRest) mainArgs.push(rest);\n\n return mainArgs;\n};\n\nconst baseOptions: pino.LoggerOptions = {\n timestamp: pino.stdTimeFunctions.isoTime,\n messageKey: MESSAGE_KEY,\n};\n\nconst browserOptions: pino.LoggerOptions = {\n ...baseOptions,\n browser: {\n write: (logObj: object, ...args: unknown[]) => {\n const obj = logObj as LogObject;\n const levelNum = obj.level ?? 30;\n const label = getLevelLabel(levelNum);\n const color = getLevelColor(label);\n const timestamp = getLogTimestamp(obj);\n const msg = obj[MESSAGE_KEY];\n const rest = getRestPayload(obj);\n const consoleMethod = getConsoleMethod(levelNum);\n const mainArgs = buildMainArgs({\n timestamp,\n label,\n color,\n msg,\n extraArgs: args,\n rest,\n });\n (console[consoleMethod] as (...a: unknown[]) => void)(...mainArgs);\n },\n },\n};\n\nconst createPrettyTransport = (): pino.DestinationStream => {\n try {\n return pino.transport({ target: \"pino-pretty\", options: { colorize: true } });\n } catch (e: unknown) {\n console.warn(\"pino-pretty not installed, using default pino output\", e);\n return pino.destination(1);\n }\n};\n\nconst createNodePinoLogger = (): pino.Logger => pino(baseOptions, createPrettyTransport());\n\nconst createPinoLogger = (): pino.Logger => {\n if (isRuntimeEnvNodeJs()) {\n return createNodePinoLogger();\n }\n\n return pino(browserOptions);\n};\n\nexport type CreateLoggerOptions = {\n logFile?: string;\n console?: boolean;\n};\n\nconst createFileDestination = (logFile: string): pino.DestinationStream => {\n mkdirSync(path.dirname(logFile), { recursive: true });\n return pino.destination({ dest: logFile, append: true, mkdir: true });\n};\n\nconst createNodePinoWithOptions = ({ logFile, console: useConsole = true }: CreateLoggerOptions): pino.Logger => {\n const streams: pino.StreamEntry[] = [];\n\n if (!isNullish(logFile)) {\n streams.push({ stream: createFileDestination(logFile) });\n }\n\n if (useConsole) {\n streams.push({ stream: createPrettyTransport() });\n }\n\n if (streams.length === 0) {\n return pino(baseOptions);\n }\n\n if (streams.length === 1) {\n return pino(baseOptions, streams[0]!.stream);\n }\n\n return pino(baseOptions, pino.multistream(streams));\n};\n\nexport type Logger = {\n trace: (message: string, payload?: Record<string, unknown>) => void;\n debug: (message: string, payload?: Record<string, unknown>) => void;\n info: (message: string, payload?: Record<string, unknown>) => void;\n warn: (message: string, payload?: Record<string, unknown>) => void;\n error: (message: string, payload?: Record<string, unknown>) => void;\n fatal: (message: string, payload?: Record<string, unknown>) => void;\n log: (message: string, payload?: Record<string, unknown>) => void;\n};\n\nconst buildLoggerApi = (pinoInstance: pino.Logger): Logger => {\n const consoleMethodToPinoMethod =\n (level: Level) =>\n (message: string, payload?: Record<string, unknown>): void => {\n if (isNullish(payload)) {\n pinoInstance[level](message);\n } else {\n pinoInstance[level](payload, message);\n }\n };\n\n return {\n trace: consoleMethodToPinoMethod(\"trace\"),\n debug: consoleMethodToPinoMethod(\"debug\"),\n info: consoleMethodToPinoMethod(\"info\"),\n warn: consoleMethodToPinoMethod(\"warn\"),\n error: consoleMethodToPinoMethod(\"error\"),\n fatal: consoleMethodToPinoMethod(\"fatal\"),\n log: consoleMethodToPinoMethod(\"info\"),\n };\n};\n\nexport const createLogger = (options?: CreateLoggerOptions): Logger => {\n if (!isRuntimeEnvNodeJs()) {\n return buildLoggerApi(pino(browserOptions));\n }\n\n const hasFile = !isNullish(options?.logFile);\n const useConsole = options?.console ?? true;\n\n if (!hasFile && useConsole) {\n return buildLoggerApi(createNodePinoLogger());\n }\n\n return buildLoggerApi(createNodePinoWithOptions({ logFile: options?.logFile, console: useConsole }));\n};\n\nconst pinoLogger = createPinoLogger();\n\nexport type Level = \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"fatal\";\n\nexport const setLoggerMinimumLevel = (level: Level) => {\n pinoLogger.level = level;\n};\n\nexport const logger = buildLoggerApi(pinoLogger);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lichens-innovation/ts-common",
3
- "version": "1.15.5",
3
+ "version": "1.16.0",
4
4
  "description": "Reusable generic typescript utilities, types, constants, helpers",
5
5
  "keywords": [
6
6
  "typescript",