|
|
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
-
- const { OriginalSource, RawSource } = require("webpack-sources");
- const Module = require("./Module");
- const WebpackMissingModule = require("./dependencies/WebpackMissingModule");
- const Template = require("./Template");
-
- /** @typedef {import("./util/createHash").Hash} Hash */
-
- class ExternalModule extends Module {
- constructor(request, type, userRequest) {
- super("javascript/dynamic", null);
-
- // Info from Factory
- this.request = request;
- this.externalType = type;
- this.userRequest = userRequest;
- this.external = true;
- }
-
- libIdent() {
- return this.userRequest;
- }
-
- chunkCondition(chunk) {
- return chunk.hasEntryModule();
- }
-
- identifier() {
- return "external " + JSON.stringify(this.request);
- }
-
- readableIdentifier() {
- return "external " + JSON.stringify(this.request);
- }
-
- needRebuild() {
- return false;
- }
-
- build(options, compilation, resolver, fs, callback) {
- this.built = true;
- this.buildMeta = {};
- this.buildInfo = {};
- callback();
- }
-
- getSourceForGlobalVariableExternal(variableName, type) {
- if (!Array.isArray(variableName)) {
- // make it an array as the look up works the same basically
- variableName = [variableName];
- }
-
- // needed for e.g. window["some"]["thing"]
- const objectLookup = variableName
- .map(r => `[${JSON.stringify(r)}]`)
- .join("");
- return `(function() { module.exports = ${type}${objectLookup}; }());`;
- }
-
- getSourceForCommonJsExternal(moduleAndSpecifiers) {
- if (!Array.isArray(moduleAndSpecifiers)) {
- return `module.exports = require(${JSON.stringify(
- moduleAndSpecifiers
- )});`;
- }
-
- const moduleName = moduleAndSpecifiers[0];
- const objectLookup = moduleAndSpecifiers
- .slice(1)
- .map(r => `[${JSON.stringify(r)}]`)
- .join("");
- return `module.exports = require(${JSON.stringify(
- moduleName
- )})${objectLookup};`;
- }
-
- checkExternalVariable(variableToCheck, request) {
- return `if(typeof ${variableToCheck} === 'undefined') {${WebpackMissingModule.moduleCode(
- request
- )}}\n`;
- }
-
- getSourceForAmdOrUmdExternal(id, optional, request) {
- const externalVariable = `__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
- `${id}`
- )}__`;
- const missingModuleError = optional
- ? this.checkExternalVariable(externalVariable, request)
- : "";
- return `${missingModuleError}module.exports = ${externalVariable};`;
- }
-
- getSourceForDefaultCase(optional, request) {
- if (!Array.isArray(request)) {
- // make it an array as the look up works the same basically
- request = [request];
- }
-
- const variableName = request[0];
- const missingModuleError = optional
- ? this.checkExternalVariable(variableName, request.join("."))
- : "";
- const objectLookup = request
- .slice(1)
- .map(r => `[${JSON.stringify(r)}]`)
- .join("");
- return `${missingModuleError}module.exports = ${variableName}${objectLookup};`;
- }
-
- getSourceString(runtime) {
- const request =
- typeof this.request === "object" && !Array.isArray(this.request)
- ? this.request[this.externalType]
- : this.request;
- switch (this.externalType) {
- case "this":
- case "window":
- case "self":
- return this.getSourceForGlobalVariableExternal(
- request,
- this.externalType
- );
- case "global":
- return this.getSourceForGlobalVariableExternal(
- request,
- runtime.outputOptions.globalObject
- );
- case "commonjs":
- case "commonjs2":
- return this.getSourceForCommonJsExternal(request);
- case "amd":
- case "amd-require":
- case "umd":
- case "umd2":
- case "system":
- return this.getSourceForAmdOrUmdExternal(
- this.id,
- this.optional,
- request
- );
- default:
- return this.getSourceForDefaultCase(this.optional, request);
- }
- }
-
- getSource(sourceString) {
- if (this.useSourceMap) {
- return new OriginalSource(sourceString, this.identifier());
- }
-
- return new RawSource(sourceString);
- }
-
- source(dependencyTemplates, runtime) {
- return this.getSource(this.getSourceString(runtime));
- }
-
- size() {
- return 42;
- }
-
- /**
- * @param {Hash} hash the hash used to track dependencies
- * @returns {void}
- */
- updateHash(hash) {
- hash.update(this.externalType);
- hash.update(JSON.stringify(this.request));
- hash.update(JSON.stringify(Boolean(this.optional)));
- super.updateHash(hash);
- }
- }
-
- module.exports = ExternalModule;
|