import { expectAssignable, expectType, expectNotAssignable } from "tsd"; import pino from "../../"; import type {LevelWithSilent, Logger, LogFn, DestinationStreamWithMetadata, Level, LevelOrString, LevelWithSilentOrString, LoggerExtras, LoggerOptions } 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`. const log = pino(); expectAssignable(log); expectType(log); expectType(log.info); expectType>([log.level]); const level: Level = 'debug'; expectAssignable(level); const levelWithSilent: LevelWithSilent = 'silent'; expectAssignable(levelWithSilent); const levelOrString: LevelOrString = "myCustomLevel"; expectAssignable(levelOrString); expectNotAssignable(levelOrString); expectNotAssignable(levelOrString); expectAssignable(levelOrString); const levelWithSilentOrString: LevelWithSilentOrString = "myCustomLevel"; expectAssignable(levelWithSilentOrString); expectNotAssignable(levelWithSilentOrString); expectNotAssignable(levelWithSilentOrString); expectAssignable(levelWithSilentOrString); function createStream(): DestinationStreamWithMetadata { return { write() {} }; } const stream = createStream(); // Argh. TypeScript doesn't seem to narrow unless we assign the symbol like so, and tsd seems to // break without annotating the type explicitly const needsMetadata: typeof pino.symbols.needsMetadataGsym = pino.symbols.needsMetadataGsym; if (stream[needsMetadata]) { expectType(stream.lastLevel); } const loggerOptions:LoggerOptions = { browser: { formatters: { log(obj) { return obj }, level(label, number) { return { label, number} } } } } expectType(loggerOptions) // Reference: https://github.com/pinojs/pino/issues/2285 const someConst = "test" as const; pino().error({}, someConst); const someFunc = (someConst: T) => { pino().error({}, someConst); };