Skip to content

Commit 5800847

Browse files
trueadmdummdidumm
andauthored
fix: improve $inspect handling of derived objects (#10584)
* fix: improve $inspect handling of derived objects * Update packages/svelte/src/internal/client/runtime.js Co-authored-by: Simon H <[email protected]> --------- Co-authored-by: Simon H <[email protected]>
1 parent 29890bb commit 5800847

File tree

4 files changed

+90
-2
lines changed

4 files changed

+90
-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: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ let is_micro_task_queued = false;
4343
let is_flushing_effect = false;
4444
// Used for $inspect
4545
export let is_batching_effect = false;
46+
let is_inspecting_signal = false;
4647

4748
// Handle effect queues
4849

@@ -130,8 +131,15 @@ export function batch_inspect(target, prop, receiver) {
130131
return Reflect.apply(value, this, arguments);
131132
} finally {
132133
is_batching_effect = previously_batching_effect;
133-
if (last_inspected_signal !== null) {
134-
for (const fn of last_inspected_signal.inspect) fn();
134+
if (last_inspected_signal !== null && !is_inspecting_signal) {
135+
is_inspecting_signal = true;
136+
try {
137+
for (const fn of last_inspected_signal.inspect) {
138+
fn();
139+
}
140+
} finally {
141+
is_inspecting_signal = false;
142+
}
135143
last_inspected_signal = null;
136144
}
137145
}
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)