cmp-lite 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env ADDED
@@ -0,0 +1,7 @@
1
+ NODE_ENV=dev
2
+ DB=mongodb://localhost:27017/AUTH_DB
3
+ PORT=5000
4
+ LAST_PORT = 5000
5
+ CLIENT_URL=http://localhost:3000
6
+ CLIENT_DOMAIN=localhost
7
+ SERVER_URL=http://localhost:5000
package/Dockerfile ADDED
@@ -0,0 +1,13 @@
1
+ FROM node:22-alpine
2
+
3
+ WORKDIR /app
4
+
5
+ COPY package*.json ./
6
+
7
+ COPY . .
8
+
9
+ RUN npm run build
10
+
11
+ EXPOSE 5000
12
+
13
+ CMD ["node", "dist/app.ts"]
package/dist/app.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/app.js ADDED
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const dotenv_1 = __importDefault(require("dotenv"));
41
+ dotenv_1.default.config();
42
+ const inquirer_1 = __importDefault(require("inquirer"));
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const fs_1 = __importDefault(require("fs"));
45
+ const path_1 = __importDefault(require("path"));
46
+ const boilerPlate_1 = require("./util/boilerPlate");
47
+ const util_1 = require("util");
48
+ const child_process_1 = require("child_process");
49
+ const log = console.log;
50
+ const Exec = (0, util_1.promisify)(child_process_1.exec);
51
+ //validation service
52
+ const validateService = (service) => {
53
+ if (!service || service.length === 0)
54
+ throw new Error("Service name is requird");
55
+ const regex = /^[a-zA-Z0-9-]+$/;
56
+ const isValid = regex.test(service);
57
+ if (!isValid)
58
+ throw new Error("Space or any symbol not allowed in service name you can use -");
59
+ return service.toLowerCase();
60
+ };
61
+ //exit app ya close app
62
+ const exitApp = (msg = null) => {
63
+ const message = chalk_1.default.bgGreenBright.black.bold(msg || "👋 Good Bye !");
64
+ log(message);
65
+ process.exit(0);
66
+ };
67
+ //makeFolder fuction
68
+ const makeFolder = (path) => {
69
+ const isExist = fs_1.default.existsSync(path);
70
+ if (isExist)
71
+ throw new Error(`${path.split("\\").pop()} service already exists !`);
72
+ fs_1.default.mkdirSync(path);
73
+ };
74
+ const copyFiles = (files, inputPath, outputPath) => {
75
+ files.forEach((file) => {
76
+ fs_1.default.copyFileSync(path_1.default.join(`${inputPath}`, file), path_1.default.join(`${outputPath}`, file));
77
+ });
78
+ };
79
+ const getBoilerPlate = (service, file) => {
80
+ if (file === ".controller.ts")
81
+ return (0, boilerPlate_1.ControllerBoilerplate)(service);
82
+ if (file === ".router.ts")
83
+ return (0, boilerPlate_1.routerBoilerplate)(service);
84
+ if (file === ".interface.ts")
85
+ return (0, boilerPlate_1.interfaceBoilerplate)(service);
86
+ if (file === ".model.ts")
87
+ return (0, boilerPlate_1.modelBoilerplate)(service);
88
+ return "";
89
+ };
90
+ const createFiles = (files, service, srcPath) => {
91
+ files.forEach((file) => {
92
+ const filename = `${service}${file}`;
93
+ const filepath = path_1.default.join(srcPath, filename);
94
+ fs_1.default.writeFileSync(filepath, getBoilerPlate(service, file));
95
+ });
96
+ };
97
+ const updateLastPort = (pipelinePath, newPort) => {
98
+ const envFilePath = path_1.default.join(pipelinePath, ".env");
99
+ const envData = fs_1.default.readFileSync(envFilePath, "utf-8");
100
+ const updatedPortString = envData.replace(/LAST_PORT\s*=\s*\d+/, `LAST_PORT = ${newPort}`);
101
+ fs_1.default.writeFileSync(envFilePath, updatedPortString);
102
+ };
103
+ const createEnvForNewService = (pipelinePath, servicePath, newPort) => {
104
+ const pipelineEnvPath = path_1.default.join(pipelinePath, ".env");
105
+ const newEnvPath = path_1.default.join(servicePath, ".env");
106
+ const envData = fs_1.default.readFileSync(pipelineEnvPath, "utf-8");
107
+ const stringChangedAfterPort = envData.replace(/PORT\s*=\s*\d+/, `PORT = ${newPort}`);
108
+ const arr = stringChangedAfterPort.split("\n");
109
+ const modifiedData = arr.map((item) => {
110
+ if (item.startsWith("LAST_PORT"))
111
+ return null;
112
+ if (item.startsWith("SERVER"))
113
+ return `SERVER = http://localhost:${newPort}\r`;
114
+ return item;
115
+ }).filter(Boolean);
116
+ const finalData = modifiedData.join("\n");
117
+ fs_1.default.writeFileSync(newEnvPath, finalData);
118
+ };
119
+ const createPackageForNewService = (service, servicePath) => {
120
+ const data = (0, boilerPlate_1.pakageBoilerPlate)(service);
121
+ const newPakagepath = path_1.default.join(servicePath, 'package.json');
122
+ fs_1.default.writeFileSync(newPakagepath, data);
123
+ };
124
+ const createDockerFileForNewService = (pipelinePath, servicePath, newPort) => {
125
+ const pipelineDockerFilePath = path_1.default.join(pipelinePath, "Dockerfile");
126
+ const newDockerFilePath = path_1.default.join(servicePath, "Dockerfile");
127
+ const dockerFileData = fs_1.default.readFileSync(pipelineDockerFilePath, "utf-8");
128
+ const replacedWithDocker = dockerFileData.replace(/EXPOSE\s*\d+/, `EXPOSE ${newPort}`);
129
+ fs_1.default.writeFileSync(newDockerFilePath, replacedWithDocker);
130
+ };
131
+ const getNewPort = (pipelinePath) => {
132
+ const envPath = path_1.default.join(pipelinePath, ".env");
133
+ const envData = fs_1.default.readFileSync(envPath, 'utf-8');
134
+ const arr = envData.split("\n");
135
+ const lastPortLine = arr.find((line) => {
136
+ return line.trimStart().startsWith("LAST_PORT");
137
+ });
138
+ const regExpForPortValue = /LAST_PORT\s*=\s*(\d+)/;
139
+ const lastPort = parseInt(lastPortLine?.match(regExpForPortValue)?.[1]);
140
+ return lastPort + 1;
141
+ };
142
+ const addGateway = (gatewayPath, serviceName, newPort) => {
143
+ const data = (0, boilerPlate_1.gatewayBoilerplate)(serviceName, newPort);
144
+ const input = path_1.default.join(gatewayPath, "src", "app.ts");
145
+ fs_1.default.appendFileSync(input, data);
146
+ };
147
+ const addServer = async (gatewayPath, serviceName) => {
148
+ const main = path_1.default.resolve(gatewayPath, "../../");
149
+ const inputPath = path_1.default.join(main, 'src', 'servers.json');
150
+ const { default: servers } = await Promise.resolve(`${inputPath}`).then(s => __importStar(require(s)));
151
+ servers.push(serviceName);
152
+ fs_1.default.writeFileSync(inputPath, JSON.stringify(servers, null, 2));
153
+ };
154
+ const app = async () => {
155
+ try {
156
+ const welcomeMessage = chalk_1.default.bgMagentaBright.white.bold("---💥 Welcome team ! 💥---\n");
157
+ log(welcomeMessage);
158
+ //user input
159
+ const { service } = await inquirer_1.default.prompt({
160
+ type: 'input',
161
+ name: 'service',
162
+ message: chalk_1.default.yellow('Enter service name || To exit app write :q\n')
163
+ });
164
+ // close service
165
+ if (service === ":q")
166
+ exitApp();
167
+ //validate Folder
168
+ if (service === "pipeline")
169
+ exitApp("Pipeline name not allowed");
170
+ const serviceName = validateService(service);
171
+ //make molder
172
+ const currentDir = process.cwd();
173
+ const appPath = __dirname;
174
+ const rootPath = currentDir;
175
+ const pipelinePath = path_1.default.resolve(appPath, "../");
176
+ const gatewayPath = path_1.default.join(path_1.default.resolve(currentDir, "../"), "gateway");
177
+ const servicePath = path_1.default.join(rootPath, serviceName);
178
+ const srcPath = path_1.default.join(servicePath, "src");
179
+ const appFilePath = path_1.default.join(srcPath, "app.ts");
180
+ const filesListForCopy = [
181
+ "tsconfig.json",
182
+ ];
183
+ const filesListForCreate = [
184
+ ".controller.ts",
185
+ ".service.ts",
186
+ ".model.ts",
187
+ ".interface.ts",
188
+ ".enum.ts",
189
+ ".middleware.ts",
190
+ ".dto.ts",
191
+ ".router.ts"
192
+ ];
193
+ //service folder
194
+ makeFolder(servicePath);
195
+ //Src folder inside Service
196
+ makeFolder(srcPath);
197
+ //Createing app.ts
198
+ const newPort = getNewPort(pipelinePath);
199
+ fs_1.default.writeFileSync(appFilePath, (0, boilerPlate_1.appBoilerplate)(serviceName, newPort), "utf-8");
200
+ // Change last port in pipeline
201
+ updateLastPort(pipelinePath, newPort);
202
+ createEnvForNewService(pipelinePath, servicePath, newPort);
203
+ createDockerFileForNewService(pipelinePath, servicePath, newPort);
204
+ createPackageForNewService(serviceName, servicePath);
205
+ //copy files from pipeline to service
206
+ copyFiles(filesListForCopy, pipelinePath, servicePath);
207
+ // Creating required files for start coding
208
+ createFiles(filesListForCreate, serviceName, srcPath);
209
+ //Adding gateway
210
+ addGateway(gatewayPath, serviceName, newPort);
211
+ //Adding Server
212
+ await addServer(gatewayPath, serviceName);
213
+ log(chalk_1.default.bgGreen.black.bold(" 🚀 Installing dependencies... Please wait ⏳ "));
214
+ await Exec("npm install", { cwd: servicePath });
215
+ log(chalk_1.default.bgYellow.black.bold(`Success - ${serviceName} created successfully ! \n`));
216
+ log(chalk_1.default.green.bold(`🚀Browse service folder and write npm run dev`));
217
+ exitApp();
218
+ }
219
+ catch (err) {
220
+ if (err instanceof Error) {
221
+ log(chalk_1.default.bgRed.white.bold(` 🛑 Error - ${err.message} \n`));
222
+ }
223
+ app();
224
+ }
225
+ };
226
+ app();
@@ -0,0 +1,7 @@
1
+ export declare const appBoilerplate: (service: string, port: number) => string;
2
+ export declare const ControllerBoilerplate: (service: string) => string;
3
+ export declare const routerBoilerplate: (service: string) => string;
4
+ export declare const interfaceBoilerplate: (service: string) => string;
5
+ export declare const modelBoilerplate: (service: string) => string;
6
+ export declare const gatewayBoilerplate: (service: string, port: number) => string;
7
+ export declare const pakageBoilerPlate: (service: string) => string;
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pakageBoilerPlate = exports.gatewayBoilerplate = exports.modelBoilerplate = exports.interfaceBoilerplate = exports.routerBoilerplate = exports.ControllerBoilerplate = exports.appBoilerplate = void 0;
4
+ const getServiceInPascalCase = (service) => {
5
+ const arr = service.split("-");
6
+ const tmp = arr.map((item) => {
7
+ const firstLetter = item[0].toUpperCase();
8
+ const restLetter = item.slice(1);
9
+ return firstLetter + restLetter;
10
+ });
11
+ return tmp.join("");
12
+ };
13
+ const appBoilerplate = (service, port) => {
14
+ return [
15
+ `import dotenv from "dotenv"`,
16
+ `dotenv.config()\n`,
17
+ `import mongoose from "mongoose"`,
18
+ `mongoose.connect(process.env.DB!)`,
19
+ `.then(()=>console.log("${service} - Database is running"))`,
20
+ `.catch(()=>console.log("${service} - Failed to connect with database"))\n`,
21
+ `import express from "express"`,
22
+ `import ${getServiceInPascalCase(service)}Router from "./${service}.router"`,
23
+ `import morgan from "morgan"`,
24
+ `import cors from "cors"`,
25
+ `const app = express()`,
26
+ `app.listen(process.env.PORT, ()=>console.log("${service} service is running on - http://localhost:${port}/${service}"))\n`,
27
+ `app.use(cors({`,
28
+ `\torigin: process.env.CLIENT,`,
29
+ `\tcredentials: true`,
30
+ `}))`,
31
+ `app.use(express.json())`,
32
+ `app.use(express.urlencoded({extended: false}))\n`,
33
+ `app.use("/${service}", ${getServiceInPascalCase(service)}Router)`
34
+ ].join("\n");
35
+ };
36
+ exports.appBoilerplate = appBoilerplate;
37
+ const ControllerBoilerplate = (service) => {
38
+ return [
39
+ `import { Request, Response } from "express"\n`,
40
+ `export const ${getServiceInPascalCase(service)}Controller = async (req: Request, res: Response) => {
41
+ try {
42
+ res.json("Hello welcome to ${service}")
43
+
44
+ } catch (err) {
45
+
46
+ }
47
+ }`
48
+ ].join("\n");
49
+ };
50
+ exports.ControllerBoilerplate = ControllerBoilerplate;
51
+ const routerBoilerplate = (service) => {
52
+ return [
53
+ `import {Router} from "express"`,
54
+ `import { ${getServiceInPascalCase(service)}Controller } from "./${service}.controller"\n`,
55
+ `const ${getServiceInPascalCase(service)}Router = Router()\n`,
56
+ `${getServiceInPascalCase(service)}Router.get("/", ${getServiceInPascalCase(service)}Controller)`,
57
+ `export default ${getServiceInPascalCase(service)}Router`
58
+ ].join("\n");
59
+ };
60
+ exports.routerBoilerplate = routerBoilerplate;
61
+ const interfaceBoilerplate = (service) => {
62
+ const Provider = getServiceInPascalCase(service);
63
+ return [
64
+ `import { Document } from "mongoose"\n`,
65
+ `export interface ${Provider}ModelInterface extends Document {\n`,
66
+ `\t`,
67
+ `}`
68
+ ].join("\n");
69
+ };
70
+ exports.interfaceBoilerplate = interfaceBoilerplate;
71
+ const modelBoilerplate = (service) => {
72
+ const Provider = getServiceInPascalCase(service);
73
+ return [
74
+ `import { Schema, model } from "mongoose"`,
75
+ `import { ${Provider}ModelInterface } from "./${service}.interface"\n`,
76
+ `const schema = new Schema<${Provider}ModelInterface>({\n`,
77
+ `\t`,
78
+ `}, {timestamps: true})\n`,
79
+ `const ${Provider}Model = model<${Provider}ModelInterface>("${Provider}", schema)`,
80
+ `export default ${Provider}Model`
81
+ ].join("\n");
82
+ };
83
+ exports.modelBoilerplate = modelBoilerplate;
84
+ const gatewayBoilerplate = (service, port) => {
85
+ return [
86
+ `\n\napp.use('/auth', createProxyMiddleware({`,
87
+ `\ttarget: 'http://localhost:${port}/${service}',`,
88
+ `\tchangeOrigin: true`,
89
+ `}))`
90
+ ].join("\n");
91
+ };
92
+ exports.gatewayBoilerplate = gatewayBoilerplate;
93
+ const pakageBoilerPlate = (service) => {
94
+ const data = {
95
+ "name": service,
96
+ "version": "1.0.0",
97
+ "description": "",
98
+ "main": "index.js",
99
+ "scripts": {
100
+ "dev": "ts-node-dev --respawn --transpile-only src/app.ts",
101
+ "build": "tsc",
102
+ "start": "node dist/app.js"
103
+ },
104
+ "keywords": [],
105
+ "author": "",
106
+ "license": "ISC",
107
+ "dependencies": {
108
+ "cors": "^2.8.6",
109
+ "dotenv": "^17.2.3",
110
+ "express": "^5.2.1",
111
+ "mongoose": "^9.1.5",
112
+ "morgan": "^1.10.1"
113
+ },
114
+ "devDependencies": {
115
+ "@types/cors": "^2.8.19",
116
+ "@types/express": "^5.0.6",
117
+ "@types/morgan": "^1.9.10",
118
+ "@types/node": "^25.1.0",
119
+ "ts-node-dev": "^2.0.0",
120
+ "typescript": "^5.9.3"
121
+ }
122
+ };
123
+ return JSON.stringify(data, null, 2);
124
+ };
125
+ exports.pakageBoilerPlate = pakageBoilerPlate;
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "cmp-lite",
3
+ "version": "1.0.0",
4
+ "description": "",
5
+ "main": "dist/app.js",
6
+ "types": "dist/app.d.ts",
7
+ "bin": {
8
+ "cmp-lite": "dist/app.js"
9
+ },
10
+ "scripts": {
11
+ "dev": "ts-node-dev --transpile-only src/app.ts",
12
+ "build": "tsc",
13
+ "start": "node dist/app.js"
14
+ },
15
+ "keywords": [],
16
+ "author": "",
17
+ "license": "ISC",
18
+ "type": "commonjs",
19
+ "dependencies": {
20
+ "chalk": "^5.6.2",
21
+ "cors": "^2.8.6",
22
+ "dotenv": "^17.2.3",
23
+ "express": "^5.2.1",
24
+ "inquirer": "^13.2.2",
25
+ "mongoose": "^9.1.5",
26
+ "morgan": "^1.10.1"
27
+ },
28
+ "devDependencies": {
29
+ "@types/cors": "^2.8.19",
30
+ "@types/express": "^5.0.6",
31
+ "@types/morgan": "^1.9.10",
32
+ "@types/node": "^25.1.0",
33
+ "ts-node-dev": "^2.0.0",
34
+ "typescript": "^5.9.3"
35
+ }
36
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,16 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "commonjs",
5
+ "outDir": "./dist",
6
+ "rootDir": "./src",
7
+ "strict": true,
8
+ "declaration":true,
9
+ "esModuleInterop": true,
10
+ "moduleResolution": "node",
11
+ "forceConsistentCasingInFileNames": true,
12
+ "skipLibCheck": true
13
+ },
14
+ "include": ["src/**/*"],
15
+ "exclude": ["dist"]
16
+ }