UNPKG

node-make

Version:
397 lines (336 loc) 11.3 kB
'use strict'; 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;