1
1
import Block from './Block' ;
2
2
import { trimStart , trimEnd } from '../../utils/trim' ;
3
3
import { assign } from '../../shared/index.js' ;
4
+ import getStaticAttributeValue from '../shared/getStaticAttributeValue' ;
4
5
import { DomGenerator } from './index' ;
5
6
import { Node } from '../../interfaces' ;
6
7
import { State } from './interfaces' ;
@@ -41,6 +42,7 @@ const preprocessors = {
41
42
state : State ,
42
43
node : Node ,
43
44
elementStack : Node [ ] ,
45
+ componentStack : Node [ ] ,
44
46
stripWhitespace : boolean
45
47
) => {
46
48
const dependencies = block . findDependencies ( node . expression ) ;
@@ -57,6 +59,7 @@ const preprocessors = {
57
59
state : State ,
58
60
node : Node ,
59
61
elementStack : Node [ ] ,
62
+ componentStack : Node [ ] ,
60
63
stripWhitespace : boolean
61
64
) => {
62
65
const dependencies = block . findDependencies ( node . expression ) ;
@@ -74,6 +77,7 @@ const preprocessors = {
74
77
state : State ,
75
78
node : Node ,
76
79
elementStack : Node [ ] ,
80
+ componentStack : Node [ ] ,
77
81
stripWhitespace : boolean
78
82
) => {
79
83
node . _state = getChildState ( state ) ;
@@ -94,6 +98,7 @@ const preprocessors = {
94
98
node : Node ,
95
99
inEachBlock : boolean ,
96
100
elementStack : Node [ ] ,
101
+ componentStack : Node [ ] ,
97
102
stripWhitespace : boolean ,
98
103
nextSibling : Node
99
104
) => {
@@ -113,7 +118,7 @@ const preprocessors = {
113
118
node . _state = getChildState ( state ) ;
114
119
115
120
blocks . push ( node . _block ) ;
116
- preprocessChildren ( generator , node . _block , node . _state , node , inEachBlock , elementStack , stripWhitespace , nextSibling ) ;
121
+ preprocessChildren ( generator , node . _block , node . _state , node , inEachBlock , elementStack , componentStack , stripWhitespace , nextSibling ) ;
117
122
118
123
if ( node . _block . dependencies . size > 0 ) {
119
124
dynamic = true ;
@@ -140,6 +145,7 @@ const preprocessors = {
140
145
node . else ,
141
146
inEachBlock ,
142
147
elementStack ,
148
+ componentStack ,
143
149
stripWhitespace ,
144
150
nextSibling
145
151
) ;
@@ -169,6 +175,7 @@ const preprocessors = {
169
175
node : Node ,
170
176
inEachBlock : boolean ,
171
177
elementStack : Node [ ] ,
178
+ componentStack : Node [ ] ,
172
179
stripWhitespace : boolean ,
173
180
nextSibling : Node
174
181
) => {
@@ -221,7 +228,7 @@ const preprocessors = {
221
228
} ) ;
222
229
223
230
generator . blocks . push ( node . _block ) ;
224
- preprocessChildren ( generator , node . _block , node . _state , node , true , elementStack , stripWhitespace , nextSibling ) ;
231
+ preprocessChildren ( generator , node . _block , node . _state , node , true , elementStack , componentStack , stripWhitespace , nextSibling ) ;
225
232
block . addDependencies ( node . _block . dependencies ) ;
226
233
node . _block . hasUpdateMethod = node . _block . dependencies . size > 0 ;
227
234
@@ -240,6 +247,7 @@ const preprocessors = {
240
247
node . else ,
241
248
inEachBlock ,
242
249
elementStack ,
250
+ componentStack ,
243
251
stripWhitespace ,
244
252
nextSibling
245
253
) ;
@@ -254,6 +262,7 @@ const preprocessors = {
254
262
node : Node ,
255
263
inEachBlock : boolean ,
256
264
elementStack : Node [ ] ,
265
+ componentStack : Node [ ] ,
257
266
stripWhitespace : boolean ,
258
267
nextSibling : Node
259
268
) => {
@@ -326,10 +335,23 @@ const preprocessors = {
326
335
generator . components . has ( node . name ) || node . name === ':Self' ;
327
336
328
337
if ( isComponent ) {
338
+ const name = block . getUniqueName (
339
+ ( node . name === ':Self' ? generator . name : node . name ) . toLowerCase ( )
340
+ ) ;
341
+
329
342
node . _state = getChildState ( state , {
343
+ name,
344
+ parentNode : `${ name } ._slotted.default` ,
330
345
isYield : true
331
346
} ) ;
332
347
} else {
348
+ const slot = getStaticAttributeValue ( node , 'slot' ) ;
349
+ if ( slot ) {
350
+ // TODO validate slots — no nesting, no dynamic names...
351
+ const component = componentStack [ componentStack . length - 1 ] ;
352
+ component . _slots . add ( slot ) ;
353
+ }
354
+
333
355
const name = block . getUniqueName (
334
356
node . name . replace ( / [ ^ a - z A - Z 0 - 9 _ $ ] / g, '_' )
335
357
) ;
@@ -355,17 +377,12 @@ const preprocessors = {
355
377
( node . name === ':Self' ? generator . name : node . name ) . toLowerCase ( )
356
378
) ;
357
379
358
- node . _block = block . child ( {
359
- name : generator . getUniqueName ( `create_${ name } _yield_fragment` ) ,
360
- } ) ;
380
+ if ( node . children ) node . _slots = new Set ( [ 'default' ] ) ; // TODO only include default if there are unslotted children
361
381
362
- generator . blocks . push ( node . _block ) ;
363
- preprocessChildren ( generator , node . _block , node . _state , node , inEachBlock , elementStack , stripWhitespace , nextSibling ) ;
364
- block . addDependencies ( node . _block . dependencies ) ;
365
- node . _block . hasUpdateMethod = node . _block . dependencies . size > 0 ;
382
+ preprocessChildren ( generator , block , node . _state , node , inEachBlock , elementStack , componentStack . concat ( node ) , stripWhitespace , nextSibling ) ;
366
383
} else {
367
384
if ( node . name === 'pre' || node . name === 'textarea' ) stripWhitespace = false ;
368
- preprocessChildren ( generator , block , node . _state , node , inEachBlock , elementStack . concat ( node ) , stripWhitespace , nextSibling ) ;
385
+ preprocessChildren ( generator , block , node . _state , node , inEachBlock , elementStack . concat ( node ) , componentStack , stripWhitespace , nextSibling ) ;
369
386
}
370
387
}
371
388
} ,
@@ -378,6 +395,7 @@ function preprocessChildren(
378
395
node : Node ,
379
396
inEachBlock : boolean ,
380
397
elementStack : Node [ ] ,
398
+ componentStack : Node [ ] ,
381
399
stripWhitespace : boolean ,
382
400
nextSibling : Node
383
401
) {
@@ -407,7 +425,7 @@ function preprocessChildren(
407
425
408
426
cleaned . forEach ( ( child : Node , i : number ) => {
409
427
const preprocessor = preprocessors [ child . type ] ;
410
- if ( preprocessor ) preprocessor ( generator , block , state , child , inEachBlock , elementStack , stripWhitespace , cleaned [ i + 1 ] || nextSibling ) ;
428
+ if ( preprocessor ) preprocessor ( generator , block , state , child , inEachBlock , elementStack , componentStack , stripWhitespace , cleaned [ i + 1 ] || nextSibling ) ;
411
429
412
430
if ( lastChild ) {
413
431
lastChild . next = child ;
@@ -471,7 +489,7 @@ export default function preprocess(
471
489
} ;
472
490
473
491
generator . blocks . push ( block ) ;
474
- preprocessChildren ( generator , block , state , node , false , [ ] , true , null ) ;
492
+ preprocessChildren ( generator , block , state , node , false , [ ] , [ ] , true , null ) ;
475
493
block . hasUpdateMethod = true ;
476
494
477
495
return { block, state } ;
0 commit comments