88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
						|
	Author Tobias Koppers @sokra
 | 
						|
*/
 | 
						|
"use strict";
 | 
						|
 | 
						|
const Hook = require("./Hook");
 | 
						|
const HookCodeFactory = require("./HookCodeFactory");
 | 
						|
 | 
						|
class AsyncParallelBailHookCodeFactory extends HookCodeFactory {
 | 
						|
	content({ onError, onResult, onDone }) {
 | 
						|
		let code = "";
 | 
						|
		code += `var _results = new Array(${this.options.taps.length});\n`;
 | 
						|
		code += "var _checkDone = function() {\n";
 | 
						|
		code += "for(var i = 0; i < _results.length; i++) {\n";
 | 
						|
		code += "var item = _results[i];\n";
 | 
						|
		code += "if(item === undefined) return false;\n";
 | 
						|
		code += "if(item.result !== undefined) {\n";
 | 
						|
		code += onResult("item.result");
 | 
						|
		code += "return true;\n";
 | 
						|
		code += "}\n";
 | 
						|
		code += "if(item.error) {\n";
 | 
						|
		code += onError("item.error");
 | 
						|
		code += "return true;\n";
 | 
						|
		code += "}\n";
 | 
						|
		code += "}\n";
 | 
						|
		code += "return false;\n";
 | 
						|
		code += "}\n";
 | 
						|
		code += this.callTapsParallel({
 | 
						|
			onError: (i, err, done, doneBreak) => {
 | 
						|
				let code = "";
 | 
						|
				code += `if(${i} < _results.length && ((_results.length = ${
 | 
						|
					i + 1
 | 
						|
				}), (_results[${i}] = { error: ${err} }), _checkDone())) {\n`;
 | 
						|
				code += doneBreak(true);
 | 
						|
				code += "} else {\n";
 | 
						|
				code += done();
 | 
						|
				code += "}\n";
 | 
						|
				return code;
 | 
						|
			},
 | 
						|
			onResult: (i, result, done, doneBreak) => {
 | 
						|
				let code = "";
 | 
						|
				code += `if(${i} < _results.length && (${result} !== undefined && (_results.length = ${
 | 
						|
					i + 1
 | 
						|
				}), (_results[${i}] = { result: ${result} }), _checkDone())) {\n`;
 | 
						|
				code += doneBreak(true);
 | 
						|
				code += "} else {\n";
 | 
						|
				code += done();
 | 
						|
				code += "}\n";
 | 
						|
				return code;
 | 
						|
			},
 | 
						|
			onTap: (i, run, done, _doneBreak) => {
 | 
						|
				let code = "";
 | 
						|
				if (i > 0) {
 | 
						|
					code += `if(${i} >= _results.length) {\n`;
 | 
						|
					code += done();
 | 
						|
					code += "} else {\n";
 | 
						|
				}
 | 
						|
				code += run();
 | 
						|
				if (i > 0) code += "}\n";
 | 
						|
				return code;
 | 
						|
			},
 | 
						|
			onDone
 | 
						|
		});
 | 
						|
		return code;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
const factory = new AsyncParallelBailHookCodeFactory();
 | 
						|
 | 
						|
function COMPILE(options) {
 | 
						|
	factory.setup(this, options);
 | 
						|
	return factory.create(options);
 | 
						|
}
 | 
						|
 | 
						|
function AsyncParallelBailHook(args = [], name = undefined) {
 | 
						|
	const hook = new Hook(args, name);
 | 
						|
	hook.constructor = AsyncParallelBailHook;
 | 
						|
	hook.compile = COMPILE;
 | 
						|
	hook._call = undefined;
 | 
						|
	hook.call = undefined;
 | 
						|
	return hook;
 | 
						|
}
 | 
						|
 | 
						|
AsyncParallelBailHook.prototype = null;
 | 
						|
 | 
						|
module.exports = AsyncParallelBailHook;
 |