All files / Nodejs/lib compile.js

0% Statements 0/36
0% Branches 0/18
0% Functions 0/9
0% Lines 0/35

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                                                                                                                                                       
'use strict';
 
module.exports = {
	compile: function compile(code, process) {
		let self = this;
		let evalFn = eval;
		if (typeof code == "function") {
			evalFn = () => {
				return function (wrap) {
					let exports = {
						handler: code
					};
					let module = {
						exports: exports
					}
					return wrap(exports, module)
				};
			}
		} else if (typeof code === "object") {
			evalFn = () => {
				return function (wrap) {
 
					let module = code;
					if (!code.exports) {
						module = {
							exports: code
						}
					}
					return wrap(module.exports, module);
				};
			}
		} else {
			let exp = `((wrap) => {
				var exports = {};
				var module = {
					exports :exports
				};
				${code}
				return wrap(exports, module);
			})`;
 
			// Not an exports module.  Just a return value.  
			// Wrap it as a module
			if (!code.match(/([^\w\d]+ *exports\.?.*?)\s*=/gm)) {
				exp = `((wrap) => {
					var exports = {};
					var module = {
						exports :exports
					};
					exports.handler = (data)=>{let $ = data; ${code}}
					return wrap(exports, module);
				})`;
			}
			evalFn = () => eval(exp);
		}
		return evalFn()(function (exports, module) {
			if (!exports.handler && exports.each) {
				exports.handler = exports.each;
			}
 
			exports.each = self.callbackify(exports.each, 1);
			exports.handler = self.callbackify(exports.handler, 1);
 
			if (typeof process === "function") {
				process(exports, module);
			}
			return exports;
		});
	},
	callbackify: function (fn, arity) {
		if (fn && fn.length <= arity) {
			return function () {
				let done = arguments[arguments.length - 1];
				try {
					done(null, fn.apply(this, arguments));
				} catch (err) {
					done(err);
				}
			}
		}
		return fn;
	}
}