From 54c7eb70bce7b3fc84b775778d81cec1176c7686 Mon Sep 17 00:00:00 2001 From: Caleb Porzio Date: Mon, 22 Apr 2024 16:55:40 -0400 Subject: [PATCH] Fix morphing root level state (#4169) * Fix morph when x-for is used inside x-teleport * Fix morphing teleports with root-level `x-data` state * wip --- .../alpinejs/src/directives/x-teleport.js | 6 +- packages/morph/src/morph.js | 9 +-- .../cypress/integration/plugins/morph.spec.js | 74 +++++++++++++++++++ 3 files changed, 82 insertions(+), 7 deletions(-) diff --git a/packages/alpinejs/src/directives/x-teleport.js b/packages/alpinejs/src/directives/x-teleport.js index b768fefc8..6af19c9f5 100644 --- a/packages/alpinejs/src/directives/x-teleport.js +++ b/packages/alpinejs/src/directives/x-teleport.js @@ -49,9 +49,11 @@ directive('teleport', (el, { modifiers, expression }, { cleanup }) => { mutateDom(() => { placeInDom(clone, target, modifiers) - skipDuringClone(() => initTree(clone))() + skipDuringClone(() => { + initTree(clone) - clone._x_ignore = true + clone._x_ignore = true + })() }) el._x_teleportPutBack = () => { diff --git a/packages/morph/src/morph.js b/packages/morph/src/morph.js index 7cb3cebf1..00e33d88f 100644 --- a/packages/morph/src/morph.js +++ b/packages/morph/src/morph.js @@ -40,6 +40,10 @@ export function morph(from, toHtml, options) { // Initialize the server-side HTML element with Alpine... if (from.nodeType === 1 && window.Alpine) { window.Alpine.cloneNode(from, to) + + if (from._x_teleport && to._x_teleport) { + patch(from._x_teleport, to._x_teleport) + } } if (textOrComment(to)) { @@ -120,11 +124,6 @@ export function morph(from, toHtml, options) { } function patchChildren(from, to) { - // If we hit a