'use strict'; const Utilities = require('../utilities'); /** * Token formatter. Given a format string it will attempt to output * a message. * * @memberof Formatters * @implements IFormatter * @class Token */ module.exports = class TokenFormatter { constructor(config) { /** * The string to use as a template string. By default, any property * inside double curly braces `{{likeThis}}` will be extracted from * the object and replaced. If the object does not contain the * property, it will leave it. * * @name formatString * @instance * @memberof Formatters.Token * @type String * @default '{{message}}' */ this.formatString = '{{message}}'; /** * The regex rule to use to match the tokens. * * @name replaceRule * @instance * @memberof Formatters.Token * @type RegExp * @default /{{(.{1,255}?)}}/g */ this.replaceRule = /{{(.{1,255}?)}}/g; /** * Flag that specifies whether or not to use an isoDate when using * `_timestamp`. If false it will output the raw timestamp. * * @name isoDate * @instance * @memberof Formatters.Token * @type Boolean * @default true */ this.isoDate = true; this._ansiRe = /_ansi:.+/; Object.assign(this, config || {}); } /** * Main entry point, it will read the incoming log object and convert * all the tokens to their corresponding representation, finally * returning the string. * * @function format * @instance * @memberof Formatters.Token * @param {tCologneLog} log the log to format * @return {String} the formatted object */ format(log) { const escapeCode = String.fromCharCode(27); return this.formatString.replace(this.replaceRule, (match, token) => { if (token === '_timestamp' && this.isoDate) { const date = new Date(Number(log._timestamp) / 1000000); return date.toISOString(); } if (token.match(this._ansiRe)) { const ansiType = token.split(':')[1]; // Smartish coloring if (ansiType === '_level') { return escapeCode + Utilities.getAnsiCode(Utilities.getLevelAnsi(log._level)); } return escapeCode + Utilities.getAnsiCode(ansiType); } return log[token] || match; }); } };