Browse Source

fix: memoization when injecting magic (#4276)

* fix: memoization when injecting magic

* extract get utlilties to a function

* add return comment

* fix tests

* refactor

* wip

---------

Co-authored-by: Caleb Porzio <calebporzio@gmail.com>
onFire(Abhi) 10 months ago
parent
commit
ac63592b9f
1 changed files with 13 additions and 15 deletions
  1. 13 15
      packages/alpinejs/src/magics.js

+ 13 - 15
packages/alpinejs/src/magics.js

@@ -9,24 +9,12 @@ export function magic(name, callback) {
 }
 
 export function injectMagics(obj, el) {
-    Object.entries(magics).forEach(([name, callback]) => {
-        let memoizedUtilities = null;
-        function getUtilities() {
-            if (memoizedUtilities) {
-                return memoizedUtilities;
-            } else {
-                let [utilities, cleanup] = getElementBoundUtilities(el)
-
-                memoizedUtilities = {interceptor, ...utilities}
-
-                onElRemoved(el, cleanup)
-                return memoizedUtilities;
-            }
-        }
+    let memoizedUtilities = getUtilities(el)
 
+    Object.entries(magics).forEach(([name, callback]) => {
         Object.defineProperty(obj, `$${name}`, {
             get() {
-                return callback(el, getUtilities());
+                return callback(el, memoizedUtilities);
             },
             enumerable: false,
         })
@@ -34,3 +22,13 @@ export function injectMagics(obj, el) {
 
     return obj
 }
+
+export function getUtilities(el) {
+    let [utilities, cleanup] = getElementBoundUtilities(el)
+
+    let utils = { interceptor, ...utilities }
+
+    onElRemoved(el, cleanup)
+
+    return utils;
+}