|
import Element from './Element.js'; |
|
import Attribute from './Attribute.js'; |
|
import compiler_errors from '../compiler_errors.js'; |
|
|
|
|
|
export default class Slot extends Element { |
|
|
|
|
|
type = 'Slot'; |
|
|
|
|
|
slot_name; |
|
|
|
|
|
values = new Map(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
constructor(component, parent, scope, info) { |
|
super(component, parent, scope, info); |
|
info.attributes.forEach((attr) => { |
|
if (attr.type !== 'Attribute' && attr.type !== 'Spread') { |
|
return component.error(attr, compiler_errors.invalid_slot_directive); |
|
} |
|
if (attr.name === 'name') { |
|
if (attr.value.length !== 1 || attr.value[0].type !== 'Text') { |
|
return component.error(attr, compiler_errors.dynamic_slot_name); |
|
} |
|
this.slot_name = attr.value[0].data; |
|
if (this.slot_name === 'default') { |
|
return component.error(attr, compiler_errors.invalid_slot_name); |
|
} |
|
} |
|
this.values.set(attr.name, new Attribute(component, this, scope, attr)); |
|
}); |
|
if (!this.slot_name) this.slot_name = 'default'; |
|
|
|
component.slots.set(this.slot_name, this); |
|
this.cannot_use_innerhtml(); |
|
this.not_static_content(); |
|
} |
|
} |
|
|