diff --git a/src/compile/render-dom/index.ts b/src/compile/render-dom/index.ts index d4e73c11e3..305505df24 100644 --- a/src/compile/render-dom/index.ts +++ b/src/compile/render-dom/index.ts @@ -287,6 +287,7 @@ export default function dom( const reactive_store_subscriptions = reactive_stores.length > 0 && reactive_stores .map(name => deindent` let ${name}; + ${component.options.dev && `@validate_store(${name.slice(1)}, '${name.slice(1)}');`} $$self.$$.on_destroy.push(${name.slice(1)}.subscribe($$value => { ${name} = $$value; $$make_dirty('${name}'); })); `) .join('\n\n'); diff --git a/src/compile/render-ssr/index.ts b/src/compile/render-ssr/index.ts index 47b69bb746..51353d82f0 100644 --- a/src/compile/render-ssr/index.ts +++ b/src/compile/render-ssr/index.ts @@ -37,7 +37,13 @@ export default function ssr( } const reactive_stores = Array.from(component.template_references).filter(n => n[0] === '$'); - const reactive_store_values = reactive_stores.map(name => `const ${name} = @get_store_value(${name.slice(1)});`) + const reactive_store_values = reactive_stores.map(name => { + const assignment = `const ${name} = @get_store_value(${name.slice(1)});`; + + return component.options.dev + ? `@validate_store(${name.slice(1)}, '${name.slice(1)}'); ${assignment}` + : assignment; + }); // TODO only do this for props with a default value const parent_bindings = component.javascript diff --git a/src/internal/utils.js b/src/internal/utils.js index 55feb743e2..420a306508 100644 --- a/src/internal/utils.js +++ b/src/internal/utils.js @@ -55,4 +55,10 @@ export function safe_not_equal(a, b) { export function not_equal(a, b) { return a != a ? b == b : a !== b; +} + +export function validate_store(store, name) { + if (!store || typeof store.subscribe !== 'function') { + throw new Error(`'${name}' is not a store with a 'subscribe' method`); + } } \ No newline at end of file diff --git a/test/runtime/samples/store-dev-mode-error/_config.js b/test/runtime/samples/store-dev-mode-error/_config.js new file mode 100644 index 0000000000..70b24337fd --- /dev/null +++ b/test/runtime/samples/store-dev-mode-error/_config.js @@ -0,0 +1,11 @@ +export default { + compileOptions: { + dev: true + }, + + props: { + count: 0 + }, + + error: `'count' is not a store with a 'subscribe' method` +}; \ No newline at end of file diff --git a/test/runtime/samples/store-dev-mode-error/main.html b/test/runtime/samples/store-dev-mode-error/main.html new file mode 100644 index 0000000000..849de85acf --- /dev/null +++ b/test/runtime/samples/store-dev-mode-error/main.html @@ -0,0 +1,5 @@ + + + \ No newline at end of file