55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var LoaderLoadingError = require("./LoaderLoadingError");
 | |
| var url;
 | |
| 
 | |
| module.exports = function loadLoader(loader, callback) {
 | |
| 	if(loader.type === "module") {
 | |
| 		try {
 | |
| 			if(url === undefined) url = require("url");
 | |
| 			var loaderUrl = url.pathToFileURL(loader.path);
 | |
| 			var modulePromise = eval("import(" + JSON.stringify(loaderUrl.toString()) + ")");
 | |
| 			modulePromise.then(function(module) {
 | |
| 				handleResult(loader, module, callback);
 | |
| 			}, callback);
 | |
| 			return;
 | |
| 		} catch(e) {
 | |
| 			callback(e);
 | |
| 		}
 | |
| 	} else {
 | |
| 		try {
 | |
| 			var module = require(loader.path);
 | |
| 		} catch(e) {
 | |
| 			// it is possible for node to choke on a require if the FD descriptor
 | |
| 			// limit has been reached. give it a chance to recover.
 | |
| 			if(e instanceof Error && e.code === "EMFILE") {
 | |
| 				var retry = loadLoader.bind(null, loader, callback);
 | |
| 				if(typeof setImmediate === "function") {
 | |
| 					// node >= 0.9.0
 | |
| 					return setImmediate(retry);
 | |
| 				} else {
 | |
| 					// node < 0.9.0
 | |
| 					return process.nextTick(retry);
 | |
| 				}
 | |
| 			}
 | |
| 			return callback(e);
 | |
| 		}
 | |
| 		return handleResult(loader, module, callback);
 | |
| 	}
 | |
| };
 | |
| 
 | |
| function handleResult(loader, module, callback) {
 | |
| 	if(typeof module !== "function" && typeof module !== "object") {
 | |
| 		return callback(new LoaderLoadingError(
 | |
| 			"Module '" + loader.path + "' is not a loader (export function or es6 module)"
 | |
| 		));
 | |
| 	}
 | |
| 	loader.normal = typeof module === "function" ? module : module.default;
 | |
| 	loader.pitch = module.pitch;
 | |
| 	loader.raw = module.raw;
 | |
| 	if(typeof loader.normal !== "function" && typeof loader.pitch !== "function") {
 | |
| 		return callback(new LoaderLoadingError(
 | |
| 			"Module '" + loader.path + "' is not a loader (must have normal or pitch function)"
 | |
| 		));
 | |
| 	}
 | |
| 	callback();
 | |
| }
 |