1
1
import deindent from '../utils/deindent.js' ;
2
- import addComponentAttributes from './attributes/addComponentAttributes.js' ;
3
2
import addElementAttributes from './attributes/addElementAttributes.js' ;
4
- import counter from '../utils/counter .js' ;
3
+ import Component from './Component .js' ;
5
4
6
5
export default {
7
6
enter ( generator , node ) {
8
- const hasChildren = node . children . length > 0 ;
9
7
const isComponent = node . name in generator . components ;
10
- const name = generator . current . counter ( isComponent ? `${ node . name [ 0 ] . toLowerCase ( ) } ${ node . name . slice ( 1 ) } ` : node . name ) ;
8
+ if ( isComponent ) {
9
+ return Component . enter ( generator , node ) ;
10
+ }
11
+
12
+ const name = generator . current . counter ( node . name ) ;
11
13
12
14
const local = {
13
15
name,
14
16
namespace : name === 'svg' ? 'http://www.w3.org/2000/svg' : generator . current . namespace ,
15
- isComponent,
17
+ isComponent : false ,
16
18
17
19
allUsedContexts : new Set ( ) ,
18
20
@@ -25,154 +27,49 @@ export default {
25
27
26
28
const isToplevel = generator . current . localElementDepth === 0 ;
27
29
28
- if ( isComponent ) {
29
- generator . hasComponents = true ;
30
-
31
- addComponentAttributes ( generator , node , local ) ;
32
-
33
- const componentInitProperties = [
34
- `target: ${ ! isToplevel ? generator . current . target : 'null' } ` ,
35
- 'root: component.root || component'
36
- ] ;
37
- // Component has children
38
- if ( hasChildren ) {
39
- const yieldName = `render${ name } YieldFragment` ;
40
-
41
- // {{YIELD STUFF}}
42
- generator . push ( {
43
- useAnchor : true ,
44
- name : generator . current . counter ( yieldName ) ,
45
- target : 'target' ,
46
- localElementDepth : 0 ,
47
-
48
- initStatements : [ ] ,
49
- mountStatements : [ ] ,
50
- updateStatements : [ ] ,
51
- detachStatements : [ ] ,
52
- teardownStatements : [ ] ,
53
-
54
- counter : counter ( )
55
- } ) ;
56
-
57
- node . children . forEach ( generator . visit ) ;
58
- generator . addRenderer ( generator . current ) ;
59
- generator . pop ( ) ;
60
-
61
- // Don't render children twice
62
- node . children = [ ] ;
63
-
64
- generator . current . initStatements . push ( `var ${ name } _yieldFragment = ${ yieldName } ( root, component );` ) ;
65
- generator . current . updateStatements . push ( `${ name } _yieldFragment.update ( changed, root );` ) ;
66
-
67
- componentInitProperties . push ( `yield: ${ name } _yieldFragment` ) ;
68
- }
69
-
70
- const statements = [ ] ;
71
-
72
- if ( local . staticAttributes . length || local . dynamicAttributes . length || local . bindings . length ) {
73
- const initialProps = local . staticAttributes
74
- . concat ( local . dynamicAttributes )
75
- . map ( attribute => `${ attribute . name } : ${ attribute . value } ` ) ;
76
-
77
- if ( initialProps . length ) {
78
- statements . push ( deindent `
79
- var ${ name } _initialData = {
80
- ${ initialProps . join ( ',\n' ) }
81
- };
82
- ` ) ;
83
- } else {
84
- statements . push ( `var ${ name } _initialData = {};` ) ;
85
- }
86
-
87
- if ( local . bindings . length ) {
88
- const bindings = local . bindings . map ( binding => {
89
- const parts = binding . value . split ( '.' ) ;
90
- const tail = parts . pop ( ) ;
91
- return `if ( '${ tail } ' in ${ parts . join ( '.' ) } ) ${ name } _initialData.${ binding . name } = ${ binding . value } ;` ;
92
- } ) ;
93
-
94
- statements . push ( bindings . join ( '\n' ) ) ;
95
- }
96
- componentInitProperties . push ( `data: ${ name } _initialData` ) ;
97
- }
98
-
99
- local . init . unshift ( deindent `
100
- ${ statements . join ( '\n\n' ) }
101
-
102
- var ${ name } = new template.components.${ node . name } ({
103
- ${ componentInitProperties . join ( ',\n' ) }
104
- });
105
- ` ) ;
106
-
107
-
108
- if ( isToplevel ) {
109
- local . mount . unshift ( `${ name } .mount( target, anchor );` ) ;
110
- }
111
-
112
- if ( local . dynamicAttributes . length ) {
113
- const updates = local . dynamicAttributes . map ( attribute => {
114
- return deindent `
115
- if ( ${ attribute . dependencies . map ( dependency => `'${ dependency } ' in changed` ) . join ( '||' ) } ) ${ name } _changes.${ attribute . name } = ${ attribute . value } ;
116
- ` ;
117
- } ) ;
118
-
119
- local . update . push ( deindent `
120
- var ${ name } _changes = {};
121
-
122
- ${ updates . join ( '\n' ) }
123
-
124
- if ( Object.keys( ${ name } _changes ).length ) ${ name } .set( ${ name } _changes );
125
- ` ) ;
126
- }
127
-
128
- local . teardown . push ( `${ name } .teardown( ${ isToplevel ? 'detach' : 'false' } );` ) ;
129
- }
30
+ addElementAttributes ( generator , node , local ) ;
130
31
131
- else {
132
- addElementAttributes ( generator , node , local ) ;
32
+ if ( local . allUsedContexts . size ) {
33
+ const contextNames = [ ... local . allUsedContexts ] ;
133
34
134
- if ( local . allUsedContexts . size ) {
135
- const contextNames = [ ... local . allUsedContexts ] ;
35
+ const initialProps = contextNames . map ( contextName => {
36
+ if ( contextName === 'root' ) return `root: root` ;
136
37
137
- const initialProps = contextNames . map ( contextName => {
138
- if ( contextName === 'root' ) return `root: root` ;
38
+ const listName = generator . current . listNames [ contextName ] ;
39
+ const indexName = generator . current . indexNames [ contextName ] ;
139
40
140
- const listName = generator . current . listNames [ contextName ] ;
141
- const indexName = generator . current . indexNames [ contextName ] ;
41
+ return ` ${ listName } : ${ listName } ,\n ${ indexName } : ${ indexName } ` ;
42
+ } ) . join ( ',\n' ) ;
142
43
143
- return ` ${ listName } : ${ listName } ,\n ${ indexName } : ${ indexName } ` ;
144
- } ) . join ( ',\n ' ) ;
44
+ const updates = contextNames . map ( contextName => {
45
+ if ( contextName === 'root ' ) return ` ${ name } .__svelte.root = root;` ;
145
46
146
- const updates = contextNames . map ( contextName => {
147
- if ( contextName === 'root' ) return ` ${ name } .__svelte.root = root;` ;
47
+ const listName = generator . current . listNames [ contextName ] ;
48
+ const indexName = generator . current . indexNames [ contextName ] ;
148
49
149
- const listName = generator . current . listNames [ contextName ] ;
150
- const indexName = generator . current . indexNames [ contextName ] ;
50
+ return ` ${ name } .__svelte. ${ listName } = ${ listName } ;\n ${ name } .__svelte. ${ indexName } = ${ indexName } ;` ;
51
+ } ) . join ( '\n' ) ;
151
52
152
- return `${ name } .__svelte.${ listName } = ${ listName } ;\n${ name } .__svelte.${ indexName } = ${ indexName } ;` ;
153
- } ) . join ( '\n' ) ;
154
-
155
- local . init . push ( deindent `
156
- ${ name } .__svelte = {
157
- ${ initialProps }
158
- };
159
- ` ) ;
53
+ local . init . push ( deindent `
54
+ ${ name } .__svelte = {
55
+ ${ initialProps }
56
+ };
57
+ ` ) ;
160
58
161
- local . update . push ( updates ) ;
162
- }
59
+ local . update . push ( updates ) ;
60
+ }
163
61
164
- let render = local . namespace ?
165
- `var ${ name } = document.createElementNS( '${ local . namespace } ', '${ node . name } ' );` :
166
- `var ${ name } = document.createElement( '${ node . name } ' );` ;
62
+ let render = local . namespace ?
63
+ `var ${ name } = document.createElementNS( '${ local . namespace } ', '${ node . name } ' );` :
64
+ `var ${ name } = document.createElement( '${ node . name } ' );` ;
167
65
168
- if ( generator . cssId && ! generator . current . elementDepth ) {
169
- render += `\n${ name } .setAttribute( '${ generator . cssId } ', '' );` ;
170
- }
66
+ if ( generator . cssId && ! generator . current . elementDepth ) {
67
+ render += `\n${ name } .setAttribute( '${ generator . cssId } ', '' );` ;
68
+ }
171
69
172
- local . init . unshift ( render ) ;
173
- if ( isToplevel ) {
174
- local . detach . push ( `${ name } .parentNode.removeChild( ${ name } );` ) ;
175
- }
70
+ local . init . unshift ( render ) ;
71
+ if ( isToplevel ) {
72
+ local . teardown . push ( `if ( detach ) ${ name } .parentNode.removeChild( ${ name } );` ) ;
176
73
}
177
74
178
75
// special case – bound <option> without a value attribute
@@ -188,8 +85,9 @@ export default {
188
85
generator . current . detachStatements . push ( local . detach . join ( '\n' ) ) ;
189
86
generator . current . teardownStatements . push ( local . teardown . join ( '\n' ) ) ;
190
87
88
+ generator . createMountStatement ( name ) ;
89
+
191
90
generator . push ( {
192
- isComponent,
193
91
namespace : local . namespace ,
194
92
target : name ,
195
93
parent : generator . current ,
@@ -198,14 +96,12 @@ export default {
198
96
} ) ;
199
97
} ,
200
98
201
- leave ( generator ) {
202
- const name = generator . current . target ;
203
- const isComponent = generator . current . isComponent ;
99
+ leave ( generator , node ) {
100
+ const isComponent = node . name in generator . components ;
101
+ if ( isComponent ) {
102
+ return Component . leave ( generator , node ) ;
103
+ }
204
104
205
105
generator . pop ( ) ;
206
-
207
- if ( isComponent ) return ;
208
-
209
- generator . createMountStatement ( name ) ;
210
106
}
211
107
} ;
0 commit comments