Skip to content

Commit 88b9fdb

Browse files
committed
Merge branch 'main' into async
2 parents 1c66278 + cf9f8c9 commit 88b9fdb

File tree

5 files changed

+53
-3
lines changed

5 files changed

+53
-3
lines changed

packages/svelte/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# svelte
22

3+
## 5.34.9
4+
5+
### Patch Changes
6+
7+
- fix: ensure unowned deriveds can add themselves as reactions while connected ([#16249](https://github.com/sveltejs/svelte/pull/16249))
8+
39
## 5.34.8
410

511
### Patch Changes

packages/svelte/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "svelte",
33
"description": "Cybernetically enhanced web apps",
44
"license": "MIT",
5-
"version": "5.34.8",
5+
"version": "5.34.9",
66
"type": "module",
77
"types": "./types/index.d.ts",
88
"engines": {

packages/svelte/src/internal/client/runtime.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,12 @@ export function update_reaction(reaction) {
325325
reaction.deps = deps = new_deps;
326326
}
327327

328-
if (!skip_reaction) {
328+
if (
329+
!skip_reaction ||
330+
// Deriveds that already have reactions can cleanup, so we still add them as reactions
331+
((flags & DERIVED) !== 0 &&
332+
/** @type {import('#client').Derived} */ (reaction).reactions !== null)
333+
) {
329334
for (i = skipped_deps; i < deps.length; i++) {
330335
(deps[i].reactions ??= []).push(reaction);
331336
}

packages/svelte/src/version.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
* The current version, as set in package.json.
55
* @type {string}
66
*/
7-
export const VERSION = '5.34.8';
7+
export const VERSION = '5.34.9';
88
export const PUBLIC_VERSION = '5';

packages/svelte/tests/signals/test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,45 @@ describe('signals', () => {
114114
};
115115
});
116116

117+
test('unowned deriveds are not added as reactions but trigger effects', () => {
118+
var obj = state<any>(undefined);
119+
120+
class C1 {
121+
#v = state(0);
122+
get v() {
123+
return $.get(this.#v);
124+
}
125+
set v(v: number) {
126+
set(this.#v, v);
127+
}
128+
}
129+
130+
return () => {
131+
let d = derived(() => $.get(obj)?.v || '-');
132+
133+
const log: number[] = [];
134+
assert.equal($.get(d), '-');
135+
136+
let destroy = effect_root(() => {
137+
render_effect(() => {
138+
log.push($.get(d));
139+
});
140+
});
141+
142+
set(obj, new C1());
143+
flushSync();
144+
assert.equal($.get(d), '-');
145+
$.get(obj).v = 1;
146+
flushSync();
147+
assert.equal($.get(d), 1);
148+
assert.deepEqual(log, ['-', 1]);
149+
destroy();
150+
// ensure we're not leaking reactions
151+
assert.equal(obj.reactions, null);
152+
assert.equal(d.reactions, null);
153+
};
154+
});
155+
117156
test('derived from state', () => {
118157
const log: number[] = [];
119158

0 commit comments

Comments
 (0)