Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 48f3f3a

Browse files
author
Michal Vlasák
committed
✨ Update factory interface
1 parent 5a89e88 commit 48f3f3a

1 file changed

Lines changed: 21 additions & 16 deletions

File tree

src/index.ts

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@ export interface AckeeLogger extends PinoLogger {
1818
express: AckeeLoggerExpressMiddleware;
1919
expressError: ErrorRequestHandler;
2020
stream: Writable;
21+
(childName: string): any;
2122
}
2223

2324
export interface AckeeLoggerFactory extends AckeeLogger {
24-
(data: string | AckeeLoggerOptions): AckeeLogger;
25+
(data?: string | AckeeLoggerOptions): AckeeLogger;
2526
}
2627

28+
const makeCallable = <T extends object, F extends (...args: any[]) => any>(obj: T, fun: F): T & F =>
29+
new Proxy(fun as any, {
30+
get: (_target, key) => (obj as any)[key],
31+
});
32+
33+
const objEmpty = (obj: object) => Object.keys(obj).length === 0;
34+
2735
// This is a custom slightly edited version of pino-multistream's write method, which adds support for maximum log level
2836
// The original version was pino-multistream 4.2.0 (commit bf7941f) - https://github.com/pinojs/pino-multi-stream/blob/bf7941f77661b6c14dd40840ff4a4db6897f08eb/multistream.js#L43
2937
const maxLevelWrite: pino.WriteFn = function(this: any, data: object): void {
@@ -95,9 +103,6 @@ const defaultLogger = (options: AckeeLoggerOptions & { loggerName?: string } = {
95103
});
96104
};
97105

98-
let rootLogger: AckeeLogger;
99-
let rootOptions: AckeeLoggerOptions;
100-
101106
const parseLoggerData = (data: string | AckeeLoggerOptions = {}) => {
102107
let loggerName: string | undefined;
103108
let options: AckeeLoggerOptions = {};
@@ -113,21 +118,21 @@ const parseLoggerData = (data: string | AckeeLoggerOptions = {}) => {
113118
return { loggerName, options };
114119
};
115120

116-
const loggerFactory = (data: string | AckeeLoggerOptions = {}): AckeeLogger => {
121+
const loggerFactory = (data: string | AckeeLoggerOptions = {}, loggerOptions: AckeeLoggerOptions = {}): AckeeLogger => {
122+
// console.log('Factory called');
117123
const { loggerName, options } = parseLoggerData(data);
124+
loggerOptions = objEmpty(options) ? loggerOptions : options;
125+
const logger = defaultLogger(Object.assign({ loggerName }, loggerOptions));
118126

119-
if (!rootLogger) {
120-
rootLogger = defaultLogger(options);
121-
rootOptions = options;
122-
}
123-
if (!loggerName) {
124-
return rootLogger;
125-
}
126-
return defaultLogger(Object.assign({ loggerName }, rootOptions));
127+
const loggerProxy = makeCallable(logger, (childName: string) => {
128+
const childLoggerName = [loggerName, childName].join('');
129+
// console.log('Creating child', childName);
130+
const childOptions = loggerOptions;
131+
return loggerFactory(childLoggerName, childOptions);
132+
});
133+
return loggerProxy;
127134
};
128135

129-
const factoryProxy = new Proxy(loggerFactory, {
130-
get: (target, key) => (target() as any)[key],
131-
}) as AckeeLoggerFactory;
136+
const factoryProxy = makeCallable(loggerFactory(), loggerFactory);
132137

133138
export default factoryProxy;

0 commit comments

Comments
 (0)