]> git.r.bdr.sh - rbdr/cologne/blobdiff - lib/formatters/token.js
Update the code.
[rbdr/cologne] / lib / formatters / token.js
diff --git a/lib/formatters/token.js b/lib/formatters/token.js
new file mode 100644 (file)
index 0000000..2ec3a17
--- /dev/null
@@ -0,0 +1,93 @@
+'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 /{{(.*)}}/g
+     */
+    this.replaceRule = /{{(.*?)}}/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;
+    });
+  }
+};