| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const ExternalModule = require("./ExternalModule");class ExternalModuleFactoryPlugin {	constructor(type, externals) {		this.type = type;		this.externals = externals;	}	apply(normalModuleFactory) {		const globalType = this.type;		normalModuleFactory.hooks.factory.tap(			"ExternalModuleFactoryPlugin",			factory => (data, callback) => {				const context = data.context;				const dependency = data.dependencies[0];				const handleExternal = (value, type, callback) => {					if (typeof type === "function") {						callback = type;						type = undefined;					}					if (value === false) return factory(data, callback);					if (value === true) value = dependency.request;					if (type === undefined && /^[a-z0-9]+ /.test(value)) {						const idx = value.indexOf(" ");						type = value.substr(0, idx);						value = value.substr(idx + 1);					}					callback(						null,						new ExternalModule(value, type || globalType, dependency.request)					);					return true;				};				const handleExternals = (externals, callback) => {					if (typeof externals === "string") {						if (externals === dependency.request) {							return handleExternal(dependency.request, callback);						}					} else if (Array.isArray(externals)) {						let i = 0;						const next = () => {							let asyncFlag;							const handleExternalsAndCallback = (err, module) => {								if (err) return callback(err);								if (!module) {									if (asyncFlag) {										asyncFlag = false;										return;									}									return next();								}								callback(null, module);							};							do {								asyncFlag = true;								if (i >= externals.length) return callback();								handleExternals(externals[i++], handleExternalsAndCallback);							} while (!asyncFlag);							asyncFlag = false;						};						next();						return;					} else if (externals instanceof RegExp) {						if (externals.test(dependency.request)) {							return handleExternal(dependency.request, callback);						}					} else if (typeof externals === "function") {						externals.call(							null,							context,							dependency.request,							(err, value, type) => {								if (err) return callback(err);								if (value !== undefined) {									handleExternal(value, type, callback);								} else {									callback();								}							}						);						return;					} else if (						typeof externals === "object" &&						Object.prototype.hasOwnProperty.call(externals, dependency.request)					) {						return handleExternal(externals[dependency.request], callback);					}					callback();				};				handleExternals(this.externals, (err, module) => {					if (err) return callback(err);					if (!module) return handleExternal(false, callback);					return callback(null, module);				});			}		);	}}module.exports = ExternalModuleFactoryPlugin;
 |