pk-template
Version:
p template engine for kubernetes
185 lines • 16.3 kB
JavaScript
;
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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