mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| const System = {
 | |
| 	register: (name, deps, fn) => {
 | |
| 		if (!System.registry) {
 | |
| 			throw new Error("System is no initialized");
 | |
| 		}
 | |
| 		if (typeof name !== "string") {
 | |
| 			fn = deps;
 | |
| 			deps = name;
 | |
| 			name = System._nextName;
 | |
| 		}
 | |
| 		if (!Array.isArray(deps)) {
 | |
| 			fn = deps;
 | |
| 			deps = [];
 | |
| 		}
 | |
| 		const dynamicExport = result => {
 | |
| 			if (System.registry[name] !== entry) {
 | |
| 				throw new Error(`Module ${name} calls dynamicExport too late`);
 | |
| 			}
 | |
| 			entry.exports = result;
 | |
| 			for (const mod of Object.keys(System.registry)) {
 | |
| 				const m = System.registry[mod];
 | |
| 				if (!m.deps) continue;
 | |
| 				for (let i = 0; i < m.deps.length; i++) {
 | |
| 					const dep = m.deps[i];
 | |
| 					if (dep !== name) continue;
 | |
| 					const setters = m.mod.setters[i];
 | |
| 					setters(result);
 | |
| 				}
 | |
| 			}
 | |
| 		};
 | |
| 		const systemContext = {
 | |
| 			meta: {
 | |
| 				url: `/${name}.js`
 | |
| 			},
 | |
| 			import() {
 | |
| 				return Promise.resolve();
 | |
| 			}
 | |
| 		};
 | |
| 		if (name in System.registry) {
 | |
| 			throw new Error(`Module ${name} is already registered`);
 | |
| 		}
 | |
| 		const mod = fn(dynamicExport, systemContext);
 | |
| 		if (deps.length > 0) {
 | |
| 			if (!Array.isArray(mod.setters)) {
 | |
| 				throw new Error(
 | |
| 					`Module ${name} must have setters, because it has dependencies`
 | |
| 				);
 | |
| 			}
 | |
| 			if (mod.setters.length !== deps.length) {
 | |
| 				throw new Error(
 | |
| 					`Module ${name} has incorrect number of setters for the dependencies`
 | |
| 				);
 | |
| 			}
 | |
| 		}
 | |
| 		const entry = {
 | |
| 			name,
 | |
| 			deps,
 | |
| 			fn,
 | |
| 			mod,
 | |
| 			executed: false,
 | |
| 			exports: undefined
 | |
| 		};
 | |
| 		System.registry[name] = entry;
 | |
| 	},
 | |
| 	set: (name, exports) => {
 | |
| 		System.registry[name] = {
 | |
| 			name,
 | |
| 			executed: true,
 | |
| 			exports
 | |
| 		};
 | |
| 	},
 | |
| 	registry: undefined,
 | |
| 	_require: undefined,
 | |
| 	_nextName: "(anonym)",
 | |
| 	setRequire: req => {
 | |
| 		System._require = req;
 | |
| 	},
 | |
| 	init: modules => {
 | |
| 		System.registry = {};
 | |
| 		if (modules) {
 | |
| 			for (const name of Object.keys(modules)) {
 | |
| 				System.registry[name] = {
 | |
| 					executed: true,
 | |
| 					exports: modules[name]
 | |
| 				};
 | |
| 			}
 | |
| 		}
 | |
| 	},
 | |
| 	execute: name => {
 | |
| 		const m = System.registry[name];
 | |
| 		if (!m) throw new Error(`Module ${name} not registered`);
 | |
| 		if (m.executed) throw new Error(`Module ${name} was already executed`);
 | |
| 		return System.ensureExecuted(name);
 | |
| 	},
 | |
| 	ensureExecuted: name => {
 | |
| 		let m = System.registry[name];
 | |
| 		if (!m && System._require) {
 | |
| 			const oldName = System._nextName;
 | |
| 			System._nextName = name;
 | |
| 			System._require(name);
 | |
| 			System._nextName = oldName;
 | |
| 			m = System.registry[name];
 | |
| 		}
 | |
| 		if (!m) {
 | |
| 			throw new Error(`Module ${name} not registered`);
 | |
| 		}
 | |
| 		if (!m.executed) {
 | |
| 			m.executed = true;
 | |
| 			for (let i = 0; i < m.deps.length; i++) {
 | |
| 				const dep = m.deps[i];
 | |
| 				const setters = m.mod.setters[i];
 | |
| 				System.ensureExecuted(dep);
 | |
| 				const { exports } = System.registry[dep];
 | |
| 				if (exports !== undefined) setters(exports);
 | |
| 			}
 | |
| 			m.mod.execute();
 | |
| 		}
 | |
| 		return m.exports;
 | |
| 	}
 | |
| };
 | |
| module.exports = System;
 |