UNPKG

zcatalyst-cli

Version:

Command Line Tool for CATALYST

287 lines (286 loc) 10.9 kB
'use strict'; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const index_js_1 = __importDefault(require("../error/index.js")); const constants_1 = require("../util_modules/constants"); const fs_1 = require("../util_modules/fs"); const js_1 = require("../util_modules/js"); const index_1 = require("../util_modules/logger/index"); const project_1 = require("../util_modules/project"); class RC { constructor(rcpath, data = {}) { this.path = rcpath; this.data = data; this.isLoaded = false; } set(key, value) { js_1.JS.set(this.data, key, value); } get(key, fallback) { return js_1.JS.get(this.data, key, fallback); } getProjectById(projectId) { if (!this.projects) { return; } return this.projects.find((proj) => proj.id + '' === projectId + ''); } getProjectByName(projectName) { if (!this.projects) { return; } return this.projects.find((proj) => proj.name === projectName); } associateEnv(projectId, env, { base = false, active = false }) { const projectObj = this.getProjectById(projectId); if (projectObj === undefined) { throw new index_js_1.default('Unable to find project in RC file with project ID : ' + projectId, { exit: 2 }); } if (base && this.defaultProject !== undefined) { if (!js_1.JS.isEqual(this.defaultProject, projectObj)) { throw new index_js_1.default('Not possible to associate env with base flag', { exit: 2 }); } } if (active && this.activeProject !== undefined) { if (!js_1.JS.isEqual(this.activeProject, projectObj)) { throw new index_js_1.default('Not possible to associate env with active flag', { exit: 2 }); } } const envArr = js_1.JS.get(projectObj, 'env', []); const existingEnvArr = js_1.JS.remove(envArr, (obj) => obj.id + '' === env.id + ''); let lastIdx = js_1.JS.size(envArr); let envIdx = -1; if (existingEnvArr.length !== 1) { envArr.push({ idx: ++lastIdx, id: env.id + '', name: env.name, type: env.type }); envIdx = lastIdx; } else { const mergedEnv = js_1.JS.merge(existingEnvArr[0], env); envArr.push(mergedEnv); envIdx = mergedEnv.idx; } if (base) { this.set('defaults.env', envIdx); } if (active) { this.set('actives.env', envIdx); } js_1.JS.set(projectObj, 'env', envArr); return this.upsertProject(projectObj, { base, active, ignoreEnv: false }); } removeEnv(projectId, envId) { const projectObj = this.getProjectById(projectId); if (projectObj === undefined) { throw new index_js_1.default('Unable to find project in RC file with project ID : ' + projectId, { exit: 2 }); } const envArr = js_1.JS.get(projectObj, 'env', []); const removedEnvArr = js_1.JS.remove(envArr, (obj) => obj.id + '' === envId + ''); if (removedEnvArr.length !== 0) { throw new index_js_1.default('Unable to find and remove environment object in RC file with env ID : ' + envId, { exit: 2 }); } this._reIndex(envArr, removedEnvArr[0].idx, 'env'); projectObj.env = envArr; return this.save(); } upsertProject(project, { base = false, ignoreEnv = true, active = false } = {}) { const projectArr = this.projects; const existingProjArr = js_1.JS.remove(projectArr, (obj) => obj.id + '' === project.id + ''); let lastIdx = js_1.JS.size(projectArr); let projIdx = -1; if (existingProjArr.length !== 1) { projectArr.push({ idx: ++lastIdx, id: project.id + '', name: project.name, domain: project.domain, timezone: project.timezone, env: [] }); projIdx = lastIdx; } else { const mergedProject = js_1.JS.mergeWith(existingProjArr[0], project, (existingValue, newValue, key) => { if (key === 'env') { return ignoreEnv ? existingValue : newValue; } if (!js_1.JS.isUndefined(existingValue)) { return newValue; } }); projectArr.push({ idx: mergedProject.idx, id: mergedProject.id + '', name: mergedProject.name, domain: mergedProject.domain, timezone: mergedProject.timezone, env: mergedProject.env }); projIdx = mergedProject.idx; } if (base) { this.set('defaults.project', projIdx); } if (active) { this.set('actives.project', projIdx); } this.set('projects', projectArr); return this.save(); } removeProject(id) { return __awaiter(this, void 0, void 0, function* () { const projectArr = this.projects; const removedProjectArr = js_1.JS.remove(projectArr, (obj) => obj.id + '' === id + ''); if (removedProjectArr.length !== 1) { throw new index_js_1.default('Unable to find and remove project object in RC file with project ID : ' + id, { exit: 2 }); } if (projectArr.length === 0) { (0, index_1.warning)('No projects found in ' + constants_1.FILENAME.rc + ' hence removing it.'); return this.delete(); } this._reIndex(projectArr, removedProjectArr[0].idx, 'project'); this.set('projects', projectArr); return this.save(); }); } _reIndex(arr, removedIdx, pth) { const currentDefaultIdx = this.get('defaults.' + pth); const currentActiveIdx = this.get('actives.' + pth); let finalDefaultIdx = currentDefaultIdx; let finalActiveIdx = currentActiveIdx; if (currentDefaultIdx === removedIdx) { if (currentDefaultIdx !== currentActiveIdx) { finalDefaultIdx = currentActiveIdx; } else { finalDefaultIdx = arr[0].idx; } } if (currentActiveIdx === removedIdx) { if (currentActiveIdx !== currentDefaultIdx) { finalActiveIdx = currentDefaultIdx; } else { finalActiveIdx = arr[0].idx; } } arr = arr.map((val) => { val.idx = val.idx > removedIdx ? --val.idx : val.idx; return val; }); this.set('defaults.' + pth, finalDefaultIdx > removedIdx ? --finalDefaultIdx : finalDefaultIdx); this.set('actives.' + pth, finalActiveIdx > removedIdx ? --finalActiveIdx : finalActiveIdx); } save() { return __awaiter(this, void 0, void 0, function* () { const content = JSON.stringify(this.data, null, 2) + '\n'; return fs_1.ASYNC.writeFile(this.path, content, 'utf8'); }); } syncSave() { const content = JSON.stringify(this.data, null, 2) + '\n'; fs_1.SYNC.writeFile(this.path, content, 'utf8'); } delete() { return __awaiter(this, void 0, void 0, function* () { return fs_1.ASYNC.deleteFile(this.path); }); } get hasProjects() { return this.projects.length > 0; } get projects() { return this.get('projects', []); } get defaultEnvIdx() { return this.get('defaults.env', -1); } get defaultProjectIdx() { return this.get('defaults.project', -1); } get activeEnvIdx() { return this.get('actives.env', -1); } get activeProjectIdx() { return this.get('actives.project', -1); } get defaultProject() { if (!this.projects) { return; } return this.projects.find((proj) => proj.idx === this.defaultProjectIdx); } get activeProject() { if (!this.projects) { return; } return this.projects.find((proj) => proj.idx === this.activeProjectIdx); } get defaultEnv() { const defaultProj = this.defaultProject; return defaultProj === undefined ? undefined : defaultProj.env.find((env) => env.idx === this.defaultEnvIdx); } get activeEnv() { const activeProj = this.activeProject; return activeProj === undefined ? undefined : activeProj.env.find((env) => env.idx === this.activeEnvIdx); } get loaded() { return this.isLoaded; } set loaded(load) { this.isLoaded = load; } static loadFile(rcpath) { return __awaiter(this, void 0, void 0, function* () { const data = yield fs_1.ASYNC.readJSONFile(rcpath, { checkpath: true }); if (data === undefined) { return new RC(rcpath); } const rc = new RC(rcpath, data); rc.loaded = true; return rc; }); } static load() { return __awaiter(this, void 0, void 0, function* () { const pd = (0, project_1.getProjectRoot)(); if (yield fs_1.ASYNC.fileExists((0, path_1.normalize)((0, path_1.join)(pd, constants_1.FILENAME.rc)))) { return RC.loadFile((0, path_1.normalize)((0, path_1.join)(pd, constants_1.FILENAME.rc))); } return new RC((0, path_1.normalize)((0, path_1.join)(pd, constants_1.FILENAME.rc))); }); } } exports.default = RC;