UNPKG

9.6 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5
6"use strict";
7
8var $interceptModuleExecution$ = undefined;
9var $moduleCache$ = undefined;
10// eslint-disable-next-line no-unused-vars
11var $hmrModuleData$ = undefined;
12var $hmrDownloadManifest$ = undefined;
13var $hmrDownloadUpdateHandlers$ = undefined;
14var $hmrInvalidateModuleHandlers$ = undefined;
15var __webpack_require__ = undefined;
16
17module.exports = function () {
18 var currentModuleData = {};
19 var installedModules = $moduleCache$;
20
21 // module and require creation
22 var currentChildModule;
23 var currentParents = [];
24
25 // status
26 var registeredStatusHandlers = [];
27 var currentStatus = "idle";
28
29 // while downloading
30 var blockingPromises;
31
32 // The update info
33 var currentUpdateApplyHandlers;
34 var queuedInvalidatedModules;
35
36 // eslint-disable-next-line no-unused-vars
37 $hmrModuleData$ = currentModuleData;
38
39 $interceptModuleExecution$.push(function (options) {
40 var module = options.module;
41 var require = createRequire(options.require, options.id);
42 module.hot = createModuleHotObject(options.id, module);
43 module.parents = currentParents;
44 module.children = [];
45 currentParents = [];
46 options.require = require;
47 });
48
49 $hmrDownloadUpdateHandlers$ = {};
50 $hmrInvalidateModuleHandlers$ = {};
51
52 function createRequire(require, moduleId) {
53 var me = installedModules[moduleId];
54 if (!me) return require;
55 var fn = function (request) {
56 if (me.hot.active) {
57 if (installedModules[request]) {
58 var parents = installedModules[request].parents;
59 if (parents.indexOf(moduleId) === -1) {
60 parents.push(moduleId);
61 }
62 } else {
63 currentParents = [moduleId];
64 currentChildModule = request;
65 }
66 if (me.children.indexOf(request) === -1) {
67 me.children.push(request);
68 }
69 } else {
70 console.warn(
71 "[HMR] unexpected require(" +
72 request +
73 ") from disposed module " +
74 moduleId
75 );
76 currentParents = [];
77 }
78 return require(request);
79 };
80 var createPropertyDescriptor = function (name) {
81 return {
82 configurable: true,
83 enumerable: true,
84 get: function () {
85 return require[name];
86 },
87 set: function (value) {
88 require[name] = value;
89 }
90 };
91 };
92 for (var name in require) {
93 if (Object.prototype.hasOwnProperty.call(require, name) && name !== "e") {
94 Object.defineProperty(fn, name, createPropertyDescriptor(name));
95 }
96 }
97 fn.e = function (chunkId) {
98 return trackBlockingPromise(require.e(chunkId));
99 };
100 return fn;
101 }
102
103 function createModuleHotObject(moduleId, me) {
104 var _main = currentChildModule !== moduleId;
105 var hot = {
106 // private stuff
107 _acceptedDependencies: {},
108 _acceptedErrorHandlers: {},
109 _declinedDependencies: {},
110 _selfAccepted: false,
111 _selfDeclined: false,
112 _selfInvalidated: false,
113 _disposeHandlers: [],
114 _main: _main,
115 _requireSelf: function () {
116 currentParents = me.parents.slice();
117 currentChildModule = _main ? undefined : moduleId;
118 __webpack_require__(moduleId);
119 },
120
121 // Module API
122 active: true,
123 accept: function (dep, callback, errorHandler) {
124 if (dep === undefined) hot._selfAccepted = true;
125 else if (typeof dep === "function") hot._selfAccepted = dep;
126 else if (typeof dep === "object" && dep !== null) {
127 for (var i = 0; i < dep.length; i++) {
128 hot._acceptedDependencies[dep[i]] = callback || function () {};
129 hot._acceptedErrorHandlers[dep[i]] = errorHandler;
130 }
131 } else {
132 hot._acceptedDependencies[dep] = callback || function () {};
133 hot._acceptedErrorHandlers[dep] = errorHandler;
134 }
135 },
136 decline: function (dep) {
137 if (dep === undefined) hot._selfDeclined = true;
138 else if (typeof dep === "object" && dep !== null)
139 for (var i = 0; i < dep.length; i++)
140 hot._declinedDependencies[dep[i]] = true;
141 else hot._declinedDependencies[dep] = true;
142 },
143 dispose: function (callback) {
144 hot._disposeHandlers.push(callback);
145 },
146 addDisposeHandler: function (callback) {
147 hot._disposeHandlers.push(callback);
148 },
149 removeDisposeHandler: function (callback) {
150 var idx = hot._disposeHandlers.indexOf(callback);
151 if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
152 },
153 invalidate: function () {
154 this._selfInvalidated = true;
155 switch (currentStatus) {
156 case "idle":
157 currentUpdateApplyHandlers = [];
158 Object.keys($hmrInvalidateModuleHandlers$).forEach(function (key) {
159 $hmrInvalidateModuleHandlers$[key](
160 moduleId,
161 currentUpdateApplyHandlers
162 );
163 });
164 setStatus("ready");
165 break;
166 case "ready":
167 Object.keys($hmrInvalidateModuleHandlers$).forEach(function (key) {
168 $hmrInvalidateModuleHandlers$[key](
169 moduleId,
170 currentUpdateApplyHandlers
171 );
172 });
173 break;
174 case "prepare":
175 case "check":
176 case "dispose":
177 case "apply":
178 (queuedInvalidatedModules = queuedInvalidatedModules || []).push(
179 moduleId
180 );
181 break;
182 default:
183 // ignore requests in error states
184 break;
185 }
186 },
187
188 // Management API
189 check: hotCheck,
190 apply: hotApply,
191 status: function (l) {
192 if (!l) return currentStatus;
193 registeredStatusHandlers.push(l);
194 },
195 addStatusHandler: function (l) {
196 registeredStatusHandlers.push(l);
197 },
198 removeStatusHandler: function (l) {
199 var idx = registeredStatusHandlers.indexOf(l);
200 if (idx >= 0) registeredStatusHandlers.splice(idx, 1);
201 },
202
203 //inherit from previous dispose call
204 data: currentModuleData[moduleId]
205 };
206 currentChildModule = undefined;
207 return hot;
208 }
209
210 function setStatus(newStatus) {
211 currentStatus = newStatus;
212 for (var i = 0; i < registeredStatusHandlers.length; i++)
213 registeredStatusHandlers[i].call(null, newStatus);
214 }
215
216 function trackBlockingPromise(promise) {
217 switch (currentStatus) {
218 case "ready":
219 setStatus("prepare");
220 blockingPromises.push(promise);
221 waitForBlockingPromises(function () {
222 setStatus("ready");
223 });
224 return promise;
225 case "prepare":
226 blockingPromises.push(promise);
227 return promise;
228 default:
229 return promise;
230 }
231 }
232
233 function waitForBlockingPromises(fn) {
234 if (blockingPromises.length === 0) return fn();
235 var blocker = blockingPromises;
236 blockingPromises = [];
237 return Promise.all(blocker).then(function () {
238 return waitForBlockingPromises(fn);
239 });
240 }
241
242 function hotCheck(applyOnUpdate) {
243 if (currentStatus !== "idle") {
244 throw new Error("check() is only allowed in idle status");
245 }
246 setStatus("check");
247 return $hmrDownloadManifest$().then(function (update) {
248 if (!update) {
249 setStatus(applyInvalidatedModules() ? "ready" : "idle");
250 return null;
251 }
252
253 setStatus("prepare");
254
255 var updatedModules = [];
256 blockingPromises = [];
257 currentUpdateApplyHandlers = [];
258
259 return Promise.all(
260 Object.keys($hmrDownloadUpdateHandlers$).reduce(function (
261 promises,
262 key
263 ) {
264 $hmrDownloadUpdateHandlers$[key](
265 update.c,
266 update.r,
267 update.m,
268 promises,
269 currentUpdateApplyHandlers,
270 updatedModules
271 );
272 return promises;
273 },
274 [])
275 ).then(function () {
276 return waitForBlockingPromises(function () {
277 if (applyOnUpdate) {
278 return internalApply(applyOnUpdate);
279 } else {
280 setStatus("ready");
281
282 return updatedModules;
283 }
284 });
285 });
286 });
287 }
288
289 function hotApply(options) {
290 if (currentStatus !== "ready") {
291 return Promise.resolve().then(function () {
292 throw new Error("apply() is only allowed in ready status");
293 });
294 }
295 return internalApply(options);
296 }
297
298 function internalApply(options) {
299 options = options || {};
300
301 applyInvalidatedModules();
302
303 var results = currentUpdateApplyHandlers.map(function (handler) {
304 return handler(options);
305 });
306 currentUpdateApplyHandlers = undefined;
307
308 var errors = results
309 .map(function (r) {
310 return r.error;
311 })
312 .filter(Boolean);
313
314 if (errors.length > 0) {
315 setStatus("abort");
316 return Promise.resolve().then(function () {
317 throw errors[0];
318 });
319 }
320
321 // Now in "dispose" phase
322 setStatus("dispose");
323
324 results.forEach(function (result) {
325 if (result.dispose) result.dispose();
326 });
327
328 // Now in "apply" phase
329 setStatus("apply");
330
331 var error;
332 var reportError = function (err) {
333 if (!error) error = err;
334 };
335
336 var outdatedModules = [];
337 results.forEach(function (result) {
338 if (result.apply) {
339 var modules = result.apply(reportError);
340 if (modules) {
341 for (var i = 0; i < modules.length; i++) {
342 outdatedModules.push(modules[i]);
343 }
344 }
345 }
346 });
347
348 // handle errors in accept handlers and self accepted module load
349 if (error) {
350 setStatus("fail");
351 return Promise.resolve().then(function () {
352 throw error;
353 });
354 }
355
356 if (queuedInvalidatedModules) {
357 return internalApply(options).then(function (list) {
358 outdatedModules.forEach(function (moduleId) {
359 if (list.indexOf(moduleId) < 0) list.push(moduleId);
360 });
361 return list;
362 });
363 }
364
365 setStatus("idle");
366 return Promise.resolve(outdatedModules);
367 }
368
369 function applyInvalidatedModules() {
370 if (queuedInvalidatedModules) {
371 if (!currentUpdateApplyHandlers) currentUpdateApplyHandlers = [];
372 Object.keys($hmrInvalidateModuleHandlers$).forEach(function (key) {
373 queuedInvalidatedModules.forEach(function (moduleId) {
374 $hmrInvalidateModuleHandlers$[key](
375 moduleId,
376 currentUpdateApplyHandlers
377 );
378 });
379 });
380 queuedInvalidatedModules = undefined;
381 return true;
382 }
383 }
384};