diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..b0aa4e7 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,64 @@ +import { BaseLevels, BaseLogger } from 'anylogger' + +interface Logger extends BaseLogger, LevelConstants { + levels: Record; + /** + * The log level of this logger. + */ + level: LogLevel; + assert(...args: any[]): void + dir(...args: any[]): void + table(...args: any[]): void + time(...args: any[]): void + timeEnd(...args: any[]): void + verbose(message?: any, ...args: any[]): void + silly(message?: any, ...args: any[]): void + discard(...args: any[]): void +} + +type ValueOf = T[keyof T] + +type LevelNames = BaseLevels & { + assert: 0 + dir: 0 + table: 0 + time: 0 + timeEnd: 0 + verbose: 4 + silly: 6 +} + +interface LevelConstants { + NONE: 0 + ERROR: 1 + WARN: 2 + INFO: 3 + LOG: 4 + DEBUG: 5 + TRACE: 6 +} + +export type LogLevel = ValueOf + +export type LogFormatter = (logger: Logger, method: keyof LevelNames, args: unknown[]) => void + +export type LoggerExtender = (logger: Logger, parent: Logger) => void + +export interface Middleware { + outputs: { + custom: { + log(...args: unknown[]): void; + }; + }; + use: LogFormatter[]; + formats: Record void>; + formatters: { + custom(ctx: unknown): LogFormatter; + }; +} + +declare namespace Logger { + function use(options: Partial): void; +} + +export default Logger; diff --git a/mods/formats.d.ts b/mods/formats.d.ts new file mode 100644 index 0000000..1006423 --- /dev/null +++ b/mods/formats.d.ts @@ -0,0 +1,3 @@ +import { LogFormatter } from '../'; +declare var formats: LogFormatter; +export default formats; diff --git a/mods/kurly.d.ts b/mods/kurly.d.ts new file mode 100644 index 0000000..d70820a --- /dev/null +++ b/mods/kurly.d.ts @@ -0,0 +1,4 @@ +import { Middleware } from '../' + +declare var kurly: Middleware; +export default kurly; diff --git a/types/tests.ts b/types/tests.ts new file mode 100644 index 0000000..f424352 --- /dev/null +++ b/types/tests.ts @@ -0,0 +1,55 @@ +import { BaseLevels } from 'anylogger' +import anylogger from 'anylogger' +import ulog from 'ulog'; +import formats from 'ulog/mods/formats' +import kurly from 'ulog/mods/kurly' + +const log = anylogger('my-app') as ulog; +log('Logging is easy!') + +if (log.level >= log.INFO) { + log.info('This message will be logged') +} +log.level = log.WARN +log.info('This info message will NOT be logged.') +log.warn('This warning message WILL be logged.') +log.level = log.NONE +log.error('Logging is completely disabled.') + +ulog.use({ + outputs: { + custom: { + log() { + var args = [].slice.call(arguments) + args.shift('Custom!!') + console.log.apply(console, args) + } + } + }, + use: [formats], + formats: { + cool(logger) { + // will be called on logger creation/extension + // replace the default log methods with formatters + // use bind so we leave the call stack intact. + // only works for static info like our 'Cool!' message + for (var level in this.levels) { + const lvl = level as keyof BaseLevels; + logger[lvl] = logger[lvl].bind(logger, 'Cool!') + } + // don't forget to format the method to discard to the drain as well! + logger.discard = logger.discard.bind(logger, 'Cool!') + } + } +}) + +ulog.use(kurly) +ulog.use({ + formatters: { + custom(ctx) { + return function (rec) { + return 'Custom!' + } + } + } +}) \ No newline at end of file diff --git a/types/tsconfig.json b/types/tsconfig.json new file mode 100644 index 0000000..79500b0 --- /dev/null +++ b/types/tsconfig.json @@ -0,0 +1,23 @@ +{ + "include": [ + "../**/*.ts" + ], + "compilerOptions": { + "module": "commonjs", + "lib": [ + "dom", + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "baseUrl": "../../", + "typeRoots": [ + "../../" + ], + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + } +} \ No newline at end of file