Blame view

node_modules/webpack/lib/ExternalModuleFactoryPlugin.js 2.77 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  /*
  	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.plugin("factory", factory => (data, callback) => {
  			const context = data.context;
  			const dependency = data.dependencies[0];
  
  			function 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(typeof 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;
  			}
  			(function handleExternals(externals, callback) {
  				if(typeof externals === "string") {
  					if(externals === dependency.request) {
  						return handleExternal(dependency.request, callback);
  					}
  				} else if(Array.isArray(externals)) {
  					let i = 0;
  					(function next() {
  						let asyncFlag;
  						const handleExternalsAndCallback = function 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); // eslint-disable-line keyword-spacing
  						asyncFlag = false;
  					}());
  					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, function(err, value, type) {
  						if(err) return callback(err);
  						if(typeof 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();
  			}(this.externals, function(err, module) {
  				if(err) return callback(err);
  				if(!module) return handleExternal(false, callback);
  				return callback(null, module);
  			}));
  		});
  	}
  }
  module.exports = ExternalModuleFactoryPlugin;