You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.0 KiB
174 lines
5.0 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const RuntimeGlobals = require("../RuntimeGlobals"); |
|
const makeSerializable = require("../util/makeSerializable"); |
|
const NullDependency = require("./NullDependency"); |
|
|
|
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */ |
|
/** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */ |
|
/** @typedef {import("../Dependency")} Dependency */ |
|
/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */ |
|
|
|
class AMDRequireDependency extends NullDependency { |
|
constructor(outerRange, arrayRange, functionRange, errorCallbackRange) { |
|
super(); |
|
|
|
this.outerRange = outerRange; |
|
this.arrayRange = arrayRange; |
|
this.functionRange = functionRange; |
|
this.errorCallbackRange = errorCallbackRange; |
|
this.functionBindThis = false; |
|
this.errorCallbackBindThis = false; |
|
} |
|
|
|
get category() { |
|
return "amd"; |
|
} |
|
|
|
serialize(context) { |
|
const { write } = context; |
|
|
|
write(this.outerRange); |
|
write(this.arrayRange); |
|
write(this.functionRange); |
|
write(this.errorCallbackRange); |
|
write(this.functionBindThis); |
|
write(this.errorCallbackBindThis); |
|
|
|
super.serialize(context); |
|
} |
|
|
|
deserialize(context) { |
|
const { read } = context; |
|
|
|
this.outerRange = read(); |
|
this.arrayRange = read(); |
|
this.functionRange = read(); |
|
this.errorCallbackRange = read(); |
|
this.functionBindThis = read(); |
|
this.errorCallbackBindThis = read(); |
|
|
|
super.deserialize(context); |
|
} |
|
} |
|
|
|
makeSerializable( |
|
AMDRequireDependency, |
|
"webpack/lib/dependencies/AMDRequireDependency" |
|
); |
|
|
|
AMDRequireDependency.Template = class AMDRequireDependencyTemplate extends ( |
|
NullDependency.Template |
|
) { |
|
/** |
|
* @param {Dependency} dependency the dependency for which the template should be applied |
|
* @param {ReplaceSource} source the current replace source which can be modified |
|
* @param {DependencyTemplateContext} templateContext the context object |
|
* @returns {void} |
|
*/ |
|
apply( |
|
dependency, |
|
source, |
|
{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements } |
|
) { |
|
const dep = /** @type {AMDRequireDependency} */ (dependency); |
|
const depBlock = /** @type {AsyncDependenciesBlock} */ ( |
|
moduleGraph.getParentBlock(dep) |
|
); |
|
const promise = runtimeTemplate.blockPromise({ |
|
chunkGraph, |
|
block: depBlock, |
|
message: "AMD require", |
|
runtimeRequirements |
|
}); |
|
|
|
// has array range but no function range |
|
if (dep.arrayRange && !dep.functionRange) { |
|
const startBlock = `${promise}.then(function() {`; |
|
const endBlock = `;})['catch'](${RuntimeGlobals.uncaughtErrorHandler})`; |
|
runtimeRequirements.add(RuntimeGlobals.uncaughtErrorHandler); |
|
|
|
source.replace(dep.outerRange[0], dep.arrayRange[0] - 1, startBlock); |
|
|
|
source.replace(dep.arrayRange[1], dep.outerRange[1] - 1, endBlock); |
|
|
|
return; |
|
} |
|
|
|
// has function range but no array range |
|
if (dep.functionRange && !dep.arrayRange) { |
|
const startBlock = `${promise}.then((`; |
|
const endBlock = `).bind(exports, __webpack_require__, exports, module))['catch'](${RuntimeGlobals.uncaughtErrorHandler})`; |
|
runtimeRequirements.add(RuntimeGlobals.uncaughtErrorHandler); |
|
|
|
source.replace(dep.outerRange[0], dep.functionRange[0] - 1, startBlock); |
|
|
|
source.replace(dep.functionRange[1], dep.outerRange[1] - 1, endBlock); |
|
|
|
return; |
|
} |
|
|
|
// has array range, function range, and errorCallbackRange |
|
if (dep.arrayRange && dep.functionRange && dep.errorCallbackRange) { |
|
const startBlock = `${promise}.then(function() { `; |
|
const errorRangeBlock = `}${ |
|
dep.functionBindThis ? ".bind(this)" : "" |
|
})['catch'](`; |
|
const endBlock = `${dep.errorCallbackBindThis ? ".bind(this)" : ""})`; |
|
|
|
source.replace(dep.outerRange[0], dep.arrayRange[0] - 1, startBlock); |
|
|
|
source.insert(dep.arrayRange[0], "var __WEBPACK_AMD_REQUIRE_ARRAY__ = "); |
|
|
|
source.replace(dep.arrayRange[1], dep.functionRange[0] - 1, "; ("); |
|
|
|
source.insert( |
|
dep.functionRange[1], |
|
").apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);" |
|
); |
|
|
|
source.replace( |
|
dep.functionRange[1], |
|
dep.errorCallbackRange[0] - 1, |
|
errorRangeBlock |
|
); |
|
|
|
source.replace( |
|
dep.errorCallbackRange[1], |
|
dep.outerRange[1] - 1, |
|
endBlock |
|
); |
|
|
|
return; |
|
} |
|
|
|
// has array range, function range, but no errorCallbackRange |
|
if (dep.arrayRange && dep.functionRange) { |
|
const startBlock = `${promise}.then(function() { `; |
|
const endBlock = `}${ |
|
dep.functionBindThis ? ".bind(this)" : "" |
|
})['catch'](${RuntimeGlobals.uncaughtErrorHandler})`; |
|
runtimeRequirements.add(RuntimeGlobals.uncaughtErrorHandler); |
|
|
|
source.replace(dep.outerRange[0], dep.arrayRange[0] - 1, startBlock); |
|
|
|
source.insert(dep.arrayRange[0], "var __WEBPACK_AMD_REQUIRE_ARRAY__ = "); |
|
|
|
source.replace(dep.arrayRange[1], dep.functionRange[0] - 1, "; ("); |
|
|
|
source.insert( |
|
dep.functionRange[1], |
|
").apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);" |
|
); |
|
|
|
source.replace(dep.functionRange[1], dep.outerRange[1] - 1, endBlock); |
|
} |
|
} |
|
}; |
|
|
|
module.exports = AMDRequireDependency;
|
|
|