zcatalyst-cli
Version:
Command Line Tool for CATALYST
287 lines (286 loc) • 10.9 kB
JavaScript
'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 error_1 = __importDefault(require("../error"));
const constants_1 = require("../util_modules/constants");
const fs_1 = require("../util_modules/fs");
const js_1 = require("../util_modules/js");
const logger_1 = require("../util_modules/logger");
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 error_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 error_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 error_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 error_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 error_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 error_1.default('Unable to find and remove project object in RC file with project ID : ' + id, { exit: 2 });
}
if (projectArr.length === 0) {
(0, logger_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;