From 62bc67e9fc0ac65e6c6b3b208f1a4fe137ff7563 Mon Sep 17 00:00:00 2001 From: Anton Korzunov Date: Sun, 22 Sep 2019 21:42:41 +1000 Subject: [PATCH] fix: resolve all components to their last versions, #1342 --- src/internal/getReactStack.js | 9 +++++++++ src/reconciler/resolver.js | 20 +++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/internal/getReactStack.js b/src/internal/getReactStack.js index 87e040a8e..d0736b123 100644 --- a/src/internal/getReactStack.js +++ b/src/internal/getReactStack.js @@ -4,6 +4,7 @@ import ReactDOM from 'react-dom'; import hydrateFiberStack from './stack/hydrateFiberStack'; import hydrateLegacyStack from './stack/hydrateLegacyStack'; import { getInternalInstance } from './reactUtils'; +import { resolveType } from '../reconciler/resolver'; function getReactStack(instance) { const rootNode = getInternalInstance(instance); @@ -30,10 +31,18 @@ const markUpdate = ({ fiber }) => { if (!fiber || typeof fiber.type === 'string') { return; } + + const mostResentType = resolveType(fiber.type) || fiber.type; + if (fiber.elementType === fiber.type) { + fiber.elementType = mostResentType; + } + fiber.type = mostResentType; + fiber.expirationTime = 1; if (fiber.alternate) { fiber.alternate.expirationTime = 1; fiber.alternate.type = fiber.type; + fiber.alternate.elementType = fiber.elementType; } if (fiber.memoizedProps && typeof fiber.memoizedProps === 'object') { diff --git a/src/reconciler/resolver.js b/src/reconciler/resolver.js index d5e9802c7..aa3fdfaa5 100644 --- a/src/reconciler/resolver.js +++ b/src/reconciler/resolver.js @@ -66,12 +66,30 @@ export function resolveNotComponent(type) { return undefined; } +export const getLatestTypeVersion = type => { + const existingProxy = getProxyByType(type); + return existingProxy && existingProxy.getCurrent && existingProxy.getCurrent(); +}; + export const resolveSimpleType = type => { if (!type) { return type; } - return resolveProxy(type) || resolveUtility(type) || type; + const simpleResult = resolveProxy(type) || resolveUtility(type) || resolveNotComponent(type); + if (simpleResult) { + return simpleResult; + } + + const lastType = getLatestTypeVersion(type); + + // only lazy loaded components any now failing into this branch + + // if (lastType && lastType !== type) { + // console.warn('RHL: used type', type, 'is obsolete. Something is wrong with HMR.'); + // } + + return lastType || type; }; export const resolveType = (type, options = {}) => {