diff options
Diffstat (limited to 'alpinejs/packages/alpinejs/src/magics.js')
-rw-r--r-- | alpinejs/packages/alpinejs/src/magics.js | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/alpinejs/packages/alpinejs/src/magics.js b/alpinejs/packages/alpinejs/src/magics.js new file mode 100644 index 0000000..5c95bb4 --- /dev/null +++ b/alpinejs/packages/alpinejs/src/magics.js @@ -0,0 +1,36 @@ +import Alpine from './alpine' +import { getElementBoundUtilities } from './directives' +import { interceptor } from './interceptor' +import { onElRemoved } from './mutation' + +let magics = {} + +export function magic(name, callback) { + magics[name] = callback +} + +export function injectMagics(obj, el) { + Object.entries(magics).forEach(([name, callback]) => { + Object.defineProperty(obj, `$${name}`, { + get() { + let [utilities, cleanup] = getElementBoundUtilities(el) + + utilities = {interceptor, ...utilities} + + onElRemoved(el, cleanup) + + return callback(el, utilities) + }, + + enumerable: false, + }) + }) + + return { + obj, + cleanup: () => { + // MemLeak1: Issue #2140 + el = null; + } + }; +} |