node-make
Version:
Make for Node.js
397 lines (336 loc) • 11.3 kB
JavaScript
;
var _regeneratorRuntime = require('babel-runtime/regenerator');
_regeneratorRuntime = 'default' in _regeneratorRuntime ? _regeneratorRuntime['default'] : _regeneratorRuntime;
var _asyncToGenerator = require('babel-runtime/helpers/asyncToGenerator');
_asyncToGenerator = 'default' in _asyncToGenerator ? _asyncToGenerator['default'] : _asyncToGenerator;
var _classCallCheck = require('babel-runtime/helpers/classCallCheck');
_classCallCheck = 'default' in _classCallCheck ? _classCallCheck['default'] : _classCallCheck;
var _createClass = require('babel-runtime/helpers/createClass');
_createClass = 'default' in _createClass ? _createClass['default'] : _createClass;
var fs = require('mz/fs');
fs = 'default' in fs ? fs['default'] : fs;
var _getIterator = require('babel-runtime/core-js/get-iterator');
_getIterator = 'default' in _getIterator ? _getIterator['default'] : _getIterator;
var stripComments = require('strip-comments');
stripComments = 'default' in stripComments ? stripComments['default'] : stripComments;
var path = require('path');
path = 'default' in path ? path['default'] : path;
var pathExists = require('path-exists');
pathExists = 'default' in pathExists ? pathExists['default'] : pathExists;
var _slicedToArray = require('babel-runtime/helpers/slicedToArray');
_slicedToArray = 'default' in _slicedToArray ? _slicedToArray['default'] : _slicedToArray;
var babel = require('babel-core');
babel = 'default' in babel ? babel['default'] : babel;
var requireFromString = require('require-from-string');
requireFromString = 'default' in requireFromString ? requireFromString['default'] : requireFromString;
var fs$1 = require('fs');
var resolveIndent = require('resolve-indent');
resolveIndent = 'default' in resolveIndent ? resolveIndent['default'] : resolveIndent;
var O = require('orchestrator');
O = 'default' in O ? O['default'] : O;
var prettyHrtime = require('pretty-hrtime');
prettyHrtime = 'default' in prettyHrtime ? prettyHrtime['default'] : prettyHrtime;
var o = new O();
o.on('task_start', function (e) {
log('Starting', ('\'' + e.task + '\'').cyan, '...');
});
o.on('task_stop', function (e) {
log('Finished', ('\'' + e.task + '\'').cyan, 'in ' + prettyHrtime(e.hrDuration));
});
function addTasks(tasks) {
for (var task in tasks) {
if (typeof tasks[task] === 'function') {
o.add(task.substring(2), tasks[task]);
}
}
}
function startTask(task, cb) {
o.start(task, function (err) {
if (err) {
if (err.missingTask) {
log(('Task \'' + err.missingTask + '\' not found').red);
} else {
console.log(err);
}
} else if (cb) {
cb();
}
});
}
var getFileByOrder = function () {
var ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee() {
for (var _len = arguments.length, files = Array(_len), _key = 0; _key < _len; _key++) {
files[_key] = arguments[_key];
}
var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, file, data;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context.prev = 3;
_iterator = _getIterator(files);
case 5:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context.next = 20;
break;
}
file = _step.value;
_context.next = 9;
return pathExists(file);
case 9:
if (!_context.sent) {
_context.next = 17;
break;
}
_context.t0 = file;
_context.next = 13;
return fs.readFile(file, 'utf8');
case 13:
_context.t1 = _context.sent;
_context.t2 = stripComments(_context.t1);
data = {
name: _context.t0,
value: _context.t2
};
return _context.abrupt('return', data);
case 17:
_iteratorNormalCompletion = true;
_context.next = 5;
break;
case 20:
_context.next = 26;
break;
case 22:
_context.prev = 22;
_context.t3 = _context['catch'](3);
_didIteratorError = true;
_iteratorError = _context.t3;
case 26:
_context.prev = 26;
_context.prev = 27;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 29:
_context.prev = 29;
if (!_didIteratorError) {
_context.next = 32;
break;
}
throw _iteratorError;
case 32:
return _context.finish(29);
case 33:
return _context.finish(26);
case 34:
log('Could not find Makefile in current directory!'.red);
process.exit();
case 36:
case 'end':
return _context.stop();
}
}
}, _callee, this, [[3, 22, 26, 34], [27,, 29, 33]]);
}));
return function getFileByOrder(_x) {
return ref.apply(this, arguments);
};
}();
function joinCurrentDir(filePath) {
return filePath ? path.join(process.cwd(), filePath) : null;
}
var getConfigFile = function () {
var ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee2() {
var customFile = arguments.length <= 0 || arguments[0] === undefined ? joinCurrentDir('makefile.js') : arguments[0];
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return getFileByOrder(customFile, joinCurrentDir('mk.js'));
case 2:
return _context2.abrupt('return', _context2.sent);
case 3:
case 'end':
return _context2.stop();
}
}
}, _callee2, this);
}));
return function getConfigFile(_x2) {
return ref.apply(this, arguments);
};
}();
function parseTaskName(name) {
var task = {
name: name,
type: ''
};
var indexOfAsync = name.indexOf('@async');
if (indexOfAsync > 0) {
task.name = name.substring(0, indexOfAsync);
task.type = 'async';
}
return task;
}
function generateTaskFn(task, content) {
var fn = undefined;
if (task.type === 'async') {
fn = 'export const __' + task.name + ' = async () => {';
} else {
fn = 'export const __' + task.name + ' = () => {';
}
if (content) {
fn += '\n' + content + '\n}';
}
return fn;
}
var RE_MATCH_EXEC = /^\>{1}(\s*)([^\n\>]+)$/;
var RE_MACTH_MULTI_EXEC = /\>{3}\s*\n([^.\>{3}]+)\n\s*\<{3}/g;
/**
* Walk each line and return formated string
*
* @param {Array} lines
* @returns {String}
*/
function walk(lines) {
lines = lines.map(function (line) {
line = line.trim();
if (RE_MATCH_EXEC.test(line)) {
var _line$match = line.match(RE_MATCH_EXEC);
var _line$match2 = _slicedToArray(_line$match, 3);
var command = _line$match2[2];
return 'exec(`' + command.trim() + '`)';
}
return line;
}).join('\n');
lines = lines.replace(RE_MACTH_MULTI_EXEC, function (m, p1) {
p1 = p1.split(/\r?\n/);
p1 = p1.map(function (p) {
return 'exec(`' + p.trim() + '`)';
}).join('\n');
return '\n' + p1 + '\n';
});
return lines;
}
var RE_MATCH_LINES = /\r?\n{1,}/;
var RE_MATCH_INTRO = /^([a-zA-Z0-9\@\.\_\-]+)\:\s*/;
var transformOptions = {
presets: [require('babel-preset-es2015'), require('babel-preset-stage-0')],
plugins: [require('babel-plugin-transform-runtime')],
babelrc: false
};
function parser(string, filePath) {
if (typeof string !== 'string') {
throw new TypeError('Input is not string!');
}
string = resolveIndent(string);
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = _getIterator(string.entries()), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _step$value = _slicedToArray(_step.value, 2);
var i = _step$value[0];
var s = _step$value[1];
var lines = s.split(RE_MATCH_LINES).filter(function (line) {
return !!line.replace(/\s/g, '');
});
var intro = lines[0];
if (RE_MATCH_INTRO.test(intro) && intro.substring(7) !== 'import ') {
var _intro$match = intro.match(RE_MATCH_INTRO);
var _intro$match2 = _slicedToArray(_intro$match, 2);
var taskName = _intro$match2[1];
// match taskName, externalFile from line one
// prepend to function heading
taskName = parseTaskName(taskName);
lines[0] = generateTaskFn(taskName);
// append `}` to function ending
lines.push('}');
lines = walk(lines);
string[i] = lines;
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var code = undefined;
try {
code = babel.transform(string.join('\n\n'), transformOptions).code;
return requireFromString(code, filePath, {
appendPaths: [path.join(__dirname, './node_modules')]
});
} catch (e) {
console.log(e.stack);
}
}
global.emit = function emit(task, cb) {
startTask(task, cb);
};
var Make = function () {
function Make() {
_classCallCheck(this, Make);
this.requireMakeFile();
}
_createClass(Make, [{
key: 'requireMakeFile',
value: function () {
var ref = _asyncToGenerator(_regeneratorRuntime.mark(function _callee() {
var _ref, value, name;
return _regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return getConfigFile(argv.c || argv.config);
case 3:
_ref = _context.sent;
value = _ref.value;
name = _ref.name;
this.runTask(parser(value, name));
_context.next = 12;
break;
case 9:
_context.prev = 9;
_context.t0 = _context['catch'](0);
console.log(_context.t0.stack);
case 12:
case 'end':
return _context.stop();
}
}
}, _callee, this, [[0, 9]]);
}));
return function requireMakeFile() {
return ref.apply(this, arguments);
};
}()
}, {
key: 'runTask',
value: function runTask(tasks) {
addTasks(tasks);
var taskName = argv._[0] || 'default';
startTask(taskName);
}
}]);
return Make;
}();
function make() {
return new Make();
}
module.exports = make;