From d469f38d988a488ecd739a9ef568b18ca08c4874 Mon Sep 17 00:00:00 2001 From: Johan Roxendal Date: Mon, 24 Apr 2017 22:21:11 +0200 Subject: [PATCH] Adds generate error report from renderer and minification. Changes the behavior where generate would terminate on error, now it instead gathers the error from crashing routes and compiles an error report. --- lib/generate.js | 25 ++++++++++++++++++++++--- lib/render.js | 16 ++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/lib/generate.js b/lib/generate.js index a080e89509..1c077bdd96 100644 --- a/lib/generate.js +++ b/lib/generate.js @@ -41,6 +41,7 @@ const defaults = { export default function () { const s = Date.now() + let errors = [] /* ** Set variables */ @@ -97,14 +98,26 @@ export default function () { yield routes.splice(0, 500).map((route) => { return co(function * () { yield waitFor(n++ * self.options.generate.interval) - var { html } = yield self.renderRoute(route, { _generate: true }) - html = minify(html, self.options.generate.minify) + var { html, error } = yield self.renderRoute(route, { _generate: true }) + // TODO: if error is truthy and html null, do continue + if(error) { + // console.log("error caught", error) + errors.push([route, error.errorObj]) + return + } + try { + var minifiedHtml = minify(html, self.options.generate.minify) + } catch(err) { + let minifyErr = new Error(`HTML minification failed. Make sure the route generates valid HTML. Failed HTML:\n ${html}`) + errors.push([route, minifyErr]) + return + } var path = join(route, sep, 'index.html') // /about -> /about/index.html debug('Generate file: ' + path) path = join(distPath, path) // Make sure the sub folders are created yield mkdirp(dirname(path)) - yield writeFile(path, html, 'utf8') + yield writeFile(path, minifiedHtml, 'utf8') }) }) } @@ -119,6 +132,12 @@ export default function () { .then(() => { const duration = Math.round((Date.now() - s) / 100) / 10 debug(`HTML Files generated in ${duration}s`) + + if(errors.length) { + console.error("==== Error report ==== \n" + errors.map( ([route, err]) => { + return `Route: '${route}'\n${err.stack}` + }).join("\n\n")) + } return this }) } diff --git a/lib/render.js b/lib/render.js index 5434d1c66d..8a12e602d4 100644 --- a/lib/render.js +++ b/lib/render.js @@ -96,7 +96,19 @@ export function renderRoute (url, context = {}) { // Call renderToSting from the bundleRenderer and generate the HTML (will update the context as well) const self = this return co(function * () { - let APP = yield self.renderToString(context) + try { + var APP = yield self.renderToString(context) + } catch(err) { + return { + html : null, + error : { + statusCode : 500, + message : err.message, + errorObj : err + }, + redirected: context.redirected + } + } if (!context.nuxt.serverRendered) { APP = '
' } @@ -168,4 +180,4 @@ export function renderAndGetWindow (url, opts = {}) { } }) }) -} +} \ No newline at end of file