52 lines
1.5 KiB
JavaScript
52 lines
1.5 KiB
JavaScript
|
import ObjectUtils from './ObjectUtils';
|
||
|
|
||
|
export default class {
|
||
|
helpers;
|
||
|
type;
|
||
|
constructor({ init, type }) {
|
||
|
this.helpers = new Set(init);
|
||
|
this.type = type;
|
||
|
}
|
||
|
add(instance) {
|
||
|
this.helpers.add(instance);
|
||
|
}
|
||
|
update() {
|
||
|
// @todo
|
||
|
}
|
||
|
delete(instance) {
|
||
|
this.helpers.delete(instance);
|
||
|
}
|
||
|
clear() {
|
||
|
this.helpers.clear();
|
||
|
}
|
||
|
get(parentInstance, slots) {
|
||
|
const children = this._get(parentInstance, slots);
|
||
|
const computed = children ? this._recursive([...this.helpers], children) : null;
|
||
|
|
||
|
return ObjectUtils.isNotEmpty(computed) ? computed : null;
|
||
|
}
|
||
|
_isMatched(instance, key) {
|
||
|
const parent = instance?.parent;
|
||
|
|
||
|
return parent?.vnode?.key === key || (parent && this._isMatched(parent, key)) || false;
|
||
|
}
|
||
|
_get(parentInstance, slots) {
|
||
|
return (slots || parentInstance?.$slots)?.default?.() || null;
|
||
|
}
|
||
|
_recursive(helpers = [], children = []) {
|
||
|
let components = [];
|
||
|
|
||
|
children.forEach((child) => {
|
||
|
if (child.children instanceof Array) {
|
||
|
components = components.concat(this._recursive(components, child.children));
|
||
|
} else if (child.type.name === this.type) {
|
||
|
components.push(child);
|
||
|
} else if (ObjectUtils.isNotEmpty(child.key)) {
|
||
|
components = components.concat(helpers.filter((c) => this._isMatched(c, child.key)).map((c) => c.vnode));
|
||
|
}
|
||
|
});
|
||
|
|
||
|
return components;
|
||
|
}
|
||
|
}
|