@topgroup/diginext
Version:
A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.
289 lines (288 loc) • 12.1 kB
JavaScript
;
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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.pullingRepoToNewGitDir = exports.cloneGitFramework = exports.pullingFramework = exports.changePackageName = exports.pullFrameworkVersion = exports.selectFrameworkVersion = exports.getFrameworkVersions = exports.getLatestFrameworkVersion = exports.copyFrameworkResources = exports.cleanUpFramework = void 0;
const detectPrivateKey_1 = __importDefault(require("diginext-utils/dist/file/detectPrivateKey"));
const log_1 = require("diginext-utils/dist/xconsole/log");
const fs_1 = __importStar(require("fs"));
const promises_1 = require("fs/promises");
const ora_1 = __importDefault(require("ora"));
const path_1 = __importDefault(require("path"));
const recursive_copy_1 = __importDefault(require("recursive-copy"));
const app_config_1 = require("../app.config");
const const_1 = require("../config/const");
const plugins_1 = require("../plugins");
const git_utils_1 = require("./git/git-utils");
/**
* Delete temporary directory of the framework
*/
const cleanUpFramework = async () => {
// clean up
try {
await (0, plugins_1.deleteFolderRecursive)("./.fw");
}
catch (e) {
(0, log_1.logError)("CLEANUP", e);
}
};
exports.cleanUpFramework = cleanUpFramework;
/**
* Copy all framework's files to application directory
* @param destDirectory - Destination application directory
*/
const copyFrameworkResources = async (destDirectory) => {
let success = false;
try {
const tmpFrameworkDir = path_1.default.resolve(const_1.CLI_CONFIG_DIR, ".fw");
await (0, recursive_copy_1.default)(tmpFrameworkDir, destDirectory, {
overwrite: true,
expand: true,
dot: true,
junk: true,
// filter: ["**/*", "!.git"],
});
success = true;
}
catch (e) {
(0, log_1.logError)(e);
}
return success;
};
exports.copyFrameworkResources = copyFrameworkResources;
const getLatestFrameworkVersion = async (framework = "diginext") => {
// let { data } = await bitbucket.repositories.listTags({
// repo_slug: config.framework[framework],
// workspace: config.workspace,
// sort: "-name",
// });
// if (typeof data.values == "undefined" || data.values.length == 0) {
// logError(`This framework repository doesn't have any released tags.`);
// return;
// }
// // exclude "beta" and "alpha" tags
// let versionList = (data.values || [{ name: "main" }]).filter((ver) => !ver.name.includes("beta"));
// return versionList && versionList.length > 0 ? versionList[0].name : "main";
};
exports.getLatestFrameworkVersion = getLatestFrameworkVersion;
const getFrameworkVersions = async (framework = "diginext") => {
// let { data } = await bitbucket.repositories.listTags({
// repo_slug: config.framework[framework],
// workspace: config.workspace,
// sort: "-name",
// });
// if (typeof data.values == "undefined" || data.values.length == 0) {
// logError(`This framework repository doesn't have any released tags.`);
// return;
// }
// return data.values;
};
exports.getFrameworkVersions = getFrameworkVersions;
const selectFrameworkVersion = async (framework = "diginext") => {
// TODO: What the fuck is this??
// let { data } = await bitbucket.repositories.listTags({
// repo_slug: config.framework[framework],
// workspace: config.workspace,
// sort: "-name",
// });
// let versionList = typeof data.values != undefined && data.values.length > 0 ? [...data.values] : ["main"];
// return versionList;
};
exports.selectFrameworkVersion = selectFrameworkVersion;
const pullFrameworkVersion = async (options) => {
const { frameworkVersion = "main" } = options;
const { name, repoSSH, public: isPublic } = options.framework;
if (!repoSSH)
throw new Error(`Unable to pull/clone framework: repo SSH url is required.`);
const spin = (0, ora_1.default)(`Pulling "${name}" framework... 0%`).start();
// create tmp dir
const tmpDir = path_1.default.resolve(const_1.CLI_CONFIG_DIR, ".fw");
try {
await (0, plugins_1.deleteFolderRecursive)(tmpDir);
}
catch (e) {
(0, log_1.logError)(`[PULL FRAMEWORK]`, e);
return false;
}
await (0, promises_1.mkdir)(tmpDir, { recursive: true });
if (options.isDebugging)
console.log("pullFrameworkVersion() > frameworkVersion :>> ", frameworkVersion);
// pull or clone git repo
let pullStatus = await (0, plugins_1.pullOrCloneGitRepo)(repoSSH, tmpDir, frameworkVersion, {
onUpdate: (msg, progress) => {
if (app_config_1.isServerMode) {
console.log(msg);
}
else {
spin.text = `[SSH] Pulling "${name}" framework... ${progress || 0}%`;
}
},
// delete framework git
removeGitOnFinish: true,
removeCIOnFinish: !options.ci,
});
if (options.isDebugging)
console.log("pullFrameworkVersion() > tmpDir :>> ", tmpDir);
if (options.isDebugging)
console.log("pullFrameworkVersion() > framework files :>> ", (0, fs_1.readdirSync)(tmpDir));
if (options.isDebugging)
console.log("✅ pullFrameworkVersion() > pullStatus :>> ", pullStatus);
// If failed to pull/clone with SSH, give another try with HTTPS method:
if (!pullStatus) {
(0, log_1.logWarn)(`Unable to pull framework via SSH: ${repoSSH}`);
if (!isPublic)
throw new Error(`Unable to pull/clone this framework: The framework repo is private.`);
const { providerType } = (0, git_utils_1.parseGitRepoDataFromRepoSSH)(repoSSH);
const { DB } = await Promise.resolve().then(() => __importStar(require("../modules/api/DB")));
const gitProvider = await DB.findOne("git", { type: providerType });
if (options.isDebugging)
console.log("pullFrameworkVersion() > gitProvider :>> ", gitProvider);
// USER IS MISSING PERMISSIONS
if (!gitProvider.access_token || gitProvider.access_token === "***") {
throw new Error(`Unable to pull/clone framework by HTTPS: missing permissions.`);
}
const repoURL = (0, git_utils_1.repoSshToRepoURL)(repoSSH);
pullStatus = await (0, git_utils_1.pullOrCloneGitRepoHTTP)(repoURL, tmpDir, frameworkVersion, {
onUpdate: (msg, progress) => {
if (app_config_1.isServerMode) {
console.log(msg);
}
else {
spin.text = `[HTTPS] Pulling "${name}" framework... ${progress || 0}%`;
}
},
useAccessToken: {
type: gitProvider.method === "basic" ? "Basic" : "Bearer",
value: gitProvider.access_token,
},
// delete framework git
removeGitOnFinish: true,
removeCIOnFinish: !options.ci,
});
}
spin.stop();
return pullStatus;
};
exports.pullFrameworkVersion = pullFrameworkVersion;
/**
* Change the name of "package.json" (for JS/TS apps only)
* @param options
* @returns
*/
const changePackageName = async (options) => {
const { targetDirectory, repoSlug } = options;
if (!fs_1.default.existsSync(path_1.default.resolve(targetDirectory, "package.json"))) {
(0, log_1.logWarn)("NOT FOUND package.json");
return;
}
try {
const json = fs_1.default.readFileSync(path_1.default.resolve(targetDirectory, "package.json"), "utf-8");
const data = JSON.parse(json);
data.name = repoSlug;
fs_1.default.writeFileSync(path_1.default.resolve(targetDirectory, "package.json"), JSON.stringify(data, undefined, 4));
}
catch (error) {
console.error(`changePackageName error`, error);
}
};
exports.changePackageName = changePackageName;
async function pullingFramework(options) {
if (options.isDebugging)
console.log(`Pulling framework >`, options.framework);
if (options.framework.name != "none") {
// TODO: Select specific branch as a version?
const pullStatus = await (0, exports.pullFrameworkVersion)(options);
if (!pullStatus)
throw new Error(`Unable to pull/clone framework: ${options.framework.name} (${options.framework.repoSSH})`);
await (0, exports.copyFrameworkResources)(options.targetDirectory);
// @teexiii : SHOULD CHECK FOR SPECIFIC CASE AS NODE.JS ONLY!
await (0, exports.changePackageName)(options);
}
return true;
}
exports.pullingFramework = pullingFramework;
const cloneGitFramework = async (options) => {
//
const { name, repoSSH } = options.framework;
// create tmp dir
const tmpDir = path_1.default.resolve(".fw/");
try {
await (0, plugins_1.deleteFolderRecursive)(tmpDir);
}
catch (e) {
(0, log_1.logError)(e);
}
await (0, promises_1.mkdir)(tmpDir);
const spin = (0, ora_1.default)(`Pulling "${name}"... 0%`).start();
await (0, plugins_1.cloneGitRepo)(repoSSH, tmpDir, {
onUpdate: (msg, progress) => {
if (app_config_1.isServerMode) {
console.log(msg);
}
else {
spin.text = `Pulling "${name}"... ${progress || 0}%`;
}
},
});
spin.stop();
// delete unneccessary files
if (fs_1.default.existsSync(".fw/dx.json"))
await (0, plugins_1.deleteFolderRecursive)(".fw/dx.json");
if (fs_1.default.existsSync(".fw/.git"))
await (0, plugins_1.deleteFolderRecursive)(".fw/.git");
if (fs_1.default.existsSync(".fw/README.md"))
fs_1.default.unlinkSync(".fw/README.md");
if (fs_1.default.existsSync(".fw/CHANGELOG.md"))
fs_1.default.unlinkSync(".fw/CHANGELOG.md");
if (fs_1.default.existsSync(".fw/package-lock.json"))
fs_1.default.unlinkSync(".fw/package-lock.json");
if (fs_1.default.existsSync(".fw/yarn.lock"))
fs_1.default.unlinkSync(".fw/yarn.lock");
if (fs_1.default.existsSync(".fw/logo.png"))
fs_1.default.unlinkSync(".fw/logo.png");
return true;
};
exports.cloneGitFramework = cloneGitFramework;
async function pullingRepoToNewGitDir(options) {
await (0, exports.cloneGitFramework)(options);
await (0, plugins_1.wait)(500);
await (0, exports.copyFrameworkResources)(options.targetDirectory);
await (0, plugins_1.wait)(500);
await (0, exports.cleanUpFramework)();
const result = (0, detectPrivateKey_1.default)(options.targetDirectory);
if (result.status) {
//
}
else {
//
(0, log_1.logError)("FOUND PRIVATE KEY OR SECRET ENV, PLEASE IGNORE THEM BEFORE PUSH TO GIT!");
(0, log_1.log)(result.list);
return false;
}
return true;
}
exports.pullingRepoToNewGitDir = pullingRepoToNewGitDir;