arky-js
Version:
**Arky.js** is a powerful, annotation-based framework for building serverless applications on **AWS Lambda and API Gateway**. Inspired by Angular and NestJS, Arky.js simplifies serverless development by providing decorators for defining modules, controlle
104 lines (103 loc) • 5.01 kB
JavaScript
;
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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.build = build;
exports.deploy = deploy;
exports.destroy = destroy;
/* eslint-disable @typescript-eslint/no-explicit-any */
require("reflect-metadata");
const meta_object_parser_1 = require("./meta-object-parser");
const module_tree_walker_1 = require("./module-tree-walker");
const file_handler_1 = require("./file-handler");
const config_utils_1 = require("../../utils/config-utils");
const dependancy_tree_walker_1 = require("./dependancy-tree-walker");
const child_process_1 = require("child_process");
const platform_factory_1 = require("../../platform/platform-factory");
const platform_type_enum_1 = require("../../constants/enums/platform-type.enum");
function build() {
return __awaiter(this, void 0, void 0, function* () {
const outputDir = "arky.out";
const tempFolder = "temp";
const appConfig = (0, config_utils_1.loadConfig)();
const fileHandler = new file_handler_1.FileHandler();
fileHandler.cleaningDirectory(outputDir);
const treeWalker = new module_tree_walker_1.ModuleTreeWalker(appConfig);
const moduleDeclarations = treeWalker.loadModuleDeclarations();
if (!moduleDeclarations) {
return;
}
const controllerDeclarations = treeWalker.loadControllerDeclarations(moduleDeclarations);
const dependencyTreeWalker = new dependancy_tree_walker_1.DependencyTreeWalker();
const metaObjParser = new meta_object_parser_1.MetaObjectParser(dependencyTreeWalker);
const controllerMetas = metaObjParser.getControllerMetaObjects(controllerDeclarations);
fileHandler.createTempProjectWithoutDecorators(tempFolder);
yield compilePlateformSpecificCode(controllerMetas, (appConfig === null || appConfig === void 0 ? void 0 : appConfig.platform) || platform_type_enum_1.PlatformType.AWS, outputDir, tempFolder);
fileHandler.cleaningDirectory(tempFolder);
});
}
function compilePlateformSpecificCode(controllerMetas, platformType, outputDir, tempFolder) {
return __awaiter(this, void 0, void 0, function* () {
const plateformFactory = platform_factory_1.PlatformFactory.getInstance(platformType);
const generator = plateformFactory.getCodeGenerator();
controllerMetas.forEach((controller) => generator.generate(controller, outputDir, tempFolder));
const bundler = plateformFactory.getBundler();
yield Promise.all(controllerMetas.map((controller) => bundler.bundle(controller.fileName, outputDir)));
// delete typescript file
controllerMetas.forEach((controller) => {
generator.deleteTypescriptFile(controller, outputDir);
});
const iacGenerator = plateformFactory.getIacGenerator();
iacGenerator.generate(controllerMetas, outputDir);
});
}
function deploy() {
const result = (0, child_process_1.spawnSync)("cdk", ["deploy", "--all", "--require-approval", "never"], {
stdio: "inherit",
shell: true,
});
if (result.status !== 0) {
process.exit(result.status || 1);
}
}
function destroy() {
const result = (0, child_process_1.spawnSync)("cdk", ["destroy", "--all"], {
stdio: "inherit",
shell: true,
});
if (result.status !== 0) {
process.exit(result.status || 1);
}
}
/**
* This function compiles TypeScript files into JavaScript using the TypeScript compiler (tsc).
* It runs the `tsc` command in a child process and waits for it to complete.
* If the compilation is successful, it resolves the promise; otherwise, it rejects it.
*
* @returns {Promise<void>} A promise that resolves when the TypeScript compilation is complete.
*/
function compileTypescript() {
return new Promise((resolve, rejects) => {
// Run the `tsc` command
const result = (0, child_process_1.spawnSync)("npm", ["run", "build"], {
stdio: "inherit",
shell: true,
});
// Check the result
if (result.status === 0) {
console.log("✅ TypeScript build completed successfully!\n");
resolve();
}
else {
console.error("⚠️TypeScript build failed.\n");
process.exit(1); // Exit with an error code
}
});
}