diff --git a/package.json b/package.json index b973c0e..a197ba1 100644 --- a/package.json +++ b/package.json @@ -40,21 +40,21 @@ "ci.coverage": "nyc report --reporter=text-lcov | coveralls" }, "devDependencies": { - "@hapi/hapi": ">=18.4", - "ava": "^3.4.0", - "coveralls": "^3.0.9", + "@hapi/hapi": ">=19.1", + "ava": "^3.7.0", + "coveralls": "^3.0.11", "fixture-stdout": "^0.2.1", - "nyc": "^15.0.0", - "standard": "^14.3.1" + "nyc": "^15.0.1", + "standard": "^14.3.3" }, "dependencies": { - "@hapi/joi": "^17.0.0", - "chalk": "^3.0.0", + "@hapi/joi": "^17.1.1", + "colors": "^1.4.0", "error-stack-parser": "^2.0.6", - "hapi-pino": "^6.3.0", + "hapi-pino": "^8.0.0", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", - "pino": "^5.15.0" + "pino": "^6.2.0" }, "peerDependencies": { "@hapi/hapi": ">=18.4" diff --git a/src/colors.js b/src/colors.js index b1b49f8..ccc48d7 100644 --- a/src/colors.js +++ b/src/colors.js @@ -1,4 +1,4 @@ -const chalk = require('chalk') +const chalk = require('colors') const utils = require('./utils') /** @@ -65,7 +65,7 @@ function getStatusColor (data, basic = false) { * @returns {number | Function} The index or the related builder function */ function getLevelColor ({ level }, basic = false) { - const range = parseInt((level / 10) - 1) + const range = parseInt(level / 10 - 1) return basic ? range : levelColors[range] || utils.noop } diff --git a/src/logger.js b/src/logger.js index 95ca5d5..8dc846a 100644 --- a/src/logger.js +++ b/src/logger.js @@ -1,5 +1,6 @@ const hapiPino = require('hapi-pino') const pino = require('pino') +const chalk = require('colors') const colors = require('./colors') const formats = require('./formats') const tokens = require('./tokens') @@ -38,7 +39,9 @@ function compile (format, tokens, isJSON, space, data) { const js = format.replace(re, (m, name, arg) => { const tokenArgs = 'Array.prototype.slice.call(arguments).slice(4)' - const output = `tokens[${utils.stringify(name)}](...(${tokenArgs}), ${utils.stringify(arg)})` + const output = `tokens[${utils.stringify( + name + )}](...(${tokenArgs}), ${utils.stringify(arg)})` const template = `${output} == null ? '-' : ${output}` const token = tokens[name] @@ -78,11 +81,31 @@ function getLoggerConfig (options) { prettifier: () => (data) => { const format = formats.get(data) const isJSON = utils.isJSON(format) - const pictor = colors.get(data, isJSON || !options.colored) + const disableColor = isJSON || !options.colored - const preprocessed = validator('preformatterOutput', options.preformatter(data, options)) - const processed = compile(format, tokens, isJSON, options.indent, preprocessed, pictor) - const postprocessed = validator('postformatterOutput', options.postformatter(processed, options)) + if (disableColor) { + chalk.disable() + } else { + chalk.enable() + } + + const pictor = colors.get(data, disableColor) + const preprocessed = validator( + 'preformatterOutput', + options.preformatter(data, options) + ) + const processed = compile( + format, + tokens, + isJSON, + options.indent, + preprocessed, + pictor + ) + const postprocessed = validator( + 'postformatterOutput', + options.postformatter(processed, options) + ) return `${postprocessed}\n` } diff --git a/src/validator.js b/src/validator.js index 3201855..2d2e83e 100644 --- a/src/validator.js +++ b/src/validator.js @@ -7,67 +7,55 @@ const joi = require('@hapi/joi') * Collection of `Joi` validators */ const validators = { - formatLabel: joi.string().valid('log', 'request', 'response', 'request-error', 'onPostStart', 'onPostStop', 'uncaught'), + formatLabel: joi + .string() + .valid( + 'log', + 'request', + 'response', + 'request-error', + 'onPostStart', + 'onPostStop', + 'uncaught' + ), tokenLabel: joi.string(), format: joi.alternatives().try(joi.string(), joi.any().valid(false)), token: joi.function().maxArity(3), preformatterOutput: joi.object(), postformatterOutput: joi.string(), - options: joi.object({ - formats: joi.object().allow(null), - presets: joi.object().allow(null), - tokens: joi.object().allow(null), - colored: joi.boolean().default(false), - override: joi.boolean().default(false), - indent: joi.alternatives().try(joi.number(), joi.string()).allow('').default(2), - preformatter: joi.function().maxArity(2), - postformatter: joi.function().maxArity(2), - handleUncaught: joi.boolean().default(false), - stream: joi.object().allow(null), - hapiPino: joi.object({ + options: joi + .object({ + formats: joi.object().allow(null), + presets: joi.object().allow(null), + tokens: joi.object().allow(null), + colored: joi.boolean().default(false), + override: joi.boolean().default(false), + indent: joi + .alternatives() + .try(joi.number(), joi.string()) + .allow('') + .default(2), + preformatter: joi.function().maxArity(2), + postformatter: joi.function().maxArity(2), + handleUncaught: joi.boolean().default(false), stream: joi.object().allow(null), - prettyPrint: joi.boolean(), - tags: joi.object(), - allTags: joi.string(), - instance: joi.object(), - logEvents: joi.alternatives().try(joi.array().items(joi.string()), joi.any().allow(false, null)), - mergeHapiLogData: joi.boolean().default(false), - serializers: joi.object(), - logRouteTags: joi.boolean(), - logRequestStart: joi.boolean(), - logRequestComplete: joi.boolean(), - ignorePaths: joi.array().items(joi.string()), - ignoreTags: joi.array().items(joi.string()), - redact: joi.array().items(joi.string()), - logPayload: joi.boolean().default(true), - getChildBindings: joi.function(), - level: joi.string() - }).default(), - pino: joi.object({ - safe: joi.boolean(), - name: joi.string(), - serializers: joi.object(), - timestamp: joi.alternatives().try(joi.function(), joi.boolean()), - slowtime: joi.boolean(), - extreme: joi.boolean(), - level: joi.string(), - levelVal: joi.number(), - customLevels: joi.object(), - redact: joi.alternatives().try(joi.array(), joi.object()), - prettyPrint: joi.any(), - messageKey: joi.string().default('msg'), - changeLevelName: joi.string(), - useLevelLabels: joi.boolean(), - useOnlyCustomLevels: joi.boolean(), - onTerminated: joi.function(), - enabled: joi.boolean(), - browser: joi.any(), - nestedKey: joi.any(), - mixin: joi.any(), - base: joi.object(), - crlf: joi.boolean() - }).default() - }).default() + hapiPino: joi + .object({ + stream: joi.object().allow(null), + logEvents: joi + .alternatives() + .try(joi.array().items(joi.string()), joi.any().allow(false, null)), + mergeHapiLogData: joi.boolean().default(false), + logPayload: joi.boolean().default(true) + }) + .default(), + pino: joi + .object({ + messageKey: joi.string().default('msg') + }) + .default() + }) + .default() } /** diff --git a/test/colors.spec.js b/test/colors.spec.js index 12ad30c..005d8cb 100644 --- a/test/colors.spec.js +++ b/test/colors.spec.js @@ -1,5 +1,5 @@ const test = require('ava') -const chalk = require('chalk') +const chalk = require('colors') const helpers = require('./_helpers') const colors = require('../src/colors') @@ -33,15 +33,21 @@ test('calculate all colors correctly', (t) => { } } - t.is(JSON.stringify(colors.get(mock, true)), JSON.stringify({ - dim: helpers.noop, - level: helpers.noop, - status: helpers.noop - })) + t.is( + JSON.stringify(colors.get(mock, true)), + JSON.stringify({ + dim: helpers.noop, + level: helpers.noop, + status: helpers.noop + }) + ) - t.is(JSON.stringify(colors.get(mock)), JSON.stringify({ - dim: chalk.grey, - level: chalk.yellow, - status: chalk.red - })) + t.is( + JSON.stringify(colors.get(mock)), + JSON.stringify({ + dim: chalk.grey, + level: chalk.yellow, + status: chalk.red + }) + ) })