From 3f15d011ee7613ef6366e4c678943f3cb4af859b Mon Sep 17 00:00:00 2001 From: Christoph Nakazawa Date: Thu, 13 Jun 2019 16:13:47 +0100 Subject: [PATCH] Log `console` invocations to the terminal. (#426) --- .../server/middleware/MiddlewareManager.js | 2 + .../middleware/logToConsoleMiddleware.js | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 packages/cli/src/commands/server/middleware/logToConsoleMiddleware.js diff --git a/packages/cli/src/commands/server/middleware/MiddlewareManager.js b/packages/cli/src/commands/server/middleware/MiddlewareManager.js index 735554de7d..d3c222a97d 100644 --- a/packages/cli/src/commands/server/middleware/MiddlewareManager.js +++ b/packages/cli/src/commands/server/middleware/MiddlewareManager.js @@ -21,6 +21,7 @@ import getSecurityHeadersMiddleware from './getSecurityHeadersMiddleware'; import loadRawBodyMiddleware from './loadRawBodyMiddleware'; import openStackFrameInEditorMiddleware from './openStackFrameInEditorMiddleware'; import openURLMiddleware from './openURLMiddleware'; +import logToConsoleMiddleware from './logToConsoleMiddleware'; import statusPageMiddleware from './statusPageMiddleware'; import systraceProfileMiddleware from './systraceProfileMiddleware'; import getDevToolsMiddleware from './getDevToolsMiddleware'; @@ -53,6 +54,7 @@ export default class MiddlewareManager { .use('/debugger-ui', serveStatic(debuggerUIFolder)) .use(openStackFrameInEditorMiddleware(this.options)) .use(openURLMiddleware) + .use(logToConsoleMiddleware) .use(copyToClipBoardMiddleware) .use(statusPageMiddleware) .use(systraceProfileMiddleware) diff --git a/packages/cli/src/commands/server/middleware/logToConsoleMiddleware.js b/packages/cli/src/commands/server/middleware/logToConsoleMiddleware.js new file mode 100644 index 0000000000..e1e245b15a --- /dev/null +++ b/packages/cli/src/commands/server/middleware/logToConsoleMiddleware.js @@ -0,0 +1,37 @@ +'use strict'; + +import chalk from 'chalk'; + +let cache = []; +let timer; + +const log = ({level, data, id}) => { + const logFunction = level !== 'trace' && console[level] ? level : 'log'; + const color = + level === 'error' ? 'red' : level === 'warn' ? 'yellow' : 'white'; + + console[logFunction].apply(console, [ + chalk.inverse[color].bold(` ${level.toUpperCase()} `), + ...data, + ]); +}; + +// Hold messages and flush them to reduce the amount of out-of-order logs +const flush = () => { + timer = null; + cache.sort((a, b) => a.id - b.id).forEach(log); + cache = []; +}; + +export default (req, res, next) => { + if (req.url === '/log-to-console') { + cache.push(JSON.parse(req.rawBody)); + if (!timer) { + timer = setTimeout(flush, 200); + } + + res.end('OK'); + } else { + next(); + } +};