From 05b6447065b35e1f3a22aff4d4a54062ddaf987c Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Fri, 30 Jun 2023 14:26:44 +0530 Subject: [PATCH 1/7] chore: updated publish scripts --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 7420f6d..2e6761f 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "watch:boltvm": "npm run watch --workspace @gluestack/boltvm", "watch:bolt": "npm run watch --workspace @gluestack/bolt", "fix:permission": "chmod +x ./packages/bolt/build/index.js", - "publish:all": "npm run build:all && npm run publish --workspace @gluestack/boltvm && npm run publish --workspace @gluestack/bolt" + "publish:boltvm": "npm run build:boltvm && cd packages/boltvm && npm run publish", + "publish:bolt": "npm run build:all && cd packages/bolt && npm run publish" }, "workspaces": [ "packages/*" From b222f5ecdb237561adce0781cf51f4460bf6dd9c Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Fri, 30 Jun 2023 17:55:46 +0530 Subject: [PATCH 2/7] chore: fixed logs and added .boltignore when busing bolt init --- packages/bolt/build/actions/init.js | 4 +++- packages/bolt/build/actions/route-generate.js | 2 +- packages/bolt/build/actions/up.js | 2 +- packages/bolt/build/constants/boltignore.d.ts | 1 + packages/bolt/build/constants/boltignore.js | 17 +++++++++++++++++ packages/bolt/package.json | 4 ++-- packages/bolt/src/actions/init.ts | 2 ++ packages/bolt/src/actions/route-generate.ts | 2 +- packages/bolt/src/actions/up.ts | 2 +- packages/bolt/src/constants/boltignore.ts | 4 ++++ packages/boltvm/build/actions/run.js | 4 ++-- packages/boltvm/build/libraries/container.js | 4 ++-- packages/boltvm/package.json | 2 +- packages/boltvm/src/actions/run.ts | 4 ++-- packages/boltvm/src/libraries/container.ts | 6 ++---- 15 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 packages/bolt/build/constants/boltignore.d.ts create mode 100644 packages/bolt/build/constants/boltignore.js create mode 100644 packages/bolt/src/constants/boltignore.ts diff --git a/packages/bolt/build/actions/init.js b/packages/bolt/build/actions/init.js index 59d3d1f..786cf0a 100644 --- a/packages/bolt/build/actions/init.js +++ b/packages/bolt/build/actions/init.js @@ -39,7 +39,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "os", "chalk", "moment", "@gluestack/boltvm", "lodash", "path", "../helpers/fs-exists", "../helpers/exit-with-msg", "../helpers/fs-readfile-json", "../helpers/fs-writefile", "../helpers/fs-mkdir", "../helpers/stringify-yaml", "../constants/bolt-file", "../constants/bolt-configs", "@gluestack/helpers"], factory); + define(["require", "exports", "os", "chalk", "moment", "@gluestack/boltvm", "lodash", "path", "../helpers/fs-exists", "../helpers/exit-with-msg", "../helpers/fs-readfile-json", "../helpers/fs-writefile", "../helpers/fs-mkdir", "../helpers/stringify-yaml", "../constants/bolt-file", "../constants/bolt-configs", "@gluestack/helpers", "../constants/boltignore"], factory); } })(function (require, exports) { "use strict"; @@ -59,6 +59,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const bolt_file_1 = require("../constants/bolt-file"); const bolt_configs_1 = require("../constants/bolt-configs"); const helpers_1 = require("@gluestack/helpers"); + const boltignore_1 = require("../constants/boltignore"); class Init { handle(options) { return __awaiter(this, void 0, void 0, function* () { @@ -83,6 +84,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } yield (0, stringify_yaml_1.stringifyYAML)(json, _yamlPath); yield (0, fs_writefile_1.writefile)(_envPath, "" + os.EOL); + yield (0, fs_writefile_1.writefile)((0, path_1.join)(process.cwd(), ".boltignore"), boltignore_1.boltignore); if (!(yield (0, fs_exists_1.exists)(_projectFolderPath))) { yield (0, fs_mkdir_1.createFolder)(_projectFolderPath); } diff --git a/packages/bolt/build/actions/route-generate.js b/packages/bolt/build/actions/route-generate.js index 89abbc2..c01d552 100644 --- a/packages/bolt/build/actions/route-generate.js +++ b/packages/bolt/build/actions/route-generate.js @@ -32,7 +32,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { // Validations for metadata and services yield (0, validate_metadata_1.validateMetadata)(); yield (0, validate_services_1.validateServices)(); - console.log(`>> Creating Ingress ${_yamlContent.project_name}...`); + console.log(`>> Creating Ingress...`); yield (0, generate_routes_1.default)(_yamlContent); process.exit(0); }); diff --git a/packages/bolt/build/actions/up.js b/packages/bolt/build/actions/up.js index 3f2c906..ee75707 100644 --- a/packages/bolt/build/actions/up.js +++ b/packages/bolt/build/actions/up.js @@ -59,7 +59,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { yield (0, validate_metadata_1.validateMetadata)(); yield (0, validate_services_1.validateServices)(); // 1. generates routes - console.log(`>> Creating Ingress ${_yamlContent.project_name}...`); + console.log(`>> Creating Ingress...`); const ports = yield (0, generate_routes_1.default)(_yamlContent); // 2. generates .env yield common_1.default.generateEnv(); diff --git a/packages/bolt/build/constants/boltignore.d.ts b/packages/bolt/build/constants/boltignore.d.ts new file mode 100644 index 0000000..57c6db4 --- /dev/null +++ b/packages/bolt/build/constants/boltignore.d.ts @@ -0,0 +1 @@ +export declare const boltignore = "node_modules\n.logs\n.git\nvendor"; diff --git a/packages/bolt/build/constants/boltignore.js b/packages/bolt/build/constants/boltignore.js new file mode 100644 index 0000000..3d5c6d8 --- /dev/null +++ b/packages/bolt/build/constants/boltignore.js @@ -0,0 +1,17 @@ +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.boltignore = void 0; + exports.boltignore = `node_modules +.logs +.git +vendor`; +}); diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 2ae6de2..82bea18 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -1,6 +1,6 @@ { "name": "@gluestack/bolt", - "version": "0.1.5", + "version": "0.1.6", "description": "Bolt Framework CLI", "main": "build/index.js", "bin": { @@ -38,7 +38,7 @@ "author": "gluestack.io", "license": "ISC", "dependencies": { - "@gluestack/boltvm": "^0.0.2", + "@gluestack/boltvm": "^0.0.3", "@gluestack/glue-server-sdk-js": "^0.0.7", "@gluestack/helpers": "^0.0.17", "archiver": "^5.3.1", diff --git a/packages/bolt/src/actions/init.ts b/packages/bolt/src/actions/init.ts index affa1b7..4edc330 100644 --- a/packages/bolt/src/actions/init.ts +++ b/packages/bolt/src/actions/init.ts @@ -17,6 +17,7 @@ import { BOLT } from "../constants/bolt-configs"; import { Bolt } from "../typings/bolt"; import { removeSpecialChars } from "@gluestack/helpers"; +import { boltignore } from "../constants/boltignore"; export default class Init { public async handle(options: any) { @@ -55,6 +56,7 @@ export default class Init { await stringifyYAML(json, _yamlPath); await writefile(_envPath, "" + os.EOL); + await writefile(join(process.cwd(), ".boltignore"), boltignore); if (!(await exists(_projectFolderPath))) { await createFolder(_projectFolderPath); diff --git a/packages/bolt/src/actions/route-generate.ts b/packages/bolt/src/actions/route-generate.ts index 7a4d39a..c56468f 100644 --- a/packages/bolt/src/actions/route-generate.ts +++ b/packages/bolt/src/actions/route-generate.ts @@ -12,7 +12,7 @@ export default class RouteGenerate { await validateMetadata(); await validateServices(); - console.log(`>> Creating Ingress ${_yamlContent.project_name}...`); + console.log(`>> Creating Ingress...`); await generateRoutes(_yamlContent); process.exit(0); } diff --git a/packages/bolt/src/actions/up.ts b/packages/bolt/src/actions/up.ts index f844722..fa0f4d3 100644 --- a/packages/bolt/src/actions/up.ts +++ b/packages/bolt/src/actions/up.ts @@ -51,7 +51,7 @@ export default class Up { await validateServices(); // 1. generates routes - console.log(`>> Creating Ingress ${_yamlContent.project_name}...`); + console.log(`>> Creating Ingress...`); const ports = await generateRoutes(_yamlContent); // 2. generates .env diff --git a/packages/bolt/src/constants/boltignore.ts b/packages/bolt/src/constants/boltignore.ts new file mode 100644 index 0000000..38cbf3d --- /dev/null +++ b/packages/bolt/src/constants/boltignore.ts @@ -0,0 +1,4 @@ +export const boltignore = `node_modules +.logs +.git +vendor`; diff --git a/packages/boltvm/build/actions/run.js b/packages/boltvm/build/actions/run.js index edfa2f2..c4454f4 100644 --- a/packages/boltvm/build/actions/run.js +++ b/packages/boltvm/build/actions/run.js @@ -100,9 +100,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const sshPids = yield Promise.all(portExposePromises); console.log(chalk_1.default.green(">> Ports exposed")); // Run project inside vm - console.log(chalk_1.default.yellow("Starting running project inside vm...")); + console.log(chalk_1.default.yellow(">> Started running project inside VM...")); const projectRunnerId = (_a = (yield this.runProjectInsideVm(sshPort, boltConfig, localPath, detatched))) !== null && _a !== void 0 ? _a : 0; - console.log(chalk_1.default.green(">> Project running inside vm")); + console.log(chalk_1.default.green(">> Project running inside VM")); // Update project status const json = Object.assign(Object.assign({}, project), { status: "up", sshProcessIds: sshPids, projectRunnerId: projectRunnerId }); yield (0, update_store_1.updateStore)("projects", project_id, json); diff --git a/packages/boltvm/build/libraries/container.js b/packages/boltvm/build/libraries/container.js index 6c32c2e..5bd08c5 100644 --- a/packages/boltvm/build/libraries/container.js +++ b/packages/boltvm/build/libraries/container.js @@ -45,9 +45,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) { yield (0, fs_mkdir_1.createFolder)(projectContainerPath); } if (!cached) { - console.log(chalk_1.default.yellow(`>> Creating image for ${this.containerName}...`)); + console.log(chalk_1.default.yellow(`>> Creating Image...`)); yield (0, fs_copyfile_1.copyFile)(bolt_vm_1.VM_BINARIES.ALPINE, projectContainerPath, bolt_vm_1.VM_BINARIES.CONTAINER_IMAGE_NAME); - console.log(chalk_1.default.green(`>> Image created for ${this.containerName}!`)); + console.log(chalk_1.default.green(`>> Image created!`)); } if (!(yield (0, fs_exists_1.exists)((0, path_1.join)(projectContainerPath, bolt_vm_1.VM_BINARIES.CONTAINER_IMAGE_NAME)))) { console.log(chalk_1.default.yellow(`>> Image Not found! Creating image for ${this.containerName}...`)); diff --git a/packages/boltvm/package.json b/packages/boltvm/package.json index 8a59572..8e67092 100644 --- a/packages/boltvm/package.json +++ b/packages/boltvm/package.json @@ -1,6 +1,6 @@ { "name": "@gluestack/boltvm", - "version": "0.0.2", + "version": "0.0.3", "description": "BoltVM CLI", "main": "build/index.js", "scripts": { diff --git a/packages/boltvm/src/actions/run.ts b/packages/boltvm/src/actions/run.ts index 1e40f55..a40e467 100644 --- a/packages/boltvm/src/actions/run.ts +++ b/packages/boltvm/src/actions/run.ts @@ -102,7 +102,7 @@ export default class Run { console.log(chalk.green(">> Ports exposed")); // Run project inside vm - console.log(chalk.yellow("Starting running project inside vm...")); + console.log(chalk.yellow(">> Started running project inside VM...")); const projectRunnerId = (await this.runProjectInsideVm( sshPort, @@ -110,7 +110,7 @@ export default class Run { localPath, detatched )) ?? 0; - console.log(chalk.green(">> Project running inside vm")); + console.log(chalk.green(">> Project running inside VM")); // Update project status const json: IMetadata = { diff --git a/packages/boltvm/src/libraries/container.ts b/packages/boltvm/src/libraries/container.ts index 391318e..502dc9e 100644 --- a/packages/boltvm/src/libraries/container.ts +++ b/packages/boltvm/src/libraries/container.ts @@ -36,15 +36,13 @@ export default class Container { } if (!cached) { - console.log( - chalk.yellow(`>> Creating image for ${this.containerName}...`) - ); + console.log(chalk.yellow(`>> Creating Image...`)); await copyFile( VM_BINARIES.ALPINE, projectContainerPath, VM_BINARIES.CONTAINER_IMAGE_NAME ); - console.log(chalk.green(`>> Image created for ${this.containerName}!`)); + console.log(chalk.green(`>> Image created!`)); } if ( From a2d78dad5e1517a0a7744edd996a5b600cc63393 Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Tue, 1 Aug 2023 20:10:31 +0530 Subject: [PATCH 3/7] chore: updated envs fixes --- packages/bolt/build/actions/service-up.js | 2 +- packages/bolt/build/libraries/env.js | 3 ++- packages/bolt/package.json | 2 +- packages/bolt/src/actions/service-up.ts | 2 +- packages/bolt/src/libraries/env.ts | 5 ++++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/bolt/build/actions/service-up.js b/packages/bolt/build/actions/service-up.js index c4b35cd..af85b34 100644 --- a/packages/bolt/build/actions/service-up.js +++ b/packages/bolt/build/actions/service-up.js @@ -78,7 +78,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const portDiscovery = new port_discovery_1.default(content); const discoveredPorts = yield portDiscovery.handle(); // generates .env - console.log(`>> Generating .env files...`); + console.log(chalk_1.default.gray(`>> Generating .env files...`)); const generateEnv = new env_generate_1.default(); yield generateEnv.handle({ build: "dev", diff --git a/packages/bolt/build/libraries/env.js b/packages/bolt/build/libraries/env.js index 620d39b..24f5a0b 100644 --- a/packages/bolt/build/libraries/env.js +++ b/packages/bolt/build/libraries/env.js @@ -84,7 +84,8 @@ var __asyncValues = (this && this.__asyncValues) || function (o) { const prefix = key.split("_")[0]; const replaceKeys = this.getReplaceKeys(this.keys[key]); for (const replaceKey of replaceKeys) { - this.keys[key] = this.keys[key].replaceAll(`${this.keyCharacter}${replaceKey}${this.keyCharacter}`, this.keys[replaceKey] || ""); + this.keys[key] = this.keys[key].replaceAll(`${this.keyCharacter}${replaceKey}${this.keyCharacter}`, this.keys[replaceKey] || + `${this.keyCharacter}${replaceKey}${this.keyCharacter}`); const childEnv = (0, lodash_1.find)(this.envs, { prefix: prefix }); if (childEnv) { childEnv.updateKey(key.replace(new RegExp("^" + `${prefix}_`), ""), this.keys[key]); diff --git a/packages/bolt/package.json b/packages/bolt/package.json index 69ce118..fb0095a 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -1,6 +1,6 @@ { "name": "@gluestack/bolt", - "version": "0.1.16", + "version": "0.1.17", "description": "Bolt Framework CLI", "main": "build/index.js", "bin": { diff --git a/packages/bolt/src/actions/service-up.ts b/packages/bolt/src/actions/service-up.ts index f19ee2a..e3f9259 100644 --- a/packages/bolt/src/actions/service-up.ts +++ b/packages/bolt/src/actions/service-up.ts @@ -94,7 +94,7 @@ export default class ServiceUp { const discoveredPorts = await portDiscovery.handle(); // generates .env - console.log(`>> Generating .env files...`); + console.log(chalk.gray(`>> Generating .env files...`)); const generateEnv = new EnvGenerate(); await generateEnv.handle({ build: "dev", diff --git a/packages/bolt/src/libraries/env.ts b/packages/bolt/src/libraries/env.ts index f8c35e7..b884d9a 100644 --- a/packages/bolt/src/libraries/env.ts +++ b/packages/bolt/src/libraries/env.ts @@ -60,11 +60,14 @@ export default class Env { for (const key in this.keys) { const prefix = key.split("_")[0]; const replaceKeys = this.getReplaceKeys(this.keys[key]); + for (const replaceKey of replaceKeys) { this.keys[key] = this.keys[key].replaceAll( `${this.keyCharacter}${replaceKey}${this.keyCharacter}`, - this.keys[replaceKey] || "" + this.keys[replaceKey] || + `${this.keyCharacter}${replaceKey}${this.keyCharacter}` ); + const childEnv = find(this.envs, { prefix: prefix }); if (childEnv) { childEnv.updateKey( From 64d06a2c5b2cf4f405a4b016099f5043d41248a1 Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Wed, 2 Aug 2023 19:49:01 +0530 Subject: [PATCH 4/7] chore: fixed env management and removed env and route:generate command --- packages/bolt/build/actions/deploy/index.js | 11 +- packages/bolt/build/actions/env-generate.d.ts | 22 +++- packages/bolt/build/actions/env-generate.js | 63 +++++---- .../bolt/build/actions/route-generate.d.ts | 2 +- packages/bolt/build/actions/route-generate.js | 12 +- packages/bolt/build/actions/service-up.d.ts | 1 + packages/bolt/build/actions/service-up.js | 34 ++++- packages/bolt/build/actions/up.js | 7 +- .../bolt/build/commands/11-route-generate.js | 36 ----- ...0-service-down.d.ts => 11-route-list.d.ts} | 0 .../{12-route-list.js => 11-route-list.js} | 0 .../{11-route-generate.d.ts => 12-exec.d.ts} | 0 .../build/commands/{13-exec.js => 12-exec.js} | 0 .../{14-deploy.d.ts => 13-deploy.d.ts} | 0 .../commands/{14-deploy.js => 13-deploy.js} | 0 ...deploy-watch.d.ts => 14-deploy-watch.d.ts} | 0 ...{15-deploy-watch.js => 14-deploy-watch.js} | 0 .../bolt/build/commands/3-env-generate.js | 35 ----- .../{12-route-list.d.ts => 3-up.d.ts} | 0 .../bolt/build/commands/{4-up.js => 3-up.js} | 0 .../commands/{13-exec.d.ts => 4-down.d.ts} | 0 .../build/commands/{5-down.js => 4-down.js} | 0 .../{3-env-generate.d.ts => 5-log.d.ts} | 0 .../build/commands/{6-log.js => 5-log.js} | 0 .../{4-up.d.ts => 6-service-add.d.ts} | 0 .../{7-service-add.js => 6-service-add.js} | 0 .../{5-down.d.ts => 7-service-list.d.ts} | 0 .../{8-service-list.js => 7-service-list.js} | 0 .../bolt/build/commands/8-service-list.d.ts | 3 - .../{6-log.d.ts => 8-service-up.d.ts} | 0 .../{9-service-up.js => 8-service-up.js} | 0 ...7-service-add.d.ts => 9-service-down.d.ts} | 0 .../{10-service-down.js => 9-service-down.js} | 0 .../bolt/build/commands/9-service-up.d.ts | 3 - packages/bolt/build/common/index.d.ts | 3 +- packages/bolt/build/common/index.js | 27 ++-- .../bolt/build/constants/bolt-configs.d.ts | 1 + packages/bolt/build/constants/bolt-configs.js | 1 + .../bolt/build/helpers/generate-routes.js | 6 +- packages/bolt/build/index.js | 0 packages/bolt/build/libraries/env.d.ts | 3 +- packages/bolt/build/libraries/env.js | 7 +- .../build/typings/run-service-options.d.ts | 1 - packages/bolt/package.json | 2 +- packages/bolt/src/actions/deploy/index.ts | 11 ++ packages/bolt/src/actions/env-generate.ts | 124 +++++++++++------- packages/bolt/src/actions/route-generate.ts | 11 +- packages/bolt/src/actions/service-up.ts | 42 +++++- packages/bolt/src/actions/up.ts | 9 +- .../bolt/src/commands/11-route-generate.ts | 16 --- .../{12-route-list.ts => 11-route-list.ts} | 0 .../src/commands/{13-exec.ts => 12-exec.ts} | 0 .../commands/{14-deploy.ts => 13-deploy.ts} | 0 ...{15-deploy-watch.ts => 14-deploy-watch.ts} | 0 packages/bolt/src/commands/3-env-generate.ts | 15 --- .../bolt/src/commands/{4-up.ts => 3-up.ts} | 0 .../src/commands/{5-down.ts => 4-down.ts} | 0 .../bolt/src/commands/{6-log.ts => 5-log.ts} | 0 .../{7-service-add.ts => 6-service-add.ts} | 0 .../{8-service-list.ts => 7-service-list.ts} | 0 .../{9-service-up.ts => 8-service-up.ts} | 0 .../{10-service-down.ts => 9-service-down.ts} | 0 packages/bolt/src/common/index.ts | 31 +++-- packages/bolt/src/constants/bolt-configs.ts | 1 + packages/bolt/src/helpers/generate-routes.ts | 8 +- packages/bolt/src/libraries/env.ts | 12 +- .../bolt/src/typings/run-service-options.ts | 1 - 67 files changed, 293 insertions(+), 268 deletions(-) delete mode 100644 packages/bolt/build/commands/11-route-generate.js rename packages/bolt/build/commands/{10-service-down.d.ts => 11-route-list.d.ts} (100%) rename packages/bolt/build/commands/{12-route-list.js => 11-route-list.js} (100%) rename packages/bolt/build/commands/{11-route-generate.d.ts => 12-exec.d.ts} (100%) rename packages/bolt/build/commands/{13-exec.js => 12-exec.js} (100%) rename packages/bolt/build/commands/{14-deploy.d.ts => 13-deploy.d.ts} (100%) rename packages/bolt/build/commands/{14-deploy.js => 13-deploy.js} (100%) rename packages/bolt/build/commands/{15-deploy-watch.d.ts => 14-deploy-watch.d.ts} (100%) rename packages/bolt/build/commands/{15-deploy-watch.js => 14-deploy-watch.js} (100%) delete mode 100644 packages/bolt/build/commands/3-env-generate.js rename packages/bolt/build/commands/{12-route-list.d.ts => 3-up.d.ts} (100%) rename packages/bolt/build/commands/{4-up.js => 3-up.js} (100%) rename packages/bolt/build/commands/{13-exec.d.ts => 4-down.d.ts} (100%) rename packages/bolt/build/commands/{5-down.js => 4-down.js} (100%) rename packages/bolt/build/commands/{3-env-generate.d.ts => 5-log.d.ts} (100%) rename packages/bolt/build/commands/{6-log.js => 5-log.js} (100%) rename packages/bolt/build/commands/{4-up.d.ts => 6-service-add.d.ts} (100%) rename packages/bolt/build/commands/{7-service-add.js => 6-service-add.js} (100%) rename packages/bolt/build/commands/{5-down.d.ts => 7-service-list.d.ts} (100%) rename packages/bolt/build/commands/{8-service-list.js => 7-service-list.js} (100%) delete mode 100644 packages/bolt/build/commands/8-service-list.d.ts rename packages/bolt/build/commands/{6-log.d.ts => 8-service-up.d.ts} (100%) rename packages/bolt/build/commands/{9-service-up.js => 8-service-up.js} (100%) rename packages/bolt/build/commands/{7-service-add.d.ts => 9-service-down.d.ts} (100%) rename packages/bolt/build/commands/{10-service-down.js => 9-service-down.js} (100%) delete mode 100644 packages/bolt/build/commands/9-service-up.d.ts mode change 100755 => 100644 packages/bolt/build/index.js delete mode 100644 packages/bolt/src/commands/11-route-generate.ts rename packages/bolt/src/commands/{12-route-list.ts => 11-route-list.ts} (100%) rename packages/bolt/src/commands/{13-exec.ts => 12-exec.ts} (100%) rename packages/bolt/src/commands/{14-deploy.ts => 13-deploy.ts} (100%) rename packages/bolt/src/commands/{15-deploy-watch.ts => 14-deploy-watch.ts} (100%) delete mode 100644 packages/bolt/src/commands/3-env-generate.ts rename packages/bolt/src/commands/{4-up.ts => 3-up.ts} (100%) rename packages/bolt/src/commands/{5-down.ts => 4-down.ts} (100%) rename packages/bolt/src/commands/{6-log.ts => 5-log.ts} (100%) rename packages/bolt/src/commands/{7-service-add.ts => 6-service-add.ts} (100%) rename packages/bolt/src/commands/{8-service-list.ts => 7-service-list.ts} (100%) rename packages/bolt/src/commands/{9-service-up.ts => 8-service-up.ts} (100%) rename packages/bolt/src/commands/{10-service-down.ts => 9-service-down.ts} (100%) diff --git a/packages/bolt/build/actions/deploy/index.js b/packages/bolt/build/actions/deploy/index.js index 4f7db58..cab379c 100644 --- a/packages/bolt/build/actions/deploy/index.js +++ b/packages/bolt/build/actions/deploy/index.js @@ -16,15 +16,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "../../helpers/validate-metadata", "../../helpers/validate-services", "./deploy"], factory); + define(["require", "exports", "chalk", "../../actions/env-generate", "../../helpers/validate-metadata", "../../helpers/validate-services", "../route-generate", "./deploy"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); + const chalk_1 = __importDefault(require("chalk")); + const env_generate_1 = __importDefault(require("../../actions/env-generate")); const validate_metadata_1 = require("../../helpers/validate-metadata"); const validate_services_1 = require("../../helpers/validate-services"); + const route_generate_1 = __importDefault(require("../route-generate")); const deploy_1 = __importDefault(require("./deploy")); exports.default = (options, isWatch = false) => __awaiter(void 0, void 0, void 0, function* () { + console.log(chalk_1.default.gray(">> Building Production Envs...")); + const envGenerate = new env_generate_1.default(); + yield envGenerate.handle({ environment: "production" }); + const routeGenerate = new route_generate_1.default(); + yield routeGenerate.handle(true); + return; // validate the project console.log(">> Validating project..."); yield (0, validate_metadata_1.validateMetadata)(); diff --git a/packages/bolt/build/actions/env-generate.d.ts b/packages/bolt/build/actions/env-generate.d.ts index 1f209fe..4f7419a 100644 --- a/packages/bolt/build/actions/env-generate.d.ts +++ b/packages/bolt/build/actions/env-generate.d.ts @@ -1,9 +1,17 @@ +import { Ingress } from "../typings/ingress"; +type ServiceInfo = { + ports: any; + serviceName: string; + servicePath: string; + ingress: Ingress[] | null | undefined; +}; +interface IHandlerFunctionArgs { + environment: "local" | "production"; + serviceInfo?: ServiceInfo; +} export default class EnvGenerate { - handle({ build, discoveredPorts, }: { - build: "prod" | "dev"; - discoveredPorts?: { - ports: any; - serviceName: String; - }; - }): Promise; + handle({ environment, serviceInfo, }: IHandlerFunctionArgs): Promise; + local(serviceInfo: ServiceInfo): Promise; + production(): Promise; } +export {}; diff --git a/packages/bolt/build/actions/env-generate.js b/packages/bolt/build/actions/env-generate.js index 5aedf67..5882185 100644 --- a/packages/bolt/build/actions/env-generate.js +++ b/packages/bolt/build/actions/env-generate.js @@ -23,30 +23,57 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "@gluestack/helpers", "path", "../common", "../helpers/fs-writefile", "../helpers/validate-metadata", "../helpers/validate-services", "../libraries/env", "../libraries/service-discovery", "./port-discovery"], factory); + define(["require", "exports", "@gluestack/helpers", "path", "../helpers/fs-writefile", "../libraries/env", "../libraries/service-discovery", "../common", "./port-discovery"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const helpers_1 = require("@gluestack/helpers"); const path_1 = require("path"); - const common_1 = __importDefault(require("../common")); const fs_writefile_1 = require("../helpers/fs-writefile"); - const validate_metadata_1 = require("../helpers/validate-metadata"); - const validate_services_1 = require("../helpers/validate-services"); const env_1 = __importDefault(require("../libraries/env")); const service_discovery_1 = __importDefault(require("../libraries/service-discovery")); + const common_1 = __importDefault(require("../common")); const port_discovery_1 = __importDefault(require("./port-discovery")); class EnvGenerate { - handle({ build, discoveredPorts, }) { + handle({ environment, serviceInfo, }) { + return __awaiter(this, void 0, void 0, function* () { + switch (environment) { + case "local": + yield this.local(serviceInfo); + break; + case "production": + yield this.production(); + break; + } + return; + }); + } + local(serviceInfo) { + return __awaiter(this, void 0, void 0, function* () { + // Gathering all contants + const { servicePath, serviceName } = serviceInfo; + const _yamlContent = yield common_1.default.getAndValidateBoltYaml(); + const ingress = _yamlContent.ingress || []; + const env = new env_1.default(yield (0, helpers_1.envToJson)((0, path_1.join)(process.cwd(), ".env.tpl")), ingress); + // Reading the .env.tpl + let serviceEnvJSON = yield (0, helpers_1.envToJson)((0, path_1.join)(servicePath, ".env.tpl")); + // Adding assigned ports and assigned hosts to the .env.tpl + let envTplContent = (0, helpers_1.jsonToEnv)(Object.assign(Object.assign(Object.assign({}, serviceEnvJSON), { ["ASSIGNED_HOST"]: "localhost" }), (serviceInfo.ports || {}))); + // Writing the updated .env.tpl + yield (0, fs_writefile_1.writefile)((0, path_1.join)(servicePath, ".env.tpl"), envTplContent); + // Reading values from updated .env.tpl and generating env from that + serviceEnvJSON = yield (0, helpers_1.envToJson)((0, path_1.join)(servicePath, ".env.tpl")); + yield env.addEnv(serviceName, serviceEnvJSON, servicePath); + yield env.generate(); + }); + } + production() { var _a, e_1, _b, _c; return __awaiter(this, void 0, void 0, function* () { const _yamlContent = yield common_1.default.getAndValidateBoltYaml(); - // Validations for metadata and services - yield (0, validate_metadata_1.validateMetadata)(); - yield (0, validate_services_1.validateServices)(); const ingress = _yamlContent.ingress || []; - const env = new env_1.default(yield (0, helpers_1.envToJson)((0, path_1.join)(process.cwd(), ".env.tpl")), build, ingress); + const env = new env_1.default(yield (0, helpers_1.envToJson)((0, path_1.join)(process.cwd(), ".env.tpl")), ingress, true); try { // Gather all the availables services for (var _d = true, _e = __asyncValues(Object.entries(_yamlContent.services)), _f; _f = yield _e.next(), _a = _f.done, !_a;) { @@ -57,21 +84,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const { servicePath, content } = yield common_1.default.getAndValidateService(serviceName, _yamlContent); let serviceEnvJSON = yield (0, helpers_1.envToJson)((0, path_1.join)(servicePath, ".env.tpl")); const defaultEnv = Object.assign(Object.assign({}, serviceEnvJSON), { ["ASSIGNED_HOST"]: "localhost" }); - let envContent = (0, helpers_1.jsonToEnv)(Object.assign({}, defaultEnv)); - if ((discoveredPorts === null || discoveredPorts === void 0 ? void 0 : discoveredPorts.serviceName) === serviceName) { - envContent = (0, helpers_1.jsonToEnv)(Object.assign(Object.assign({}, defaultEnv), (discoveredPorts.ports || {}))); - } - if (build === "prod") { - const portDiscovery = new port_discovery_1.default(content); - const productionPorts = yield portDiscovery.production(); - envContent = (0, helpers_1.jsonToEnv)(Object.assign(Object.assign({}, defaultEnv), (productionPorts.ports || {}))); - } + const portDiscovery = new port_discovery_1.default(content); + const productionPorts = yield portDiscovery.production(); + let envContent = (0, helpers_1.jsonToEnv)(Object.assign(Object.assign({}, defaultEnv), (productionPorts.ports || {}))); yield (0, fs_writefile_1.writefile)((0, path_1.join)(servicePath, ".env.tpl"), envContent); serviceEnvJSON = yield (0, helpers_1.envToJson)((0, path_1.join)(servicePath, ".env.tpl")); - if (build === "prod") { - const productionHosts = yield service_discovery_1.default.discoverProductionHost(servicePath); - serviceEnvJSON = Object.assign(Object.assign({}, serviceEnvJSON), productionHosts); - } + const productionHosts = yield service_discovery_1.default.discoverProductionHost(servicePath); + serviceEnvJSON = Object.assign(Object.assign({}, serviceEnvJSON), productionHosts); yield env.addEnv(serviceName, serviceEnvJSON, servicePath); } finally { diff --git a/packages/bolt/build/actions/route-generate.d.ts b/packages/bolt/build/actions/route-generate.d.ts index dcbeb48..d151680 100644 --- a/packages/bolt/build/actions/route-generate.d.ts +++ b/packages/bolt/build/actions/route-generate.d.ts @@ -1,3 +1,3 @@ export default class RouteGenerate { - handle(options: any): Promise; + handle(isProd?: boolean): Promise; } diff --git a/packages/bolt/build/actions/route-generate.js b/packages/bolt/build/actions/route-generate.js index b66fbea..b989cc0 100644 --- a/packages/bolt/build/actions/route-generate.js +++ b/packages/bolt/build/actions/route-generate.js @@ -16,27 +16,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "chalk", "../common", "../helpers/execute", "../helpers/generate-routes", "../helpers/validate-metadata", "../helpers/validate-services"], factory); + define(["require", "exports", "../common", "../helpers/generate-routes", "../helpers/validate-metadata", "../helpers/validate-services"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - const chalk_1 = __importDefault(require("chalk")); const common_1 = __importDefault(require("../common")); - const execute_1 = require("../helpers/execute"); const generate_routes_1 = __importDefault(require("../helpers/generate-routes")); const validate_metadata_1 = require("../helpers/validate-metadata"); const validate_services_1 = require("../helpers/validate-services"); class RouteGenerate { - handle(options) { + handle(isProd = false) { return __awaiter(this, void 0, void 0, function* () { const _yamlContent = yield common_1.default.getAndValidateBoltYaml(); - const isProd = options.prod || false; - if (isProd) { - console.log(chalk_1.default.gray(">> Building Production Envs...")); - const args = ["env:generate", "--build", "prod"]; - yield (0, execute_1.execute)("bolt", args, {}); - } // Validations for metadata and services yield (0, validate_metadata_1.validateMetadata)(); yield (0, validate_services_1.validateServices)(); diff --git a/packages/bolt/build/actions/service-up.d.ts b/packages/bolt/build/actions/service-up.d.ts index 374d232..7d6776b 100644 --- a/packages/bolt/build/actions/service-up.d.ts +++ b/packages/bolt/build/actions/service-up.d.ts @@ -2,5 +2,6 @@ import { RunServiceOptions } from "../typings/run-service-options"; export default class ServiceUp { private checkIfAlreadyUp; private validateServiceRunnerConfig; + checkDependentServicesStatus(serviceName: string, dependentServices: string[]): Promise; handle(serviceName: string, options: RunServiceOptions): Promise; } diff --git a/packages/bolt/build/actions/service-up.js b/packages/bolt/build/actions/service-up.js index af85b34..b099e50 100644 --- a/packages/bolt/build/actions/service-up.js +++ b/packages/bolt/build/actions/service-up.js @@ -16,7 +16,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "chalk", "path", "../helpers/docker-info", "../helpers/exit-with-msg", "../helpers/get-store", "../helpers/validate-metadata", "../helpers/validate-services", "../common", "../runners/service", "../helpers/data-interpolate", "./port-discovery", "./env-generate", "../helpers/rewrite-env", "../helpers/get-os"], factory); + define(["require", "exports", "chalk", "path", "../helpers/docker-info", "../helpers/exit-with-msg", "../helpers/get-store", "../helpers/validate-metadata", "../helpers/validate-services", "../common", "../runners/service", "../helpers/data-interpolate", "./port-discovery", "./env-generate", "../helpers/rewrite-env", "../helpers/get-os", "../helpers/get-store-data"], factory); } })(function (require, exports) { "use strict"; @@ -35,6 +35,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const env_generate_1 = __importDefault(require("./env-generate")); const rewrite_env_1 = require("../helpers/rewrite-env"); const get_os_1 = require("../helpers/get-os"); + const get_store_data_1 = require("../helpers/get-store-data"); class ServiceUp { // checkIfAlreadyUp(_yamlContent, serviceName) { @@ -54,6 +55,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } return true; } + checkDependentServicesStatus(serviceName, dependentServices) { + return __awaiter(this, void 0, void 0, function* () { + const storeServices = yield (0, get_store_data_1.getStoreData)("services"); + for (const dependentService of dependentServices) { + if (!storeServices[dependentService] || + storeServices[dependentService].status !== "up") { + yield (0, exit_with_msg_1.exitWithMsg)(`>> ${serviceName} is dependent on "${dependentService}" which is not up!`); + } + } + }); + } handle(serviceName, options) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { @@ -71,18 +83,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const { _yamlContent } = yield common_1.default.validateServiceInBoltYaml(serviceName); yield this.checkIfAlreadyUp(_yamlContent, serviceName); const { servicePath, content } = yield common_1.default.getAndValidateService(serviceName, _yamlContent); + // Check if service is dependent on other services and dependents are up or not + if (content.depends_on) { + yield this.checkDependentServicesStatus(serviceName, content.depends_on); + } if (!content.supported_service_runners.includes(srOption)) { console.log(chalk_1.default.yellow(`>> Given "${srOption}" service runner is not supported for ${serviceName}, using "${content.supported_service_runners[0]}" instead!`)); srOption = content.supported_service_runners[0]; } + // Discovering Ports const portDiscovery = new port_discovery_1.default(content); const discoveredPorts = yield portDiscovery.handle(); - // generates .env + // generating envs for the service console.log(chalk_1.default.gray(`>> Generating .env files...`)); - const generateEnv = new env_generate_1.default(); - yield generateEnv.handle({ - build: "dev", - discoveredPorts: discoveredPorts, + const envGenerate = new env_generate_1.default(); + yield envGenerate.handle({ + environment: "local", + serviceInfo: { + ports: discoveredPorts.ports, + serviceName: serviceName, + servicePath: servicePath, + ingress: _yamlContent.ingress, + }, }); // Make data interpolate into service-runner's yaml content from given env file :: LOCAL if ((_a = content === null || content === void 0 ? void 0 : content.service_runners) === null || _a === void 0 ? void 0 : _a.local) { diff --git a/packages/bolt/build/actions/up.js b/packages/bolt/build/actions/up.js index 944fede..9966da0 100644 --- a/packages/bolt/build/actions/up.js +++ b/packages/bolt/build/actions/up.js @@ -93,9 +93,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) { // Validations for metadata and services yield (0, validate_metadata_1.validateMetadata)(); yield (0, validate_services_1.validateServices)(); - // 1. generates routes - console.log(`>> Creating Ingress...`); - const ports = yield (0, generate_routes_1.default)(_yamlContent); const data = yield (0, get_store_data_1.getStoreData)("services"); const localRunners = ["local", "docker"]; const vmRunners = ["vmlocal", "vmdocker"]; @@ -205,7 +202,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) { yield serviceUp.handle(serviceName, { serviceRunner: prepared_service_runner, cache: cache, - ports, }); } finally { @@ -220,6 +216,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } finally { if (e_3) throw e_3.error; } } + // 1. generates routes + console.log(`>> Creating Ingress...`); + const ports = yield (0, generate_routes_1.default)(_yamlContent); // 5. starts nginx if the project runner is not vm and nginx config exists in bolt.yaml if (_yamlContent.ingress) { const nginxConfig = (0, path_1.join)(process.cwd(), bolt_configs_1.BOLT.NGINX_CONFIG_FILE_NAME); diff --git a/packages/bolt/build/commands/11-route-generate.js b/packages/bolt/build/commands/11-route-generate.js deleted file mode 100644 index 10d45ff..0000000 --- a/packages/bolt/build/commands/11-route-generate.js +++ /dev/null @@ -1,36 +0,0 @@ -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 }; -}; -(function (factory) { - if (typeof module === "object" && typeof module.exports === "object") { - var v = factory(require, exports); - if (v !== undefined) module.exports = v; - } - else if (typeof define === "function" && define.amd) { - define(["require", "exports", "../actions/route-generate", "../constants/bolt-configs"], factory); - } -})(function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - const route_generate_1 = __importDefault(require("../actions/route-generate")); - const bolt_configs_1 = require("../constants/bolt-configs"); - exports.default = (program) => __awaiter(void 0, void 0, void 0, function* () { - program - .command("route:generate") - .option("-p, --prod", "generates routes for deployment") - .description(`Generates "${bolt_configs_1.BOLT.NGINX_CONFIG_FILE_NAME}" file against "${bolt_configs_1.BOLT.YAML_FILE_NAME}" ingress`) - .action((options) => __awaiter(void 0, void 0, void 0, function* () { - const routeGenerate = new route_generate_1.default(); - yield routeGenerate.handle(options); - })); - }); -}); diff --git a/packages/bolt/build/commands/10-service-down.d.ts b/packages/bolt/build/commands/11-route-list.d.ts similarity index 100% rename from packages/bolt/build/commands/10-service-down.d.ts rename to packages/bolt/build/commands/11-route-list.d.ts diff --git a/packages/bolt/build/commands/12-route-list.js b/packages/bolt/build/commands/11-route-list.js similarity index 100% rename from packages/bolt/build/commands/12-route-list.js rename to packages/bolt/build/commands/11-route-list.js diff --git a/packages/bolt/build/commands/11-route-generate.d.ts b/packages/bolt/build/commands/12-exec.d.ts similarity index 100% rename from packages/bolt/build/commands/11-route-generate.d.ts rename to packages/bolt/build/commands/12-exec.d.ts diff --git a/packages/bolt/build/commands/13-exec.js b/packages/bolt/build/commands/12-exec.js similarity index 100% rename from packages/bolt/build/commands/13-exec.js rename to packages/bolt/build/commands/12-exec.js diff --git a/packages/bolt/build/commands/14-deploy.d.ts b/packages/bolt/build/commands/13-deploy.d.ts similarity index 100% rename from packages/bolt/build/commands/14-deploy.d.ts rename to packages/bolt/build/commands/13-deploy.d.ts diff --git a/packages/bolt/build/commands/14-deploy.js b/packages/bolt/build/commands/13-deploy.js similarity index 100% rename from packages/bolt/build/commands/14-deploy.js rename to packages/bolt/build/commands/13-deploy.js diff --git a/packages/bolt/build/commands/15-deploy-watch.d.ts b/packages/bolt/build/commands/14-deploy-watch.d.ts similarity index 100% rename from packages/bolt/build/commands/15-deploy-watch.d.ts rename to packages/bolt/build/commands/14-deploy-watch.d.ts diff --git a/packages/bolt/build/commands/15-deploy-watch.js b/packages/bolt/build/commands/14-deploy-watch.js similarity index 100% rename from packages/bolt/build/commands/15-deploy-watch.js rename to packages/bolt/build/commands/14-deploy-watch.js diff --git a/packages/bolt/build/commands/3-env-generate.js b/packages/bolt/build/commands/3-env-generate.js deleted file mode 100644 index 0bbbae1..0000000 --- a/packages/bolt/build/commands/3-env-generate.js +++ /dev/null @@ -1,35 +0,0 @@ -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 }; -}; -(function (factory) { - if (typeof module === "object" && typeof module.exports === "object") { - var v = factory(require, exports); - if (v !== undefined) module.exports = v; - } - else if (typeof define === "function" && define.amd) { - define(["require", "exports", "../actions/env-generate"], factory); - } -})(function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - const env_generate_1 = __importDefault(require("../actions/env-generate")); - exports.default = (program) => __awaiter(void 0, void 0, void 0, function* () { - program - .command("env:generate") - .option("-b, --build ", "build type", "dev") - .description(`Generates ".env" for all the services from ".env.tpl" file in each service`) - .action((option) => __awaiter(void 0, void 0, void 0, function* () { - const envGenerate = new env_generate_1.default(); - yield envGenerate.handle(option); - })); - }); -}); diff --git a/packages/bolt/build/commands/12-route-list.d.ts b/packages/bolt/build/commands/3-up.d.ts similarity index 100% rename from packages/bolt/build/commands/12-route-list.d.ts rename to packages/bolt/build/commands/3-up.d.ts diff --git a/packages/bolt/build/commands/4-up.js b/packages/bolt/build/commands/3-up.js similarity index 100% rename from packages/bolt/build/commands/4-up.js rename to packages/bolt/build/commands/3-up.js diff --git a/packages/bolt/build/commands/13-exec.d.ts b/packages/bolt/build/commands/4-down.d.ts similarity index 100% rename from packages/bolt/build/commands/13-exec.d.ts rename to packages/bolt/build/commands/4-down.d.ts diff --git a/packages/bolt/build/commands/5-down.js b/packages/bolt/build/commands/4-down.js similarity index 100% rename from packages/bolt/build/commands/5-down.js rename to packages/bolt/build/commands/4-down.js diff --git a/packages/bolt/build/commands/3-env-generate.d.ts b/packages/bolt/build/commands/5-log.d.ts similarity index 100% rename from packages/bolt/build/commands/3-env-generate.d.ts rename to packages/bolt/build/commands/5-log.d.ts diff --git a/packages/bolt/build/commands/6-log.js b/packages/bolt/build/commands/5-log.js similarity index 100% rename from packages/bolt/build/commands/6-log.js rename to packages/bolt/build/commands/5-log.js diff --git a/packages/bolt/build/commands/4-up.d.ts b/packages/bolt/build/commands/6-service-add.d.ts similarity index 100% rename from packages/bolt/build/commands/4-up.d.ts rename to packages/bolt/build/commands/6-service-add.d.ts diff --git a/packages/bolt/build/commands/7-service-add.js b/packages/bolt/build/commands/6-service-add.js similarity index 100% rename from packages/bolt/build/commands/7-service-add.js rename to packages/bolt/build/commands/6-service-add.js diff --git a/packages/bolt/build/commands/5-down.d.ts b/packages/bolt/build/commands/7-service-list.d.ts similarity index 100% rename from packages/bolt/build/commands/5-down.d.ts rename to packages/bolt/build/commands/7-service-list.d.ts diff --git a/packages/bolt/build/commands/8-service-list.js b/packages/bolt/build/commands/7-service-list.js similarity index 100% rename from packages/bolt/build/commands/8-service-list.js rename to packages/bolt/build/commands/7-service-list.js diff --git a/packages/bolt/build/commands/8-service-list.d.ts b/packages/bolt/build/commands/8-service-list.d.ts deleted file mode 100644 index f5bdab2..0000000 --- a/packages/bolt/build/commands/8-service-list.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Command } from "commander"; -declare const _default: (program: Command) => Promise; -export default _default; diff --git a/packages/bolt/build/commands/6-log.d.ts b/packages/bolt/build/commands/8-service-up.d.ts similarity index 100% rename from packages/bolt/build/commands/6-log.d.ts rename to packages/bolt/build/commands/8-service-up.d.ts diff --git a/packages/bolt/build/commands/9-service-up.js b/packages/bolt/build/commands/8-service-up.js similarity index 100% rename from packages/bolt/build/commands/9-service-up.js rename to packages/bolt/build/commands/8-service-up.js diff --git a/packages/bolt/build/commands/7-service-add.d.ts b/packages/bolt/build/commands/9-service-down.d.ts similarity index 100% rename from packages/bolt/build/commands/7-service-add.d.ts rename to packages/bolt/build/commands/9-service-down.d.ts diff --git a/packages/bolt/build/commands/10-service-down.js b/packages/bolt/build/commands/9-service-down.js similarity index 100% rename from packages/bolt/build/commands/10-service-down.js rename to packages/bolt/build/commands/9-service-down.js diff --git a/packages/bolt/build/commands/9-service-up.d.ts b/packages/bolt/build/commands/9-service-up.d.ts deleted file mode 100644 index f5bdab2..0000000 --- a/packages/bolt/build/commands/9-service-up.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Command } from "commander"; -declare const _default: (program: Command) => Promise; -export default _default; diff --git a/packages/bolt/build/common/index.d.ts b/packages/bolt/build/common/index.d.ts index 2ce627f..3b2ee1d 100644 --- a/packages/bolt/build/common/index.d.ts +++ b/packages/bolt/build/common/index.d.ts @@ -1,13 +1,12 @@ import { Bolt } from "../typings/bolt"; export default class Common { static getAndValidateBoltYaml(): Promise; - static getAndValidateService(serviceName: string, _yamlContent: any): Promise<{ + static getAndValidateService(serviceName: string, _yamlContent: Bolt): Promise<{ servicePath: string; _serviceYamlPath: string | boolean; yamlPath: string; content: import("../typings/bolt-service").BoltService; }>; - static generateEnv(): Promise; static validateServiceInBoltYaml(serviceName: string): Promise<{ _yamlPath: string; _yamlContent: Bolt; diff --git a/packages/bolt/build/common/index.js b/packages/bolt/build/common/index.js index cf10cc2..5a474ad 100644 --- a/packages/bolt/build/common/index.js +++ b/packages/bolt/build/common/index.js @@ -16,7 +16,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "../helpers/fs-exists", "lodash", "path", "../helpers/exit-with-msg", "../helpers/parse-yaml", "../validations/bolt", "../validations/bolt-service", "chalk", "../helpers/execute", "../constants/bolt-configs", "closest-match"], factory); + define(["require", "exports", "../helpers/fs-exists", "lodash", "path", "../helpers/exit-with-msg", "../helpers/parse-yaml", "../validations/bolt", "../validations/bolt-service", "chalk", "../constants/bolt-configs", "closest-match"], factory); } })(function (require, exports) { "use strict"; @@ -29,7 +29,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const bolt_1 = require("../validations/bolt"); const bolt_service_1 = require("../validations/bolt-service"); const chalk_1 = __importDefault(require("chalk")); - const execute_1 = require("../helpers/execute"); const bolt_configs_1 = require("../constants/bolt-configs"); const closest_match_1 = require("closest-match"); class Common { @@ -61,20 +60,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) { } const yamlPath = _serviceYamlPath; const content = yield (0, bolt_service_1.validateBoltService)(yield (0, parse_yaml_1.parseYAML)(yamlPath), servicePath); + // check if service has valid dependencies + const rootServices = Object.keys(_yamlContent.services); + if (content.depends_on) { + const serviceDependecies = content.depends_on; + for (const dependency of serviceDependecies) { + if (!rootServices.includes(dependency)) { + yield (0, exit_with_msg_1.exitWithMsg)(`>> "${serviceName}" has "${dependency}" as dependency doesn't exist in services`); + } + if (dependency === serviceName) { + yield (0, exit_with_msg_1.exitWithMsg)(`>> "${dependency}" cannot depend on itself`); + } + } + } return { servicePath, _serviceYamlPath, yamlPath, content }; }); } - static generateEnv() { - return __awaiter(this, void 0, void 0, function* () { - const args = ["env:generate"]; - // console.log(chalk.gray("$ bolt", args.join(" "))); - yield (0, execute_1.execute)("bolt", args, { - cwd: process.cwd(), - shell: true, - stdio: "inherit", - }); - }); - } static validateServiceInBoltYaml(serviceName) { return __awaiter(this, void 0, void 0, function* () { const _yamlPath = (0, path_1.join)(bolt_configs_1.BOLT.YAML_FILE_NAME); diff --git a/packages/bolt/build/constants/bolt-configs.d.ts b/packages/bolt/build/constants/bolt-configs.d.ts index 148f84f..dadfd22 100644 --- a/packages/bolt/build/constants/bolt-configs.d.ts +++ b/packages/bolt/build/constants/bolt-configs.d.ts @@ -5,4 +5,5 @@ export declare const BOLT: { PROCESS_FOLDER_NAME: string; NGINX_CONFIG_FILE_NAME: string; NGINX_CONTAINER_NAME: string; + NGINX_CONFIG_DEPLOY_FILE_NAME: string; }; diff --git a/packages/bolt/build/constants/bolt-configs.js b/packages/bolt/build/constants/bolt-configs.js index edab953..d98a41a 100644 --- a/packages/bolt/build/constants/bolt-configs.js +++ b/packages/bolt/build/constants/bolt-configs.js @@ -17,5 +17,6 @@ PROCESS_FOLDER_NAME: ".bolt", NGINX_CONFIG_FILE_NAME: "bolt.nginx.conf", NGINX_CONTAINER_NAME: "boltingress", + NGINX_CONFIG_DEPLOY_FILE_NAME: "bolt.nginx.deploy.conf", }; }); diff --git a/packages/bolt/build/helpers/generate-routes.js b/packages/bolt/build/helpers/generate-routes.js index 9d8b93b..d7485e2 100644 --- a/packages/bolt/build/helpers/generate-routes.js +++ b/packages/bolt/build/helpers/generate-routes.js @@ -125,11 +125,13 @@ http { ${serverBlocks} } `; + // prepare bolt.nginx.conf file's path + let nginxFile = (0, path_1.join)(process.cwd(), bolt_configs_1.BOLT.NGINX_CONFIG_FILE_NAME); + // if prod, use bolt.nginx.deploy.conf file if (isProd) { nginxConfig = `${serverBlocks}`; + nginxFile = (0, path_1.join)(process.cwd(), bolt_configs_1.BOLT.NGINX_CONFIG_DEPLOY_FILE_NAME); } - // prepare bolt.nginx.conf file's path - const nginxFile = (0, path_1.join)(process.cwd(), bolt_configs_1.BOLT.NGINX_CONFIG_FILE_NAME); // interpolate all variables from yaml and inject .env file's vars const { content } = yield (0, data_interpolate_1.default)({ content: nginxConfig }, (0, path_1.join)(process.cwd(), ".env")); // write bolt.nginx.conf file diff --git a/packages/bolt/build/index.js b/packages/bolt/build/index.js old mode 100755 new mode 100644 diff --git a/packages/bolt/build/libraries/env.d.ts b/packages/bolt/build/libraries/env.d.ts index 3130599..d1b2f22 100644 --- a/packages/bolt/build/libraries/env.d.ts +++ b/packages/bolt/build/libraries/env.d.ts @@ -9,7 +9,8 @@ export default class Env { keyCharacter: "%"; envs: ChildEnv[]; filepath: string; - constructor(envContent: any, build: "prod" | "dev", routes?: any); + isProd: boolean; + constructor(envContent: any, routes?: any, isProd?: boolean); addEnv(serviceName: string, envContent: any, path: string): Promise; generate(): Promise; writeEnv(): Promise; diff --git a/packages/bolt/build/libraries/env.js b/packages/bolt/build/libraries/env.js index 24f5a0b..0373dc7 100644 --- a/packages/bolt/build/libraries/env.js +++ b/packages/bolt/build/libraries/env.js @@ -35,7 +35,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) { * in your gluestack app */ class Env { - constructor(envContent, build, routes = []) { + constructor(envContent, routes = [], isProd = false) { this.keys = envContent; routes.map((route) => { const server = route.domain.split(".")[0] || ""; @@ -43,6 +43,7 @@ var __asyncValues = (this && this.__asyncValues) || function (o) { this.keys[`ENDPOINT_${server.toUpperCase()}`] = `http://localhost:${route.port}`; } }); + this.isProd = isProd; this.keyCharacter = "%"; this.envs = []; this.filepath = (0, path_1.join)(process.cwd(), ".env"); @@ -52,6 +53,10 @@ var __asyncValues = (this && this.__asyncValues) || function (o) { addEnv(serviceName, envContent, path) { var _a, e_1, _b, _c; return __awaiter(this, void 0, void 0, function* () { + const previousContent = yield (0, helpers_1.envToJson)((0, path_1.join)(process.cwd(), ".env")); + if (!this.isProd) { + this.keys = Object.assign(Object.assign({}, this.keys), previousContent); + } try { for (var _d = true, _e = __asyncValues(Object.keys(envContent)), _f; _f = yield _e.next(), _a = _f.done, !_a;) { _c = _f.value; diff --git a/packages/bolt/build/typings/run-service-options.d.ts b/packages/bolt/build/typings/run-service-options.d.ts index 5f1630a..4915485 100644 --- a/packages/bolt/build/typings/run-service-options.d.ts +++ b/packages/bolt/build/typings/run-service-options.d.ts @@ -1,5 +1,4 @@ export type RunServiceOptions = { serviceRunner: "docker" | "local" | "vmlocal" | "vmdocker"; cache?: boolean; - ports: string[]; }; diff --git a/packages/bolt/package.json b/packages/bolt/package.json index fb0095a..acf38e7 100644 --- a/packages/bolt/package.json +++ b/packages/bolt/package.json @@ -1,6 +1,6 @@ { "name": "@gluestack/bolt", - "version": "0.1.17", + "version": "0.1.18", "description": "Bolt Framework CLI", "main": "build/index.js", "bin": { diff --git a/packages/bolt/src/actions/deploy/index.ts b/packages/bolt/src/actions/deploy/index.ts index fd88c73..0935aad 100644 --- a/packages/bolt/src/actions/deploy/index.ts +++ b/packages/bolt/src/actions/deploy/index.ts @@ -1,8 +1,19 @@ +import chalk from "chalk"; +import EnvGenerate from "../../actions/env-generate"; import { validateMetadata } from "../../helpers/validate-metadata"; import { validateServices } from "../../helpers/validate-services"; +import RouteGenerate from "../route-generate"; import DeployClass from "./deploy"; export default async (options: any, isWatch: boolean = false) => { + console.log(chalk.gray(">> Building Production Envs...")); + const envGenerate = new EnvGenerate(); + await envGenerate.handle({ environment: "production" }); + + const routeGenerate = new RouteGenerate(); + await routeGenerate.handle(true); + + return; // validate the project console.log(">> Validating project..."); await validateMetadata(); diff --git a/packages/bolt/src/actions/env-generate.ts b/packages/bolt/src/actions/env-generate.ts index ccbe9c2..7456155 100644 --- a/packages/bolt/src/actions/env-generate.ts +++ b/packages/bolt/src/actions/env-generate.ts @@ -1,41 +1,84 @@ import { envToJson, jsonToEnv } from "@gluestack/helpers"; import { join } from "path"; -import Common from "../common"; - import { writefile } from "../helpers/fs-writefile"; -import { getOs } from "../helpers/get-os"; -import { rewriteEnvViaRegExpression } from "../helpers/rewrite-env"; -import { validateMetadata } from "../helpers/validate-metadata"; -import { validateServices } from "../helpers/validate-services"; import Env from "../libraries/env"; import ServiceDiscovery from "../libraries/service-discovery"; +import Common from "../common"; + import PortDiscovery from "./port-discovery"; +import { Ingress } from "../typings/ingress"; + +type ServiceInfo = { + ports: any; + serviceName: string; + servicePath: string; + ingress: Ingress[] | null | undefined; +}; + +interface IHandlerFunctionArgs { + environment: "local" | "production"; + serviceInfo?: ServiceInfo; +} export default class EnvGenerate { public async handle({ - build, - discoveredPorts, - }: { - build: "prod" | "dev"; - discoveredPorts?: { - ports: any; - serviceName: String; - }; - }): Promise { + environment, + serviceInfo, + }: IHandlerFunctionArgs): Promise { + switch (environment) { + case "local": + await this.local(serviceInfo as ServiceInfo); + break; + case "production": + await this.production(); + break; + } + return; + } + + public async local(serviceInfo: ServiceInfo): Promise { + // Gathering all contants + const { servicePath, serviceName } = serviceInfo; const _yamlContent = await Common.getAndValidateBoltYaml(); + const ingress = _yamlContent.ingress || []; + + const env = new Env( + await envToJson(join(process.cwd(), ".env.tpl")), + ingress + ); + + // Reading the .env.tpl + let serviceEnvJSON = await envToJson(join(servicePath, ".env.tpl")); + + // Adding assigned ports and assigned hosts to the .env.tpl + let envTplContent = jsonToEnv({ + ...serviceEnvJSON, + ["ASSIGNED_HOST"]: "localhost", + ...(serviceInfo.ports || {}), + }); + + // Writing the updated .env.tpl + await writefile(join(servicePath, ".env.tpl"), envTplContent); + + // Reading values from updated .env.tpl and generating env from that + serviceEnvJSON = await envToJson(join(servicePath, ".env.tpl")); - // Validations for metadata and services - await validateMetadata(); - await validateServices(); + await env.addEnv(serviceName, serviceEnvJSON, servicePath); + + await env.generate(); + } + + public async production() { + const _yamlContent = await Common.getAndValidateBoltYaml(); const ingress = _yamlContent.ingress || []; const env = new Env( await envToJson(join(process.cwd(), ".env.tpl")), - build, - ingress + ingress, + true ); // Gather all the availables services @@ -50,42 +93,21 @@ export default class EnvGenerate { ...serviceEnvJSON, ["ASSIGNED_HOST"]: "localhost", }; - + const portDiscovery = new PortDiscovery(content); + const productionPorts = await portDiscovery.production(); let envContent = jsonToEnv({ ...defaultEnv, + ...(productionPorts.ports || {}), }); - - if (discoveredPorts?.serviceName === serviceName) { - envContent = jsonToEnv({ - ...defaultEnv, - ...(discoveredPorts.ports || {}), - }); - } - - if (build === "prod") { - const portDiscovery = new PortDiscovery(content); - const productionPorts = await portDiscovery.production(); - - envContent = jsonToEnv({ - ...defaultEnv, - ...(productionPorts.ports || {}), - }); - } - await writefile(join(servicePath, ".env.tpl"), envContent); - serviceEnvJSON = await envToJson(join(servicePath, ".env.tpl")); - - if (build === "prod") { - const productionHosts = await ServiceDiscovery.discoverProductionHost( - servicePath - ); - serviceEnvJSON = { - ...serviceEnvJSON, - ...productionHosts, - }; - } - + const productionHosts = await ServiceDiscovery.discoverProductionHost( + servicePath + ); + serviceEnvJSON = { + ...serviceEnvJSON, + ...productionHosts, + }; await env.addEnv(serviceName, serviceEnvJSON, servicePath); } await env.generate(); diff --git a/packages/bolt/src/actions/route-generate.ts b/packages/bolt/src/actions/route-generate.ts index 554f950..691d0af 100644 --- a/packages/bolt/src/actions/route-generate.ts +++ b/packages/bolt/src/actions/route-generate.ts @@ -5,19 +5,12 @@ import { execute } from "../helpers/execute"; import generateRoutes from "../helpers/generate-routes"; import { validateMetadata } from "../helpers/validate-metadata"; import { validateServices } from "../helpers/validate-services"; +import EnvGenerate from "./env-generate"; export default class RouteGenerate { - public async handle(options: any) { + public async handle(isProd: boolean = false) { const _yamlContent = await Common.getAndValidateBoltYaml(); - const isProd = options.prod || false; - - if (isProd) { - console.log(chalk.gray(">> Building Production Envs...")); - const args = ["env:generate", "--build", "prod"]; - await execute("bolt", args, {}); - } - // Validations for metadata and services await validateMetadata(); await validateServices(); diff --git a/packages/bolt/src/actions/service-up.ts b/packages/bolt/src/actions/service-up.ts index e3f9259..6b9a689 100644 --- a/packages/bolt/src/actions/service-up.ts +++ b/packages/bolt/src/actions/service-up.ts @@ -25,6 +25,7 @@ import PortDiscovery from "./port-discovery"; import EnvGenerate from "./env-generate"; import { rewriteEnvViaRegExpression } from "../helpers/rewrite-env"; import { getOs } from "../helpers/get-os"; +import { getStoreData } from "../helpers/get-store-data"; export default class ServiceUp { // @@ -52,6 +53,23 @@ export default class ServiceUp { return true; } + public async checkDependentServicesStatus( + serviceName: string, + dependentServices: string[] + ) { + const storeServices: StoreServices = await getStoreData("services"); + for (const dependentService of dependentServices) { + if ( + !storeServices[dependentService] || + storeServices[dependentService].status !== "up" + ) { + await exitWithMsg( + `>> ${serviceName} is dependent on "${dependentService}" which is not up!` + ); + } + } + } + public async handle( serviceName: string, options: RunServiceOptions @@ -81,6 +99,14 @@ export default class ServiceUp { _yamlContent ); + // Check if service is dependent on other services and dependents are up or not + if (content.depends_on) { + await this.checkDependentServicesStatus( + serviceName, + content.depends_on + ); + } + if (!content.supported_service_runners.includes(srOption)) { console.log( chalk.yellow( @@ -90,15 +116,21 @@ export default class ServiceUp { srOption = content.supported_service_runners[0]; } + // Discovering Ports const portDiscovery = new PortDiscovery(content); const discoveredPorts = await portDiscovery.handle(); - // generates .env + // generating envs for the service console.log(chalk.gray(`>> Generating .env files...`)); - const generateEnv = new EnvGenerate(); - await generateEnv.handle({ - build: "dev", - discoveredPorts: discoveredPorts, + const envGenerate = new EnvGenerate(); + await envGenerate.handle({ + environment: "local", + serviceInfo: { + ports: discoveredPorts.ports, + serviceName: serviceName, + servicePath: servicePath, + ingress: _yamlContent.ingress, + }, }); // Make data interpolate into service-runner's yaml content from given env file :: LOCAL diff --git a/packages/bolt/src/actions/up.ts b/packages/bolt/src/actions/up.ts index de489b4..4d0b404 100644 --- a/packages/bolt/src/actions/up.ts +++ b/packages/bolt/src/actions/up.ts @@ -86,10 +86,6 @@ export default class Up { await validateMetadata(); await validateServices(); - // 1. generates routes - console.log(`>> Creating Ingress...`); - const ports = await generateRoutes(_yamlContent); - const data: StoreServices = await getStoreData("services"); const localRunners = ["local", "docker"]; @@ -211,10 +207,13 @@ export default class Up { await serviceUp.handle(serviceName, { serviceRunner: prepared_service_runner, cache: cache, - ports, }); } + // 1. generates routes + console.log(`>> Creating Ingress...`); + const ports = await generateRoutes(_yamlContent); + // 5. starts nginx if the project runner is not vm and nginx config exists in bolt.yaml if (_yamlContent.ingress) { const nginxConfig = join(process.cwd(), BOLT.NGINX_CONFIG_FILE_NAME); diff --git a/packages/bolt/src/commands/11-route-generate.ts b/packages/bolt/src/commands/11-route-generate.ts deleted file mode 100644 index 8c7ef77..0000000 --- a/packages/bolt/src/commands/11-route-generate.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Command } from "commander"; -import RouteGenerate from "../actions/route-generate"; -import { BOLT } from "../constants/bolt-configs"; - -export default async (program: Command) => { - program - .command("route:generate") - .option("-p, --prod", "generates routes for deployment") - .description( - `Generates "${BOLT.NGINX_CONFIG_FILE_NAME}" file against "${BOLT.YAML_FILE_NAME}" ingress` - ) - .action(async (options) => { - const routeGenerate = new RouteGenerate(); - await routeGenerate.handle(options); - }); -}; diff --git a/packages/bolt/src/commands/12-route-list.ts b/packages/bolt/src/commands/11-route-list.ts similarity index 100% rename from packages/bolt/src/commands/12-route-list.ts rename to packages/bolt/src/commands/11-route-list.ts diff --git a/packages/bolt/src/commands/13-exec.ts b/packages/bolt/src/commands/12-exec.ts similarity index 100% rename from packages/bolt/src/commands/13-exec.ts rename to packages/bolt/src/commands/12-exec.ts diff --git a/packages/bolt/src/commands/14-deploy.ts b/packages/bolt/src/commands/13-deploy.ts similarity index 100% rename from packages/bolt/src/commands/14-deploy.ts rename to packages/bolt/src/commands/13-deploy.ts diff --git a/packages/bolt/src/commands/15-deploy-watch.ts b/packages/bolt/src/commands/14-deploy-watch.ts similarity index 100% rename from packages/bolt/src/commands/15-deploy-watch.ts rename to packages/bolt/src/commands/14-deploy-watch.ts diff --git a/packages/bolt/src/commands/3-env-generate.ts b/packages/bolt/src/commands/3-env-generate.ts deleted file mode 100644 index 824483c..0000000 --- a/packages/bolt/src/commands/3-env-generate.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Command } from "commander"; -import EnvGenerate from "../actions/env-generate"; - -export default async (program: Command) => { - program - .command("env:generate") - .option("-b, --build ", "build type", "dev") - .description( - `Generates ".env" for all the services from ".env.tpl" file in each service` - ) - .action(async (option) => { - const envGenerate = new EnvGenerate(); - await envGenerate.handle(option); - }); -}; diff --git a/packages/bolt/src/commands/4-up.ts b/packages/bolt/src/commands/3-up.ts similarity index 100% rename from packages/bolt/src/commands/4-up.ts rename to packages/bolt/src/commands/3-up.ts diff --git a/packages/bolt/src/commands/5-down.ts b/packages/bolt/src/commands/4-down.ts similarity index 100% rename from packages/bolt/src/commands/5-down.ts rename to packages/bolt/src/commands/4-down.ts diff --git a/packages/bolt/src/commands/6-log.ts b/packages/bolt/src/commands/5-log.ts similarity index 100% rename from packages/bolt/src/commands/6-log.ts rename to packages/bolt/src/commands/5-log.ts diff --git a/packages/bolt/src/commands/7-service-add.ts b/packages/bolt/src/commands/6-service-add.ts similarity index 100% rename from packages/bolt/src/commands/7-service-add.ts rename to packages/bolt/src/commands/6-service-add.ts diff --git a/packages/bolt/src/commands/8-service-list.ts b/packages/bolt/src/commands/7-service-list.ts similarity index 100% rename from packages/bolt/src/commands/8-service-list.ts rename to packages/bolt/src/commands/7-service-list.ts diff --git a/packages/bolt/src/commands/9-service-up.ts b/packages/bolt/src/commands/8-service-up.ts similarity index 100% rename from packages/bolt/src/commands/9-service-up.ts rename to packages/bolt/src/commands/8-service-up.ts diff --git a/packages/bolt/src/commands/10-service-down.ts b/packages/bolt/src/commands/9-service-down.ts similarity index 100% rename from packages/bolt/src/commands/10-service-down.ts rename to packages/bolt/src/commands/9-service-down.ts diff --git a/packages/bolt/src/common/index.ts b/packages/bolt/src/common/index.ts index c995f76..c72bd97 100644 --- a/packages/bolt/src/common/index.ts +++ b/packages/bolt/src/common/index.ts @@ -28,7 +28,7 @@ export default class Common { public static async getAndValidateService( serviceName: string, - _yamlContent: any + _yamlContent: Bolt ) { // if service doesn't exists, exit const servicePath: string = join( @@ -64,19 +64,24 @@ export default class Common { servicePath ); - return { servicePath, _serviceYamlPath, yamlPath, content }; - } - - public static async generateEnv() { - const args: string[] = ["env:generate"]; - - // console.log(chalk.gray("$ bolt", args.join(" "))); + // check if service has valid dependencies + const rootServices = Object.keys(_yamlContent.services); + + if (content.depends_on) { + const serviceDependecies = content.depends_on; + for (const dependency of serviceDependecies) { + if (!rootServices.includes(dependency)) { + await exitWithMsg( + `>> "${serviceName}" has "${dependency}" as dependency doesn't exist in services` + ); + } + if (dependency === serviceName) { + await exitWithMsg(`>> "${dependency}" cannot depend on itself`); + } + } + } - await execute("bolt", args, { - cwd: process.cwd(), - shell: true, - stdio: "inherit", - }); + return { servicePath, _serviceYamlPath, yamlPath, content }; } public static async validateServiceInBoltYaml(serviceName: string) { diff --git a/packages/bolt/src/constants/bolt-configs.ts b/packages/bolt/src/constants/bolt-configs.ts index 38bb84e..e9908ae 100644 --- a/packages/bolt/src/constants/bolt-configs.ts +++ b/packages/bolt/src/constants/bolt-configs.ts @@ -5,4 +5,5 @@ export const BOLT = { PROCESS_FOLDER_NAME: ".bolt", NGINX_CONFIG_FILE_NAME: "bolt.nginx.conf", NGINX_CONTAINER_NAME: "boltingress", + NGINX_CONFIG_DEPLOY_FILE_NAME: "bolt.nginx.deploy.conf", }; diff --git a/packages/bolt/src/helpers/generate-routes.ts b/packages/bolt/src/helpers/generate-routes.ts index f1cfe00..16ea441 100644 --- a/packages/bolt/src/helpers/generate-routes.ts +++ b/packages/bolt/src/helpers/generate-routes.ts @@ -128,13 +128,15 @@ http { } `; + // prepare bolt.nginx.conf file's path + let nginxFile = join(process.cwd(), BOLT.NGINX_CONFIG_FILE_NAME); + + // if prod, use bolt.nginx.deploy.conf file if (isProd) { nginxConfig = `${serverBlocks}`; + nginxFile = join(process.cwd(), BOLT.NGINX_CONFIG_DEPLOY_FILE_NAME); } - // prepare bolt.nginx.conf file's path - const nginxFile = join(process.cwd(), BOLT.NGINX_CONFIG_FILE_NAME); - // interpolate all variables from yaml and inject .env file's vars const { content } = await interpolate( { content: nginxConfig }, diff --git a/packages/bolt/src/libraries/env.ts b/packages/bolt/src/libraries/env.ts index b884d9a..bdeb6a7 100644 --- a/packages/bolt/src/libraries/env.ts +++ b/packages/bolt/src/libraries/env.ts @@ -5,6 +5,7 @@ import { getPrefix, getCrossEnvKey, jsonToEnv, + envToJson, } from "@gluestack/helpers"; /** @@ -18,8 +19,9 @@ export default class Env { public keyCharacter: "%"; public envs: ChildEnv[]; public filepath: string; + public isProd: boolean; - constructor(envContent: any, build: "prod" | "dev", routes: any = []) { + constructor(envContent: any, routes: any = [], isProd: boolean = false) { this.keys = envContent; routes.map((route: any) => { const server = route.domain.split(".")[0] || ""; @@ -29,6 +31,7 @@ export default class Env { ] = `http://localhost:${route.port}`; } }); + this.isProd = isProd; this.keyCharacter = "%"; this.envs = []; this.filepath = join(process.cwd(), ".env"); @@ -41,6 +44,13 @@ export default class Env { envContent: any, path: string ): Promise { + const previousContent = await envToJson(join(process.cwd(), ".env")); + if (!this.isProd) { + this.keys = { + ...this.keys, + ...previousContent, + }; + } for await (const key of Object.keys(envContent)) { this.keys[getCrossEnvKey(serviceName, key)] = envContent[key]; } diff --git a/packages/bolt/src/typings/run-service-options.ts b/packages/bolt/src/typings/run-service-options.ts index 1482dc1..024d9b1 100644 --- a/packages/bolt/src/typings/run-service-options.ts +++ b/packages/bolt/src/typings/run-service-options.ts @@ -1,5 +1,4 @@ export type RunServiceOptions = { serviceRunner: "docker" | "local" | "vmlocal" | "vmdocker"; cache?: boolean; - ports: string[]; }; From 1a589b970b239c9a78c083cad8e1d4dc474ae13d Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Wed, 2 Aug 2023 19:58:07 +0530 Subject: [PATCH 5/7] chore: removed unnecessary import --- packages/bolt/src/actions/route-generate.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/bolt/src/actions/route-generate.ts b/packages/bolt/src/actions/route-generate.ts index 691d0af..42e8181 100644 --- a/packages/bolt/src/actions/route-generate.ts +++ b/packages/bolt/src/actions/route-generate.ts @@ -1,11 +1,8 @@ -import chalk from "chalk"; import Common from "../common"; -import { execute } from "../helpers/execute"; import generateRoutes from "../helpers/generate-routes"; import { validateMetadata } from "../helpers/validate-metadata"; import { validateServices } from "../helpers/validate-services"; -import EnvGenerate from "./env-generate"; export default class RouteGenerate { public async handle(isProd: boolean = false) { From b2fc4413d270d5d0504badfc234ac6a811a774db Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Tue, 30 Jan 2024 11:58:11 +0530 Subject: [PATCH 6/7] chore: added deployment steps --- .../bolt/build/actions/deploy/deploy.d.ts | 15 ++- packages/bolt/build/actions/deploy/deploy.js | 32 +++-- packages/bolt/build/actions/deploy/index.js | 42 ++++--- packages/bolt/build/actions/route-generate.js | 4 +- packages/bolt/build/commands/13-deploy.js | 9 +- packages/bolt/build/config/index.d.ts | 3 +- packages/bolt/build/config/index.js | 13 +- .../helpers/deploy/apis/api-request.d.ts | 7 ++ .../build/helpers/deploy/apis/api-request.js | 49 ++++++++ .../build/helpers/deploy/apis/client.d.ts | 4 +- .../bolt/build/helpers/deploy/apis/client.js | 2 +- .../bolt/build/helpers/deploy/deploy/auth.js | 72 ----------- .../build/helpers/deploy/deploy/index.d.ts | 4 - .../build/helpers/deploy/deploy/upload.js | 105 ---------------- .../deploy/{deploy => deployment}/auth.d.ts | 5 +- .../build/helpers/deploy/deployment/auth.js | 90 ++++++++++++++ .../helpers/deploy/deployment/deploy.d.ts | 5 + .../build/helpers/deploy/deployment/deploy.js | 50 ++++++++ .../helpers/deploy/deployment/index.d.ts | 6 + .../deploy/{deploy => deployment}/index.js | 4 +- .../helpers/deploy/deployment/setProject.d.ts | 1 + .../helpers/deploy/deployment/setProject.js | 102 ++++++++++++++++ .../deploy/{deploy => deployment}/upload.d.ts | 2 +- .../build/helpers/deploy/deployment/upload.js | 55 +++++++++ .../deploy/{deploy => deployment}/watch.d.ts | 0 .../deploy/{deploy => deployment}/watch.js | 0 .../deploy/{deploy => deployment}/zip.d.ts | 0 .../deploy/{deploy => deployment}/zip.js | 50 ++++---- packages/bolt/build/index.js | 0 packages/bolt/build/runners/service/docker.js | 1 + packages/bolt/src/actions/deploy/deploy.ts | 39 ++++-- packages/bolt/src/actions/deploy/index.ts | 46 ++++--- packages/bolt/src/actions/route-generate.ts | 5 +- packages/bolt/src/commands/13-deploy.ts | 2 - packages/bolt/src/config/index.ts | 6 +- .../src/helpers/deploy/apis/api-request.ts | 45 +++++++ .../bolt/src/helpers/deploy/apis/client.ts | 9 +- .../bolt/src/helpers/deploy/deploy/auth.ts | 57 --------- .../bolt/src/helpers/deploy/deploy/index.ts | 4 - .../bolt/src/helpers/deploy/deploy/upload.ts | 114 ------------------ .../src/helpers/deploy/deployment/auth.ts | 74 ++++++++++++ .../src/helpers/deploy/deployment/deploy.ts | 36 ++++++ .../src/helpers/deploy/deployment/index.ts | 6 + .../helpers/deploy/deployment/setProject.ts | 87 +++++++++++++ .../src/helpers/deploy/deployment/upload.ts | 41 +++++++ .../deploy/{deploy => deployment}/watch.ts | 0 .../deploy/{deploy => deployment}/zip.ts | 68 ++++++----- packages/bolt/test.js | 25 ++++ 48 files changed, 900 insertions(+), 496 deletions(-) create mode 100644 packages/bolt/build/helpers/deploy/apis/api-request.d.ts create mode 100644 packages/bolt/build/helpers/deploy/apis/api-request.js delete mode 100644 packages/bolt/build/helpers/deploy/deploy/auth.js delete mode 100644 packages/bolt/build/helpers/deploy/deploy/index.d.ts delete mode 100644 packages/bolt/build/helpers/deploy/deploy/upload.js rename packages/bolt/build/helpers/deploy/{deploy => deployment}/auth.d.ts (65%) create mode 100644 packages/bolt/build/helpers/deploy/deployment/auth.js create mode 100644 packages/bolt/build/helpers/deploy/deployment/deploy.d.ts create mode 100644 packages/bolt/build/helpers/deploy/deployment/deploy.js create mode 100644 packages/bolt/build/helpers/deploy/deployment/index.d.ts rename packages/bolt/build/helpers/deploy/{deploy => deployment}/index.js (89%) create mode 100644 packages/bolt/build/helpers/deploy/deployment/setProject.d.ts create mode 100644 packages/bolt/build/helpers/deploy/deployment/setProject.js rename packages/bolt/build/helpers/deploy/{deploy => deployment}/upload.d.ts (87%) create mode 100644 packages/bolt/build/helpers/deploy/deployment/upload.js rename packages/bolt/build/helpers/deploy/{deploy => deployment}/watch.d.ts (100%) rename packages/bolt/build/helpers/deploy/{deploy => deployment}/watch.js (100%) rename packages/bolt/build/helpers/deploy/{deploy => deployment}/zip.d.ts (100%) rename packages/bolt/build/helpers/deploy/{deploy => deployment}/zip.js (78%) mode change 100644 => 100755 packages/bolt/build/index.js create mode 100644 packages/bolt/src/helpers/deploy/apis/api-request.ts delete mode 100644 packages/bolt/src/helpers/deploy/deploy/auth.ts delete mode 100644 packages/bolt/src/helpers/deploy/deploy/index.ts delete mode 100644 packages/bolt/src/helpers/deploy/deploy/upload.ts create mode 100644 packages/bolt/src/helpers/deploy/deployment/auth.ts create mode 100644 packages/bolt/src/helpers/deploy/deployment/deploy.ts create mode 100644 packages/bolt/src/helpers/deploy/deployment/index.ts create mode 100644 packages/bolt/src/helpers/deploy/deployment/setProject.ts create mode 100644 packages/bolt/src/helpers/deploy/deployment/upload.ts rename packages/bolt/src/helpers/deploy/{deploy => deployment}/watch.ts (100%) rename packages/bolt/src/helpers/deploy/{deploy => deployment}/zip.ts (55%) create mode 100644 packages/bolt/test.js diff --git a/packages/bolt/build/actions/deploy/deploy.d.ts b/packages/bolt/build/actions/deploy/deploy.d.ts index 46d7227..3692319 100644 --- a/packages/bolt/build/actions/deploy/deploy.d.ts +++ b/packages/bolt/build/actions/deploy/deploy.d.ts @@ -7,10 +7,19 @@ export default class DeployClass { constructor(); setStore(): Promise; saveStore(): Promise; - getSealContent(): Promise; + getBoltFileContent(): Promise; setServices(): Promise; createZip(): Promise; - auth(doAuth: boolean): Promise; - upload(): Promise; + auth(doAuth: boolean): Promise<{ + user: any; + projects: any; + } | undefined>; + setProject(projects: any[]): Promise; + upload(): Promise; + submit({ projectId, fileId, userId, }: { + projectId: number; + fileId: number; + userId: number; + }): Promise; watch(): Promise; } diff --git a/packages/bolt/build/actions/deploy/deploy.js b/packages/bolt/build/actions/deploy/deploy.js index 3476a60..2532bdc 100644 --- a/packages/bolt/build/actions/deploy/deploy.js +++ b/packages/bolt/build/actions/deploy/deploy.js @@ -23,13 +23,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "../../helpers/get-store", "../../helpers/deploy/deploy", "../../common"], factory); + define(["require", "exports", "../../helpers/get-store", "../../helpers/deploy/deployment", "../../common"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const get_store_1 = __importDefault(require("../../helpers/get-store")); - const deploy_1 = require("../../helpers/deploy/deploy"); + const deployment_1 = require("../../helpers/deploy/deployment"); const common_1 = __importDefault(require("../../common")); class DeployClass { constructor() { @@ -48,7 +48,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { this.store.save(); }); } - getSealContent() { + getBoltFileContent() { return __awaiter(this, void 0, void 0, function* () { const _yamlContent = yield common_1.default.getAndValidateBoltYaml(); return _yamlContent; @@ -59,7 +59,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { var _a, e_1, _b, _c; return __awaiter(this, void 0, void 0, function* () { const services = this.services; - const _yamlContent = yield this.getSealContent(); + const _yamlContent = yield this.getBoltFileContent(); try { // Gather all the availables services for (var _d = true, _e = __asyncValues(Object.entries(_yamlContent.services)), _f; _f = yield _e.next(), _a = _f.done, !_a;) { @@ -89,28 +89,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) { createZip() { return __awaiter(this, void 0, void 0, function* () { const cwd = this.cwd; - const { zipPath } = yield (0, deploy_1.zip)(cwd); + const { zipPath } = yield (0, deployment_1.zip)(cwd); this.zipPath = zipPath; return Promise.resolve(zipPath); }); } - // Authenticates users credentials and - // stores the details into the project's store auth(doAuth) { return __awaiter(this, void 0, void 0, function* () { - yield (0, deploy_1.auth)(doAuth, this.store); + return yield (0, deployment_1.auth)(doAuth, this.store); + }); + } + setProject(projects) { + return __awaiter(this, void 0, void 0, function* () { + return yield (0, deployment_1.setProject)(projects); }); } // uploads the zip into minio upload() { return __awaiter(this, void 0, void 0, function* () { - yield (0, deploy_1.upload)(this.zipPath, this.store); + return yield (0, deployment_1.upload)(this.zipPath, this.store); + }); + } + submit({ projectId, fileId, userId, }) { + return __awaiter(this, void 0, void 0, function* () { + return yield (0, deployment_1.deploy)({ + projectId, + fileId, + userId, + }); }); } // watches the deployment steps watch() { return __awaiter(this, void 0, void 0, function* () { - yield (0, deploy_1.watch)(this.store); + yield (0, deployment_1.watch)(this.store); }); } } diff --git a/packages/bolt/build/actions/deploy/index.js b/packages/bolt/build/actions/deploy/index.js index cab379c..39b47b1 100644 --- a/packages/bolt/build/actions/deploy/index.js +++ b/packages/bolt/build/actions/deploy/index.js @@ -28,20 +28,21 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const route_generate_1 = __importDefault(require("../route-generate")); const deploy_1 = __importDefault(require("./deploy")); exports.default = (options, isWatch = false) => __awaiter(void 0, void 0, void 0, function* () { + var _a; + // validate the project + console.log(">> Validating project..."); + yield (0, validate_metadata_1.validateMetadata)(); + yield (0, validate_services_1.validateServices)(); console.log(chalk_1.default.gray(">> Building Production Envs...")); const envGenerate = new env_generate_1.default(); yield envGenerate.handle({ environment: "production" }); + console.log(chalk_1.default.green(">> Production Envs built successfully!") + "\n"); const routeGenerate = new route_generate_1.default(); yield routeGenerate.handle(true); - return; - // validate the project - console.log(">> Validating project..."); - yield (0, validate_metadata_1.validateMetadata)(); - yield (0, validate_services_1.validateServices)(); - console.log("\n> Note: Please remove any zip file or unnecessary files/folders from your project before deploying!"); - console.log("\n> Deploying project..."); + console.log("\n>> Note: Please remove any zip file or unnecessary files/folders from your project before deploying!"); + console.log("\n>> Deploying project..."); const deploy = new deploy_1.default(); - console.log("\n> Gathering all deployable services..."); + console.log("\n>> Gathering all deployable services..."); // populate store yield deploy.setStore(); // populate services @@ -57,17 +58,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) { yield deploy.createZip(); // authenticate the user & store creds in local store console.log("\n>> Authenticating user credentials..."); - yield deploy.auth(options.auth); + const authData = yield deploy.auth(options.auth); console.log(">> Authentication successful!\n"); + const projects = (authData === null || authData === void 0 ? void 0 : authData.projects) || []; + const selectedProject = yield deploy.setProject(projects); // uploads the project zip file to minio console.log(">> Uploading project zip file..."); - yield deploy.upload(); + const fileId = yield deploy.upload(); console.log(">> Project zip file uploaded successfully!\n"); - // save store - yield deploy.saveStore(); - if (isWatch) { - console.log(">> Fetching deployment details...\n"); - yield deploy.watch(); - } + console.log(">> Submitting the deployment now..."); + const deployment = yield deploy.submit({ + fileId, + projectId: selectedProject.id, + userId: (_a = authData === null || authData === void 0 ? void 0 : authData.user) === null || _a === void 0 ? void 0 : _a.id, + }); + console.log(">> Deployment submitted successfully!\n"); + // // save store + // await deploy.saveStore(); + // if (isWatch) { + // console.log(">> Fetching deployment details...\n"); + // await deploy.watch(); + // } }); }); diff --git a/packages/bolt/build/actions/route-generate.js b/packages/bolt/build/actions/route-generate.js index b989cc0..c1ae232 100644 --- a/packages/bolt/build/actions/route-generate.js +++ b/packages/bolt/build/actions/route-generate.js @@ -34,7 +34,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) { yield (0, validate_services_1.validateServices)(); console.log(`>> Creating Ingress...`); yield (0, generate_routes_1.default)(_yamlContent, isProd); - process.exit(0); + { + !isProd && process.exit(0); + } }); } } diff --git a/packages/bolt/build/commands/13-deploy.js b/packages/bolt/build/commands/13-deploy.js index c59ce38..b6dd78a 100644 --- a/packages/bolt/build/commands/13-deploy.js +++ b/packages/bolt/build/commands/13-deploy.js @@ -16,22 +16,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "chalk"], factory); + define(["require", "exports", "../actions/deploy"], factory); } })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - const chalk_1 = __importDefault(require("chalk")); - // import deploy from "../actions/deploy"; + const deploy_1 = __importDefault(require("../actions/deploy")); exports.default = (program) => __awaiter(void 0, void 0, void 0, function* () { program .command("deploy") .option("-a, --auth [true]", "Re-enter credentials, do not use presisted credentials from earlier", false) .description("Prepares the compressed project & initiates the deployment") .action((options) => { - console.log(chalk_1.default.green(">> Coming Soon...")); - process.exit(); - // deploy(options, true); + (0, deploy_1.default)(options, true); }); }); }); diff --git a/packages/bolt/build/config/index.d.ts b/packages/bolt/build/config/index.d.ts index b40010c..1dd94ec 100644 --- a/packages/bolt/build/config/index.d.ts +++ b/packages/bolt/build/config/index.d.ts @@ -1,8 +1,7 @@ /** * SEAL server details */ -export declare const SEAL_DOMAIN: string; /** * SEAL GQL service details */ -export declare const SEAL_GQL: string; +export declare const BOX_SERVER_URL: string; diff --git a/packages/bolt/build/config/index.js b/packages/bolt/build/config/index.js index 410152b..eeb9111 100644 --- a/packages/bolt/build/config/index.js +++ b/packages/bolt/build/config/index.js @@ -1,3 +1,7 @@ +/** + * SEAL server details + */ +// export const SEAL_DOMAIN: string = "https://api.gluestack.io"; (function (factory) { if (typeof module === "object" && typeof module.exports === "object") { var v = factory(require, exports); @@ -9,13 +13,10 @@ })(function (require, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); - exports.SEAL_GQL = exports.SEAL_DOMAIN = void 0; - /** - * SEAL server details - */ - exports.SEAL_DOMAIN = 'https://api.gluestack.io'; + exports.BOX_SERVER_URL = void 0; /** * SEAL GQL service details */ - exports.SEAL_GQL = 'https://api.gluestack.io/backend/graphql'; + // export const SEAL_GQL: string = "https://api.gluestack.io/backend/graphql"; + exports.BOX_SERVER_URL = "http://localhost:8000/api"; }); diff --git a/packages/bolt/build/helpers/deploy/apis/api-request.d.ts b/packages/bolt/build/helpers/deploy/apis/api-request.d.ts new file mode 100644 index 0000000..5fc6d42 --- /dev/null +++ b/packages/bolt/build/helpers/deploy/apis/api-request.d.ts @@ -0,0 +1,7 @@ +export declare const apiRequest: ({ data, method, route, params, headers, }: { + data: any; + method: "GET" | "POST" | "PUT" | "DELETE"; + route: string; + params?: any; + headers?: any; +}) => Promise>; diff --git a/packages/bolt/build/helpers/deploy/apis/api-request.js b/packages/bolt/build/helpers/deploy/apis/api-request.js new file mode 100644 index 0000000..e0b027e --- /dev/null +++ b/packages/bolt/build/helpers/deploy/apis/api-request.js @@ -0,0 +1,49 @@ +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 }; +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "../../get-store-data", "axios", "../../../config"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.apiRequest = void 0; + const get_store_data_1 = require("../../get-store-data"); + const axios_1 = __importDefault(require("axios")); + const config_1 = require("../../../config"); + const apiRequest = ({ data, method, route, params, headers, }) => __awaiter(void 0, void 0, void 0, function* () { + const accessKey = yield (0, get_store_data_1.getStoreData)("access_key"); + const secretKey = yield (0, get_store_data_1.getStoreData)("secret_key"); + const requestHeaders = Object.assign({ ["Access-Key"]: accessKey, ["Secret-Key"]: secretKey }, headers); + params = params ? getParamString(params) : ""; + const config = { + method: method, + url: `${config_1.BOX_SERVER_URL}/deployment${route}${params}`, + headers: requestHeaders, + data: data, + }; + return yield axios_1.default.request(config); + }); + exports.apiRequest = apiRequest; + const getParamString = (params) => { + let paramString = "?"; + for (const [key, value] of Object.entries(params)) { + paramString += `${key}=${value}&`; + } + return paramString; + }; +}); diff --git a/packages/bolt/build/helpers/deploy/apis/client.d.ts b/packages/bolt/build/helpers/deploy/apis/client.d.ts index eecccaf..337b398 100644 --- a/packages/bolt/build/helpers/deploy/apis/client.d.ts +++ b/packages/bolt/build/helpers/deploy/apis/client.d.ts @@ -1,3 +1,3 @@ -import { GraphQLClient } from 'graphql-request'; +import { GraphQLClient } from "graphql-request"; export declare const clientGQL: GraphQLClient; -export { request, gql } from 'graphql-request'; +export { request, gql } from "graphql-request"; diff --git a/packages/bolt/build/helpers/deploy/apis/client.js b/packages/bolt/build/helpers/deploy/apis/client.js index aec5ce5..e167715 100644 --- a/packages/bolt/build/helpers/deploy/apis/client.js +++ b/packages/bolt/build/helpers/deploy/apis/client.js @@ -12,7 +12,7 @@ exports.gql = exports.request = exports.clientGQL = void 0; const graphql_request_1 = require("graphql-request"); const config_1 = require("../../../config"); - exports.clientGQL = new graphql_request_1.GraphQLClient(config_1.SEAL_GQL); + exports.clientGQL = new graphql_request_1.GraphQLClient(config_1.BOX_SERVER_URL); var graphql_request_2 = require("graphql-request"); Object.defineProperty(exports, "request", { enumerable: true, get: function () { return graphql_request_2.request; } }); Object.defineProperty(exports, "gql", { enumerable: true, get: function () { return graphql_request_2.gql; } }); diff --git a/packages/bolt/build/helpers/deploy/deploy/auth.js b/packages/bolt/build/helpers/deploy/deploy/auth.js deleted file mode 100644 index babdb4b..0000000 --- a/packages/bolt/build/helpers/deploy/deploy/auth.js +++ /dev/null @@ -1,72 +0,0 @@ -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()); - }); -}; -(function (factory) { - if (typeof module === "object" && typeof module.exports === "object") { - var v = factory(require, exports); - if (v !== undefined) module.exports = v; - } - else if (typeof define === "function" && define.amd) { - define(["require", "exports", "../../../config", "@gluestack/glue-server-sdk-js"], factory); - } -})(function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.auth = void 0; - const inquirer = require("inquirer"); - const config_1 = require("../../../config"); - const glue_server_sdk_js_1 = require("@gluestack/glue-server-sdk-js"); - const auth = (doAuth, store) => __awaiter(void 0, void 0, void 0, function* () { - const creds = { - email: store.get("email"), - password: store.get("password"), - }; - // prompts to collect credentials from users - if (doAuth || !creds.email || !creds.password) { - const results = yield inquirer.prompt([ - { - name: "email", - message: "Please enter your email", - type: "input", - }, - { - name: "password", - message: "Please enter your password", - type: "password", - }, - ]); - creds.email = results.email; - creds.password = results.password; - // store credentials in the store - store.set("email", results.email); - store.set("password", results.password); - } - const glue = new glue_server_sdk_js_1.Glue(config_1.SEAL_DOMAIN); - const response = yield glue.auth.login(Object.assign(Object.assign({}, creds), { role: "owner" })); - if (!response || !response.id) { - console.log(`>> Authentication failed. Message: ${response}`); - process.exit(-1); - } - if (!response.is_verified) { - console.log(`>> Authentication failed. Message: Account is not verified`); - process.exit(-1); - } - if (response.status === "on_waitlist") { - console.log(`>> Authentication failed. User is on waitlist`); - process.exit(-1); - } - // store user data in the store - store.set("team", response.team); - delete response.team; - store.set("user", response); - // save store - store.save(); - }); - exports.auth = auth; -}); diff --git a/packages/bolt/build/helpers/deploy/deploy/index.d.ts b/packages/bolt/build/helpers/deploy/deploy/index.d.ts deleted file mode 100644 index 545d7ca..0000000 --- a/packages/bolt/build/helpers/deploy/deploy/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './auth'; -export * from './upload'; -export * from './zip'; -export * from './watch'; diff --git a/packages/bolt/build/helpers/deploy/deploy/upload.js b/packages/bolt/build/helpers/deploy/deploy/upload.js deleted file mode 100644 index 8a155d1..0000000 --- a/packages/bolt/build/helpers/deploy/deploy/upload.js +++ /dev/null @@ -1,105 +0,0 @@ -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()); - }); -}; -(function (factory) { - if (typeof module === "object" && typeof module.exports === "object") { - var v = factory(require, exports); - if (v !== undefined) module.exports = v; - } - else if (typeof define === "function" && define.amd) { - define(["require", "exports", "fs", "../../../config", "../apis/handlers/gql", "@gluestack/glue-server-sdk-js", "../apis/handlers/gql/create-deployment"], factory); - } -})(function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - exports.upload = void 0; - const fs_1 = require("fs"); - const config_1 = require("../../../config"); - const gql_1 = require("../apis/handlers/gql"); - const glue_server_sdk_js_1 = require("@gluestack/glue-server-sdk-js"); - const create_deployment_1 = require("../apis/handlers/gql/create-deployment"); - const inquirer = require("inquirer"); - const upload = (filepath, store) => __awaiter(void 0, void 0, void 0, function* () { - let projectHash = store.get("project_hash"); - // prompts to collect Project ID from user - if (!projectHash || projectHash === "new") { - const team = store.get("team"); - let tmp; - try { - tmp = yield (0, gql_1.projects)(team.id, team.token); - } - catch (err) { - console.log(err); - console.log("> Error fetching projects... Please try again later."); - process.exit(-1); - } - // transform key-value pairs - const choices = [{ name: "Create a new Project", value: "new" }]; - choices.push(...tmp.projects.map((project) => { - return { name: project.name, value: project.project_hash }; - })); - // prompt to collect right project from user - const results = yield inquirer.prompt([ - { - name: "projectHash", - message: "Please choose an existing project or create one", - type: "list", - choices: choices, - }, - ]); - if (!results || !results.projectHash) { - console.error("> Error collecting project id"); - process.exit(-1); - } - // store project id in the store - projectHash = results.projectHash; - store.set("project_hash", results.projectHash); - } - // upload the project zip file to minio - const glue = new glue_server_sdk_js_1.Glue(config_1.SEAL_DOMAIN); - try { - const response = yield glue.storage.upload((0, fs_1.createReadStream)(filepath)); - if (response && !response.id) { - console.error("Error uploading the project zip file to minio"); - process.exit(1); - } - store.set("file_id", response.id); - console.log("> File uploaded successfully..."); - } - catch (error) { - console.log("> Uploading failed due to following reason:", error.message || error); - console.log(error); - process.exit(-1); - } - // submits the deployment - console.log("> Submitting the deployment now..."); - try { - const user = store.get("user"); - const team = store.get("team"); - const fileID = store.get("file_id"); - const projectHash = store.get("project_hash"); - const projectName = process.cwd().split("/")[process.cwd().split("/").length - 1]; - const response = yield (0, create_deployment_1.createDeployment)(projectName, projectHash === "new" ? "" : projectHash, team.id, user.access_token, fileID); - if (response && - response.createdbdeployment && - response.createdbdeployment.data) { - const { deployment_id, project_hash } = response.createdbdeployment.data; - // store the deployment id in the store - store.set("deployment_id", deployment_id); - store.set("project_hash", project_hash); - } - console.log("> Deployment submitted successfully..."); - } - catch (error) { - console.log("> Failed to create deployment:", error.response.errors || error); - } - // unlinkSync(filepath); - }); - exports.upload = upload; -}); diff --git a/packages/bolt/build/helpers/deploy/deploy/auth.d.ts b/packages/bolt/build/helpers/deploy/deployment/auth.d.ts similarity index 65% rename from packages/bolt/build/helpers/deploy/deploy/auth.d.ts rename to packages/bolt/build/helpers/deploy/deployment/auth.d.ts index c4d1688..0d1dbb7 100644 --- a/packages/bolt/build/helpers/deploy/deploy/auth.d.ts +++ b/packages/bolt/build/helpers/deploy/deployment/auth.d.ts @@ -1,2 +1,5 @@ import Store from "../../../libraries/store"; -export declare const auth: (doAuth: boolean, store: Store) => Promise; +export declare const auth: (doAuth: boolean, store: Store) => Promise<{ + user: any; + projects: any; +} | undefined>; diff --git a/packages/bolt/build/helpers/deploy/deployment/auth.js b/packages/bolt/build/helpers/deploy/deployment/auth.js new file mode 100644 index 0000000..3f55ff9 --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/auth.js @@ -0,0 +1,90 @@ +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 }; +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "axios", "../../../config", "../../exit-with-msg"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.auth = void 0; + const inquirer = require("inquirer"); + const axios_1 = __importDefault(require("axios")); + const config_1 = require("../../../config"); + const exit_with_msg_1 = require("../../exit-with-msg"); + const auth = (doAuth, store) => __awaiter(void 0, void 0, void 0, function* () { + var _a, _b, _c, _d, _e; + try { + const creds = { + access_key: store.get("access_key"), + secret_key: store.get("secret_key"), + }; + // prompts to collect credentials from users + if (doAuth || !creds.access_key || !creds.secret_key) { + const results = yield inquirer.prompt([ + { + name: "access_key", + message: "Please enter your access key", + type: "input", + }, + { + name: "secret_key", + message: "Please enter your secret key", + type: "input", + }, + ]); + creds.access_key = results.access_key; + creds.secret_key = results.secret_key; + // store credentials in the store + store.set("access_key", results.access_key); + store.set("secret_key", results.secret_key); + } + // authenticate user + const { data } = yield axios_1.default.request({ + method: "POST", + url: `${config_1.BOX_SERVER_URL}/deployment/login`, + data: JSON.stringify(creds), + headers: { + "Content-Type": "application/json", + }, + }); + if (!data.success) { + yield (0, exit_with_msg_1.exitWithMsg)("Error authenticating user"); + } + // check if user is blocker + if ((_b = (_a = data.data) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.is_blocked) { + yield (0, exit_with_msg_1.exitWithMsg)("User is blocked"); + } + const userData = (_c = data.data) === null || _c === void 0 ? void 0 : _c.user; + const projects = (_e = (_d = data.data) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.projects; + // Delete projects from userData object without updating data.data.user.projects + delete userData.projects; + // remove projects from the userData object + // store user details in the store + store.set("user", userData || ""); + store.save(); + return { + user: userData, + projects: projects, + }; + } + catch (error) { + yield (0, exit_with_msg_1.exitWithMsg)("Error authenticating user"); + } + }); + exports.auth = auth; +}); diff --git a/packages/bolt/build/helpers/deploy/deployment/deploy.d.ts b/packages/bolt/build/helpers/deploy/deployment/deploy.d.ts new file mode 100644 index 0000000..b24178d --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/deploy.d.ts @@ -0,0 +1,5 @@ +export declare const deploy: ({ fileId, projectId, userId, }: { + fileId: number; + projectId: number; + userId: number; +}) => Promise; diff --git a/packages/bolt/build/helpers/deploy/deployment/deploy.js b/packages/bolt/build/helpers/deploy/deployment/deploy.js new file mode 100644 index 0000000..e41200a --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/deploy.js @@ -0,0 +1,50 @@ +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()); + }); +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "../../exit-with-msg", "../apis/api-request"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.deploy = void 0; + const exit_with_msg_1 = require("../../exit-with-msg"); + const api_request_1 = require("../apis/api-request"); + const deploy = ({ fileId, projectId, userId, }) => __awaiter(void 0, void 0, void 0, function* () { + // submits the deployment + try { + const { data } = yield (0, api_request_1.apiRequest)({ + method: "POST", + data: { + file_id: fileId, + project_id: projectId, + user_id: userId, + }, + route: "/deploy", + headers: { + "Content-Type": "application/json", + }, + }); + if (!data || !data.success || !data.data.id) { + (0, exit_with_msg_1.exitWithMsg)("> Failed to create deployment:", data); + } + return data.data; + } + catch (error) { + console.log("Error", error); + yield (0, exit_with_msg_1.exitWithMsg)("Error creating deployment!"); + } + }); + exports.deploy = deploy; +}); diff --git a/packages/bolt/build/helpers/deploy/deployment/index.d.ts b/packages/bolt/build/helpers/deploy/deployment/index.d.ts new file mode 100644 index 0000000..37e7e29 --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/index.d.ts @@ -0,0 +1,6 @@ +export * from "./auth"; +export * from "./upload"; +export * from "./zip"; +export * from "./watch"; +export * from "./setProject"; +export * from "./deploy"; diff --git a/packages/bolt/build/helpers/deploy/deploy/index.js b/packages/bolt/build/helpers/deploy/deployment/index.js similarity index 89% rename from packages/bolt/build/helpers/deploy/deploy/index.js rename to packages/bolt/build/helpers/deploy/deployment/index.js index 91e7a93..b296332 100644 --- a/packages/bolt/build/helpers/deploy/deploy/index.js +++ b/packages/bolt/build/helpers/deploy/deployment/index.js @@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { if (v !== undefined) module.exports = v; } else if (typeof define === "function" && define.amd) { - define(["require", "exports", "./auth", "./upload", "./zip", "./watch"], factory); + define(["require", "exports", "./auth", "./upload", "./zip", "./watch", "./setProject", "./deploy"], factory); } })(function (require, exports) { "use strict"; @@ -27,4 +27,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) { __exportStar(require("./upload"), exports); __exportStar(require("./zip"), exports); __exportStar(require("./watch"), exports); + __exportStar(require("./setProject"), exports); + __exportStar(require("./deploy"), exports); }); diff --git a/packages/bolt/build/helpers/deploy/deployment/setProject.d.ts b/packages/bolt/build/helpers/deploy/deployment/setProject.d.ts new file mode 100644 index 0000000..c8e600d --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/setProject.d.ts @@ -0,0 +1 @@ +export declare const setProject: (projects: any[]) => Promise; diff --git a/packages/bolt/build/helpers/deploy/deployment/setProject.js b/packages/bolt/build/helpers/deploy/deployment/setProject.js new file mode 100644 index 0000000..f92e367 --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/setProject.js @@ -0,0 +1,102 @@ +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()); + }); +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "../../exit-with-msg", "../../get-store-data", "../apis/api-request"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.setProject = void 0; + const exit_with_msg_1 = require("../../exit-with-msg"); + const get_store_data_1 = require("../../get-store-data"); + const api_request_1 = require("../apis/api-request"); + const inquirer = require("inquirer"); + const setProject = (projects) => __awaiter(void 0, void 0, void 0, function* () { + try { + const choices = [{ name: "Create a new Project", value: "create" }]; + if (projects.length) { + choices.push({ name: "Select a project", value: "select" }); + } + const user = yield (0, get_store_data_1.getStoreData)("user"); + if (!user.id) { + yield (0, exit_with_msg_1.exitWithMsg)("Error setting action for project Creation!"); + } + const result = yield inquirer.prompt([ + { + type: "list", + name: "action", + message: "Please choose an existing project or create one", + choices: choices, + }, + ]); + if (!result || !result.action) { + yield (0, exit_with_msg_1.exitWithMsg)("Error setting action for project Creation!"); + return; + } + switch (result.action) { + case "create": + const createPrompt = yield inquirer.prompt([ + { + type: "input", + name: "name", + message: "Please enter a name for the project", + }, + ]); + const body = { + project_name: createPrompt.name, + created_by: user.id, + }; + const { data } = yield (0, api_request_1.apiRequest)({ + method: "POST", + data: body, + route: "/projects", + headers: { + "Content-Type": "application/json", + }, + }); + if (!data || !data.success || !data.data.project) { + console.log({ data }); + yield (0, exit_with_msg_1.exitWithMsg)("Error creating project!"); + } + const project = data.data.project; + delete project.user; + return project; + break; + case "select": + const choices = projects.map((project) => { + return { name: project.name, value: project }; + }); + const selectPrompt = yield inquirer.prompt([ + { + type: "list", + name: "selectedProject", + message: "Please choose an existing project or create one", + choices: choices, + }, + ]); + return selectPrompt.selectedProject; + break; + default: + yield (0, exit_with_msg_1.exitWithMsg)("Error setting action for project Creation!"); + } + return result; + } + catch (error) { + console.log({ error: error.response.data || "nothing" }); + yield (0, exit_with_msg_1.exitWithMsg)("Error While Project Selection!"); + } + }); + exports.setProject = setProject; +}); diff --git a/packages/bolt/build/helpers/deploy/deploy/upload.d.ts b/packages/bolt/build/helpers/deploy/deployment/upload.d.ts similarity index 87% rename from packages/bolt/build/helpers/deploy/deploy/upload.d.ts rename to packages/bolt/build/helpers/deploy/deployment/upload.d.ts index 6d2803c..8c93acd 100644 --- a/packages/bolt/build/helpers/deploy/deploy/upload.d.ts +++ b/packages/bolt/build/helpers/deploy/deployment/upload.d.ts @@ -1,2 +1,2 @@ import Store from "../../../libraries/store"; -export declare const upload: (filepath: string, store: Store) => Promise; +export declare const upload: (filepath: string, store: Store) => Promise; diff --git a/packages/bolt/build/helpers/deploy/deployment/upload.js b/packages/bolt/build/helpers/deploy/deployment/upload.js new file mode 100644 index 0000000..0a2ad8f --- /dev/null +++ b/packages/bolt/build/helpers/deploy/deployment/upload.js @@ -0,0 +1,55 @@ +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 }; +}; +(function (factory) { + if (typeof module === "object" && typeof module.exports === "object") { + var v = factory(require, exports); + if (v !== undefined) module.exports = v; + } + else if (typeof define === "function" && define.amd) { + define(["require", "exports", "fs", "form-data", "../apis/api-request"], factory); + } +})(function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.upload = void 0; + const fs_1 = require("fs"); + const inquirer = require("inquirer"); + const form_data_1 = __importDefault(require("form-data")); + const api_request_1 = require("../apis/api-request"); + const upload = (filepath, store) => __awaiter(void 0, void 0, void 0, function* () { + // upload the project zip file to minio + try { + const form = new form_data_1.default(); + form.append("file", (0, fs_1.createReadStream)(filepath)); + const { data } = yield (0, api_request_1.apiRequest)({ + method: "POST", + route: "/upload", + data: form, + headers: Object.assign({}, form.getHeaders()), + }); + if (!data.success || !data.data || !data.data.id) { + console.error("Error uploading the project zip file to minio"); + process.exit(1); + } + const fileId = data.data.id; + (0, fs_1.unlinkSync)(filepath); + return fileId; + } + catch (error) { + console.log("> Uploading failed due to following reason:", error.message || error); + console.log(error); + process.exit(-1); + } + }); + exports.upload = upload; +}); diff --git a/packages/bolt/build/helpers/deploy/deploy/watch.d.ts b/packages/bolt/build/helpers/deploy/deployment/watch.d.ts similarity index 100% rename from packages/bolt/build/helpers/deploy/deploy/watch.d.ts rename to packages/bolt/build/helpers/deploy/deployment/watch.d.ts diff --git a/packages/bolt/build/helpers/deploy/deploy/watch.js b/packages/bolt/build/helpers/deploy/deployment/watch.js similarity index 100% rename from packages/bolt/build/helpers/deploy/deploy/watch.js rename to packages/bolt/build/helpers/deploy/deployment/watch.js diff --git a/packages/bolt/build/helpers/deploy/deploy/zip.d.ts b/packages/bolt/build/helpers/deploy/deployment/zip.d.ts similarity index 100% rename from packages/bolt/build/helpers/deploy/deploy/zip.d.ts rename to packages/bolt/build/helpers/deploy/deployment/zip.d.ts diff --git a/packages/bolt/build/helpers/deploy/deploy/zip.js b/packages/bolt/build/helpers/deploy/deployment/zip.js similarity index 78% rename from packages/bolt/build/helpers/deploy/deploy/zip.js rename to packages/bolt/build/helpers/deploy/deployment/zip.js index 0cccc6c..997f915 100644 --- a/packages/bolt/build/helpers/deploy/deploy/zip.js +++ b/packages/bolt/build/helpers/deploy/deployment/zip.js @@ -52,8 +52,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const file_exists_1 = require("../file-exists"); const readline = __importStar(require("readline")); const zip = (project_path) => __awaiter(void 0, void 0, void 0, function* () { - const filename = 'output.zip'; - const directory = (0, path_1.join)(project_path, '.deploy'); + const filename = `${(0, path_1.basename)(process.cwd())}.zip`; + const directory = (0, path_1.join)(project_path, ".deploy"); const zipPath = (0, path_1.join)(directory, filename); if (!(yield (0, file_exists_1.fileExists)(directory))) { (0, fs_1.mkdirSync)(directory, { recursive: true }); @@ -61,27 +61,27 @@ var __importDefault = (this && this.__importDefault) || function (mod) { const promise = new Promise((resolve, reject) => { // create a file to stream archive data to. const output = (0, fs_1.createWriteStream)(zipPath); - const archive = (0, archiver_1.default)('zip', { - zlib: { level: 9 } // Sets the compression level. + const archive = (0, archiver_1.default)("zip", { + zlib: { level: 9 }, // Sets the compression level. }); // listen for all archive data to be written // 'close' event is fired only when a file descriptor is involved - output.on('close', () => { + output.on("close", () => { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); - process.stdout.write(`> Compressed ${(0, format_bytes_1.formatBytes)(archive.pointer())} into "${filename}"!`); + process.stdout.write(`>> Compressed ${(0, format_bytes_1.formatBytes)(archive.pointer())} into "${filename}"!`); console.log(); resolve(zipPath); }); - archive.on('progress', (progress) => { + archive.on("progress", (progress) => { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); - process.stdout.write(`> In progress: processed ${progress.entries.processed} files & ${(0, format_bytes_1.formatBytes)(progress.fs.processedBytes)} of data`); + process.stdout.write(`>> In progress: processed ${progress.entries.processed} files & ${(0, format_bytes_1.formatBytes)(progress.fs.processedBytes)} of data`); }); // good practice to catch warnings (ie stat failures and other non-blocking errors) - archive.on('warning', (err) => { - console.log('> Warning:', err); - if (err.code === 'ENOENT') { + archive.on("warning", (err) => { + console.log("> Warning:", err); + if (err.code === "ENOENT") { // log warning } else { @@ -92,30 +92,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) { // This event is fired when the data source is drained no matter what was the data source. // It is not part of this library but rather from the NodeJS Stream API. // @see: https://nodejs.org/api/stream.html#stream_event_end - output.on('end', () => { - console.log('Data has been drained'); + output.on("end", () => { + console.log("Data has been drained"); }); // good practice to catch this error explicitly - archive.on('error', (err) => { + archive.on("error", (err) => { reject(err); }); // pipe archive data to the file archive.pipe(output); // append files from a glob pattern - archive.glob('**', { + archive.glob("**", { ignore: [ - '**/storage/**/data/**', - '**/databases/**/db/**', - 'node_modules/*', - '**/node_modules/**', - '**/.DS_Store', - '.git/**', - '**/*.zip', - '.deploy', - '**/.next/**', + "**/storage/**/data/**", + "**/databases/**/db/**", + "node_modules/*", + "**/node_modules/**", + "**/.DS_Store", + ".git/**", + "**/*.zip", + ".deploy", + "**/.next/**", ], cwd: project_path, - dot: true + dot: true, }); // finalize the archive (ie we are done appending files but streams have to finish yet) // 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand diff --git a/packages/bolt/build/index.js b/packages/bolt/build/index.js old mode 100644 new mode 100755 diff --git a/packages/bolt/build/runners/service/docker.js b/packages/bolt/build/runners/service/docker.js index 380f575..3b20daa 100644 --- a/packages/bolt/build/runners/service/docker.js +++ b/packages/bolt/build/runners/service/docker.js @@ -58,6 +58,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge console.log(">> Initiaiting Docker run..."); const args = [ "run", + "--rm", "--detach", "--name", this.container_name, diff --git a/packages/bolt/src/actions/deploy/deploy.ts b/packages/bolt/src/actions/deploy/deploy.ts index ae0da83..cef3162 100644 --- a/packages/bolt/src/actions/deploy/deploy.ts +++ b/packages/bolt/src/actions/deploy/deploy.ts @@ -1,6 +1,13 @@ import getStore from "../../helpers/get-store"; import { BoltService } from "../../typings/bolt-service"; -import { auth, upload, zip, watch } from "../../helpers/deploy/deploy"; +import { + auth, + upload, + zip, + watch, + setProject, + deploy, +} from "../../helpers/deploy/deployment"; import Common from "../../common"; export default class DeployClass { @@ -21,7 +28,7 @@ export default class DeployClass { this.store.save(); } - async getSealContent() { + async getBoltFileContent() { const _yamlContent = await Common.getAndValidateBoltYaml(); return _yamlContent; } @@ -29,7 +36,7 @@ export default class DeployClass { // populate services async setServices() { const services: BoltService[] = this.services; - const _yamlContent = await this.getSealContent(); + const _yamlContent = await this.getBoltFileContent(); // Gather all the availables services for await (const [serviceName] of Object.entries(_yamlContent.services)) { const { content } = await Common.getAndValidateService( @@ -51,15 +58,33 @@ export default class DeployClass { return Promise.resolve(zipPath); } - // Authenticates users credentials and - // stores the details into the project's store async auth(doAuth: boolean) { - await auth(doAuth, this.store); + return await auth(doAuth, this.store); + } + + async setProject(projects: any[]) { + return await setProject(projects); } // uploads the zip into minio async upload() { - await upload(this.zipPath, this.store); + return await upload(this.zipPath, this.store); + } + + async submit({ + projectId, + fileId, + userId, + }: { + projectId: number; + fileId: number; + userId: number; + }) { + return await deploy({ + projectId, + fileId, + userId, + }); } // watches the deployment steps async watch() { diff --git a/packages/bolt/src/actions/deploy/index.ts b/packages/bolt/src/actions/deploy/index.ts index 0935aad..633b8d1 100644 --- a/packages/bolt/src/actions/deploy/index.ts +++ b/packages/bolt/src/actions/deploy/index.ts @@ -1,32 +1,33 @@ import chalk from "chalk"; import EnvGenerate from "../../actions/env-generate"; +import { exitWithMsg } from "../../helpers/exit-with-msg"; import { validateMetadata } from "../../helpers/validate-metadata"; import { validateServices } from "../../helpers/validate-services"; import RouteGenerate from "../route-generate"; import DeployClass from "./deploy"; export default async (options: any, isWatch: boolean = false) => { + // validate the project + console.log(">> Validating project..."); + await validateMetadata(); + await validateServices(); + console.log(chalk.gray(">> Building Production Envs...")); const envGenerate = new EnvGenerate(); await envGenerate.handle({ environment: "production" }); + console.log(chalk.green(">> Production Envs built successfully!") + "\n"); const routeGenerate = new RouteGenerate(); await routeGenerate.handle(true); - return; - // validate the project - console.log(">> Validating project..."); - await validateMetadata(); - await validateServices(); - console.log( - "\n> Note: Please remove any zip file or unnecessary files/folders from your project before deploying!" + "\n>> Note: Please remove any zip file or unnecessary files/folders from your project before deploying!" ); - console.log("\n> Deploying project..."); + console.log("\n>> Deploying project..."); const deploy = new DeployClass(); - console.log("\n> Gathering all deployable services..."); + console.log("\n>> Gathering all deployable services..."); // populate store await deploy.setStore(); @@ -47,19 +48,30 @@ export default async (options: any, isWatch: boolean = false) => { // authenticate the user & store creds in local store console.log("\n>> Authenticating user credentials..."); - await deploy.auth(options.auth); + const authData = await deploy.auth(options.auth); console.log(">> Authentication successful!\n"); + const projects = authData?.projects || []; + const selectedProject = await deploy.setProject(projects); + // uploads the project zip file to minio console.log(">> Uploading project zip file..."); - await deploy.upload(); + const fileId = await deploy.upload(); console.log(">> Project zip file uploaded successfully!\n"); - // save store - await deploy.saveStore(); + console.log(">> Submitting the deployment now..."); + const deployment = await deploy.submit({ + fileId, + projectId: selectedProject.id, + userId: authData?.user?.id, + }); + console.log(">> Deployment submitted successfully!\n"); - if (isWatch) { - console.log(">> Fetching deployment details...\n"); - await deploy.watch(); - } + // // save store + // await deploy.saveStore(); + + // if (isWatch) { + // console.log(">> Fetching deployment details...\n"); + // await deploy.watch(); + // } }; diff --git a/packages/bolt/src/actions/route-generate.ts b/packages/bolt/src/actions/route-generate.ts index 42e8181..f90cb0f 100644 --- a/packages/bolt/src/actions/route-generate.ts +++ b/packages/bolt/src/actions/route-generate.ts @@ -14,6 +14,9 @@ export default class RouteGenerate { console.log(`>> Creating Ingress...`); await generateRoutes(_yamlContent, isProd); - process.exit(0); + + { + !isProd && process.exit(0); + } } } diff --git a/packages/bolt/src/commands/13-deploy.ts b/packages/bolt/src/commands/13-deploy.ts index 57f8c57..1b1fd10 100644 --- a/packages/bolt/src/commands/13-deploy.ts +++ b/packages/bolt/src/commands/13-deploy.ts @@ -11,8 +11,6 @@ export default async (program: any) => { ) .description("Prepares the compressed project & initiates the deployment") .action((options: any) => { - console.log(chalk.green(">> Coming Soon...")); - process.exit(); // deploy(options, true); }); }; diff --git a/packages/bolt/src/config/index.ts b/packages/bolt/src/config/index.ts index 911fef3..f3ed477 100644 --- a/packages/bolt/src/config/index.ts +++ b/packages/bolt/src/config/index.ts @@ -1,9 +1,11 @@ /** * SEAL server details */ -export const SEAL_DOMAIN: string = 'https://api.gluestack.io'; +// export const SEAL_DOMAIN: string = "https://api.gluestack.io"; /** * SEAL GQL service details */ -export const SEAL_GQL: string = 'https://api.gluestack.io/backend/graphql'; +// export const SEAL_GQL: string = "https://api.gluestack.io/backend/graphql"; + +export const BOX_SERVER_URL: string = "http://localhost:8000/api"; diff --git a/packages/bolt/src/helpers/deploy/apis/api-request.ts b/packages/bolt/src/helpers/deploy/apis/api-request.ts new file mode 100644 index 0000000..39bd6c7 --- /dev/null +++ b/packages/bolt/src/helpers/deploy/apis/api-request.ts @@ -0,0 +1,45 @@ +import { getStoreData } from "../../get-store-data"; +import axios from "axios"; +import { BOX_SERVER_URL } from "../../../config"; + +export const apiRequest = async ({ + data, + method, + route, + params, + headers, +}: { + data: any; + method: "GET" | "POST" | "PUT" | "DELETE"; + route: string; + params?: any; + headers?: any; +}) => { + const accessKey: string = await getStoreData("access_key"); + const secretKey: string = await getStoreData("secret_key"); + + const requestHeaders = { + ["Access-Key"]: accessKey, + ["Secret-Key"]: secretKey, + ...headers, + }; + + params = params ? getParamString(params) : ""; + + const config: any = { + method: method, + url: `${BOX_SERVER_URL}/deployment${route}${params}`, + headers: requestHeaders, + data: data, + }; + + return await axios.request(config); +}; + +const getParamString = (params: any) => { + let paramString = "?"; + for (const [key, value] of Object.entries(params)) { + paramString += `${key}=${value}&`; + } + return paramString; +}; diff --git a/packages/bolt/src/helpers/deploy/apis/client.ts b/packages/bolt/src/helpers/deploy/apis/client.ts index f5692f8..6b5a102 100644 --- a/packages/bolt/src/helpers/deploy/apis/client.ts +++ b/packages/bolt/src/helpers/deploy/apis/client.ts @@ -1,7 +1,6 @@ -import { GraphQLClient } from 'graphql-request'; -import { SEAL_GQL } from '../../../config'; +import { GraphQLClient } from "graphql-request"; +import { BOX_SERVER_URL } from "../../../config"; -export const clientGQL = new GraphQLClient(SEAL_GQL); +export const clientGQL = new GraphQLClient(BOX_SERVER_URL); - -export { request, gql } from 'graphql-request'; +export { request, gql } from "graphql-request"; diff --git a/packages/bolt/src/helpers/deploy/deploy/auth.ts b/packages/bolt/src/helpers/deploy/deploy/auth.ts deleted file mode 100644 index 122d3ee..0000000 --- a/packages/bolt/src/helpers/deploy/deploy/auth.ts +++ /dev/null @@ -1,57 +0,0 @@ -const inquirer = require("inquirer"); -import { SEAL_DOMAIN } from "../../../config"; -import { Glue } from "@gluestack/glue-server-sdk-js"; -import Store from "../../../libraries/store"; - -export const auth = async (doAuth: boolean, store: Store) => { - const creds = { - email: store.get("email"), - password: store.get("password"), - }; - - // prompts to collect credentials from users - if (doAuth || !creds.email || !creds.password) { - const results = await inquirer.prompt([ - { - name: "email", - message: "Please enter your email", - type: "input", - }, - { - name: "password", - message: "Please enter your password", - type: "password", - }, - ]); - - creds.email = results.email; - creds.password = results.password; - - // store credentials in the store - store.set("email", results.email); - store.set("password", results.password); - } - - const glue = new Glue(SEAL_DOMAIN); - const response = await glue.auth.login({ ...creds, role: "owner" }); - if (!response || !response.id) { - console.log(`>> Authentication failed. Message: ${response}`); - process.exit(-1); - } - if (!response.is_verified) { - console.log(`>> Authentication failed. Message: Account is not verified`); - process.exit(-1); - } - if (response.status === "on_waitlist") { - console.log(`>> Authentication failed. User is on waitlist`); - process.exit(-1); - } - - // store user data in the store - store.set("team", response.team); - delete response.team; - store.set("user", response); - - // save store - store.save(); -}; diff --git a/packages/bolt/src/helpers/deploy/deploy/index.ts b/packages/bolt/src/helpers/deploy/deploy/index.ts deleted file mode 100644 index 545d7ca..0000000 --- a/packages/bolt/src/helpers/deploy/deploy/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './auth'; -export * from './upload'; -export * from './zip'; -export * from './watch'; diff --git a/packages/bolt/src/helpers/deploy/deploy/upload.ts b/packages/bolt/src/helpers/deploy/deploy/upload.ts deleted file mode 100644 index c469435..0000000 --- a/packages/bolt/src/helpers/deploy/deploy/upload.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { createReadStream, unlinkSync } from "fs"; -import Store from "../../../libraries/store"; -import { SEAL_DOMAIN } from "../../../config"; -import { projects } from "../apis/handlers/gql"; -import { Glue } from "@gluestack/glue-server-sdk-js"; -import { createDeployment } from "../apis/handlers/gql/create-deployment"; - -const inquirer = require("inquirer"); - -export const upload = async (filepath: string, store: Store) => { - let projectHash = store.get("project_hash"); - - // prompts to collect Project ID from user - if (!projectHash || projectHash === "new") { - const team = store.get("team"); - let tmp: any; - try { - tmp = await projects(team.id, team.token); - } catch (err) { - console.log(err); - - console.log("> Error fetching projects... Please try again later."); - process.exit(-1); - } - - // transform key-value pairs - const choices: any = [{ name: "Create a new Project", value: "new" }]; - choices.push( - ...tmp.projects.map((project: any) => { - return { name: project.name, value: project.project_hash }; - }) - ); - - // prompt to collect right project from user - const results = await inquirer.prompt([ - { - name: "projectHash", - message: "Please choose an existing project or create one", - type: "list", - choices: choices, - }, - ]); - - if (!results || !results.projectHash) { - console.error("> Error collecting project id"); - process.exit(-1); - } - - // store project id in the store - projectHash = results.projectHash; - store.set("project_hash", results.projectHash); - } - - // upload the project zip file to minio - const glue = new Glue(SEAL_DOMAIN); - try { - const response = await glue.storage.upload(createReadStream(filepath)); - - if (response && !response.id) { - console.error("Error uploading the project zip file to minio"); - process.exit(1); - } - - store.set("file_id", response.id); - console.log("> File uploaded successfully..."); - } catch (error: any) { - console.log( - "> Uploading failed due to following reason:", - error.message || error - ); - console.log(error); - process.exit(-1); - } - - // submits the deployment - console.log("> Submitting the deployment now..."); - try { - const user = store.get("user"); - const team = store.get("team"); - const fileID = store.get("file_id"); - const projectHash = store.get("project_hash"); - const projectName: string = process.cwd().split("/")[ - process.cwd().split("/").length - 1 - ]; - - const response: any = await createDeployment( - projectName, - projectHash === "new" ? "" : projectHash, - team.id, - user.access_token, - fileID - ); - - if ( - response && - response.createdbdeployment && - response.createdbdeployment.data - ) { - const { deployment_id, project_hash } = response.createdbdeployment.data; - - // store the deployment id in the store - store.set("deployment_id", deployment_id); - store.set("project_hash", project_hash); - } - console.log("> Deployment submitted successfully..."); - } catch (error: any) { - console.log( - "> Failed to create deployment:", - error.response.errors || error - ); - } - - // unlinkSync(filepath); -}; diff --git a/packages/bolt/src/helpers/deploy/deployment/auth.ts b/packages/bolt/src/helpers/deploy/deployment/auth.ts new file mode 100644 index 0000000..2c751de --- /dev/null +++ b/packages/bolt/src/helpers/deploy/deployment/auth.ts @@ -0,0 +1,74 @@ +const inquirer = require("inquirer"); +import axios from "axios"; +import { BOX_SERVER_URL } from "../../../config"; +import Store from "../../../libraries/store"; +import { exitWithMsg } from "../../exit-with-msg"; + +export const auth = async (doAuth: boolean, store: Store) => { + try { + const creds = { + access_key: store.get("access_key"), + secret_key: store.get("secret_key"), + }; + + // prompts to collect credentials from users + if (doAuth || !creds.access_key || !creds.secret_key) { + const results = await inquirer.prompt([ + { + name: "access_key", + message: "Please enter your access key", + type: "input", + }, + { + name: "secret_key", + message: "Please enter your secret key", + type: "input", + }, + ]); + + creds.access_key = results.access_key; + creds.secret_key = results.secret_key; + + // store credentials in the store + store.set("access_key", results.access_key); + store.set("secret_key", results.secret_key); + } + + // authenticate user + const { data } = await axios.request({ + method: "POST", + url: `${BOX_SERVER_URL}/deployment/login`, + data: JSON.stringify(creds), + headers: { + "Content-Type": "application/json", + }, + }); + + if (!data.success) { + await exitWithMsg("Error authenticating user"); + } + + // check if user is blocker + if (data.data?.user?.is_blocked) { + await exitWithMsg("User is blocked"); + } + + const userData = data.data?.user; + const projects = data.data?.user?.projects; + // Delete projects from userData object without updating data.data.user.projects + delete userData.projects; + + // remove projects from the userData object + + // store user details in the store + store.set("user", userData || ""); + store.save(); + + return { + user: userData, + projects: projects, + }; + } catch (error: any) { + await exitWithMsg("Error authenticating user"); + } +}; diff --git a/packages/bolt/src/helpers/deploy/deployment/deploy.ts b/packages/bolt/src/helpers/deploy/deployment/deploy.ts new file mode 100644 index 0000000..e2d8187 --- /dev/null +++ b/packages/bolt/src/helpers/deploy/deployment/deploy.ts @@ -0,0 +1,36 @@ +import { exitWithMsg } from "../../exit-with-msg"; +import { apiRequest } from "../apis/api-request"; + +export const deploy = async ({ + fileId, + projectId, + userId, +}: { + fileId: number; + projectId: number; + userId: number; +}) => { + // submits the deployment + try { + const { data } = await apiRequest({ + method: "POST", + data: { + file_id: fileId, + project_id: projectId, + user_id: userId, + }, + route: "/deploy", + headers: { + "Content-Type": "application/json", + }, + }); + if (!data || !data.success || !data.data.id) { + exitWithMsg("> Failed to create deployment:", data); + } + + return data.data; + } catch (error: any) { + console.log("Error", error); + await exitWithMsg("Error creating deployment!"); + } +}; diff --git a/packages/bolt/src/helpers/deploy/deployment/index.ts b/packages/bolt/src/helpers/deploy/deployment/index.ts new file mode 100644 index 0000000..37e7e29 --- /dev/null +++ b/packages/bolt/src/helpers/deploy/deployment/index.ts @@ -0,0 +1,6 @@ +export * from "./auth"; +export * from "./upload"; +export * from "./zip"; +export * from "./watch"; +export * from "./setProject"; +export * from "./deploy"; diff --git a/packages/bolt/src/helpers/deploy/deployment/setProject.ts b/packages/bolt/src/helpers/deploy/deployment/setProject.ts new file mode 100644 index 0000000..3525bdc --- /dev/null +++ b/packages/bolt/src/helpers/deploy/deployment/setProject.ts @@ -0,0 +1,87 @@ +import { exitWithMsg } from "../../exit-with-msg"; +import { getStoreData } from "../../get-store-data"; +import { apiRequest } from "../apis/api-request"; + +const inquirer = require("inquirer"); + +export const setProject = async (projects: any[]) => { + try { + const choices: any = [{ name: "Create a new Project", value: "create" }]; + if (projects.length) { + choices.push({ name: "Select a project", value: "select" }); + } + + const user = await getStoreData("user"); + + if (!user.id) { + await exitWithMsg("Error setting action for project Creation!"); + } + + const result = await inquirer.prompt([ + { + type: "list", + name: "action", + message: "Please choose an existing project or create one", + choices: choices, + }, + ]); + + if (!result || !result.action) { + await exitWithMsg("Error setting action for project Creation!"); + return; + } + switch (result.action) { + case "create": + const createPrompt = await inquirer.prompt([ + { + type: "input", + name: "name", + message: "Please enter a name for the project", + }, + ]); + + const body = { + project_name: createPrompt.name, + created_by: user.id, + }; + + const { data } = await apiRequest({ + method: "POST", + data: body, + route: "/projects", + headers: { + "Content-Type": "application/json", + }, + }); + + if (!data || !data.success || !data.data.project) { + console.log({ data }); + await exitWithMsg("Error creating project!"); + } + const project = data.data.project; + delete project.user; + return project; + break; + case "select": + const choices = projects.map((project: any) => { + return { name: project.name, value: project }; + }); + const selectPrompt = await inquirer.prompt([ + { + type: "list", + name: "selectedProject", + message: "Please choose an existing project or create one", + choices: choices, + }, + ]); + return selectPrompt.selectedProject; + break; + default: + await exitWithMsg("Error setting action for project Creation!"); + } + return result; + } catch (error: any) { + console.log({ error: error.response.data || "nothing" }); + await exitWithMsg("Error While Project Selection!"); + } +}; diff --git a/packages/bolt/src/helpers/deploy/deployment/upload.ts b/packages/bolt/src/helpers/deploy/deployment/upload.ts new file mode 100644 index 0000000..c5629eb --- /dev/null +++ b/packages/bolt/src/helpers/deploy/deployment/upload.ts @@ -0,0 +1,41 @@ +import { createReadStream, unlinkSync } from "fs"; +import Store from "../../../libraries/store"; +import { createDeployment } from "../apis/handlers/gql/create-deployment"; +import axios from "axios"; +import { BOX_SERVER_URL } from "../../../config"; +const inquirer = require("inquirer"); +import FormData from "form-data"; +import { apiRequest } from "../apis/api-request"; + +export const upload = async (filepath: string, store: Store) => { + // upload the project zip file to minio + try { + const form = new FormData(); + form.append("file", createReadStream(filepath)); + + const { data } = await apiRequest({ + method: "POST", + route: "/upload", + data: form, + headers: { + ...form.getHeaders(), + }, + }); + + if (!data.success || !data.data || !data.data.id) { + console.error("Error uploading the project zip file to minio"); + process.exit(1); + } + + const fileId = data.data.id; + unlinkSync(filepath); + return fileId; + } catch (error: any) { + console.log( + "> Uploading failed due to following reason:", + error.message || error + ); + console.log(error); + process.exit(-1); + } +}; diff --git a/packages/bolt/src/helpers/deploy/deploy/watch.ts b/packages/bolt/src/helpers/deploy/deployment/watch.ts similarity index 100% rename from packages/bolt/src/helpers/deploy/deploy/watch.ts rename to packages/bolt/src/helpers/deploy/deployment/watch.ts diff --git a/packages/bolt/src/helpers/deploy/deploy/zip.ts b/packages/bolt/src/helpers/deploy/deployment/zip.ts similarity index 55% rename from packages/bolt/src/helpers/deploy/deploy/zip.ts rename to packages/bolt/src/helpers/deploy/deployment/zip.ts index 4a22f87..b340b4d 100644 --- a/packages/bolt/src/helpers/deploy/deploy/zip.ts +++ b/packages/bolt/src/helpers/deploy/deployment/zip.ts @@ -1,16 +1,16 @@ -import { join } from 'path'; -import archiver from 'archiver'; -import { createWriteStream, mkdirSync } from 'fs'; -import { formatBytes } from '../format-bytes'; -import { fileExists } from '../file-exists'; +import { basename, join } from "path"; +import archiver from "archiver"; +import { createWriteStream, mkdirSync } from "fs"; +import { formatBytes } from "../format-bytes"; +import { fileExists } from "../file-exists"; import * as readline from "readline"; export const zip = async (project_path: string) => { - const filename = 'output.zip'; - const directory = join(project_path, '.deploy'); + const filename = `${basename(process.cwd())}.zip`; + const directory = join(project_path, ".deploy"); const zipPath = join(directory, filename); - if (!await fileExists(directory)) { + if (!(await fileExists(directory))) { mkdirSync(directory, { recursive: true }); } @@ -18,30 +18,36 @@ export const zip = async (project_path: string) => { // create a file to stream archive data to. const output = createWriteStream(zipPath); - const archive = archiver('zip', { - zlib: { level: 9 } // Sets the compression level. + const archive = archiver("zip", { + zlib: { level: 9 }, // Sets the compression level. }); // listen for all archive data to be written // 'close' event is fired only when a file descriptor is involved - output.on('close', () => { + output.on("close", () => { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); - process.stdout.write(`> Compressed ${formatBytes(archive.pointer())} into "${filename}"!`); + process.stdout.write( + `>> Compressed ${formatBytes(archive.pointer())} into "${filename}"!` + ); console.log(); resolve(zipPath); }); - archive.on('progress', (progress) => { + archive.on("progress", (progress) => { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); - process.stdout.write(`> In progress: processed ${progress.entries.processed} files & ${formatBytes(progress.fs.processedBytes)} of data`); + process.stdout.write( + `>> In progress: processed ${ + progress.entries.processed + } files & ${formatBytes(progress.fs.processedBytes)} of data` + ); }); // good practice to catch warnings (ie stat failures and other non-blocking errors) - archive.on('warning', (err) => { - console.log('> Warning:', err); - if (err.code === 'ENOENT') { + archive.on("warning", (err) => { + console.log("> Warning:", err); + if (err.code === "ENOENT") { // log warning } else { // throw error @@ -52,12 +58,12 @@ export const zip = async (project_path: string) => { // This event is fired when the data source is drained no matter what was the data source. // It is not part of this library but rather from the NodeJS Stream API. // @see: https://nodejs.org/api/stream.html#stream_event_end - output.on('end', () => { - console.log('Data has been drained'); + output.on("end", () => { + console.log("Data has been drained"); }); // good practice to catch this error explicitly - archive.on('error', (err: any) => { + archive.on("error", (err: any) => { reject(err); }); @@ -65,20 +71,20 @@ export const zip = async (project_path: string) => { archive.pipe(output); // append files from a glob pattern - archive.glob('**', { + archive.glob("**", { ignore: [ - '**/storage/**/data/**', - '**/databases/**/db/**', - 'node_modules/*', - '**/node_modules/**', - '**/.DS_Store', - '.git/**', - '**/*.zip', - '.deploy', - '**/.next/**', + "**/storage/**/data/**", + "**/databases/**/db/**", + "node_modules/*", + "**/node_modules/**", + "**/.DS_Store", + ".git/**", + "**/*.zip", + ".deploy", + "**/.next/**", ], cwd: project_path, - dot: true + dot: true, }); // finalize the archive (ie we are done appending files but streams have to finish yet) diff --git a/packages/bolt/test.js b/packages/bolt/test.js new file mode 100644 index 0000000..75aa10a --- /dev/null +++ b/packages/bolt/test.js @@ -0,0 +1,25 @@ +const axios = require("axios"); +let data = JSON.stringify({ + access_key: "f825b35e5d0f70d5b4b0e0f3ea35daadf9903d1f", + secret_key: + "c966f789b57625b10decabd811b525cc11735bc9a4d2f706b4c10693f0314257", +}); + +let config = { + method: "post", + maxBodyLength: Infinity, + url: "http://localhost:8000/api/deployment/login", + headers: { + "Content-Type": "application/json", + }, + data: data, +}; + +axios + .request(config) + .then((response) => { + console.log(JSON.stringify(response.data)); + }) + .catch((error) => { + console.log(error); + }); From e055b242032fbdfcd3bc1ceae0901a226f7f1d16 Mon Sep 17 00:00:00 2001 From: Tanmay Jaiswal Date: Tue, 30 Jan 2024 12:01:46 +0530 Subject: [PATCH 7/7] chore: fixed route:generate --- packages/bolt/src/actions/route-generate.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/bolt/src/actions/route-generate.ts b/packages/bolt/src/actions/route-generate.ts index f90cb0f..42e8181 100644 --- a/packages/bolt/src/actions/route-generate.ts +++ b/packages/bolt/src/actions/route-generate.ts @@ -14,9 +14,6 @@ export default class RouteGenerate { console.log(`>> Creating Ingress...`); await generateRoutes(_yamlContent, isProd); - - { - !isProd && process.exit(0); - } + process.exit(0); } }