JavascriptHotModuleReplacement.runtime.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. /** @typedef {string | number} ModuleId */
  7. /** @typedef {Record<string, unknown>} HotData */
  8. /** @typedef {(data: HotData) => void} DisposeHandler */
  9. /** @typedef {(outdatedDependencies: ModuleId[]) => void} AcceptCallback */
  10. /** @typedef {(err: unknown, context: { moduleId: ModuleId, dependencyId: ModuleId }) => void} AcceptErrorHandler */
  11. /** @typedef {{ type: string, moduleId: ModuleId, dependencyId?: ModuleId, error: unknown, originalError?: unknown }} HotErrorEvent */
  12. /** @typedef {(reportError: (err: unknown) => void) => Promise<ModuleId[]>} ApplyFn */
  13. /**
  14. * @typedef {object} ApplyOptions
  15. * @property {boolean=} ignoreUnaccepted ignore unaccepted modules
  16. * @property {boolean=} ignoreDeclined ignore declined modules
  17. * @property {boolean=} ignoreErrored ignore errors thrown while applying
  18. * @property {((event: ModuleEffect) => void)=} onDeclined called for declined modules
  19. * @property {((event: ModuleEffect) => void)=} onUnaccepted called for unaccepted modules
  20. * @property {((event: ModuleEffect) => void)=} onAccepted called for accepted modules
  21. * @property {((event: ModuleEffect) => void)=} onDisposed called for disposed modules
  22. * @property {((event: HotErrorEvent) => void)=} onErrored called on apply errors
  23. */
  24. /**
  25. * @typedef {object} ApplyResult
  26. * @property {Error=} error fatal error that aborts the update
  27. * @property {(() => void)=} dispose dispose phase of the update
  28. * @property {ApplyFn=} apply apply phase of the update
  29. */
  30. /** @typedef {(options: ApplyOptions) => ApplyResult} ApplyHandler */
  31. /** @typedef {(moduleId: ModuleId, applyHandlers: ApplyHandler[]) => void} InvalidateModuleHandler */
  32. /** @typedef {(chunkIds: ModuleId[], removedChunks: ModuleId[], removedModules: ModuleId[], promises: Promise<unknown>[], applyHandlers: ApplyHandler[], updatedModulesList: ModuleId[], css: ModuleId[] | undefined, forceLoadChunks: ModuleId[] | undefined) => void} DownloadUpdateHandler */
  33. /** @typedef {(chunkId: ModuleId, promises: Promise<unknown>[]) => void} EnsureChunkHandler */
  34. /** @typedef {(webpackRequire: (id: ModuleId) => unknown) => void} RuntimeModuleFn */
  35. /**
  36. * @typedef {object} Hot
  37. * @property {Record<ModuleId, AcceptCallback>} _acceptedDependencies accept callbacks by dependency id
  38. * @property {Record<ModuleId, AcceptErrorHandler | undefined>} _acceptedErrorHandlers error handlers by dependency id
  39. * @property {Record<ModuleId, boolean>} _declinedDependencies declined dependency ids
  40. * @property {boolean | EXPECTED_FUNCTION} _selfAccepted true or the self-accept error handler
  41. * @property {boolean} _selfDeclined module declined itself
  42. * @property {boolean} _selfInvalidated module invalidated itself
  43. * @property {DisposeHandler[]} _disposeHandlers registered dispose handlers
  44. * @property {boolean} _main module is the entry of the update
  45. * @property {() => void} _requireSelf re-require the module on apply
  46. * @property {boolean} active module is not disposed
  47. */
  48. /**
  49. * @typedef {object} HotModule
  50. * @property {ModuleId} id module id
  51. * @property {Hot} hot hot API of the module
  52. * @property {ModuleId[]} parents ids of modules requiring this module
  53. * @property {ModuleId[]} children ids of modules required by this module
  54. */
  55. /**
  56. * @typedef {object} ModuleEffect
  57. * @property {string} type effect type
  58. * @property {ModuleId} moduleId affected module id
  59. * @property {ModuleId[]=} chain update propagation chain
  60. * @property {ModuleId=} parentId declining parent id
  61. * @property {ModuleId[]=} outdatedModules outdated module ids
  62. * @property {Record<ModuleId, ModuleId[]>=} outdatedDependencies outdated dependencies by module id
  63. */
  64. /** @typedef {{ chain: ModuleId[], id: ModuleId }} QueueItem */
  65. /** @typedef {{ module: ModuleId, require: (id?: ModuleId) => void, errorHandler: boolean | EXPECTED_FUNCTION }} SelfAcceptedModule */
  66. // Globals injected by code generation; declared here only to type the template.
  67. /* eslint-disable no-unassigned-vars */
  68. /** @type {Record<ModuleId, unknown>} */
  69. var $installedChunks$;
  70. /** @type {(chunkId: ModuleId, updatedModulesList?: ModuleId[]) => Promise<unknown>} */
  71. var $loadUpdateChunk$;
  72. /** @type {Record<ModuleId, HotModule>} */
  73. var $moduleCache$;
  74. /** @type {Record<ModuleId, EXPECTED_FUNCTION>} */
  75. var $moduleFactories$;
  76. /** @type {Record<string, EnsureChunkHandler>} */
  77. var $ensureChunkHandlers$;
  78. /** @type {(obj: object, key: ModuleId) => boolean} */
  79. var $hasOwnProperty$;
  80. /** @type {Record<ModuleId, HotData>} */
  81. var $hmrModuleData$;
  82. /** @type {Record<string, DownloadUpdateHandler>} */
  83. var $hmrDownloadUpdateHandlers$;
  84. /** @type {Record<string, InvalidateModuleHandler>} */
  85. var $hmrInvalidateModuleHandlers$;
  86. /** @type {(id: ModuleId) => unknown} */
  87. var __webpack_require__;
  88. /* eslint-enable no-unassigned-vars */
  89. module.exports = function () {
  90. /** @type {Record<ModuleId, boolean>} */
  91. var currentUpdateChunks;
  92. /** @type {Record<ModuleId, EXPECTED_FUNCTION | false>} */
  93. var currentUpdate;
  94. /** @type {ModuleId[]} */
  95. var currentUpdateRemovedChunks;
  96. /** @type {RuntimeModuleFn[]} */
  97. var currentUpdateRuntime;
  98. /**
  99. * @param {ApplyOptions} options apply options
  100. * @returns {ApplyResult} dispose/apply handlers or a fatal error
  101. */
  102. function applyHandler(options) {
  103. if ($ensureChunkHandlers$) delete $ensureChunkHandlers$.$key$Hmr;
  104. currentUpdateChunks = /** @type {Record<ModuleId, boolean>} */ (
  105. /** @type {unknown} */ (undefined)
  106. );
  107. /**
  108. * @param {ModuleId} updateModuleId updated module id
  109. * @returns {ModuleEffect} effect of updating the module
  110. */
  111. function getAffectedModuleEffects(updateModuleId) {
  112. /** @type {ModuleId[]} */
  113. var outdatedModules = [updateModuleId];
  114. /** @type {Record<ModuleId, ModuleId[]>} */
  115. var outdatedDependencies = {};
  116. /** @type {QueueItem[]} */
  117. var queue = outdatedModules.map(function (id) {
  118. return {
  119. chain: [id],
  120. id: id
  121. };
  122. });
  123. while (queue.length > 0) {
  124. var queueItem = /** @type {QueueItem} */ (queue.pop());
  125. var moduleId = queueItem.id;
  126. var chain = queueItem.chain;
  127. var module = $moduleCache$[moduleId];
  128. if (
  129. !module ||
  130. (module.hot._selfAccepted && !module.hot._selfInvalidated)
  131. )
  132. continue;
  133. if (module.hot._selfDeclined) {
  134. return {
  135. type: "self-declined",
  136. chain: chain,
  137. moduleId: moduleId
  138. };
  139. }
  140. if (module.hot._main) {
  141. return {
  142. type: "unaccepted",
  143. chain: chain,
  144. moduleId: moduleId
  145. };
  146. }
  147. for (var i = 0; i < module.parents.length; i++) {
  148. var parentId = module.parents[i];
  149. var parent = $moduleCache$[parentId];
  150. if (!parent) continue;
  151. if (parent.hot._declinedDependencies[moduleId]) {
  152. return {
  153. type: "declined",
  154. chain: chain.concat([parentId]),
  155. moduleId: moduleId,
  156. parentId: parentId
  157. };
  158. }
  159. if (outdatedModules.indexOf(parentId) !== -1) continue;
  160. if (parent.hot._acceptedDependencies[moduleId]) {
  161. if (!outdatedDependencies[parentId])
  162. outdatedDependencies[parentId] = [];
  163. addAllToSet(outdatedDependencies[parentId], [moduleId]);
  164. continue;
  165. }
  166. delete outdatedDependencies[parentId];
  167. outdatedModules.push(parentId);
  168. queue.push({
  169. chain: chain.concat([parentId]),
  170. id: parentId
  171. });
  172. }
  173. }
  174. return {
  175. type: "accepted",
  176. moduleId: updateModuleId,
  177. outdatedModules: outdatedModules,
  178. outdatedDependencies: outdatedDependencies
  179. };
  180. }
  181. /**
  182. * @param {ModuleId[]} a target set
  183. * @param {ModuleId[]} b items to add
  184. * @returns {void}
  185. */
  186. function addAllToSet(a, b) {
  187. for (var i = 0; i < b.length; i++) {
  188. var item = b[i];
  189. if (a.indexOf(item) === -1) a.push(item);
  190. }
  191. }
  192. // at begin all updates modules are outdated
  193. // the "outdated" status can propagate to parents if they don't accept the children
  194. /** @type {Record<ModuleId, ModuleId[]>} */
  195. var outdatedDependencies = {};
  196. /** @type {ModuleId[]} */
  197. var outdatedModules = [];
  198. /** @type {Record<ModuleId, EXPECTED_FUNCTION>} */
  199. var appliedUpdate = {};
  200. /**
  201. * @param {HotModule} module disposed module
  202. * @returns {void}
  203. */
  204. var warnUnexpectedRequire = function warnUnexpectedRequire(module) {
  205. console.warn(
  206. "[HMR] unexpected require(" + module.id + ") to disposed module"
  207. );
  208. };
  209. for (var moduleId in currentUpdate) {
  210. if ($hasOwnProperty$(currentUpdate, moduleId)) {
  211. var newModuleFactory = currentUpdate[moduleId];
  212. /** @type {ModuleEffect} */
  213. var result = newModuleFactory
  214. ? getAffectedModuleEffects(moduleId)
  215. : {
  216. type: "disposed",
  217. moduleId: moduleId
  218. };
  219. /** @type {Error|false} */
  220. var abortError = false;
  221. var doApply = false;
  222. var doDispose = false;
  223. var chainInfo = "";
  224. if (result.chain) {
  225. chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
  226. }
  227. switch (result.type) {
  228. case "self-declined":
  229. if (options.onDeclined) options.onDeclined(result);
  230. if (!options.ignoreDeclined)
  231. abortError = new Error(
  232. "Aborted because of self decline: " +
  233. result.moduleId +
  234. chainInfo
  235. );
  236. break;
  237. case "declined":
  238. if (options.onDeclined) options.onDeclined(result);
  239. if (!options.ignoreDeclined)
  240. abortError = new Error(
  241. "Aborted because of declined dependency: " +
  242. result.moduleId +
  243. " in " +
  244. result.parentId +
  245. chainInfo
  246. );
  247. break;
  248. case "unaccepted":
  249. if (options.onUnaccepted) options.onUnaccepted(result);
  250. if (!options.ignoreUnaccepted)
  251. abortError = new Error(
  252. "Aborted because " + moduleId + " is not accepted" + chainInfo
  253. );
  254. break;
  255. case "accepted":
  256. if (options.onAccepted) options.onAccepted(result);
  257. doApply = true;
  258. break;
  259. case "disposed":
  260. if (options.onDisposed) options.onDisposed(result);
  261. doDispose = true;
  262. break;
  263. default:
  264. throw new Error("Unexception type " + result.type);
  265. }
  266. if (abortError) {
  267. return {
  268. error: abortError
  269. };
  270. }
  271. if (doApply) {
  272. appliedUpdate[moduleId] = /** @type {EXPECTED_FUNCTION} */ (
  273. newModuleFactory
  274. );
  275. addAllToSet(
  276. outdatedModules,
  277. /** @type {ModuleId[]} */ (result.outdatedModules)
  278. );
  279. var resultOutdatedDependencies =
  280. /** @type {Record<ModuleId, ModuleId[]>} */ (
  281. result.outdatedDependencies
  282. );
  283. for (moduleId in resultOutdatedDependencies) {
  284. if ($hasOwnProperty$(resultOutdatedDependencies, moduleId)) {
  285. if (!outdatedDependencies[moduleId])
  286. outdatedDependencies[moduleId] = [];
  287. addAllToSet(
  288. outdatedDependencies[moduleId],
  289. resultOutdatedDependencies[moduleId]
  290. );
  291. }
  292. }
  293. }
  294. if (doDispose) {
  295. addAllToSet(outdatedModules, [result.moduleId]);
  296. appliedUpdate[moduleId] = warnUnexpectedRequire;
  297. }
  298. }
  299. }
  300. currentUpdate = /** @type {Record<ModuleId, EXPECTED_FUNCTION | false>} */ (
  301. /** @type {unknown} */ (undefined)
  302. );
  303. // Store self accepted outdated modules to require them later by the module system
  304. /** @type {SelfAcceptedModule[]} */
  305. var outdatedSelfAcceptedModules = [];
  306. for (var j = 0; j < outdatedModules.length; j++) {
  307. var outdatedModuleId = outdatedModules[j];
  308. var module = $moduleCache$[outdatedModuleId];
  309. if (
  310. module &&
  311. (module.hot._selfAccepted || module.hot._main) &&
  312. // removed self-accepted modules should not be required
  313. appliedUpdate[outdatedModuleId] !== warnUnexpectedRequire &&
  314. // when called invalidate self-accepting is not possible
  315. !module.hot._selfInvalidated
  316. ) {
  317. outdatedSelfAcceptedModules.push({
  318. module: outdatedModuleId,
  319. require: module.hot._requireSelf,
  320. errorHandler: module.hot._selfAccepted
  321. });
  322. }
  323. }
  324. /** @type {ModuleId[]} */
  325. var moduleOutdatedDependencies;
  326. return {
  327. dispose: function () {
  328. currentUpdateRemovedChunks.forEach(function (chunkId) {
  329. delete $installedChunks$[chunkId];
  330. });
  331. currentUpdateRemovedChunks = /** @type {ModuleId[]} */ (
  332. /** @type {unknown} */ (undefined)
  333. );
  334. var idx;
  335. var queue = outdatedModules.slice();
  336. while (queue.length > 0) {
  337. var moduleId = /** @type {ModuleId} */ (queue.pop());
  338. var module = $moduleCache$[moduleId];
  339. if (!module) continue;
  340. /** @type {HotData} */
  341. var data = {};
  342. // Call dispose handlers
  343. var disposeHandlers = module.hot._disposeHandlers;
  344. for (j = 0; j < disposeHandlers.length; j++) {
  345. disposeHandlers[j].call(null, data);
  346. }
  347. $hmrModuleData$[moduleId] = data;
  348. // disable module (this disables requires from this module)
  349. module.hot.active = false;
  350. // remove module from cache
  351. delete $moduleCache$[moduleId];
  352. // when disposing there is no need to call dispose handler
  353. delete outdatedDependencies[moduleId];
  354. // remove "parents" references from all children
  355. for (j = 0; j < module.children.length; j++) {
  356. var child = $moduleCache$[module.children[j]];
  357. if (!child) continue;
  358. idx = child.parents.indexOf(moduleId);
  359. if (idx >= 0) {
  360. child.parents.splice(idx, 1);
  361. }
  362. }
  363. }
  364. // remove outdated dependency from module children
  365. var dependency;
  366. for (var outdatedModuleId in outdatedDependencies) {
  367. if ($hasOwnProperty$(outdatedDependencies, outdatedModuleId)) {
  368. module = $moduleCache$[outdatedModuleId];
  369. if (module) {
  370. moduleOutdatedDependencies =
  371. outdatedDependencies[outdatedModuleId];
  372. for (j = 0; j < moduleOutdatedDependencies.length; j++) {
  373. dependency = moduleOutdatedDependencies[j];
  374. idx = module.children.indexOf(dependency);
  375. if (idx >= 0) module.children.splice(idx, 1);
  376. }
  377. }
  378. }
  379. }
  380. },
  381. apply: function (reportError) {
  382. /** @type {Promise<unknown>[]} */
  383. var acceptPromises = [];
  384. // insert new code
  385. for (var updateModuleId in appliedUpdate) {
  386. if ($hasOwnProperty$(appliedUpdate, updateModuleId)) {
  387. $moduleFactories$[updateModuleId] = appliedUpdate[updateModuleId];
  388. }
  389. }
  390. // run new runtime modules
  391. for (var i = 0; i < currentUpdateRuntime.length; i++) {
  392. currentUpdateRuntime[i](__webpack_require__);
  393. }
  394. // call accept handlers
  395. for (var outdatedModuleId in outdatedDependencies) {
  396. if ($hasOwnProperty$(outdatedDependencies, outdatedModuleId)) {
  397. var module = $moduleCache$[outdatedModuleId];
  398. if (module) {
  399. moduleOutdatedDependencies =
  400. outdatedDependencies[outdatedModuleId];
  401. /** @type {AcceptCallback[]} */
  402. var callbacks = [];
  403. /** @type {(AcceptErrorHandler | undefined)[]} */
  404. var errorHandlers = [];
  405. /** @type {ModuleId[]} */
  406. var dependenciesForCallbacks = [];
  407. for (var j = 0; j < moduleOutdatedDependencies.length; j++) {
  408. var dependency = moduleOutdatedDependencies[j];
  409. var acceptCallback =
  410. module.hot._acceptedDependencies[dependency];
  411. var errorHandler =
  412. module.hot._acceptedErrorHandlers[dependency];
  413. if (acceptCallback) {
  414. if (callbacks.indexOf(acceptCallback) !== -1) continue;
  415. callbacks.push(acceptCallback);
  416. errorHandlers.push(errorHandler);
  417. dependenciesForCallbacks.push(dependency);
  418. }
  419. }
  420. for (var k = 0; k < callbacks.length; k++) {
  421. /** @type {unknown} */
  422. var result;
  423. try {
  424. result = callbacks[k].call(null, moduleOutdatedDependencies);
  425. } catch (err) {
  426. if (typeof errorHandlers[k] === "function") {
  427. try {
  428. /** @type {AcceptErrorHandler} */
  429. (errorHandlers[k])(err, {
  430. moduleId: outdatedModuleId,
  431. dependencyId: dependenciesForCallbacks[k]
  432. });
  433. } catch (err2) {
  434. if (options.onErrored) {
  435. options.onErrored({
  436. type: "accept-error-handler-errored",
  437. moduleId: outdatedModuleId,
  438. dependencyId: dependenciesForCallbacks[k],
  439. error: err2,
  440. originalError: err
  441. });
  442. }
  443. if (!options.ignoreErrored) {
  444. reportError(err2);
  445. reportError(err);
  446. }
  447. }
  448. } else {
  449. if (options.onErrored) {
  450. options.onErrored({
  451. type: "accept-errored",
  452. moduleId: outdatedModuleId,
  453. dependencyId: dependenciesForCallbacks[k],
  454. error: err
  455. });
  456. }
  457. if (!options.ignoreErrored) {
  458. reportError(err);
  459. }
  460. }
  461. }
  462. if (
  463. result &&
  464. typeof (/** @type {{ then?: unknown }} */ (result).then) ===
  465. "function"
  466. ) {
  467. acceptPromises.push(/** @type {Promise<unknown>} */ (result));
  468. }
  469. }
  470. }
  471. }
  472. }
  473. var onAccepted = function () {
  474. // Load self accepted modules
  475. for (var o = 0; o < outdatedSelfAcceptedModules.length; o++) {
  476. var item = outdatedSelfAcceptedModules[o];
  477. var moduleId = item.module;
  478. try {
  479. item.require(moduleId);
  480. } catch (err) {
  481. if (typeof item.errorHandler === "function") {
  482. try {
  483. item.errorHandler(err, {
  484. moduleId: moduleId,
  485. module: $moduleCache$[moduleId]
  486. });
  487. } catch (err1) {
  488. if (options.onErrored) {
  489. options.onErrored({
  490. type: "self-accept-error-handler-errored",
  491. moduleId: moduleId,
  492. error: err1,
  493. originalError: err
  494. });
  495. }
  496. if (!options.ignoreErrored) {
  497. reportError(err1);
  498. reportError(err);
  499. }
  500. }
  501. } else {
  502. if (options.onErrored) {
  503. options.onErrored({
  504. type: "self-accept-errored",
  505. moduleId: moduleId,
  506. error: err
  507. });
  508. }
  509. if (!options.ignoreErrored) {
  510. reportError(err);
  511. }
  512. }
  513. }
  514. }
  515. };
  516. return Promise.all(acceptPromises)
  517. .then(onAccepted)
  518. .then(function () {
  519. return outdatedModules;
  520. });
  521. }
  522. };
  523. }
  524. $hmrInvalidateModuleHandlers$.$key$ = function (moduleId, applyHandlers) {
  525. if (!currentUpdate) {
  526. currentUpdate = {};
  527. currentUpdateRuntime = [];
  528. currentUpdateRemovedChunks = [];
  529. applyHandlers.push(applyHandler);
  530. }
  531. if (!$hasOwnProperty$(currentUpdate, moduleId)) {
  532. currentUpdate[moduleId] = $moduleFactories$[moduleId];
  533. }
  534. };
  535. $hmrDownloadUpdateHandlers$.$key$ = function (
  536. chunkIds,
  537. removedChunks,
  538. removedModules,
  539. promises,
  540. applyHandlers,
  541. updatedModulesList,
  542. css,
  543. forceLoadChunks
  544. ) {
  545. applyHandlers.push(applyHandler);
  546. currentUpdateChunks = {};
  547. currentUpdateRemovedChunks = removedChunks;
  548. currentUpdate = removedModules.reduce(function (obj, key) {
  549. obj[key] = false;
  550. return obj;
  551. }, /** @type {Record<ModuleId, EXPECTED_FUNCTION | false>} */ ({}));
  552. currentUpdateRuntime = [];
  553. chunkIds.forEach(function (chunkId) {
  554. if (
  555. $hasOwnProperty$($installedChunks$, chunkId) &&
  556. $installedChunks$[chunkId] !== undefined
  557. ) {
  558. promises.push($loadUpdateChunk$(chunkId, updatedModulesList));
  559. currentUpdateChunks[chunkId] = true;
  560. } else {
  561. currentUpdateChunks[chunkId] = false;
  562. }
  563. });
  564. if ($ensureChunkHandlers$) {
  565. $ensureChunkHandlers$.$key$Hmr = function (chunkId, promises) {
  566. if (
  567. currentUpdateChunks &&
  568. $hasOwnProperty$(currentUpdateChunks, chunkId) &&
  569. !currentUpdateChunks[chunkId]
  570. ) {
  571. promises.push($loadUpdateChunk$(chunkId));
  572. currentUpdateChunks[chunkId] = true;
  573. }
  574. };
  575. // Force-load chunks that now own modules orphaned by a removed chunk;
  576. // ensure handlers skip already-installed chunks, so no guard is needed.
  577. if (forceLoadChunks) {
  578. forceLoadChunks.forEach(function (chunkId) {
  579. Object.keys($ensureChunkHandlers$).forEach(function (key) {
  580. $ensureChunkHandlers$[key](chunkId, promises);
  581. });
  582. });
  583. }
  584. }
  585. };
  586. };