Skip to content

Commit

Permalink
feat: auto completion for level (#1808)
Browse files Browse the repository at this point in the history
Co-authored-by: Matteo Collina <[email protected]>
  • Loading branch information
bogeychan and mcollina authored Oct 3, 2023
1 parent c07cd48 commit 46b03b0
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 12 deletions.
20 changes: 12 additions & 8 deletions pino.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ export interface LoggerExtras<Options = LoggerOptions> extends EventEmitter {
/**
* A utility method for determining if a given log level will write to the destination.
*/
isLevelEnabled(level: pino.LevelWithSilent | string): boolean;
isLevelEnabled(level: pino.LevelWithSilentOrString): boolean;

/**
* Returns an object containing all the current bindings, cloned from the ones passed in via logger.child().
Expand Down Expand Up @@ -146,7 +146,7 @@ declare namespace pino {
*
* You can pass `'silent'` to disable logging.
*/
level: pino.LevelWithSilent | string;
level: pino.LevelWithSilentOrString;

/**
* Log at `'fatal'` level the given msg. If the first argument is an object, all its properties will be included in the JSON line.
Expand Down Expand Up @@ -217,15 +217,17 @@ declare namespace pino {
type Bindings = Record<string, any>;

type Level = "fatal" | "error" | "warn" | "info" | "debug" | "trace";
type LevelOrString = Level | (string & {});
type LevelWithSilent = pino.Level | "silent";
type LevelWithSilentOrString = LevelWithSilent | (string & {});

type SerializerFn = (value: any) => any;
type WriteFn = (o: object) => void;

type LevelChangeEventListener<Options = LoggerOptions> = (
lvl: LevelWithSilent | string,
lvl: LevelWithSilentOrString,
val: number,
prevLvl: LevelWithSilent | string,
prevLvl: LevelWithSilentOrString,
prevVal: number,
logger: Logger<Options>
) => void;
Expand All @@ -242,7 +244,7 @@ declare namespace pino {
interface TransportTargetOptions<TransportOptions = Record<string, any>> {
target: string
options: TransportOptions
level: LevelWithSilent | string
level: LevelWithSilentOrString
}

interface TransportBaseOptions<TransportOptions = Record<string, any>> {
Expand Down Expand Up @@ -344,7 +346,7 @@ declare namespace pino {
* One of the supported levels or `silent` to disable logging. Any other value defines a custom level and
* requires supplying a level value via `levelVal`. Default: 'info'.
*/
level?: LevelWithSilent | string;
level?: LevelWithSilentOrString;

/**
* Use this option to define additional logging levels.
Expand Down Expand Up @@ -545,7 +547,7 @@ declare namespace pino {
* the `send` function will be called based on the main logging `level` (set via `options.level`,
* defaulting to `info`).
*/
level?: Level | string;
level?: LevelOrString;
/**
* Remotely record log messages.
*
Expand Down Expand Up @@ -636,7 +638,7 @@ declare namespace pino {
}

interface ChildLoggerOptions {
level?: Level | string;
level?: LevelOrString;
serializers?: { [key: string]: SerializerFn };
customLevels?: { [key: string]: number };
formatters?: {
Expand Down Expand Up @@ -814,7 +816,9 @@ export const version: typeof pino.version;
export type Bindings = pino.Bindings;
export type DestinationStreamWithMetadata = pino.DestinationStreamWithMetadata;
export type Level = pino.Level;
export type LevelOrString = pino.LevelOrString;
export type LevelWithSilent = pino.LevelWithSilent;
export type LevelWithSilentOrString = pino.LevelWithSilentOrString;
export type LevelChangeEventListener = pino.LevelChangeEventListener;
export type LogDescriptor = pino.LogDescriptor;
export type Logger<Options = LoggerOptions> = pino.Logger<Options>;
Expand Down
27 changes: 23 additions & 4 deletions test/types/pino-type-only.test-d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { expectAssignable, expectType } from "tsd";
import { expectAssignable, expectType, expectNotAssignable } from "tsd";

import pino from "../../";
import type {LevelWithSilent, Logger, LogFn, P, DestinationStreamWithMetadata, LoggerExtras } from "../../pino";
import type {LevelWithSilent, Logger, LogFn, P, DestinationStreamWithMetadata, Level, LevelOrString, LevelWithSilentOrString, LoggerExtras } from "../../pino";

// NB: can also use `import * as pino`, but that form is callable as `pino()`
// under `esModuleInterop: false` or `pino.default()` under `esModuleInterop: true`.
Expand All @@ -13,8 +13,27 @@ expectType<LogFn>(log.info);
expectType<P.Logger>(log);
expectType<P.LogFn>(log.info);

const level: LevelWithSilent = 'silent';
expectAssignable<P.LevelWithSilent>(level);
expectType<Parameters<typeof log.isLevelEnabled>>([log.level]);

const level: Level = 'debug';
expectAssignable<string>(level);
expectAssignable<P.Level>(level);

const levelWithSilent: LevelWithSilent = 'silent';
expectAssignable<string>(levelWithSilent);
expectAssignable<P.LevelWithSilent>(levelWithSilent);

const levelOrString: LevelOrString = "myCustomLevel";
expectAssignable<string>(levelOrString);
expectNotAssignable<pino.Level>(levelOrString);
expectNotAssignable<pino.LevelWithSilent>(levelOrString);
expectAssignable<pino.LevelWithSilentOrString>(levelOrString);

const levelWithSilentOrString: LevelWithSilentOrString = "myCustomLevel";
expectAssignable<string>(levelWithSilentOrString);
expectNotAssignable<pino.Level>(levelWithSilentOrString);
expectNotAssignable<pino.LevelWithSilent>(levelWithSilentOrString);
expectAssignable<pino.LevelOrString>(levelWithSilentOrString);

function createStream(): DestinationStreamWithMetadata {
return { write() {} };
Expand Down

0 comments on commit 46b03b0

Please sign in to comment.