@ -3,12 +3,13 @@ import { trimStart, trimEnd } from '../../utils/trim';
import { assign } from '../../shared/index.js' ;
import { assign } from '../../shared/index.js' ;
import { DomGenerator } from './index' ;
import { DomGenerator } from './index' ;
import { Node } from '../../interfaces' ;
import { Node } from '../../interfaces' ;
import { State } from './interfaces' ;
function isElseIf ( node : Node ) {
function isElseIf ( node : Node ) {
return node && node . children . length === 1 && node . children [ 0 ] . type === 'IfBlock' ;
return node && node . children . length === 1 && node . children [ 0 ] . type === 'IfBlock' ;
}
}
function getChildState ( parent , child = { } ) {
function getChildState ( parent : State , child = { } ) {
return assign ( { } , parent , { name : null , parentNode : null } , child || { } ) ;
return assign ( { } , parent , { name : null , parentNode : null } , child || { } ) ;
}
}
@ -27,7 +28,7 @@ const elementsWithoutText = new Set([
] ) ;
] ) ;
const preprocessors = {
const preprocessors = {
MustacheTag : ( generator : DomGenerator , block , s tate, node : Node ) = > {
MustacheTag : ( generator : DomGenerator , block : Block , s tate: S tate, node : Node ) = > {
const dependencies = block . findDependencies ( node . expression ) ;
const dependencies = block . findDependencies ( node . expression ) ;
block . addDependencies ( dependencies ) ;
block . addDependencies ( dependencies ) ;
@ -36,7 +37,7 @@ const preprocessors = {
} ) ;
} ) ;
} ,
} ,
RawMustacheTag : ( generator : DomGenerator , block , s tate, node : Node ) = > {
RawMustacheTag : ( generator : DomGenerator , block : Block , s tate: S tate, node : Node ) = > {
const dependencies = block . findDependencies ( node . expression ) ;
const dependencies = block . findDependencies ( node . expression ) ;
block . addDependencies ( dependencies ) ;
block . addDependencies ( dependencies ) ;
@ -46,7 +47,7 @@ const preprocessors = {
node . _state = getChildState ( state , { basename , name } ) ;
node . _state = getChildState ( state , { basename , name } ) ;
} ,
} ,
Text : ( generator : DomGenerator , block , s tate, node : Node ) = > {
Text : ( generator : DomGenerator , block : Block , s tate: S tate, node : Node ) = > {
node . _state = getChildState ( state ) ;
node . _state = getChildState ( state ) ;
if ( ! /\S/ . test ( node . data ) ) {
if ( ! /\S/ . test ( node . data ) ) {
@ -58,8 +59,8 @@ const preprocessors = {
node . _state . name = block . getUniqueName ( ` text ` ) ;
node . _state . name = block . getUniqueName ( ` text ` ) ;
} ,
} ,
IfBlock : ( generator : DomGenerator , block , s tate, node : Node ) = > {
IfBlock : ( generator : DomGenerator , block : Block , s tate: S tate, node : Node ) = > {
const blocks = [ ] ;
const blocks : Block [ ] = [ ] ;
let dynamic = false ;
let dynamic = false ;
let hasIntros = false ;
let hasIntros = false ;
let hasOutros = false ;
let hasOutros = false ;
@ -115,7 +116,7 @@ const preprocessors = {
generator . blocks . push ( . . . blocks ) ;
generator . blocks . push ( . . . blocks ) ;
} ,
} ,
EachBlock : ( generator : DomGenerator , block , s tate, node : Node ) = > {
EachBlock : ( generator : DomGenerator , block : Block , s tate: S tate, node : Node ) = > {
const dependencies = block . findDependencies ( node . expression ) ;
const dependencies = block . findDependencies ( node . expression ) ;
block . addDependencies ( dependencies ) ;
block . addDependencies ( dependencies ) ;
@ -177,7 +178,7 @@ const preprocessors = {
}
}
} ,
} ,
Element : ( generator : DomGenerator , block , s tate, node : Node ) = > {
Element : ( generator : DomGenerator , block : Block , s tate: S tate, node : Node ) = > {
const isComponent = generator . components . has ( node . name ) || node . name === ':Self' ;
const isComponent = generator . components . has ( node . name ) || node . name === ':Self' ;
if ( isComponent ) {
if ( isComponent ) {
@ -240,7 +241,7 @@ const preprocessors = {
}
}
} ;
} ;
function preprocessChildren ( generator : DomGenerator , block , s tate, node : Node , isTopLevel : boolean ) {
function preprocessChildren ( generator : DomGenerator , block : Block , s tate: S tate, node : Node , isTopLevel : boolean = false ) {
// glue text nodes together
// glue text nodes together
const cleaned : Node [ ] = [ ] ;
const cleaned : Node [ ] = [ ] ;
let lastChild : Node ;
let lastChild : Node ;
@ -294,7 +295,7 @@ function preprocessChildren ( generator: DomGenerator, block, state, node: Node,
node . children = cleaned ;
node . children = cleaned ;
}
}
export default function preprocess ( generator : DomGenerator , state , n ode ) {
export default function preprocess ( generator : DomGenerator , namespace : string , node : N ode ) {
const block = new Block ( {
const block = new Block ( {
generator ,
generator ,
name : generator.alias ( 'create_main_fragment' ) ,
name : generator.alias ( 'create_main_fragment' ) ,
@ -311,9 +312,15 @@ export default function preprocess ( generator: DomGenerator, state, node ) {
dependencies : new Set ( )
dependencies : new Set ( )
} ) ;
} ) ;
const state : State = {
namespace ,
parentNode : null ,
isTopLevel : true
} ;
generator . blocks . push ( block ) ;
generator . blocks . push ( block ) ;
preprocessChildren ( generator , block , state , node , true ) ;
preprocessChildren ( generator , block , state , node , true ) ;
block . hasUpdateMethod = block . dependencies . size > 0 ;
block . hasUpdateMethod = block . dependencies . size > 0 ;
return block ;
return { block , state } ;
}
}