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