123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /*
- 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;
|