2
2
IFiber ,
3
3
FreElement ,
4
4
FC ,
5
- Attributes ,
6
5
HTMLElementEx ,
7
6
FreNode ,
8
7
HookEffect ,
@@ -23,10 +22,10 @@ export const enum TAG {
23
22
SVG = 1 << 4 ,
24
23
DIRTY = 1 << 5 ,
25
24
MOVE = 1 << 6 ,
26
- REPLACE = 1 << 7
25
+ REPLACE = 1 << 7 ,
27
26
}
28
27
29
- export const render = ( vnode : FreElement , node : Node ) : void => {
28
+ export const render = ( vnode : FreElement , node : Node ) => {
30
29
rootFiber = {
31
30
node,
32
31
props : { children : vnode } ,
@@ -41,23 +40,24 @@ export const update = (fiber?: IFiber) => {
41
40
}
42
41
}
43
42
44
- const reconcile = ( fiber ?: IFiber ) : boolean => {
43
+ const reconcile = ( fiber ?: IFiber ) => {
45
44
while ( fiber && ! shouldYield ( ) ) fiber = capture ( fiber )
46
- if ( fiber ) return reconcile . bind ( null , fiber )
45
+ if ( fiber ) return reconcile . bind ( null , fiber ) as typeof reconcile
47
46
return null
48
47
}
49
48
50
- const memo = ( fiber ) => {
49
+ const memo = ( fiber : IFiber ) => {
51
50
if ( ( fiber . type as FC ) . memo && fiber . old ?. props ) {
52
51
let scu = ( fiber . type as FC ) . shouldUpdate || shouldUpdate
53
- if ( ! scu ( fiber . props , fiber . old . props ) ) { // fast-fix
52
+ if ( ! scu ( fiber . props , fiber . old . props ) ) {
53
+ // fast-fix
54
54
return getSibling ( fiber )
55
55
}
56
56
}
57
57
return null
58
58
}
59
59
60
- const capture = ( fiber : IFiber ) : IFiber | undefined => {
60
+ const capture = ( fiber : IFiber ) => {
61
61
fiber . isComp = isFn ( fiber . type )
62
62
if ( fiber . isComp ) {
63
63
const memoFiber = memo ( fiber )
@@ -73,7 +73,7 @@ const capture = (fiber: IFiber): IFiber | undefined => {
73
73
return sibling
74
74
}
75
75
76
- const getSibling = ( fiber ) => {
76
+ const getSibling = ( fiber ?: IFiber ) => {
77
77
while ( fiber ) {
78
78
bubble ( fiber )
79
79
if ( fiber . dirty ) {
@@ -87,7 +87,7 @@ const getSibling = (fiber) => {
87
87
return null
88
88
}
89
89
90
- const bubble = fiber => {
90
+ const bubble = ( fiber : IFiber ) => {
91
91
if ( fiber . isComp ) {
92
92
if ( fiber . hooks ) {
93
93
side ( fiber . hooks . layout )
@@ -96,40 +96,42 @@ const bubble = fiber => {
96
96
}
97
97
}
98
98
99
-
100
- const shouldUpdate = ( a , b ) => {
99
+ const shouldUpdate = (
100
+ a : Record < string , unknown > ,
101
+ b : Record < string , unknown >
102
+ ) => {
101
103
for ( let i in a ) if ( ! ( i in b ) ) return true
102
104
for ( let i in b ) if ( a [ i ] !== b [ i ] ) return true
103
105
}
104
106
105
- const updateHook = < P = Attributes > ( fiber : IFiber ) : any => {
107
+ const updateHook = ( fiber : IFiber ) => {
106
108
resetCursor ( )
107
109
currentFiber = fiber
108
- let children = ( fiber . type as FC < P > ) ( fiber . props )
110
+ let children = ( fiber . type as FC ) ( fiber . props )
109
111
reconcileChidren ( fiber , simpleVnode ( children ) )
110
112
}
111
113
112
- const updateHost = ( fiber : IFiber ) : void => {
113
- fiber . parentNode = ( getParentNode ( fiber ) as any ) || { }
114
+ const updateHost = ( fiber : IFiber ) => {
115
+ fiber . parentNode = getParentNode ( fiber ) || { }
114
116
if ( ! fiber . node ) {
115
117
if ( fiber . type === 'svg' ) fiber . lane |= TAG . SVG
116
- fiber . node = createElement ( fiber ) as HTMLElementEx
118
+ fiber . node = createElement ( fiber )
117
119
}
118
120
reconcileChidren ( fiber , fiber . props . children )
119
121
}
120
122
121
123
const simpleVnode = ( type : any ) =>
122
124
isStr ( type ) ? createText ( type as string ) : type
123
125
124
- const getParentNode = ( fiber : IFiber ) : HTMLElement | undefined => {
126
+ const getParentNode = ( fiber : IFiber ) => {
125
127
while ( ( fiber = fiber . parent ) ) {
126
128
if ( ! fiber . isComp ) return fiber . node
127
129
}
128
130
}
129
131
130
- const reconcileChidren = ( fiber : any , children : FreNode ) : void => {
132
+ const reconcileChidren = ( fiber : IFiber , children : FreNode ) => {
131
133
let aCh = fiber . kids || [ ] ,
132
- bCh = ( fiber . kids = arrayfy ( children ) as any )
134
+ bCh = ( fiber . kids = arrayfy ( children ) )
133
135
const actions = diff ( aCh , bCh )
134
136
135
137
for ( let i = 0 , prev = null , len = bCh . length ; i < len ; i ++ ) {
@@ -156,46 +158,49 @@ function clone(a, b) {
156
158
b . old = a
157
159
}
158
160
159
- export const arrayfy = arr => ( ! arr ? [ ] : isArr ( arr ) ? arr : [ arr ] )
161
+ export const arrayfy = ( arr : unknown ) => ( ! arr ? [ ] : isArr ( arr ) ? arr : [ arr ] )
160
162
161
- const side = ( effects : HookEffect [ ] ) : void => {
162
- effects . forEach ( e => e [ 2 ] && e [ 2 ] ( ) )
163
- effects . forEach ( e => ( e [ 2 ] = e [ 0 ] ( ) ) )
163
+ const side = ( effects : HookEffect [ ] ) => {
164
+ effects . forEach ( ( e ) => e [ 2 ] && e [ 2 ] ( ) )
165
+ effects . forEach ( ( e ) => ( e [ 2 ] = e [ 0 ] ( ) ) )
164
166
effects . length = 0
165
167
}
166
168
167
169
const diff = function ( a , b ) {
168
170
var actions = [ ] ,
169
171
aIdx = { } ,
170
172
bIdx = { } ,
171
- key = v => v . key + v . type ,
172
- i , j ;
173
+ key = ( v ) => v . key + v . type ,
174
+ i ,
175
+ j
173
176
for ( i = 0 ; i < a . length ; i ++ ) {
174
- aIdx [ key ( a [ i ] ) ] = i ;
177
+ aIdx [ key ( a [ i ] ) ] = i
175
178
}
176
179
for ( i = 0 ; i < b . length ; i ++ ) {
177
- bIdx [ key ( b [ i ] ) ] = i ;
180
+ bIdx [ key ( b [ i ] ) ] = i
178
181
}
179
- for ( i = j = 0 ; i !== a . length || j !== b . length ; ) {
180
- var aElm = a [ i ] , bElm = b [ j ] ;
182
+ for ( i = j = 0 ; i !== a . length || j !== b . length ; ) {
183
+ var aElm = a [ i ] ,
184
+ bElm = b [ j ]
181
185
if ( aElm === null ) {
182
- i ++ ;
186
+ i ++
183
187
} else if ( b . length <= j ) {
184
188
removeElement ( a [ i ] )
185
- i ++ ;
189
+ i ++
186
190
} else if ( a . length <= i ) {
187
191
actions . push ( { op : TAG . INSERT , elm : bElm , before : a [ i ] } )
188
- j ++ ;
192
+ j ++
189
193
} else if ( key ( aElm ) === key ( bElm ) ) {
190
194
clone ( aElm , bElm )
191
195
actions . push ( { op : TAG . UPDATE } )
192
- i ++ ; j ++ ;
196
+ i ++
197
+ j ++
193
198
} else {
194
199
var curElmInNew = bIdx [ key ( aElm ) ]
195
200
var wantedElmInOld = aIdx [ key ( bElm ) ]
196
201
if ( curElmInNew === undefined ) {
197
202
removeElement ( a [ i ] )
198
- i ++ ;
203
+ i ++
199
204
} else if ( wantedElmInOld === undefined ) {
200
205
actions . push ( { op : TAG . INSERT , elm : bElm , before : a [ i ] } )
201
206
j ++
@@ -211,6 +216,6 @@ const diff = function (a, b) {
211
216
}
212
217
213
218
export const getCurrentFiber = ( ) => currentFiber || null
214
- export const isFn = ( x : any ) : x is Function => typeof x === 'function'
215
- export const isStr = ( s : any ) : s is number | string =>
216
- typeof s === 'number' || typeof s === 'string'
219
+ export const isFn = ( x : unknown ) : x is Function => typeof x === 'function'
220
+ export const isStr = ( s : unknown ) : s is number | string =>
221
+ typeof s === 'number' || typeof s === 'string'
0 commit comments