62 lines
1.6 KiB
JavaScript
62 lines
1.6 KiB
JavaScript
import { attributesOnly, directives } from "./directives"
|
|
|
|
let binds = {}
|
|
|
|
export function bind(name, bindings) {
|
|
let getBindings = typeof bindings !== 'function' ? () => bindings : bindings
|
|
|
|
if (name instanceof Element) {
|
|
applyBindingsObject(name, getBindings())
|
|
} else {
|
|
binds[name] = getBindings
|
|
}
|
|
}
|
|
|
|
export function injectBindingProviders(obj) {
|
|
Object.entries(binds).forEach(([name, callback]) => {
|
|
Object.defineProperty(obj, name, {
|
|
get() {
|
|
return (...args) => {
|
|
return callback(...args)
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
return obj
|
|
}
|
|
|
|
export function addVirtualBindings(el, bindings) {
|
|
let getBindings = typeof bindings !== 'function' ? () => bindings : bindings
|
|
|
|
el._x_virtualDirectives = getBindings()
|
|
}
|
|
|
|
export function applyBindingsObject(el, obj, original) {
|
|
let cleanupRunners = []
|
|
|
|
while (cleanupRunners.length) cleanupRunners.pop()()
|
|
|
|
let attributes = Object.entries(obj).map(([name, value]) => ({ name, value }))
|
|
|
|
let staticAttributes = attributesOnly(attributes)
|
|
|
|
// Handle binding normal HTML attributes (non-Alpine directives).
|
|
attributes = attributes.map(attribute => {
|
|
if (staticAttributes.find(attr => attr.name === attribute.name)) {
|
|
return {
|
|
name: `x-bind:${attribute.name}`,
|
|
value: `"${attribute.value}"`,
|
|
}
|
|
}
|
|
|
|
return attribute
|
|
})
|
|
|
|
directives(el, attributes, original).map(handle => {
|
|
cleanupRunners.push(handle.runCleanups)
|
|
|
|
handle()
|
|
})
|
|
}
|