diff --git a/lib/generate.js b/lib/generate.js index a080e89509..b6f2827f7f 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,29 @@ 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) + try { + var { html, error } = yield self.renderRoute(route, { _generate: true }) + if(error) { + errors.push({type : "handled", route, error}) + } + } catch(err) { + errors.push({type : "unhandled", route, error : err}) + 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({type : "unhandled", route, error : 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 +135,17 @@ 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( ({type, route, error}) => { + if(type == "unhandled") { + return `Route: '${route}'\n${error.stack}` + } else { + return `Route: '${route}' returned an error via context.error: \n` + + JSON.stringify(error) + } + }).join("\n\n")) + } return this }) }