summaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/runtime/AsyncModuleRuntimeModule.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/runtime/AsyncModuleRuntimeModule.js')
-rw-r--r--node_modules/webpack/lib/runtime/AsyncModuleRuntimeModule.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/runtime/AsyncModuleRuntimeModule.js b/node_modules/webpack/lib/runtime/AsyncModuleRuntimeModule.js
new file mode 100644
index 00000000..05b3686d
--- /dev/null
+++ b/node_modules/webpack/lib/runtime/AsyncModuleRuntimeModule.js
@@ -0,0 +1,133 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class AsyncModuleRuntimeModule extends HelperRuntimeModule {
+ constructor() {
+ super("async module");
+ }
+
+ /**
+ * @returns {string | null} runtime code
+ */
+ generate() {
+ const compilation = /** @type {Compilation} */ (this.compilation);
+ const { runtimeTemplate } = compilation;
+ const fn = RuntimeGlobals.asyncModule;
+ return Template.asString([
+ 'var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__";',
+ `var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "${RuntimeGlobals.exports}";`,
+ 'var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__";',
+ `var resolveQueue = ${runtimeTemplate.basicFunction("queue", [
+ "if(queue && queue.d < 1) {",
+ Template.indent([
+ "queue.d = 1;",
+ `queue.forEach(${runtimeTemplate.expressionFunction(
+ "fn.r--",
+ "fn"
+ )});`,
+ `queue.forEach(${runtimeTemplate.expressionFunction(
+ "fn.r-- ? fn.r++ : fn()",
+ "fn"
+ )});`
+ ]),
+ "}"
+ ])}`,
+ `var wrapDeps = ${runtimeTemplate.returningFunction(
+ `deps.map(${runtimeTemplate.basicFunction("dep", [
+ 'if(dep !== null && typeof dep === "object") {',
+ Template.indent([
+ "if(dep[webpackQueues]) return dep;",
+ "if(dep.then) {",
+ Template.indent([
+ "var queue = [];",
+ "queue.d = 0;",
+ `dep.then(${runtimeTemplate.basicFunction("r", [
+ "obj[webpackExports] = r;",
+ "resolveQueue(queue);"
+ ])}, ${runtimeTemplate.basicFunction("e", [
+ "obj[webpackError] = e;",
+ "resolveQueue(queue);"
+ ])});`,
+ "var obj = {};",
+ `obj[webpackQueues] = ${runtimeTemplate.expressionFunction(
+ `fn(queue)`,
+ "fn"
+ )};`,
+ "return obj;"
+ ]),
+ "}"
+ ]),
+ "}",
+ "var ret = {};",
+ `ret[webpackQueues] = ${runtimeTemplate.emptyFunction()};`,
+ "ret[webpackExports] = dep;",
+ "return ret;"
+ ])})`,
+ "deps"
+ )};`,
+ `${fn} = ${runtimeTemplate.basicFunction("module, body, hasAwait", [
+ "var queue;",
+ "hasAwait && ((queue = []).d = -1);",
+ "var depQueues = new Set();",
+ "var exports = module.exports;",
+ "var currentDeps;",
+ "var outerResolve;",
+ "var reject;",
+ `var promise = new Promise(${runtimeTemplate.basicFunction(
+ "resolve, rej",
+ ["reject = rej;", "outerResolve = resolve;"]
+ )});`,
+ "promise[webpackExports] = exports;",
+ `promise[webpackQueues] = ${runtimeTemplate.expressionFunction(
+ `queue && fn(queue), depQueues.forEach(fn), promise["catch"](${runtimeTemplate.emptyFunction()})`,
+ "fn"
+ )};`,
+ "module.exports = promise;",
+ `body(${runtimeTemplate.basicFunction("deps", [
+ "currentDeps = wrapDeps(deps);",
+ "var fn;",
+ `var getResult = ${runtimeTemplate.returningFunction(
+ `currentDeps.map(${runtimeTemplate.basicFunction("d", [
+ "if(d[webpackError]) throw d[webpackError];",
+ "return d[webpackExports];"
+ ])})`
+ )}`,
+ `var promise = new Promise(${runtimeTemplate.basicFunction(
+ "resolve",
+ [
+ `fn = ${runtimeTemplate.expressionFunction(
+ "resolve(getResult)",
+ ""
+ )};`,
+ "fn.r = 0;",
+ `var fnQueue = ${runtimeTemplate.expressionFunction(
+ "q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))",
+ "q"
+ )};`,
+ `currentDeps.map(${runtimeTemplate.expressionFunction(
+ "dep[webpackQueues](fnQueue)",
+ "dep"
+ )});`
+ ]
+ )});`,
+ "return fn.r ? promise : getResult();"
+ ])}, ${runtimeTemplate.expressionFunction(
+ "(err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)",
+ "err"
+ )});`,
+ "queue && queue.d < 0 && (queue.d = 0);"
+ ])};`
+ ]);
+ }
+}
+
+module.exports = AsyncModuleRuntimeModule;