UNPKG

@pubgcorp/pk-template

Version:
202 lines 15.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PkProjectConf = void 0; const path_1 = require("path"); const Yaml = __importStar(require("../pk-yaml")); const fs_1 = require("fs"); class PkProjectConf { constructor(data) { this.data = data; this.getApp = (name) => this.data.apps.find(app => app.name == name); this.getEnv = (name) => this.data.envs && this.data.envs.find(e => e.name === name); this.getModule = (name) => this.data.modules.find(m => m.name == name); this.getClusterKubeConfig = (cluster) => { var _a; return (_a = this.data.clusterKubeConfig) === null || _a === void 0 ? void 0 : _a.find(m => m.name == cluster); }; } addApp(app) { if (this.getApp(app.name)) { throw new Error(`app ${app.name} already exists`); } this.data.apps.push(app); } prepareEnv(envName) { if (!this.data.envs) { this.data.envs = []; } const env = this.data.envs.find(e => e.name == envName); if (env) { return env; } const newEnv = { name: envName, values: {}, clusters: [], }; this.data.envs.push(newEnv); return newEnv; } prepareAppEnv(appName, envName) { const app = this.getApp(appName); if (!app) { throw new Error(`app ${appName} does not exists`); } if (!app.envs) { app.envs = []; } const env = app.envs.find(e => e.name == envName); if (env) { return env; } const newEnv = { name: envName, values: {}, clusters: [], }; app.envs.push(newEnv); return newEnv; } getMergedEnv(appName, envName, clusterName) { const app = this.getApp(appName); if (!app) { throw new Error(`app ${appName} not exits`); } const env = app.envs ? app.envs.find(e => e.name === envName) : this.getEnv(envName); if (!env) { return undefined; } if (!env.clusters.includes(clusterName)) { return undefined; } return Object.assign(Object.assign({}, (env || {})), { values: Object.assign(Object.assign({}, (this.data.values || {})), (env && env.values || {})) }); } addEnv(env) { if (this.getEnv(env.name)) { throw new Error(`env ${env.name} already exists`); } this.data.envs.push(env); } addModule(module) { if (this.getModule(module.name)) { throw new Error(`module ${module.name} already exists`); } this.data.modules.push(module); } upsertModule(module) { const idx = this.data.modules.findIndex(m => m.name == module.name); if (idx >= 0) { this.data.modules[idx] = module; } else { this.addModule(module); } } isDeployExecutable(branch, appName, envName, clusterName) { if (!branch || !this.data.deploy || this.data.deploy.length === 0) { return true; } const deployConfs = this.data.deploy.filter(d => d.branch === branch); if (deployConfs.length === 0) { return false; } const accepted = (accpets, denies, item, name) => { if (accpets && denies) { throw new Error(`deploy option ${name} and -${name} can not be used at the same time.`); } if (accpets) { return accpets.includes(item); } else if (denies) { return !denies.includes(item); } else { // both not exists return true; } }; return deployConfs.some(conf => accepted(conf.apps, conf['-apps'], appName, 'apps') && accepted(conf.envs, conf['-envs'], envName, 'envs') && accepted(conf.clusters, conf['-clusters'], clusterName, 'clusters')); } static exists(dir) { return dir ? (0, fs_1.existsSync)((0, path_1.join)(dir, PkProjectConf.FILENAME)) : (0, fs_1.existsSync)(PkProjectConf.FILENAME); } static create(projectName, owner) { return new PkProjectConf({ project: { name: projectName, owner: owner, }, values: {}, apps: [], envs: [], clusterKubeConfig: [], modules: [], deploy: [], }); } static save(conf, dir) { const content = Yaml.dumpYaml(conf.data); (0, fs_1.writeFileSync)(`${dir}/${PkProjectConf.FILENAME}`, content, 'utf8'); } static tryLoad(uri) { try { const json = (0, fs_1.readFileSync)(uri, 'utf8'); return json; } catch (e) { return null; } } static _find(dir) { while (true) { let projectPath = (0, path_1.resolve)(dir, PkProjectConf.FILENAME); const content = PkProjectConf.tryLoad(projectPath); if (content) { const file = Yaml.parseYaml(content); return { projectPath, projectRoot: (0, path_1.dirname)(projectPath), projectConf: new PkProjectConf(file), }; } const parent = (0, path_1.resolve)(dir, '../'); if (parent == null || parent === dir) { return { projectPath: null, projectConf: null, projectRoot: null }; } dir = parent; } } static find(uri) { return uri ? PkProjectConf._find(uri + '/') : PkProjectConf._find(process.cwd() + '/'); } } exports.PkProjectConf = PkProjectConf; PkProjectConf.FILENAME = "pk-project.yaml"; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdENvbmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGstY29uZi9wcm9qZWN0Q29uZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtCQUE4QztBQUM5QyxpREFBbUM7QUFFbkMsMkJBQTZEO0FBRTdELE1BQWEsYUFBYTtJQUd4QixZQUFtQixJQUFvQjtRQUFwQixTQUFJLEdBQUosSUFBSSxDQUFnQjtRQVN2QyxXQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBc0U1RixXQUFNLEdBQUcsQ0FBQyxJQUFZLEVBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBZ0IzRyxjQUFTLEdBQUcsQ0FBQyxJQUFZLEVBQXlCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBRWpHLHlCQUFvQixHQUFHLENBQUMsT0FBZSxFQUEyQyxFQUFFLFdBQUMsT0FBQSxNQUFBLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUEsRUFBQSxDQUFDO0lBaEcvSSxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVc7UUFDaEIsSUFBSSxJQUFJ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