diff --git a/lib/HotModuleReplacement.runtime.js b/lib/HotModuleReplacement.runtime.js index 5497091c817..5756623e629 100644 --- a/lib/HotModuleReplacement.runtime.js +++ b/lib/HotModuleReplacement.runtime.js @@ -290,7 +290,7 @@ module.exports = function() { var outdatedModules = [updateModuleId]; var outdatedDependencies = {}; - var queue = outdatedModules.slice().map(function(id) { + var queue = outdatedModules.map(function(id) { return { chain: [id], id: id @@ -467,12 +467,15 @@ module.exports = function() { moduleId = outdatedModules[i]; if ( installedModules[moduleId] && - installedModules[moduleId].hot._selfAccepted - ) + installedModules[moduleId].hot._selfAccepted && + // removed self-accepted modules should not be required + appliedUpdate[moduleId] !== warnUnexpectedRequire + ) { outdatedSelfAcceptedModules.push({ module: moduleId, errorHandler: installedModules[moduleId].hot._selfAccepted }); + } } // Now in "dispose" phase @@ -539,7 +542,7 @@ module.exports = function() { } } - // Not in "apply" phase + // Now in "apply" phase hotSetStatus("apply"); hotCurrentHash = hotUpdateNewHash; diff --git a/test/hotCases/recover/recover-after-removal-self-accepted/index.js b/test/hotCases/recover/recover-after-removal-self-accepted/index.js new file mode 100644 index 00000000000..9a7ca9e5680 --- /dev/null +++ b/test/hotCases/recover/recover-after-removal-self-accepted/index.js @@ -0,0 +1,20 @@ +import ok from "./module"; + +it("should abort when module is not accepted", done => { + expect(ok).toBe("ok1-inner"); + NEXT( + require("../../update")(done, true, () => { + expect(ok).toBe("ok2"); + NEXT( + require("../../update")(done, true, () => { + expect(ok).toBe("ok3-inner"); + done(); + }) + ); + }) + ); +}); + +if (module.hot) { + module.hot.accept("./module"); +} diff --git a/test/hotCases/recover/recover-after-removal-self-accepted/inner.js b/test/hotCases/recover/recover-after-removal-self-accepted/inner.js new file mode 100644 index 00000000000..8902ee1b3d4 --- /dev/null +++ b/test/hotCases/recover/recover-after-removal-self-accepted/inner.js @@ -0,0 +1,3 @@ +module.hot.accept(); + +export default "-inner"; diff --git a/test/hotCases/recover/recover-after-removal-self-accepted/module.js b/test/hotCases/recover/recover-after-removal-self-accepted/module.js new file mode 100644 index 00000000000..de7faaf2a9e --- /dev/null +++ b/test/hotCases/recover/recover-after-removal-self-accepted/module.js @@ -0,0 +1,9 @@ +import inner from "./inner"; + +export default "ok1" + inner; +--- +export default "ok2"; +--- +import inner from "./inner"; + +export default "ok3" + inner;