@ -1,15 +1,47 @@
import { has_prop } from './utils' ;
// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM
// at the end of hydration without touching the remaining nodes.
let is_hydrating = false ;
const nodes_to_detach = new Set < Node > ( ) ;
export function start_hydrating() {
is_hydrating = true ;
}
export function end_hydrating() {
is_hydrating = false ;
for ( const node of nodes_to_detach ) {
node . parentNode . removeChild ( node ) ;
}
nodes_to_detach . clear ( ) ;
}
export function append ( target : Node , node : Node ) {
if ( is_hydrating ) {
nodes_to_detach . delete ( node ) ;
}
if ( node . parentNode !== target ) {
target . appendChild ( node ) ;
}
}
export function insert ( target : Node , node : Node , anchor? : Node ) {
if ( is_hydrating ) {
nodes_to_detach . delete ( node ) ;
}
if ( node . parentNode !== target || ( anchor && node . nextSibling !== anchor ) ) {
target . insertBefore ( node , anchor || null ) ;
}
}
export function detach ( node : Node ) {
if ( is_hydrating ) {
nodes_to_detach . add ( node ) ;
} else if ( node . parentNode ) {
node . parentNode . removeChild ( node ) ;
}
}
export function destroy_each ( iterations , detaching ) {
@ -154,8 +186,9 @@ export function children(element) {
}
export function claim_element ( nodes , name , attributes , svg ) {
for ( let i = 0 ; i < nodes . length ; i += 1 ) {
const node = nodes [ i ] ;
while ( nodes . length > 0 ) {
const node = nodes . shift ( ) ;
if ( node . nodeName === name ) {
let j = 0 ;
const remove = [ ] ;
@ -168,7 +201,10 @@ export function claim_element(nodes, name, attributes, svg) {
for ( let k = 0 ; k < remove . length ; k ++ ) {
node . removeAttribute ( remove [ k ] ) ;
}
return nodes . splice ( i , 1 ) [ 0 ] ;
return node ;
} else {
detach ( node ) ;
}
}
@ -180,7 +216,7 @@ export function claim_text(nodes, data) {
const node = nodes [ i ] ;
if ( node . nodeType === 3 ) {
node . data = '' + data ;
return nodes . s plice( i , 1 ) [ 0 ] ;
return nodes . s hift( ) ;
}
}