From 49c9d682a4015d0912b486becdde9acbfcf2d3fa Mon Sep 17 00:00:00 2001 From: Wey Date: Mon, 6 Jul 2026 23:15:54 +1200 Subject: [PATCH] fix: set correct parent for lazily created derived inside SvelteDate --- .changeset/mean-tools-tan.md | 5 ++ packages/svelte/src/reactivity/date.js | 12 +++- .../samples/reactive-date-for-each/Row.svelte | 8 +++ .../samples/reactive-date-for-each/_config.js | 16 +++++ .../reactive-date-for-each/main.svelte | 59 +++++++++++++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 .changeset/mean-tools-tan.md create mode 100644 packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/Row.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/main.svelte diff --git a/.changeset/mean-tools-tan.md b/.changeset/mean-tools-tan.md new file mode 100644 index 0000000000..86dd70b664 --- /dev/null +++ b/.changeset/mean-tools-tan.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: set correct parent for lazily created derived inside SvelteDate diff --git a/packages/svelte/src/reactivity/date.js b/packages/svelte/src/reactivity/date.js index f882c05d76..9d2cda414c 100644 --- a/packages/svelte/src/reactivity/date.js +++ b/packages/svelte/src/reactivity/date.js @@ -2,7 +2,13 @@ import { derived } from '../internal/client/index.js'; import { set, state } from '../internal/client/reactivity/sources.js'; import { tag } from '../internal/client/dev/tracing.js'; -import { active_reaction, get, set_active_reaction } from '../internal/client/runtime.js'; +import { + active_effect, + active_reaction, + get, + set_active_effect, + set_active_reaction +} from '../internal/client/runtime.js'; import { DEV } from 'esm-env'; var inited = false; @@ -46,6 +52,7 @@ export class SvelteDate extends Date { #deriveds = new Map(); #reaction = active_reaction; + #effect = active_effect; /** @param {any[]} params */ constructor(...params) { @@ -87,7 +94,9 @@ export class SvelteDate extends Date { // lazily create the derived, but as though it were being // created at the same time as the class instance const reaction = active_reaction; + const effect = active_effect; set_active_reaction(this.#reaction); + set_active_effect(this.#effect); d = derived(() => { get(this.#time); @@ -102,6 +111,7 @@ export class SvelteDate extends Date { this.#deriveds.set(method, d); set_active_reaction(reaction); + set_active_effect(effect); } return get(d); diff --git a/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/Row.svelte b/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/Row.svelte new file mode 100644 index 0000000000..b9861d8066 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/Row.svelte @@ -0,0 +1,8 @@ + + +{label} {age} + diff --git a/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/_config.js b/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/_config.js new file mode 100644 index 0000000000..96a79b6958 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/_config.js @@ -0,0 +1,16 @@ +import { flushSync } from '../../../../src/index-client'; +import { test } from '../../test'; + +export default test({ + mode: ['client'], + async test({ assert, target }) { + debugger; + assert.htmlEqual(target.innerHTML, ''); + await new Promise((r) => setTimeout(r, 110)); + assert.htmlEqual(target.innerHTML, ''); + await new Promise((r) => setTimeout(r, 110)); + assert.htmlEqual(target.innerHTML, ''); + await new Promise((r) => setTimeout(r, 110)); + assert.htmlEqual(target.innerHTML, ''); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/main.svelte b/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/main.svelte new file mode 100644 index 0000000000..ef41d925fe --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/reactive-date-for-each/main.svelte @@ -0,0 +1,59 @@ + + + \ No newline at end of file