mirror of https://github.com/sveltejs/svelte
40 lines
1.0 KiB
40 lines
1.0 KiB
import Node from './shared/Node';
|
|
import Expression from './shared/Expression';
|
|
import Component from '../Component';
|
|
|
|
export default class Animation extends Node {
|
|
type: 'Animation';
|
|
name: string;
|
|
expression: Expression;
|
|
|
|
constructor(component: Component, parent, scope, info) {
|
|
super(component, parent, scope, info);
|
|
|
|
component.warn_if_undefined(info.name, info, scope);
|
|
|
|
this.name = info.name;
|
|
component.qualify(info.name);
|
|
|
|
if (parent.animation) {
|
|
component.error(this, {
|
|
code: `duplicate-animation`,
|
|
message: `An element can only have one 'animate' directive`
|
|
});
|
|
}
|
|
|
|
const block = parent.parent;
|
|
if (!block || block.type !== 'EachBlock' || !block.key) {
|
|
// TODO can we relax the 'immediate child' rule?
|
|
component.error(this, {
|
|
code: `invalid-animation`,
|
|
message: `An element that use the animate directive must be the immediate child of a keyed each block`
|
|
});
|
|
}
|
|
|
|
block.has_animation = true;
|
|
|
|
this.expression = info.expression
|
|
? new Expression(component, this, scope, info.expression)
|
|
: null;
|
|
}
|
|
} |