From 42579d4d6484bac76433f08a37f35560171f1146 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 21 Jul 2018 10:33:33 -0400 Subject: [PATCH] provide more helpful error if SSR component tries to render non-SSR component --- src/compile/nodes/Component.ts | 17 ++++++++++------- src/shared/ssr.js | 11 ++++++++++- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/compile/nodes/Component.ts b/src/compile/nodes/Component.ts index f65d8be4f6..60de3bcac5 100644 --- a/src/compile/nodes/Component.ts +++ b/src/compile/nodes/Component.ts @@ -564,12 +564,12 @@ export default class Component extends Node { .concat(bindingProps) .join(', ')} }`; - const isDynamicComponent = this.name === 'svelte:component'; - const expression = ( - this.name === 'svelte:self' ? this.compiler.name : - (isDynamicComponent ? `((${this.expression.snippet}) || @missingComponent)` : - `%components-${this.name}`) + this.name === 'svelte:self' + ? this.compiler.name + : this.name === 'svelte:component' + ? `((${this.expression.snippet}) || @missingComponent)` + : `%components-${this.name}` ); this.bindings.forEach(binding => { @@ -583,7 +583,10 @@ export default class Component extends Node { } } - conditions.push(`!('${binding.name}' in ctx)`); + conditions.push( + `!('${binding.name}' in ctx)`, + `${expression}.data` + ); const { name } = getObject(binding.value.node); @@ -598,7 +601,7 @@ export default class Component extends Node { `); }); - let open = `\${${expression}._render(__result, ${props}`; + let open = `\${@validateSsrComponent(${expression}, '${this.name}')._render(__result, ${props}`; const options = []; options.push(`store: options.store`); diff --git a/src/shared/ssr.js b/src/shared/ssr.js index 8381118f3e..63a5659cf4 100644 --- a/src/shared/ssr.js +++ b/src/shared/ssr.js @@ -34,4 +34,13 @@ export function each(items, assign, fn) { export const missingComponent = { _render: () => '' -}; \ No newline at end of file +}; + +export function validateSsrComponent(component, name) { + if (!component || !component._render) { + if (name === 'svelte:component') name += 'this={...}'; + throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`); + } + + return component; +} \ No newline at end of file