From d3c68fd2fc7a126c9f46860d57323cf063c57fc1 Mon Sep 17 00:00:00 2001 From: Ivan Tanev Date: Tue, 15 Sep 2020 13:45:09 +0300 Subject: [PATCH] Better prerender crash message when error originates in node_modules/ --- packages/cli/lib/lib/webpack/prerender.js | 40 +++++++++++++++-------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/cli/lib/lib/webpack/prerender.js b/packages/cli/lib/lib/webpack/prerender.js index 2c2024325..13946b16d 100644 --- a/packages/cli/lib/lib/webpack/prerender.js +++ b/packages/cli/lib/lib/webpack/prerender.js @@ -5,7 +5,7 @@ const stackTrace = require('stack-trace'); const URL = require('url'); const { SourceMapConsumer } = require('source-map'); -module.exports = function(env, params) { +module.exports = function (env, params) { params = params || {}; let entry = resolve(env.dest, './ssr-build/ssr-bundle.js'); @@ -33,7 +33,9 @@ module.exports = function(env, params) { )); return renderToString(preact.h(app, { ...params, url })); } catch (err) { - let stack = stackTrace.parse(err).filter(s => s.getFileName() === entry)[0]; + let stack = stackTrace + .parse(err) + .filter((s) => s.getFileName() === entry)[0]; if (!stack) { throw err; } @@ -55,13 +57,13 @@ async function handlePrerenderError(err, env, stack, entry) { } if (sourceMapContent) { - await SourceMapConsumer.with(sourceMapContent, null, consumer => { + await SourceMapConsumer.with(sourceMapContent, null, (consumer) => { position = consumer.originalPositionFor({ line: stack.getLineNumber(), column: stack.getColumnNumber(), }); }); - + if (position.source) { position.source = position.source .replace('webpack://', '.') @@ -101,17 +103,29 @@ async function handlePrerenderError(err, env, stack, entry) { process.stderr.write('\n'); process.stderr.write(red(`${errorMessage}\n`)); - process.stderr.write(`method: ${methodName}\n`); - if (sourceMapContent) { + // check if we have methodName (ie, the error originated in user code) + if (methodName) { + process.stderr.write(`method: ${methodName}\n`); + if (sourceMapContent & sourceCodeHighlight) { + process.stderr.write( + `at: ${sourcePath}:${position.line}:${position.column}\n` + ); + process.stderr.write('\n'); + process.stderr.write('Source code:\n\n'); + process.stderr.write(sourceCodeHighlight); + process.stderr.write('\n'); + } else { + process.stderr.write('\n'); + process.stderr.write('Stack:\n\n'); + process.stderr.write(JSON.stringify(stack, null, 4) + '\n'); + } + } else { process.stderr.write( - `at: ${sourcePath}:${position.line}:${position.column}\n` + yellow( + 'Cannot determine error position. This most likely means it originated in node_modules.' + ) ); - process.stderr.write('\n'); - process.stderr.write('Source code:\n\n'); - process.stderr.write(sourceCodeHighlight); - process.stderr.write('\n'); - } else { - process.stderr.write(stack.toString() + '\n'); + process.stderr.write('\n\n'); } process.stderr.write( `This ${