From edbabb1cd7108a27ef357e659f33f7705eeef971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Fri, 10 Nov 2023 10:45:10 +0100 Subject: [PATCH] Apply memleak patches npm run build && cp -r packages /Users/bep/dev/go/gohugoio/hugo-mod-jslibs-dist/alpinejs --- packages/alpinejs/src/directives/x-data.js | 8 ++++++-- packages/alpinejs/src/evaluator.js | 6 +++++- packages/alpinejs/src/magics.js | 8 +++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/alpinejs/src/directives/x-data.js b/packages/alpinejs/src/directives/x-data.js index c5723b3b4..ae1dabc78 100644 --- a/packages/alpinejs/src/directives/x-data.js +++ b/packages/alpinejs/src/directives/x-data.js @@ -16,7 +16,7 @@ directive('data', ((el, { expression }, { cleanup }) => { expression = expression === '' ? '{}' : expression let magicContext = {} - injectMagics(magicContext, el) + let cleanup1 = injectMagics(magicContext, el).cleanup let dataProviderContext = {} injectDataProviders(dataProviderContext, magicContext) @@ -25,7 +25,7 @@ directive('data', ((el, { expression }, { cleanup }) => { if (data === undefined || data === true) data = {} - injectMagics(data, el) + let cleanup2 = injectMagics(data, el).cleanup let reactiveData = reactive(data) @@ -39,5 +39,9 @@ directive('data', ((el, { expression }, { cleanup }) => { reactiveData['destroy'] && evaluate(el, reactiveData['destroy']) undo() + + // MemLeak1: Issue #2140 + cleanup1() + cleanup2() }) })) diff --git a/packages/alpinejs/src/evaluator.js b/packages/alpinejs/src/evaluator.js index 6c662dad7..d20b76fcb 100644 --- a/packages/alpinejs/src/evaluator.js +++ b/packages/alpinejs/src/evaluator.js @@ -1,6 +1,7 @@ import { closestDataStack, mergeProxies } from './scope' import { injectMagics } from './magics' import { tryCatch, handleError } from './utils/error' +import { onAttributeRemoved } from './mutation' let shouldAutoEvaluateFunctions = true @@ -37,7 +38,10 @@ export function setEvaluator(newEvaluator) { export function normalEvaluator(el, expression) { let overriddenMagics = {} - injectMagics(overriddenMagics, el) + let cleanup = injectMagics(overriddenMagics, el).cleanup + + // MemLeak1: Issue #2140 (note: there are other uses of injectMagics) + onAttributeRemoved(el, "evaluator", cleanup) let dataStack = [overriddenMagics, ...closestDataStack(el)] diff --git a/packages/alpinejs/src/magics.js b/packages/alpinejs/src/magics.js index da41a7ad9..8c8378d3c 100644 --- a/packages/alpinejs/src/magics.js +++ b/packages/alpinejs/src/magics.js @@ -33,5 +33,11 @@ export function injectMagics(obj, el) { }) }) - return obj + return { + obj, + cleanup: () => { + // MemLeak1: Issue #2140 + el = null; + } + }; }