From 5f6410b5d11ef88383a437dbd475371ad11e2a52 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Fri, 11 Dec 2020 17:49:29 +0100 Subject: [PATCH 1/2] mapping of old nodes --- packages/core/src/index.js | 4 +++- packages/core/src/runtime/vnode.js | 17 ++++++++++++++++- packages/core/src/runtime/vnodesForComponent.js | 1 + 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/core/src/index.js b/packages/core/src/index.js index a5da32a5..4ef7fbf4 100644 --- a/packages/core/src/index.js +++ b/packages/core/src/index.js @@ -19,7 +19,7 @@ import { HOOK_CLEANUP } from './constants'; import { computeKey } from './computeKey'; -import { vnodesForComponent } from './runtime/vnodesForComponent'; +import { vnodesForComponent, mappedVNodes } from './runtime/vnodesForComponent'; import { signaturesForType } from './runtime/signaturesForType'; let typesById = new Map(); @@ -51,6 +51,8 @@ function replaceComponent(OldType, NewType, resetHookState) { vnodesForComponent.delete(OldType); vnodesForComponent.set(NewType, vnodes); + mappedVNodes.set(OldType, NewType); + pendingUpdates = pendingUpdates.filter(p => p[0] !== OldType); vnodes.forEach(vnode => { diff --git a/packages/core/src/runtime/vnode.js b/packages/core/src/runtime/vnode.js index ca580be0..129d9ed4 100644 --- a/packages/core/src/runtime/vnode.js +++ b/packages/core/src/runtime/vnode.js @@ -1,5 +1,14 @@ import { options } from 'preact'; -import { vnodesForComponent } from './vnodesForComponent'; +import { vnodesForComponent, mappedVNodes } from './vnodesForComponent'; +import { VNODE_COMPONENT } from '../constants'; + +const getMappedVnode = type => { + if (mappedVNodes.has(type)) { + return getMappedVnode(mappedVNodes.get(type)); + } + + return type; +}; const oldVnode = options.vnode; options.vnode = vnode => { @@ -10,6 +19,12 @@ options.vnode = vnode => { } else { vnodes.push(vnode); } + + const foundType = getMappedVnode(vnode.type); + vnode.type = foundType; + if (vnode[VNODE_COMPONENT]) { + vnode[VNODE_COMPONENT].constructor = foundType; + } } if (oldVnode) oldVnode(vnode); diff --git a/packages/core/src/runtime/vnodesForComponent.js b/packages/core/src/runtime/vnodesForComponent.js index 149bbfac..da70b0cb 100644 --- a/packages/core/src/runtime/vnodesForComponent.js +++ b/packages/core/src/runtime/vnodesForComponent.js @@ -1,2 +1,3 @@ // all vnodes referencing a given constructor export const vnodesForComponent = new WeakMap(); +export const mappedVNodes = new WeakMap(); From 3d4e12c4fb955f02175ad6118727045c4874fe73 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Fri, 11 Dec 2020 17:58:35 +0100 Subject: [PATCH 2/2] add changset --- .changeset/weak-rules-sparkle.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/weak-rules-sparkle.md diff --git a/.changeset/weak-rules-sparkle.md b/.changeset/weak-rules-sparkle.md new file mode 100644 index 00000000..435693df --- /dev/null +++ b/.changeset/weak-rules-sparkle.md @@ -0,0 +1,5 @@ +--- +'@prefresh/core': minor +--- + +Update oldVnodeTypes in place with newer equivalents