@@ -38,8 +38,12 @@ import 'core-js';
38
38
// const componentActionsRecord = require('./masterState');
39
39
40
40
import {
41
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
42
- Snapshot , Mode , ComponentData , HookStates , Fiber
41
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
42
+ Snapshot ,
43
+ Mode ,
44
+ ComponentData ,
45
+ HookStates ,
46
+ Fiber ,
43
47
} from './types/backendTypes' ;
44
48
import Tree from './tree' ;
45
49
import componentActionsRecord from './masterState' ;
@@ -55,7 +59,7 @@ let doWork = true;
55
59
const circularComponentTable = new Set ( ) ;
56
60
57
61
// module.exports = (snap, mode) => {
58
- export default ( snap : Snapshot , mode : Mode ) : ( ) => void => {
62
+ export default ( snap : Snapshot , mode : Mode ) : ( ( ) => void ) => {
59
63
let fiberRoot = null ;
60
64
61
65
function sendSnapshot ( ) : void {
@@ -65,33 +69,44 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
65
69
if ( ! snap . tree ) {
66
70
snap . tree = new Tree ( 'root' , 'root' ) ;
67
71
}
68
- const payload = snap . tree . cleanTreeCopy ( ) ; // snap.tree.getCopy();
72
+ const payload = snap . tree . cleanTreeCopy ( ) ; // snap.tree.getCopy();
69
73
70
- window . postMessage ( {
71
- action : 'recordSnap' ,
72
- payload,
73
- } , '*' ) ;
74
+ window . postMessage (
75
+ {
76
+ action : 'recordSnap' ,
77
+ payload,
78
+ } ,
79
+ '*'
80
+ ) ;
74
81
}
75
82
76
83
// Injects instrumentation to update our state tree every time
77
84
// a hooks component changes state
78
85
function traverseHooks ( memoizedState : any ) : HookStates {
79
86
const hooksStates : HookStates = [ ] ;
80
87
while ( memoizedState && memoizedState . queue ) {
81
- if ( memoizedState . memoizedState && memoizedState . queue . lastRenderedReducer && memoizedState . queue . lastRenderedReducer . name === 'basicStateReducer' ) {
88
+ if (
89
+ memoizedState . memoizedState &&
90
+ memoizedState . queue . lastRenderedReducer &&
91
+ memoizedState . queue . lastRenderedReducer . name === 'basicStateReducer'
92
+ ) {
82
93
hooksStates . push ( {
83
94
component : memoizedState . queue ,
84
95
state : memoizedState . memoizedState ,
85
96
} ) ;
86
97
}
87
- memoizedState = memoizedState . next !== memoizedState
88
- ? memoizedState . next : null ;
98
+ memoizedState =
99
+ memoizedState . next !== memoizedState ? memoizedState . next : null ;
89
100
}
90
101
return hooksStates ;
91
102
}
92
103
93
104
// This runs after every Fiber commit. It creates a new snapshot
94
- function createTree ( currentFiber : Fiber , tree : Tree = new Tree ( 'root' , 'root' ) , fromSibling = false ) {
105
+ function createTree (
106
+ currentFiber : Fiber ,
107
+ tree : Tree = new Tree ( 'root' , 'root' ) ,
108
+ fromSibling = false
109
+ ) {
95
110
// Base case: child or sibling pointed to null
96
111
if ( ! currentFiber ) return null ;
97
112
if ( ! tree ) return tree ;
@@ -103,6 +118,7 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
103
118
stateNode,
104
119
child,
105
120
memoizedState,
121
+ memoizedProps,
106
122
elementType,
107
123
tag,
108
124
actualDuration,
@@ -111,38 +127,116 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
111
127
treeBaseDuration,
112
128
} = currentFiber ;
113
129
114
- let newState : any | { hooksState ?: any [ ] } = { } ;
130
+ let newState : any | { hooksState ?: any [ ] } = { } ;
115
131
let componentData : {
116
- hooksState ?: any [ ] ,
117
- hooksIndex ?: number ,
118
- index ?: number ,
119
- actualDuration ?: number ,
120
- actualStartTime ?: number ,
121
- selfBaseDuration ?: number ,
122
- treeBaseDuration ?: number } = { } ;
132
+ hooksState ?: any [ ] ;
133
+ hooksIndex ?: number ;
134
+ index ?: number ;
135
+ actualDuration ?: number ;
136
+ actualStartTime ?: number ;
137
+ selfBaseDuration ?: number ;
138
+ treeBaseDuration ?: number ;
139
+ } = { } ;
123
140
let componentFound = false ;
124
141
125
142
// Check if node is a stateful setState component
126
143
if ( stateNode && stateNode . state && ( tag === 0 || tag === 1 || tag === 2 ) ) {
127
144
// Save component's state and setState() function to our record for future
128
145
// time-travel state changing. Add record index to snapshot so we can retrieve.
129
- componentData . index = componentActionsRecord . saveNew ( stateNode . state , stateNode ) ;
146
+ componentData . index = componentActionsRecord . saveNew (
147
+ stateNode . state ,
148
+ stateNode
149
+ ) ;
130
150
newState = stateNode . state ;
131
151
componentFound = true ;
132
152
}
133
153
134
- // Check if node is a hooks useState function
135
154
let hooksIndex ;
155
+ // RECOIL
156
+ let isRecoil = false ;
157
+
158
+ if ( window [ `$recoilDebugStates` ] ) {
159
+ isRecoil = true ;
160
+ }
161
+ const atomArray = [ ] ;
162
+ // fiberRoot.current.child.child.memoizedProps.value.current
163
+ // .getState()
164
+ // .currentTree.atomValues.forEach((values, keys) => {
165
+ // console.log('keys,', keys, 'values', values.contents);
166
+ // atomArray.push(values.contents);
167
+ // });
168
+ atomArray . push ( memoizedProps )
169
+
170
+ console . log ( '1st ATOM ARRAY' , atomArray ) ;
171
+
172
+ function traverseRecoilHooks ( memoizedState : any ) : HookStates {
173
+ const hooksStates : HookStates = [ ] ;
174
+ while ( memoizedState && memoizedState . queue ) {
175
+ if (
176
+ memoizedState . memoizedState &&
177
+ memoizedState . queue . lastRenderedReducer &&
178
+ memoizedState . queue . lastRenderedReducer . name === 'basicStateReducer'
179
+ ) {
180
+ // console.log('MEM STATE', memoizedState);
181
+ hooksStates . push ( {
182
+ component : memoizedState . queue ,
183
+ state : memoizedProps ,
184
+ } ) ;
185
+ }
186
+ memoizedState =
187
+ memoizedState . next !== memoizedState ? memoizedState . next : null ;
188
+ }
189
+ return hooksStates ;
190
+ }
191
+
192
+ if (
193
+ memoizedState &&
194
+ ( tag === 0 || tag === 1 || tag === 2 || tag === 10 ) &&
195
+ isRecoil === true
196
+ ) {
197
+ if ( memoizedState . queue ) {
198
+ // Hooks states are stored as a linked list using memoizedState.next,
199
+ // so we must traverse through the list and get the states.
200
+ // We then store them along with the corresponding memoizedState.queue,
201
+ // which includes the dispatch() function we use to change their state.
202
+
203
+ const hooksStates = traverseRecoilHooks ( memoizedState ) ;
204
+ const hooksNames = getHooksNames ( elementType . toString ( ) ) ;
205
+ hooksStates . forEach ( ( state , i ) => {
206
+ hooksIndex = componentActionsRecord . saveNew (
207
+ state . state ,
208
+ state . component
209
+ ) ;
210
+ componentData . hooksIndex = hooksIndex ;
211
+ if ( newState && newState . hooksState ) {
212
+ newState . hooksState . push ( { [ hooksNames [ i ] ] : state . state } ) ;
213
+ } else if ( newState ) {
214
+ newState . hooksState = [ { [ hooksNames [ i ] ] : state . state } ] ;
215
+ } else {
216
+ newState = { hooksState : [ ] } ;
217
+ newState . hooksState . push ( { [ hooksNames [ i ] ] : state . state } ) ;
218
+ }
219
+ componentFound = true ;
220
+ } ) ;
221
+ }
222
+ }
223
+
224
+ // Check if node is a hooks useState function
225
+ //REGULAR REACT HOOKS
136
226
if ( memoizedState && ( tag === 0 || tag === 1 || tag === 2 || tag === 10 ) ) {
137
227
if ( memoizedState . queue ) {
228
+ console . log ( 'Regular Hooks' ) ;
138
229
// Hooks states are stored as a linked list using memoizedState.next,
139
230
// so we must traverse through the list and get the states.
140
231
// We then store them along with the corresponding memoizedState.queue,
141
232
// which includes the dispatch() function we use to change their state.
142
233
const hooksStates = traverseHooks ( memoizedState ) ;
143
234
const hooksNames = getHooksNames ( elementType . toString ( ) ) ;
144
235
hooksStates . forEach ( ( state , i ) => {
145
- hooksIndex = componentActionsRecord . saveNew ( state . state , state . component ) ;
236
+ hooksIndex = componentActionsRecord . saveNew (
237
+ state . state ,
238
+ state . component
239
+ ) ;
146
240
componentData . hooksIndex = hooksIndex ;
147
241
if ( newState && newState . hooksState ) {
148
242
newState . hooksState . push ( { [ hooksNames [ i ] ] : state . state } ) ;
@@ -176,13 +270,17 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
176
270
// We want to add this fiber node to the snapshot
177
271
if ( componentFound || newState === 'stateless' ) {
178
272
if ( fromSibling ) {
179
- newNode = tree . addSibling ( newState ,
273
+ newNode = tree . addSibling (
274
+ newState ,
180
275
elementType ? elementType . name : 'nameless' ,
181
- componentData ) ;
276
+ componentData
277
+ ) ;
182
278
} else {
183
- newNode = tree . addChild ( newState ,
279
+ newNode = tree . addChild (
280
+ newState ,
184
281
elementType ? elementType . name : 'nameless' ,
185
- componentData ) ;
282
+ componentData
283
+ ) ;
186
284
}
187
285
} else {
188
286
newNode = tree ;
@@ -211,6 +309,11 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
211
309
circularComponentTable . clear ( ) ;
212
310
snap . tree = createTree ( current ) ;
213
311
}
312
+
313
+ console . log ( 'Fiber' , fiberRoot . current ) ;
314
+
315
+ console . log ( 'SNAP.TREE->' , snap . tree ) ;
316
+
214
317
sendSnapshot ( ) ;
215
318
}
216
319
@@ -219,7 +322,7 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
219
322
}
220
323
221
324
return ( ) => {
222
- /* const container = document.getElementById('root');
325
+ /* const container = document.getElementById('root');
223
326
if (container._internalRoot) {
224
327
fiberRoot = container._internalRoot;
225
328
} else {
@@ -235,6 +338,8 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
235
338
const reactInstance = devTools ? devTools . renderers . get ( 1 ) : null ;
236
339
fiberRoot = devTools . getFiberRoots ( 1 ) . values ( ) . next ( ) . value ;
237
340
341
+ console . log ( 'FIBER ROOT' , fiberRoot . current ) ;
342
+
238
343
const throttledUpdateSnapshot = throttle ( updateSnapShotTree , 70 ) ;
239
344
document . addEventListener ( 'visibilitychange' , onVisibilityChange ) ;
240
345
@@ -248,7 +353,7 @@ export default (snap: Snapshot, mode: Mode): ()=>void => {
248
353
}
249
354
return original ( ...args ) ;
250
355
} ;
251
- } ( devTools . onCommitFiberRoot ) ) ;
356
+ } ) ( devTools . onCommitFiberRoot ) ;
252
357
}
253
358
254
359
throttledUpdateSnapshot ( ) ;
0 commit comments