@@ -64,7 +64,7 @@ let current_dependencies = null;
64
64
let current_dependencies_index = 0 ;
65
65
/** @type {null | import('./types.js').Signal[] } */
66
66
let current_untracked_writes = null ;
67
- /** @type {null | import('./types.js').Signal } */
67
+ /** @type {null | import('./types.js').SignalDebug } */
68
68
let last_inspected_signal = null ;
69
69
/** If `true`, `get`ting the signal should not register it as a dependency */
70
70
export let current_untracking = false ;
@@ -81,7 +81,7 @@ let captured_signals = new Set();
81
81
/** @type {Function | null } */
82
82
let inspect_fn = null ;
83
83
84
- /** @type {Array<import('./types.js').SourceSignal & import('./types.js').SourceSignalDebug > } */
84
+ /** @type {Array<import('./types.js').SignalDebug > } */
85
85
let inspect_captured_signals = [ ] ;
86
86
87
87
// Handle rendering tree blocks and anchors
@@ -127,7 +127,6 @@ export function batch_inspect(target, prop, receiver) {
127
127
} finally {
128
128
is_batching_effect = previously_batching_effect ;
129
129
if ( last_inspected_signal !== null ) {
130
- // @ts -expect-error
131
130
for ( const fn of last_inspected_signal . inspect ) fn ( ) ;
132
131
last_inspected_signal = null ;
133
132
}
@@ -737,8 +736,7 @@ function update_derived(signal, force_schedule) {
737
736
738
737
// @ts -expect-error
739
738
if ( DEV && signal . inspect && force_schedule ) {
740
- // @ts -expect-error
741
- for ( const fn of signal . inspect ) fn ( ) ;
739
+ for ( const fn of /** @type {import('./types.js').SignalDebug } */ ( signal ) . inspect ) fn ( ) ;
742
740
}
743
741
}
744
742
}
@@ -841,8 +839,7 @@ export function unsubscribe_on_destroy(stores) {
841
839
export function get ( signal ) {
842
840
// @ts -expect-error
843
841
if ( DEV && signal . inspect && inspect_fn ) {
844
- // @ts -expect-error
845
- signal . inspect . add ( inspect_fn ) ;
842
+ /** @type {import('./types.js').SignalDebug } */ ( signal ) . inspect . add ( inspect_fn ) ;
846
843
// @ts -expect-error
847
844
inspect_captured_signals . push ( signal ) ;
848
845
}
@@ -1111,10 +1108,9 @@ export function set_signal_value(signal, value) {
1111
1108
// @ts -expect-error
1112
1109
if ( DEV && signal . inspect ) {
1113
1110
if ( is_batching_effect ) {
1114
- last_inspected_signal = signal ;
1111
+ last_inspected_signal = /** @type { import('./types.js').SignalDebug } */ ( signal ) ;
1115
1112
} else {
1116
- // @ts -expect-error
1117
- for ( const fn of signal . inspect ) fn ( ) ;
1113
+ for ( const fn of /** @type {import('./types.js').SignalDebug } */ ( signal ) . inspect ) fn ( ) ;
1118
1114
}
1119
1115
}
1120
1116
}
@@ -1836,6 +1832,37 @@ function deep_read(value, visited = new Set()) {
1836
1832
}
1837
1833
}
1838
1834
1835
+ /**
1836
+ * Like `unstate`, but recursively traverses into normal arrays/objects to find potential states in them.
1837
+ * @param {any } value
1838
+ * @param {Map<any, any> } visited
1839
+ * @returns {any }
1840
+ */
1841
+ function deep_unstate ( value , visited = new Map ( ) ) {
1842
+ if ( typeof value === 'object' && value !== null && ! visited . has ( value ) ) {
1843
+ const unstated = unstate ( value ) ;
1844
+ if ( unstated !== value ) {
1845
+ visited . set ( value , unstated ) ;
1846
+ return unstated ;
1847
+ }
1848
+
1849
+ let contains_unstated = false ;
1850
+ /** @type {any } */
1851
+ const nested_unstated = Array . isArray ( value ) ? [ ] : { } ;
1852
+ for ( let key in value ) {
1853
+ const result = deep_unstate ( value [ key ] , visited ) ;
1854
+ nested_unstated [ key ] = result ;
1855
+ if ( result !== value [ key ] ) {
1856
+ contains_unstated = true ;
1857
+ }
1858
+ }
1859
+
1860
+ visited . set ( value , contains_unstated ? nested_unstated : value ) ;
1861
+ }
1862
+
1863
+ return visited . get ( value ) ?? value ;
1864
+ }
1865
+
1839
1866
// TODO remove in a few versions, before 5.0 at the latest
1840
1867
let warned_inspect_changed = false ;
1841
1868
@@ -1849,7 +1876,7 @@ export function inspect(get_value, inspect = console.log) {
1849
1876
1850
1877
pre_effect ( ( ) => {
1851
1878
const fn = ( ) => {
1852
- const value = get_value ( ) . map ( unstate ) ;
1879
+ const value = get_value ( ) . map ( ( v ) => deep_unstate ( v ) ) ;
1853
1880
if ( value . length === 2 && typeof value [ 1 ] === 'function' && ! warned_inspect_changed ) {
1854
1881
// eslint-disable-next-line no-console
1855
1882
console . warn (
0 commit comments