mirror of https://github.com/sveltejs/svelte
73 lines
2.0 KiB
73 lines
2.0 KiB
import flattenReference from '../../../utils/flattenReference.js';
|
|
|
|
export default {
|
|
enter ( generator, node ) {
|
|
function stringify ( chunk ) {
|
|
if ( chunk.type === 'Text' ) return chunk.data;
|
|
if ( chunk.type === 'MustacheTag' ) {
|
|
const { snippet } = generator.contextualise( chunk.expression );
|
|
return '${__escape( ' + snippet + ')}';
|
|
}
|
|
}
|
|
|
|
const attributes = [];
|
|
const bindings = [];
|
|
|
|
node.attributes.forEach( attribute => {
|
|
if ( attribute.type === 'Attribute' ) {
|
|
attributes.push( attribute );
|
|
} else if ( attribute.type === 'Binding' ) {
|
|
bindings.push( attribute );
|
|
}
|
|
});
|
|
|
|
const props = attributes
|
|
.map( attribute => {
|
|
let value;
|
|
|
|
if ( attribute.value === true ) {
|
|
value = `true`;
|
|
} else if ( attribute.value.length === 0 ) {
|
|
value = `''`;
|
|
} else if ( attribute.value.length === 1 ) {
|
|
const chunk = attribute.value[0];
|
|
if ( chunk.type === 'Text' ) {
|
|
value = isNaN( chunk.data ) ? JSON.stringify( chunk.data ) : chunk.data;
|
|
} else {
|
|
const { snippet } = generator.contextualise( chunk.expression );
|
|
value = snippet;
|
|
}
|
|
} else {
|
|
value = '`' + attribute.value.map( stringify ).join( '' ) + '`';
|
|
}
|
|
|
|
return `${attribute.name}: ${value}`;
|
|
})
|
|
.concat( bindings.map( binding => {
|
|
const { name, keypath } = flattenReference( binding.value );
|
|
const value = name in generator.current.contexts ? keypath : `root.${keypath}`;
|
|
return `${binding.name}: ${value}`;
|
|
}))
|
|
.join( ', ' );
|
|
|
|
const expression = node.name === ':Self' ? generator.name : `${generator.alias( 'template' )}.components.${node.name}`;
|
|
|
|
bindings.forEach( binding => {
|
|
generator.addBinding( binding, expression );
|
|
});
|
|
|
|
let open = `\${${expression}.render({${props}}`;
|
|
|
|
if ( node.children.length ) {
|
|
open += `, { yield: () => \``;
|
|
}
|
|
|
|
generator.append( open );
|
|
},
|
|
|
|
leave ( generator, node ) {
|
|
const close = node.children.length ? `\` })}` : ')}';
|
|
generator.append( close );
|
|
}
|
|
};
|