Skip to content

Commit 5742f9b

Browse files
committed
fix: improve $inspect handling of derived objects
1 parent 187400b commit 5742f9b

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

.changeset/khaki-cooks-develop.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"svelte": patch
3+
---
4+
5+
fix: improve $inspect handling of derived objects

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ let is_raf_queued = false;
4949
let is_flushing_effect = false;
5050
// Used for $inspect
5151
export let is_batching_effect = false;
52+
let is_inspecting_signal = false;
5253

5354
// Handle effect queues
5455

@@ -136,8 +137,16 @@ export function batch_inspect(target, prop, receiver) {
136137
return Reflect.apply(value, this, arguments);
137138
} finally {
138139
is_batching_effect = previously_batching_effect;
139-
if (last_inspected_signal !== null) {
140-
for (const fn of last_inspected_signal.inspect) fn();
140+
if (last_inspected_signal !== null && !is_inspecting_signal) {
141+
const prev_inspecting_signal = is_inspecting_signal;
142+
is_inspecting_signal = true;
143+
try {
144+
for (const fn of last_inspected_signal.inspect) {
145+
fn();
146+
}
147+
} finally {
148+
is_inspecting_signal = prev_inspecting_signal;
149+
}
141150
last_inspected_signal = null;
142151
}
143152
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
/**
5+
* @type {any[]}
6+
*/
7+
let log;
8+
/**
9+
* @type {typeof console.log}}
10+
*/
11+
let original_log;
12+
13+
export default test({
14+
compileOptions: {
15+
dev: true
16+
},
17+
before_test() {
18+
log = [];
19+
original_log = console.log;
20+
console.log = (...v) => {
21+
log.push(...v);
22+
};
23+
},
24+
after_test() {
25+
console.log = original_log;
26+
},
27+
async test({ assert, target }) {
28+
const button = target.querySelector('button');
29+
30+
flushSync(() => {
31+
button?.click();
32+
});
33+
34+
assert.htmlEqual(target.innerHTML, `<button>update</button>\n1`);
35+
assert.deepEqual(log, [
36+
'init',
37+
{
38+
data: {
39+
derived: 0,
40+
list: []
41+
},
42+
derived: []
43+
},
44+
'update',
45+
{
46+
data: {
47+
derived: 0,
48+
list: [1]
49+
},
50+
derived: [1]
51+
}
52+
]);
53+
}
54+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<script context="module">
2+
const data = $state({
3+
list: [],
4+
derived: 0
5+
});
6+
7+
const derived = $derived(data.list.filter(() => true));
8+
9+
const state = {
10+
data,
11+
get derived() { return derived }
12+
};
13+
</script>
14+
15+
<script>
16+
data.list.length = 0;
17+
$inspect(state);
18+
</script>
19+
20+
<button onclick={() => (state.data.list.push(1))}>update</button>
21+
{state.data.list}

0 commit comments

Comments
 (0)