/
scope.ts
42 lines (35 loc) · 1.26 KB
/
scope.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { DataMap } from "./data_map"
import { Schema } from "./schema"
import { TargetSet } from "./target_set"
import { attributeValueContainsToken } from "./selectors"
export class Scope {
readonly schema: Schema
readonly identifier: string
readonly element: Element
readonly targets: TargetSet
readonly data: DataMap
constructor(schema: Schema, identifier: string, element: Element) {
this.schema = schema
this.identifier = identifier
this.element = element
this.targets = new TargetSet(this)
this.data = new DataMap(this)
}
findElement(selector: string): Element | undefined {
return this.findAllElements(selector)[0]
}
findAllElements(selector: string): Element[] {
const head = this.element.matches(selector) ? [this.element] : []
const tail = this.filterElements(Array.from(this.element.querySelectorAll(selector)))
return head.concat(tail)
}
filterElements(elements: Element[]): Element[] {
return elements.filter(element => this.containsElement(element))
}
containsElement(element: Element) {
return element.closest(this.controllerSelector) === this.element
}
private get controllerSelector(): string {
return attributeValueContainsToken(this.schema.controllerAttribute, this.identifier)
}
}