Spaces:
Runtime error
Runtime error
| import * as colors from 'colors'; | |
| import * as util from 'util'; | |
| type ConsoleType = "out" | "info" | "error"; | |
| interface ConsoleTypeData { | |
| [text: string]: string | undefined; | |
| } | |
| export default class Log { | |
| private __name: string | undefined; | |
| private types: ConsoleTypeData = { | |
| "out": "white", | |
| "info": "cyan", | |
| "error": "red", | |
| } | |
| constructor(name?: string) { | |
| this.__name = name; | |
| } | |
| private get date(): string { | |
| return colors.grey(`[${ new Date().toISOString() }] `); | |
| } | |
| private get name(): string { | |
| return this.__name | |
| ? `{${ this.__name.toUpperCase() }} ` | |
| : ''; | |
| } | |
| private format(...args: any[]) { | |
| return args.map(o => { | |
| if (o instanceof Error) { | |
| return [ | |
| "", | |
| '-------------------------------------------------------', | |
| `${o.name} - ${o.message}`, | |
| '-------------------------------------------------------', | |
| `${o.stack || 'NO STACK'}`, | |
| "" | |
| ].map(l => colors.red(l)).join('\n'); | |
| } else if (typeof o === 'string') { | |
| return o; | |
| } else { | |
| return util.inspect(o, { depth: 20 }); | |
| } | |
| }).join(' '); | |
| } | |
| print(type: ConsoleType): (...args: any[]) => void { | |
| return (...args) => { | |
| const output = this.format(...args); | |
| const color = this.types[type]; | |
| for (const line of output.split('\n')) { | |
| process.stdout.write(`${this.date}${this.name}${ color ? colors[color](line) : line }\n`); | |
| } | |
| }; | |
| } | |
| static attach(name?: string) { | |
| const logger = new Log(name); | |
| console.log = logger.print("out"); | |
| console.info = logger.print("info"); | |
| console.error = logger.print("error"); | |
| } | |
| } | |
| export const c = { | |
| __log: (args: any[], opts: { | |
| color?: colors.Color, | |
| colors?: boolean, | |
| } = {}) => { | |
| const inspectOpts = (opts.colors !== undefined) | |
| ? { depth: 20, compact: false, breakLength: Infinity, colors: opts.colors } | |
| : { depth: 20, compact: false, breakLength: Infinity, colors: true } | |
| ; | |
| const s = args.map(o => { | |
| if (o instanceof Error) { | |
| // return colors.red(`${o.name}: ${o.message}\n${o.stack}`); | |
| return (o.stack || `${o.name}: ${o.message}`) | |
| .split('\n') | |
| .map(x => colors.red(x)) | |
| .join('\n') | |
| ; | |
| } else if (typeof o === 'string') { | |
| return o; | |
| } else { | |
| return util.inspect(o, inspectOpts); | |
| } | |
| }).join(' '); | |
| console.log(opts.color ? opts.color(s) : s); | |
| }, | |
| log: (...args: any[]) => { | |
| c.__log(args); | |
| }, | |
| debug: (...args: any[]) => { | |
| c.__log(args, { color: colors.gray, colors: false }); | |
| }, | |
| success: (...args: any[]) => { | |
| c.__log(args, { color: colors.green }); | |
| }, | |
| error: (...args: any[]) => { | |
| c.__log(args, { color: colors.red }); | |
| }, | |
| info: (...args: any[]) => { | |
| c.__log(args, { color: colors.cyan }); | |
| }, | |
| introspect: (...args: any[]) => { | |
| c.__log(args.map(a => [ | |
| a, | |
| typeof a, | |
| a.constructor.name, | |
| ])); | |
| }, | |
| } | |