import { NestState, OutletSpinner, VerbaOptions } from '../types'; import { NormalizedDividerOptions, NormalizedJsonOptions, NormalizedProgressBarOptions, NormalizedSimpleOutletOptions, NormalizedSpacerOptions, NormalizedSpinnerOptions, NormalizedTableOptions, Outlet, OutletToNormalizedArgsObj } from '../outlet/types'; import { ListenerStore } from '../util/listenerStore/types'; import { ProgressBar } from '../progressBar/types'; import { TypeDependantBaseIntersection } from '../util/types'; export type OutletToTransportHandlerFn = { [Outlet.LOG]: (options: NormalizedSimpleOutletOptions) => void; [Outlet.INFO]: (options: NormalizedSimpleOutletOptions) => void; [Outlet.STEP]: (options: NormalizedSimpleOutletOptions) => void; [Outlet.SUCCESS]: (options: NormalizedSimpleOutletOptions) => void; [Outlet.WARN]: (options: NormalizedSimpleOutletOptions) => void; [Outlet.ERROR]: (options: NormalizedSimpleOutletOptions) => void; [Outlet.TABLE]: (data: any, options: NormalizedTableOptions) => void; [Outlet.JSON]: (value: any, options: NormalizedJsonOptions) => void; [Outlet.DIVIDER]: (options: NormalizedDividerOptions) => void; [Outlet.SPACER]: (options: NormalizedSpacerOptions) => void; [Outlet.SPINNER]: (options: NormalizedSpinnerOptions) => OutletSpinner | undefined; [Outlet.PROGRESS_BAR]: (options: NormalizedProgressBarOptions) => ProgressBar | undefined; }; export type OutletHandlerFnOptions = TypeDependantBaseIntersection, TOutlet, 'outlet'>; export type VerbaTransportEventName = 'onBeforeLog' | 'onAfterLog'; export type VerbaTransportEventHandlers = { onBeforeLog: (options: OutletHandlerFnOptions, nestState: NestState) => void; onAfterLog: (options: OutletHandlerFnOptions, nestState: NestState) => void; }; export type VerbaTransportListenerStore = ListenerStore; export type NestedInstantiatedVerbaTransport = OutletToTransportHandlerFn; export type InstantiatedVerbaTransport = ( /** * The current nest state of the logger. */ nestState: NestState) => NestedInstantiatedVerbaTransport; /** * Defines how log messages are outputted. * * @example * import verba, { VerbaTransport } from 'verba' * * const transport: VerbaTransport = (loggerOptions, listeners) => { * // Parse top-level logger options, add event listeners, perform setup... * return nestState => { * // ... * return { * log: msg => ..., * info: options => ..., * step: options => ..., * success: options => ..., * warn: options => ..., * table: (data, options) => ..., * json: (data, options) => ..., * divider: () => ..., * spacer: numLines => ..., * } * } * } * * const log = verba({ plugins: [transport] }) */ export type VerbaTransport = ( /** * The top-level verba-logger options that was received. */ options: VerbaOptions, /** * A listener store that can be used to add listeners to various events of * the verba logger. */ listeners: VerbaTransportListenerStore, /** * Registers the given asynchronous `handler` function to be ran when the * top-level `close` function is called (on the `Verba` instance). * * This is useful for when a Transport needs to perform tear-down operations * (such as waiting for an API request to finish, waiting for a write stream * to finish draining, and so on). * * Notably, this is used by default in the current contexts: * * By `fileTransport` to ensure that logs finish getting written to file * before the node program fully exits. * * By `fileTransport` and `consoleTransport` when batching is enabled, to * ensure that batched log messages are processed before the node program * fully exits. */ registerOnClose: (handler: () => (Promise | void)) => void) => InstantiatedVerbaTransport;