express-project-builder 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/dist/bin/index.d.ts +3 -0
- package/dist/bin/index.d.ts.map +1 -0
- package/dist/bin/index.js +177 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/lib/config/createEnvExample.d.ts +3 -0
- package/dist/lib/config/createEnvExample.d.ts.map +1 -0
- package/dist/lib/config/createEnvExample.js +39 -0
- package/dist/lib/config/createEnvExample.js.map +1 -0
- package/dist/lib/config/createEslintConfig.d.ts +2 -0
- package/dist/lib/config/createEslintConfig.d.ts.map +1 -0
- package/dist/lib/config/createEslintConfig.js +48 -0
- package/dist/lib/config/createEslintConfig.js.map +1 -0
- package/dist/lib/config/createGitignore.d.ts +3 -0
- package/dist/lib/config/createGitignore.d.ts.map +1 -0
- package/dist/lib/config/createGitignore.js +51 -0
- package/dist/lib/config/createGitignore.js.map +1 -0
- package/dist/lib/config/createPackageJson.d.ts +3 -0
- package/dist/lib/config/createPackageJson.d.ts.map +1 -0
- package/dist/lib/config/createPackageJson.js +74 -0
- package/dist/lib/config/createPackageJson.js.map +1 -0
- package/dist/lib/config/createPrettierConfig.d.ts +2 -0
- package/dist/lib/config/createPrettierConfig.d.ts.map +1 -0
- package/dist/lib/config/createPrettierConfig.js +30 -0
- package/dist/lib/config/createPrettierConfig.js.map +1 -0
- package/dist/lib/config/createTsConfig.d.ts +2 -0
- package/dist/lib/config/createTsConfig.d.ts.map +1 -0
- package/dist/lib/config/createTsConfig.js +133 -0
- package/dist/lib/config/createTsConfig.js.map +1 -0
- package/dist/lib/prisma/create_Schema.Prisma.d.ts +3 -0
- package/dist/lib/prisma/create_Schema.Prisma.d.ts.map +1 -0
- package/dist/lib/prisma/create_Schema.Prisma.js +36 -0
- package/dist/lib/prisma/create_Schema.Prisma.js.map +1 -0
- package/dist/lib/src/builders/create_QueryBuilder_Helpers.d.ts +3 -0
- package/dist/lib/src/builders/create_QueryBuilder_Helpers.d.ts.map +1 -0
- package/dist/lib/src/builders/create_QueryBuilder_Helpers.js +292 -0
- package/dist/lib/src/builders/create_QueryBuilder_Helpers.js.map +1 -0
- package/dist/lib/src/config/create_Config_Index.d.ts +9 -0
- package/dist/lib/src/config/create_Config_Index.d.ts.map +1 -0
- package/dist/lib/src/config/create_Config_Index.js +92 -0
- package/dist/lib/src/config/create_Config_Index.js.map +1 -0
- package/dist/lib/src/constants/create_UserRole_Constant.d.ts +7 -0
- package/dist/lib/src/constants/create_UserRole_Constant.d.ts.map +1 -0
- package/dist/lib/src/constants/create_UserRole_Constant.js +39 -0
- package/dist/lib/src/constants/create_UserRole_Constant.js.map +1 -0
- package/dist/lib/src/createAppFile.d.ts +2 -0
- package/dist/lib/src/createAppFile.d.ts.map +1 -0
- package/dist/lib/src/createAppFile.js +122 -0
- package/dist/lib/src/createAppFile.js.map +1 -0
- package/dist/lib/src/createServerFile.d.ts +3 -0
- package/dist/lib/src/createServerFile.d.ts.map +1 -0
- package/dist/lib/src/createServerFile.js +75 -0
- package/dist/lib/src/createServerFile.js.map +1 -0
- package/dist/lib/src/createSrcStructure.d.ts +2 -0
- package/dist/lib/src/createSrcStructure.d.ts.map +1 -0
- package/dist/lib/src/createSrcStructure.js +50 -0
- package/dist/lib/src/createSrcStructure.js.map +1 -0
- package/dist/lib/src/errors/create_AppError_Class.d.ts +7 -0
- package/dist/lib/src/errors/create_AppError_Class.d.ts.map +1 -0
- package/dist/lib/src/errors/create_AppError_Class.js +65 -0
- package/dist/lib/src/errors/create_AppError_Class.js.map +1 -0
- package/dist/lib/src/errors/create_HandleCastError.d.ts +9 -0
- package/dist/lib/src/errors/create_HandleCastError.d.ts.map +1 -0
- package/dist/lib/src/errors/create_HandleCastError.js +101 -0
- package/dist/lib/src/errors/create_HandleCastError.js.map +1 -0
- package/dist/lib/src/errors/create_HandleDB_ValidationError.d.ts +9 -0
- package/dist/lib/src/errors/create_HandleDB_ValidationError.d.ts.map +1 -0
- package/dist/lib/src/errors/create_HandleDB_ValidationError.js +119 -0
- package/dist/lib/src/errors/create_HandleDB_ValidationError.js.map +1 -0
- package/dist/lib/src/errors/create_HandleDuplicateError.d.ts +9 -0
- package/dist/lib/src/errors/create_HandleDuplicateError.d.ts.map +1 -0
- package/dist/lib/src/errors/create_HandleDuplicateError.js +99 -0
- package/dist/lib/src/errors/create_HandleDuplicateError.js.map +1 -0
- package/dist/lib/src/errors/create_HandleZodValidationError.d.ts +7 -0
- package/dist/lib/src/errors/create_HandleZodValidationError.d.ts.map +1 -0
- package/dist/lib/src/errors/create_HandleZodValidationError.js +50 -0
- package/dist/lib/src/errors/create_HandleZodValidationError.js.map +1 -0
- package/dist/lib/src/interfaces/create_EmailFomat_type.d.ts +7 -0
- package/dist/lib/src/interfaces/create_EmailFomat_type.d.ts.map +1 -0
- package/dist/lib/src/interfaces/create_EmailFomat_type.js +34 -0
- package/dist/lib/src/interfaces/create_EmailFomat_type.js.map +1 -0
- package/dist/lib/src/interfaces/create_Errors_type.d.ts +7 -0
- package/dist/lib/src/interfaces/create_Errors_type.d.ts.map +1 -0
- package/dist/lib/src/interfaces/create_Errors_type.js +43 -0
- package/dist/lib/src/interfaces/create_Errors_type.js.map +1 -0
- package/dist/lib/src/interfaces/create_Index_d_type.d.ts +9 -0
- package/dist/lib/src/interfaces/create_Index_d_type.d.ts.map +1 -0
- package/dist/lib/src/interfaces/create_Index_d_type.js +45 -0
- package/dist/lib/src/interfaces/create_Index_d_type.js.map +1 -0
- package/dist/lib/src/interfaces/create_JWT_Token_type.d.ts +9 -0
- package/dist/lib/src/interfaces/create_JWT_Token_type.d.ts.map +1 -0
- package/dist/lib/src/interfaces/create_JWT_Token_type.js +33 -0
- package/dist/lib/src/interfaces/create_JWT_Token_type.js.map +1 -0
- package/dist/lib/src/interfaces/create_UserRole_type.d.ts +7 -0
- package/dist/lib/src/interfaces/create_UserRole_type.d.ts.map +1 -0
- package/dist/lib/src/interfaces/create_UserRole_type.js +33 -0
- package/dist/lib/src/interfaces/create_UserRole_type.js.map +1 -0
- package/dist/lib/src/middlewares/create_Auth_Gurad.d.ts +9 -0
- package/dist/lib/src/middlewares/create_Auth_Gurad.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_Auth_Gurad.js +99 -0
- package/dist/lib/src/middlewares/create_Auth_Gurad.js.map +1 -0
- package/dist/lib/src/middlewares/create_BigIntSerializer_Guard.d.ts +7 -0
- package/dist/lib/src/middlewares/create_BigIntSerializer_Guard.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_BigIntSerializer_Guard.js +64 -0
- package/dist/lib/src/middlewares/create_BigIntSerializer_Guard.js.map +1 -0
- package/dist/lib/src/middlewares/create_FormDataToSetJSONformatData_Guard.d.ts +7 -0
- package/dist/lib/src/middlewares/create_FormDataToSetJSONformatData_Guard.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_FormDataToSetJSONformatData_Guard.js +63 -0
- package/dist/lib/src/middlewares/create_FormDataToSetJSONformatData_Guard.js.map +1 -0
- package/dist/lib/src/middlewares/create_Global_ErrorHandler_Guard.d.ts +12 -0
- package/dist/lib/src/middlewares/create_Global_ErrorHandler_Guard.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_Global_ErrorHandler_Guard.js +375 -0
- package/dist/lib/src/middlewares/create_Global_ErrorHandler_Guard.js.map +1 -0
- package/dist/lib/src/middlewares/create_Handle_File_Upload_Middleware.d.ts +7 -0
- package/dist/lib/src/middlewares/create_Handle_File_Upload_Middleware.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_Handle_File_Upload_Middleware.js +260 -0
- package/dist/lib/src/middlewares/create_Handle_File_Upload_Middleware.js.map +1 -0
- package/dist/lib/src/middlewares/create_NotFound_Guard.d.ts +7 -0
- package/dist/lib/src/middlewares/create_NotFound_Guard.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_NotFound_Guard.js +47 -0
- package/dist/lib/src/middlewares/create_NotFound_Guard.js.map +1 -0
- package/dist/lib/src/middlewares/create_RateLimiting_Handler_Guard.d.ts +7 -0
- package/dist/lib/src/middlewares/create_RateLimiting_Handler_Guard.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_RateLimiting_Handler_Guard.js +270 -0
- package/dist/lib/src/middlewares/create_RateLimiting_Handler_Guard.js.map +1 -0
- package/dist/lib/src/middlewares/create_ValidateRequest_Guard.d.ts +7 -0
- package/dist/lib/src/middlewares/create_ValidateRequest_Guard.d.ts.map +1 -0
- package/dist/lib/src/middlewares/create_ValidateRequest_Guard.js +104 -0
- package/dist/lib/src/middlewares/create_ValidateRequest_Guard.js.map +1 -0
- package/dist/lib/src/modules/create_DemoModules_SrcStructure.d.ts +7 -0
- package/dist/lib/src/modules/create_DemoModules_SrcStructure.d.ts.map +1 -0
- package/dist/lib/src/modules/create_DemoModules_SrcStructure.js +367 -0
- package/dist/lib/src/modules/create_DemoModules_SrcStructure.js.map +1 -0
- package/dist/lib/src/routers/create_Router_Index_Path.d.ts +7 -0
- package/dist/lib/src/routers/create_Router_Index_Path.d.ts.map +1 -0
- package/dist/lib/src/routers/create_Router_Index_Path.js +54 -0
- package/dist/lib/src/routers/create_Router_Index_Path.js.map +1 -0
- package/dist/lib/src/shared/create_Prisma_Shated.d.ts +9 -0
- package/dist/lib/src/shared/create_Prisma_Shated.d.ts.map +1 -0
- package/dist/lib/src/shared/create_Prisma_Shated.js +34 -0
- package/dist/lib/src/shared/create_Prisma_Shated.js.map +1 -0
- package/dist/lib/src/utils/createCatchAsync_Utils.d.ts +7 -0
- package/dist/lib/src/utils/createCatchAsync_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/createCatchAsync_Utils.js +59 -0
- package/dist/lib/src/utils/createCatchAsync_Utils.js.map +1 -0
- package/dist/lib/src/utils/createLoggerFile.d.ts +7 -0
- package/dist/lib/src/utils/createLoggerFile.d.ts.map +1 -0
- package/dist/lib/src/utils/createLoggerFile.js +35 -0
- package/dist/lib/src/utils/createLoggerFile.js.map +1 -0
- package/dist/lib/src/utils/create_Common_Utils.d.ts +9 -0
- package/dist/lib/src/utils/create_Common_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/create_Common_Utils.js +262 -0
- package/dist/lib/src/utils/create_Common_Utils.js.map +1 -0
- package/dist/lib/src/utils/create_Date_Time_Validation_Utils.d.ts +7 -0
- package/dist/lib/src/utils/create_Date_Time_Validation_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/create_Date_Time_Validation_Utils.js +181 -0
- package/dist/lib/src/utils/create_Date_Time_Validation_Utils.js.map +1 -0
- package/dist/lib/src/utils/create_Node_Cache_Utils.d.ts +7 -0
- package/dist/lib/src/utils/create_Node_Cache_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/create_Node_Cache_Utils.js +149 -0
- package/dist/lib/src/utils/create_Node_Cache_Utils.js.map +1 -0
- package/dist/lib/src/utils/create_Remove_Uploaded_Files_Utils.d.ts +7 -0
- package/dist/lib/src/utils/create_Remove_Uploaded_Files_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/create_Remove_Uploaded_Files_Utils.js +162 -0
- package/dist/lib/src/utils/create_Remove_Uploaded_Files_Utils.js.map +1 -0
- package/dist/lib/src/utils/create_SendEmail_Utils.d.ts +7 -0
- package/dist/lib/src/utils/create_SendEmail_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/create_SendEmail_Utils.js +140 -0
- package/dist/lib/src/utils/create_SendEmail_Utils.js.map +1 -0
- package/dist/lib/src/utils/create_sendResponse_Utils.d.ts +7 -0
- package/dist/lib/src/utils/create_sendResponse_Utils.d.ts.map +1 -0
- package/dist/lib/src/utils/create_sendResponse_Utils.js +95 -0
- package/dist/lib/src/utils/create_sendResponse_Utils.js.map +1 -0
- package/dist/lib/utils/helpers.d.ts +5 -0
- package/dist/lib/utils/helpers.d.ts.map +1 -0
- package/dist/lib/utils/helpers.js +31 -0
- package/dist/lib/utils/helpers.js.map +1 -0
- package/dist/lib/utils/types.d.ts +5 -0
- package/dist/lib/utils/types.d.ts.map +1 -0
- package/dist/lib/utils/types.js +2 -0
- package/dist/lib/utils/types.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { createFile } from "../../utils/helpers.js";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a user role constant file with predefined roles
|
|
6
|
+
* @param projectPath - Absolute path to the project root
|
|
7
|
+
* @returns Promise that resolves when the user role constant file is created
|
|
8
|
+
*/
|
|
9
|
+
export const create_UserRole_Constant = async (projectPath) => {
|
|
10
|
+
try {
|
|
11
|
+
const create_UserRole_Constant_Template = `/**
|
|
12
|
+
* User Role Constants
|
|
13
|
+
* Defines available user roles in the application
|
|
14
|
+
*/
|
|
15
|
+
export const USER_ROLE = {
|
|
16
|
+
superAdmin: 'superAdmin',
|
|
17
|
+
admin: 'admin',
|
|
18
|
+
user: 'user',
|
|
19
|
+
developer: 'developer',
|
|
20
|
+
editor: 'editor',
|
|
21
|
+
} as const;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Array of all available user roles
|
|
25
|
+
* This is automatically generated from USER_ROLE to ensure consistency
|
|
26
|
+
*/
|
|
27
|
+
export const UserRole = Object.values(USER_ROLE) as readonly string[];
|
|
28
|
+
`;
|
|
29
|
+
await createFile(path.join(projectPath, "src/app/constants", "userRole_constant.ts"), create_UserRole_Constant_Template);
|
|
30
|
+
// Success message with green checkmark and text
|
|
31
|
+
console.log(chalk.green("✅ Successfully created userRole_constant file"));
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
// Error message with red cross and text
|
|
35
|
+
console.error(chalk.red("❌ Error creating userRole_constant file:"), err);
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=create_UserRole_Constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_UserRole_Constant.js","sourceRoot":"","sources":["../../../../src/lib/src/constants/create_UserRole_Constant.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,EAC3C,WAAmB,EACJ,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,iCAAiC,GAAG;;;;;;;;;;;;;;;;;CAiB7C,CAAC;QAEE,MAAM,UAAU,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,EAAE,sBAAsB,CAAC,EACnE,iCAAiC,CAClC,CAAC;QAEF,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1E,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAppFile.d.ts","sourceRoot":"","sources":["../../../src/lib/src/createAppFile.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAoHrE,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createFile } from "../utils/helpers.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk"; // Added chalk import
|
|
4
|
+
export const createAppFile = async (projectPath) => {
|
|
5
|
+
try {
|
|
6
|
+
let appTemplate = `
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
8
|
+
import express, { Application, Request, Response } from 'express';
|
|
9
|
+
import cors from 'cors';
|
|
10
|
+
import cookieParser from 'cookie-parser';
|
|
11
|
+
import routers from './app/routers';
|
|
12
|
+
import globalErrorHandler from './app/middlewares/globalErrorHandler';
|
|
13
|
+
import notFound from './app/middlewares/notFound';
|
|
14
|
+
import { bigIntSerializer } from './app/middlewares/bigIntSerializer';
|
|
15
|
+
import { create_cache_into_RAM, get_cache_from_RAM } from './app/utils/node_cache';
|
|
16
|
+
import { createProgressiveRateLimiter } from './app/middlewares/rateLimitingHandler';
|
|
17
|
+
const app: Application = express();
|
|
18
|
+
// Rate limiting configuration
|
|
19
|
+
const apiRateLimiter = createProgressiveRateLimiter({
|
|
20
|
+
initialWindowMs: 60 * 1000, // 1 minute
|
|
21
|
+
initialMax: 100, // limit each IP to 100 requests per windowMs
|
|
22
|
+
initialBlockMs: 15 * 60 * 1000, // block for 15 minutes on first offense
|
|
23
|
+
message: {
|
|
24
|
+
success: false,
|
|
25
|
+
message: 'Too many requests from this IP, please try again later.'
|
|
26
|
+
},
|
|
27
|
+
skipSuccessfulRequests: false,
|
|
28
|
+
skipFailedRequests: false
|
|
29
|
+
});
|
|
30
|
+
// CORS configuration
|
|
31
|
+
const getCorsOrigin = async (): Promise<string[]> => {
|
|
32
|
+
try {
|
|
33
|
+
let value = get_cache_from_RAM('cors_origin');
|
|
34
|
+
|
|
35
|
+
if (value === undefined) {
|
|
36
|
+
// TODO: Replace with actual database fetch
|
|
37
|
+
// const cors = await yourCorsOriginFromDB();
|
|
38
|
+
// value = cors?.origin || [];
|
|
39
|
+
value = ['http://localhost:5173', 'http://localhost:5174'];
|
|
40
|
+
create_cache_into_RAM('cors_origin', value);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return Array.isArray(value) ? value : [value as string];
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error('Error fetching CORS origins:', error);
|
|
46
|
+
return ['http://localhost:5173', 'http://localhost:5174']; // Fallback origins
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const getFallbackOrigins = (): string[] => [
|
|
50
|
+
'http://localhost:5173',
|
|
51
|
+
'http://localhost:5174'
|
|
52
|
+
];
|
|
53
|
+
// Middleware setup
|
|
54
|
+
app.use(express.json({ limit: '10mb' }));
|
|
55
|
+
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
|
|
56
|
+
app.use(cookieParser());
|
|
57
|
+
app.use(bigIntSerializer);
|
|
58
|
+
// CORS configuration with dynamic origins
|
|
59
|
+
app.use(
|
|
60
|
+
'/v1/api',
|
|
61
|
+
apiRateLimiter,
|
|
62
|
+
cors({
|
|
63
|
+
origin: async (origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => {
|
|
64
|
+
try {
|
|
65
|
+
// Allow requests with no origin (mobile apps, Postman, etc.)
|
|
66
|
+
if (!origin) return callback(null, true);
|
|
67
|
+
// if (!origin) return callback(new Error('Not allowed by CORS')) // for block anything without origin #for production
|
|
68
|
+
const dynamicOrigins = await getCorsOrigin();
|
|
69
|
+
const allowedOrigins = dynamicOrigins.length > 0 ? dynamicOrigins : getFallbackOrigins();
|
|
70
|
+
|
|
71
|
+
if (allowedOrigins.includes(origin)) {
|
|
72
|
+
callback(null, true);
|
|
73
|
+
} else {
|
|
74
|
+
console.warn(\`CORS blocked origin: \${origin}\`);
|
|
75
|
+
callback(new Error('Not allowed by CORS'));
|
|
76
|
+
}
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.error('CORS origin check failed:', error);
|
|
79
|
+
callback(new Error('CORS configuration error'));
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
credentials: true,
|
|
83
|
+
optionsSuccessStatus: 200
|
|
84
|
+
}),
|
|
85
|
+
);
|
|
86
|
+
// API routes
|
|
87
|
+
app.use('/v1/api', apiRateLimiter, routers);
|
|
88
|
+
// Home route
|
|
89
|
+
const homeRoute = (req: Request, res: Response): void => {
|
|
90
|
+
res.status(200).json({
|
|
91
|
+
server: 'Active',
|
|
92
|
+
success: true,
|
|
93
|
+
status: 200,
|
|
94
|
+
message: 'This is Home Route.',
|
|
95
|
+
timestamp: new Date().toISOString()
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
app.get('/', apiRateLimiter, homeRoute);
|
|
99
|
+
// Health check endpoint
|
|
100
|
+
app.get('/health', apiRateLimiter, (req: Request, res: Response) => {
|
|
101
|
+
res.status(200).json({
|
|
102
|
+
status: 'OK',
|
|
103
|
+
timestamp: new Date().toISOString(),
|
|
104
|
+
uptime: process.uptime()
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// Error handling middleware
|
|
108
|
+
app.use(globalErrorHandler as unknown as express.ErrorRequestHandler)
|
|
109
|
+
app.use(notFound as unknown as express.ErrorRequestHandler)
|
|
110
|
+
export default app;
|
|
111
|
+
`;
|
|
112
|
+
await createFile(path.join(projectPath, "src", "app.ts"), appTemplate);
|
|
113
|
+
// Added chalk with type annotation
|
|
114
|
+
console.log(chalk.green("✅ App file created successfully"));
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
// Added chalk with type annotation
|
|
118
|
+
console.error(chalk.red("❌ Error creating App file:"), err);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=createAppFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createAppFile.js","sourceRoot":"","sources":["../../../src/lib/src/createAppFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC,CAAC,qBAAqB;AAEhD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,WAAmB,EAAiB,EAAE;IACxE,IAAI,CAAC;QACH,IAAI,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGrB,CAAC;QACE,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC;QACvE,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,mCAAmC;QACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServerFile.d.ts","sourceRoot":"","sources":["../../../src/lib/src/createServerFile.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,eAAO,MAAM,gBAAgB,GAC3B,aAAa,MAAM,EACnB,SAAS,QAAQ,kBAwElB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createFile } from "../utils/helpers.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
export const createServerFile = async (projectPath, answers) => {
|
|
5
|
+
try {
|
|
6
|
+
let dbConnectionCode = "";
|
|
7
|
+
let dbImport = "";
|
|
8
|
+
// Handle database-specific imports and connection code
|
|
9
|
+
if (answers.database === "MongoDB with Mongoose") {
|
|
10
|
+
dbImport = `import mongoose from 'mongoose'\n`;
|
|
11
|
+
dbConnectionCode = `// Connect to NoSQL DB
|
|
12
|
+
await mongoose.connect(config.mongo_database_url as string)
|
|
13
|
+
console.log('Mongoose with MongoDB connected successfully')`;
|
|
14
|
+
}
|
|
15
|
+
else if (answers.database === "PostgreSQL with Prisma") {
|
|
16
|
+
dbImport = `import prisma from './app/shared/prisma'\n`;
|
|
17
|
+
dbConnectionCode = `// Connect to SQL DB
|
|
18
|
+
await prisma.$connect()
|
|
19
|
+
console.log('Prisma with PostgreSQL DB connected successfully')`;
|
|
20
|
+
}
|
|
21
|
+
let indexTemplate = `${dbImport}import { Server } from 'http'
|
|
22
|
+
import app from './app'
|
|
23
|
+
import config from './app/config'
|
|
24
|
+
|
|
25
|
+
let server: Server
|
|
26
|
+
|
|
27
|
+
// Main function to initialize the app and connect to the database
|
|
28
|
+
async function main() {
|
|
29
|
+
try {
|
|
30
|
+
${dbConnectionCode}
|
|
31
|
+
|
|
32
|
+
// starting the server
|
|
33
|
+
server = app.listen(config.port, () => {
|
|
34
|
+
console.log(\`🚀 Server running on port \${config.port}\`)
|
|
35
|
+
})
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.error('❌ Failed to start server:', err)
|
|
38
|
+
process.exit(1)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
main()
|
|
43
|
+
|
|
44
|
+
// Handling unhandled promise rejections
|
|
45
|
+
process.on(
|
|
46
|
+
'unhandledRejection',
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
48
|
+
(reason: unknown, promise: Promise<unknown>) => {
|
|
49
|
+
console.log('😡 Unhandled Rejection Detected:', reason)
|
|
50
|
+
console.log('Shutting down server...')
|
|
51
|
+
if (server) {
|
|
52
|
+
server.close(() => {
|
|
53
|
+
process.exit(1)
|
|
54
|
+
})
|
|
55
|
+
} else {
|
|
56
|
+
process.exit(1)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
// Handling uncaught exceptions
|
|
62
|
+
process.on('uncaughtException', () => {
|
|
63
|
+
console.log('😡 Uncaught Exception is Detected. Shutting Down....')
|
|
64
|
+
process.exit(1)
|
|
65
|
+
})
|
|
66
|
+
`;
|
|
67
|
+
await createFile(path.join(projectPath, "src", "server.ts"), indexTemplate);
|
|
68
|
+
console.log(chalk.green("✅ Server file created successfully"));
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
console.error(chalk.red("❌ Error creating Server file:"), err);
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=createServerFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createServerFile.js","sourceRoot":"","sources":["../../../src/lib/src/createServerFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,WAAmB,EACnB,OAAiB,EACjB,EAAE;IACF,IAAI,CAAC;QACH,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAC1B,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,uDAAuD;QACvD,IAAI,OAAO,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YACjD,QAAQ,GAAG,mCAAmC,CAAC;YAC/C,gBAAgB,GAAG;;gEAEuC,CAAC;QAC7D,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,wBAAwB,EAAE,CAAC;YACzD,QAAQ,GAAG,4CAA4C,CAAC;YACxD,gBAAgB,GAAG;;oEAE2C,CAAC;QACjE,CAAC;QAED,IAAI,aAAa,GAAG,GAAG,QAAQ;;;;;;;;;MAS7B,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCrB,CAAC;QAEE,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSrcStructure.d.ts","sourceRoot":"","sources":["../../../src/lib/src/createSrcStructure.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,GAC7B,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAwDd,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { createDirectory } from "../utils/helpers.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk"; // Added chalk import
|
|
4
|
+
export const createSrcStructure = async (projectPath) => {
|
|
5
|
+
try {
|
|
6
|
+
// Create src directory if it doesn't exist
|
|
7
|
+
const srcPath = path.join(projectPath, "src");
|
|
8
|
+
await createDirectory(srcPath);
|
|
9
|
+
const uploadPath = path.join(projectPath, "uploads");
|
|
10
|
+
await createDirectory(uploadPath);
|
|
11
|
+
// Create app directory structure
|
|
12
|
+
const appPath = path.join(srcPath, "app");
|
|
13
|
+
await createDirectory(appPath);
|
|
14
|
+
// create upload directory
|
|
15
|
+
// Create all subdirectories in src/app
|
|
16
|
+
const directories = [
|
|
17
|
+
"builder",
|
|
18
|
+
"config",
|
|
19
|
+
"constants",
|
|
20
|
+
"errors",
|
|
21
|
+
"helpers",
|
|
22
|
+
"interfaces", // Fixed typo from "iterfaces"
|
|
23
|
+
"lib",
|
|
24
|
+
"middlewares",
|
|
25
|
+
"modules",
|
|
26
|
+
"routers",
|
|
27
|
+
"shared",
|
|
28
|
+
"schemas",
|
|
29
|
+
"seed",
|
|
30
|
+
"types",
|
|
31
|
+
"trash",
|
|
32
|
+
"utils",
|
|
33
|
+
];
|
|
34
|
+
// Create each directory
|
|
35
|
+
for (const dir of directories) {
|
|
36
|
+
await createDirectory(path.join(appPath, dir));
|
|
37
|
+
}
|
|
38
|
+
// create images and videos directory
|
|
39
|
+
await createDirectory(path.join(uploadPath, "images"));
|
|
40
|
+
await createDirectory(path.join(uploadPath, "videos"));
|
|
41
|
+
// Added chalk with green color for success message
|
|
42
|
+
console.log(chalk.green("✅ Source directory structure created successfully"));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// Added chalk with red color for error message
|
|
46
|
+
console.error(chalk.red("❌ Error creating source directory structure:"), error);
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=createSrcStructure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSrcStructure.js","sourceRoot":"","sources":["../../../src/lib/src/createSrcStructure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC,CAAC,qBAAqB;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACrC,WAAmB,EACJ,EAAE;IACjB,IAAI,CAAC;QACH,2CAA2C;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,eAAe,CAAC,UAAU,CAAC,CAAC;QAElC,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC;QAE/B,0BAA0B;QAE1B,uCAAuC;QACvC,MAAM,WAAW,GAAG;YAClB,SAAS;YACT,QAAQ;YACR,WAAW;YACX,QAAQ;YACR,SAAS;YACT,YAAY,EAAE,8BAA8B;YAC5C,KAAK;YACL,aAAa;YACb,SAAS;YACT,SAAS;YACT,QAAQ;YACR,SAAS;YACT,MAAM;YACN,OAAO;YACP,OAAO;YACP,OAAO;SACR,CAAC;QAEF,wBAAwB;QACxB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,qCAAqC;QACrC,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACvD,MAAM,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QAEvD,mDAAmD;QACnD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,mDAAmD,CAAC,CACjE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,+CAA+C;QAC/C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,EACzD,KAAK,CACN,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a custom AppError class file for handling application-specific errors
|
|
3
|
+
* @param projectPath - Absolute path to the project root
|
|
4
|
+
* @returns Promise that resolves when the AppError class file is created
|
|
5
|
+
*/
|
|
6
|
+
export declare const create_AppError_Class: (projectPath: string) => Promise<void>;
|
|
7
|
+
//# sourceMappingURL=create_AppError_Class.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_AppError_Class.d.ts","sourceRoot":"","sources":["../../../../src/lib/src/errors/create_AppError_Class.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CA2Dd,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { createFile } from "../../utils/helpers.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a custom AppError class file for handling application-specific errors
|
|
6
|
+
* @param projectPath - Absolute path to the project root
|
|
7
|
+
* @returns Promise that resolves when the AppError class file is created
|
|
8
|
+
*/
|
|
9
|
+
export const create_AppError_Class = async (projectPath) => {
|
|
10
|
+
try {
|
|
11
|
+
const appErrorTemplate = `/**
|
|
12
|
+
* Custom error class for handling application-specific errors
|
|
13
|
+
* Extends the built-in Error class with additional properties for HTTP status codes and error paths
|
|
14
|
+
*/
|
|
15
|
+
export default class AppError extends Error {
|
|
16
|
+
/**
|
|
17
|
+
* HTTP status code for the error
|
|
18
|
+
*/
|
|
19
|
+
public readonly statusCode: number;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Route or module where the error occurred
|
|
23
|
+
*/
|
|
24
|
+
public readonly path: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Create a new AppError instance
|
|
28
|
+
* @param statusCode - HTTP status code (e.g., 400, 404, 500)
|
|
29
|
+
* @param path - Route or module where the error occurred
|
|
30
|
+
* @param message - Error message
|
|
31
|
+
* @param stack - Optional stack trace (if not provided, will be captured automatically)
|
|
32
|
+
*/
|
|
33
|
+
constructor(
|
|
34
|
+
statusCode: number,
|
|
35
|
+
path: string,
|
|
36
|
+
message: string,
|
|
37
|
+
stack = ''
|
|
38
|
+
) {
|
|
39
|
+
super(message);
|
|
40
|
+
|
|
41
|
+
// Set the prototype explicitly to maintain instanceof checks
|
|
42
|
+
Object.setPrototypeOf(this, AppError.prototype);
|
|
43
|
+
|
|
44
|
+
this.statusCode = statusCode;
|
|
45
|
+
this.path = path;
|
|
46
|
+
|
|
47
|
+
if (stack) {
|
|
48
|
+
this.stack = stack;
|
|
49
|
+
} else {
|
|
50
|
+
Error.captureStackTrace(this, this.constructor);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
await createFile(path.join(projectPath, "src/app/errors", "AppError.ts"), appErrorTemplate);
|
|
56
|
+
// Success message with green checkmark and text
|
|
57
|
+
console.log(chalk.green("✅ AppError class file created successfully"));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
// Error message with red cross and text
|
|
61
|
+
console.error(chalk.red("❌ Error creating AppError class file:"), err);
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=create_AppError_Class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_AppError_Class.js","sourceRoot":"","sources":["../../../../src/lib/src/errors/create_AppError_Class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,WAAmB,EACJ,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C5B,CAAC;QAEE,MAAM,UAAU,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,aAAa,CAAC,EACvD,gBAAgB,CACjB,CAAC;QAEF,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TAnswers } from "../../utils/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a database-specific cast error handler file
|
|
4
|
+
* @param projectPath - Absolute path to the project root
|
|
5
|
+
* @param answers - User answers from CLI prompts
|
|
6
|
+
* @returns Promise that resolves when the cast error handler file is created
|
|
7
|
+
*/
|
|
8
|
+
export declare const create_HandleCastError: (projectPath: string, answers: TAnswers) => Promise<void>;
|
|
9
|
+
//# sourceMappingURL=create_HandleCastError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_HandleCastError.d.ts","sourceRoot":"","sources":["../../../../src/lib/src/errors/create_HandleCastError.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GACjC,aAAa,MAAM,EACnB,SAAS,QAAQ,KAChB,OAAO,CAAC,IAAI,CAmGd,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { createFile } from "../../utils/helpers.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
/**
|
|
5
|
+
* Creates a database-specific cast error handler file
|
|
6
|
+
* @param projectPath - Absolute path to the project root
|
|
7
|
+
* @param answers - User answers from CLI prompts
|
|
8
|
+
* @returns Promise that resolves when the cast error handler file is created
|
|
9
|
+
*/
|
|
10
|
+
export const create_HandleCastError = async (projectPath, answers) => {
|
|
11
|
+
try {
|
|
12
|
+
if (answers.database === "MongoDB with Mongoose") {
|
|
13
|
+
const handleMongooseCastErrorTemplate = `import mongoose from 'mongoose';
|
|
14
|
+
import { TErrorSource, TGenericErrorResponse } from '../interfaces/errors';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Handle Mongoose CastError (invalid ObjectId format)
|
|
18
|
+
* @param err - Mongoose CastError instance
|
|
19
|
+
* @returns Formatted error response
|
|
20
|
+
*/
|
|
21
|
+
const handleMongooseCastError = (
|
|
22
|
+
err: mongoose.Error.CastError
|
|
23
|
+
): TGenericErrorResponse => {
|
|
24
|
+
const errorSources: TErrorSource[] = [
|
|
25
|
+
{
|
|
26
|
+
path: err.path,
|
|
27
|
+
message: \`Invalid value '\${err.value}' for field '\${err.path}'\`
|
|
28
|
+
}
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
statusCode: 400,
|
|
33
|
+
message: 'Invalid ID format',
|
|
34
|
+
errorSources
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default handleMongooseCastError;
|
|
39
|
+
`;
|
|
40
|
+
await createFile(path.join(projectPath, "src/app/errors", "handleMongooseCastError.ts"), handleMongooseCastErrorTemplate);
|
|
41
|
+
}
|
|
42
|
+
if (answers.database === "PostgreSQL with Prisma") {
|
|
43
|
+
const handlePrismaCastErrorTemplate = `import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'
|
|
44
|
+
import { TErrorSource, TGenericErrorResponse } from '../interfaces/errors'
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Handle Prisma known request errors (especially invalid ID format)
|
|
48
|
+
* @param err - Prisma known request error
|
|
49
|
+
* @returns Formatted error response or null if not a cast error
|
|
50
|
+
*/
|
|
51
|
+
const handlePrismaCastError = (
|
|
52
|
+
err: PrismaClientKnownRequestError
|
|
53
|
+
): TGenericErrorResponse | null => {
|
|
54
|
+
// Handle malformed ID error (P2023)
|
|
55
|
+
if (err.code === 'P2023') {
|
|
56
|
+
const errorSources: TErrorSource[] = [
|
|
57
|
+
{
|
|
58
|
+
path: 'id',
|
|
59
|
+
message: 'Invalid ID format provided'
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
return {
|
|
63
|
+
statusCode: 400,
|
|
64
|
+
message: 'Invalid ID format',
|
|
65
|
+
errorSources
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle invalid UUID format (if using UUID fields)
|
|
70
|
+
if (err.code === 'P2025' && err.message.includes('Invalid UUID')) {
|
|
71
|
+
const errorSources: TErrorSource[] = [
|
|
72
|
+
{
|
|
73
|
+
path: 'id',
|
|
74
|
+
message: 'Invalid UUID format'
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
return {
|
|
78
|
+
statusCode: 400,
|
|
79
|
+
message: 'Invalid UUID format',
|
|
80
|
+
errorSources
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Return null if it's not a cast error we handle
|
|
85
|
+
return null
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export default handlePrismaCastError
|
|
89
|
+
`;
|
|
90
|
+
await createFile(path.join(projectPath, "src/app/errors", "handlePrismaCastError.ts"), handlePrismaCastErrorTemplate);
|
|
91
|
+
}
|
|
92
|
+
// Success message with green checkmark and text
|
|
93
|
+
console.log(chalk.green("✅ Successfully created HandleCastError file"));
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
// Error message with red cross and text
|
|
97
|
+
console.error(chalk.red("❌ Error creating HandleCastError file:"), err);
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=create_HandleCastError.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_HandleCastError.js","sourceRoot":"","sources":["../../../../src/lib/src/errors/create_HandleCastError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EACzC,WAAmB,EACnB,OAAiB,EACF,EAAE;IACjB,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YACjD,MAAM,+BAA+B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B7C,CAAC;YAEI,MAAM,UAAU,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,4BAA4B,CAAC,EACtE,+BAA+B,CAChC,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,KAAK,wBAAwB,EAAE,CAAC;YAClD,MAAM,6BAA6B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8C3C,CAAC;YAEI,MAAM,UAAU,CACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,0BAA0B,CAAC,EACpE,6BAA6B,CAC9B,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wCAAwC;QACxC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TAnswers } from "../../utils/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a database-specific validation error handler file
|
|
4
|
+
* @param projectPath - Absolute path to the project root
|
|
5
|
+
* @param answers - User answers from CLI prompts
|
|
6
|
+
* @returns Promise that resolves when the validation error handler file is created
|
|
7
|
+
*/
|
|
8
|
+
export declare const create_HandleDB_ValidationError: (projectPath: string, answers: TAnswers) => Promise<void>;
|
|
9
|
+
//# sourceMappingURL=create_HandleDB_ValidationError.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create_HandleDB_ValidationError.d.ts","sourceRoot":"","sources":["../../../../src/lib/src/errors/create_HandleDB_ValidationError.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,GAC1C,aAAa,MAAM,EACnB,SAAS,QAAQ,KAChB,OAAO,CAAC,IAAI,CAkId,CAAC"}
|