UNPKG

@topgroup/diginext

Version:

A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.

289 lines (288 loc) 12.1 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; }; 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;