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 +7 -0
- package/Dockerfile +13 -0
- package/dist/app.d.ts +2 -0
- package/dist/app.js +226 -0
- package/dist/util/boilerPlate.d.ts +7 -0
- package/dist/util/boilerPlate.js +125 -0
- package/package.json +36 -0
- package/tsconfig.json +16 -0
package/.env
ADDED
package/Dockerfile
ADDED
package/dist/app.d.ts
ADDED
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
|
+
}
|