1
1
// This file consistently uses `let` keyword instead of `const` for reducing the bundle size.
2
2
3
3
// Global variables - aliasing some builtin symbols to reduce the bundle size.
4
- let protoOf = Object . getPrototypeOf
4
+ let object = Object , protoOf = object . getPrototypeOf
5
5
let changedStates , derivedStates , curDeps , curNewDerives , alwaysConnectedDom = { isConnected : 1 }
6
6
let gcCycleInMs = 1000 , statesToGc , propSetterCache = { }
7
- let objProto = protoOf ( alwaysConnectedDom ) , funcProto = protoOf ( protoOf ) , _undefined
7
+ let objProto = protoOf ( alwaysConnectedDom ) , funcProto = protoOf ( protoOf ) , _undefined , remove = 'remove' , evl = 'eventListener' , st = Set , dc = document
8
8
9
9
let addAndScheduleOnFirst = ( set , s , f , waitMs ) =>
10
- ( set ?? ( setTimeout ( f , waitMs ) , new Set ) ) . add ( s )
10
+ ( set ?? ( setTimeout ( f , waitMs ) , new st ) ) . add ( s )
11
11
12
12
let runAndCaptureDeps = ( f , deps , arg ) => {
13
13
let prevDeps = curDeps
@@ -62,10 +62,10 @@ let state = initVal => ({
62
62
} )
63
63
64
64
let bind = ( f , dom ) => {
65
- let deps = { _getters : new Set , _setters : new Set } , binding = { f} , prevNewDerives = curNewDerives
65
+ let deps = { _getters : new st , _setters : new st } , binding = { f} , prevNewDerives = curNewDerives
66
66
curNewDerives = [ ]
67
67
let newDom = runAndCaptureDeps ( f , deps , dom )
68
- newDom = ( newDom ?? document ) . nodeType ? newDom : new Text ( newDom )
68
+ newDom = ( newDom ?? dc ) . nodeType ? newDom : new Text ( newDom )
69
69
for ( let d of deps . _getters )
70
70
deps . _setters . has ( d ) || ( addStatesToGc ( d ) , d . _bindings . push ( binding ) )
71
71
for ( let l of curNewDerives ) l . _dom = newDom
@@ -74,7 +74,7 @@ let bind = (f, dom) => {
74
74
}
75
75
76
76
let derive = ( f , s = state ( ) , dom ) => {
77
- let deps = { _getters : new Set , _setters : new Set } , listener = { f, s}
77
+ let deps = { _getters : new st , _setters : new st } , listener = { f, s}
78
78
listener . _dom = dom ?? curNewDerives ?. push ( listener ) ?? alwaysConnectedDom
79
79
s . val = runAndCaptureDeps ( f , deps , s . rawVal )
80
80
for ( let d of deps . _getters )
@@ -83,7 +83,7 @@ let derive = (f, s = state(), dom) => {
83
83
}
84
84
85
85
let add = ( dom , ...children ) => {
86
- for ( let c of children . flat ( Infinity ) ) {
86
+ for ( let c of children . flat ( 1 / 0 ) ) {
87
87
let protoOfC = protoOf ( c ?? 0 )
88
88
let child = protoOfC === stateProto ? bind ( ( ) => c . val ) :
89
89
protoOfC === funcProto ? bind ( c ) : c
@@ -94,41 +94,41 @@ let add = (dom, ...children) => {
94
94
95
95
let tag = ( ns , name , ...args ) => {
96
96
let [ props , ...children ] = protoOf ( args [ 0 ] ?? 0 ) === objProto ? args : [ { } , ...args ]
97
- let dom = ns ? document . createElementNS ( ns , name ) : document . createElement ( name )
98
- for ( let [ k , v ] of Object . entries ( props ) ) {
97
+ let dom = dc [ 'createElement' + ns && 'NS' ] ( ns || name , name )
98
+ for ( let [ k , v ] of object . entries ( props ) ) {
99
99
let getPropDescriptor = proto => proto ?
100
- Object . getOwnPropertyDescriptor ( proto , k ) ?? getPropDescriptor ( protoOf ( proto ) ) :
100
+ object . getOwnPropertyDescriptor ( proto , k ) ?? getPropDescriptor ( protoOf ( proto ) ) :
101
101
_undefined
102
102
let cacheKey = name + "," + k
103
103
let propSetter = propSetterCache [ cacheKey ] ??= getPropDescriptor ( protoOf ( dom ) ) ?. set ?? 0
104
- let setter = k . startsWith ( "on" ) ?
104
+ let on = k . startsWith ( "on" ) , setter = on ?
105
105
( v , oldV ) => {
106
106
let event = k . slice ( 2 )
107
- dom . removeEventListener ( event , oldV )
108
- dom . addEventListener ( event , v )
107
+ dom [ remove + evl ] ( event , oldV )
108
+ dom [ 'add' + evl ] ( event , v )
109
109
} :
110
110
propSetter ? propSetter . bind ( dom ) : dom . setAttribute . bind ( dom , k )
111
111
let protoOfV = protoOf ( v ?? 0 )
112
- k . startsWith ( "on" ) || protoOfV === funcProto && ( v = derive ( v ) , protoOfV = stateProto )
112
+ on || protoOfV === funcProto && ( v = derive ( v ) , protoOfV = stateProto )
113
113
protoOfV === stateProto ? bind ( ( ) => ( setter ( v . val , v . _oldVal ) , dom ) ) : setter ( v )
114
114
}
115
115
return add ( dom , children )
116
116
}
117
117
118
118
let handler = ns => ( { get : ( _ , name ) => tag . bind ( _undefined , ns , name ) } )
119
119
120
- let update = ( dom , newDom ) => newDom ? newDom !== dom && dom . replaceWith ( newDom ) : dom . remove ( )
120
+ let update = ( dom , newDom ) => newDom === dom || dom [ newDom ? 'replaceWith' : remove ] ( newDom )
121
121
122
122
let updateDoms = ( ) => {
123
123
let iter = 0 , derivedStatesArray = [ ...changedStates ] . filter ( s => s . rawVal !== s . _oldVal )
124
124
do {
125
- derivedStates = new Set
126
- for ( let l of new Set ( derivedStatesArray . flatMap ( s => s . _listeners = keepConnected ( s . _listeners ) ) ) )
125
+ derivedStates = new st
126
+ for ( let l of new st ( derivedStatesArray . flatMap ( s => s . _listeners = keepConnected ( s . _listeners ) ) ) )
127
127
derive ( l . f , l . s , l . _dom ) , l . _dom = _undefined
128
128
} while ( ++ iter < 100 && ( derivedStatesArray = [ ...derivedStates ] ) . length )
129
129
let changedStatesArray = [ ...changedStates ] . filter ( s => s . rawVal !== s . _oldVal )
130
130
changedStates = _undefined
131
- for ( let b of new Set ( changedStatesArray . flatMap ( s => s . _bindings = keepConnected ( s . _bindings ) ) ) )
131
+ for ( let b of new st ( changedStatesArray . flatMap ( s => s . _bindings = keepConnected ( s . _bindings ) ) ) )
132
132
update ( b . _dom , bind ( b . f , b . _dom ) ) , b . _dom = _undefined
133
133
for ( let s of changedStatesArray ) s . _oldVal = s . rawVal
134
134
}
0 commit comments