From 61e3b6c6a079d92e4e52e8405b12f802a7f936d2 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 16 Jul 2018 14:57:49 -0400 Subject: [PATCH] handle errors in client --- src/core/create_manifests.ts | 7 ++++--- src/runtime/index.ts | 23 +++++++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/core/create_manifests.ts b/src/core/create_manifests.ts index d178fe9..42a73e8 100644 --- a/src/core/create_manifests.ts +++ b/src/core/create_manifests.ts @@ -59,6 +59,7 @@ function generate_client( let code = ` // This file is generated by Sapper — do not edit it! import root from '${posixify(`${path_to_routes}/index.html`)}'; + import error from '${posixify(`${path_to_routes}/_error.html`)}'; ${routes.components.map(component => `const ${right_pad(component.name, len)} = () => import('${posixify(`${path_to_routes}/${component.file}`)}');`) @@ -67,8 +68,6 @@ function generate_client( export const routes = { ignore: [${server_routes_to_ignore.map(route => route.pattern).join(', ')}], - root, - pages: [ ${routes.pages.map(page => `{ // ${page.parts[page.parts.length - 1].component.file} @@ -86,7 +85,9 @@ function generate_client( }`).join(',\n\n\t\t\t\t')} ], - error: () => import(/* webpackChunkName: '_error' */ '${posixify(`${path_to_routes}/_error.html`)}') + root, + + error };`.replace(/^\t\t/gm, '').trim(); if (dev()) { diff --git a/src/runtime/index.ts b/src/runtime/index.ts index 21a885b..f2d1293 100644 --- a/src/runtime/index.ts +++ b/src/runtime/index.ts @@ -123,10 +123,6 @@ function prepare_page(target: Target): Promise<{ error = { statusCode: 500, message: err }; return []; }).then(results => { - if (error) { - console.error('TODO', error); - } - if (redirect) { return { redirect }; } @@ -134,6 +130,25 @@ function prepare_page(target: Target): Promise<{ const get_params = page.parts[page.parts.length - 1].params || (() => ({})); const params = get_params(target.match); + if (error) { + const props = { + path, + query, + params, + error: typeof error.message === 'string' ? new Error(error.message) : error.message, + status: error.statusCode + }; + + return { + data: Object.assign({}, props, { + child: { + component: routes.error, + props + } + }) + }; + } + // TODO skip unchanged segments const props = { path, query }; const data = { path, query, params, child: {} };