UNPKG

graphcool-cli-core

Version:

274 lines 11.8 kB
"use strict"; var __assign = (this && this.__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; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [0, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var childProcess = require("child_process"); var path = require("path"); var fs = require("fs-extra"); var chalk_1 = require("chalk"); var lodash_1 = require("lodash"); var Docker = /** @class */ (function () { function Docker(out, config, env, clusterName) { this.ymlPath = path.join(__dirname, 'docker/docker-compose.yml'); this.envPath = path.join(__dirname, 'docker/.envrc'); this.out = out; this.config = config; this.env = env; this.clusterName = clusterName; } Docker.prototype.init = function () { return __awaiter(this, void 0, void 0, function () { var port, functionsPort, cluster, defaultVars, portfinder, _a, _b, customVars; return __generator(this, function (_c) { switch (_c.label) { case 0: port = null; functionsPort = null; if (this.env.rc.clusters && this.env.rc.clusters[this.clusterName]) { this.env.setActiveCluster(this.clusterName); cluster = this.env.rc.clusters[this.clusterName]; port = cluster.host.split(':').slice(-1)[0]; if (cluster.faasHost) { functionsPort = cluster.faasHost.split(':').slice(-1)[0]; } } defaultVars = this.getDockerEnvVars(); portfinder = require('portfinder'); _a = port; if (_a) return [3 /*break*/, 2]; return [4 /*yield*/, portfinder.getPortPromise({ port: 60000 })]; case 1: _a = (_c.sent()); _c.label = 2; case 2: port = _a; _b = functionsPort; if (_b) return [3 /*break*/, 4]; return [4 /*yield*/, portfinder.getPortPromise({ port: 60050 })]; case 3: _b = (_c.sent()); _c.label = 4; case 4: functionsPort = _b; customVars = { PORT: String(port), FUNCTIONS_PORT: String(functionsPort) }; this.out.log("Running local Graphcool cluster at http://localhost:" + customVars.PORT); this.out.log("Running local FaaS runtime at http://localhost:" + customVars.FUNCTIONS_PORT); this.out.log("This may take several minutes"); this.envVars = __assign({}, process.env, defaultVars, customVars); return [2 /*return*/]; } }); }); }; Docker.prototype.up = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); return [2 /*return*/, this.run('up', '-d', '--remove-orphans')]; } }); }); }; Docker.prototype.ps = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); return [2 /*return*/, this.run('ps')]; } }); }); }; Docker.prototype.start = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); return [2 /*return*/, this.run('start')]; } }); }); }; Docker.prototype.stop = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); return [2 /*return*/, this.run('stop')]; } }); }); }; Docker.prototype.restart = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); return [2 /*return*/, this.run('restart')]; } }); }); }; Docker.prototype.pull = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); return [2 /*return*/, this.run('pull', '--parallel')]; } }); }); }; Docker.prototype.run = function () { var _this = this; var argv = []; for (var _i = 0; _i < arguments.length; _i++) { argv[_i] = arguments[_i]; } return new Promise(function (resolve, reject) { var defaultArgs = [ '-p', JSON.stringify(_this.clusterName), '--file', _this.ymlPath, '--project-directory', _this.config.cwd, ]; var args = defaultArgs.concat(argv); _this.out.log(chalk_1.default.dim("$ docker-compose " + argv.join(' ') + "\n")); var child = childProcess.spawn('docker-compose', args, { env: _this.envVars, cwd: _this.config.cwd, }); child.stdout.on('data', function (data) { _this.out.log(_this.format(data)); }); child.stderr.on('data', function (data) { _this.out.log(_this.format(data)); }); child.on('error', function (err) { _this.out.error(err); }); child.on('close', function (code) { if (code !== 0) { reject(code); } else { resolve(_this); } }); }); }; Docker.prototype.format = function (data) { return data .toString() .trim() .split(/\n/) .map(function (l) { return chalk_1.default.blue('docker') + " " + l; }) .join('\n'); }; Docker.prototype.getDockerEnvVars = function () { var file = fs.readFileSync(this.envPath, 'utf-8'); return this.parseEnv(file); }; Docker.prototype.parseEnv = function (src) { var _this = this; var regex = /^\s*export\s*([a-zA-Z0-9\.\-_]+)\s*=(.*)?\s*/; var variableSyntax = new RegExp('\\${([ ~:a-zA-Z0-9._\'",\\-\\/\\(\\)]+?)}', 'g'); var vars = src .toString() .split(/\r\n|\r|\n/g) .reduce(function (acc, line) { if (line.trim().startsWith('#')) { return acc; } var match = line.match(regex); if (!match) { return acc; } var key = match[1]; var value = match[2] || ''; var length = value ? value.length : 0; if (length > 0 && value.startsWith('"') && value.endsWith('"')) { value = value.replace(/\\n/gm, '\n'); } value = value.replace(/(^['"]|['"]$)/g, '').trim(); return __assign({}, acc, (_a = {}, _a[key] = value, _a)); var _a; }, {}); return lodash_1.mapValues(vars, function (value, key) { var match = variableSyntax.exec(value); if (match) { var varName = match[1]; if (vars[varName]) { var newValue = value.slice(0, match.index) + vars[varName] + value.slice(match.index + match[0].length); return newValue; } else { _this.out.warn("No variable for env var " + key + " and value " + match[0] + " found"); } } return value; }); }; return Docker; }()); exports.default = Docker; //# sourceMappingURL=Docker.js.map