UNPKG

pk-template

Version:
185 lines 16.3 kB
"use strict"; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const exception_1 = require("../pk-util/exception"); const projectConf_1 = require("../pk-conf/projectConf"); const path_1 = require("path"); const module_1 = require("../pk-conf/module"); const os_1 = require("os"); const preserveDir_1 = require("../pk-util/preserveDir"); const lazy_1 = require("../lazy"); const child_process_1 = require("child_process"); const fs_1 = require("fs"); exports.log = (...args) => console.log(...args); exports.tryCatch = (cb, debug) => __awaiter(this, void 0, void 0, function* () { try { yield cb(); } catch (e) { yield exception_1.exceptionHandler(e, debug); } }); exports.atHomeDir = (cb) => __awaiter(this, void 0, void 0, function* () { const home = os_1.homedir(); yield exports.atDir(home, () => __awaiter(this, void 0, void 0, function* () { yield cb(home); })); }); exports.atDir = (dir, cb) => __awaiter(this, void 0, void 0, function* () { yield preserveDir_1.preserveDir(() => __awaiter(this, void 0, void 0, function* () { process.chdir(dir); yield cb(dir); })); }); exports.atProjectDir = (cb) => __awaiter(this, void 0, void 0, function* () { const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find(); if (!projectRoot || !projectConf) { throw new Error(`cannot find ${projectConf_1.PkProjectConf.FILENAME}`); } yield exports.atDir(projectRoot, () => __awaiter(this, void 0, void 0, function* () { yield cb(projectRoot, projectConf); })); }); exports.invokeModuleHooks = (pk, projectConf, name, value) => __awaiter(this, void 0, void 0, function* () { for (const mod of projectConf.data.modules) { const hookPath = path_1.join(process.cwd(), 'pk-modules', mod.name, 'hooks', `${name}.js`); if (fs_1.existsSync(hookPath)) { const hook = require(hookPath)(pk); yield hook(value); } } }); exports.atAppDir = (appName, cb) => __awaiter(this, void 0, void 0, function* () { const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find(); if (!projectRoot || !projectConf) { throw new Error(`cannot find ${projectConf_1.PkProjectConf.FILENAME}`); } const app = projectConf.getApp(appName); if (!app) { throw new Error(`app ${appName} does not exists`); } yield exports.atDir(path_1.join(projectRoot, appName), () => __awaiter(this, void 0, void 0, function* () { yield cb(app); })); }); exports.atModuleDir = (moduleName, cb) => __awaiter(this, void 0, void 0, function* () { const { projectRoot, projectConf } = projectConf_1.PkProjectConf.find(); if (!projectRoot || !projectConf) { throw new Error(`cannot find ${projectConf_1.PkProjectConf.FILENAME}`); } const module = projectConf.getModule(moduleName); if (!module) { throw new Error(`module ${moduleName} does not exists`); } yield exports.atDir(path_1.join(projectRoot, module_1.MODULE_DIR, moduleName), () => __awaiter(this, void 0, void 0, function* () { yield cb(module); })); }); exports.getCurrentDirectoryApp = (apps, root, cwd) => { const app = apps.find(app => path_1.normalize(cwd) === path_1.normalize(path_1.join(root, app.name))); if (!app) { throw new Error('please specify app anme'); } return app; }; exports.getEnvNames = (projectConf, app) => { const envs = {}; if (projectConf.data.envs) { for (const env of projectConf.data.envs) { envs[env.name] = true; } } if (app.envs) { for (const env of app.envs) { envs[env.name] = true; } } return Object.keys(envs); }; exports.visitEachDeployments = (appName, envName, clusterName, cbb) => __awaiter(this, void 0, void 0, function* () { const cwd = process.cwd(); yield exports.atProjectDir((projectRoot, projectConf) => __awaiter(this, void 0, void 0, function* () { if (!projectConf.data.apps || projectConf.data.apps.length == 0) { throw new Error('no apps defined in pk-project.yaml'); } if (appName == '.') { appName = exports.getCurrentDirectoryApp(projectConf.data.apps, projectRoot, cwd).name; } // const appNames = targetAppNames(projectRoot, projectConf); for (const app of projectConf.data.apps) { if (appName != 'all' && appName != app.name) { continue; } yield exports.atAppDir(app.name, (app) => __awaiter(this, void 0, void 0, function* () { const envs = app.envs || projectConf.data.envs; if (envs.length == 0) { if (envName && envName != 'all') { throw new Error(`env ${envName} does not exists`); } } for (const env of envs) { if (envName != 'all' && envName && envName != env.name) { continue; } for (const cluster of env.clusters) { if (clusterName != 'all' && clusterName && clusterName != cluster) { continue; } console.error(`* app = ${app.name}, env = ${env.name}, cluster = ${cluster}`); yield cbb(projectRoot, projectConf, app, env.name, cluster); } } })); } })); }); exports.prompt = (inq) => __awaiter(this, void 0, void 0, function* () { return yield lazy_1.getInquirer().prompt(inq); }); exports.promptStart = (msg) => { console.log(lazy_1.getChalk().grey(` ${msg} ...`)); }; exports.promptSkip = () => { console.log(lazy_1.getChalk().grey(' skipped !!!')); }; exports.promptSuccess = (msg) => { console.log(lazy_1.getChalk().grey(` ${msg} !!!`)); }; exports.tpl = (file) => { const _ = lazy_1.getUnderscore(); const tpl = fs_1.readFileSync(file, 'utf8'); return _.template(tpl); }; exports.exec = (command) => __awaiter(this, void 0, void 0, function* () { console.log(lazy_1.getChalk().grey(` * exec: ${command}`)); return new Promise((resolve, reject) => { try { const ps = child_process_1.exec(command); process.stdout.write(' '); const cb = (data) => { const indented = data.replace(/\n/g, '\n '); process.stdout.write(lazy_1.getChalk().grey(indented)); }; ps.stdout.on('data', cb); ps.stderr.on('data', cb); ps.on('close', code => { console.log(); if (code == 0) { resolve(); } reject(new Error(`process exited with code = ${code}`)); }); } catch (e) { reject(e); } }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9way9saWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxvREFBd0Q7QUFDeEQsd0RBQXVEO0FBRXZELCtCQUF1QztBQUN2Qyw4Q0FBK0M7QUFDL0MsMkJBQTZCO0FBQzdCLHdEQUFxRDtBQUNyRCxrQ0FBK0Q7QUFDL0QsaURBQTJEO0FBQzNELDJCQUE4QztBQUdqQyxRQUFBLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDN0MsUUFBQSxRQUFRLEdBQUcsQ0FBTyxFQUFPLEVBQUUsS0FBYyxFQUFFLEVBQUU7SUFDeEQsSUFBSTtRQUNGLE1BQU0sRUFBRSxFQUFFLENBQUM7S0FDWjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1YsTUFBTSw0QkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDbEM7QUFDSCxDQUFDLENBQUEsQ0FBQTtBQUVZLFFBQUEsU0FBUyxHQUFHLENBQU8sRUFBcUMsRUFBRSxFQUFFO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLFlBQU8sRUFBRSxDQUFDO0lBRXZCLE1BQU0sYUFBSyxDQUFDLElBQUksRUFBRSxHQUFTLEVBQUU7UUFDM0IsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFBLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQSxDQUFBO0FBRVksUUFBQSxLQUFLLEdBQUcsQ0FBTyxHQUFXLEVBQUUsRUFBaUMsRUFBRSxFQUFFO0lBQzVFLE1BQU0seUJBQVcsQ0FBQyxHQUFTLEVBQUU7UUFDM0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUEsQ0FBQyxDQUFDO0FBQ0wsQ0FB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