Skip to content

Commit

Permalink
make typesafe custom level loggers great again
Browse files Browse the repository at this point in the history
pass in logger's generic based on value of customLevels and/or logger.customLevels option

TS does not like what I did here so I added a ts-expect-error to silence it
but it does work as expected, this is covered in the tests

fixes #317 and supersedes #318 if merged
  • Loading branch information
naseemkullah committed Dec 22, 2023
1 parent 01134b9 commit 2d51f3c
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 10 deletions.
12 changes: 8 additions & 4 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,17 @@ import { IncomingMessage, ServerResponse } from 'http';
import pino from 'pino';
import { err, req, res, SerializedError, SerializedRequest, SerializedResponse } from 'pino-std-serializers';

declare function PinoHttp<IM = IncomingMessage, SR = ServerResponse, CustomLevels extends string = never>(opts?: Options<IM, SR>, stream?: pino.DestinationStream): HttpLogger<IM, SR, CustomLevels>;
declare function PinoHttp< IM = IncomingMessage, SR = ServerResponse, Opts = Options<IM, SR>>(opts?: Opts, stream?: pino.DestinationStream): HttpLogger<IM, SR, Opts>;

declare function PinoHttp<IM = IncomingMessage, SR = ServerResponse>(stream?: pino.DestinationStream): HttpLogger<IM, SR>;

export interface HttpLogger<IM = IncomingMessage, SR = ServerResponse, CustomLevels extends string = never> {
(req: IM, res: SR, next?: () => void): void;
logger: pino.Logger<CustomLevels>;
export interface HttpLogger<IM = IncomingMessage, SR = ServerResponse, Opts = Options<IM, SR>> {
(req: IM, res: SR, next?: () => void): void;
logger: pino.Logger<
// this makes custom level loggers typesafe, but TS complains
// @ts-expect-error
keyof Opts["customLevels"] | keyof Opts["logger"]["customLevels"]
>;
}
export type ReqId = number | string | object;

Expand Down
23 changes: 17 additions & 6 deletions index.test-d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,10 +206,21 @@ const httpServerListener: RequestListener = (request, response) => {
response.end("Hello world");
};

// custom levels added in the options should be available
// custom levels added in the options should be available/typesafe
// on the logger returned by pino-http
pinoHttp<IncomingMessage, ServerResponse, 'bark'>({
customLevels: {
bark: 25,
}
}).logger.bark("arf arf");
pinoHttp({ customLevels: { bark: 25 } }).logger.bark("arf arf");

// custom levels added to the logger passed in the options should be available/typesafe
pinoHttp({ logger: pino({ customLevels: { bark: 35 } }) }).logger.bark(
"arf arf"
);

// if custom levels are passed in both the customLevels option and via the logger
// all the levels should be available/typesafe
const { logger: customLevelsLogger } = pinoHttp({
logger: pino({ customLevels: { meow: 35 } }),
customLevels: { bark: 25 },
});

customLevelsLogger.meow("meow meow");
customLevelsLogger.bark("arf arf");

0 comments on commit 2d51f3c

Please sign in to comment.