From e1a783171104c6487a6627a73581060c3fa381cc Mon Sep 17 00:00:00 2001 From: tanhauhau Date: Sun, 17 Jul 2022 23:46:44 +0800 Subject: [PATCH] set auto-subscription to undefined when update store to falsy value --- src/compiler/compile/render_dom/index.ts | 2 +- src/runtime/internal/utils.ts | 9 +++++++++ test/runtime/samples/store-resubscribe-d/_config.js | 13 +++++++++++++ .../runtime/samples/store-resubscribe-d/main.svelte | 6 ++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/runtime/samples/store-resubscribe-d/_config.js create mode 100644 test/runtime/samples/store-resubscribe-d/main.svelte diff --git a/src/compiler/compile/render_dom/index.ts b/src/compiler/compile/render_dom/index.ts index 5fdac9bce4..ff3dbffbf8 100644 --- a/src/compiler/compile/render_dom/index.ts +++ b/src/compiler/compile/render_dom/index.ts @@ -434,7 +434,7 @@ export default function dom( const subscribe = `$$subscribe_${name}`; const i = renderer.context_lookup.get($name).index; - return b`let ${$name}, ${unsubscribe} = @noop, ${subscribe} = () => (${unsubscribe}(), ${unsubscribe} = @subscribe(${name}, $$value => $$invalidate(${i}, ${$name} = $$value)), ${name})`; + return b`let ${$name}, ${unsubscribe} = @noop, ${subscribe} = () => (${unsubscribe}(), ${unsubscribe} = @subscribe_dynamic_store(${name}, $$value => $$invalidate(${i}, ${$name} = $$value)), ${name})`; } return b`let ${$name};`; diff --git a/src/runtime/internal/utils.ts b/src/runtime/internal/utils.ts index 8868e38ee2..83369bbf33 100644 --- a/src/runtime/internal/utils.ts +++ b/src/runtime/internal/utils.ts @@ -72,6 +72,15 @@ export function subscribe(store, ...callbacks) { return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; } +export function subscribe_dynamic_store(store, callback) { + if (store == null) { + callback(undefined); + return noop; + } + const unsub = store.subscribe(callback); + return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; +} + export function get_store_value(store: Readable): T { let value; subscribe(store, _ => value = _)(); diff --git a/test/runtime/samples/store-resubscribe-d/_config.js b/test/runtime/samples/store-resubscribe-d/_config.js new file mode 100644 index 0000000000..14337d7b75 --- /dev/null +++ b/test/runtime/samples/store-resubscribe-d/_config.js @@ -0,0 +1,13 @@ +import { writable } from 'svelte/store'; + +export default { + html: '31', + async test({ assert, component, target, window }) { + component.store = undefined; + + assert.htmlEqual(target.innerHTML, 'undefined'); + + component.store = writable(42); + assert.htmlEqual(target.innerHTML, '42'); + } +}; diff --git a/test/runtime/samples/store-resubscribe-d/main.svelte b/test/runtime/samples/store-resubscribe-d/main.svelte new file mode 100644 index 0000000000..a6319c485d --- /dev/null +++ b/test/runtime/samples/store-resubscribe-d/main.svelte @@ -0,0 +1,6 @@ + + +{$store}