From 142f60044ec81915550e9fe6f2ec02fa84cc286b Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 26 Nov 2024 10:16:05 +0100 Subject: [PATCH 1/3] fix: show `:then` block for `null` value fixes #14439 This bug was introduced in #13642 because setting the input to `null` means the equality check ("is the input different") fails if you set the value to `null` --- .changeset/breezy-insects-live.md | 5 ++++ .../src/internal/client/dom/blocks/await.js | 7 +++--- .../samples/await-non-promise/_config.js | 23 +++++++++++++++++-- .../samples/await-non-promise/main.svelte | 17 +++++++++----- 4 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 .changeset/breezy-insects-live.md diff --git a/.changeset/breezy-insects-live.md b/.changeset/breezy-insects-live.md new file mode 100644 index 000000000000..a65f9c061627 --- /dev/null +++ b/.changeset/breezy-insects-live.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: show `:then` block for `null` value diff --git a/packages/svelte/src/internal/client/dom/blocks/await.js b/packages/svelte/src/internal/client/dom/blocks/await.js index 29ef15452fdf..334020812bf1 100644 --- a/packages/svelte/src/internal/client/dom/blocks/await.js +++ b/packages/svelte/src/internal/client/dom/blocks/await.js @@ -14,6 +14,7 @@ import { } from '../../runtime.js'; import { hydrate_next, hydrate_node, hydrating } from '../hydration.js'; import { queue_micro_task } from '../task.js'; +import { UNINITIALIZED } from '../../../../constants.js'; const PENDING = 0; const THEN = 1; @@ -40,7 +41,7 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) { /** @type {any} */ var component_function = DEV ? component_context?.function : null; - /** @type {V | Promise | null} */ + /** @type {V | Promise | typeof UNINITIALIZED} */ var input; /** @type {Effect | null} */ @@ -156,8 +157,8 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) { update(THEN, false); } - // Set the input to null, in order to disable the promise callbacks - return () => (input = null); + // Set the input to something else, in order to disable the promise callbacks + return () => (input = UNINITIALIZED); }); if (hydrating) { diff --git a/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js b/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js index 14dac303506d..7a4cd3540b40 100644 --- a/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js @@ -1,9 +1,28 @@ import { flushSync } from 'svelte'; -import { test } from '../../test'; +import { ok, test } from '../../test'; export default test({ + solo: true, compileOptions: { dev: true }, - test() {} + test({ assert, target }) { + const [btn1, btn2] = target.querySelectorAll('button'); + const p = target.querySelector('p'); + ok(p); + + assert.htmlEqual(p.outerHTML, `

0

`); + + btn1.click(); + flushSync(); + assert.htmlEqual(p.outerHTML, `

1

`); + + btn2.click(); + flushSync(); + assert.htmlEqual(p.outerHTML, `

`); + + btn1.click(); + flushSync(); + assert.htmlEqual(p.outerHTML, `

1

`); + } }); diff --git a/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte b/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte index 62881ba66666..2c5c7ee6cb66 100644 --- a/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte @@ -1,9 +1,14 @@ -{#await count} - loading -{:then count} - {count} -{/await} \ No newline at end of file + + + +

+ {#await count} + loading + {:then count} + {count} + {/await} +

From e44df3c88ceaa1d3ee20319d0c869adc4f13fd50 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 26 Nov 2024 10:21:23 +0100 Subject: [PATCH 2/3] fixes #14441 --- .changeset/breezy-insects-live.md | 2 +- packages/svelte/src/internal/client/dom/blocks/await.js | 2 +- .../tests/runtime-runes/samples/await-non-promise/_config.js | 3 +-- .../tests/runtime-runes/samples/await-non-promise/main.svelte | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.changeset/breezy-insects-live.md b/.changeset/breezy-insects-live.md index a65f9c061627..8b86fab6be88 100644 --- a/.changeset/breezy-insects-live.md +++ b/.changeset/breezy-insects-live.md @@ -2,4 +2,4 @@ 'svelte': patch --- -fix: show `:then` block for `null` value +fix: show `:then` block for `null/undefined` value diff --git a/packages/svelte/src/internal/client/dom/blocks/await.js b/packages/svelte/src/internal/client/dom/blocks/await.js index 334020812bf1..62b2e4dd0cda 100644 --- a/packages/svelte/src/internal/client/dom/blocks/await.js +++ b/packages/svelte/src/internal/client/dom/blocks/await.js @@ -42,7 +42,7 @@ export function await_block(node, get_input, pending_fn, then_fn, catch_fn) { var component_function = DEV ? component_context?.function : null; /** @type {V | Promise | typeof UNINITIALIZED} */ - var input; + var input = UNINITIALIZED; /** @type {Effect | null} */ var pending_effect; diff --git a/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js b/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js index 7a4cd3540b40..882742f73175 100644 --- a/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/await-non-promise/_config.js @@ -2,7 +2,6 @@ import { flushSync } from 'svelte'; import { ok, test } from '../../test'; export default test({ - solo: true, compileOptions: { dev: true }, @@ -11,7 +10,7 @@ export default test({ const p = target.querySelector('p'); ok(p); - assert.htmlEqual(p.outerHTML, `

0

`); + assert.htmlEqual(p.outerHTML, `

`); btn1.click(); flushSync(); diff --git a/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte b/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte index 2c5c7ee6cb66..7ff7e8ae54a9 100644 --- a/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte @@ -1,5 +1,5 @@ From 81a7698dd567a7467c66283acad93e6757b49ae4 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Tue, 26 Nov 2024 10:30:55 +0100 Subject: [PATCH 3/3] fix test --- .../tests/runtime-runes/samples/await-non-promise/main.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte b/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte index 7ff7e8ae54a9..efd05f2dd2bb 100644 --- a/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/await-non-promise/main.svelte @@ -2,7 +2,7 @@ let count = $state(); - +