UNPKG

arbor

Version:

A simple CLI tool to build projects across several platforms in parallel

1,009 lines (928 loc) 78.4 kB
#!/usr/bin/env node /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./package.json": /*!**********************!*\ !*** ./package.json ***! \**********************/ /*! exports provided: name, version, description, keywords, bin, scripts, author, contributors, license, repository, bugs, homepage, dependencies, devDependencies, default */ /***/ (function(module) { module.exports = {"name":"arbor","version":"0.8.2","description":"A simple CLI tool to build projects across several platforms in parallel","keywords":["Build","Tool","CLI"],"bin":"./dist/index.js","scripts":{"clean":"rimraf ./dist","lint":"tslint --project tsconfig.json","prebuild":"run-s -n clean lint","build":"webpack --config ./build/webpack.ts --progress","watch":"webpack --config ./build/webpack.ts --progress --watch"},"author":"Vintage Software <dev@vintagesoftware.com>","contributors":["Cory Rylan <crylan@vintagesoftware.com>","Kevin Phelps <kphelps@vintagesoftware.com>"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/vintage-software/arbor.git"},"bugs":{"url":"https://github.com/vintage-software/arbor/issues"},"homepage":"https://github.com/vintage-software/arbor#readme","dependencies":{"chalk":"2.4.2","dependency-graph":"0.8.0","injection-js":"2.2.1","reflect-metadata":"0.1.13","rxjs":"6.5.2","yargs":"13.2.4"},"devDependencies":{"@types/node":"12.0.8","@types/rimraf":"2.0.2","@types/webpack":"4.4.32","@types/yargs":"13.0.0","awesome-typescript-loader":"5.2.1","npm-run-all":"4.1.5","rimraf":"2.6.3","ts-node":"8.2.0","tslint":"5.17.0","typescript":"3.5.2","webpack":"4.34.0","webpack-cli":"3.3.4","webpack-node-externals":"1.7.2"}}; /***/ }), /***/ "./src/commands/run.command.ts": /*!*************************************!*\ !*** ./src/commands/run.command.ts ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var task_runner_service_1 = __webpack_require__(/*! ./../services/task-runner.service */ "./src/services/task-runner.service.ts"); var RunCommand = /** @class */ (function () { function RunCommand(taskRunner) { this.taskRunner = taskRunner; } RunCommand.prototype.run = function (taskFlags, options) { if (options.cwd && options.cwd.length) { this.chdir(options.cwd); } this.taskRunner.runTasks(taskFlags, options); }; RunCommand.prototype.chdir = function (cwd) { try { process.chdir(cwd); } catch (e) { console.log("fatal: error changing directory to " + cwd + "."); process.exit(1); } }; RunCommand = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", [task_runner_service_1.TaskRunnerService]) ], RunCommand); return RunCommand; }()); exports.RunCommand = RunCommand; /***/ }), /***/ "./src/commands/script.command.ts": /*!****************************************!*\ !*** ./src/commands/script.command.ts ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var script_service_1 = __webpack_require__(/*! ./../services/script.service */ "./src/services/script.service.ts"); var ScriptCommand = /** @class */ (function () { function ScriptCommand(scriptService) { this.scriptService = scriptService; } ScriptCommand.prototype.run = function (taskFlags, options) { this.scriptService.generateScript(taskFlags, options); }; ScriptCommand = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", [script_service_1.ScriptService]) ], ScriptCommand); return ScriptCommand; }()); exports.ScriptCommand = ScriptCommand; /***/ }), /***/ "./src/helpers/error.helpers.ts": /*!**************************************!*\ !*** ./src/helpers/error.helpers.ts ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var chalk_1 = __webpack_require__(/*! chalk */ "chalk"); function bail(message) { console.error(chalk_1.default.red("Error: " + message)); process.exit(1); } exports.bail = bail; /***/ }), /***/ "./src/helpers/progress.helpers.ts": /*!*****************************************!*\ !*** ./src/helpers/progress.helpers.ts ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var chalk_1 = __webpack_require__(/*! chalk */ "chalk"); var running_task_1 = __webpack_require__(/*! ./../interfaces/running-task */ "./src/interfaces/running-task.ts"); function getStatusText(runningTask) { var defaultStatus = getDefaultStatusText(runningTask.taskFlag); var statusText; switch (runningTask.status) { case running_task_1.TaskStatus.Waiting: statusText = chalk_1.default.gray('waiting...'); break; case running_task_1.TaskStatus.Success: statusText = chalk_1.default.green('done!'); break; case running_task_1.TaskStatus.Failed: statusText = chalk_1.default.red('failed!'); break; case running_task_1.TaskStatus.DependendecyFailed: statusText = chalk_1.default.red('dependency failed!'); break; case running_task_1.TaskStatus.InProgress: var showProgressLine = runningTask.currentCommand.noProgress !== true; var status_1 = (runningTask.statusText ? runningTask.statusText : defaultStatus) + "..."; var progress = showProgressLine && runningTask.progressLogLine ? runningTask.progressLogLine : ''; statusText = chalk_1.default.yellow(status_1) + " " + chalk_1.default.gray(progress); break; default: throw new Error("Unkown task status '" + runningTask.status + "' in project '" + runningTask.project.name + ".'"); } return statusText; } exports.getStatusText = getStatusText; function getDefaultStatusText(taskFlag) { var status = 'in progress'; if (taskFlag.indexOf('clean') > -1) { status = 'cleaning'; } else if (taskFlag.indexOf('clone') > -1) { status = 'cloning'; } else if (taskFlag.indexOf('install') > -1) { status = 'installing'; } else if (taskFlag.indexOf('build') > -1) { status = 'building'; } else if (taskFlag.indexOf('test') > -1) { status = 'testing'; } return status; } /***/ }), /***/ "./src/index.ts": /*!**********************!*\ !*** ./src/index.ts ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); __webpack_require__(/*! reflect-metadata */ "reflect-metadata"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var providers_1 = __webpack_require__(/*! ./providers */ "./src/providers.ts"); var arbor_program_service_1 = __webpack_require__(/*! ./services/arbor-program.service */ "./src/services/arbor-program.service.ts"); var injector = injection_js_1.ReflectiveInjector.resolveAndCreate(providers_1.providers); var program = injector.get(arbor_program_service_1.ArborProgramService); program.run(); /***/ }), /***/ "./src/interfaces/running-task.ts": /*!****************************************!*\ !*** ./src/interfaces/running-task.ts ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var TaskStatus; (function (TaskStatus) { TaskStatus[TaskStatus["Waiting"] = 0] = "Waiting"; TaskStatus[TaskStatus["InProgress"] = 1] = "InProgress"; TaskStatus[TaskStatus["Success"] = 2] = "Success"; TaskStatus[TaskStatus["Failed"] = 3] = "Failed"; TaskStatus[TaskStatus["DependendecyFailed"] = 4] = "DependendecyFailed"; })(TaskStatus = exports.TaskStatus || (exports.TaskStatus = {})); /***/ }), /***/ "./src/providers.ts": /*!**************************!*\ !*** ./src/providers.ts ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var run_command_1 = __webpack_require__(/*! ./commands/run.command */ "./src/commands/run.command.ts"); var script_command_1 = __webpack_require__(/*! ./commands/script.command */ "./src/commands/script.command.ts"); var arbor_program_service_1 = __webpack_require__(/*! ./services/arbor-program.service */ "./src/services/arbor-program.service.ts"); var config_service_1 = __webpack_require__(/*! ./services/config.service */ "./src/services/config.service.ts"); var console_service_1 = __webpack_require__(/*! ./services/console.service */ "./src/services/console.service.ts"); var dependency_graph_service_1 = __webpack_require__(/*! ./services/dependency-graph.service */ "./src/services/dependency-graph.service.ts"); var log_service_1 = __webpack_require__(/*! ./services/log.service */ "./src/services/log.service.ts"); var progress_service_1 = __webpack_require__(/*! ./services/progress.service */ "./src/services/progress.service.ts"); var project_service_1 = __webpack_require__(/*! ./services/project.service */ "./src/services/project.service.ts"); var script_service_1 = __webpack_require__(/*! ./services/script.service */ "./src/services/script.service.ts"); var shell_service_1 = __webpack_require__(/*! ./services/shell.service */ "./src/services/shell.service.ts"); var task_runner_service_1 = __webpack_require__(/*! ./services/task-runner.service */ "./src/services/task-runner.service.ts"); var task_service_1 = __webpack_require__(/*! ./services/task.service */ "./src/services/task.service.ts"); var version_service_1 = __webpack_require__(/*! ./services/version.service */ "./src/services/version.service.ts"); exports.providers = [ arbor_program_service_1.ArborProgramService, config_service_1.ConfigService, console_service_1.ConsoleService, dependency_graph_service_1.DependencyGraphService, log_service_1.LogService, progress_service_1.ProgressService, project_service_1.ProjectService, run_command_1.RunCommand, script_command_1.ScriptCommand, script_service_1.ScriptService, shell_service_1.ShellService, task_runner_service_1.TaskRunnerService, task_service_1.TaskService, version_service_1.VersionService ]; /***/ }), /***/ "./src/services/arbor-program.service.ts": /*!***********************************************!*\ !*** ./src/services/arbor-program.service.ts ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var yargs = __webpack_require__(/*! yargs */ "yargs"); var run_command_1 = __webpack_require__(/*! ./../commands/run.command */ "./src/commands/run.command.ts"); var script_command_1 = __webpack_require__(/*! ./../commands/script.command */ "./src/commands/script.command.ts"); var config_service_1 = __webpack_require__(/*! ./config.service */ "./src/services/config.service.ts"); var version_service_1 = __webpack_require__(/*! ./version.service */ "./src/services/version.service.ts"); var ArborProgramService = /** @class */ (function () { function ArborProgramService(configService, runCommand, scriptCommand, versionService) { this.configService = configService; this.runCommand = runCommand; this.scriptCommand = scriptCommand; this.versionService = versionService; } ArborProgramService.prototype.run = function () { var _this = this; this.versionService.checkForUpdate('arbor') .then(function () { return _this.registerCommands(); }) .then(function () { return yargs.argv; }); }; ArborProgramService.prototype.registerCommands = function () { var _this = this; yargs.version(version_service_1.VersionService.version); yargs .command('init', 'Create a new Arbor config', function (yargs2) { return yargs2; }, function () { _this.configService.createArborConfig(); }); yargs .command('run <tasks...>', 'Run a given list of Arbor tasks in the current working directory.', function (yargs2) { return yargs2 .option('cwd', { default: '.', description: 'Override the current working directory.' }) .option('retry-prompt', { default: true, description: 'Prompt to retry tasks after failure.' }); }, function (args) { _this.runCommand.run(args.tasks, { cwd: args.cwd, retryPrompt: !!args.retryPrompt }); }); yargs .command('script <tasks...>', 'Generate a script to run the given list of Arbor tasks in the current working directory.', function (yargs2) { return yargs2 .option('output', { default: 'build.bat', description: 'Filename to write script.' }) .option('dry-run', { default: false, description: 'Skip writing the output file.' }); }, function (args) { _this.scriptCommand.run(args.tasks, { output: args.output, dryRun: !!args.dryRun }); }); }; ArborProgramService = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", [config_service_1.ConfigService, run_command_1.RunCommand, script_command_1.ScriptCommand, version_service_1.VersionService]) ], ArborProgramService); return ArborProgramService; }()); exports.ArborProgramService = ArborProgramService; /***/ }), /***/ "./src/services/config.service.ts": /*!****************************************!*\ !*** ./src/services/config.service.ts ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var chalk_1 = __webpack_require__(/*! chalk */ "chalk"); var fs = __webpack_require__(/*! fs */ "fs"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var console_service_1 = __webpack_require__(/*! ./../services/console.service */ "./src/services/console.service.ts"); var ConfigService = /** @class */ (function () { function ConfigService(console) { this.console = console; } ConfigService.prototype.createArborConfig = function () { var _this = this; var config = "{\n \"name\": \"project-name\",\n \"tasks\": {\n \"install\": \"\",\n \"lint\": \"\",\n \"test\": \"\",\n \"build\": \"\",\n \"build--prod\": \"\",\n \"deploy\": \"\"\n },\n \"external\": [],\n \"dependencies\": []\n}\n "; fs.writeFile('arbor.json', config, 'utf8', function () { _this.console.log("" + chalk_1.default.green('Created new arbor.json config')); }); }; ConfigService = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", [console_service_1.ConsoleService]) ], ConfigService); return ConfigService; }()); exports.ConfigService = ConfigService; /***/ }), /***/ "./src/services/console.service.ts": /*!*****************************************!*\ !*** ./src/services/console.service.ts ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var readline = __webpack_require__(/*! readline */ "readline"); var ConsoleService = /** @class */ (function () { function ConsoleService() { this.consoleContents = ''; this.currentProgress = ''; } ConsoleService.prototype.log = function (output) { this.consoleContents += (output ? output : '') + "\n"; this.update(); }; ConsoleService.prototype.question = function (prompt) { var _this = this; var reader = readline.createInterface({ input: process.stdin, output: process.stdout }); return new Promise(function (resolve) { reader.question("\n" + prompt, function (response) { reader.close(); _this.consoleContents += "" + prompt + response + "\n"; _this.update(); resolve(response); }); }); }; ConsoleService.prototype.progress = function (output) { if (this.currentProgress !== output) { this.currentProgress = output; this.update(); } }; ConsoleService.prototype.finalizeProgress = function () { this.consoleContents += "\n" + this.currentProgress + "\n\n"; this.currentProgress = ''; this.update(); }; ConsoleService.prototype.update = function () { console.log(("\u001Bc" + this.consoleContents + "\n" + this.currentProgress).trim()); }; ConsoleService = __decorate([ injection_js_1.Injectable() ], ConsoleService); return ConsoleService; }()); exports.ConsoleService = ConsoleService; /***/ }), /***/ "./src/services/dependency-graph.service.ts": /*!**************************************************!*\ !*** ./src/services/dependency-graph.service.ts ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var dependency_graph_1 = __webpack_require__(/*! dependency-graph */ "dependency-graph"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var DependencyGraphService = /** @class */ (function () { function DependencyGraphService() { } DependencyGraphService.prototype.orderProjectsByDependencyGraph = function (projects) { var dependencyGraph = new dependency_graph_1.DepGraph(); for (var _i = 0, projects_1 = projects; _i < projects_1.length; _i++) { var project = projects_1[_i]; dependencyGraph.addNode(project.name, project); } for (var _a = 0, projects_2 = projects; _a < projects_2.length; _a++) { var dependant = projects_2[_a]; if (dependant.dependencies && dependant.dependencies.length) { for (var _b = 0, _c = dependant.dependencies; _b < _c.length; _b++) { var depencency = _c[_b]; if (dependencyGraph.hasNode(depencency)) { dependencyGraph.addDependency(dependant.name, depencency); } } } } return dependencyGraph.overallOrder() .map(function (projectName) { return dependencyGraph.getNodeData(projectName); }); }; DependencyGraphService = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", []) ], DependencyGraphService); return DependencyGraphService; }()); exports.DependencyGraphService = DependencyGraphService; /***/ }), /***/ "./src/services/log.service.ts": /*!*************************************!*\ !*** ./src/services/log.service.ts ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); var fs = __webpack_require__(/*! fs */ "fs"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var errorLogFile = 'arbor-error.log'; var infoLogFile = 'arbor-info.log'; var LogService = /** @class */ (function () { function LogService() { } LogService.prototype.log = function (output, error) { if (output) { var file = error ? errorLogFile : infoLogFile; var outputToWrite = output.replace(/\r\n|\r|\n/g, '\r\n'); fs.appendFileSync(file, outputToWrite); } }; LogService.prototype.deleteLogs = function () { for (var _i = 0, _a = [errorLogFile, infoLogFile]; _i < _a.length; _i++) { var file = _a[_i]; if (fs.existsSync(file)) { fs.unlinkSync(file); } } }; LogService = __decorate([ injection_js_1.Injectable() ], LogService); return LogService; }()); exports.LogService = LogService; /***/ }), /***/ "./src/services/progress.service.ts": /*!******************************************!*\ !*** ./src/services/progress.service.ts ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var progress_helpers_1 = __webpack_require__(/*! ../helpers/progress.helpers */ "./src/helpers/progress.helpers.ts"); var console_service_1 = __webpack_require__(/*! ./../services/console.service */ "./src/services/console.service.ts"); var ProgressService = /** @class */ (function () { function ProgressService(console) { this.console = console; } ProgressService.prototype.updateRunningTasks = function (runningTasks) { var output = runningTasks .map(function (runningTask) { return " " + runningTask.project.name + ": " + progress_helpers_1.getStatusText(runningTask); }) .join('\n'); this.console.progress(output); }; ProgressService.prototype.finalizeRunningTasks = function () { this.console.finalizeProgress(); }; ProgressService = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", [console_service_1.ConsoleService]) ], ProgressService); return ProgressService; }()); exports.ProgressService = ProgressService; /***/ }), /***/ "./src/services/project.service.ts": /*!*****************************************!*\ !*** ./src/services/project.service.ts ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var fs = __webpack_require__(/*! fs */ "fs"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var path = __webpack_require__(/*! path */ "path"); var error_helpers_1 = __webpack_require__(/*! ./../helpers/error.helpers */ "./src/helpers/error.helpers.ts"); var ProjectService = /** @class */ (function () { function ProjectService() { } ProjectService.prototype.getProjects = function () { var _this = this; var configFiles = this.getConfigs('./'); return this.readProjects(configFiles) .then(function (projects) { return _this.validateProjects(projects); }); }; ProjectService.prototype.getConfigs = function (dir, filelist) { if (filelist === void 0) { filelist = []; } var filePaths = fs.readdirSync(dir); for (var _i = 0, filePaths_1 = filePaths; _i < filePaths_1.length; _i++) { var filePath = filePaths_1[_i]; var absolutePath = path.join(dir, filePath); if (fs.statSync(absolutePath).isDirectory() && !absolutePath.includes('node_modules')) { filelist = this.getConfigs(absolutePath, filelist); } else if (absolutePath.endsWith('arbor.json')) { filelist = filelist.concat(absolutePath); } } return filelist; }; ProjectService.prototype.readProjects = function (configFiles) { var _this = this; return new Promise(function (resolve, reject) { var promises = configFiles .map(function (configFile) { return _this.readConfig(configFile); }); Promise.all(promises) .then(function (projects) { return resolve([].concat.apply([], projects)); }) .catch(function (error) { return reject(error); }); }); }; ProjectService.prototype.readConfig = function (configFile) { return new Promise(function (resolve, reject) { fs.readFile(configFile, function (error, data) { if (error) { reject(error); } else { var projectPath = path.resolve(path.dirname(configFile)); var projects = JSON.parse(data.toString()); projects = Array.isArray(projects) ? projects : [projects]; for (var _i = 0, projects_1 = projects; _i < projects_1.length; _i++) { var project = projects_1[_i]; project.projectPath = projectPath; } resolve(projects); } }); }); }; ProjectService.prototype.validateProjects = function (projects) { var namePattern = /^[a-z0-9 -]+$/i; var nameRule = 'must contain only letters, numbers, spaces, and dashes'; var taskOptionPattern = /^[a-z0-9,]+$/i; var taskOptionRule = 'must contain only letters, numbers, and commas (for separation)'; for (var _i = 0, projects_2 = projects; _i < projects_2.length; _i++) { var project = projects_2[_i]; if (namePattern.test(project.name) === false) { error_helpers_1.bail("Project names " + nameRule + ". (project '" + project.name + "')"); } for (var _a = 0, _b = Object.keys(project.tasks); _a < _b.length; _a++) { var taskName = _b[_a]; if (namePattern.test(taskName) === false) { error_helpers_1.bail("Task names " + nameRule + ". ('" + project.name + "' project, '" + taskName + "' task)"); } var task = project.tasks[taskName]; var taskCommands = (Array.isArray(task) ? task : [task]) .map(function (command) { return typeof command === 'string' ? { command: command } : command; }); for (var _c = 0, taskCommands_1 = taskCommands; _c < taskCommands_1.length; _c++) { var taskCommand = taskCommands_1[_c]; if (typeof taskCommand.command !== 'string') { if (Object.keys(taskCommand.command).includes('') === false) { error_helpers_1.bail("Task must define a default command. ('" + project.name + "' project, '" + taskName + "' task)"); } for (var _d = 0, _e = Object.keys(taskCommand.command); _d < _e.length; _d++) { var taskOption = _e[_d]; if (taskOption !== '' && taskOptionPattern.test(taskOption) === false) { error_helpers_1.bail("Task options " + taskOptionRule + ". ('" + project.name + "' project, '" + taskName + "' task, '" + taskOption + "' option)"); } } } } } } var projectTaskNames = projects .map(function (project) { return Object.keys(project.tasks).map(function (taskName) { return project.name + ": " + taskName; }); }) .reduce(function (acc, tasks) { return acc.concat(tasks); }, []); for (var _f = 0, projectTaskNames_1 = projectTaskNames; _f < projectTaskNames_1.length; _f++) { var projectTaskName = projectTaskNames_1[_f]; if (projectTaskNames.indexOf(projectTaskName) !== projectTaskNames.lastIndexOf(projectTaskName)) { error_helpers_1.bail("Task '" + projectTaskName + "' has duplicate definitions."); } } return projects; }; ProjectService = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", []) ], ProjectService); return ProjectService; }()); exports.ProjectService = ProjectService; /***/ }), /***/ "./src/services/script.service.ts": /*!****************************************!*\ !*** ./src/services/script.service.ts ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var chalk_1 = __webpack_require__(/*! chalk */ "chalk"); var fs_1 = __webpack_require__(/*! fs */ "fs"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var path = __webpack_require__(/*! path */ "path"); var dependency_graph_service_1 = __webpack_require__(/*! ./dependency-graph.service */ "./src/services/dependency-graph.service.ts"); var project_service_1 = __webpack_require__(/*! ./project.service */ "./src/services/project.service.ts"); var task_service_1 = __webpack_require__(/*! ./task.service */ "./src/services/task.service.ts"); var version_service_1 = __webpack_require__(/*! ./version.service */ "./src/services/version.service.ts"); var ScriptService = /** @class */ (function () { function ScriptService(dependencyGraphService, projectService, taskService) { this.dependencyGraphService = dependencyGraphService; this.projectService = projectService; this.taskService = taskService; } ScriptService.prototype.generateScript = function (taskFlags, options) { var _this = this; if (options.output === undefined) { console.log(chalk_1.default.red('output path is required.')); } if (taskFlags.length) { console.log("Arbor v" + version_service_1.VersionService.version + ": scripting tasks " + taskFlags.join(', ') + " in " + process.cwd()); this.projectService.getProjects() .then(function (projects) { return _this.taskService.matchTasks(projects, taskFlags); }) .then(function (projects) { var script = 'echo off'; for (var _i = 0, taskFlags_1 = taskFlags; _i < taskFlags_1.length; _i++) { var taskFlag = taskFlags_1[_i]; script += _this.generateTaskScript(taskFlag, projects); } script += "\ngoto success\n\n:error\necho;\necho " + _this.colorEcho('*** There was an error in the above task. Exiting... ***', 31) + "\nexit /b 1\n\n:success\nexit /b"; if (options.dryRun) { console.log(); console.log(chalk_1.default.green("Dry run. '" + options.output + "' was not written.")); } else { fs_1.writeFileSync(options.output, script); console.log(); console.log(chalk_1.default.green("'" + options.output + "' has been written.")); } }); } }; ScriptService.prototype.generateTaskScript = function (taskFlag, allProjects) { var script = ''; console.log(); console.log("scripting " + taskFlag + ":"); var projects = this.dependencyGraphService.orderProjectsByDependencyGraph(allProjects.filter(function (project) { return project.tasks[taskFlag] !== undefined; })); for (var _i = 0, projects_1 = projects; _i < projects_1.length; _i++) { var project = projects_1[_i]; var task = project.tasks[taskFlag]; script += "\necho;\necho " + this.colorEcho("*** Running task \"" + taskFlag + "\" in project \"" + project.name + ".\" ***", 32); for (var _a = 0, task_1 = task; _a < task_1.length; _a++) { var command = task_1[_a]; var cwd = void 0; if (command.cwd) { cwd = path.normalize(path.join(project.projectPath, command.cwd)); } else if (project.cwd) { cwd = path.normalize(path.join(project.projectPath, project.cwd)); } else { cwd = project.projectPath; } console.log(chalk_1.default.gray(cwd) + "> " + command.command); script += "\necho;\necho " + this.colorEcho(cwd + "^> " + command.command, 90) + "\npushd " + cwd + "\ncall " + command.command + "\nif errorlevel 1 goto error\npopd"; } } return script; }; ScriptService.prototype.colorEcho = function (message, color) { // color code reference: https://gist.github.com/mlocati/fdabcaeb8071d5c75a2d51712db24011#file-win10colors-cmd return "\u001B[" + color + "m" + message + "\u001B[0m"; }; ScriptService = __decorate([ injection_js_1.Injectable(), __metadata("design:paramtypes", [dependency_graph_service_1.DependencyGraphService, project_service_1.ProjectService, task_service_1.TaskService]) ], ScriptService); return ScriptService; }()); exports.ScriptService = ScriptService; /***/ }), /***/ "./src/services/shell.service.ts": /*!***************************************!*\ !*** ./src/services/shell.service.ts ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); var child_process_1 = __webpack_require__(/*! child_process */ "child_process"); var injection_js_1 = __webpack_require__(/*! injection-js */ "injection-js"); var ShellService = /** @class */ (function () { function ShellService() { } ShellService.prototype.execute = function (command, options, continuousCallback) { var _this = this; var cwd = options && options.cwd || process.cwd(); var commandAndArgs = process.platform === 'win32' ? { command: 'cmd', args: ['/c', command] } : { command: 'sh', args: ['-c', command] }; return new Promise(function (resolve, reject) { var result = { cwd: cwd, command: command, stdout: '', stderr: '', error: undefined }; var spawnedProcess = child_process_1.spawn(commandAndArgs.command, commandAndArgs.args, options); spawnedProcess.stdout.on('data', function (data) { _this.processData(result, data, false, continuousCallback); }); spawnedProcess.stderr.on('data', function (data) { _this.processData(result, data, true, continuousCallback); }); var done = false; var handleResult = function (error, code, signal) { if (done === false) { result.error = error; if (code !== 0) { result.error = Object.assign({}, result.error || {}, { code: code, signal: signal }); } if (result.error !== undefined) { reject(result); } else { resolve(result); } done = true; } }; spawnedProcess.on('error', function (error) { handleResult(error); }); spawnedProcess.on('exit', function (code, signal) { handleResult(undefined, code, signal); }); return function () { spawnedProcess.kill(); }; }); }; ShellService.prototype.fork = function (modulePath, args, options, messageCallback) { var cwd = options.cwd || process.cwd(); return new Promise(function (resolve, reject) { var result = { cwd: cwd, modulePath: modulePath, error: undefined }; var forkedProcess = child_process_1.fork(modulePath, args, __assign({}, options)); var messagesWaiting = 0; forkedProcess.on('message', function (message) { if (messageCallback) { messagesWaiting++; messageCallback(message) .subscribe({ complete: function () { messagesWaiting--; } }); } }); var done = false; var handleResult = function (error, code, signal) { if (done === false) { if (messagesWaiting <= 0) { result.error = error; if (code !== 0) { result.error = Object.assign({}, result.error || {}, { code: code, signal: signal }); } if (result.error !== undefined) { rejec