arbor
Version:
A simple CLI tool to build projects across several platforms in parallel
1,009 lines (928 loc) • 78.4 kB
JavaScript
#!/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